/*
 *  $Id: NetFeedForward.c 1.6 1995/03/21 10:52:01 projects Exp $
 *
 *	Function	NetFeedForward
 *	Programmer	Nicholas d'Alterio
 *			Gideon Denby
 *	Date		20/02/95
 *
 *  Synopsis:	This function feeds forwards an input vectors through n layers
 *		containing n nodes. On each layer before the output layer
 *  		there is one bias node.
 *
 *  NOTE	Assumes fully connected net.
 *
 *  $Log: NetFeedForward.c $
 * Revision 1.6  1995/03/21  10:52:01  projects
 * Made code more readable
 *
 * Revision 1.5  1995/03/20  23:38:00  daltern
 * Added gain factor
 *
 * Revision 1.4  1995/03/20  22:37:38  daltern
 * Updated to correct transfer function
 *
 * Revision 1.3  1995/03/14  23:21:12  daltern
 * Commented and cleaned up
 *
 *
 */

#include "Neural.h"

void NetFeedForward( float ***Weight, float **Node, NET netI, float gain ) 

 {


  register int layer, s_node, e_node;

  int nodes_in_layer;
  int nodes_in_prev_layer;

  float	val;

/*
 *  Loop over each layer above inputs.
 */

  for ( layer = 1;layer < netI.NumLayers; layer++ ) {

	nodes_in_layer      = netI.LayerSize[layer]+1;
	nodes_in_prev_layer = netI.LayerSize[layer-1]+1;

/*
 *  For each element in layer sum inputs * weight coming to it.
 */

	for ( e_node=1; e_node < nodes_in_layer; e_node++ ) {

/*
 *  Loop for each node on previous layer including the bias node.
 */

		val = 0.0;
		for ( s_node = 0; s_node < nodes_in_prev_layer; s_node++ ) {

			val+=Node[layer-1][s_node]*Weight[layer-1][s_node][e_node];

		}   /* end for s_node */

/*
 *  Use transfer function to calculate the output of node based on 
 *  sum of inputs * weights.
 */

		Node[layer][e_node] = NetTransFunc( val, gain );

	}   /* end for e_node */

  }   /* end for layer */

  return;

 }   /* end function NetFeedForward */

