00001 
00005 #include "aEIFNeuron.h"
00006 
00007 #include <cmath>
00008 #include <iostream>
00009 using std::cout;
00010 using std::endl;
00011 
00012 
00014 
00016 
00017 ThreadSpecificRandomDistribution< NormalDistribution > aEIFNeuronBase::white_noise;
00018 
00019 
00020 aEIFNeuronBase::aEIFNeuronBase(double a, double b, double Vt, double Vr,  double El, double gl,
00021     double Cm, double tau_w, double slope, double Vpeak, double Vinit, double Inoise, double Iinject)
00022     : a(a), b(b), Vt(Vt), Vr(Vr), El(El), gl(gl), Cm(Cm), tau_w(tau_w), slope(slope)
00023     , Vpeak(Vpeak), Vinit(Vinit), Inoise(Inoise), Iinject(Iinject), w(0.0), Isyn(0.0)
00024 {
00025 }
00026 
00027 
00028 int aEIFNeuronBase::advance(AdvanceInfo const &ai)
00029 {
00030     bool register hasFired = false;
00031 
00032     if (Vm >= Vpeak)
00033         Vm = Vr;
00034 
00035     double V=Vm;
00036 
00037     
00038     double Itot = Isyn + Iinject;
00039 
00040     if (Inoise > 0.0) {
00041         Itot += (white_noise() * Inoise);
00042 
00043 
00044     }
00045 
00046     Vm = V + _dt*1/Cm*(-gl*(V-El) + gl*slope*exp((V-Vt)/slope) - w + Itot);
00047     w = w + _dt*1/tau_w*(a*(V-El) - w);
00048 
00049     if (Vm >= Vpeak) {         
00050         Vm = 50e-3;
00051         w = w + b;
00052         hasFired = true;
00053     }
00054 
00055     
00056     clearSynapticInput();
00057 
00058     if (hasFired) {
00059         out_port.setSpike(ai);
00060         return ADVANCEFLAG_HASSPIKED;
00061     }
00062 
00063     return 0;
00064 }
00065 
00066 
00067 inline void aEIFNeuronBase::clearSynapticInput(void)
00068 {
00069     Isyn = 0.0;
00070 }
00071 
00072 
00073 int aEIFNeuronBase::adjust(double dt)
00074 {
00075     _dt = dt;
00076 
00077 
00078     clearSynapticInput();
00079 
00080     return 0;
00081 }
00082 
00083 
00084 int aEIFNeuronBase::reset(double dt)
00085 {
00086     SingleOutputSpikeSender::reset();
00087 
00088     Vm = Vinit;     
00089     w = 0.0;
00090     clearSynapticInput();
00091     adjust(dt);
00092 
00093     return 0;
00094 }
00095 
00096 
00097 
00099 
00101 
00102 aEIFNeuron::aEIFNeuron(double a, double b, double Vt, double Vr, double El, double gl, 
00103     double Cm, double tau_w, double slope, double Vpeak, double Vinit, double Inoise, double Iinject)
00104     : aEIFNeuronBase(a, b, Vt, Vr, El, gl, Cm, tau_w, slope, Vpeak, Vinit, Inoise, Iinject)
00105 {
00106 }
00107 
00108 
00109 inline void aEIFNeuron::currentInput(double i)
00110 {
00111     Isyn += i;
00112 }
00113 
00114 
00115 
00117 
00119 
00120 CbaEIFNeuron::CbaEIFNeuron(double a, double b, double Vt, double Vr, double El, double gl, 
00121     double Cm, double tau_w, double slope, double Vpeak, double Vinit, double Inoise, double Iinject)
00122     : aEIFNeuronBase(a, b, Vt, Vr, El, gl, Cm, tau_w, slope, Vpeak, Vinit, Inoise, Iinject)
00123 {
00124 }
00125 
00126 inline void CbaEIFNeuron::currentInput(double i)
00127 {
00128     Isyn += i;
00129 }
00130 
00131 
00132 inline void CbaEIFNeuron::conductanceInput(double g, double Erev)
00133 {
00134     Isyn += g*(Erev-Vm);
00135 }