#include "sys.hpp" // for libcwd #include "debug.hpp" // for libcwd #include #include // #include #include "layer.hpp" #include "simloop.hpp" #include "libcsim.hpp" #include "spiketrain.hpp" #include // for detecting denormals #include "rng_paraqueue_pool.hpp" //////////////////////////////// layer::layer(int n) :SimElement(seLayer), N(n), NoiseSigma(0), NormPos(false), PoissonLambda(12.5), NoiseAmplitude(0), BalancedInhibition(0), TooManySpikes(false), mSpikeTrain(0) { Name="Layer"; int i; SetRandomSpikeFrequency(1.0); //Hz Binary = true; SpikeFileName = "ospikes"; if (Binary) FileType=".bin"; else FileType=".dat"; RandomInputStrength=20.; Dmax=DMAX; if (MacroTimeStep <=Dmax) { Dout(dc::layer | dc::warning, "MacroTimeStep too low: " << MacroTimeStep); } Dout(dc::layer, "LayerConstructor " << "N=" << N << "TimeStep = " << dt << "ms"); v = new float [N]; u = new float [N]; Input = new float [N]; for (i=0;i \n"; fw << " \n"; // fw << " \n"; // fw << " \n"; // fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; } int layer::WriteSimInfo(fstream &fw, const string &ChildInfo) { stringstream sstr; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << ChildInfo; SimElement::WriteSimInfo(fw, sstr.str()); } const vector& layer::getPositions() { return mPositions; } int layer::SetupPositions() { int i; // calculate neuron positions // default: quadratic (allmost) Ny = int(sqrt(float(N))); Nx = int(ceil(float(N)/float(Ny))); for (i=0;i=0) fwrite(firings[i], 2*sizeof(firings[0][0]), 1, fs); } else { for (i=1;i=0) fprintf(fs, "%d %d\n", firings[i][0], firings[i][1]); } fclose(fs); } else { Dout(dc::layer | dc::fatal, "failed opening file " << CurFileName << " for writing"); } } else { // append spikes to existing file fs = fopen(CurFileName,"a"); if (fs) { if (Binary) { int **temp_firings; int *buffer = new int [2*N_firings]; int count=0; for (i=1;i= 0) { buffer[2*count] = firings[i][0] + sec*MacroTimeStep; buffer[2*count+1] = firings[i][1]; ++count; } } fwrite(buffer, 2*count*sizeof(*buffer), 1, fs); delete[] buffer; } else { for (i=1;i=0) fprintf(fs, "%d %d\n", dt*firings[i][0]+sec*MacroTimeStep, firings[i][1]); } fclose(fs); } else { Dout(dc::layer | dc::fatal, "failed opening file " << CurFileName << " for writing"); } } k=N_firings-1; while (MacroTimeStep-firings[k][0]GetMaximumDelay(); int i,j,k; k=N_firings-1; while (t-firings[k][0]\n", Nx, Ny); for (i=0;iDesiredFrequency) || TooManySpikes) { ChDir=down; if (LastChDir == up) { ChangeFactor *= 0.5; } NoiseAmplitude /= (1+ChangeFactor); } else { ChDir=up; if (LastChDir == down) { ChangeFactor *= 0.5; } NoiseAmplitude *= (1+ChangeFactor); } LastChDir = ChDir; if (TuneTrials++ > MaxTuneTrials) { Stop=true; Dout(dc::layer, "ERROR: unsuccessfully finished noise tuning"); } } } prepare(0); N_firings=1; } int layer::TuneBalancedInhibition(float DesiredFrequency) { int time=0; BalancedInhibition = 0.1; int SettlingTime = int(100./dt); // ms/dt int MeasureTime = int(500./dt); // ms/dt float Tollerance = 0.01; float ChangeFactor=1; const int MaxTuneTrials=100; int TuneTrials=0; bool Stop=false; int MStep=0; enum ChangeDirVal {up, down}; ChangeDirVal ChDir=up; ChangeDirVal LastChDir=up; while (! Stop) { for (int i=0;i MaxTuneTrials) { Stop=true; Dout(dc::layer, "ERROR: unsuccessfully finished BalancedInhibition tuning"); } } } prepare(0); N_firings=1; } SpikeTrain* layer::GetSpikeTrain() { Dout(dc::layer, "layer::GetSpikeTrain()"); if (!mSpikeTrain) { Dout(dc::layer, "created new SpikeTrain object"); return mSpikeTrain=new SpikeTrain(firings, &N_firings, &N, dt); } else { Dout(dc::layer, "returned old SpikeTrain object"); return mSpikeTrain; } } ///////////////////////////// // Konstruktor der Basisklasse muss in der Initialisierungsliste aufgerufen werden liflayer::liflayer( int n, float tau, float thresh, float k0, float k1, float k2, float kffi, float kfbi, float taus, float _InputSat, float _NoiseSigma) : layer(n), TauM(tau), Threshold(thresh), K0(k0), K1(k1), K2(k2), Kffi(kffi), Kfbi(kfbi), TauS(taus), InputSaturation(_InputSat) { NoiseSigma=_NoiseSigma; int i; cout << "Leaky Integrate- and Fire Neuron: K1=" << K1 << " K2=" << K2 << " Kffi=" << Kffi << " Kfbi= " << Kfbi << "\n"; RandomInputStrength=5; TauMfac = dt/TauM; TauSfac = exp(-dt/TauS); LastSpike = new int[N]; for (i=0;irecord(dt*TotalTime, squer[t], mquer[t]); // record potentials for DEBUGing squer[t+InhibitionDelay] += dt*Input[i]; v[i] +=TauMfac*(-v[i] + u[i]); if ((v[i] > Threshold) && (t-LastSpike[i] > 2/dt)) // did it fire? { v[i] -= Threshold; // voltage reset LastSpike[i] = t; firings[N_firings ][0]=t; firings[N_firings++][1]=i; mquer[t+InhibitionDelay] += 1; // Dout(dc::layer, "Mquer increased to " << mquer[t+InhibitionDelay] << ""); if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } u[i] *= TauSfac; } mquer[t+InhibitionDelay+1] = mquer[t+InhibitionDelay]*RunAvgFac; squer[t+InhibitionDelay+1] = squer[t+InhibitionDelay]*RunAvgFac; // Dout(dc::layer, "Squer= " << squer[t] << " Mquer= " << mquer[t] << ""); for (i=0;i= (ThetaPeriod/dt)) ThetaPhase=0; ThetaK2 = K2*(dt*ThetaPhase/ThetaPeriod); } else ThetaK2 = K2; // cout << ThetaK2/K2 << " "; for (i=0;irecord(dt*TotalTime, squer[t], mquer[t]); // record potentials for DEBUGing squer[t+InhibitionDelay] += dt*Input[i]; v[i] +=TauMfac*(-v[i] + u[i]); if ((v[i] > Threshold) && (t-LastSpike[i] > 2/dt)) // did it fire? { v[i] -= Threshold; // voltage reset LastSpike[i] = t; firings[N_firings ][0]=t; firings[N_firings++][1]=i; mquer[t+InhibitionDelay] += 1; // Dout(dc::layer, "Mquer increased to " << mquer[t+InhibitionDelay] << ""); if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } mquer[t+InhibitionDelay+1] = mquer[t+InhibitionDelay]*RunAvgFac; squer[t+InhibitionDelay+1] = squer[t+InhibitionDelay]*RunAvgFac; // Dout(dc::layer, "Squer= " << squer[t] << " Mquer= " << mquer[t] << ""); u[i] *= TauSfac; } for (i=0;i \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << "\n"; fw << " \n"; fw << " \n"; } int izhlayer::WriteSimInfo(fstream &fw, const string &ChildInfo) { stringstream sstr; // sstr << " \n"; sstr << " \n"; sstr << "\n"; sstr << " \n"; sstr << ChildInfo; layer::WriteSimInfo(fw, sstr.str()); } int izhlayer::proceede(int TotalTime) { int t = TotalTime % MacroTimeStep; int i,j,k; for (int i=1;i<=nris;++i) Input[getrandom(N)]= RandomInputStrength; // random thalamic input if (getrandom(1000)< RestProb) Input[getrandom(N)]= RandomInputStrength; // random thalamic input last_N_firings = N_firings; for (i=0;irecord(dt*TotalTime, v[i], Input[i]); v[i] += dt*((0.04 *v[i] + F) * v[i] + E - u[i] + ExSynPot[i]); // v[i] +=dt*0.5*((0.04*v[i]+F)*v[i]+E-u[i]+Input[i]); // for numerical stability // time step is 0.5 ms u[i] += dt * A * (B * v[i] - u[i]); if (v[i]>=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;irecord(dt*TotalTime, u[RecNum], Input[RecNum]); if (BinRec) BinRec->record(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;irecord(dt*TotalTime, u[RecNum], Input[RecNum]); if (BinRec) BinRec->record(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;irecord(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;irecord(dt*TotalTime, u[RecNum], Input[RecNum]); if (BinRec) BinRec->record(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;irecord(dt*TotalTime, u[RecNum], Input[RecNum]); if (BinRec) BinRec->record(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;i \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; fw << " \n"; } int izh6layer::StartBinRec(int nobserve, int NNumber) { int NumObserve = 4*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;i 3Hz f�r IzhIntegrator InhReversePot = EquilibriumPot-IRPotDiff; // default: Ruhepot - 10 mV Dout(dc::layer, "izh7layer::izh7layer"); // use arrays from izhlayer AmpaFallPot = ExSynPot; GabaFallPot = InhSynPot; NmdaRisePot = new float [N]; NmdaFallPot = new float [N]; AmpaRisePot = new float [N]; GabaRisePot = new float [N]; InhInput = new float [N]; NmdaAmpaInput = new float [N]; // initialize arrays with zero for (int i=0;irecord(dt*TotalTime, u[RecNum], Input[RecNum]); if (BinRec) BinRec->record(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;i \n"; sstr << " \n"; sstr << " \n"; layer::WriteSimInfo(fw, sstr.str()); } int izh7layer::StartBinRec(int nobserve, int NNumber) { int NumObserve = 7*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;i 3Hz f�r IzhIntegrator InhReversePot = EquilibriumPot-IRPotDiff; // default: Ruhepot - 10 mV Dout(dc::layer, "izh8layer::izh8layer"); // use arrays from izhlayer AmpaPot = ExSynPot; GabaFallPot = InhSynPot; NmdaRisePot = new float [N]; NmdaFallPot = new float [N]; AmpaRisePot = new float [N]; AmpaFallPot = new float [N]; GabaRisePot = new float [N]; InhInput = new float [N]; NmdaAmpaInput = new float [N]; // initialize arrays with zero for (int i=0;irecord(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;i \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; izhlayer::WriteSimInfo(fw, sstr.str()); } int izh8layer::StartBinRec(int nobserve, int NNumber) { int NumObserve = 7*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;irecord(); for (i=0;i=30) // did it fire? { // Dout(dc::layer, N_firings << "spike"); fflush(stdout); v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } for (i=0;i \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; izhlayer::WriteSimInfo(fw, sstr.str()); } int izh9layer::StartBinRec(int nobserve, int NNumber) { int NumObserve = 9*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;irecord(dt*TotalTime, v[i], Iinh); squer[t+InhibitionDelay] += dt*Input[i]; // running average of external input v[i] +=dt*((0.04*v[i]+F)*v[i]+E-u[i]+ tmpinp); u[i] +=A*(B*v[i]-u[i]); if (v[i]>=30) // did it fire? { v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; mquer[t+InhibitionDelay] += 1; // running average of layer activity if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } mquer[t+InhibitionDelay+1] = mquer[t+InhibitionDelay]*RunAvgFac; squer[t+InhibitionDelay+1] = squer[t+InhibitionDelay]*RunAvgFac; for (i=0;irecord(dt*TotalTime, v[i], PresynInhInput[i]); squer[t+InhibitionDelay] += dt*Input[i]; // running average of external input v[i] +=dt*((0.04*v[i]+F)*v[i]+E-u[i]+ tmpinp); u[i] +=A*(B*v[i]-u[i]); if (v[i]>=30) // did it fire? { v[i] = C; // voltage reset u[i]+= D; // recovery variable reset firings[N_firings ][0]=t; firings[N_firings++][1]=i; mquer[t+InhibitionDelay] += 1; // running average of layer activity if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } mquer[t+InhibitionDelay+1] = mquer[t+InhibitionDelay]*RunAvgFac; squer[t+InhibitionDelay+1] = squer[t+InhibitionDelay]*RunAvgFac; for (i=0;irecord(dt*TotalTime, mquer[t], Dinh[i]); squer[t+InhibitionDelay] += dt*Input[i]; v[i] +=TauMfac*(-v[i] + u[i]); if ((v[i] > Threshold) && (t-LastSpike[i] > 2/dt)) // did it fire? { v[i] -= Threshold; // voltage reset LastSpike[i] = t; firings[N_firings ][0]=t; firings[N_firings++][1]=i; mquer[t+InhibitionDelay] += 1; InhibitoryActivity[t+InhibitionDelay] += Dinh[i]; if (learnpti) Dinh[i] += PyrToInhLearningRate*(mquer[t+InhibitionDelay-1]-DesiredActivity); // cout << PyrToInhLearningRate*(mquer[t+InhibitionDelay-1]-DesiredActivity) << " "; // Dout(dc::layer, "Mquer increased to " << mquer[t+InhibitionDelay] << ""); if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } mquer[t+InhibitionDelay+1] = mquer[t+InhibitionDelay]*RunAvgFac; squer[t+InhibitionDelay+1] = squer[t+InhibitionDelay]*RunAvgFac; InhibitoryActivity[t+InhibitionDelay+1] = InhibitoryActivity[t+InhibitionDelay]*InhLearnFac; // Dout(dc::layer, "Squer= " << squer[t] << " Mquer= " << mquer[t] << ""); u[i] *= TauSfac; } for (i=0;irecord(); for (i=0;irecord(dt*TotalTime, v[i], u[i]); if (v[i]>=RestingThreshold + u[i]) // did it fire? { u[i] += ThresInc; firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } // for (i=0;irecord(); for (i=0;irecord(dt*TotalTime, v[i], u[i]); if ((v[i]-inh[i])>=RestingThreshold + u[i]) // did it fire? { u[i] += ThresInc; firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } } /////////////////////////////////////// ///////////////////////////////// MMN03Layer::MMN03Layer(int n, float _TauThres, float _RestingThres, float _ThresInc, float _TauFeeding, float _TauInhibition, float _TauLinking): MMN02Layer(n, _TauThres, _RestingThres, _ThresInc, _TauFeeding, _TauInhibition), TauLinking(_TauLinking) { Dout(dc::layer, "MMN03Layer::MMN03Layer, n=" << n << ""); fflush(stdout); LinkingFac = exp(-dt/_TauLinking); Linking = new float [N]; for (int i=0;i \n"; sstr << " \n"; layer::WriteSimInfo(fw, sstr.str()); } int MMN03Layer::StartBinRec(int nobserve, int StartNumber) { int NumObserve = 4*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;irecord(); for (i=0;i=RestingThreshold + u[i]) //did it fire? { u[i] += ThresInc; firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } } int MMN03Layer::reset(int TotalTime) { int t = TotalTime % MacroTimeStep; for (int i=0;iGetMaximumDelay(); int k=N_firings-1; while (t-firings[k][0] \n"; sstr << " \n"; sstr << " \n"; layer::WriteSimInfo(fw, sstr.str()); } int MMN04Layer::StartBinRec(int nobserve, int StartNumber) { int NumObserve = 4*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;irecord(); for (i=0;i=RestingThreshold + u[i]) //did it fire? if (((3*Linking[i]*2*v[i])+endu[i]+v_Self[i]-inh[i]+gsl_ran_gaussian(gslr,NoiseSigma)) >=RestingThreshold + u[i]) //did it fire? { u[i] += ThresInc; firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } } int MMN04Layer::reset(int TotalTime) { int t = TotalTime % MacroTimeStep; for (int i=0;iGetMaximumDelay(); int k=N_firings-1; while (t-firings[k][0] \n"; sstr << " \n"; sstr << " \n"; layer::WriteSimInfo(fw, sstr.str()); } int MMN05Layer::StartBinRec(int nobserve, int StartNumber) { int NumObserve = 4*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;irecord(); for (i=0;i=RestingThreshold + u[i]) //did it fire? if ((1+Linking[i])*(v[i]+endu[i]+v_Self[i]-inh[i])+gsl_ran_gaussian(gslr,NoiseSigma) >=RestingThreshold + u[i]) //did it fire? { u[i] += ThresInc; firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } } int MMN05Layer::reset(int TotalTime) { int t = TotalTime % MacroTimeStep; for (int i=0;iGetMaximumDelay(); int k=N_firings-1; while (t-firings[k][0]GetDeltaT(); SetTauNmda(TauNmdaRise, TauNmdaFall); SetTauAmpa(TauAmpaRise, TauAmpaFall); SetTauGabaA(TauGabaARise, TauGabaAFall); SetTauGabaB(TauGabaBRise, TauGabaBFall); // initialize arrays AmpaRisePot = new float [N]; AmpaFallPot = new float [N]; AmpaPot = new float [N]; NmdaRisePot = new float [N]; NmdaFallPot = new float [N]; GabaARisePot = new float [N]; GabaAFallPot = new float [N]; GabaBRisePot = new float [N]; GabaBFallPot = new float [N]; InhInput = new float [N]; NmdaAmpaInput = new float [N]; for (int i=0;i // R = IAmpa(voltage)*ratio / INmda(voltage) NmdaAmpaEPSPRatio=ratio; float voltage = 60; // mV float NaRevPot = 0; //mV float AmpaCurrent = NaRevPot-voltage; // if conductance gAmpa == 1 float NmdaCurrent = INmda(voltage); NmdaAmpaRatio = AmpaCurrent*NmdaAmpaEPSPRatio/NmdaCurrent; } void AmpaNmdaGabaChannels::WriteSimInfo(stringstream &sstr) { sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; } ///////////////////////////// DecoLifLayer::DecoLifLayer(int n, DecoParas Paras): layer(n), AmpaNmdaGabaChannels(n), RestingPot(Paras.RestingPot), ResetPot(Paras.ResetPot), Threshold(Paras.Threshold), CMembrane(Paras.CMembrane), GLeak(Paras.GLeak), AbsoluteRefractoryPeriod(Paras.AbsoluteRefractoryPeriod), SpikePot(Paras.SpikePot) { Refractory = new int [N]; for (int i=0;igetRngQueue(kRngPoisson, PoissonLambda,10,2000); #endif //USE_RNG_THREAD } DecoLifLayer::~DecoLifLayer() { delete [] Refractory; } int DecoLifLayer::WriteSimInfo(fstream &fw) { stringstream sstr; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; sstr << " \n"; AmpaNmdaGabaChannels::WriteSimInfo(sstr); layer::WriteSimInfo(fw, sstr.str()); } int DecoLifLayer::proceede(int TotalTime) { int t = TotalTime % MacroTimeStep; int i,j,k; last_N_firings = N_firings; if (BinRec) BinRec->record(); for (i=0;igetRandomNumber(); #else // use no thread for rng Input[i] += NoiseAmplitude*gsl_ran_poisson(gslr, PoissonLambda); #endif //USE_RNG_THREAD Input[i] += NmdaAmpaInput[i]; Input[i] *= AmpaCorr; InhInput[i] *= GabaACorr; NmdaAmpaInput[i] *= NmdaCorr; AmpaRisePot[i] += Input[i]; AmpaFallPot[i] += Input[i]; NmdaRisePot[i] += NmdaAmpaRatio*NmdaAmpaInput[i]; NmdaFallPot[i] += NmdaAmpaRatio*NmdaAmpaInput[i]; GabaARisePot[i] += InhInput[i]; GabaAFallPot[i] += InhInput[i]; GabaBRisePot[i] +=GabaABRatio*InhInput[i]; GabaBFallPot[i] += GabaABRatio*InhInput[i]; // if (i == 0) cerr << "Nmda=" << NmdaRisePot[i] << " " << NmdaFallPot[i] << "\n"; // InhSynPot[i] += abs(gsl_ran_gaussian(gslr, NoiseSigma)); AmpaPot[i] = AmpaFallPot[i] - AmpaRisePot[i]; float Nmda = NmdaFallPot[i] - NmdaRisePot[i]; float GabaA = GabaAFallPot[i] - GabaARisePot[i]; float GabaB = GabaBFallPot[i] - GabaBRisePot[i]; v[i] += CMembraneFac*(-GLeak*(v[i]-RestingPot) - AmpaPot[i]*(v[i]-NaReversePot) + INmda(v[i])*Nmda - (v[i]-GabaAReversePot)*(GabaA+BalancedInhibition) - (v[i]-GabaBReversePot)*GabaB ); if (Refractory[i]>0) { --Refractory[i]; v[i] = ResetPot; // voltage reset } else { if (v[i]>=Threshold) { // did it fire? // if (i == 0) cerr << N_firings << "spike\n"; fflush(stdout); // v[i] = ResetPot; // voltage reset v[i] = SpikePot; // fake spike for LIF Neuron Refractory[i] = arf; firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } } for (i=0;i::min( )) cerr << "PERFORMANCE-WARNING: denormal floating point number\n"; } } int DecoLifLayer::proceedeInThread(int TotalTime) { int t = TotalTime % MacroTimeStep; } int DecoLifLayer::calculateInThread(int Start_Index, int Stop_Index) { int i,j,k; last_N_firings = N_firings; if (BinRec) BinRec->record(); for (i=Start_Index;i0) { --Refractory[i]; v[i] = ResetPot; // voltage reset } else { if (v[i]>=Threshold) { // did it fire? // if (i == 0) cerr << N_firings << "spike\n"; fflush(stdout); // v[i] = ResetPot; // voltage reset v[i] = SpikePot; // fake spike for LIF Neuron Refractory[i] = arf; // MUTEX for protecting firings!! firings[N_firings ][0]=t; firings[N_firings++][1]=i; if (N_firings == N_firings_max) { ThrowTooManySpikes(t); } } } } for (i=Start_Index;iGetMaximumDelay(); int k=N_firings-1; while (t-firings[k][0]record(); for (int i=0;iSpikeDetectionThreshold) && (!alreadySpiked[i])) { firings[N_firings ][0]=t; firings[N_firings++][1]=i; alreadySpiked[i]=true; } if (alreadySpiked[i] && M[i]*parapointer)[i]=paras[i]; if (parapointer==&HodgHuxLayer::nParas) cout<<"n "; if (parapointer==&HodgHuxLayer::mParas) cout<<"m "; if (parapointer==&HodgHuxLayer::hParas) cout<<"h "; Dout(dc::layer, paras[0]<<" "<*parapointer)[0]<<" "<<(this->*parapointer)[1]<<" "<<(this->*parapointer)[2]<<" "<<(this->*parapointer)[3]<<" "<<(this->*parapointer)[4]<<" "<<(this->*parapointer)[5]); } int HodgHuxLayer::M2index(float m) { int zwischen=(int)( (m-Mmin)/(Mmax-Mmin)*MN ); //Dout(dc::layer, "Angang von M2index. m="<Mmax) { //Dout(dc::layer, "Ende von M2index. Returned MN-1."); fflush(stdout); return MN-1; } else { //Dout(dc::layer, "Ende von M2index. Returned zwischen."); fflush(stdout); return (int)( (m-Mmin)/(Mmax-Mmin)*MN ); } } float* HodgHuxLayer::GetInputPointer(csimInputChannel InputNumber) { switch (InputNumber) { case csimInputChannel_AMPA: { Dout(dc::layer, "Excitatory Input"); return Input; } break; case csimInputChannel_GABAa: { Dout(dc::layer, "Inhibitory Input"); return InhInput; } break; case csimInputChannel_NMDA_AMPA: { Dout(dc::layer, "Mixed: Excitatory and NMDA-Input"); return NmdaAmpaInput; } break; default: return Input; } return 0; } int HodgHuxLayer::WriteSimInfo(fstream &fw) { fw << "<" << seTypeString << " id=\"" << IdNumber << "\" Type=\"" << seType << "\" Name=\"" << Name << "\"> \n"; fw << " \n"; fw << " \n"; fw << " \n"; } int HodgHuxLayer::StartBinRec(int nobserve, int NNumber) { int NumObserve = 6*nobserve; float** Buffer = new float* [NumObserve]; for (int i=0;i