func TestLatinHypercube(t *testing.T) { for _, nSamples := range []int{1, 2, 5, 10, 20} { for _, dist := range []lhDist{ distmv.NewUniform([]distmv.Bound{{0, 3}}, nil), distmv.NewUniform([]distmv.Bound{{0, 3}, {-1, 5}, {-4, -1}}, nil), } { dim := dist.Dim() batch := mat64.NewDense(nSamples, dim, nil) LatinHypercube(batch, dist, nil) // Latin hypercube should have one entry per hyperrow. present := make([][]bool, nSamples) for i := range present { present[i] = make([]bool, dim) } cdf := make([]float64, dim) for i := 0; i < nSamples; i++ { dist.CDF(cdf, batch.RawRowView(i)) for j := 0; j < dim; j++ { p := cdf[j] quadrant := int(math.Floor(p * float64(nSamples))) present[quadrant][j] = true } } allPresent := true for i := 0; i < nSamples; i++ { for j := 0; j < dim; j++ { if present[i][j] == false { allPresent = false } } } if !allPresent { t.Errorf("All quadrants not present") } } } }
func TestRejection(t *testing.T) { // Test by finding the expected value of a uniform. dim := 3 bounds := make([]distmv.Bound, dim) for i := 0; i < dim; i++ { min := rand.NormFloat64() max := rand.NormFloat64() if min > max { min, max = max, min } bounds[i].Min = min bounds[i].Max = max } target := distmv.NewUniform(bounds, nil) mu := target.Mean(nil) muImp := make([]float64, dim) sigmaImp := mat64.NewSymDense(dim, nil) for i := 0; i < dim; i++ { sigmaImp.SetSym(i, i, 6) } proposal, ok := distmv.NewNormal(muImp, sigmaImp, nil) if !ok { t.Fatal("bad test, sigma not pos def") } nSamples := 1000 batch := mat64.NewDense(nSamples, dim, nil) weights := make([]float64, nSamples) _, ok = Rejection(batch, target, proposal, 1000, nil) if !ok { t.Error("Bad test, nan samples") } for i := 0; i < dim; i++ { col := mat64.Col(nil, i, batch) ev := stat.Mean(col, weights) if math.Abs(ev-mu[i]) > 1e-2 { t.Errorf("Mean mismatch: Want %v, got %v", mu[i], ev) } } }