#include <stdio.h>

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



update_weight(t_size, t_deltap, t_weightp, d_weightp, i_weightp, t_biasp, d_biasp, i_biasp, b_actp, b_size)
	int	t_size;
	register float *t_deltap;
	register float *t_weightp;
	register float *d_weightp;
	register float *i_weightp;
	float	*t_biasp;
	float	*d_biasp;
	float	*i_biasp;
	float	*b_actp;
	int	b_size;
{
	extern	float rate;
	extern	float momentum;
	extern	int nobias;
	extern	int update;
	extern	int updatenow;
	register float *bap;
	register float *endp;
	register float r_rate = rate;
	register float dp_rate;
	register int t;

	endp = b_actp + b_size;
	for (t=0; t<t_size; t++) {
		bap = b_actp;
		dp_rate = *t_deltap++ * r_rate;
		while (bap < endp) {
		    if (update == 0){ /* update after each sweep */
			*d_weightp = *bap++ * dp_rate + momentum * *d_weightp;
			*t_weightp++ += *d_weightp++;
		    } else if (update == 1){ /* update after each epoch */
			if (updatenow == 0){
			    *i_weightp++ += *bap++ * dp_rate;
			    t_weightp++;
			    d_weightp++;
			}
			else {
			    *i_weightp += *bap++ * dp_rate;
			    *d_weightp = *i_weightp + momentum * *d_weightp;
			    *t_weightp++ += *d_weightp++;
			    *i_weightp++ = 0.;
			}
		    }
			/*
			*t_weightp++ += *bap++ * dp_rate;
			*/
		}
		/*
		 * if nobias==0, then we do calculate biases
		 */
		if (nobias==0){
		    if (update == 0){ /* update after each sweep */
			*d_biasp = dp_rate + momentum * *d_biasp;
			*t_biasp++ += *d_biasp++;
		    } else if (update == 1){ /*update after each epoch */
			if (updatenow == 0){
			    *i_biasp++ += dp_rate;
			    t_biasp++;
			    d_biasp++;
			}
			else {
			    *i_biasp += dp_rate;
			    *d_biasp = *i_biasp + momentum * *d_biasp;
			    *t_biasp++ += *d_biasp++;
			    *i_biasp++ = 0.;
			}
		    }
			/*
			*t_biasp++ += dp_rate;
			*/
		}
	}
}

#ifdef oldcode
	r_rate = rate;
	for (t=0; t<t_size; t++) {
		for (endp=b_actp+b_size, bap=b_actp; bap<endp; bap++) {
			*t_weightp += *t_deltap * *bap * r_rate;
			t_weightp++;
		}
		*t_biasp += *t_deltap * r_rate;
		t_biasp++;
		t_deltap++;
	}
#endif
