package main import ( "log" ) const ( MaxDim = uint32(6) MaxBit = uint32(30) maxSeqNum = 1<> deg) for l := deg - 1; l >= 1; l-- { if 1 & ipp == 1 { i ^= seq.iv[MaxDim * (j - 1) + k] } ipp >>= 1 } seq.iv[MaxDim * j + k] = i } } seq.isInit = true } // See Press et al. 2007. func (seq *SobolSequence) Next(dim int) []float64 { target := make([]float64, dim) seq.NextAt(target) return target } // NextAt is equivelent to Next, except the Sobol sequence is returned in-place. func (seq *SobolSequence) NextAt(target []float64) { dim := uint32(len(target)) if dim > MaxDim { log.Fatalf("Target dim %d is larger than MaxDim %d.\n", dim, MaxDim) } else if seq.seqNum >= maxSeqNum { log.Fatalf("Exceeded maximum seq num of %d for MaxBit %d.\n", maxSeqNum, MaxBit, ) } seq.seqNum++ zeroIdx := uint32(0) for zeroIdx = 0; zeroIdx < MaxBit; zeroIdx++ { if (seq.seqNum & (1<