NN_AND = A.inline(()=>{
var input = [[.35,.20],[0.7,0.55],[0.17,0.8],[0.9,0.3]],
WH = [[.15+1e1,.20+1e2,.35+1e3],[.25+1e4,.30+1e5,.35+1e6]],
WO = [[.40+1e7,.45+1e8,.60+1e9],[.50+1e10,.55+1e11,.60+1e12]],
expected = [[0.01,0.99],[0.99,0.01],[0.01,0.99],[0.01,0.99]];
var logistic = x=>this.inv(1+this.exp(-x)),
forward=(sample)=>(WO*[...(WH*[...sample,1]).map(logistic),1]).map(logistic),
error = (sample,expected)=>.5*(expected-sample)**2;
for (var k=0;k<500;k++) {
var update=input.reduce((l,c,i)=>l-5*error(forward(c), expected[i]),0);
WH = WH+[[...update.slice(1,4)],[...update.slice(4,7)]];
WO = WO+[[...update.slice(7,10)],[...update.slice(10,13)]];
}
return { forward:forward,input,WO,WH,out:input.map(i=>forward(i).map(x=>x.s.toFixed(2)*1)),
error:input.reduce((a,b,i)=>a+error(forward(b),expected[i]).s,0),expected}
})()