UNPKG

enome

Version:

A genome generation and evolution library.

141 lines 13.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var rxjs_1 = require("rxjs"); var index_1 = require("../index"); var _ = require("lodash"); var Simulation = (function () { function Simulation(population, environment) { this.population = population; this.environment = environment; this.top = new index_1.ReactiveCollection(); this.avgFitness = new index_1.ReactiveProperty(); this.newOrganisms = new rxjs_1.ReplaySubject(1); this.organisms = new index_1.ReactiveCollection(); this.progress = new index_1.ReactiveProperty(0); this._best = new index_1.ReactiveProperty(); this.subs = new rxjs_1.Subscription(); } Object.defineProperty(Simulation.prototype, "best", { get: function () { return this._best .asObservable() .filter(function (b) { return b !== undefined && b != null; }) .observeOn(rxjs_1.Scheduler.asap) .subscribeOn(rxjs_1.Scheduler.asap); }, enumerable: true, configurable: true }); Simulation.prototype.start = function () { this.subs = new rxjs_1.Subscription() .add(this.removeDeadOrganisms()) .add(this.introduceOrganisms()) .add(this.updateAvgFitness()) .add(this.updateTop()) .add(this.updateBest()) .add(this.logProgress()) .add(this.population.populate(this.newOrganisms, this.top, this.avgFitness, this.progress)); return this; }; Simulation.prototype.stop = function () { this.subs.unsubscribe(); }; Simulation.prototype.updateBest = function () { var _this = this; var update = this.population.evaluations .filter(function (e) { return e != null && e !== undefined; }) .observeOn(rxjs_1.Scheduler.asap) .subscribeOn(rxjs_1.Scheduler.asap) .subscribe(function (evaluation) { if (_this._best.value === undefined || _this._best.value == null) { _this._best.value = evaluation; } switch (_this.population.popOptions.objective) { case index_1.FitnessObjective.minimize: if (evaluation.fitness < _this._best.value.fitness) { _this._best.value = evaluation; } break; case index_1.FitnessObjective.maximize: if (evaluation.fitness > _this._best.value.fitness) { _this._best.value = evaluation; } break; } }, function (error) { return console.log("error from simulation.updateBest: " + error); }, function () { return console.log('simulation complete'); }); return update; }; Simulation.prototype.updateTop = function () { var _this = this; var update = this.population.evaluations .filter(function (e) { return e != null && e !== undefined; }) .observeOn(rxjs_1.Scheduler.asap) .subscribeOn(rxjs_1.Scheduler.asap) .subscribe(function (e) { var top = _this.top.value; var percent = _this.population.popOptions.topPercent || 0.25; top.push(e); var sorted = _.sortBy(top, function (t) { return t.fitness; }); var taken = _.take(sorted, _this.population.popOptions.size * percent); _this.top.value = taken; }, function (error) { return console.log("error from simulation.updateTop: " + error); }); return update; }; Simulation.prototype.updateAvgFitness = function () { var _this = this; var update = this.population.evaluations .filter(function (e) { return e != null && e !== undefined; }) .observeOn(rxjs_1.Scheduler.asap) .subscribeOn(rxjs_1.Scheduler.asap) .subscribe(function (e) { _this.avgFitness.value = (_this.avgFitness.value + e.fitness) / 2; }, function (error) { return console.log("error from simulation.updateAvgFitness: " + error); }); return update; }; Simulation.prototype.introduceOrganisms = function () { var _this = this; var intro = this.newOrganisms .observeOn(rxjs_1.Scheduler.asap) .subscribeOn(rxjs_1.Scheduler.asap) .subscribe(function (org) { _this.subs.add(org.interactWithEnvironment(_this.environment)); _this.subs.add(org.evaluation(_this.environment, _this.population.evaluations)); _this.organisms.push(org); }, function (error) { return console.log("error from simulation.introduceOrganism: " + error); }); return intro; }; Simulation.prototype.removeDeadOrganisms = function () { var _this = this; var remove = this.organisms.subscribeToPush(function (o) { o.alive .filter(function (alive) { return !alive; }) .subscribe(function (alive) { _this.organisms.remove(o); }); }); return remove; }; Simulation.prototype.logProgress = function () { var _this = this; if (this.population.popOptions.logProgress) { return this.progress .filter(function (p) { return _this._best.value !== null && _this._best.value !== undefined; }) .subscribe(function (p) { if (_this.progress.value % _this.population.popOptions.logInterval === 0) { console.log("\n Generation: " + _this.population.generation + "/" + _this.population.popOptions .generations + " (" + _.round(_this.progress.value) + "%)\n Current Best - id: " + _this._best.value.genotype.id + ", fitness: " + _this._best .value.fitness + "\n "); } }); } else { return null; } }; return Simulation; }()); exports.Simulation = Simulation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaW11bGF0aW9uL3NpbXVsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFNYztBQUNkLGtDQVVrQjtBQUdsQiwwQkFBNEI7QUFFNUI7SUFrQ0Usb0JBQ1MsVUFBa0UsRUFDbEUsV0FBNkM7UUFEN0MsZUFBVSxHQUFWLFVBQVUsQ0FBd0Q7UUFDbEUsZ0JBQVcsR0FBWCxXQUFXLENBQWtDO1FBM0IvQyxRQUFHLEdBRU4sSUFBSSwwQkFBa0IsRUFBRSxDQUFDO1FBRXRCLGVBQVUsR0FBNkIsSUFBSSx3QkFBZ0IsRUFBRSxDQUFDO1FBRTlELGlCQUFZLEdBRWYsSUFBSSxvQkFBYSxDQUNuQixDQUFDLENBQ0YsQ0FBQztRQUVLLGNBQVMsR0FFWixJQUFJLDBCQUFrQixFQUFFLENBQUM7UUFFdEIsYUFBUSxHQUE2QixJQUFJLHdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRzVELFVBQUssR0FFVCxJQUFJLHdCQUFnQixFQUFFLENBQUM7UUFFbkIsU0FBSSxHQUFpQixJQUFJLG1CQUFZLEVBQUUsQ0FBQztJQUs3QyxDQUFDO0lBRUosc0JBQVcsNEJBQUk7YUFBZjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSztpQkFDZCxZQUFZLEVBQUU7aUJBQ2QsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUE1QixDQUE0QixDQUFDO2lCQUN6QyxTQUFTLENBQUMsZ0JBQVMsQ0FBQyxJQUFJLENBQUM7aUJBQ3pCLFdBQVcsQ0FBQyxnQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7OztPQUFBO0lBRU0sMEJBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxtQkFBWSxFQUFFO2FBQzNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3ZCLEdBQUcsQ0FDRixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FDdEIsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLEdBQUcsRUFDUixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FDRixDQUFDO1FBRUosTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSx5QkFBSSxHQUFYO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sK0JBQVUsR0FBbEI7UUFBQSxpQkFnQ0M7UUEvQkMsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2FBQ3ZDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBNUIsQ0FBNEIsQ0FBQzthQUN6QyxTQUFTLENBQUMsZ0JBQVMsQ0FBQyxJQUFJLENBQUM7YUFDekIsV0FBVyxDQUFDLGdCQUFTLENBQUMsSUFBSSxDQUFDO2FBQzNCLFNBQVMsQ0FDUixVQUFBLFVBQVU7WUFDUixFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO1lBQ2hDLENBQUM7WUFFRCxNQUFNLENBQUMsQ0FBQyxLQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxLQUFLLHdCQUFnQixDQUFDLFFBQVE7b0JBQzVCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDbEQsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO29CQUNoQyxDQUFDO29CQUNELEtBQUssQ0FBQztnQkFFUixLQUFLLHdCQUFnQixDQUFDLFFBQVE7b0JBQzVCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDbEQsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO29CQUNoQyxDQUFDO29CQUNELEtBQUssQ0FBQztZQUNWLENBQUM7UUFDSCxDQUFDLEVBRUQsVUFBQSxLQUFLLElBQUksT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUFxQyxLQUFPLENBQUMsRUFBekQsQ0FBeUQsRUFFbEUsY0FBTSxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBbEMsQ0FBa0MsQ0FDekMsQ0FBQztRQUVKLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLDhCQUFTLEdBQWpCO1FBQUEsaUJBeUJDO1FBeEJDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVzthQUN2QyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQTVCLENBQTRCLENBQUM7YUFDekMsU0FBUyxDQUFDLGdCQUFTLENBQUMsSUFBSSxDQUFDO2FBQ3pCLFdBQVcsQ0FBQyxnQkFBUyxDQUFDLElBQUksQ0FBQzthQUMzQixTQUFTLENBQ1IsVUFBQSxDQUFDO1lBQ0MsSUFBTSxHQUFHLEdBQUcsS0FBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFHM0IsSUFBTSxPQUFPLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztZQUU5RCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osSUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxFQUFULENBQVMsQ0FBQyxDQUFDO1lBQzdDLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ2xCLE1BQU0sRUFDTixLQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUMxQyxDQUFDO1lBQ0YsS0FBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsRUFFRCxVQUFBLEtBQUssSUFBSSxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQW9DLEtBQU8sQ0FBQyxFQUF4RCxDQUF3RCxDQUNsRSxDQUFDO1FBRUosTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8scUNBQWdCLEdBQXhCO1FBQUEsaUJBY0M7UUFiQyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVc7YUFDdkMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxFQUE1QixDQUE0QixDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxnQkFBUyxDQUFDLElBQUksQ0FBQzthQUN6QixXQUFXLENBQUMsZ0JBQVMsQ0FBQyxJQUFJLENBQUM7YUFDM0IsU0FBUyxDQUNSLFVBQUEsQ0FBQztZQUNDLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxDQUFDLEVBRUQsVUFBQSxLQUFLLElBQUksT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLDZDQUEyQyxLQUFPLENBQUMsRUFBL0QsQ0FBK0QsQ0FDekUsQ0FBQztRQUVKLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLHVDQUFrQixHQUExQjtRQUFBLGlCQW1CQztRQWxCQyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWTthQUM1QixTQUFTLENBQUMsZ0JBQVMsQ0FBQyxJQUFJLENBQUM7YUFDekIsV0FBVyxDQUFDLGdCQUFTLENBQUMsSUFBSSxDQUFDO2FBQzNCLFNBQVMsQ0FDUixVQUFBLEdBQUc7WUFDRCxLQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDN0QsS0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ1gsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFJLENBQUMsV0FBVyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQzlELENBQUM7WUFFRixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDLEVBQ0QsVUFBQSxLQUFLO1lBRUgsT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE0QyxLQUFPLENBQUM7UUFBaEUsQ0FBZ0UsQ0FDbkUsQ0FBQztRQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sd0NBQW1CLEdBQTNCO1FBQUEsaUJBV0M7UUFWQyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFBLENBQUM7WUFFN0MsQ0FBQyxDQUFDLEtBQUs7aUJBQ0osTUFBTSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsQ0FBQyxLQUFLLEVBQU4sQ0FBTSxDQUFDO2lCQUN2QixTQUFTLENBQUMsVUFBQSxLQUFLO2dCQUNkLEtBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxnQ0FBVyxHQUFuQjtRQUFBLGlCQXlCQztRQXhCQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUTtpQkFDakIsTUFBTSxDQUNMLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBM0QsQ0FBMkQsQ0FDakU7aUJBQ0EsU0FBUyxDQUFDLFVBQUEsQ0FBQztnQkFDVixFQUFFLENBQUMsQ0FDRCxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXO29CQUM1RCxDQUNGLENBQUMsQ0FBQyxDQUFDO29CQUVELE9BQU8sQ0FBQyxHQUFHLENBQ1QsdUJBQ0ksS0FBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLFNBQUksS0FBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVO3lCQUN6RCxXQUFXLFVBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxtQ0FDcEMsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsbUJBQWMsS0FBSSxDQUFDLEtBQUs7eUJBQzVELEtBQUssQ0FBQyxPQUFPLHFCQUNmLENBQ0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDSCxpQkFBQztBQUFELENBQUMsQUFoTkQsSUFnTkM7QUFoTlksZ0NBQVUifQ==