
/*
 * Copyright (1987) Jeff Elman.  University of California, San Diego
 * This software may be redistributed without charge; this notice
 * should be preserved.
 */


#include <math.h>
#include "defs.h"
/*
 * delta.c
 *
 * compute deltas
 */

float	global_error;		/* store global error */

delta_out(outp, outsize, tarp, outdeltap)
	register float *outp;
	register int outsize;
	register float *tarp;
	register float *outdeltap;
{
	extern	int linflag;
	extern	int bipolar;
	register int i;
	register float out;
	register float diff;

	global_error = 0;
	for (i=0; i<outsize; i++) {
		out = *outp;
		diff = (*tarp - out);
		if (*tarp <= -999999999.0)
			diff = 0.0;
		if (linflag == NONLINEAR) {
		if (bipolar==0)
			*outdeltap = diff * out * (1. - out);
		else
			*outdeltap = .5 * diff * (1. + out) * (1. - out);
		} else if (linflag == LINEAR) {
			*outdeltap = diff;
		}
		global_error += diff*diff;
		outdeltap++;
		outp++;
		tarp++;
	}
}

delta(t_size, t_deltap, t_weightp, b_actp, b_size, b_deltap)
	register int t_size;
	register float *t_deltap;
	register float *t_weightp;
	register float *b_actp;
	register int b_size;
	float	*b_deltap;
{
	register float tmp;
	register float *tdp;
	register int t;
	register int b;

	extern   int bipolar;

	for (b=0; b<b_size; b++) {
		tmp = 0;
		for (t=0, tdp=t_deltap; t<t_size; t++, tdp++) {
			tmp += *tdp * *(t_weightp + (t*b_size) + b);
		}
		if (bipolar==0)
			*b_deltap = (1.-*b_actp) * *b_actp  * tmp;
		else
			*b_deltap = .5 * (1. - *b_actp) * (1. + *b_actp) * tmp;
		b_deltap++;
		b_actp++;
	}
}
