-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathneat.js
25 lines (25 loc) · 32.1 KB
/
neat.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*!
* The MIT License (MIT)
*
* Copyright 2017 Thomas Wagenaar <[email protected]>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE
*
*/
!function(n){function t(e){if(o[e])return o[e].exports;var i=o[e]={i:e,l:!1,exports:{}};return n[e].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var o={};t.m=n,t.c=o,t.i=function(n){return n},t.d=function(n,o,e){t.o(n,o)||Object.defineProperty(n,o,{configurable:!1,enumerable:!0,get:e})},t.n=function(n){var o=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(o,"a",o),o},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p="",t(t.s=16)}([function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},function(n,t,o){var e,i,s={Activation:o(7),Mutation:o(14),Selection:o(15),Crossover:o(12),Cost:o(11),Gating:o(13),Connection:o(10)};e=[],void 0!==(i=function(){return s}.apply(t,e))&&(n.exports=i),void 0!==n&&n.exports&&(n.exports=s),"object"==typeof window&&(!function(){var n=window.methods;s.ninja=function(){return window.methods=n,s}}(),window.methods=s)},function(n,t,o){(function(n){function t(n){this.bias="input"==n?0:.2*Math.random()-.1,this.squash=a.LOGISTIC,this.type=n||"hidden",this.activation=0,this.state=0,this.old=0,this.connections={in:[],out:[],gated:[],self:new e(this,this,0)},this.error={responsibility:0,projected:0,gated:0}}n&&(n.exports=t);var e=o(4),i=o(1),s=o(5),r=o(3),a=i.Activation,c=i.Mutation;t.prototype={activate:function(n){if(void 0!==n)return this.activation=n,this.derivative=0,this.bias=0,this.activation;this.old=this.state,this.state=this.connections.self.gain*this.connections.self.weight*this.state+this.bias;for(var t in this.connections.in)t=this.connections.in[t],this.state+=t.from.activation*t.weight*t.gain;this.activation=this.squash(this.state),this.derivative=this.squash(this.state,!0);var o=[],e=[];for(var i in this.connections.gated){i=this.connections.gated[i];var s=i.to,r=o.indexOf(s);r>-1?e[r]+=i.weight*i.from.activation:(o.push(s),e.push(s.connections.self.gater==this?s.old:0),e[e.length-1]+=i.weight*i.from.activation)}for(var t in this.connections.in){t=this.connections.in[t],t.elegibility=this.connections.self.gain*this.connections.self.weight*t.elegibility+t.from.activation*t.gain;for(var a=0;a<o.length;a++){var s=o[a],c=e[a],r=t.xtrace.nodes.indexOf(s);r>-1?t.xtrace.values[r]=s.connections.self.gain*s.connections.self.weight*t.xtrace.values[r]+this.derivative*t.elegibility*c:(t.xtrace.nodes.push(s),t.xtrace.values.push(this.derivative*t.elegibility*c))}}for(var t in this.connections.gated)this.connections.gated[t].gain=this.activation;return this.activation},propagate:function(n,t){var o=0;if("output"==this.type)this.error.responsibility=this.error.projected=t-this.activation;else{for(var e in this.connections.out){var e=this.connections.out[e],i=e.to;o+=i.error.responsibility*e.weight*e.gain}this.error.projected=this.derivative*o,o=0;for(var s in this.connections.gated){s=this.connections.gated[s];var i=s.to,r=i.connections.self.gater==this?i.old:0;r+=s.weight*s.from.activation,o+=i.error.responsibility*r}this.error.gated=this.derivative*o,this.error.responsibility=this.error.projected+this.error.gated}n=n||.1;for(var e in this.connections.in){for(var e=this.connections.in[e],a=this.error.projected*e.elegibility,c=0;c<e.xtrace.nodes.length;c++){var i=e.xtrace.nodes[c],h=e.xtrace.values[c];a+=i.error.responsibility*h}e.weight+=n*a}this.bias+=n*this.error.responsibility},connect:function(n){var o=[];if(n instanceof s)for(var i=0;i<n.nodes.length;i++){var a=new e(this,n.nodes[i]);n.nodes[i].connections.in.push(a),this.connections.out.push(a),n.connections.in.push(a),o.push(a)}else if(n instanceof t)if(n==this)0!=this.connections.self.weight?r.warnings&&console.warn("This connection already exists!"):this.connections.self.weight=1,o.push(this.connections.self);else{if(this.isProjectingTo(n))throw new Error("Already projecting a connection to this node!");var a=new e(this,n);n.connections.in.push(a),this.connections.out.push(a),o.push(a)}return o},disconnect:function(n,t){if(this==n)return void(this.connections.self.weight=0);for(var o in this.connections.out){var e=this.connections.out[o];if(e.to==n){this.connections.out.splice(o,1);var i=e.to.connections.in.indexOf(e);e.to.connections.in.splice(i,1),null!=e.gater&&this.ungate(e);break}}t&&n.disconnect(this)},gate:function(n){Array.isArray(n)||(n=[n]);for(var t in n)t=n[t],this.connections.gated.push(t),t.gater=this},ungate:function(n){Array.isArray(n)||(n=[n]);for(var t=n.length-1;t>=0;t--){var o=n[t],e=this.connections.gated.indexOf(o);this.connections.gated.splice(e,1),o.gater=null}},clear:function(){for(var n in this.connections.in)n=this.connections.in[n],n.elegibility=0,n.xtrace={nodes:[],values:[]};this.error.responsibility=this.error.projected=this.error.gated=0,this.old=this.state=this.activation=0},mutate:function(n){if(void 0===n)throw new Error("No mutate method given!");if(!n.name in i.Mutation)throw new Error("This method does not exist!");switch(n){case c.MOD_ACTIVATION:for(var t=Math.floor(Math.random()*c.MOD_ACTIVATION.allowed.length);c.MOD_ACTIVATION.allowed[t]==this.squash;)t=Math.floor(Math.random()*c.MOD_ACTIVATION.allowed.length);this.squash=c.MOD_ACTIVATION.allowed[t];break;case c.MOD_BIAS:var o=Math.random()*(c.MOD_BIAS.config.max-c.MOD_BIAS.config.min)+c.MOD_BIAS.config.min;this.bias+=o}},isProjectingTo:function(n){for(conn in this.connections.out)if(conn=this.connections.out[conn],conn.to==n)return!0;return!1},isProjectedBy:function(n){for(conn in this.connections.in)if(conn=this.connections.in[conn],conn.from==n)return!0;return!1},toJSON:function(){return{bias:this.bias,type:this.type,squash:this.squash.name}}},t.fromJSON=function(n){var o=new t;o.bias=n.bias,o.type=n.type;for(squash in a)if(a[squash].name==n.squash){o.squash=a[squash];break}return o}}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={warnings:!0};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){(function(n){function t(n,t,o){this.from=n,this.to=t,this.gain=1,this.weight=void 0===o?.2*Math.random()-.1:o,this.gater=null,this.elegibility=0,this.xtrace={nodes:[],values:[]}}n&&(n.exports=t),t.prototype={toJSON:function(){return{weight:this.weight}}},t.innovationID=function(n,t){return.5*(n+t)*(n+t+1)+t}}).call(t,o(0)(n))},function(n,t,o){(function(n){function t(n){this.nodes=[],this.connections={in:[],out:[],self:[]};for(var t=0;t<n;t++)this.nodes.push(new i)}n&&(n.exports=t);var e=o(1),i=(o(4),o(2)),s=o(3);e.Activation,e.Mutation;t.prototype={activate:function(n){var t=[];if(void 0!==n&&n.length!=this.nodes.length)throw new Error("Array with values should be same as the amount of nodes!");for(var o=0;o<this.nodes.length;o++){if(void 0===n)var e=this.nodes[o].activate();else var e=this.nodes[o].activate(n[o]);t.push(e)}return t},propagate:function(n,t){if(void 0!==t&&t.length!=this.nodes.length)throw new Error("Array with values should be same as the amount of nodes!");for(var o=this.nodes.length-1;o>=0;o--)void 0===t?this.nodes[o].propagate(n):this.nodes[o].propagate(n,t[o])},connect:function(n,o){var r=[];if(n instanceof t){if(void 0===o&&(this!=n?(s.warnings&&console.warn("No group connection specified, using ALL_TO_ALL"),o=e.Connection.ALL_TO_ALL):(s.warnings&&console.warn("No group connection specified, using ONE_TO_ONE"),o=e.Connection.ONE_TO_ONE)),o==e.Connection.ALL_TO_ALL||o==e.Connection.ALL_TO_ELSE){for(var a=0;a<this.nodes.length;a++)for(var c=0;c<n.nodes.length;c++)if(o!=e.Connection.ALL_TO_ELSE||this.nodes[a]!=n.nodes[c]){var h=this.nodes[a].connect(n.nodes[c]);this.connections.out.push(h[0]),n.connections.in.push(h[0]),r.push(h[0])}}else if(o==e.Connection.ONE_TO_ONE){if(this.nodes.length!=n.nodes.length)throw new Error("From and To group must be the same size!");for(var a=0;a<this.nodes.length;a++){var h=this.nodes[a].connect(n.nodes[a]);this.connections.self.push(h[0]),r.push(h[0])}}}else if(n instanceof i)for(var a=0;a<this.nodes.length;a++){var h=this.nodes[a].connect(n);this.connections.out.push(h[0]),r.push(h[0])}return r},gate:function(n,t){if(void 0===t)throw new Error("Please specify Gating.INPUT, Gating.OUTPUT");Array.isArray(n)||(n=[n]);var o=[],i=[];for(var s in n)s=n[s],o.includes(s.from)||o.push(s.from),i.includes(s.to)||i.push(s.to);switch(t){case e.Gating.INPUT:for(var r=0;r<i.length;r++){var a=i[r],c=this.nodes[r%this.nodes.length];for(var h in a.connections.in)h=a.connections.in[h],n.includes(h)&&c.gate(h)}break;case e.Gating.OUTPUT:for(var r=0;r<o.length;r++){var a=o[r],c=this.nodes[r%this.nodes.length];for(var h in a.connections.out)h=a.connections.out[h],n.includes(h)&&c.gate(h)}break;case e.Gating.SELF:for(var r=0;r<o.length;r++){var a=o[r],c=this.nodes[r%this.nodes.length];n.includes(a.connections.self)&&c.gate(a.connections.self)}}},set:function(n){for(var t in this.nodes)this.nodes[t].bias=n.bias||this.nodes[t].bias,this.nodes[t].squash=n.squash||this.nodes[t].squash},disconnect:function(n,o){if(o=o||!1,n instanceof t)for(var e=0;e<this.nodes.length;e++)for(var s=0;s<n.nodes.length;s++){this.nodes[e].disconnect(n.nodes[s],o);for(index in this.connections.out){var r=this.connections.out[index];if(r.from==this.nodes[e]&&r.to==n.nodes[s]){this.connections.out.splice(index,1);break}}if(o)for(index in this.connections.in){var r=this.connections.in[index];if(r.from==n.nodes[s]&&r.to==this.nodes[e]){this.connections.in.splice(index,1);break}}}else if(n instanceof i)for(var e=0;e<this.nodes.length;e++){this.nodes[e].disconnect(n,o);for(index in this.connections.out){var r=this.connections.out[index];if(r.from==this.nodes[e]&&r.to==n){this.connections.out.splice(index,1);break}}if(o)for(index in this.connections.in){var r=this.connections.in[index];if(r.from==n&&r.to==this.nodes[e]){this.connections.in.splice(index,1);break}}}},clear:function(){for(var n in this.nodes)this.nodes[n].clear()}}}).call(t,o(0)(n))},function(n,t,o){(function(n){function t(n,t){if(void 0===n||void 0===t)throw new Error("No input or output size given");this.input=n,this.output=t,this.nodes=[],this.connections=[],this.gates=[],this.selfconns=[];for(var o=0;o<this.input+this.output;o++){var i=o<this.input?"input":"output";this.nodes.push(new e(i,this.nodes.length))}for(var o=0;o<this.input;o++)for(var s=this.input;s<this.output+this.input;s++)this.connect(this.nodes[o],this.nodes[s])}n&&(n.exports=t);var e=o(2),i=o(4),s=o(1),r=o(3),a=(s.Activation,s.Mutation);t.prototype={activate:function(n){var t=[];for(node in this.nodes)switch(this.nodes[node].type){case"input":this.nodes[node].activate(n[node]);break;case"hidden":this.nodes[node].activate();break;case"output":var o=this.nodes[node].activate();t.push(o)}return t},propagate:function(n,t){this.nodes.reverse(),t.reverse();for(node in this.nodes)switch(this.nodes[node].type){case"hidden":this.nodes[node].propagate(n);break;case"output":this.nodes[node].propagate(n,t[node])}t.reverse(),this.nodes.reverse()},clear:function(){for(var n in this.nodes)this.nodes[n].clear()},connect:function(n,t){var o=n.connect(t);for(var e in o)e=o[e],n!=t?this.connections.push(e):this.selfconns.push(e);return o},disconnect:function(n,t){var o=n==t?this.selfconns:this.connections;for(conn in o){var e=o[conn];if(e.from==n&&e.to==t){null!=e.gater&&this.ungate(e),o.splice(conn,1);break}}n.disconnect(t)},gate:function(n,t){if(-1==this.nodes.indexOf(n))throw new Error("This node is not part of the network!");if(null!=t.gater)return void(r.warnings&&console.warn("This connection is already gated!"));n.gate(t),this.gates.push(t)},ungate:function(n){var t=this.gates.indexOf(n);if(-1==t)throw new Error("This connection is not gated!");this.gates.splice(t,1),n.gater.ungate(n)},remove:function(n){var t=this.nodes.indexOf(n);if(-1==t)throw new Error("This node does not exist!");for(var o=[],e=[],i=n.connections.in.length-1;i>=0;i--){var r=n.connections.in[i];s.Mutation.SUB_NODE.keep_gates&&null!=r.gater&&r.gater!=n&&o.push(r.gater),e.push(r.from),this.disconnect(r.from,n)}for(var a=[],i=n.connections.out.length-1;i>=0;i--){var r=n.connections.out[i];s.Mutation.SUB_NODE.keep_gates&&null!=r.gater&&r.gater!=n&&o.push(r.gater),a.push(r.to),this.disconnect(n,r.to)}var c=[];for(var h in e){h=e[h];for(var u in a)if(u=a[u],!h.isProjectingTo(u)){var f=this.connect(h,u);c.push(f[0])}}for(var l in o){if(0==c.length)break;l=o[l];var d=Math.floor(Math.random()*c.length),f=c[d];this.gate(l,c[d]),c.splice(d,1)}for(var i=n.connections.gated.length-1;i>=0;i--){var f=n.connections.gated[i];this.ungate(f)}this.disconnect(n,n),this.nodes.splice(t,1)},mutate:function(n){if(void 0===n)throw new Error("No (correct) mutate method given!");switch(n){case a.ADD_NODE:var t=this.connections[Math.floor(Math.random()*this.connections.length)],o=t.gater;this.disconnect(t.from,t.to);var i=this.nodes.indexOf(t.to),s=new e("hidden",this.nodes.length);s.mutate(a.MOD_ACTIVATION);var c=Math.min(i,this.nodes.length-this.output);this.nodes.splice(c,0,s);var h=this.connect(t.from,s)[0],u=this.connect(s,t.to)[0];null!=o&&this.gate(o,Math.random()>=.5?h:u);break;case a.SUB_NODE:if(this.nodes.length==this.input+this.output){r.warnings&&console.warn("No more nodes left to remove!");break}var f=Math.floor(Math.random()*(this.nodes.length-this.output-this.input)+this.input),s=this.nodes[f];this.remove(s);break;case a.ADD_CONN:for(var l=[],d=0;d<this.nodes.length;d++){var p=this.nodes[d];if("output"!=p.type)for(var v=d+1;v<this.nodes.length;v++){var g=this.nodes[v];if("input"!=g.type){for(var m=!1,O=0;O<this.connections.length;O++)if(this.connections[O].from==p&&this.connections[O].to==g){m=!0;break}m||l.push([p,g])}}}if(0==l.length){r.warnings&&console.warn("No more connections to be made!");break}var w=l[Math.floor(Math.random()*l.length)];this.connect(w[0],w[1]);break;case a.SUB_CONN:var N=[];for(A in this.connections)A=this.connections[A],A.from.connections.out.length>1&&A.to.connections.in.length>1&&this.nodes.indexOf(A.to)>this.nodes.indexOf(A.from)&&N.push(A);if(0==N.length){r.warnings&&console.warn("No connections to remove!");break}var M=N[Math.floor(Math.random()*N.length)];this.disconnect(M.from,M.to);break;case a.MOD_WEIGHT:var t=this.connections[Math.floor(Math.random()*this.connections.length)],T=Math.random()*(a.MOD_WEIGHT.config.max-a.MOD_WEIGHT.config.min)+a.MOD_WEIGHT.config.min;t.weight+=T;break;case a.MOD_BIAS:var f=Math.floor(Math.random()*(this.nodes.length-this.input)+this.input),s=this.nodes[f];s.mutate(a.MOD_BIAS);break;case a.MOD_ACTIVATION:var f=Math.floor(Math.random()*(this.nodes.length-this.input)+this.input),s=this.nodes[f];s.mutate(a.MOD_ACTIVATION);break;case a.ADD_SELF_CONN:for(var N=[],d=this.input;d<this.nodes.length;d++){var s=this.nodes[d];0==s.connections.self.weight&&N.push(s)}if(0==N.length){r.warnings&&console.warn("No more self-connections to add!");break}var s=N[Math.floor(Math.random()*N.length)];this.connect(s,s);break;case a.SUB_SELF_CONN:if(0==this.selfconns.length){r.warnings&&console.warn("No more self-connections to remove!");break}var A=this.selfconns[Math.floor(Math.random()*this.selfconns.length)];this.disconnect(A.from,A.to);break;case a.ADD_GATE:var _=this.connections.concat(this.selfconns),N=[];for(var A in _)A=_[A],null==A.gater&&N.push(A);if(0==N.length){r.warnings&&console.warn("No more connections to gate!");break}var s=this.nodes[Math.floor(Math.random()*this.nodes.length)],A=N[Math.floor(Math.random()*N.length)];this.gate(s,A);break;case a.SUB_GATE:if(0==this.gates.length){r.warnings&&console.warn("No more connections to ungate!");break}var f=Math.floor(Math.random()*this.gates.length),S=this.gates[f];this.ungate(S);break;case a.ADD_BACK_CONN:for(var l=[],d=0;d<this.nodes.length;d++){var p=this.nodes[d];if("input"!=p.type)for(var v=0;v<d;v++){var g=this.nodes[v];if("input"!=g.type){for(var m=!1,O=0;O<this.connections.length;O++)if(this.connections[O].from==p&&this.connections[O].to==g){m=!0;break}m||l.push([p,g])}}}if(0==l.length){r.warnings&&console.warn("No more connections to be made!");break}var w=l[Math.floor(Math.random()*l.length)];this.connect(w[0],w[1]);break;case a.SUB_BACK_CONN:var N=[];for(A in this.connections)A=this.connections[A],A.from.connections.out.length>1&&A.to.connections.in.length>1&&this.nodes.indexOf(A.from)>this.nodes.indexOf(A.to)&&N.push(A);if(0==N.length){r.warnings&&console.warn("No connections to remove!");break}var M=N[Math.floor(Math.random()*N.length)];this.disconnect(M.from,M.to)}},train:function(n,t){t=t||{},void 0===t.rate&&r.warnings&&console.warn("Using default learning rate, please define a rate!"),void 0===t.iterations&&r.warnings&&console.warn("No target iterations given, running until error is reached!");var o=Date.now(),e=t.log||!1,i=t.error||.005,a=t.cost||s.Cost.MSE,c=t.rate||.3,h=t.shuffle||!1,u=t.iterations||0,f=t.crossValidate||!1,l=t.clear||!1;if(f)var d=t.crossValidate.testSize,p=t.crossValidate.testError,v=Math.ceil((1-d)*n.length),g=n.slice(0,v),m=n.slice(v);var O=c,w=0;Array.isArray(c)&&(w=Math.floor(u/c.length));for(var N=0,M=1;M>i&&(0==u||N<u)&&!(f&&M<=p);){if(N++,"function"==typeof c&&(O=c(u,M)),M=0,w>0){O=c[Math.floor(u/w)]||O}if(f?(this._trainSet(g,O,a),l&&this.clear(),M+=this.test(m,a).error,l&&this.clear()):(M+=this._trainSet(n,O,a),l&&this.clear(),M/=n.length),h)for(var T,A,_=n.length;_;T=Math.floor(Math.random()*_),A=n[--_],n[_]=n[T],n[T]=A);e&&N%e==0&&console.log("iterations",N,"error",M,"rate",O)}return{error:M,iterations:N,time:Date.now()-o}},_trainSet:function(n,t,o){var e=0;for(var i in n){var s=n[i].input,r=n[i].output,a=this.activate(s);this.propagate(t,r),e+=o(r,a)}return e},test:function(n,t){t=t||s.Cost.MSE;var o,e,i,r=0,a=Date.now();for(var c in n)o=n[c].input,i=n[c].output,e=this.activate(o),r+=t(i,e);return r/=n.length,{error:r,time:Date.now()-a}},graph:function(n,t){var o=0,e=0,i={nodes:[],links:[],constraints:[{type:"alignment",axis:"x",offsets:[]},{type:"alignment",axis:"y",offsets:[]}]};for(a in this.nodes){var s=this.nodes[a];"input"==s.type?(1==this.input?i.constraints[0].offsets.push({node:a,offset:0}):i.constraints[0].offsets.push({node:a,offset:.8*n/(this.input-1)*o++}),i.constraints[1].offsets.push({node:a,offset:0})):"output"==s.type&&(1==this.output?i.constraints[0].offsets.push({node:a,offset:0}):i.constraints[0].offsets.push({node:a,offset:.8*n/(this.output-1)*e++}),i.constraints[1].offsets.push({node:a,offset:-.8*t})),i.nodes.push({id:a,name:"hidden"==s.type?s.squash.name:s.type.toUpperCase(),activation:s.activation})}var r=this.connections.concat(this.selfconns);for(connection in r)if(connection=r[connection],null==connection.gater)i.links.push({source:this.nodes.indexOf(connection.from),target:this.nodes.indexOf(connection.to),weight:connection.weight});else{var a=i.nodes.length;i.nodes.push({id:a,activation:connection.gater.activation,name:"GATE"}),i.links.push({source:this.nodes.indexOf(connection.from),target:a,weight:.5*connection.weight}),i.links.push({source:a,target:this.nodes.indexOf(connection.to),weight:.5*connection.weight}),i.links.push({source:this.nodes.indexOf(connection.gater),target:a,weight:connection.gater.activation,gate:!0})}return i},toJSON:function(){var n={nodes:[],connections:[],input:this.input,output:this.output};for(index in this.nodes){var t=this.nodes[index],o=t.toJSON();if(o.index=index,n.nodes.push(o),0!=t.connections.self.weight){var o=t.connections.self.toJSON();o.from=index,o.to=index,o.gater=null!=t.connections.self.gater?this.nodes.indexOf(t.connections.self.gater):null,n.connections.push(o)}}for(e in this.connections){var e=this.connections[e],o=e.toJSON();o.from=this.nodes.indexOf(e.from),o.to=this.nodes.indexOf(e.to),o.gater=null!=e.gater?this.nodes.indexOf(e.gater):null,n.connections.push(o)}return n},set:function(n){for(var t in this.nodes)this.nodes[t].bias=n.bias||this.nodes[t].bias,this.nodes[t].squash=n.squash||this.nodes[t].squash}},t.fromJSON=function(n){var o=new t(n.input,n.output);o.nodes=[],o.connections=[];for(node in n.nodes)o.nodes.push(e.fromJSON(n.nodes[node]));for(i in n.connections){var i=n.connections[i],s=o.connect(o.nodes[i.from],o.nodes[i.to])[0];s.weight=i.weight,null!=i.gater&&o.gate(o.nodes[i.gater],s)}return o},t.merge=function(n,o){if(n=t.fromJSON(n.toJSON()),o=t.fromJSON(o.toJSON()),n.output!=o.input)throw new Error("Output size of network1 should be the same as the input size of network2!");for(conn in o.connections)if(conn=o.connections[conn],"input"==conn.from.type){var e=o.nodes.indexOf(conn.from);o.nodes[e];conn.from=n.nodes[n.nodes.length-1-e]}for(var i=n.nodes.length-1-n.output;i<n.nodes.length;i++)n.nodes[i].type="hidden";return n.connections=n.connections.concat(o.connections),n.nodes=n.nodes.concat(o.nodes),n},t.crossOver=function(n,o,s){if(n.input!=o.input||n.output!=o.output)throw new Error("Networks don't have the same input/output size!");var r=new t(n.input,n.output);r.connections=[],r.nodes=[];var a=n.score||0,c=o.score||0;if(n=t.fromJSON(n.toJSON()),o=t.fromJSON(o.toJSON()),a==c)var h=Math.max(n.nodes.length,o.nodes.length),u=Math.min(n.nodes.length,o.nodes.length),f=Math.floor(Math.random()*(h-u+1)+u);else if(a>c)var f=n.nodes.length;else var f=o.nodes.length;for(var l=0;l<f;l++)if(l<n.nodes.length&&l<o.nodes.length){var d=null;if(l>=f-n.output)for(;null==d||"output"!=d.type;)d=Math.random()>=.5?n.nodes[l]:o.nodes[l];else for(;null==d||l<f-n.output&&"output"==d.type;)d=Math.random()>=.5?n.nodes[l]:o.nodes[l];r.nodes.push(d)}else l<n.nodes.length?l>=f-n.output?r.nodes.push(n.nodes[n.nodes.length-(l-(f-n.output-1))]):r.nodes.push(n.nodes[l]):l<o.nodes.length&&(l>=f-n.output?r.nodes.push(o.nodes[o.nodes.length-(l-(f-n.output-1))]):r.nodes.push(o.nodes[l]));for(d in r.nodes)r.nodes[d]=e.fromJSON(r.nodes[d].toJSON());var p={},v={},g=n.connections.concat(n.selfconns);for(m in g){var m=g[m],O={weight:m.weight,from:n.nodes.indexOf(m.from),to:n.nodes.indexOf(m.to),gater:n.nodes.indexOf(m.gater)};if(O.to==n.nodes.length-1){if(!(O.from<f-1))continue;O.to=f-1}var w=i.innovationID(O.from,O.to);p[w]=O}var N=o.connections.concat(o.selfconns);for(m in N){var m=N[m],O={weight:m.weight,from:o.nodes.indexOf(m.from),to:o.nodes.indexOf(m.to),gater:o.nodes.indexOf(m.gater)};if(O.to==o.nodes.length-1){if(!(O.from<f-1))continue;O.to=f-1}var w=i.innovationID(O.from,O.to);v[w]=O}var M={};for(var w in p)w in v&&(M[w]=[p[w],v[w]],delete p[w],delete v[w]);var T=[];for(m in M){var m=Math.random()>=.5?M[m][0]:M[m][1];T.push(m)}if(a==c){for(m in p)T.push(p[m]);for(m in v)T.push(v[m])}else if(a>c)for(m in p)T.push(p[m]);else for(m in v)T.push(v[m]);for(m in T){var A=T[m];if(A.to<f&&A.from<f){var _=r.nodes[A.from],S=r.nodes[A.to],m=r.connect(_,S)[0];m.weight=A.weight,-1!=A.gater&&A.gater<f&&r.gate(r.nodes[A.gater],m)}}return r}}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={LOGISTIC:function(n,o){if(!o)return 1/(1+Math.exp(-n));var e=t.LOGISTIC(n);return e*(1-e)},TANH:function(n,o){return o?1-Math.pow(t.TANH(n),2):Math.tanh(n)},IDENTITY:function(n,t){return t?1:n},STEP:function(n,t){return t?0:n>0?1:0},RELU:function(n,t){return t?n>0?1:0:n>0?n:0},SOFTSIGN:function(n,t){var o=1+Math.abs(n);return t?n/Math.pow(o,2):n/o},SINUSOID:function(n,t){return t?Math.cos(n):Math.sin(n)},GAUSSIAN:function(n,t){var o=Math.exp(-Math.pow(n,2));return t?-2*n*o:o},BENT_IDENTITY:function(n,t){var o=Math.sqrt(Math.pow(n,2)+1);return t?n/(2*o)+1:(o-1)/2+n},BIPOLAR:function(n,t){return t?0:n>0?1:-1},BIPOLAR_SIGMOID:function(n,t){var o=2/(1+Math.exp(-n))-1;return t?.5*(1+o)*(1-o):o},HARD_TANH:function(n,t){return t?n>-1&&n<1?1:0:Math.max(-1,Math.min(1,n))},ABSOLUTE:function(n,t){return t?n<0?-1:1:Math.abs(n)}};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){(function(n){var t=o(6),e=o(1),i=o(2),s=o(5),r={Construct:function(n){var o=new t(0,0),e=[];for(item in n)if(n[item]instanceof s)for(var r in n[item].nodes)e.push(n[item].nodes[r]);else n[item]instanceof i&&e.push(n[item]);for(var r in e)e[r].connections.out.length+e[r].connections.gated.length==0?(e[r].type="output",o.output++):e[r].connections.in.length||(e[r].type="input",o.input++);if(0==o.input||0==o.output)throw new Error("Given nodes have no clear input/output node!");for(var r in e){for(var a in e[r].connections.out)o.connections.push(e[r].connections.out[a]);for(var a in e[r].connections.gated)o.gates.push(e[r].connections.gated[a]);0!=e[r].connections.self.weight&&o.selfconns.push(e[r].connections.self)}return o.nodes=e,o},Perceptron:function(){var n=Array.prototype.slice.call(arguments);if(n.length<3)throw new Error("not enough layers (minimum 3) !!");var t=[];t.push(new s(n[0]));for(var o=1;o<n.length;o++){var e=n[o],e=new s(e);t.push(e),t[o-1].connect(t[o])}return r.Construct(t)},Random:function(n,o,i,s){s=s||{};for(var r=s.connections||2*o,a=s.backconnections||0,c=s.selfconnections||0,h=s.gates||0,u=new t(n,i),f=0;f<o;f++)u.mutate(e.Mutation.ADD_NODE);for(var f=0;f<r-o;f++)u.mutate(e.Mutation.ADD_CONN);for(var f=0;f<a;f++)u.mutate(e.Mutation.ADD_BACK_CONN);for(var f=0;f<c;f++)u.mutate(e.Mutation.ADD_SELF_CONN);for(var f=0;f<h;f++)u.mutate(e.Mutation.ADD_GATE);return u},LSTM:function(){var n=Array.prototype.slice.call(arguments);if(n.length<3)throw new Error("not enough layers (minimum 3) !!");var t=n.pop();if("number"==typeof t){var o=new s(t);t={}}else var o=new s(n.pop());var i={};i.memoryToMemory=t.memoryToMemory||!1,i.outputToMemory=t.outputToMemory||!1,i.outputToGates=t.outputToGates||!1,i.inputToOutput=t.inputToOutput||!0;var a=new s(n.shift()),c=n,h=[];h.push(a);var u=null;for(var f in c){f=c[f];var l=new s(f),d=new s(f),p=new s(f),v=new s(f);l.set({bias:1}),d.set({bias:1}),v.set({bias:1});var g=a.connect(p);a.connect(l),a.connect(v),a.connect(d),p.connect(l),p.connect(d),p.connect(v);var m=p.connect(p),O=p.connect(o);l.gate(g,e.Gating.INPUT),d.gate(m,e.Gating.SELF),v.gate(O,e.Gating.OUTPUT),null!=u&&(u.connect(p),u.connect(l),u.connect(d),u.connect(v)),i.memoryToMemory&&p.connect(p,e.Connection.ALL_TO_ELSE),i.outputToMemory&&o.connect(p),i.outputToGates&&(o.connect(l),o.connect(d),o.connect(v)),h.push(l),h.push(d),h.push(p),h.push(v),u=p}return i.inputToOutput&&a.connect(o),h.push(o),r.Construct(h)},Hopfield:function(n){var o=new t(n,n);return o.learn=function(n){var t=[];for(var e in n)t.push({input:n[e],output:n[e]});return o.train(t,{iterations:5e5,error:5e-5,rate:1})},o.feed=function(n){var t=this.activate(n),n=[];for(var o in t)n[o]=t[o]>=.5?1:0;return n},o}};n&&(n.exports=r)}).call(t,o(0)(n))},function(n,t,o){(function(n){function t(n,t,o,s){this.input=n,this.output=t,this.fitness=o,s=s||{},this.equal=s.equal||!1,this.popsize=s.popsize||50,this.elitism=s.elitism||0,this.mutationRate=s.mutationRate||.3,this.mutationAmount=s.mutationAmount||1,this.selection=s.selection||[i.Selection.FITNESS_PROPORTIONATE],this.crossover=s.crossover||[i.Crossover.SINGLE_POINT,i.Crossover.TWO_POINT,i.Crossover.UNIFORM,i.Crossover.AVERAGE],this.mutation=s.mutation||[i.Mutation.ADD_CONN,i.Mutation.SUB_CONN,i.Mutation.ADD_NODE,i.Mutation.SUB_NODE,i.Mutation.MOD_BIAS,i.Mutation.MOD_WEIGHT,i.Mutation.MOD_ACTIVATION],this.generation=0,this.createPool(s.network||new e(this.input,this.output))}n&&(n.exports=t);var e=(o(2),o(6)),i=o(1),s=(i.Activation,i.Mutation,i.Selection);i.Crossover;t.prototype={createPool:function(n){this.population=[];for(var t=0;t<this.popsize;t++){var o=e.fromJSON(n.toJSON());this.population.push(o)}},evolve:function(){this.evaluate(),this.sort();for(var n=[],t=0;t<this.elitism;t++)n.push(this.population[t]);for(var t=0;t<this.popsize-this.elitism;t++)n.push(this.getOffspring());this.population=n,this.mutate(),this.generation++},getOffspring:function(){parent1=this.getParent(),parent2=this.getParent(),1==this.equal&&(parent1.score=0,parent2.score=0);var n=this.crossover[Math.floor(Math.random()*this.crossover.length)];return e.crossOver(parent1,parent2,n)},mutate:function(){for(genome in this.population)if(Math.random()<=this.mutationRate)for(var n=0;n<this.mutationAmount;n++){var t=this.mutation[Math.floor(Math.random()*this.mutation.length)];this.population[genome].mutate(t)}},evaluate:function(){for(genome in this.population){var n=this.fitness(this.population[genome]);this.population[genome].score=n}},sort:function(){this.population.sort(function(n,t){return t.score-n.score})},getFittest:function(){return void 0===this.population[this.population.length-1].score&&this.evaluate(),this.sort(),this.population[0]},getAverage:function(){void 0===this.population[this.population.length-1].score&&this.evaluate();var n=0;for(genome in this.population)n+=this.population[genome].score;return n/this.popsize},getParent:function(){switch(this.selection[Math.floor(Math.random()*this.selection.length)]){case s.FITNESS_PROPORTIONATE:var n=Math.floor(s.FITNESS_PROPORTIONATE.config(Math.random())*this.popsize);return this.population[n]}},export:function(){var n=[];for(var t in this.population)t=this.population[t],n.push(t.toJSON());return n},import:function(n){var t=[];for(var o in n)o=n[o],t.push(e.fromJSON(o));this.population=t,this.popsize=t.length}}}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={ALL_TO_ALL:{name:"OUTPUT"},ALL_TO_ELSE:{name:"INPUT"},ONE_TO_ONE:{name:"SELF"}};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={CROSS_ENTROPY:function(n,t){var o=0;for(var e in t)o-=n[e]*Math.log(Math.max(t[e],1e-15))+(1-n[e])*Math.log(1-Math.max(t[e],1e-15));return o},MSE:function(n,t){var o=0;for(var e in t)o+=Math.pow(n[e]-t[e],2);return o/t.length},BINARY:function(n,t){var o=0;for(var e in t)o+=Math.round(2*n[e])!=Math.round(2*t[e]);return o},MAE:function(n,t){var o=0;for(var e in t)o+=Math.abs(n[e]-t[e]);return o/t.length},MAPE:function(n,t){var o=0;for(var e in t)o+=Math.abs((t[e]-n[e])/Math.max(n[e],1e-15));return o/t.length},MSLE:function(n,t){var o=0;for(var e in t)o+=Math.log(Math.max(n[e],1e-15))-Math.log(Math.max(t[e],1e-15));return o},HINGE:function(n,t){var o=0;for(var e in t)o+=Math.max(0,1-n[e]*t[e]);return o}};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={SINGLE_POINT:{name:"SINGLE_POINT",config:[.4]},TWO_POINT:{name:"TWO_POINT",config:[.4,.9]},UNIFORM:{name:"UNIFORM"},AVERAGE:{name:"AVERAGE"}};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={OUTPUT:{name:"OUTPUT"},INPUT:{name:"INPUT"},SELF:{name:"SELF"}};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){(function(n){var t=o(7),e={ADD_NODE:{name:"ADD_NODE"},SUB_NODE:{name:"SUB_NODE",keep_gates:!0},ADD_CONN:{name:"ADD_CONN"},SUB_CONN:{name:"REMOVE_CONN"},MOD_WEIGHT:{name:"MOD_WEIGHT",config:{min:-1,max:1}},MOD_BIAS:{name:"MOD_BIAS",config:{min:-1,max:1}},MOD_ACTIVATION:{name:"MOD_ACTIVATION",allowed:[t.LOGISTIC,t.TANH,t.RELU,t.IDENTITY,t.STEP,t.SOFTSIGN,t.SINUSOID,t.GAUSSIAN,t.BENT_IDENTITY,t.BIPOLAR,t.BIPOLAR_SIGMOID,t.HARD_TANH,t.ABSOLUTE]},ADD_SELF_CONN:{name:"ADD_SELF_CONN"},SUB_SELF_CONN:{name:"SUB_SELF_CONN"},ADD_GATE:{name:"ADD_GATE"},SUB_GATE:{name:"SUB_GATE"},ADD_BACK_CONN:{name:"ADD_BACK_CONN"},SUB_BACK_CONN:{name:"SUB_BACK_CONN"}};n&&(n.exports=e)}).call(t,o(0)(n))},function(n,t,o){(function(n){var t={FITNESS_PROPORTIONATE:{name:"FITNESS_PROPORTIONATE",config:function(n){return Math.pow(n,2)}}};n&&(n.exports=t)}).call(t,o(0)(n))},function(n,t,o){var e,i,s={Node:o(2),Neat:o(9),Network:o(6),Methods:o(1),Architect:o(8),Group:o(5),Connection:o(4),Config:o(3)};e=[],void 0!==(i=function(){return s}.apply(t,e))&&(n.exports=i),void 0!==n&&n.exports&&(n.exports=s),"object"==typeof window&&(!function(){var n=window.neataptic;s.ninja=function(){return window.neataptic=n,s}}(),window.neataptic=s)}]);