UNPKG

sobol

Version:

Sobol quasi random sample generator

64 lines (60 loc) 10.5 kB
"use strict";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==