!7 cmodule PerceptronSpike > DynPrintLog { sclass Example { double[] inputs; int answer; *(double x, double y, int a) { inputs = new double[] {x, y, 1}; answer = a; } } int nExamples = 200; L examples; double[] weights; double c = 0.00001; start-thread { if (empty(examples)) setField(examples := repF(nExamples, () -> { int x = rand(640), y = rand(360); ret new Example(x, y, y < f(x) ? -1 : 1); })); weights = new double[l(first(examples).inputs)]; for i over weights: weights[i] = random(-1.0, 1.0); for i to 100: print("Error: " + train()); } double train() { double error = 0; for (Example e : examples) error += train(e); ret error/l(examples); } // function to be learned private double f(double x) { ret x * 0.7 + 40; } int feedForward(double[] inputs) { double sum = 0; for i over weights: sum += inputs[i] * weights[i]; ret activate(sum); } int activate(double s) { return s > 0 ? 1 : -1; } double train(Example e) { int guess = feedForward(e.inputs); double error = e.answer - guess; for i over weights: weights[i] += c * error * e.inputs[i]; ret error; } }