/*--------------------------------------------------------------------------
   Author: Thomas Nowotny
  
   Institute: Institute for Nonlinear Dynamics
              University of California San Diego
              La Jolla, CA 92093-0402
  
   email to:  tnowotny@ucsd.edu
  
   initial version: 2002-02-27
  
--------------------------------------------------------------------------*/


#ifndef CN_MULTIFIRE_INPUTNEURON_CC
#define CN_MULTIFIRE_INPUTNEURON_CC

#include "CN_multifire_inputneuron.h"
#include "CN_inputneuron.cc"

multifire_inputneuron::multifire_inputneuron(int inlabel, vector<int> inpos,
					     double *inp= INPUT_p):
  inputneuron(inlabel, MF_I_IVARNO, MULTIFIRE_INPUTNEURON, inpos,
	      inp, MF_I_PNO)
{
  theE= p[2];
  t_last= -1.0;
}

multifire_inputneuron::~multifire_inputneuron()
{
}

double multifire_inputneuron::E(double *x)
{
  if (x[0] != t_last) {
    theE= p[2];
    if (fno > 0) {
      red_tx= x[0] - ((int) (x[0]/p[4]))*p[4];
      for (int i= 0; i < fno; i++)
      {
	if (((red_tx >= tb[i]) && (red_tx < te[i]))
	    || ((te[i] < tb[i]) && ((red_tx > tb[i]) || (red_tx < te[i]))))
	{
	  if ((te[i] < tb[i]) && (red_tx < te[i]))
	    red_tx+= p[4];
	  red_tx= red_tx - tb[i];
	  difft= red_tx - ((int) (red_tx/p[1]))*p[1];
	  if (difft <= p[0]) theE= p[3];
	}
      }
    }
    t_last= x[0];
  }
  return theE;
}

#endif