enome
Version:
A genome generation and evolution library.
141 lines • 13.7 kB
JavaScript
"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaW11bGF0aW9uL3NpbXVsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFNYztBQUNkLGtDQVVrQjtBQUdsQiwwQkFBNEI7QUFFNUI7SUFrQ0Usb0JBQ1MsVUFBa0UsRUFDbEUsV0FBNkM7UUFEN0MsZUFBVSxHQUFWLFVBQVUsQ0FBd0Q7UUFDbEUsZ0JBQVcsR0FBWCxXQUFXLENBQWtDO1FBM0IvQyxRQUFHLEdBRU4sSUFBSSwwQkFBa0IsRUFBRSxDQUFDO1FBRXRCLGVBQVUsR0FBNkIsSUFBSSx3QkFBZ0IsRUFBRSxDQUFDO1FBRTlELGlCQUFZLEdBRWYsSUFBSSxvQkFBYSxDQUNuQixDQUFDLENBQ0YsQ0FBQztRQUVLLGNBQVMsR0FFWixJQUFJLDBCQUFrQixFQUFFLENBQUM7UUFFdEIsYUFBUSxHQUE2QixJQUFJLHdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRzVELFVBQUssR0FFVCxJQUFJLHdCQUFnQixFQUFFLENBQUM7UUFFbkIsU0FBSSxHQUFpQixJQUFJLG1CQUFZLEVBQUUsQ0FBQztJQUs3QyxDQUFDO0lBRUosc0JBQVcsNEJBQUk7YUFBZjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSztpQkFDZCxZQUFZLEVBQUU7aUJBQ2QsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUE1QixDQUE0QixDQUFDO2lCQUN6QyxTQUFTLENBQUMsZ0JBQVMsQ0FBQyxJQUFJLENBQUM7aUJBQ3pCLFdBQVcsQ0FBQyxnQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7OztPQUFBO0lBRU0sMEJBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxtQkFBWSxFQUFFO2FBQzNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVB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