#include "AnT.hpp"

#define kappa   parameters[0]
#define beta    parameters[1]
#define a12     parameters[2]
#define a21     parameters[3]
#define taus    parameters[4]
#define tau1    parameters[5]
#define tau2    parameters[6]

#define X1      currentState[0][0]
#define X1_ts   currentState[-tsi][0]
#define X1_t1   currentState[-t1i][0]
#define X2      currentState[0][1]
#define X2_ts   currentState[-tsi][1]
#define X2_t2   currentState[-t2i][1]

bool nnfde (const Subarray<CyclicArray<Array<real_t> > >& currentState,
	    const Array<real_t>& parameters,
	    const real_t deltaT,
	    Array<real_t>& rhs)

{
  long delayIntervalSize = currentState.getTotalSize ();
  real_t maxDelay = deltaT * (delayIntervalSize - 1);
  long tsi = (long) ((taus/maxDelay) *((real_t) delayIntervalSize - 1));
  long t1i = (long) ((tau1/maxDelay) *((real_t) delayIntervalSize - 1));
  long t2i = (long) ((tau2/maxDelay) *((real_t) delayIntervalSize - 1));

  rhs[0] = - kappa * X1 + beta * tanh(X1_ts) + a12 * tanh(X2_t2);
  rhs[1] = - kappa * X2 + beta * tanh(X2_ts) + a21 * tanh(X1_t1);

  return true;
}

#undef kappa
#undef beta
#undef a12
#undef a21
#undef taus
#undef tau1
#undef tau2

#undef X1
#undef X1_ts
#undef X1_t1
#undef X2
#undef X2_ts
#undef X2_t2

extern "C" { void connectSystem () { FDE_Proxy::systemFunction = nnfde; } }

