sobol
Version:
Sobol quasi random sample generator
64 lines (60 loc) • 10.5 kB
JavaScript
;Object.defineProperty(exports, "__esModule", { value: true });exports.SobolSequenceGenerator = void 0;
var _fs = _interopRequireDefault(require("fs"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { "default": obj };}function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}function _createClass(Constructor, protoProps, staticProps) {if (protoProps) _defineProperties(Constructor.prototype, protoProps);if (staticProps) _defineProperties(Constructor, staticProps);return Constructor;}
var BITS = 52;
var SCALE = 2 << 51;
var MAX_DIMENSION = 21201;
var file161 = __dirname + "/dims161.txt";
var file21201 = __dirname + "/dims21201.txt";var
SobolSequenceGenerator = /*#__PURE__*/function () {
function SobolSequenceGenerator(dim) {_classCallCheck(this, SobolSequenceGenerator);
if (dim < 1 || dim > MAX_DIMENSION) throw new Error("Out of range dimension");
this.dimension = dim;
this.count = 0;
var direction = this.direction = []; /*of []*/
this.x = [];
this.zero = [];
var tmp = [];
for (var i = 0; i <= BITS; i++) {tmp.push(0);}
for (var i = 0; i < dim; i++) {
direction[i] = tmp.slice();
this.x[i] = 0;
this.zero[i] = 0;
}
var data = _fs["default"].readFileSync(dim <= 161 ? file161 : file21201);
var lines = ("" + data).split("\n");
for (var i = 1; i <= BITS; i++) {direction[0][i] = 1 << BITS - i;}
for (var d = 1; d < dim; d++) {
var cells = lines[d].split(/\s+/).map(function (str) {
return parseInt(str, 10);
});
var s = cells[1];
var a = cells[2];
var m = [0];
for (var i = 0; i < s; i++) {m.push(cells[3 + i]);}
for (var i = 1; i <= s; i++) {direction[d][i] = m[i] << BITS - i;}
for (var i = s + 1; i <= BITS; i++) {
direction[d][i] = direction[d][i - s] ^ direction[d][i - s] >> s;
for (var k = 1; k <= s - 1; k++) {direction[d][i] ^= (a >> s - 1 - k & 1) * direction[d][i - k];}
}
}
}_createClass(SobolSequenceGenerator, [{ key: "nextVector", value: function nextVector()
{
var v = [];
if (this.count == 0) {
this.count++;
return this.zero.slice();
}
var c = 1;
var value = this.count - 1;
while ((value & 1) == 1) {
value >>= 1;
c++;
}
for (var i = 0; i < this.dimension; i++) {
this.x[i] ^= this.direction[i][c];
v[i] = this.x[i] / SCALE;
}
this.count++;
return v;
} }]);return SobolSequenceGenerator;}();exports.SobolSequenceGenerator = SobolSequenceGenerator;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zb2JvbC5qcyJdLCJuYW1lcyI6WyJCSVRTIiwiU0NBTEUiLCJNQVhfRElNRU5TSU9OIiwiZmlsZTE2MSIsIl9fZGlybmFtZSIsImZpbGUyMTIwMSIsIlNvYm9sU2VxdWVuY2VHZW5lcmF0b3IiLCJkaW0iLCJFcnJvciIsImRpbWVuc2lvbiIsImNvdW50IiwiZGlyZWN0aW9uIiwieCIsInplcm8iLCJ0bXAiLCJpIiwicHVzaCIsInNsaWNlIiwiZGF0YSIsImZzIiwicmVhZEZpbGVTeW5jIiwibGluZXMiLCJzcGxpdCIsImQiLCJjZWxscyIsIm1hcCIsInN0ciIsInBhcnNlSW50IiwicyIsImEiLCJtIiwiayIsInYiLCJjIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7O0FBRUEsZ0Q7O0FBRUEsSUFBSUEsSUFBSSxHQUFHLEVBQVg7QUFDQSxJQUFJQyxLQUFLLEdBQUcsS0FBSyxFQUFqQjtBQUNBLElBQUlDLGFBQWEsR0FBRyxLQUFwQjtBQUNBLElBQUlDLE9BQU8sR0FBR0MsU0FBUyxHQUFHLGNBQTFCO0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxTQUFTLEdBQUcsZ0JBQTVCLEM7O0FBRWFFLHNCO0FBQ1Qsa0NBQVlDLEdBQVosRUFBaUI7QUFDYixRQUFJQSxHQUFHLEdBQUcsQ0FBTixJQUFXQSxHQUFHLEdBQUdMLGFBQXJCLEVBQW9DLE1BQU0sSUFBSU0sS0FBSixDQUFVLHdCQUFWLENBQU47QUFDcEMsU0FBS0MsU0FBTCxHQUFpQkYsR0FBakI7QUFDQSxTQUFLRyxLQUFMLEdBQWEsQ0FBYjtBQUNBLFFBQUlDLFNBQVMsR0FBSSxLQUFLQSxTQUFMLEdBQWlCLEVBQWxDLENBSmEsQ0FJMEI7QUFDdkMsU0FBS0MsQ0FBTCxHQUFTLEVBQVQ7QUFDQSxTQUFLQyxJQUFMLEdBQVksRUFBWjtBQUNBLFFBQUlDLEdBQUcsR0FBRyxFQUFWO0FBQ0EsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxJQUFJZixJQUFyQixFQUEyQmUsQ0FBQyxF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QWxCLEVBQXFCO0FBQ2pCLGFBQUtBLEtBQUw7QUFDQSxlQUFPLEtBQUtHLElBQUwsQ0FBVUksS0FBVixFQUFQO0FBQ0g7QUFDRCxVQUFJZ0IsQ0FBQyxHQUFHLENBQVI7QUFDQSxVQUFJQyxLQUFLLEdBQUcsS0FBS3hCLEtBQUwsR0FBYSxDQUF6QjtBQUNBLGFBQU8sQ0FBQ3dCLEtBQUssR0FBRyxDQUFULEtBQWUsQ0FBdEIsRUFBeUI7QUFDckJBLFFBQUFBLEtBQUssS0FBSyxDQUFWO0FBQ0FELFFBQUFBLENBQUM7QUFDSjtBQUNELFdBQUssSUFBSWxCLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBS04sU0FBekIsRUFBb0NNLENBQUMsRUFBckMsRUFBeUM7QUFDckMsYUFBS0gsQ0FBTCxDQUFPRyxDQUFQLEtBQWEsS0FBS0osU0FBTCxDQUFlSSxDQUFmLEVBQWtCa0IsQ0FBbEIsQ0FBYjtBQUNBRCxRQUFBQSxDQUFDLENBQUNqQixDQUFELENBQUQsR0FBTyxLQUFLSCxDQUFMLENBQU9HLENBQVAsSUFBWWQsS0FBbkI7QUFDSDtBQUNELFdBQUtTLEtBQUw7QUFDQSxhQUFPc0IsQ0FBUDtBQUNILEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGFua3MgdG8gaHR0cHM6Ly9naXRodWIuY29tL2Nyb3F1ZWxvaXMvc29ib2xcclxuXHJcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcclxuXHJcbnZhciBCSVRTID0gNTI7XHJcbnZhciBTQ0FMRSA9IDIgPDwgNTE7XHJcbnZhciBNQVhfRElNRU5TSU9OID0gMjEyMDE7XHJcbnZhciBmaWxlMTYxID0gX19kaXJuYW1lICsgXCIvZGltczE2MS50eHRcIjtcclxudmFyIGZpbGUyMTIwMSA9IF9fZGlybmFtZSArIFwiL2RpbXMyMTIwMS50eHRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTb2JvbFNlcXVlbmNlR2VuZXJhdG9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGRpbSkge1xyXG4gICAgICAgIGlmIChkaW0gPCAxIHx8IGRpbSA+IE1BWF9ESU1FTlNJT04pIHRocm93IG5ldyBFcnJvcihcIk91dCBvZiByYW5nZSBkaW1lbnNpb25cIik7XHJcbiAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBkaW07XHJcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9ICh0aGlzLmRpcmVjdGlvbiA9IFtdKTsgLypvZiBbXSovXHJcbiAgICAgICAgdGhpcy54ID0gW107XHJcbiAgICAgICAgdGhpcy56ZXJvID0gW107XHJcbiAgICAgICAgdmFyIHRtcCA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IEJJVFM7IGkrKykgdG1wLnB1c2goMCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW07IGkrKykge1xyXG4gICAgICAgICAgICBkaXJlY3Rpb25baV0gPSB0bXAuc2xpY2UoKTtcclxuICAgICAgICAgICAgdGhpcy54W2ldID0gMDtcclxuICAgICAgICAgICAgdGhpcy56ZXJvW2ldID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMoZGltIDw9IDE2MSA/IGZpbGUxNjEgOiBmaWxlMjEyMDEpO1xyXG4gICAgICAgIHZhciBsaW5lcyA9IChcIlwiICsgZGF0YSkuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IEJJVFM7IGkrKykgZGlyZWN0aW9uWzBdW2ldID0gMSA8PCAoQklUUyAtIGkpO1xyXG4gICAgICAgIGZvciAodmFyIGQgPSAxOyBkIDwgZGltOyBkKyspIHtcclxuICAgICAgICAgICAgdmFyIGNlbGxzID0gbGluZXNbZF0uc3BsaXQoL1xccysvKS5tYXAoZnVuY3Rpb24oc3RyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoc3RyLCAxMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgcyA9IGNlbGxzWzFdO1xyXG4gICAgICAgICAgICB2YXIgYSA9IGNlbGxzWzJdO1xyXG4gICAgICAgICAgICB2YXIgbSA9IFswXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIG0ucHVzaChjZWxsc1szICsgaV0pO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBzOyBpKyspIGRpcmVjdGlvbltkXVtpXSA9IG1baV0gPDwgKEJJVFMgLSBpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHMgKyAxOyBpIDw9IEJJVFM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uW2RdW2ldID0gZGlyZWN0aW9uW2RdW2kgLSBzXSBeIChkaXJlY3Rpb25bZF1baSAtIHNdID4+IHMpO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDE7IGsgPD0gcyAtIDE7IGsrKykgZGlyZWN0aW9uW2RdW2ldIF49ICgoYSA+PiAocyAtIDEgLSBrKSkgJiAxKSAqIGRpcmVjdGlvbltkXVtpIC0ga107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBuZXh0VmVjdG9yKCkge1xyXG4gICAgICAgIHZhciB2ID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuY291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnplcm8uc2xpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGMgPSAxO1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuY291bnQgLSAxO1xyXG4gICAgICAgIHdoaWxlICgodmFsdWUgJiAxKSA9PSAxKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID4+PSAxO1xyXG4gICAgICAgICAgICBjKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaW1lbnNpb247IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnhbaV0gXj0gdGhpcy5kaXJlY3Rpb25baV1bY107XHJcbiAgICAgICAgICAgIHZbaV0gPSB0aGlzLnhbaV0gLyBTQ0FMRTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==