@zfunction/genetics-js
Version:
Genetic and evolutionary algorithms framework for the web
78 lines • 3.89 kB
JavaScript
;
/*
* @license
* Copyright (c) 2019 Cristian Abrante. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*/
Object.defineProperty(exports, "__esModule", { value: true });
// TODO: Better gaussian generator.
var random_js_1 = require("random-js");
var ts_gaussian_1 = require("ts-gaussian");
var base_1 = require("../../individual/numeric/base");
var utils_1 = require("../../individual/numeric/integer/utils");
var Generator = /** @class */ (function () {
function Generator() {
}
Generator.probabilityIsValid = function (probability) {
return probability >= 0.0 && probability <= 1.0;
};
Generator.generateProbability = function (engine) {
if (engine === void 0) { engine = Generator.DEFAULT_ENGINE; }
return this.generateFloating(new base_1.NumericRange(0.0, 1.0), engine);
};
Generator.generateBoolean = function (chance, engine) {
if (chance === void 0) { chance = 0.5; }
if (engine === void 0) { engine = Generator.DEFAULT_ENGINE; }
this.checkProbability(chance);
return random_js_1.bool(chance)(engine);
};
Generator.generateInteger = function (range, engine) {
if (range === void 0) { range = base_1.NumericRange.DEFAULT; }
if (engine === void 0) { engine = Generator.DEFAULT_ENGINE; }
var normalizedRange = this.normalizeIntegerRange(range);
return random_js_1.integer(normalizedRange.lowest, normalizedRange.highest)(engine);
};
Generator.generateFloating = function (range, engine) {
if (range === void 0) { range = base_1.NumericRange.DEFAULT; }
if (engine === void 0) { engine = Generator.DEFAULT_ENGINE; }
return random_js_1.real(range.lowest, range.highest, true)(engine);
};
Generator.generateNormalDistributionValue = function (mean, stdVar, engine) {
if (mean === void 0) { mean = 0.0; }
if (stdVar === void 0) { stdVar = 1.0; }
if (engine === void 0) { engine = Generator.DEFAULT_ENGINE; }
var dist = new ts_gaussian_1.Gaussian(mean, stdVar);
return dist.ppf(this.generateProbability(engine));
};
Generator.generateNormalDistributionInteger = function (mean, stdVar, engine) {
if (mean === void 0) { mean = 0; }
if (stdVar === void 0) { stdVar = 1; }
if (engine === void 0) { engine = Generator.DEFAULT_ENGINE; }
return utils_1.IntegerNormalizer.normalize(this.generateNormalDistributionValue(mean, stdVar, engine));
};
/**
* This method is used due to an issue with
* `random-js`. It does not accept `Number.Infinity` as
* the lowest or highest number, instead it expects
* `2 ** 53` as it maximum or `-2 ** 53` as its minimum.
* So the range must be normalized.
* @param range that we want to normalize.
* @return normalized range.
*/
Generator.normalizeIntegerRange = function (range) {
var randomJSMax = Math.pow(2, 53);
var randomJSMin = -randomJSMax;
var lowest = range.lowest === base_1.NumericRange.DEFAULT.lowest ? randomJSMin : utils_1.IntegerNormalizer.normalize(range.lowest);
var highest = range.highest === base_1.NumericRange.DEFAULT.highest ? randomJSMax : utils_1.IntegerNormalizer.normalize(range.highest);
return new base_1.NumericRange(lowest, highest);
};
Generator.checkProbability = function (probability) {
if (!this.probabilityIsValid(probability)) {
throw new Error("Error: probability " + probability + " is not in range [0.0, 1.0].");
}
};
Generator.DEFAULT_ENGINE = random_js_1.MersenneTwister19937.autoSeed();
return Generator;
}());
exports.Generator = Generator;
//# sourceMappingURL=Generator.js.map