// simulate runs a Monte Carlo simulation with given arms and strategys func simulate(bs strategys, arms arms, sims, horizon int) (simulations, error) { ret := simulations{} for _, b := range bs { s, err := sim.MonteCarlo(sims, horizon, arms, b) if err != nil { return simulations{}, fmt.Errorf(err.Error()) } ret = append(ret, s) } return ret, nil }
func TestSoftmax(t *testing.T) { τ := 0.1 sims := 5000 trials := 300 bestArmIndex := 4 // Bernoulli(bestArm) bestArm := 0.8 arms := []sim.Arm{ bmath.BernRand(0.1), bmath.BernRand(0.3), bmath.BernRand(0.2), bmath.BernRand(0.8), } strategy, err := NewSoftmax(len(arms), τ) if err != nil { t.Fatalf(err.Error()) } s, err := sim.MonteCarlo(sims, trials, arms, strategy) if err != nil { t.Fatalf(err.Error()) } expected := sims * trials if got := len(s.Selected); got != expected { t.Fatalf("incorrect number of trials: %d", got) } accuracies := sim.Accuracy([]int{bestArmIndex})(&s) if got := accuracies[len(accuracies)-1]; got < 0.9 { t.Fatalf("accuracy is only %f. %d sims, %d trials", got, sims, trials) } performances := sim.Performance(&s) if got := performances[len(performances)-1]; math.Abs(bestArm-got) > 0.1 { t.Fatalf("performance converge to %f. is %f", bestArm, got) } expectedCumulative := 200.0 cumulatives := sim.Cumulative(&s) if got := cumulatives[len(cumulatives)-1]; got < expectedCumulative { t.Fatalf("cumulative performance should be > %f. is %f", expectedCumulative, got) } }
func TestDelayedStrategy(t *testing.T) { τ := 0.1 sims := 5000 trials := 300 flushAfter := 100 bestArmIndex := 4 // Bernoulli(bestArm) bestArm := 0.8 arms := []sim.Arm{ bmath.BernRand(0.1), bmath.BernRand(0.3), bmath.BernRand(0.2), bmath.BernRand(0.8), } b, err := NewSoftmax(len(arms), τ) if err != nil { t.Fatalf(err.Error()) } d := NewSimulatedDelayedStrategy(b, len(arms), flushAfter) s, err := sim.MonteCarlo(sims, trials, arms, d) if err != nil { t.Fatalf(err.Error()) } accuracies := sim.Accuracy([]int{bestArmIndex})(&s) if got := accuracies[len(accuracies)-1]; got < 0.9 { t.Fatalf("accuracy is only %f. %d sims, %d trials", got, sims, trials) } performances := sim.Performance(&s) if got := performances[len(performances)-1]; math.Abs(bestArm-got) > 0.1 { t.Fatalf("performance converge to %f. is %f", bestArm, got) } expectedCumulative := 200.0 cumulatives := sim.Cumulative(&s) if got := cumulatives[len(cumulatives)-1]; got < expectedCumulative { t.Fatalf("cumulative performance should be > %f. is %f", expectedCumulative, got) } }
func TestSoftmaxGaussian(t *testing.T) { τ := 0.1 sims := 5000 trials := 300 bestArmIndex := 1 // Gaussian(bestArm) bestArm := 5000.0 arms := []sim.Arm{ bmath.NormRand(5000, 1), // is five times better bmath.NormRand(0, 1), } strategy, err := NewSoftmax(len(arms), τ) if err != nil { t.Fatalf(err.Error()) } s, err := sim.MonteCarlo(sims, trials, arms, strategy) if err != nil { t.Fatalf(err.Error()) } expected := sims * trials if got := len(s.Selected); got != expected { t.Fatalf("incorrect number of trials: %d", got) } accuracies := sim.Accuracy([]int{bestArmIndex})(&s) if got := accuracies[len(accuracies)-1]; got != 1.0 { t.Fatalf("accuracy is only %f. %d sims, %d trials", got, sims, trials) } performances := sim.Performance(&s) if got := performances[len(performances)-1]; math.Abs(bestArm-got) > 0.1 { t.Fatalf("performance converge to %f. is %f", bestArm, got) } expectedCumulative := 4500.0 * float64(trials) // (mean(bestArm)-tolerance) * num trials cumulatives := sim.Cumulative(&s) if got := cumulatives[len(cumulatives)-1]; got < expectedCumulative { t.Fatalf("cumulative performance should be > %f. is %f", expectedCumulative, got) } }