/*
Copyright (C) 2008 Richard Gomes

This source code is release under the BSD License.

This file is part of JQuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://jquantlib.org/

JQuantLib is free software: you can redistribute it and/or modify it
under the terms of the JQuantLib license.  You should have received a
copy of the license along with this program; if not, please email
. The license is also available online at
.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the license for more details.

JQuantLib is based on QuantLib. http://quantlib.org/
When applicable, the original copyright notice follows this notice.
 */
package org.jquantlib.math.randomnumbers;

import org.jquantlib.QL;
import org.jquantlib.math.Constants;
import org.jquantlib.methods.montecarlo.Sample;

/**
 * Sobol low-discrepancy sequence generator
 * 

* A Gray code counter and bitwise operations are used for very * fast sequence generation. *

* The implementation relies on primitive polynomials modulo two * from the book "Monte Carlo Methods in Finance" by Peter * Jaeckel. *

* 21 200 primitive polynomials modulo two are provided in QuantLib. * Jaeckel has calculated 8 129 334 polynomials: if you need that many * dimensions you can replace the primitivepolynomials.c file included * in QuantLib with the one provided in the CD of the "Monte Carlo * Methods in Finance" book. *

* The choice of initialization numbers (also know as free direction * integers) is crucial for the homogeneity properties of the sequence. * Sobol defines two homogeneity properties: Property A and Property A'. *

* The unit initialization numbers suggested in "Numerical * Recipes in C", 2nd edition, by Press, Teukolsky, Vetterling, * and Flannery (section 7.7) fail the test for Property A even * for low dimensions. *

* Bratley and Fox published coefficients of the free direction * integers up to dimension 40, crediting unpublished work of * Sobol' and Levitan. See Bratley, P., Fox, B.L. (1988) * "Algorithm 659: Implementing Sobol's quasirandom sequence * generator," ACM Transactions on Mathematical Software * 14:88-100. These values satisfy Property A for d<=20 and d = * 23, 31, 33, 34, 37; Property A' holds for d<=6. *

* Jaeckel provides in his book (section 8.3) initialization * numbers up to dimension 32. Coefficients for d<=8 are the same * as in Bradley-Fox, so Property A' holds for d<=6 but Property * A holds for d<=32. *

* The implementation of Lemieux, Cieslak, and Luttmer includes * coefficients of the free direction integers up to dimension * 360. Coefficients for d<=40 are the same as in Bradley-Fox. * For dimension 40 * For more info on Sobol' sequences see also "Monte Carlo * Methods in Financial Engineering," by P. Glasserman, 2004, * Springer, section 5.2.3 * * @author Dominik Holenstein * @author Q.Boiler */ //FIXME: http://bugs.jquantlib.org/view.php?id=332 public class SobolRsg implements UniformRandomSequenceGenerator { // Sobol' Levitan coefficients of the free direction integers as given by Bratley, P., Fox, B.L. (1988) private static final long dim02SLinitializers[] = {1, 0}; private static final long dim03SLinitializers[] = {1, 1, 0}; private static final long dim04SLinitializers[] = {1, 3, 7, 0}; private static final long dim05SLinitializers[] = {1, 1, 5, 0}; private static final long dim06SLinitializers[] = {1, 3, 1, 1, 0}; private static final long dim07SLinitializers[] = {1, 1, 3, 7, 0}; private static final long dim08SLinitializers[] = {1, 3, 3, 9, 9, 0}; private static final long dim09SLinitializers[] = {1, 3, 7, 13, 3, 0}; private static final long dim10SLinitializers[] = {1, 1, 5, 11, 27, 0}; private static final long dim11SLinitializers[] = {1, 3, 5, 1, 15, 0}; private static final long dim12SLinitializers[] = {1, 1, 7, 3, 29, 0}; private static final long dim13SLinitializers[] = {1, 3, 7, 7, 21, 0}; private static final long dim14SLinitializers[] = {1, 1, 1, 9, 23, 37, 0}; private static final long dim15SLinitializers[] = {1, 3, 3, 5, 19, 33, 0}; private static final long dim16SLinitializers[] = {1, 1, 3, 13, 11, 7, 0}; private static final long dim17SLinitializers[] = {1, 1, 7, 13, 25, 5, 0}; private static final long dim18SLinitializers[] = {1, 3, 5, 11, 7, 11, 0}; private static final long dim19SLinitializers[] = {1, 1, 1, 3, 13, 39, 0}; private static final long dim20SLinitializers[] = {1, 3, 1, 15, 17, 63, 13, 0}; private static final long dim21SLinitializers[] = {1, 1, 5, 5, 1, 27, 33, 0}; private static final long dim22SLinitializers[] = {1, 3, 3, 3, 25, 17, 115, 0}; private static final long dim23SLinitializers[] = {1, 1, 3, 15, 29, 15, 41, 0}; private static final long dim24SLinitializers[] = {1, 3, 1, 7, 3, 23, 79, 0}; private static final long dim25SLinitializers[] = {1, 3, 7, 9, 31, 29, 17, 0}; private static final long dim26SLinitializers[] = {1, 1, 5, 13, 11, 3, 29, 0}; private static final long dim27SLinitializers[] = {1, 3, 1, 9, 5, 21, 119, 0}; private static final long dim28SLinitializers[] = {1, 1, 3, 1, 23, 13, 75, 0}; private static final long dim29SLinitializers[] = {1, 3, 3, 11, 27, 31, 73, 0}; private static final long dim30SLinitializers[] = {1, 1, 7, 7, 19, 25, 105, 0}; private static final long dim31SLinitializers[] = {1, 3, 5, 5, 21, 9, 7, 0}; private static final long dim32SLinitializers[] = {1, 1, 1, 15, 5, 49, 59, 0}; private static final long dim33SLinitializers[] = {1, 1, 1, 1, 1, 33, 65, 0}; private static final long dim34SLinitializers[] = {1, 3, 5, 15, 17, 19, 21, 0}; private static final long dim35SLinitializers[] = {1, 1, 7, 11, 13, 29, 3, 0}; private static final long dim36SLinitializers[] = {1, 3, 7, 5, 7, 11, 113, 0}; private static final long dim37SLinitializers[] = {1, 1, 5, 3, 15, 19, 61, 0}; private static final long dim38SLinitializers[] = {1, 3, 1, 1, 9, 27, 89, 7, 0}; private static final long dim39SLinitializers[] = {1, 1, 3, 7, 31, 15, 45, 23, 0}; private static final long dim40SLinitializers[] = {1, 3, 3, 9, 9, 25, 107, 39, 0}; private final long[][] SLinitializers = { dim02SLinitializers, dim03SLinitializers, dim04SLinitializers, dim05SLinitializers, dim06SLinitializers, dim07SLinitializers, dim08SLinitializers, dim09SLinitializers, dim10SLinitializers, dim11SLinitializers, dim12SLinitializers, dim13SLinitializers, dim14SLinitializers, dim15SLinitializers, dim16SLinitializers, dim17SLinitializers, dim18SLinitializers, dim19SLinitializers, dim20SLinitializers, dim21SLinitializers, dim22SLinitializers, dim23SLinitializers, dim24SLinitializers, dim25SLinitializers, dim26SLinitializers, dim27SLinitializers, dim28SLinitializers, dim29SLinitializers, dim30SLinitializers, dim31SLinitializers, dim32SLinitializers, dim33SLinitializers, dim34SLinitializers, dim35SLinitializers, dim36SLinitializers, dim37SLinitializers, dim38SLinitializers, dim39SLinitializers, dim40SLinitializers }; private final int sizeSLinitializers = dim02SLinitializers.length + dim03SLinitializers.length + dim04SLinitializers.length + dim05SLinitializers.length + dim06SLinitializers.length + dim07SLinitializers.length + dim08SLinitializers.length + dim09SLinitializers.length + dim10SLinitializers.length + dim11SLinitializers.length + dim12SLinitializers.length + dim13SLinitializers.length + dim14SLinitializers.length + dim15SLinitializers.length + dim16SLinitializers.length + dim17SLinitializers.length + dim18SLinitializers.length + dim19SLinitializers.length + dim20SLinitializers.length + dim21SLinitializers.length + dim22SLinitializers.length + dim23SLinitializers.length + dim24SLinitializers.length + dim25SLinitializers.length + dim26SLinitializers.length + dim27SLinitializers.length + dim28SLinitializers.length + dim29SLinitializers.length + dim30SLinitializers.length + dim31SLinitializers.length + dim32SLinitializers.length + dim33SLinitializers.length + dim34SLinitializers.length + dim35SLinitializers.length + dim36SLinitializers.length + dim37SLinitializers.length + dim38SLinitializers.length + dim39SLinitializers.length + dim40SLinitializers.length; // coefficients of the free direction integers as given in "Monte Carlo Methods in Finance", by Peter Jaeckel, section 8.3 private static final long dim09initializers[] = {1, 3, 7, 7, 21, 0}; private static final long dim10initializers[] = {1, 1, 5, 11, 27, 0}; private static final long dim11initializers[] = {1, 1, 7, 3, 29, 0}; private static final long dim12initializers[] = {1, 3, 7, 13, 3, 0}; private static final long dim13initializers[] = {1, 3, 5, 1, 15, 0}; private static final long dim14initializers[] = {1, 1, 1, 9, 23, 37, 0}; private static final long dim15initializers[] = {1, 1, 3, 13, 11, 7, 0}; private static final long dim16initializers[] = {1, 3, 3, 5, 19, 33, 0}; private static final long dim17initializers[] = {1, 1, 7, 13, 25, 5, 0}; private static final long dim18initializers[] = {1, 1, 1, 3, 13, 39, 0}; private static final long dim19initializers[] = {1, 3, 5, 11, 7, 11, 0}; private static final long dim20initializers[] = {1, 3, 1, 7, 3, 23, 79, 0}; private static final long dim21initializers[] = {1, 3, 1, 15, 17, 63, 13, 0}; private static final long dim22initializers[] = {1, 3, 3, 3, 25, 17, 115, 0}; private static final long dim23initializers[] = {1, 3, 7, 9, 31, 29, 17, 0}; private static final long dim24initializers[] = {1, 1, 3, 15, 29, 15, 41, 0}; private static final long dim25initializers[] = {1, 3, 1, 9, 5, 21, 119, 0}; private static final long dim26initializers[] = {1, 1, 5, 5, 1, 27, 33, 0}; private static final long dim27initializers[] = {1, 1, 3, 1, 23, 13, 75, 0}; private static final long dim28initializers[] = {1, 1, 7, 7, 19, 25, 105, 0}; private static final long dim29initializers[] = {1, 3, 5, 5, 21, 9, 7, 0}; private static final long dim30initializers[] = {1, 1, 1, 15, 5, 49, 59, 0}; private static final long dim31initializers[] = {1, 3, 5, 15, 17, 19, 21, 0}; private static final long dim32initializers[] = {1, 1, 7, 11, 13, 29, 3, 0}; private final long[][] initializers = { dim02SLinitializers, dim03SLinitializers, dim04SLinitializers, dim05SLinitializers, dim06SLinitializers, dim07SLinitializers, dim08SLinitializers, dim09initializers, dim10initializers, dim11initializers, dim12initializers, dim13initializers, dim14initializers, dim15initializers, dim16initializers, dim17initializers, dim18initializers, dim19initializers, dim20initializers, dim21initializers, dim22initializers, dim23initializers, dim24initializers, dim25initializers, dim26initializers, dim27initializers, dim28initializers, dim29initializers, dim30initializers, dim31initializers, dim32initializers }; private final int sizeInitializers = dim02SLinitializers.length + dim03SLinitializers.length + dim04SLinitializers.length + dim05SLinitializers.length + dim06SLinitializers.length + dim07SLinitializers.length + dim08SLinitializers.length + dim09initializers.length + dim10initializers.length + dim11initializers.length + dim12initializers.length + dim13initializers.length + dim14initializers.length + dim15initializers.length + dim16initializers.length + dim17initializers.length + dim18initializers.length + dim19initializers.length + dim20initializers.length + dim21initializers.length + dim22initializers.length + dim23initializers.length + dim24initializers.length + dim25initializers.length + dim26initializers.length + dim27initializers.length + dim28initializers.length + dim29initializers.length + dim30initializers.length + dim31initializers.length + dim32initializers.length; // Lemieux coefficients of the free direction integers as given in Christiane Lemieux, private communication, September 2004 private static final long dim041Linitializers[] = {1, 1, 3, 13, 7, 35, 61, 91, 0}; private static final long dim042Linitializers[] = {1, 1, 7, 11, 5, 35, 55, 75, 0}; private static final long dim043Linitializers[] = {1, 3, 5, 5, 11, 23, 29, 139, 0}; private static final long dim044Linitializers[] = {1, 1, 1, 7, 11, 15, 17, 81, 0}; private static final long dim045Linitializers[] = {1, 1, 7, 9, 5, 57, 79, 103, 0}; private static final long dim046Linitializers[] = {1, 1, 7, 13, 19, 5, 5, 185, 0}; private static final long dim047Linitializers[] = {1, 3, 1, 3, 13, 57, 97, 131, 0}; private static final long dim048Linitializers[] = {1, 1, 5, 5, 21, 25, 125, 197, 0}; private static final long dim049Linitializers[] = {1, 3, 3, 9, 31, 11, 103, 201, 0}; private static final long dim050Linitializers[] = {1, 1, 5, 3, 7, 25, 51, 121, 0}; private static final long dim051Linitializers[] = {1, 3, 7, 15, 19, 53, 73, 189, 0}; private static final long dim052Linitializers[] = {1, 1, 1, 15, 19, 55, 27, 183, 0}; private static final long dim053Linitializers[] = {1, 1, 7, 13, 3, 29, 109, 69, 0}; private static final long dim054Linitializers[] = {1, 1, 5, 15, 15, 23, 15, 1, 57, 0}; private static final long dim055Linitializers[] = {1, 3, 1, 3, 23, 55, 43, 143, 397, 0}; private static final long dim056Linitializers[] = {1, 1, 3, 11, 29, 9, 35, 131, 411, 0}; private static final long dim057Linitializers[] = {1, 3, 1, 7, 27, 39, 103, 199, 277, 0}; private static final long dim058Linitializers[] = {1, 3, 7, 3, 19, 55, 127, 67, 449, 0}; private static final long dim059Linitializers[] = {1, 3, 7, 3, 5, 29, 45, 85, 3, 0}; private static final long dim060Linitializers[] = {1, 3, 5, 5, 13, 23, 75, 245, 453, 0}; private static final long dim061Linitializers[] = {1, 3, 1, 15, 21, 47, 3, 77, 165, 0}; private static final long dim062Linitializers[] = {1, 1, 7, 9, 15, 5, 117, 73, 473, 0}; private static final long dim063Linitializers[] = {1, 3, 1, 9, 1, 21, 13, 173, 313, 0}; private static final long dim064Linitializers[] = {1, 1, 7, 3, 11, 45, 63, 77, 49, 0}; private static final long dim065Linitializers[] = {1, 1, 1, 1, 1, 25, 123, 39, 259, 0}; private static final long dim066Linitializers[] = {1, 1, 1, 5, 23, 11, 59, 11, 203, 0}; private static final long dim067Linitializers[] = {1, 3, 3, 15, 21, 1, 73, 71, 421, 0}; private static final long dim068Linitializers[] = {1, 1, 5, 11, 15, 31, 115, 95, 217, 0}; private static final long dim069Linitializers[] = {1, 1, 3, 3, 7, 53, 37, 43, 439, 0}; private static final long dim070Linitializers[] = {1, 1, 1, 1, 27, 53, 69, 159, 321, 0}; private static final long dim071Linitializers[] = {1, 1, 5, 15, 29, 17, 19, 43, 449, 0}; private static final long dim072Linitializers[] = {1, 1, 3, 9, 1, 55, 121, 205, 255, 0}; private static final long dim073Linitializers[] = {1, 1, 3, 11, 9, 47, 107, 11, 417, 0}; private static final long dim074Linitializers[] = {1, 1, 1, 5, 17, 25, 21, 83, 95, 0}; private static final long dim075Linitializers[] = {1, 3, 5, 13, 31, 25, 61, 157, 407, 0}; private static final long dim076Linitializers[] = {1, 1, 7, 9, 25, 33, 41, 35, 17, 0}; private static final long dim077Linitializers[] = {1, 3, 7, 15, 13, 39, 61, 187, 461, 0}; private static final long dim078Linitializers[] = {1, 3, 7, 13, 5, 57, 23, 177, 435, 0}; private static final long dim079Linitializers[] = {1, 1, 3, 15, 11, 27, 115, 5, 337, 0}; private static final long dim080Linitializers[] = {1, 3, 7, 3, 15, 63, 61, 171, 339, 0}; private static final long dim081Linitializers[] = {1, 3, 3, 13, 15, 61, 59, 47, 1, 0}; private static final long dim082Linitializers[] = {1, 1, 5, 15, 13, 5, 39, 83, 329, 0}; private static final long dim083Linitializers[] = {1, 1, 5, 5, 5, 27, 25, 39, 301, 0}; private static final long dim084Linitializers[] = {1, 1, 5, 11, 31, 41, 35, 233, 27, 0}; private static final long dim085Linitializers[] = {1, 3, 5, 15, 7, 37, 119, 171, 419, 0}; private static final long dim086Linitializers[] = {1, 3, 5, 5, 3, 29, 21, 189, 417, 0}; private static final long dim087Linitializers[] = {1, 1, 1, 1, 21, 41, 117, 119, 351, 0}; private static final long dim088Linitializers[] = {1, 1, 3, 1, 7, 27, 87, 19, 213, 0}; private static final long dim089Linitializers[] = {1, 1, 1, 1, 17, 7, 97, 217, 477, 0}; private static final long dim090Linitializers[] = {1, 1, 7, 1, 29, 61, 103, 231, 269, 0}; private static final long dim091Linitializers[] = {1, 1, 7, 13, 9, 27, 107, 207, 311, 0}; private static final long dim092Linitializers[] = {1, 1, 7, 5, 25, 21, 107, 179, 423, 0}; private static final long dim093Linitializers[] = {1, 3, 5, 11, 7, 1, 17, 245, 281, 0}; private static final long dim094Linitializers[] = {1, 3, 5, 9, 1, 5, 53, 59, 125, 0}; private static final long dim095Linitializers[] = {1, 1, 7, 1, 31, 57, 71, 245, 125, 0}; private static final long dim096Linitializers[] = {1, 1, 7, 5, 5, 57, 53, 253, 441, 0}; private static final long dim097Linitializers[] = {1, 3, 1, 13, 19, 35, 119, 235, 381, 0}; private static final long dim098Linitializers[] = {1, 3, 1, 7, 19, 59, 115, 33, 361, 0}; private static final long dim099Linitializers[] = {1, 1, 3, 5, 13, 1, 49, 143, 501, 0}; private static final long dim100Linitializers[] = {1, 1, 3, 5, 1, 63, 101, 85, 189, 0}; private static final long dim101Linitializers[] = {1, 1, 5, 11, 27, 63, 13, 131, 5, 0}; private static final long dim102Linitializers[] = {1, 1, 5, 7, 15, 45, 75, 59, 455, 585, 0}; private static final long dim103Linitializers[] = {1, 3, 1, 3, 7, 7, 111, 23, 119, 959, 0}; private static final long dim104Linitializers[] = {1, 3, 3, 9, 11, 41, 109, 163, 161, 879, 0}; private static final long dim105Linitializers[] = {1, 3, 5, 1, 21, 41, 121, 183, 315, 219, 0}; private static final long dim106Linitializers[] = {1, 1, 3, 9, 15, 3, 9, 223, 441, 929, 0}; private static final long dim107Linitializers[] = {1, 1, 7, 9, 3, 5, 93, 57, 253, 457, 0}; private static final long dim108Linitializers[] = {1, 1, 7, 13, 15, 29, 83, 21, 35, 45, 0}; private static final long dim109Linitializers[] = {1, 1, 3, 7, 13, 61, 119, 219, 85, 505, 0}; private static final long dim110Linitializers[] = {1, 1, 3, 3, 17, 13, 35, 197, 291, 109, 0}; private static final long dim111Linitializers[] = {1, 1, 3, 3, 5, 1, 113, 103, 217, 253, 0}; private static final long dim112Linitializers[] = {1, 1, 7, 1, 15, 39, 63, 223, 17, 9, 0}; private static final long dim113Linitializers[] = {1, 3, 7, 1, 17, 29, 67, 103, 495, 383, 0}; private static final long dim114Linitializers[] = {1, 3, 3, 15, 31, 59, 75, 165, 51, 913, 0}; private static final long dim115Linitializers[] = {1, 3, 7, 9, 5, 27, 79, 219, 233, 37, 0}; private static final long dim116Linitializers[] = {1, 3, 5, 15, 1, 11, 15, 211, 417, 811, 0}; private static final long dim117Linitializers[] = {1, 3, 5, 3, 29, 27, 39, 137, 407, 231, 0}; private static final long dim118Linitializers[] = {1, 1, 3, 5, 29, 43, 125, 135, 109, 67, 0}; private static final long dim119Linitializers[] = {1, 1, 1, 5, 11, 39, 107, 159, 323, 381, 0}; private static final long dim120Linitializers[] = {1, 1, 1, 1, 9, 11, 33, 55, 169, 253, 0}; private static final long dim121Linitializers[] = {1, 3, 5, 5, 11, 53, 63, 101, 251, 897, 0}; private static final long dim122Linitializers[] = {1, 3, 7, 1, 25, 15, 83, 119, 53, 157, 0}; private static final long dim123Linitializers[] = {1, 3, 5, 13, 5, 5, 3, 195, 111, 451, 0}; private static final long dim124Linitializers[] = {1, 3, 1, 15, 11, 1, 19, 11, 307, 777, 0}; private static final long dim125Linitializers[] = {1, 3, 7, 11, 5, 5, 17, 231, 345, 981, 0}; private static final long dim126Linitializers[] = {1, 1, 3, 3, 1, 33, 83, 201, 57, 475, 0}; private static final long dim127Linitializers[] = {1, 3, 7, 7, 17, 13, 35, 175, 499, 809, 0}; private static final long dim128Linitializers[] = {1, 1, 5, 3, 3, 17, 103, 119, 499, 865, 0}; private static final long dim129Linitializers[] = {1, 1, 1, 11, 27, 25, 37, 121, 401, 11, 0}; private static final long dim130Linitializers[] = {1, 1, 1, 11, 9, 25, 25, 241, 403, 3, 0}; private static final long dim131Linitializers[] = {1, 1, 1, 1, 11, 1, 39, 163, 231, 573, 0}; private static final long dim132Linitializers[] = {1, 1, 1, 13, 13, 21, 75, 185, 99, 545, 0}; private static final long dim133Linitializers[] = {1, 1, 1, 15, 3, 63, 69, 11, 173, 315, 0}; private static final long dim134Linitializers[] = {1, 3, 5, 15, 11, 3, 95, 49, 123, 765, 0}; private static final long dim135Linitializers[] = {1, 1, 1, 15, 3, 63, 77, 31, 425, 711, 0}; private static final long dim136Linitializers[] = {1, 1, 7, 15, 1, 37, 119, 145, 489, 583, 0}; private static final long dim137Linitializers[] = {1, 3, 5, 15, 3, 49, 117, 211, 165, 323, 0}; private static final long dim138Linitializers[] = {1, 3, 7, 1, 27, 63, 77, 201, 225, 803, 0}; private static final long dim139Linitializers[] = {1, 1, 1, 11, 23, 35, 67, 21, 469, 357, 0}; private static final long dim140Linitializers[] = {1, 1, 7, 7, 9, 7, 25, 237, 237, 571, 0}; private static final long dim141Linitializers[] = {1, 1, 3, 15, 29, 5, 107, 109, 241, 47, 0}; private static final long dim142Linitializers[] = {1, 3, 5, 11, 27, 63, 29, 13, 203, 675, 0}; private static final long dim143Linitializers[] = {1, 1, 3, 9, 9, 11, 103, 179, 449, 263, 0}; private static final long dim144Linitializers[] = {1, 3, 5, 11, 29, 63, 53, 151, 259, 223, 0}; private static final long dim145Linitializers[] = {1, 1, 3, 7, 9, 25, 5, 197, 237, 163, 0}; private static final long dim146Linitializers[] = {1, 3, 7, 13, 5, 57, 67, 193, 147, 241, 0}; private static final long dim147Linitializers[] = {1, 1, 5, 15, 15, 33, 17, 67, 161, 341, 0}; private static final long dim148Linitializers[] = {1, 1, 3, 13, 17, 43, 21, 197, 441, 985, 0}; private static final long dim149Linitializers[] = {1, 3, 1, 5, 15, 33, 33, 193, 305, 829, 0}; private static final long dim150Linitializers[] = {1, 1, 1, 13, 19, 27, 71, 187, 477, 239, 0}; private static final long dim151Linitializers[] = {1, 1, 1, 9, 9, 17, 41, 177, 229, 983, 0}; private static final long dim152Linitializers[] = {1, 3, 5, 9, 15, 45, 97, 205, 43, 767, 0}; private static final long dim153Linitializers[] = {1, 1, 1, 9, 31, 31, 77, 159, 395, 809, 0}; private static final long dim154Linitializers[] = {1, 3, 3, 3, 29, 19, 73, 123, 165, 307, 0}; private static final long dim155Linitializers[] = {1, 3, 1, 7, 5, 11, 77, 227, 355, 403, 0}; private static final long dim156Linitializers[] = {1, 3, 5, 5, 25, 31, 1, 215, 451, 195, 0}; private static final long dim157Linitializers[] = {1, 3, 7, 15, 29, 37, 101, 241, 17, 633, 0}; private static final long dim158Linitializers[] = {1, 1, 5, 1, 11, 3, 107, 137, 489, 5, 0}; private static final long dim159Linitializers[] = {1, 1, 1, 7, 19, 19, 75, 85, 471, 355, 0}; private static final long dim160Linitializers[] = {1, 1, 3, 3, 9, 13, 113, 167, 13, 27, 0}; private static final long dim161Linitializers[] = {1, 3, 5, 11, 21, 3, 89, 205, 377, 307, 0}; private static final long dim162Linitializers[] = {1, 1, 1, 9, 31, 61, 65, 9, 391, 141, 867, 0}; private static final long dim163Linitializers[] = {1, 1, 1, 9, 19, 19, 61, 227, 241, 55, 161, 0}; private static final long dim164Linitializers[] = {1, 1, 1, 11, 1, 19, 7, 233, 463, 171, 1941, 0}; private static final long dim165Linitializers[] = {1, 1, 5, 7, 25, 13, 103, 75, 19, 1021, 1063, 0}; private static final long dim166Linitializers[] = {1, 1, 1, 15, 17, 17, 79, 63, 391, 403, 1221, 0}; private static final long dim167Linitializers[] = {1, 3, 3, 11, 29, 25, 29, 107, 335, 475, 963, 0}; private static final long dim168Linitializers[] = {1, 3, 5, 1, 31, 33, 49, 43, 155, 9, 1285, 0}; private static final long dim169Linitializers[] = {1, 1, 5, 5, 15, 47, 39, 161, 357, 863, 1039, 0}; private static final long dim170Linitializers[] = {1, 3, 7, 15, 1, 39, 47, 109, 427, 393, 1103, 0}; private static final long dim171Linitializers[] = {1, 1, 1, 9, 9, 29, 121, 233, 157, 99, 701, 0}; private static final long dim172Linitializers[] = {1, 1, 1, 7, 1, 29, 75, 121, 439, 109, 993, 0}; private static final long dim173Linitializers[] = {1, 1, 1, 9, 5, 1, 39, 59, 89, 157, 1865, 0}; private static final long dim174Linitializers[] = {1, 1, 5, 1, 3, 37, 89, 93, 143, 533, 175, 0}; private static final long dim175Linitializers[] = {1, 1, 3, 5, 7, 33, 35, 173, 159, 135, 241, 0}; private static final long dim176Linitializers[] = {1, 1, 1, 15, 17, 37, 79, 131, 43, 891, 229, 0}; private static final long dim177Linitializers[] = {1, 1, 1, 1, 1, 35, 121, 177, 397, 1017, 583, 0}; private static final long dim178Linitializers[] = {1, 1, 3, 15, 31, 21, 43, 67, 467, 923, 1473, 0}; private static final long dim179Linitializers[] = {1, 1, 1, 7, 1, 33, 77, 111, 125, 771, 1975, 0}; private static final long dim180Linitializers[] = {1, 3, 7, 13, 1, 51, 113, 139, 245, 573, 503, 0}; private static final long dim181Linitializers[] = {1, 3, 1, 9, 21, 49, 15, 157, 49, 483, 291, 0}; private static final long dim182Linitializers[] = {1, 1, 1, 1, 29, 35, 17, 65, 403, 485, 1603, 0}; private static final long dim183Linitializers[] = {1, 1, 1, 7, 19, 1, 37, 129, 203, 321, 1809, 0}; private static final long dim184Linitializers[] = {1, 3, 7, 15, 15, 9, 5, 77, 29, 485, 581, 0}; private static final long dim185Linitializers[] = {1, 1, 3, 5, 15, 49, 97, 105, 309, 875, 1581, 0}; private static final long dim186Linitializers[] = {1, 3, 5, 1, 5, 19, 63, 35, 165, 399, 1489, 0}; private static final long dim187Linitializers[] = {1, 3, 5, 3, 23, 5, 79, 137, 115, 599, 1127, 0}; private static final long dim188Linitializers[] = {1, 1, 7, 5, 3, 61, 27, 177, 257, 91, 841, 0}; private static final long dim189Linitializers[] = {1, 1, 3, 5, 9, 31, 91, 209, 409, 661, 159, 0}; private static final long dim190Linitializers[] = {1, 3, 1, 15, 23, 39, 23, 195, 245, 203, 947, 0}; private static final long dim191Linitializers[] = {1, 1, 3, 1, 15, 59, 67, 95, 155, 461, 147, 0}; private static final long dim192Linitializers[] = {1, 3, 7, 5, 23, 25, 87, 11, 51, 449, 1631, 0}; private static final long dim193Linitializers[] = {1, 1, 1, 1, 17, 57, 7, 197, 409, 609, 135, 0}; private static final long dim194Linitializers[] = {1, 1, 1, 9, 1, 61, 115, 113, 495, 895, 1595, 0}; private static final long dim195Linitializers[] = {1, 3, 7, 15, 9, 47, 121, 211, 379, 985, 1755, 0}; private static final long dim196Linitializers[] = {1, 3, 1, 3, 7, 57, 27, 231, 339, 325, 1023, 0}; private static final long dim197Linitializers[] = {1, 1, 1, 1, 19, 63, 63, 239, 31, 643, 373, 0}; private static final long dim198Linitializers[] = {1, 3, 1, 11, 19, 9, 7, 171, 21, 691, 215, 0}; private static final long dim199Linitializers[] = {1, 1, 5, 13, 11, 57, 39, 211, 241, 893, 555, 0}; private static final long dim200Linitializers[] = {1, 1, 7, 5, 29, 21, 45, 59, 509, 223, 491, 0}; private static final long dim201Linitializers[] = {1, 1, 7, 9, 15, 61, 97, 75, 127, 779, 839, 0}; private static final long dim202Linitializers[] = {1, 1, 7, 15, 17, 33, 75, 237, 191, 925, 681, 0}; private static final long dim203Linitializers[] = {1, 3, 5, 7, 27, 57, 123, 111, 101, 371, 1129, 0}; private static final long dim204Linitializers[] = {1, 3, 5, 5, 29, 45, 59, 127, 229, 967, 2027, 0}; private static final long dim205Linitializers[] = {1, 1, 1, 1, 17, 7, 23, 199, 241, 455, 135, 0}; private static final long dim206Linitializers[] = {1, 1, 7, 15, 27, 29, 105, 171, 337, 503, 1817, 0}; private static final long dim207Linitializers[] = {1, 1, 3, 7, 21, 35, 61, 71, 405, 647, 2045, 0}; private static final long dim208Linitializers[] = {1, 1, 1, 1, 1, 15, 65, 167, 501, 79, 737, 0}; private static final long dim209Linitializers[] = {1, 1, 5, 1, 3, 49, 27, 189, 341, 615, 1287, 0}; private static final long dim210Linitializers[] = {1, 1, 1, 9, 1, 7, 31, 159, 503, 327, 1613, 0}; private static final long dim211Linitializers[] = {1, 3, 3, 3, 3, 23, 99, 115, 323, 997, 987, 0}; private static final long dim212Linitializers[] = {1, 1, 1, 9, 19, 33, 93, 247, 509, 453, 891, 0}; private static final long dim213Linitializers[] = {1, 1, 3, 1, 13, 19, 35, 153, 161, 633, 445, 0}; private static final long dim214Linitializers[] = {1, 3, 5, 15, 31, 5, 87, 197, 183, 783, 1823, 0}; private static final long dim215Linitializers[] = {1, 1, 7, 5, 19, 63, 69, 221, 129, 231, 1195, 0}; private static final long dim216Linitializers[] = {1, 1, 5, 5, 13, 23, 19, 231, 245, 917, 379, 0}; private static final long dim217Linitializers[] = {1, 3, 1, 15, 19, 43, 27, 223, 171, 413, 125, 0}; private static final long dim218Linitializers[] = {1, 1, 1, 9, 1, 59, 21, 15, 509, 207, 589, 0}; private static final long dim219Linitializers[] = {1, 3, 5, 3, 19, 31, 113, 19, 23, 733, 499, 0}; private static final long dim220Linitializers[] = {1, 1, 7, 1, 19, 51, 101, 165, 47, 925, 1093, 0}; private static final long dim221Linitializers[] = {1, 3, 3, 9, 15, 21, 43, 243, 237, 461, 1361, 0}; private static final long dim222Linitializers[] = {1, 1, 1, 9, 17, 15, 75, 75, 113, 715, 1419, 0}; private static final long dim223Linitializers[] = {1, 1, 7, 13, 17, 1, 99, 15, 347, 721, 1405, 0}; private static final long dim224Linitializers[] = {1, 1, 7, 15, 7, 27, 23, 183, 39, 59, 571, 0}; private static final long dim225Linitializers[] = {1, 3, 5, 9, 7, 43, 35, 165, 463, 567, 859, 0}; private static final long dim226Linitializers[] = {1, 3, 3, 11, 15, 19, 17, 129, 311, 343, 15, 0}; private static final long dim227Linitializers[] = {1, 1, 1, 15, 31, 59, 63, 39, 347, 359, 105, 0}; private static final long dim228Linitializers[] = {1, 1, 1, 15, 5, 43, 87, 241, 109, 61, 685, 0}; private static final long dim229Linitializers[] = {1, 1, 7, 7, 9, 39, 121, 127, 369, 579, 853, 0}; private static final long dim230Linitializers[] = {1, 1, 1, 1, 17, 15, 15, 95, 325, 627, 299, 0}; private static final long dim231Linitializers[] = {1, 1, 3, 13, 31, 53, 85, 111, 289, 811, 1635, 0}; private static final long dim232Linitializers[] = {1, 3, 7, 1, 19, 29, 75, 185, 153, 573, 653, 0}; private static final long dim233Linitializers[] = {1, 3, 7, 1, 29, 31, 55, 91, 249, 247, 1015, 0}; private static final long dim234Linitializers[] = {1, 3, 5, 7, 1, 49, 113, 139, 257, 127, 307, 0}; private static final long dim235Linitializers[] = {1, 3, 5, 9, 15, 15, 123, 105, 105, 225, 1893, 0}; private static final long dim236Linitializers[] = {1, 3, 3, 1, 15, 5, 105, 249, 73, 709, 1557, 0}; private static final long dim237Linitializers[] = {1, 1, 1, 9, 17, 31, 113, 73, 65, 701, 1439, 0}; private static final long dim238Linitializers[] = {1, 3, 5, 15, 13, 21, 117, 131, 243, 859, 323, 0}; private static final long dim239Linitializers[] = {1, 1, 1, 9, 19, 15, 69, 149, 89, 681, 515, 0}; private static final long dim240Linitializers[] = {1, 1, 1, 5, 29, 13, 21, 97, 301, 27, 967, 0}; private static final long dim241Linitializers[] = {1, 1, 3, 3, 15, 45, 107, 227, 495, 769, 1935, 0}; private static final long dim242Linitializers[] = {1, 1, 1, 11, 5, 27, 41, 173, 261, 703, 1349, 0}; private static final long dim243Linitializers[] = {1, 3, 3, 3, 11, 35, 97, 43, 501, 563, 1331, 0}; private static final long dim244Linitializers[] = {1, 1, 1, 7, 1, 17, 87, 17, 429, 245, 1941, 0}; private static final long dim245Linitializers[] = {1, 1, 7, 15, 29, 13, 1, 175, 425, 233, 797, 0}; private static final long dim246Linitializers[] = {1, 1, 3, 11, 21, 57, 49, 49, 163, 685, 701, 0}; private static final long dim247Linitializers[] = {1, 3, 3, 7, 11, 45, 107, 111, 379, 703, 1403, 0}; private static final long dim248Linitializers[] = {1, 1, 7, 3, 21, 7, 117, 49, 469, 37, 775, 0}; private static final long dim249Linitializers[] = {1, 1, 5, 15, 31, 63, 101, 77, 507, 489, 1955, 0}; private static final long dim250Linitializers[] = {1, 3, 3, 11, 19, 21, 101, 255, 203, 673, 665, 0}; private static final long dim251Linitializers[] = {1, 3, 3, 15, 17, 47, 125, 187, 271, 899, 2003, 0}; private static final long dim252Linitializers[] = {1, 1, 7, 7, 1, 35, 13, 235, 5, 337, 905, 0}; private static final long dim253Linitializers[] = {1, 3, 1, 15, 1, 43, 1, 27, 37, 695, 1429, 0}; private static final long dim254Linitializers[] = {1, 3, 1, 11, 21, 27, 93, 161, 299, 665, 495, 0}; private static final long dim255Linitializers[] = {1, 3, 3, 15, 3, 1, 81, 111, 105, 547, 897, 0}; private static final long dim256Linitializers[] = {1, 3, 5, 1, 3, 53, 97, 253, 401, 827, 1467, 0}; private static final long dim257Linitializers[] = {1, 1, 1, 5, 19, 59, 105, 125, 271, 351, 719, 0}; private static final long dim258Linitializers[] = {1, 3, 5, 13, 7, 11, 91, 41, 441, 759, 1827, 0}; private static final long dim259Linitializers[] = {1, 3, 7, 11, 29, 61, 61, 23, 307, 863, 363, 0}; private static final long dim260Linitializers[] = {1, 1, 7, 1, 15, 35, 29, 133, 415, 473, 1737, 0}; private static final long dim261Linitializers[] = {1, 1, 1, 13, 7, 33, 35, 225, 117, 681, 1545, 0}; private static final long dim262Linitializers[] = {1, 1, 1, 3, 5, 41, 83, 247, 13, 373, 1091, 0}; private static final long dim263Linitializers[] = {1, 3, 1, 13, 25, 61, 71, 217, 233, 313, 547, 0}; private static final long dim264Linitializers[] = {1, 3, 1, 7, 3, 29, 3, 49, 93, 465, 15, 0}; private static final long dim265Linitializers[] = {1, 1, 1, 9, 17, 61, 99, 163, 129, 485, 1087, 0}; private static final long dim266Linitializers[] = {1, 1, 1, 9, 9, 33, 31, 163, 145, 649, 253, 0}; private static final long dim267Linitializers[] = {1, 1, 1, 1, 17, 63, 43, 235, 287, 111, 567, 0}; private static final long dim268Linitializers[] = {1, 3, 5, 13, 29, 7, 11, 69, 153, 127, 449, 0}; private static final long dim269Linitializers[] = {1, 1, 5, 9, 11, 21, 15, 189, 431, 493, 1219, 0}; private static final long dim270Linitializers[] = {1, 1, 1, 15, 19, 5, 47, 91, 399, 293, 1743, 0}; private static final long dim271Linitializers[] = {1, 3, 3, 11, 29, 53, 53, 225, 409, 303, 333, 0}; private static final long dim272Linitializers[] = {1, 1, 1, 15, 31, 31, 21, 81, 147, 287, 1753, 0}; private static final long dim273Linitializers[] = {1, 3, 5, 5, 5, 63, 35, 125, 41, 687, 1793, 0}; private static final long dim274Linitializers[] = {1, 1, 1, 9, 19, 59, 107, 219, 455, 971, 297, 0}; private static final long dim275Linitializers[] = {1, 1, 3, 5, 3, 51, 121, 31, 245, 105, 1311, 0}; private static final long dim276Linitializers[] = {1, 3, 1, 5, 5, 57, 75, 107, 161, 431, 1693, 0}; private static final long dim277Linitializers[] = {1, 3, 1, 3, 19, 53, 27, 31, 191, 565, 1015, 0}; private static final long dim278Linitializers[] = {1, 3, 5, 13, 9, 41, 35, 249, 287, 49, 123, 0}; private static final long dim279Linitializers[] = {1, 1, 5, 7, 27, 17, 21, 3, 151, 885, 1165, 0}; private static final long dim280Linitializers[] = {1, 1, 7, 1, 15, 17, 65, 139, 427, 339, 1171, 0}; private static final long dim281Linitializers[] = {1, 1, 1, 5, 23, 5, 9, 89, 321, 907, 391, 0}; private static final long dim282Linitializers[] = {1, 1, 7, 9, 15, 1, 77, 71, 87, 701, 917, 0}; private static final long dim283Linitializers[] = {1, 1, 7, 1, 17, 37, 115, 127, 469, 779, 1543, 0}; private static final long dim284Linitializers[] = {1, 3, 7, 3, 5, 61, 15, 37, 301, 951, 1437, 0}; private static final long dim285Linitializers[] = {1, 1, 1, 13, 9, 51, 127, 145, 229, 55, 1567, 0}; private static final long dim286Linitializers[] = {1, 3, 7, 15, 19, 47, 53, 153, 295, 47, 1337, 0}; private static final long dim287Linitializers[] = {1, 3, 3, 5, 11, 31, 29, 133, 327, 287, 507, 0}; private static final long dim288Linitializers[] = {1, 1, 7, 7, 25, 31, 37, 199, 25, 927, 1317, 0}; private static final long dim289Linitializers[] = {1, 1, 7, 9, 3, 39, 127, 167, 345, 467, 759, 0}; private static final long dim290Linitializers[] = {1, 1, 1, 1, 31, 21, 15, 101, 293, 787, 1025, 0}; private static final long dim291Linitializers[] = {1, 1, 5, 3, 11, 41, 105, 109, 149, 837, 1813, 0}; private static final long dim292Linitializers[] = {1, 1, 3, 5, 29, 13, 19, 97, 309, 901, 753, 0}; private static final long dim293Linitializers[] = {1, 1, 7, 1, 19, 17, 31, 39, 173, 361, 1177, 0}; private static final long dim294Linitializers[] = {1, 3, 3, 3, 3, 41, 81, 7, 341, 491, 43, 0}; private static final long dim295Linitializers[] = {1, 1, 7, 7, 31, 35, 29, 77, 11, 335, 1275, 0}; private static final long dim296Linitializers[] = {1, 3, 3, 15, 17, 45, 19, 63, 151, 849, 129, 0}; private static final long dim297Linitializers[] = {1, 1, 7, 5, 7, 13, 47, 73, 79, 31, 499, 0}; private static final long dim298Linitializers[] = {1, 3, 1, 11, 1, 41, 59, 151, 247, 115, 1295, 0}; private static final long dim299Linitializers[] = {1, 1, 1, 9, 31, 37, 73, 23, 295, 483, 179, 0}; private static final long dim300Linitializers[] = {1, 3, 1, 15, 13, 63, 81, 27, 169, 825, 2037, 0}; private static final long dim301Linitializers[] = {1, 3, 5, 15, 7, 11, 73, 1, 451, 101, 2039, 0}; private static final long dim302Linitializers[] = {1, 3, 5, 3, 13, 53, 31, 137, 173, 319, 1521, 0}; private static final long dim303Linitializers[] = {1, 3, 1, 3, 29, 1, 73, 227, 377, 337, 1189, 0}; private static final long dim304Linitializers[] = {1, 3, 3, 13, 27, 9, 31, 101, 229, 165, 1983, 0}; private static final long dim305Linitializers[] = {1, 3, 1, 13, 13, 19, 19, 111, 319, 421, 223, 0}; private static final long dim306Linitializers[] = {1, 1, 7, 15, 25, 37, 61, 55, 359, 255, 1955, 0}; private static final long dim307Linitializers[] = {1, 1, 5, 13, 17, 43, 49, 215, 383, 915, 51, 0}; private static final long dim308Linitializers[] = {1, 1, 3, 1, 3, 7, 13, 119, 155, 585, 967, 0}; private static final long dim309Linitializers[] = {1, 3, 1, 13, 1, 63, 125, 21, 103, 287, 457, 0}; private static final long dim310Linitializers[] = {1, 1, 7, 1, 31, 17, 125, 137, 345, 379, 1925, 0}; private static final long dim311Linitializers[] = {1, 1, 3, 5, 5, 25, 119, 153, 455, 271, 2023, 0}; private static final long dim312Linitializers[] = {1, 1, 7, 9, 9, 37, 115, 47, 5, 255, 917, 0}; private static final long dim313Linitializers[] = {1, 3, 5, 3, 31, 21, 75, 203, 489, 593, 1, 0}; private static final long dim314Linitializers[] = {1, 3, 7, 15, 19, 63, 123, 153, 135, 977, 1875, 0}; private static final long dim315Linitializers[] = {1, 1, 1, 1, 5, 59, 31, 25, 127, 209, 745, 0}; private static final long dim316Linitializers[] = {1, 1, 1, 1, 19, 45, 67, 159, 301, 199, 535, 0}; private static final long dim317Linitializers[] = {1, 1, 7, 1, 31, 17, 19, 225, 369, 125, 421, 0}; private static final long dim318Linitializers[] = {1, 3, 3, 11, 7, 59, 115, 197, 459, 469, 1055, 0}; private static final long dim319Linitializers[] = {1, 3, 1, 3, 27, 45, 35, 131, 349, 101, 411, 0}; private static final long dim320Linitializers[] = {1, 3, 7, 11, 9, 3, 67, 145, 299, 253, 1339, 0}; private static final long dim321Linitializers[] = {1, 3, 3, 11, 9, 37, 123, 229, 273, 269, 515, 0}; private static final long dim322Linitializers[] = {1, 3, 7, 15, 11, 25, 75, 5, 367, 217, 951, 0}; private static final long dim323Linitializers[] = {1, 1, 3, 7, 9, 23, 63, 237, 385, 159, 1273, 0}; private static final long dim324Linitializers[] = {1, 1, 5, 11, 23, 5, 55, 193, 109, 865, 663, 0}; private static final long dim325Linitializers[] = {1, 1, 7, 15, 1, 57, 17, 141, 51, 217, 1259, 0}; private static final long dim326Linitializers[] = {1, 1, 3, 3, 15, 7, 89, 233, 71, 329, 203, 0}; private static final long dim327Linitializers[] = {1, 3, 7, 11, 11, 1, 19, 155, 89, 437, 573, 0}; private static final long dim328Linitializers[] = {1, 3, 1, 9, 27, 61, 47, 109, 161, 913, 1681, 0}; private static final long dim329Linitializers[] = {1, 1, 7, 15, 1, 33, 19, 15, 23, 913, 989, 0}; private static final long dim330Linitializers[] = {1, 3, 1, 1, 25, 39, 119, 193, 13, 571, 157, 0}; private static final long dim331Linitializers[] = {1, 1, 7, 13, 9, 55, 59, 147, 361, 935, 515, 0}; private static final long dim332Linitializers[] = {1, 1, 1, 9, 7, 59, 67, 117, 71, 855, 1493, 0}; private static final long dim333Linitializers[] = {1, 3, 1, 3, 13, 19, 57, 141, 305, 275, 1079, 0}; private static final long dim334Linitializers[] = {1, 1, 1, 9, 17, 61, 33, 7, 43, 931, 781, 0}; private static final long dim335Linitializers[] = {1, 1, 3, 1, 11, 17, 21, 97, 295, 277, 1721, 0}; private static final long dim336Linitializers[] = {1, 3, 1, 13, 15, 43, 11, 241, 147, 391, 1641, 0}; private static final long dim337Linitializers[] = {1, 1, 1, 1, 1, 19, 37, 21, 255, 263, 1571, 0}; private static final long dim338Linitializers[] = {1, 1, 3, 3, 23, 59, 89, 17, 475, 303, 757, 543, 0}; private static final long dim339Linitializers[] = {1, 3, 3, 9, 11, 55, 35, 159, 139, 203, 1531, 1825, 0}; private static final long dim340Linitializers[] = {1, 1, 5, 3, 17, 53, 51, 241, 269, 949, 1373, 325, 0}; private static final long dim341Linitializers[] = {1, 3, 7, 7, 5, 29, 91, 149, 239, 193, 1951, 2675, 0}; private static final long dim342Linitializers[] = {1, 3, 5, 1, 27, 33, 69, 11, 51, 371, 833, 2685, 0}; private static final long dim343Linitializers[] = {1, 1, 1, 15, 1, 17, 35, 57, 171, 1007, 449, 367, 0}; private static final long dim344Linitializers[] = {1, 1, 1, 7, 25, 61, 73, 219, 379, 53, 589, 4065, 0}; private static final long dim345Linitializers[] = {1, 3, 5, 13, 21, 29, 45, 19, 163, 169, 147, 597, 0}; private static final long dim346Linitializers[] = {1, 1, 5, 11, 21, 27, 7, 17, 237, 591, 255, 1235, 0}; private static final long dim347Linitializers[] = {1, 1, 7, 7, 17, 41, 69, 237, 397, 173, 1229, 2341, 0}; private static final long dim348Linitializers[] = {1, 1, 3, 1, 1, 33, 125, 47, 11, 783, 1323, 2469, 0}; private static final long dim349Linitializers[] = {1, 3, 1, 11, 3, 39, 35, 133, 153, 55, 1171, 3165, 0}; private static final long dim350Linitializers[] = {1, 1, 5, 11, 27, 23, 103, 245, 375, 753, 477, 2165, 0}; private static final long dim351Linitializers[] = {1, 3, 1, 15, 15, 49, 127, 223, 387, 771, 1719, 1465, 0}; private static final long dim352Linitializers[] = {1, 1, 1, 9, 11, 9, 17, 185, 239, 899, 1273, 3961, 0}; private static final long dim353Linitializers[] = {1, 1, 3, 13, 11, 51, 73, 81, 389, 647, 1767, 1215, 0}; private static final long dim354Linitializers[] = {1, 3, 5, 15, 19, 9, 69, 35, 349, 977, 1603, 1435, 0}; private static final long dim355Linitializers[] = {1, 1, 1, 1, 19, 59, 123, 37, 41, 961, 181, 1275, 0}; private static final long dim356Linitializers[] = {1, 1, 1, 1, 31, 29, 37, 71, 205, 947, 115, 3017, 0}; private static final long dim357Linitializers[] = {1, 1, 7, 15, 5, 37, 101, 169, 221, 245, 687, 195, 0}; private static final long dim358Linitializers[] = {1, 1, 1, 1, 19, 9, 125, 157, 119, 283, 1721, 743, 0}; private static final long dim359Linitializers[] = {1, 1, 7, 3, 1, 7, 61, 71, 119, 257, 1227, 2893, 0}; private static final long dim360Linitializers[] = {1, 3, 3, 3, 25, 41, 25, 225, 31, 57, 925, 2139, 0}; private static final long[][] Linitializers = { dim02SLinitializers, dim03SLinitializers, dim04SLinitializers, dim05SLinitializers, dim06SLinitializers, dim07SLinitializers, dim08SLinitializers, dim09SLinitializers, dim10SLinitializers, dim11SLinitializers, dim12SLinitializers, dim13SLinitializers, dim14SLinitializers, dim15SLinitializers, dim16SLinitializers, dim17SLinitializers, dim18SLinitializers, dim19SLinitializers, dim20SLinitializers, dim21SLinitializers, dim22SLinitializers, dim23SLinitializers, dim24SLinitializers, dim25SLinitializers, dim26SLinitializers, dim27SLinitializers, dim28SLinitializers, dim29SLinitializers, dim30SLinitializers, dim31SLinitializers, dim32SLinitializers, dim33SLinitializers, dim34SLinitializers, dim35SLinitializers, dim36SLinitializers, dim37SLinitializers, dim38SLinitializers, dim39SLinitializers, dim40SLinitializers, dim041Linitializers, dim042Linitializers, dim043Linitializers, dim044Linitializers, dim045Linitializers, dim046Linitializers, dim047Linitializers, dim048Linitializers, dim049Linitializers, dim050Linitializers, dim051Linitializers, dim052Linitializers, dim053Linitializers, dim054Linitializers, dim055Linitializers, dim056Linitializers, dim057Linitializers, dim058Linitializers, dim059Linitializers, dim060Linitializers, dim061Linitializers, dim062Linitializers, dim063Linitializers, dim064Linitializers, dim065Linitializers, dim066Linitializers, dim067Linitializers, dim068Linitializers, dim069Linitializers, dim070Linitializers, dim071Linitializers, dim072Linitializers, dim073Linitializers, dim074Linitializers, dim075Linitializers, dim076Linitializers, dim077Linitializers, dim078Linitializers, dim079Linitializers, dim080Linitializers, dim081Linitializers, dim082Linitializers, dim083Linitializers, dim084Linitializers, dim085Linitializers, dim086Linitializers, dim087Linitializers, dim088Linitializers, dim089Linitializers, dim090Linitializers, dim091Linitializers, dim092Linitializers, dim093Linitializers, dim094Linitializers, dim095Linitializers, dim096Linitializers, dim097Linitializers, dim098Linitializers, dim099Linitializers, dim100Linitializers, dim101Linitializers, dim102Linitializers, dim103Linitializers, dim104Linitializers, dim105Linitializers, dim106Linitializers, dim107Linitializers, dim108Linitializers, dim109Linitializers, dim110Linitializers, dim111Linitializers, dim112Linitializers, dim113Linitializers, dim114Linitializers, dim115Linitializers, dim116Linitializers, dim117Linitializers, dim118Linitializers, dim119Linitializers, dim120Linitializers, dim121Linitializers, dim122Linitializers, dim123Linitializers, dim124Linitializers, dim125Linitializers, dim126Linitializers, dim127Linitializers, dim128Linitializers, dim129Linitializers, dim130Linitializers, dim131Linitializers, dim132Linitializers, dim133Linitializers, dim134Linitializers, dim135Linitializers, dim136Linitializers, dim137Linitializers, dim138Linitializers, dim139Linitializers, dim140Linitializers, dim141Linitializers, dim142Linitializers, dim143Linitializers, dim144Linitializers, dim145Linitializers, dim146Linitializers, dim147Linitializers, dim148Linitializers, dim149Linitializers, dim150Linitializers, dim151Linitializers, dim152Linitializers, dim153Linitializers, dim154Linitializers, dim155Linitializers, dim156Linitializers, dim157Linitializers, dim158Linitializers, dim159Linitializers, dim160Linitializers, dim161Linitializers, dim162Linitializers, dim163Linitializers, dim164Linitializers, dim165Linitializers, dim166Linitializers, dim167Linitializers, dim168Linitializers, dim169Linitializers, dim170Linitializers, dim171Linitializers, dim172Linitializers, dim173Linitializers, dim174Linitializers, dim175Linitializers, dim176Linitializers, dim177Linitializers, dim178Linitializers, dim179Linitializers, dim180Linitializers, dim181Linitializers, dim182Linitializers, dim183Linitializers, dim184Linitializers, dim185Linitializers, dim186Linitializers, dim187Linitializers, dim188Linitializers, dim189Linitializers, dim190Linitializers, dim191Linitializers, dim192Linitializers, dim193Linitializers, dim194Linitializers, dim195Linitializers, dim196Linitializers, dim197Linitializers, dim198Linitializers, dim199Linitializers, dim200Linitializers, dim201Linitializers, dim202Linitializers, dim203Linitializers, dim204Linitializers, dim205Linitializers, dim206Linitializers, dim207Linitializers, dim208Linitializers, dim209Linitializers, dim210Linitializers, dim211Linitializers, dim212Linitializers, dim213Linitializers, dim214Linitializers, dim215Linitializers, dim216Linitializers, dim217Linitializers, dim218Linitializers, dim219Linitializers, dim220Linitializers, dim221Linitializers, dim222Linitializers, dim223Linitializers, dim224Linitializers, dim225Linitializers, dim226Linitializers, dim227Linitializers, dim228Linitializers, dim229Linitializers, dim230Linitializers, dim231Linitializers, dim232Linitializers, dim233Linitializers, dim234Linitializers, dim235Linitializers, dim236Linitializers, dim237Linitializers, dim238Linitializers, dim239Linitializers, dim240Linitializers, dim241Linitializers, dim242Linitializers, dim243Linitializers, dim244Linitializers, dim245Linitializers, dim246Linitializers, dim247Linitializers, dim248Linitializers, dim249Linitializers, dim250Linitializers, dim251Linitializers, dim252Linitializers, dim253Linitializers, dim254Linitializers, dim255Linitializers, dim256Linitializers, dim257Linitializers, dim258Linitializers, dim259Linitializers, dim260Linitializers, dim261Linitializers, dim262Linitializers, dim263Linitializers, dim264Linitializers, dim265Linitializers, dim266Linitializers, dim267Linitializers, dim268Linitializers, dim269Linitializers, dim270Linitializers, dim271Linitializers, dim272Linitializers, dim273Linitializers, dim274Linitializers, dim275Linitializers, dim276Linitializers, dim277Linitializers, dim278Linitializers, dim279Linitializers, dim280Linitializers, dim281Linitializers, dim282Linitializers, dim283Linitializers, dim284Linitializers, dim285Linitializers, dim286Linitializers, dim287Linitializers, dim288Linitializers, dim289Linitializers, dim290Linitializers, dim291Linitializers, dim292Linitializers, dim293Linitializers, dim294Linitializers, dim295Linitializers, dim296Linitializers, dim297Linitializers, dim298Linitializers, dim299Linitializers, dim300Linitializers, dim301Linitializers, dim302Linitializers, dim303Linitializers, dim304Linitializers, dim305Linitializers, dim306Linitializers, dim307Linitializers, dim308Linitializers, dim309Linitializers, dim310Linitializers, dim311Linitializers, dim312Linitializers, dim313Linitializers, dim314Linitializers, dim315Linitializers, dim316Linitializers, dim317Linitializers, dim318Linitializers, dim319Linitializers, dim320Linitializers, dim321Linitializers, dim322Linitializers, dim323Linitializers, dim324Linitializers, dim325Linitializers, dim326Linitializers, dim327Linitializers, dim328Linitializers, dim329Linitializers, dim330Linitializers, dim331Linitializers, dim332Linitializers, dim333Linitializers, dim334Linitializers, dim335Linitializers, dim336Linitializers, dim337Linitializers, dim338Linitializers, dim339Linitializers, dim340Linitializers, dim341Linitializers, dim342Linitializers, dim343Linitializers, dim344Linitializers, dim345Linitializers, dim346Linitializers, dim347Linitializers, dim348Linitializers, dim349Linitializers, dim350Linitializers, dim351Linitializers, dim352Linitializers, dim353Linitializers, dim354Linitializers, dim355Linitializers, dim356Linitializers, dim357Linitializers, dim358Linitializers, dim359Linitializers, dim360Linitializers }; private final int sizeLinitializers = dim02SLinitializers.length + dim03SLinitializers.length + dim04SLinitializers.length + dim05SLinitializers.length + dim06SLinitializers.length + dim07SLinitializers.length + dim08SLinitializers.length + dim09SLinitializers.length + dim10SLinitializers.length + dim11SLinitializers.length + dim12SLinitializers.length + dim13SLinitializers.length + dim14SLinitializers.length + dim15SLinitializers.length + dim16SLinitializers.length + dim17SLinitializers.length + dim18SLinitializers.length + dim19SLinitializers.length + dim20SLinitializers.length + dim21SLinitializers.length + dim22SLinitializers.length + dim23SLinitializers.length + dim24SLinitializers.length + dim25SLinitializers.length + dim26SLinitializers.length + dim27SLinitializers.length + dim28SLinitializers.length + dim29SLinitializers.length + dim30SLinitializers.length + dim31SLinitializers.length + dim32SLinitializers.length + dim33SLinitializers.length + dim34SLinitializers.length + dim35SLinitializers.length + dim36SLinitializers.length + dim37SLinitializers.length + dim38SLinitializers.length + dim39SLinitializers.length + dim40SLinitializers.length + dim041Linitializers.length + dim042Linitializers.length + dim043Linitializers.length + dim044Linitializers.length + dim045Linitializers.length + dim046Linitializers.length + dim047Linitializers.length + dim048Linitializers.length + dim049Linitializers.length + dim050Linitializers.length + dim051Linitializers.length + dim052Linitializers.length + dim053Linitializers.length + dim054Linitializers.length + dim055Linitializers.length + dim056Linitializers.length + dim057Linitializers.length + dim058Linitializers.length + dim059Linitializers.length + dim060Linitializers.length + dim061Linitializers.length + dim062Linitializers.length + dim063Linitializers.length + dim064Linitializers.length + dim065Linitializers.length + dim066Linitializers.length + dim067Linitializers.length + dim068Linitializers.length + dim069Linitializers.length + dim070Linitializers.length + dim071Linitializers.length + dim072Linitializers.length + dim073Linitializers.length + dim074Linitializers.length + dim075Linitializers.length + dim076Linitializers.length + dim077Linitializers.length + dim078Linitializers.length + dim079Linitializers.length + dim080Linitializers.length + dim081Linitializers.length + dim082Linitializers.length + dim083Linitializers.length + dim084Linitializers.length + dim085Linitializers.length + dim086Linitializers.length + dim087Linitializers.length + dim088Linitializers.length + dim089Linitializers.length + dim090Linitializers.length + dim091Linitializers.length + dim092Linitializers.length + dim093Linitializers.length + dim094Linitializers.length + dim095Linitializers.length + dim096Linitializers.length + dim097Linitializers.length + dim098Linitializers.length + dim099Linitializers.length + dim100Linitializers.length + dim101Linitializers.length + dim102Linitializers.length + dim103Linitializers.length + dim104Linitializers.length + dim105Linitializers.length + dim106Linitializers.length + dim107Linitializers.length + dim108Linitializers.length + dim109Linitializers.length + dim110Linitializers.length + dim111Linitializers.length + dim112Linitializers.length + dim113Linitializers.length + dim114Linitializers.length + dim115Linitializers.length + dim116Linitializers.length + dim117Linitializers.length + dim118Linitializers.length + dim119Linitializers.length + dim120Linitializers.length + dim121Linitializers.length + dim122Linitializers.length + dim123Linitializers.length + dim124Linitializers.length + dim125Linitializers.length + dim126Linitializers.length + dim127Linitializers.length + dim128Linitializers.length + dim129Linitializers.length + dim130Linitializers.length + dim131Linitializers.length + dim132Linitializers.length + dim133Linitializers.length + dim134Linitializers.length + dim135Linitializers.length + dim136Linitializers.length + dim137Linitializers.length + dim138Linitializers.length + dim139Linitializers.length + dim140Linitializers.length + dim141Linitializers.length + dim142Linitializers.length + dim143Linitializers.length + dim144Linitializers.length + dim145Linitializers.length + dim146Linitializers.length + dim147Linitializers.length + dim148Linitializers.length + dim149Linitializers.length + dim150Linitializers.length + dim151Linitializers.length + dim152Linitializers.length + dim153Linitializers.length + dim154Linitializers.length + dim155Linitializers.length + dim156Linitializers.length + dim157Linitializers.length + dim158Linitializers.length + dim159Linitializers.length + dim160Linitializers.length + dim161Linitializers.length + dim162Linitializers.length + dim163Linitializers.length + dim164Linitializers.length + dim165Linitializers.length + dim166Linitializers.length + dim167Linitializers.length + dim168Linitializers.length + dim169Linitializers.length + dim170Linitializers.length + dim171Linitializers.length + dim172Linitializers.length + dim173Linitializers.length + dim174Linitializers.length + dim175Linitializers.length + dim176Linitializers.length + dim177Linitializers.length + dim178Linitializers.length + dim179Linitializers.length + dim180Linitializers.length + dim181Linitializers.length + dim182Linitializers.length + dim183Linitializers.length + dim184Linitializers.length + dim185Linitializers.length + dim186Linitializers.length + dim187Linitializers.length + dim188Linitializers.length + dim189Linitializers.length + dim190Linitializers.length + dim191Linitializers.length + dim192Linitializers.length + dim193Linitializers.length + dim194Linitializers.length + dim195Linitializers.length + dim196Linitializers.length + dim197Linitializers.length + dim198Linitializers.length + dim199Linitializers.length + dim200Linitializers.length + dim201Linitializers.length + dim202Linitializers.length + dim203Linitializers.length + dim204Linitializers.length + dim205Linitializers.length + dim206Linitializers.length + dim207Linitializers.length + dim208Linitializers.length + dim209Linitializers.length + dim210Linitializers.length + dim211Linitializers.length + dim212Linitializers.length + dim213Linitializers.length + dim214Linitializers.length + dim215Linitializers.length + dim216Linitializers.length + dim217Linitializers.length + dim218Linitializers.length + dim219Linitializers.length + dim220Linitializers.length + dim221Linitializers.length + dim222Linitializers.length + dim223Linitializers.length + dim224Linitializers.length + dim225Linitializers.length + dim226Linitializers.length + dim227Linitializers.length + dim228Linitializers.length + dim229Linitializers.length + dim230Linitializers.length + dim231Linitializers.length + dim232Linitializers.length + dim233Linitializers.length + dim234Linitializers.length + dim235Linitializers.length + dim236Linitializers.length + dim237Linitializers.length + dim238Linitializers.length + dim239Linitializers.length + dim240Linitializers.length + dim241Linitializers.length + dim242Linitializers.length + dim243Linitializers.length + dim244Linitializers.length + dim245Linitializers.length + dim246Linitializers.length + dim247Linitializers.length + dim248Linitializers.length + dim249Linitializers.length + dim250Linitializers.length + dim251Linitializers.length + dim252Linitializers.length + dim253Linitializers.length + dim254Linitializers.length + dim255Linitializers.length + dim256Linitializers.length + dim257Linitializers.length + dim258Linitializers.length + dim259Linitializers.length + dim260Linitializers.length + dim261Linitializers.length + dim262Linitializers.length + dim263Linitializers.length + dim264Linitializers.length + dim265Linitializers.length + dim266Linitializers.length + dim267Linitializers.length + dim268Linitializers.length + dim269Linitializers.length + dim270Linitializers.length + dim271Linitializers.length + dim272Linitializers.length + dim273Linitializers.length + dim274Linitializers.length + dim275Linitializers.length + dim276Linitializers.length + dim277Linitializers.length + dim278Linitializers.length + dim279Linitializers.length + dim280Linitializers.length + dim281Linitializers.length + dim282Linitializers.length + dim283Linitializers.length + dim284Linitializers.length + dim285Linitializers.length + dim286Linitializers.length + dim287Linitializers.length + dim288Linitializers.length + dim289Linitializers.length + dim290Linitializers.length + dim291Linitializers.length + dim292Linitializers.length + dim293Linitializers.length + dim294Linitializers.length + dim295Linitializers.length + dim296Linitializers.length + dim297Linitializers.length + dim298Linitializers.length + dim299Linitializers.length + dim300Linitializers.length + dim301Linitializers.length + dim302Linitializers.length + dim303Linitializers.length + dim304Linitializers.length + dim305Linitializers.length + dim306Linitializers.length + dim307Linitializers.length + dim308Linitializers.length + dim309Linitializers.length + dim310Linitializers.length + dim311Linitializers.length + dim312Linitializers.length + dim313Linitializers.length + dim314Linitializers.length + dim315Linitializers.length + dim316Linitializers.length + dim317Linitializers.length + dim318Linitializers.length + dim319Linitializers.length + dim320Linitializers.length + dim321Linitializers.length + dim322Linitializers.length + dim323Linitializers.length + dim324Linitializers.length + dim325Linitializers.length + dim326Linitializers.length + dim327Linitializers.length + dim328Linitializers.length + dim329Linitializers.length + dim330Linitializers.length + dim331Linitializers.length + dim332Linitializers.length + dim333Linitializers.length + dim334Linitializers.length + dim335Linitializers.length + dim336Linitializers.length + dim337Linitializers.length + dim338Linitializers.length + dim339Linitializers.length + dim340Linitializers.length + dim341Linitializers.length + dim342Linitializers.length + dim343Linitializers.length + dim344Linitializers.length + dim345Linitializers.length + dim346Linitializers.length + dim347Linitializers.length + dim348Linitializers.length + dim349Linitializers.length + dim350Linitializers.length + dim351Linitializers.length + dim352Linitializers.length + dim353Linitializers.length + dim354Linitializers.length + dim355Linitializers.length + dim356Linitializers.length + dim357Linitializers.length + dim358Linitializers.length + dim359Linitializers.length + dim360Linitializers.length; // // public enums // public enum DirectionIntegers { Unit, Jaeckel, SobolLevitan, SobolLevitanLemieux } // // constants // /** * BITS = 8*sizeof(unsigned long) = 64 */ private static final int BITS = 64; /** * 1/(2^bits_) (written as (1/2)/(2^(bits_-1)) to avoid long overflow) */ private static final double NORMALIZATION_FACTOR = 0.5 / (1 << (BITS-1)); // // private fields // private final /*@Size*/ int dimensionality; private final long[] integerSequence; private final long[][] directionIntegers; private Sample sequence; private long sequenceCounter; private boolean firstDraw; // // public constructors // /** * dimensionality must be <= PPMT_MAX_DIM */ public SobolRsg(final int dimensionality) { this(dimensionality, 0); } public SobolRsg(final int dimensionality, final long seed) { this(dimensionality, seed, DirectionIntegers.Jaeckel); } public SobolRsg(final int dimensionality, final long seed, final DirectionIntegers direction) { if (System.getProperty("EXPERIMENTAL")==null) { throw new UnsupportedOperationException("Work in progress"); } QL.require(dimensionality > 0 , "dimensionality must be greater than 0"); // TODO: message // In QuantLib/C++ PrimitivePolinomials is initialized in a template given its maximum dimensionality // defined via macros. In Java we allocate at runtime. final PrimitivePolynomials pp = new PrimitivePolynomials(); QL.require(dimensionality <= pp.getPpmtMaxDim() , "dimensionality exceeds available primitive polynomials module two"); // TODO: message this.dimensionality = dimensionality; this.sequenceCounter = 0; this.firstDraw = true; this.directionIntegers = new long[this.dimensionality][BITS]; this.integerSequence = new long[this.dimensionality]; // initializes coefficient array of the k-th primitive polynomial // and degree of the k-th primitive polynomial final long[] degree = new long[this.dimensionality]; final long[] ppmt = new long[this.dimensionality]; // degree 0 is not used ppmt[0]=0; degree[0]=0; for (int k=1, index=0, currentDegree=1; k < this.dimensionality; k++, index++) { ppmt[k] = pp.get(currentDegree - 1, index); if (ppmt[k] == -1) { ++currentDegree; index = 0; ppmt[k] = pp.get(currentDegree - 1, index); } degree[k] = currentDegree; } // initializes bits_ direction integers for each dimension // and store them into directionIntegers_[dimensionality_][bits_] // // In each dimension k with its associated primitive polynomial, // the first degree_[k] direction integers can be chosen freely // provided that only the l leftmost bits can be non-zero, and // that the l-th leftmost bit must be set // degenerate (no free direction integers) first dimension for (int j=0; j < BITS; j++) { directionIntegers[0][j] = (1 << (BITS-j-1)); } int maxTabulated = 0; // dimensions from 2 (k=1) to maxTabulated (k=maxTabulated-1) included // are initialized from tabulated coefficients switch (direction) { case Unit: maxTabulated = this.dimensionality; for (int k = 1; k < maxTabulated; k++) { for (int l = 1; l <= degree[k]; l++) { // FIXME: Translate these two lines // TODO: Code Review is this correct. directionIntegers[k][l-1] = 1L; directionIntegers[k][l-1] <<= (BITS-l); } } break; case Jaeckel: // maxTabulated = 32; maxTabulated = sizeInitializers/(Long.SIZE/8) + 1; for (int k = 1; k < Math.min(this.dimensionality, maxTabulated); k++) { int j = 0; // 0UL marks coefficients' end for a given dimension while (initializers[k-1][j] != 0) { // FIXME: Translate these two lines directionIntegers[k][j] = initializers[k-1][j]; directionIntegers[k][j] <<= (BITS-j-1); j++; } } break; case SobolLevitan: // maxTabulated = 40; maxTabulated = sizeSLinitializers/(Long.SIZE/8) + 1; for (int k = 1; k < Math.min(this.dimensionality, maxTabulated); k++) { int j = 0; // 0UL marks coefficients' end for a given dimension while (SLinitializers[k - 1][j] != 0) { // FIXME: Translate these two lines directionIntegers[k][j] = SLinitializers[k - 1][j]; directionIntegers[k][j] <<= (BITS - j - 1); j++; } } break; case SobolLevitanLemieux: maxTabulated = 360; maxTabulated = sizeLinitializers/(Long.SIZE/8) + 1; for (int k = 1; k < Math.min(this.dimensionality, maxTabulated); k++) { int j = 0; // 0UL marks coefficients' end for a given dimension while (Linitializers[k - 1][j] != 0L) { // FIXME: Translate these two lines directionIntegers[k][j] = Linitializers[k - 1][j]; directionIntegers[k][j] <<= (BITS - j - 1); j++; } } break; default: break; } // random initialization for higher dimensions // FIXME: Check maxTabulated below: How is it initialized? if (this.dimensionality > maxTabulated) { final MersenneTwisterUniformRng uniformRng = new MersenneTwisterUniformRng(seed); for (int k = maxTabulated; k < this.dimensionality; k++) { for (int l = 1; l <= degree[k]; l++) { do { // u is in (0,1) final double u = uniformRng.next().value().doubleValue(); // the direction integer has at most the // rightmost l bits non-zero // FIXME: Translate this line directionIntegers[k][l - 1] = (long) (u * (1 << l)); } while (!((directionIntegers[k][l - 1] & 1) == 0)); // iterate until the direction integer is odd // that is it has the rightmost bit set // shifting bits_-l bits to the left // we are guaranteed that the l-th leftmost bit // is set, and only the first l leftmost bit // can be non-zero // FIXME: Translate this line directionIntegers[k][l - 1] <<= (BITS - l); } } } // computation of directionIntegers_[k][l] for l>=degree_[k] // by recurrence relation for (int k = 1; k < this.dimensionality; k++) { final int gk = (int) degree[k]; for (int l = gk; l < BITS; l++) { // eq. 8.19 "Monte Carlo Methods in Finance" by P. Jaeckel long n = (directionIntegers[k][l-gk] >> gk); // FIXME: unsigned long // a[k][j] are the coefficients of the monomials in ppmt[k] // The highest order coefficient a[k][0] is not actually // used in the recurrence relation, and the lowest order // coefficient a[k][gk] is always set: this is the reason // why the highest and lowest coefficient of // the polynomial ppmt[k] are not included in its encoding, // provided that its degree is known. // That is: a[k][j] = ppmt[k] >> (gk-j-1) for (int j = 1; j < gk; j++) { // FIXME: Correct this line if ((ppmt.get(k) >>> (gk-j-1)) & 1 != 0) // TODO: REVIEW THIS. if (((ppmt[k] >> (gk - j - 1)) & 1L) != 0) { n ^= directionIntegers[k][l - j]; } } // a[k][gk] is always set, so directionIntegers_[k][l-gk] // will always enter // FIXME: Correct these two lines regarding directionIntegers_ n ^= directionIntegers[k][l - gk]; directionIntegers[k][l] = n; } } // // in case one needs to check the directionIntegers used // boolean printDirectionIntegers = false; // // if (printDirectionIntegers) { // FileOutputStream fos = null; // try { // fos = new FileOutputStream("directionIntegers.txt"); // PrintWriter pw = new PrintWriter(fos); // // for (int k=0; k>1); // FIXME: Correct the following for loop regarding directionIntegers_ . for (int k = 0; k < this.dimensionality; k++) { integerSequence[k] = 0; for (int index = 0; index < ops; index++) { if (((gray >> index) & 1) != 0) { integerSequence[k] = directionIntegers[k][index]; } } } sequenceCounter = skip; } // // implements UniformRandomSequenceGenerator // @Override public int dimension() /* @Read-only */ { return this.dimensionality; } @Override public final long[] nextInt32Sequence() /* @ReadOnly */ { if (firstDraw) { // it was precomputed in the constructor firstDraw = false; return integerSequence; } // increment the counter sequenceCounter++; // did we overflow? if (sequenceCounter == 0) { throw new ArithmeticException("period exceeded"); // TODO: message } // Instead of using the counter n as new unique generating integer // for the n-th draw use the Gray code G(n) as proposed // by Antonov and Saleev long n = sequenceCounter; // Find rightmost zero bit of n int j = 0; while ((n & 1) != 0) { n >>= 1; j++; } for (int k = 0; k < this.dimensionality; k++) { // XOR the appropriate direction number into each component of // the integer sequence to obtain a new Sobol integer for that // component integerSequence[k] ^= directionIntegers[k][j]; } return integerSequence; } @Override public final Sample nextSequence() /* @ReadOnly */ { final long[] v = nextInt32Sequence(); final double[] d = new double[this.dimensionality]; // normalize to get a double in (0,1) for (int k = 0; k < this.dimensionality; ++k) { d[k] = v[k] * NORMALIZATION_FACTOR; } this.sequence = new Sample(d, 1.0); return sequence; } @Override public final Sample lastSequence() /* @Read-only*/ { return sequence; } }

Ads help maintain this website.