20 Synapse * ptr; // TOFIX: Support pointers in generic types
23 static double Sigmoid(double x)
25 return 1 / (1 + exp(-x));
28 static double SigmoidDerivative(double x)
33 double GetRandDouble(double lo, double hi)
35 return GetRandom((int)(lo * 1000000000), (int)(hi * 1000000000)) / 1000000000.0;
42 Array<SynapsePtr> dendrons;
56 for(c = 0; c<dendrons.size; c++)
58 Synapse * synapse = dendrons[c].ptr;
59 if(synapse->dendron->state != CLEARED)
60 synapse->dendron->Unactivate();
71 for(c = 0; c<dendrons.size; c++)
73 Synapse * synapse = dendrons[c].ptr;
74 if(synapse->dendron->state != ACTIVATED)
75 synapse->dendron->Activate();
76 activation += synapse->dendron->activation * synapse->weight;
78 activation = Sigmoid(activation);
89 for(c = 0; c<axons.size; c++)
91 Synapse * synapse = &axons[c];
92 if(synapse->axon->state != PROPAGATED)
93 synapse->axon->BackPropagate();
94 error += synapse->axon->error * synapse->weight;
97 error *= SigmoidDerivative(activation);
101 void Teach(double learnRate)
106 for(c = 0; c<dendrons.size; c++)
108 Synapse * synapse = dendrons[c].ptr;
110 synapse->dendron->Teach(learnRate);
111 synapse->weight += learnRate * error * synapse->dendron->activation;
113 bias += learnRate * error;
119 int Neuron_Winner(Neuron * neurons, int count)
121 double bestActivation = -MAXDOUBLE;
123 for(c = 0; c<count; c++)
125 if(neurons[c].activation > bestActivation)
128 bestActivation = neurons[c].activation;