import { default as M, Cloud } from "./m.ts"; export type N = Array>> const Label = (inSet:any, inData:Cloud.M, inLabel:Cloud.V):N => { if(!inSet){inSet = [[], []];} if(inSet.length == 0){inSet.push([]);} if(inSet.length == 1){inSet.push([]);} inData.forEach((row:Cloud.V) => { row.push(1); inSet[0].push(row); inSet[1].push(inLabel); }); return inSet; }; const Forward = (inStages:N, inLayers:N):Cloud.M => { let i:number; let process = (index:number):Cloud.M => M.Batch.Sigmoid(M.Batch.Affine(inStages[index], inLayers[index])); for(i=0; i { let i:number; let errorBack:Cloud.M = M.Batch.Subtract(Forward(inStages, inLayers), inGoals); for(i=inLayers.length-1; i>=0; i--) { let layerInput:Cloud.M = inStages[i]; let layerOutput:Cloud.M = inStages[i+1]; let errorScaled:Cloud.M = M.Batch.Multiply(errorBack, M.Batch.Derivative(layerOutput)); errorBack = M.Batch.Affine(errorScaled, M.Create.Transpose(inLayers[i])); errorScaled.forEach((inScaledError:Cloud.V, inIndex:number)=> { const deltas = M.Batch.Scale(M.Create.Outer(layerInput[inIndex], inScaledError), inRate); inLayers[i] = M.Batch.Subtract(inLayers[i], deltas); }); } return inLayers; }; export { Label, Forward, Backward }; export type { Cloud };