ref: 9de25964fd0da3631675116bd12e700d9779eb4e
dir: /ann/annrun.c/
#include <u.h>
#include <libc.h>
#include "ann.h"
double*
annrun(Ann *ann, double *input)
{
int l, i, o;
int outputs = ann->layers[ann->n - 1]->n;
double *ret = calloc(outputs, sizeof(double));
Neuron *O;
double sum;
for (i = 0; i < ann->layers[0]->n; i++)
ann->layers[0]->neurons[i]->value = input[i];
for (l = 1; l < ann->n; l++) {
for (o = 0; o < ann->layers[l]->n; o++) {
O = ann->layers[l]->neurons[o];
O->sum = ann->weights[l-1]->values[ann->weights[l-1]->inputs][o]; // bias
sum = O->sum;
for (i = 0; i < ann->layers[l-1]->n; i++)
sum += ann->layers[l-1]->neurons[i]->value * ann->weights[l-1]->values[i][o];
if (sum < -300.0)
sum = -300.0;
else if (sum > 300.0)
sum = 300.0;
O->sum = sum;
O->value = O->activation(O);
}
}
for (o = 0; o < outputs; o++)
ret[o] = ann->layers[ann->n - 1]->neurons[o]->value;
return ret;
}