/* compute the backward sum of the * 2nd-derivative weighted by the squared weights */ static void updN_sqbacksum(neurone *n) { if (n->FSaval != NIL) { #ifndef NONEURTYPE synapse *s = n->FSaval; n->Nsqbacksum = Fzero; while (s) { neurtype *taval = s->Naval->type; if (taval && taval->updN_sqbacksum_term) s = (*taval->updN_sqbacksum_term)(n, s); else { flt sum, prod; Fclr(sum); for (; s && s->Naval->type==taval; s=s->NSamont ) { prod = Fmul( Fmul(s->Sval,s->Sval), s->Naval->Nggrad ); sum = Fadd( sum,prod ); } n->Nsqbacksum = Fadd(n->Nsqbacksum, sum); } } #else synapse *s; flt sum , prod; Fclr(sum); for ( s=n->FSaval; s!=NIL; s=s->NSamont ) { prod = Fmul( Fmul(s->Sval,s->Sval), s->Naval->Nggrad ); sum = Fadd( sum,prod ); } n->Nsqbacksum=sum; #endif } }
static void updN_sum(neurone *n) { #ifndef NONEURTYPE if (n->type && n->type->updN_sum) { (*n->type->updN_sum)(n); } else #endif { synapse *s; flt sum,prod; Fclr(sum); for ( s=n->FSamont; s!=NIL; s=s->NSaval ) { prod = Fmul( s->Sval, s->Namont->Nval ); sum = Fadd( sum,prod ); } if (theta != Flt0) { prod=Fmul(Fgauss(),theta); sum=Fadd( sum,prod ); } n->Nsum=sum; } }
static flt mean_sq_input(neurone *n) { synapse *s; flt sum, nbre; Fclr(sum); Fclr(nbre); for ( s=n->FSamont; s!=NIL; s=s->NSaval ) { flt x = s->Namont->Nval; sum = Fadd( sum, Fmul(x,x) ); nbre=Fadd(nbre,Flt1); }; if (nbre>Flt0) return Fdiv(sum,nbre); else return Flt0; }
/* returns the length of the weight-change of a cell */ static flt delta_sqr_norm(neurone *n, int *fan) { synapse *s; flt sum; Fclr(sum); for ( s=n->FSamont; s!=NIL; s=s->NSaval ) { (*fan)++; sum = Fadd(sum, Fmul(s->Sdelta, s->Sdelta)); } return sum; }
static void updN_inhibition(neurone *n) { synapse *s; flt sum,prod; Fclr(sum); for (s=n->FSamont; s!=NIL; s=s->NSaval) if ( Fsgn(s->Sval) < 0 ) { prod = Fmul( s->Sval, s->Namont->Nval ); sum = Fadd( sum,prod ); }; n->Nspare2=sum; }
/* returns the average of the epsilons of the pre-synaptic weights */ static flt averagesyneps(neurone *n) { synapse *s; flt sum; int num; Fclr(sum); num=0; for ( s=n->FSamont; s!=NIL; s=s->NSaval ) { num++; sum = Fadd(sum, s->Sepsilon); } if (num>0) return Fdiv(sum,InttoF(num)); else return Flt0; }
/* functions to compute and * use the inverse diag hessian * in iterative and/or batch mode */ void clear_hess(weight *nptr) { int iend; weight *wei; int i; if (nptr==NULL) { wei=weightbase; iend=weightnombre; } else { wei=nptr; iend=1; } for ( i=0; i<iend; i++,wei++ ) { Fclr(wei->Whess); } }
static void updN_deltastate(neurone *n) { #ifndef NONEURTYPE if (n->type && n->type->updN_deltastate) { (*n->type->updN_deltastate)(n); } else #endif { synapse *s; flt sum,prod; Fclr(sum); for ( s=n->FSamont; s!=NIL; s=s->NSaval ) { prod = Fmul( s->Sval, s->Namont->Ngrad ); sum = Fadd( sum, prod ); prod = Fmul( s->Sdelta, s->Namont->Nval ); sum = Fadd( sum, prod ); } n->Ngrad = Fmul(sum, CALLDNLF(n->Nsum) ); } }