UNPKG

@zfunction/genetics-js

Version:

Genetic and evolutionary algorithms framework for the web

78 lines 3.89 kB
"use strict"; /* * @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