STDP promotes synchrony of inhibitory networks in the presence of heterogeneity (Talathi et al 2008)

 Download zip file 
Help downloading and running models
Accession:119159
"Recently Haas et al. (J Neurophysiol 96: 3305–3313, 2006), observed a novel form of spike timing dependent plasticity (iSTDP) in GABAergic synaptic couplings in layer II of the entorhinal cortex. Depending on the relative timings of the presynaptic input at time tpre and the postsynaptic excitation at time tpost, the synapse is strengthened (delta_t = t(post) - t(pre) > 0) or weakened (delta_t < 0). The temporal dynamic range of the observed STDP rule was found to lie in the higher gamma frequency band (> or = 40 Hz), a frequency range important for several vital neuronal tasks. In this paper we study the function of this novel form of iSTDP in the synchronization of the inhibitory neuronal network. In particular we consider a network of two unidirectionally coupled interneurons (UCI) and two mutually coupled interneurons (MCI), in the presence of heterogeneity in the intrinsic firing rates of each coupled neuron. ..."
Reference:
1 . Talathi SS, Hwang DU, Ditto WL (2008) Spike timing dependent plasticity promotes synchrony of inhibitory networks in the presence of heterogeneity. J Comput Neurosci 25:262-81 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Entorhinal cortex;
Cell Type(s):
Channel(s): I Na,t; I K;
Gap Junctions:
Receptor(s): GabaA; Gaba;
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program;
Model Concept(s): STDP;
Implementer(s): Talathi Sachin [talathi at ufl.edu];
Search NeuronDB for information about:  GabaA; Gaba; I Na,t; I K;
/
TalathiEtAl2008
simul_lrn
CNlib
CVS
readme *
CN_absynapse.cc *
CN_absynapse.h *
CN_absynapseECplast1.cc *
CN_absynapseECplast1.h *
CN_absynapseECplast2.cc *
CN_absynapseECplast2.h *
CN_absynapseECplast3.cc *
CN_absynapseECplast3.h *
CN_DCInput.cc *
CN_DCInput.h *
CN_ECneuron.cc *
CN_ECneuron.h *
CN_HHneuron.cc *
CN_HHneuron.h *
CN_inputneuron.cc *
CN_inputneuron.h *
CN_LPneuronAstrid.cc *
CN_LPneuronAstrid.h *
CN_LPneuronRafi4.cc *
CN_LPneuronRafi4.h *
CN_multifire_inputneuron.cc *
CN_multifire_inputneuron.h *
CN_neuron.cc *
CN_neuron.h *
CN_NeuronModel.cc *
CN_NeuronModel.h *
CN_Poissonneuron.cc *
CN_Poissonneuron.h *
CN_Rallsynapse.cc *
CN_Rallsynapse.h *
CN_rk65n.cc *
CN_rk65n.h *
CN_synapse.cc *
CN_synapse.h *
CN_synapseAstrid.cc *
CN_synapseAstrid.h *
CN_TimeNeuron.cc *
CN_TimeNeuron.h *
CN_Valneuron.cc *
CN_Valneuron.h *
CN_Valneuron2.cc *
CN_Valneuron2.h *
ids.h *
Makefile *
testCN *
testCN.cc *
                            
/*--------------------------------------------------------------------------
   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: 2005-08-17
  
--------------------------------------------------------------------------*/

#ifndef CN_RK65N_CC
#define CN_RK65N_CC

#include "CN_rk65n.h"
#include <iostream>

#define min(X,Y) (X<Y? X:Y)
#define max(X,Y) (X>Y? X:Y)

#define sixth 0.166666666666667


rk65n::rk65n(int dim, double inmaxdt, double ineps, double inabseps,
	     double inreleps)
{
  N= dim;
  maxdt= inmaxdt;
  eps= ineps;
  abseps= inabseps;
  releps= inreleps;
  for (int i= 0; i < 9; i++) {
    Y[i]= new double[N];
    F[i]= new double[N];
    for (int j= i; j < 8; j++) {
      a[i][j]= 0.0;
    }
  }
  y5= new double[N];
  
  a[1][0]= 0.111111111111111;
  a[2][0]= 0.555555555555556e-1;
  a[2][1]= 0.555555555555556e-1;
  a[3][0]= 0.416666666666667e-1;
  a[3][1]= 0.0;
  a[3][2]= 0.125;
  a[4][0]= 0.166666666666667;
  a[4][1]= 0.0;
  a[4][2]= -0.5;
  a[4][3]= 0.666666666666667;
  a[5][0]= 0.1875e+1;
  a[5][1]= 0.0;
  a[5][2]= -0.7875e+1;
  a[5][3]= 0.7e+1;
  a[5][4]= -0.5;
  a[6][0]= -0.4227272727272727e+1;
  a[6][1]= 0.0;
  a[6][2]= 0.176995738636364e+2;
  a[6][3]= -0.142883522727273e+2;
  a[6][4]= 0.522017045454545;
  a[6][5]= 0.104403409090909e+1;
  a[7][0]= 0.840622673179752e+1;
  a[7][1]= 0.0;
  a[7][2]= -0.337303717185049e+2;
  a[7][3]= 0.271460231129622e+2;
  a[7][4]= 0.342046929709216;
  a[7][5]= -0.184653767923258e+1;
  a[7][6]= 0.577349465373733;
  a[8][0]= 0.128104575163399;
  a[8][1]= 0.0;
  a[8][2]= 0.0;
  a[8][3]= -0.108433734939759;
  a[8][4]= 0.669375;
  a[8][5]= -0.146666666666667;
  a[8][6]= 0.284444444444444;
  a[8][7]= 0.173176381998583;

  b[0]= 0.567119155354449e-1;
  b[1]= 0.0;
  b[2]= 0.0;
  b[3]= 0.210909572355356;
  b[4]= 0.141490384615385;
  b[5]= 0.202051282051282;
  b[6]= 0.253186813186813;
  b[7]= 0.843679809736684e-1;
  b[8]= 0.512820512820513e-1;
}

double rk65n::integrate(double *y, double *yn,
			NeuronModel *model, double dt)
{
  // calculate iterative terms rk65_Y[__i] and rk65_F[__i] (to sixth order)
  for (i= 0; i < 9; i++)
  {
    for (k= 0; k < N; k++)
    {
      aF= 0.0;
      for (j= 0; j < i; j++)
	aF+= a[i][j]*F[j][k];
      Y[i][k]= y[k]+dt*aF;
    }
    model->derivative(Y[i], F[i]);
  }

  // sum up rk65_Y[__i] and rk65_F[__i] to build 5th order scheme -> rk65_y5
  for (k= 0; k < N; k++)
  {
    aF= 0.0;
    for (j= 0; j < 8; j++) aF+= a[8][j]*F[j][k];
    y5[k]= y[k]+ dt*aF;
  }

  // sum up rk65_Y[__i] and rk65_F[__i] to build 6th order scheme -> yn
  for (k= 0; k < N; k++)
  {
    aF= 0.0;
    for (j= 0; j < 9; j++) aF+= b[j]*F[j][k];
    yn[k]= y[k]+ dt*aF;
  }

  // determine minimal necessary new dt to get error < theEps based on the
  // difference between results rk65_y5 and yn
  dtx= maxdt;
#ifdef DEBUG
  int min_var= -1;
#endif
  for (k= 0; k < N; k++)
  {
    theEps= max(abseps, min(eps, fabs(releps*yn[k])));
    delta= fabs(yn[k]-y5[k]);
    if (delta > 0.0) {
      newdt= exp(sixth*log(theEps/delta))*dt;
      if (newdt < dtx) {
#ifdef DEBUG
	min_var= k;
#endif
	dtx= newdt;
      }
    }
  }
#ifdef DEBUG
  cerr << min_var << " " << dtx << endl;
#endif
  return dtx;
}

#undef min
#undef max

#endif