Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define DT 0.1
- // N_CLASSES = number of SumNeurons
- #define N_CLASSES 3
- // Input layer dimensions
- #define NEURONS_PER_PATTERN 4
- // LSN dimension
- #define R_LSN 8
- #define C_LSN 8
- #define N_NEURONS_LSN R_LSN * C_LSN
- #define PERCENTAGE_INH 0.25
- #define PERCENTAGE_EXC 1 - PERCENTAGE_INH
- #define DIM_EXC PERCENTAGE_EXC * N_NEURONS_LSN
- #define DIM_INH PERCENTAGE_INH * N_NEURONS_LSN
- #include "C:\genn-team-genn-8cacb78\lib\include\modelSpec.h"
- #include "C:\genn-team-genn-8cacb78\lib\include\modelSpec.cc"
- void modelDefinition(NNmodel &model)
- {
- initGeNN();
- // NEURON MODELS
- // IZHIKEVICH MODEL WITH VARIABLE INPUT CURRENT DEFINITION
- neuronModel n;
- n.varNames.clear();
- n.varTypes.clear();
- n.varNames.push_back(tS("V"));
- n.varTypes.push_back(tS("scalar"));
- n.varNames.push_back(tS("U"));
- n.varTypes.push_back(tS("scalar"));
- n.varNames.push_back(tS("Iext"));
- n.varTypes.push_back(tS("scalar"));
- n.varNames.push_back(tS("y"));
- n.varTypes.push_back(tS("scalar"));
- n.pNames.clear();
- n.pNames.push_back(tS("a")); // time scale of U
- n.pNames.push_back(tS("b")); // sensitivity of U
- n.pNames.push_back(tS("c")); // after-spike reset value of V
- n.pNames.push_back(tS("d")); // after-spike reset value of U
- n.dpNames.clear();
- n.simCode= tS(" if ($(V) >= 30.0){\n\
- $(V)=$(c);\n\
- $(U)+=$(d);\n\
- } \n\
- $(V)+=0.5*(0.04*$(V)*$(V)+5.0*$(V)+140.0-$(U)+$(Iext) + $(Isyn))*DT; //at two times for numerical stability\n\
- $(V)+=0.5*(0.04*$(V)*$(V)+5.0*$(V)+140.0-$(U)+$(Iext) + $(Isyn))*DT;\n\
- $(U)+=$(a)*($(b)*$(V)-$(U))*DT;\n\
- $(y)=$(Isyn); \n\
- //if ($(V) > 30.0){ //keep this only for visualisation -- not really necessaary otherwise \n \
- // $(V)=30.0; \n\
- //}\n\
- ");
- n.thresholdConditionCode = tS("$(V) >= 29.99");
- nModels.push_back(n);
- unsigned int IZHIKEVICH_VAR_INPUT = nModels.size()-1;
- // SUMNEURON DEFINITION
- neuronModel n2;
- n2.varNames.clear();
- n2.varTypes.clear();
- n2.varNames.push_back(tS("V"));
- n2.varTypes.push_back(tS("scalar"));
- n2.varNames.push_back(tS("Iext"));
- n2.varTypes.push_back(tS("scalar"));
- n2.varNames.push_back(tS("ISyn"));
- n2.varTypes.push_back(tS("scalar"));
- n2.varNames.push_back(tS("Vpre"));
- n2.varTypes.push_back(tS("scalar"));
- n2.varNames.push_back(tS("Ipre"));
- n2.varTypes.push_back(tS("scalar"));
- n2.varNames.push_back(tS("gain"));
- n2.varTypes.push_back(tS("scalar"));
- n2.varNames.push_back(tS("type"));
- n2.varTypes.push_back(tS("int"));
- n2.varNames.push_back(tS("integration"));
- n2.varTypes.push_back(tS("int"));
- n2.pNames.clear();
- n2.pNames.push_back(tS("decay"));
- n2.dpNames.clear();
- n2.simCode= tS("\
- $(ISyn) = $(Isyn);\n\
- switch($(type)){\
- case 0:\n\
- $(Ipre) = $(Isyn) + $(Iext);\n\
- $(V) = $(Isyn) + $(Iext);\n\
- break;\n\
- case 1:\n\
- if($(Iext)+$(Isyn) > 0){\n\
- $(Ipre) = ($(Isyn) + $(Iext)) * $(gain);\n\
- $(V) = ($(Isyn) + $(Iext)) * $(gain);\n\
- }\n\
- else{\n\
- $(Ipre) = -($(Isyn) + $(Iext)) * $(gain);\n\
- $(V) = -($(Isyn) + $(Iext)) * $(gain);\n\
- }\n\
- break;\n\
- default:\n\
- $(Ipre) = $(Isyn) + $(Iext);\n\
- if($(integration) == 1) $(V) += $(Isyn) + $(Iext);\n\
- if(fmod(t,200) < 1e-4){\n\
- if($(Vpre) > $(V)) $(gain) += 100;\n\
- else{\n\
- $(gain) -= 100;\n\
- if($(gain) < 0) $(gain) = 0;\n\
- }\n\
- $(Vpre) = $(V);\n\
- }\
- $(V) = $(V) - 1/($(decay) - $(gain)) * $(V);\n\
- // Reset; vedi codice su Visual Studio // \n\
- // if(fabs(t - 600) < 1e-4) $(gain) = 0; // \n\
- }\n\
- $(Iext) = 0;\
- ");
- n2.thresholdConditionCode = tS("1");
- nModels.push_back(n2);
- unsigned int SUMNEURON = nModels.size() - 1;
- // -----------------------------------------------------------------------------------------------------------------------------
- // POST SYNAPTIC MODEL
- postSynModel ps;
- ps.varNames.clear();
- ps.varTypes.clear();
- ps.pNames.clear();
- ps.dpNames.clear();
- ps.postSynDecay=tS("");
- ps.postSyntoCurrent=tS("$(inSyn)");
- postSynModels.push_back(ps);
- unsigned int POST_SYN_PERSONALIZED = postSynModels.size()-1;
- // -----------------------------------------------------------------------------------------------------------------------------
- // SYNAPSE MODELS
- // PERSONALIZED NO-LEARNING SYNAPSE
- weightUpdateModel wuS;
- wuS.varNames.clear();
- wuS.varTypes.clear();
- wuS.pNames.clear();
- wuS.dpNames.clear();
- wuS.varNames.push_back(tS("w"));
- wuS.varTypes.push_back(tS("scalar"));
- // Variables that describe the impulse response
- wuS.varNames.push_back(tS("epsilon_p"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon_1"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon_2"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon_3"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon_1t"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon_2t"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("epsilon_3t"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("spike_1t"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("spike_2t"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("spike_3t"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("flag_1"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("flag_2"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("flag_3"));
- wuS.varTypes.push_back(tS("scalar"));
- // Debug variables
- wuS.varNames.push_back(tS("variazione"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("j"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("val_prec"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.varNames.push_back(tS("sum_1"));
- wuS.varTypes.push_back(tS("scalar"));
- wuS.pNames.push_back(tS("A_p"));
- wuS.pNames.push_back(tS("A_m"));
- wuS.pNames.push_back(tS("tau_p"));
- wuS.pNames.push_back(tS("tau_m"));
- wuS.pNames.push_back(tS("tau"));
- // Pre-synaptic spikes code:
- wuS.evntThreshold= tS("1");
- wuS.simCodeEvnt= tS("scalar deps;\n\
- scalar ts_1spike;\n\
- scalar ts_2spike;\n\
- scalar ts_3spike;\n\
- if ((fabs(t - $(sT_pre)))<= (1.01*DT)){ \n\
- if ($(flag_1)==0) { $(spike_1t)=$(sT_pre); $(flag_1)=1; } \n\
- else if ($(flag_2)==0){\
- $(spike_2t)=$(sT_pre); $(flag_2)=1;\
- }\n\
- else if ($(flag_3)==0){\
- $(spike_3t)=$(sT_pre);$(flag_3)=1;\
- }\n\
- }\n\
- \n\
- $(epsilon_1t)=$(epsilon_1);\n\
- $(epsilon_2t)=$(epsilon_2);\n\
- $(epsilon_3t)=$(epsilon_3);\n\
- $(epsilon_p)=$(epsilon);\n\
- $(epsilon_1)= 0;\n\
- $(epsilon_2)= 0;\n\
- $(epsilon_3)= 0;\n\
- ts_1spike = t - $(spike_1t);\n\
- ts_2spike = t - $(spike_2t);\n\
- ts_3spike = t - $(spike_3t);\n\
- \n\
- if (ts_1spike>0 ) {\n\
- if ($(epsilon_1t)>0 || ts_1spike < 2 * $(tau)) {\n\
- $(epsilon_1) = $(epsilon_1t) + DT * ((1/$(tau)) * (1 - (ts_1spike)/$(tau))* (exp(1 - (ts_1spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_1)=0;\n\
- $(flag_1)=0;\n\
- }\n\
- }\n\
- if (ts_2spike>0) {\n\
- if ($(epsilon_2t)>0 || ts_2spike < 2 * $(tau)) {\n\
- $(epsilon_2) = $(epsilon_2t) + DT * ((1/$(tau)) * (1 - (ts_2spike)/$(tau)) * (exp(1 - (ts_2spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_2)=0;\n\
- $(flag_2)=0;\n\
- \n\
- }\n\
- }\n\
- if (ts_3spike>0 ) {\n\
- if ($(epsilon_3t)>0 || ts_3spike < 2 * $(tau)) {\n\
- $(epsilon_3) = $(epsilon_3t) + DT * ((1/$(tau)) * (1 - (ts_3spike)/$(tau))* (exp(1 - (ts_3spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_3)=0;\n\
- $(flag_3)=0;\n\
- }\n\
- }\n\
- $(epsilon)=$(epsilon_1) + $(epsilon_2) + $(epsilon_3);\n\
- deps = $(epsilon) - ($(epsilon_p)); \n\
- $(variazione)=deps; \n\
- \n\
- \n\
- $(j)=$(w)*(deps);\n\
- if ($(flag_1)==0 && $(flag_2)==0 && $(flag_3)==0) {\n\
- $(addtoinSyn)= -$(sum_1);\n\
- $(sum_1)=0; \n\
- }\n\
- else {\
- $(addtoinSyn)=$(w)*(deps); $(sum_1)=$(sum_1) + $(j); }\n\
- $(updatelinsyn);\n\
- if (fmod(t,3000.0) < 1e-4) $(w)= 0.95*$(w);");
- wuS.needPreSt=TRUE;
- wuS.needPostSt=TRUE;
- weightUpdateModels.push_back(wuS);
- unsigned int NO_LEARNING = weightUpdateModels.size() - 1;
- // EXPONENTIAL STDP SYNAPSE
- weightUpdateModel wuS2;
- wuS2.varNames.clear();
- wuS2.varTypes.clear();
- wuS2.pNames.clear();
- wuS2.dpNames.clear();
- wuS2.varNames.push_back(tS("w"));
- wuS2.varTypes.push_back(tS("scalar"));
- // Variables that describe the impulse response
- wuS2.varNames.push_back(tS("epsilon_p"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon_1"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon_2"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon_3"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon_1t"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon_2t"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("epsilon_3t"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("spike_1t"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("spike_2t"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("spike_3t"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("flag_1"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("flag_2"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("flag_3"));
- wuS2.varTypes.push_back(tS("scalar"));
- // Debug variables
- wuS2.varNames.push_back(tS("variazione"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("j"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("val_prec"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.varNames.push_back(tS("sum_1"));
- wuS2.varTypes.push_back(tS("scalar"));
- wuS2.pNames.push_back(tS("A_p"));
- wuS2.pNames.push_back(tS("A_m"));
- wuS2.pNames.push_back(tS("tau_p"));
- wuS2.pNames.push_back(tS("tau_m"));
- wuS2.pNames.push_back(tS("tau"));
- // Pre-synaptic spikes code:
- wuS2.simCode= tS("scalar dt=t - $(sT_post); \n\
- scalar dw; \n\
- $(val_prec)=$(sT_pre);\n\
- if (dt<0.0) dw = $(A_p) * exp(dt/($(tau_p))) ; \n\
- else dw = $(A_m) * exp(-(dt/($(tau_m)))); \n\
- $(w)=$(w)+dw; \n\
- if (($(w))>= 12) $(w)=12.0; \n\
- else if (($(w))<=-12) $(w)=-12;\
- ");
- wuS2.evntThreshold= tS("1");
- wuS2.simCodeEvnt= tS("scalar deps;\n\
- scalar ts_1spike;\n\
- scalar ts_2spike;\n\
- scalar ts_3spike;\n\
- if ((fabs(t - $(sT_pre)))<= (1.01*DT)){ \n\
- if ($(flag_1)==0) { $(spike_1t)=$(sT_pre); $(flag_1)=1; } \n\
- else if ($(flag_2)==0){\
- $(spike_2t)=$(sT_pre); $(flag_2)=1;\
- }\n\
- else if ($(flag_3)==0){\
- $(spike_3t)=$(sT_pre);$(flag_3)=1;\
- }\n\
- }\n\
- \n\
- $(epsilon_1t)=$(epsilon_1);\n\
- $(epsilon_2t)=$(epsilon_2);\n\
- $(epsilon_3t)=$(epsilon_3);\n\
- $(epsilon_p)=$(epsilon);\n\
- $(epsilon_1)= 0;\n\
- $(epsilon_2)= 0;\n\
- $(epsilon_3)= 0;\n\
- ts_1spike = t - $(spike_1t);\n\
- ts_2spike = t - $(spike_2t);\n\
- ts_3spike = t - $(spike_3t);\n\
- \n\
- if (ts_1spike>0 ) {\n\
- if ($(epsilon_1t)>0 || ts_1spike < 2 * $(tau)) {\n\
- $(epsilon_1) = $(epsilon_1t) + DT * ((1/$(tau)) * (1 - (ts_1spike)/$(tau))* (exp(1 - (ts_1spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_1)=0;\n\
- $(flag_1)=0;\n\
- }\n\
- }\n\
- if (ts_2spike>0) {\n\
- if ($(epsilon_2t)>0 || ts_2spike < 2 * $(tau)) {\n\
- $(epsilon_2) = $(epsilon_2t) + DT * ((1/$(tau)) * (1 - (ts_2spike)/$(tau)) * (exp(1 - (ts_2spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_2)=0;\n\
- $(flag_2)=0;\n\
- \n\
- }\n\
- }\n\
- if (ts_3spike>0 ) {\n\
- if ($(epsilon_3t)>0 || ts_3spike < 2 * $(tau)) {\n\
- $(epsilon_3) = $(epsilon_3t) + DT * ((1/$(tau)) * (1 - (ts_3spike)/$(tau))* (exp(1 - (ts_3spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_3)=0;\n\
- $(flag_3)=0;\n\
- }\n\
- }\n\
- $(epsilon)=$(epsilon_1) + $(epsilon_2) + $(epsilon_3);\n\
- deps = $(epsilon) - ($(epsilon_p)); \n\
- $(variazione)=deps; \n\
- \n\
- \n\
- $(j)=$(w)*(deps);\n\
- if ($(flag_1)==0 && $(flag_2)==0 && $(flag_3)==0) {\n\
- $(addtoinSyn)= -$(sum_1);\n\
- $(sum_1)=0; \n\
- }\n\
- else {\
- $(addtoinSyn)=$(w)*(deps); $(sum_1)=$(sum_1) + $(j); }\n\
- $(updatelinsyn);\n\
- if (fmod(t,3000.0) < 1e-4) $(w)= 0.95*$(w);");
- wuS2.simLearnPost=tS("scalar dt=$(sT_pre)- t; \n\
- scalar dw; \n\
- if (dt<0.0) dw= $(A_p)*exp(dt/$(tau_p)); \n\
- else dw=$(A_m)*exp(-(dt/$(tau_m))); \n\
- $(w)=$(w)+dw; \n\
- if ($(w)>=12.0) $(w)=12.0; \n\
- else if ($(w)<=-12.0) $(w)=-12.0;");
- wuS2.needPreSt=TRUE;
- wuS2.needPostSt=TRUE;
- weightUpdateModels.push_back(wuS2);
- unsigned int EXP_STDP = weightUpdateModels.size()-1;
- /* // TRIANGULAR STDP SYNAPSE
- weightUpdateModel wuS3;
- wuS3.varNames.clear();
- wuS3.varTypes.clear();
- wuS3.pNames.clear();
- wuS3.dpNames.clear();
- wuS3.varNames.push_back(tS("w"));
- wuS3.varTypes.push_back(tS("scalar"));
- // Variables that describe the impulse response
- wuS3.varNames.push_back(tS("epsilon_p"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon_1"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon_2"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon_3"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon_1t"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon_2t"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("epsilon_3t"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("spike_1t"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("spike_2t"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("spike_3t"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("flag_1"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("flag_2"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("flag_3"));
- wuS3.varTypes.push_back(tS("scalar"));
- // Debug variables
- wuS3.varNames.push_back(tS("variazione"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("j"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("val_prec"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.varNames.push_back(tS("sum_1"));
- wuS3.varTypes.push_back(tS("scalar"));
- wuS3.pNames.push_back(tS("A_p")); // massimo nullo
- wuS3.pNames.push_back(tS("A_m")); // minimumo nullo
- wuS3.pNames.push_back(tS("w_max")); // massima variazione di w
- wuS3.pNames.push_back(tS("dt_max")); // valore di dt per il quale w = w_max
- wuS3.pNames.push_back(tS("tau")); // tau della risposta all'impulso
- wuS3.pNames.push_back(tS("dw_m")); // valore di dw per dt < A_m
- wuS3.pNames.push_back(tS("dw_p")); // valore di dw per dt > A_p
- // Pre-synaptic spikes code:
- wuS3.simCode= tS("scalar dt = t - $(sT_post); \n\
- scalar dw; \n\
- $(val_prec)=$(sT_pre);\n\
- if(dt < $(A_m)) dw = $(dw_m) ; \n\
- else{\n\
- if(dt > $(A_p)) dw = $(dw_p) ; \n\
- else{\n\
- if((dt >= $(A_m)) && (dt <= $(dt_max))) dw = (dt - $(A_m)) * ($(w_max) / ($(dt_max) - $(A_m)));\n\
- else dw = (dt - $(A_p)) * ($(w_max) / ($(dt_max) - $(A_p)));\n\
- }\n\
- }\n\
- $(w)=$(w)+dw;\n\
- if($(w) >= 12) $(w) = 12;\n\
- else if($(w) <= -12) $(w) = -12;\n\
- ");
- wuS3.evntThreshold= tS("1");
- wuS3.simCodeEvnt= tS("scalar deps;\n\
- scalar ts_1spike;\n\
- scalar ts_2spike;\n\
- scalar ts_3spike;\n\
- if ((fabs(t - $(sT_pre)))<= (1.01*DT)){ \n\
- if ($(flag_1)==0) { $(spike_1t)=$(sT_pre); $(flag_1)=1; } \n\
- else if ($(flag_2)==0){\
- $(spike_2t)=$(sT_pre); $(flag_2)=1;\
- }\n\
- else if ($(flag_3)==0){\
- $(spike_3t)=$(sT_pre);$(flag_3)=1;\
- }\n\
- }\n\
- \n\
- $(epsilon_1t)=$(epsilon_1);\n\
- $(epsilon_2t)=$(epsilon_2);\n\
- $(epsilon_3t)=$(epsilon_3);\n\
- $(epsilon_p)=$(epsilon);\n\
- $(epsilon_1)= 0;\n\
- $(epsilon_2)= 0;\n\
- $(epsilon_3)= 0;\n\
- ts_1spike = t - $(spike_1t);\n\
- ts_2spike = t - $(spike_2t);\n\
- ts_3spike = t - $(spike_3t);\n\
- \n\
- if (ts_1spike>0 ) {\n\
- if ($(epsilon_1t)>0 || ts_1spike < 2 * $(tau)) {\n\
- $(epsilon_1) = $(epsilon_1t) + DT * ((1/$(tau)) * (1 - (ts_1spike)/$(tau))* (exp(1 - (ts_1spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_1)=0;\n\
- $(flag_1)=0;\n\
- }\n\
- }\n\
- if (ts_2spike>0) {\n\
- if ($(epsilon_2t)>0 || ts_2spike < 2 * $(tau)) {\n\
- $(epsilon_2) = $(epsilon_2t) + DT * ((1/$(tau)) * (1 - (ts_2spike)/$(tau)) * (exp(1 - (ts_2spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_2)=0;\n\
- $(flag_2)=0;\n\
- \n\
- }\n\
- }\n\
- if (ts_3spike>0 ) {\n\
- if ($(epsilon_3t)>0 || ts_3spike < 2 * $(tau)) {\n\
- $(epsilon_3) = $(epsilon_3t) + DT * ((1/$(tau)) * (1 - (ts_3spike)/$(tau))* (exp(1 - (ts_3spike)/$(tau))));\n\
- }\n\
- else {\n\
- $(epsilon_3)=0;\n\
- $(flag_3)=0;\n\
- }\n\
- }\n\
- $(epsilon)=$(epsilon_1) + $(epsilon_2) + $(epsilon_3);\n\
- deps = $(epsilon) - ($(epsilon_p)); \n\
- $(variazione)=deps; \n\
- \n\
- \n\
- $(j)=$(w)*(deps);\n\
- if ($(flag_1)==0 && $(flag_2)==0 && $(flag_3)==0) {\n\
- $(addtoinSyn)= -$(sum_1);\n\
- $(sum_1)=0; \n\
- }\n\
- else {\
- $(addtoinSyn)=$(w)*(deps); $(sum_1)=$(sum_1) + $(j); }\n\
- $(updatelinsyn);\n\
- if (fmod(t,3000.0) < 1e-4) $(w)= 0.95*$(w);");
- wuS3.simLearnPost=tS("scalar dt=$(sT_pre)- t; \n\
- scalar dw; \n\
- $(val_prec)=$(sT_pre);\n\
- if(dt < $(A_m)) dw = $(dw_m) ; \n\
- else{\n\
- if(dt > $(A_p)) dw = $(dw_p) ; \n\
- else{\n\
- if((dt >= $(A_m)) && (dt <= $(dt_max))) dw = (dt - $(A_m)) * ($(w_max) / ($(dt_max) - $(A_m)));\n\
- else dw = (dt - $(A_p)) * ($(w_max) / ($(dt_max) - $(A_p)));\n\
- }\n\
- }\n\
- $(w)=$(w)+dw; \n\
- if($(w) >= 12) $(w) = 12;\n\
- else if($(w) <= -12) $(w) = -12;\n\
- ");
- wuS3.needPreSt=TRUE;
- wuS3.needPostSt=TRUE;
- weightUpdateModels.push_back(wuS3);
- unsigned int TR_STDP = weightUpdateModels.size()-1; */
- // -----------------------------------------------------------------------------------------------------------------------------
- model.setName("Classifier");
- // PARAMETERS
- double Input_Layer_Params_Neuron[4] = {
- 0.0, // 0 - a
- -0.1, // 1 - b
- -55, // 2 - c
- 0 // 3 - d
- };
- double LSN_Params_Neuron[4] = {
- 0.02, // 0 - a
- -0.1, // 1 - b
- -55, // 2 - c
- 6 // 3 - d
- };
- double SN_Params_Neuron[1] = {
- 5000 // 0 - decay
- };
- double LSN_No_Learning_Params_Syn[5] = {
- 0.4, // 1 - A+
- -0.4, // 2 - A-
- 20.0, // 3 - tau+
- 10.0, // 4 - tau-
- 5.0 // 5 - tau
- };
- double Input_LSN_No_Learning_Params_Syn[5] = {
- 0.4, // 1 - A+
- -0.4, // 2 - A-
- 20.0, // 3 - tau+
- 10.0, // 4 - tau-
- 5.0 // 5 - tau
- };
- double LSN_SNs_No_Learning_Params_Syn[5] = {
- 0.4, // 1 - A+
- -0.4, // 2 - A-
- 20.0, // 3 - tau+
- 10.0, // 4 - tau-
- 5.0 // 5 - tau
- };
- // -----------------------------------------------------------------------------------------------------------------------------
- // INITIAL CONDITIONS
- double Input_Init_Neuron[4] = {
- -65.0, // 0 - V
- -20.0, // 1 - U
- 0.0, // 2 - Iext
- 0.0 // 3 - y
- };
- double LSN_Init_Neuron[4] = {
- -60.0, // 0 - V
- 6.0, // 1 - U
- 0.0, // 2 - Iext
- 0.0 // 3 - y
- };
- double SN_Init_Neuron[8] = {
- -70, // 0 - V
- 0, // 1 - Iext
- 0, // 2 - ISyn
- 0, // 3 - Vpre
- 0, // 4 - Ipre
- 0, // 5 - gain
- 0, // 6 - type = {0 = standard, 1 = square, 2 = sameness}
- 1 // 7 - integration flag
- };
- double LSN_Init_Synapse_Excitatory_No_Learning[19] = {
- 10, // 0 - w
- 0, // 1 - epsilon_p
- 0, // 2 - epsilon
- 0, // 3 - epsilon_1
- 0, // 4 - epsilon_2
- 0, // 5 - epsilon_3
- 0, // 6 - epsilon_1t
- 0, // 7 - epsilon_2t
- 0, // 8 - epsilon_3t
- -100, // 9 - spike_1t
- -100, // 10 - spike_2t
- -100, // 11 - spike_3t
- 0, // 12 - flag_1
- 0, // 13 - flag_2
- 0, // 14 - flag_3
- 0, // 15 - variazione
- 0, // 16 - j
- 0, // 17 - val_prec
- 0 // 18 - sum_1
- };
- double LSN_Init_Synapse_Inhibitory_No_Learning[19] = {
- -10, // 0 - w
- 0, // 1 - epsilon_p
- 0, // 2 - epsilon
- 0, // 3 - epsilon_1
- 0, // 4 - epsilon_2
- 0, // 5 - epsilon_3
- 0, // 6 - epsilon_1t
- 0, // 7 - epsilon_2t
- 0, // 8 - epsilon_3t
- -100, // 9 - spike_1t
- -100, // 10 - spike_2t
- -100, // 11 - spike_3t
- 0, // 12 - flag_1
- 0, // 13 - flag_2
- 0, // 14 - flag_3
- 0, // 15 - variazione
- 0, // 16 - j
- 0, // 17 - val_prec
- 0 // 18 - sum_1
- };
- double LSN_Init_Synapse_No_Learning[19] = {
- 0, // 0 - w
- 0, // 1 - epsilon_p
- 0, // 2 - epsilon
- 0, // 3 - epsilon_1
- 0, // 4 - epsilon_2
- 0, // 5 - epsilon_3
- 0, // 6 - epsilon_1t
- 0, // 7 - epsilon_2t
- 0, // 8 - epsilon_3t
- -100, // 9 - spike_1t
- -100, // 10 - spike_2t
- -100, // 11 - spike_3t
- 0, // 12 - flag_1
- 0, // 13 - flag_2
- 0, // 14 - flag_3
- 0, // 15 - variazione
- 0, // 16 - j
- 0, // 17 - val_prec
- 0 // 18 - sum_1
- };
- double Input_LSN_No_Learning[19] = {
- 0, // 0 - w
- 0, // 1 - epsilon_p
- 0, // 2 - epsilon
- 0, // 3 - epsilon_1
- 0, // 4 - epsilon_2
- 0, // 5 - epsilon_3
- 0, // 6 - epsilon_1t
- 0, // 7 - epsilon_2t
- 0, // 8 - epsilon_3t
- -100, // 9 - spike_1t
- -100, // 10 - spike_2t
- -100, // 11 - spike_3t
- 0, // 12 - flag_1
- 0, // 13 - flag_2
- 0, // 14 - flag_3
- 0, // 15 - variazione
- 0, // 16 - j
- 0, // 17 - val_prec
- 0 // 18 - sum_1
- };
- double LSN_SNs_No_Learning[19] = {
- 0, // 0 - w
- 0, // 1 - epsilon_p
- 0, // 2 - epsilon
- 0, // 3 - epsilon_1
- 0, // 4 - epsilon_2
- 0, // 5 - epsilon_3
- 0, // 6 - epsilon_1t
- 0, // 7 - epsilon_2t
- 0, // 8 - epsilon_3t
- -100, // 9 - spike_1t
- -100, // 10 - spike_2t
- -100, // 11 - spike_3t
- 0, // 12 - flag_1
- 0, // 13 - flag_2
- 0, // 14 - flag_3
- 0, // 15 - variazione
- 0, // 16 - j
- 0, // 17 - val_prec
- 0 // 18 - sum_1
- };
- // -----------------------------------------------------------------------------------------------------------------------------
- // MODEL DEFINITION
- // INPUT LAYER IMPLEMENTATION
- // 1. Neurons populations
- model.addNeuronPopulation("INPUT",(int)NEURONS_PER_PATTERN,IZHIKEVICH_VAR_INPUT,Input_Layer_Params_Neuron,Input_Init_Neuron);
- // -----------------------------------------------------------------------------------------------------------------------------
- // LSN IMPLEMENTATION
- // 1. Neurons populations
- model.addNeuronPopulation("LSN_EXC",(int)DIM_EXC,IZHIKEVICH_VAR_INPUT,LSN_Params_Neuron,LSN_Init_Neuron);
- model.addNeuronPopulation("LSN_INH",(int)DIM_INH,IZHIKEVICH_VAR_INPUT,LSN_Params_Neuron,LSN_Init_Neuron);
- // 2. Internal connections
- model.addSynapsePopulation("LSN_EXC_EXC",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"LSN_EXC","LSN_EXC",LSN_Init_Synapse_Excitatory_No_Learning,LSN_No_Learning_Params_Syn,NULL,NULL);
- model.addSynapsePopulation("LSN_INH_INH",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"LSN_INH","LSN_INH",LSN_Init_Synapse_Inhibitory_No_Learning,LSN_No_Learning_Params_Syn,NULL,NULL);
- model.addSynapsePopulation("LSN_EXC_INH",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"LSN_EXC","LSN_INH",LSN_Init_Synapse_No_Learning,LSN_No_Learning_Params_Syn,NULL,NULL);
- model.addSynapsePopulation("LSN_INH_EXC",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"LSN_INH","LSN_EXC",LSN_Init_Synapse_No_Learning,LSN_No_Learning_Params_Syn,NULL,NULL);
- // -----------------------------------------------------------------------------------------------------------------------------
- // SNs IMPLEMENTATION
- // 1. Neurons populations
- model.addNeuronPopulation("SN",(int)N_CLASSES,SUMNEURON,SN_Params_Neuron,SN_Init_Neuron);
- // -----------------------------------------------------------------------------------------------------------------------------
- // INTER-CONNECTIONS AMONG NEURONS POPULATIONS
- // Check synapse type with own parameters!!!
- model.addSynapsePopulation("INPUT_LSN_EXC",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"INPUT","LSN_EXC",Input_LSN_No_Learning,Input_LSN_No_Learning_Params_Syn,NULL,NULL);
- model.addSynapsePopulation("INPUT_LSN_INH",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"INPUT","LSN_INH",Input_LSN_No_Learning,Input_LSN_No_Learning_Params_Syn,NULL,NULL);
- model.addSynapsePopulation("LSN_EXC_SNs",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"LSN_EXC","SN",LSN_SNs_No_Learning,LSN_SNs_No_Learning_Params_Syn,NULL,NULL);
- model.addSynapsePopulation("LSN_INH_SNs",NO_LEARNING,ALLTOALL,INDIVIDUALG,NO_DELAY,POST_SYN_PERSONALIZED,"LSN_INH","SN",LSN_SNs_No_Learning,LSN_SNs_No_Learning_Params_Syn,NULL,NULL);
- // -----------------------------------------------------------------------------------------------------------------------------
- model.finalize();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement