Advertisement
Guest User

model

a guest
Oct 5th, 2016
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 26.14 KB | None | 0 0
  1. #define DT                              0.1
  2. // N_CLASSES = number of SumNeurons
  3. #define N_CLASSES                       3
  4. // Input layer dimensions
  5. #define NEURONS_PER_PATTERN             4
  6. // LSN dimension
  7. #define R_LSN           8
  8. #define C_LSN           8
  9. #define N_NEURONS_LSN   R_LSN * C_LSN
  10. #define PERCENTAGE_INH  0.25
  11. #define PERCENTAGE_EXC  1 - PERCENTAGE_INH
  12. #define DIM_EXC         PERCENTAGE_EXC * N_NEURONS_LSN
  13. #define DIM_INH         PERCENTAGE_INH * N_NEURONS_LSN
  14.  
  15. #include "C:\genn-team-genn-8cacb78\lib\include\modelSpec.h"
  16. #include "C:\genn-team-genn-8cacb78\lib\include\modelSpec.cc"
  17.  
  18. void modelDefinition(NNmodel &model)
  19. {  
  20.     initGeNN();
  21.    
  22.     // NEURON MODELS
  23.         // IZHIKEVICH MODEL WITH VARIABLE INPUT CURRENT DEFINITION
  24.         neuronModel n;
  25.         n.varNames.clear();
  26.         n.varTypes.clear();
  27.         n.varNames.push_back(tS("V"));
  28.         n.varTypes.push_back(tS("scalar"));  
  29.         n.varNames.push_back(tS("U"));
  30.         n.varTypes.push_back(tS("scalar"));
  31.         n.varNames.push_back(tS("Iext"));
  32.         n.varTypes.push_back(tS("scalar"));
  33.         n.varNames.push_back(tS("y"));
  34.         n.varTypes.push_back(tS("scalar"));        
  35.  
  36.         n.pNames.clear();
  37.         n.pNames.push_back(tS("a")); // time scale of U
  38.         n.pNames.push_back(tS("b")); // sensitivity of U
  39.         n.pNames.push_back(tS("c")); // after-spike reset value of V
  40.         n.pNames.push_back(tS("d")); // after-spike reset value of U
  41.         n.dpNames.clear();
  42.         n.simCode= tS("    if ($(V) >= 30.0){\n\
  43.           $(V)=$(c);\n\
  44.               $(U)+=$(d);\n\
  45.         } \n\
  46.         $(V)+=0.5*(0.04*$(V)*$(V)+5.0*$(V)+140.0-$(U)+$(Iext) + $(Isyn))*DT; //at two times for numerical stability\n\
  47.         $(V)+=0.5*(0.04*$(V)*$(V)+5.0*$(V)+140.0-$(U)+$(Iext) + $(Isyn))*DT;\n\
  48.         $(U)+=$(a)*($(b)*$(V)-$(U))*DT;\n\
  49.         $(y)=$(Isyn); \n\
  50.         //if ($(V) > 30.0){   //keep this only for visualisation -- not really necessaary otherwise \n  \
  51.         //  $(V)=30.0; \n\
  52.         //}\n\
  53.         ");
  54.         n.thresholdConditionCode = tS("$(V) >= 29.99");
  55.         nModels.push_back(n);
  56.         unsigned int IZHIKEVICH_VAR_INPUT = nModels.size()-1;
  57.  
  58.         // SUMNEURON DEFINITION
  59.         neuronModel n2;
  60.         n2.varNames.clear();
  61.         n2.varTypes.clear();
  62.         n2.varNames.push_back(tS("V"));
  63.         n2.varTypes.push_back(tS("scalar"));  
  64.         n2.varNames.push_back(tS("Iext"));
  65.         n2.varTypes.push_back(tS("scalar"));
  66.         n2.varNames.push_back(tS("ISyn"));
  67.         n2.varTypes.push_back(tS("scalar"));
  68.         n2.varNames.push_back(tS("Vpre"));
  69.         n2.varTypes.push_back(tS("scalar"));
  70.         n2.varNames.push_back(tS("Ipre"));
  71.         n2.varTypes.push_back(tS("scalar"));
  72.         n2.varNames.push_back(tS("gain"));
  73.         n2.varTypes.push_back(tS("scalar"));
  74.         n2.varNames.push_back(tS("type"));
  75.         n2.varTypes.push_back(tS("int"));
  76.         n2.varNames.push_back(tS("integration"));
  77.         n2.varTypes.push_back(tS("int"));
  78.  
  79.         n2.pNames.clear();
  80.         n2.pNames.push_back(tS("decay"));
  81.         n2.dpNames.clear();
  82.        
  83.         n2.simCode= tS("\
  84.             $(ISyn) = $(Isyn);\n\
  85.             switch($(type)){\
  86.                 case 0:\n\
  87.                     $(Ipre) = $(Isyn) + $(Iext);\n\
  88.                     $(V) = $(Isyn) + $(Iext);\n\
  89.                     break;\n\
  90.                 case 1:\n\
  91.                     if($(Iext)+$(Isyn) > 0){\n\
  92.                         $(Ipre) = ($(Isyn) + $(Iext)) * $(gain);\n\
  93.                         $(V) = ($(Isyn) + $(Iext)) * $(gain);\n\
  94.                     }\n\
  95.                     else{\n\
  96.                         $(Ipre) = -($(Isyn) + $(Iext)) * $(gain);\n\
  97.                         $(V) = -($(Isyn) + $(Iext)) * $(gain);\n\
  98.                     }\n\
  99.                     break;\n\
  100.                 default:\n\
  101.                     $(Ipre) = $(Isyn) + $(Iext);\n\
  102.                     if($(integration) == 1) $(V) += $(Isyn) + $(Iext);\n\
  103.                     if(fmod(t,200) < 1e-4){\n\
  104.                         if($(Vpre) > $(V)) $(gain) += 100;\n\
  105.                         else{\n\
  106.                             $(gain) -= 100;\n\
  107.                             if($(gain) < 0) $(gain) = 0;\n\
  108.                         }\n\
  109.                         $(Vpre) = $(V);\n\
  110.                     }\
  111.                     $(V) = $(V) - 1/($(decay) - $(gain)) * $(V);\n\
  112.                     // Reset; vedi codice su Visual Studio // \n\
  113.                     // if(fabs(t - 600) < 1e-4) $(gain) = 0; // \n\
  114.             }\n\
  115.             $(Iext) = 0;\
  116.         ");
  117.  
  118.         n2.thresholdConditionCode = tS("1");
  119.  
  120.         nModels.push_back(n2);
  121.         unsigned int SUMNEURON = nModels.size() - 1;
  122.     // -----------------------------------------------------------------------------------------------------------------------------
  123.    
  124.     // POST SYNAPTIC MODEL
  125.         postSynModel ps;
  126.      
  127.         ps.varNames.clear();
  128.         ps.varTypes.clear();
  129.         ps.pNames.clear();
  130.         ps.dpNames.clear();
  131.         ps.postSynDecay=tS("");
  132.         ps.postSyntoCurrent=tS("$(inSyn)");
  133.         postSynModels.push_back(ps);
  134.         unsigned int POST_SYN_PERSONALIZED = postSynModels.size()-1;
  135.     // -----------------------------------------------------------------------------------------------------------------------------
  136.    
  137.     // SYNAPSE MODELS
  138.         // PERSONALIZED NO-LEARNING SYNAPSE
  139.         weightUpdateModel wuS;
  140.  
  141.         wuS.varNames.clear();
  142.         wuS.varTypes.clear();
  143.         wuS.pNames.clear();
  144.         wuS.dpNames.clear();
  145.  
  146.         wuS.varNames.push_back(tS("w"));
  147.         wuS.varTypes.push_back(tS("scalar"));
  148.  
  149.         // Variables that describe the impulse response
  150.         wuS.varNames.push_back(tS("epsilon_p"));               
  151.         wuS.varTypes.push_back(tS("scalar"));
  152.         wuS.varNames.push_back(tS("epsilon"));  
  153.         wuS.varTypes.push_back(tS("scalar"));
  154.         wuS.varNames.push_back(tS("epsilon_1"));               
  155.         wuS.varTypes.push_back(tS("scalar"));
  156.         wuS.varNames.push_back(tS("epsilon_2"));               
  157.         wuS.varTypes.push_back(tS("scalar"));
  158.         wuS.varNames.push_back(tS("epsilon_3"));               
  159.         wuS.varTypes.push_back(tS("scalar"));
  160.         wuS.varNames.push_back(tS("epsilon_1t"));              
  161.         wuS.varTypes.push_back(tS("scalar"));
  162.         wuS.varNames.push_back(tS("epsilon_2t"));              
  163.         wuS.varTypes.push_back(tS("scalar"));
  164.         wuS.varNames.push_back(tS("epsilon_3t"));              
  165.         wuS.varTypes.push_back(tS("scalar"));
  166.         wuS.varNames.push_back(tS("spike_1t"));                
  167.         wuS.varTypes.push_back(tS("scalar"));  
  168.         wuS.varNames.push_back(tS("spike_2t"));                
  169.         wuS.varTypes.push_back(tS("scalar"));
  170.         wuS.varNames.push_back(tS("spike_3t"));                
  171.         wuS.varTypes.push_back(tS("scalar"));
  172.         wuS.varNames.push_back(tS("flag_1"));                  
  173.         wuS.varTypes.push_back(tS("scalar"));
  174.         wuS.varNames.push_back(tS("flag_2"));                  
  175.         wuS.varTypes.push_back(tS("scalar"));
  176.         wuS.varNames.push_back(tS("flag_3"));
  177.         wuS.varTypes.push_back(tS("scalar"));
  178.        
  179.         // Debug variables
  180.         wuS.varNames.push_back(tS("variazione"));
  181.         wuS.varTypes.push_back(tS("scalar"));
  182.         wuS.varNames.push_back(tS("j"));
  183.         wuS.varTypes.push_back(tS("scalar"));
  184.         wuS.varNames.push_back(tS("val_prec"));
  185.         wuS.varTypes.push_back(tS("scalar"));
  186.         wuS.varNames.push_back(tS("sum_1"));
  187.         wuS.varTypes.push_back(tS("scalar"));
  188.  
  189.         wuS.pNames.push_back(tS("A_p"));
  190.         wuS.pNames.push_back(tS("A_m"));
  191.         wuS.pNames.push_back(tS("tau_p"));
  192.         wuS.pNames.push_back(tS("tau_m"));
  193.         wuS.pNames.push_back(tS("tau"));
  194.  
  195.         // Pre-synaptic spikes code:         
  196.         wuS.evntThreshold= tS("1");
  197.         wuS.simCodeEvnt= tS("scalar deps;\n\
  198.         scalar ts_1spike;\n\
  199.         scalar ts_2spike;\n\
  200.         scalar ts_3spike;\n\
  201.         if ((fabs(t - $(sT_pre)))<= (1.01*DT)){     \n\
  202.             if ($(flag_1)==0)  { $(spike_1t)=$(sT_pre); $(flag_1)=1; }  \n\
  203.             else if ($(flag_2)==0){\
  204.                 $(spike_2t)=$(sT_pre); $(flag_2)=1;\
  205.             }\n\
  206.             else if ($(flag_3)==0){\
  207.                 $(spike_3t)=$(sT_pre);$(flag_3)=1;\
  208.             }\n\
  209.         }\n\
  210.         \n\
  211.         $(epsilon_1t)=$(epsilon_1);\n\
  212.         $(epsilon_2t)=$(epsilon_2);\n\
  213.         $(epsilon_3t)=$(epsilon_3);\n\
  214.         $(epsilon_p)=$(epsilon);\n\
  215.         $(epsilon_1)= 0;\n\
  216.         $(epsilon_2)= 0;\n\
  217.         $(epsilon_3)= 0;\n\
  218.         ts_1spike = t - $(spike_1t);\n\
  219.         ts_2spike = t - $(spike_2t);\n\
  220.         ts_3spike = t - $(spike_3t);\n\
  221.         \n\
  222.         if (ts_1spike>0 ) {\n\
  223.             if ($(epsilon_1t)>0 || ts_1spike < 2 * $(tau)) {\n\
  224.                 $(epsilon_1) = $(epsilon_1t) + DT  * ((1/$(tau)) * (1 - (ts_1spike)/$(tau))* (exp(1 - (ts_1spike)/$(tau))));\n\
  225.             }\n\
  226.             else {\n\
  227.                 $(epsilon_1)=0;\n\
  228.                 $(flag_1)=0;\n\
  229.             }\n\
  230.         }\n\
  231.         if (ts_2spike>0) {\n\
  232.             if ($(epsilon_2t)>0 || ts_2spike < 2 * $(tau)) {\n\
  233.                 $(epsilon_2) = $(epsilon_2t) + DT  * ((1/$(tau)) * (1 - (ts_2spike)/$(tau)) * (exp(1 - (ts_2spike)/$(tau))));\n\
  234.             }\n\
  235.             else {\n\
  236.                 $(epsilon_2)=0;\n\
  237.                 $(flag_2)=0;\n\
  238.                 \n\
  239.             }\n\
  240.         }\n\
  241.         if (ts_3spike>0 ) {\n\
  242.             if ($(epsilon_3t)>0 || ts_3spike < 2 * $(tau)) {\n\
  243.                 $(epsilon_3) = $(epsilon_3t) + DT  * ((1/$(tau)) * (1 - (ts_3spike)/$(tau))* (exp(1 - (ts_3spike)/$(tau))));\n\
  244.             }\n\
  245.             else {\n\
  246.                 $(epsilon_3)=0;\n\
  247.                 $(flag_3)=0;\n\
  248.             }\n\
  249.         }\n\
  250.         $(epsilon)=$(epsilon_1) + $(epsilon_2) + $(epsilon_3);\n\
  251.         deps = $(epsilon) - ($(epsilon_p)); \n\
  252.         $(variazione)=deps; \n\
  253.         \n\
  254.         \n\
  255.         $(j)=$(w)*(deps);\n\
  256.         if ($(flag_1)==0 && $(flag_2)==0 && $(flag_3)==0) {\n\
  257.             $(addtoinSyn)=  -$(sum_1);\n\
  258.             $(sum_1)=0; \n\
  259.         }\n\
  260.         else {\
  261.             $(addtoinSyn)=$(w)*(deps); $(sum_1)=$(sum_1) + $(j); }\n\
  262.             $(updatelinsyn);\n\
  263.         if (fmod(t,3000.0) < 1e-4) $(w)= 0.95*$(w);");       
  264.         wuS.needPreSt=TRUE;
  265.         wuS.needPostSt=TRUE;
  266.         weightUpdateModels.push_back(wuS);
  267.         unsigned int NO_LEARNING = weightUpdateModels.size() - 1;
  268.        
  269.         // EXPONENTIAL STDP SYNAPSE
  270.         weightUpdateModel wuS2;
  271.  
  272.         wuS2.varNames.clear();
  273.         wuS2.varTypes.clear();
  274.         wuS2.pNames.clear();
  275.         wuS2.dpNames.clear();
  276.  
  277.         wuS2.varNames.push_back(tS("w"));
  278.         wuS2.varTypes.push_back(tS("scalar"));
  279.  
  280.         // Variables that describe the impulse response
  281.         wuS2.varNames.push_back(tS("epsilon_p"));              
  282.         wuS2.varTypes.push_back(tS("scalar"));
  283.         wuS2.varNames.push_back(tS("epsilon"));    
  284.         wuS2.varTypes.push_back(tS("scalar"));
  285.         wuS2.varNames.push_back(tS("epsilon_1"));              
  286.         wuS2.varTypes.push_back(tS("scalar"));
  287.         wuS2.varNames.push_back(tS("epsilon_2"));              
  288.         wuS2.varTypes.push_back(tS("scalar"));
  289.         wuS2.varNames.push_back(tS("epsilon_3"));              
  290.         wuS2.varTypes.push_back(tS("scalar"));
  291.         wuS2.varNames.push_back(tS("epsilon_1t"));             
  292.         wuS2.varTypes.push_back(tS("scalar"));
  293.         wuS2.varNames.push_back(tS("epsilon_2t"));             
  294.         wuS2.varTypes.push_back(tS("scalar"));
  295.         wuS2.varNames.push_back(tS("epsilon_3t"));             
  296.         wuS2.varTypes.push_back(tS("scalar"));
  297.         wuS2.varNames.push_back(tS("spike_1t"));               
  298.         wuS2.varTypes.push_back(tS("scalar"));  
  299.         wuS2.varNames.push_back(tS("spike_2t"));                   
  300.         wuS2.varTypes.push_back(tS("scalar"));
  301.         wuS2.varNames.push_back(tS("spike_3t"));                   
  302.         wuS2.varTypes.push_back(tS("scalar"));
  303.         wuS2.varNames.push_back(tS("flag_1"));                 
  304.         wuS2.varTypes.push_back(tS("scalar"));
  305.         wuS2.varNames.push_back(tS("flag_2"));                 
  306.         wuS2.varTypes.push_back(tS("scalar"));
  307.         wuS2.varNames.push_back(tS("flag_3"));
  308.         wuS2.varTypes.push_back(tS("scalar"));
  309.  
  310.        
  311.         // Debug variables
  312.         wuS2.varNames.push_back(tS("variazione"));
  313.         wuS2.varTypes.push_back(tS("scalar"));
  314.         wuS2.varNames.push_back(tS("j"));
  315.         wuS2.varTypes.push_back(tS("scalar"));
  316.         wuS2.varNames.push_back(tS("val_prec"));
  317.         wuS2.varTypes.push_back(tS("scalar"));
  318.         wuS2.varNames.push_back(tS("sum_1"));
  319.         wuS2.varTypes.push_back(tS("scalar"));  
  320.  
  321.         wuS2.pNames.push_back(tS("A_p"));
  322.         wuS2.pNames.push_back(tS("A_m"));
  323.         wuS2.pNames.push_back(tS("tau_p"));
  324.         wuS2.pNames.push_back(tS("tau_m"));
  325.         wuS2.pNames.push_back(tS("tau"));
  326.  
  327.         // Pre-synaptic spikes code:
  328.         wuS2.simCode= tS("scalar dt=t - $(sT_post); \n\
  329.             scalar dw; \n\
  330.             $(val_prec)=$(sT_pre);\n\
  331.             if (dt<0.0) dw = $(A_p) * exp(dt/($(tau_p))) ; \n\
  332.             else dw = $(A_m) * exp(-(dt/($(tau_m)))); \n\
  333.             $(w)=$(w)+dw; \n\
  334.             if (($(w))>= 12) $(w)=12.0; \n\
  335.             else if (($(w))<=-12) $(w)=-12;\
  336.         ");
  337.          
  338.         wuS2.evntThreshold= tS("1");
  339.         wuS2.simCodeEvnt= tS("scalar deps;\n\
  340.         scalar ts_1spike;\n\
  341.         scalar ts_2spike;\n\
  342.         scalar ts_3spike;\n\
  343.         if ((fabs(t - $(sT_pre)))<= (1.01*DT)){     \n\
  344.             if ($(flag_1)==0)  { $(spike_1t)=$(sT_pre); $(flag_1)=1; }  \n\
  345.             else if ($(flag_2)==0){\
  346.                 $(spike_2t)=$(sT_pre); $(flag_2)=1;\
  347.             }\n\
  348.             else if ($(flag_3)==0){\
  349.                 $(spike_3t)=$(sT_pre);$(flag_3)=1;\
  350.             }\n\
  351.         }\n\
  352.         \n\
  353.         $(epsilon_1t)=$(epsilon_1);\n\
  354.         $(epsilon_2t)=$(epsilon_2);\n\
  355.         $(epsilon_3t)=$(epsilon_3);\n\
  356.         $(epsilon_p)=$(epsilon);\n\
  357.         $(epsilon_1)= 0;\n\
  358.         $(epsilon_2)= 0;\n\
  359.         $(epsilon_3)= 0;\n\
  360.         ts_1spike = t - $(spike_1t);\n\
  361.         ts_2spike = t - $(spike_2t);\n\
  362.         ts_3spike = t - $(spike_3t);\n\
  363.         \n\
  364.         if (ts_1spike>0 ) {\n\
  365.             if ($(epsilon_1t)>0 || ts_1spike < 2 * $(tau)) {\n\
  366.                 $(epsilon_1) = $(epsilon_1t) + DT  * ((1/$(tau)) * (1 - (ts_1spike)/$(tau))* (exp(1 - (ts_1spike)/$(tau))));\n\
  367.             }\n\
  368.             else {\n\
  369.                 $(epsilon_1)=0;\n\
  370.                 $(flag_1)=0;\n\
  371.             }\n\
  372.         }\n\
  373.         if (ts_2spike>0) {\n\
  374.             if ($(epsilon_2t)>0 || ts_2spike < 2 * $(tau)) {\n\
  375.                 $(epsilon_2) = $(epsilon_2t) + DT  * ((1/$(tau)) * (1 - (ts_2spike)/$(tau)) * (exp(1 - (ts_2spike)/$(tau))));\n\
  376.             }\n\
  377.             else {\n\
  378.                 $(epsilon_2)=0;\n\
  379.                 $(flag_2)=0;\n\
  380.                 \n\
  381.             }\n\
  382.         }\n\
  383.         if (ts_3spike>0 ) {\n\
  384.             if ($(epsilon_3t)>0 || ts_3spike < 2 * $(tau)) {\n\
  385.                 $(epsilon_3) = $(epsilon_3t) + DT  * ((1/$(tau)) * (1 - (ts_3spike)/$(tau))* (exp(1 - (ts_3spike)/$(tau))));\n\
  386.             }\n\
  387.             else {\n\
  388.                 $(epsilon_3)=0;\n\
  389.                 $(flag_3)=0;\n\
  390.             }\n\
  391.         }\n\
  392.         $(epsilon)=$(epsilon_1) + $(epsilon_2) + $(epsilon_3);\n\
  393.         deps = $(epsilon) - ($(epsilon_p)); \n\
  394.         $(variazione)=deps; \n\
  395.         \n\
  396.         \n\
  397.         $(j)=$(w)*(deps);\n\
  398.         if ($(flag_1)==0 && $(flag_2)==0 && $(flag_3)==0) {\n\
  399.             $(addtoinSyn)=  -$(sum_1);\n\
  400.             $(sum_1)=0; \n\
  401.         }\n\
  402.         else {\
  403.             $(addtoinSyn)=$(w)*(deps); $(sum_1)=$(sum_1) + $(j); }\n\
  404.             $(updatelinsyn);\n\
  405.         if (fmod(t,3000.0) < 1e-4) $(w)= 0.95*$(w);");
  406.          
  407.          
  408.         wuS2.simLearnPost=tS("scalar dt=$(sT_pre)- t; \n\
  409.         scalar dw; \n\
  410.         if (dt<0.0) dw= $(A_p)*exp(dt/$(tau_p)); \n\
  411.         else dw=$(A_m)*exp(-(dt/$(tau_m))); \n\
  412.         $(w)=$(w)+dw; \n\
  413.         if ($(w)>=12.0) $(w)=12.0; \n\
  414.         else if ($(w)<=-12.0) $(w)=-12.0;");
  415.          
  416.         wuS2.needPreSt=TRUE;
  417.         wuS2.needPostSt=TRUE;
  418.         weightUpdateModels.push_back(wuS2);
  419.         unsigned int EXP_STDP = weightUpdateModels.size()-1;
  420.        
  421.         /* // TRIANGULAR STDP SYNAPSE
  422.         weightUpdateModel wuS3;
  423.  
  424.         wuS3.varNames.clear();
  425.         wuS3.varTypes.clear();
  426.         wuS3.pNames.clear();
  427.         wuS3.dpNames.clear();
  428.  
  429.         wuS3.varNames.push_back(tS("w"));
  430.         wuS3.varTypes.push_back(tS("scalar"));
  431.  
  432.         // Variables that describe the impulse response
  433.         wuS3.varNames.push_back(tS("epsilon_p"));              
  434.         wuS3.varTypes.push_back(tS("scalar"));
  435.         wuS3.varNames.push_back(tS("epsilon"));    
  436.         wuS3.varTypes.push_back(tS("scalar"));
  437.         wuS3.varNames.push_back(tS("epsilon_1"));              
  438.         wuS3.varTypes.push_back(tS("scalar"));
  439.         wuS3.varNames.push_back(tS("epsilon_2"));              
  440.         wuS3.varTypes.push_back(tS("scalar"));
  441.         wuS3.varNames.push_back(tS("epsilon_3"));              
  442.         wuS3.varTypes.push_back(tS("scalar"));
  443.         wuS3.varNames.push_back(tS("epsilon_1t"));             
  444.         wuS3.varTypes.push_back(tS("scalar"));
  445.         wuS3.varNames.push_back(tS("epsilon_2t"));             
  446.         wuS3.varTypes.push_back(tS("scalar"));
  447.         wuS3.varNames.push_back(tS("epsilon_3t"));             
  448.         wuS3.varTypes.push_back(tS("scalar"));
  449.         wuS3.varNames.push_back(tS("spike_1t"));               
  450.         wuS3.varTypes.push_back(tS("scalar"));  
  451.         wuS3.varNames.push_back(tS("spike_2t"));                   
  452.         wuS3.varTypes.push_back(tS("scalar"));
  453.         wuS3.varNames.push_back(tS("spike_3t"));                   
  454.         wuS3.varTypes.push_back(tS("scalar"));
  455.         wuS3.varNames.push_back(tS("flag_1"));                 
  456.         wuS3.varTypes.push_back(tS("scalar"));
  457.         wuS3.varNames.push_back(tS("flag_2"));                 
  458.         wuS3.varTypes.push_back(tS("scalar"));
  459.         wuS3.varNames.push_back(tS("flag_3"));
  460.         wuS3.varTypes.push_back(tS("scalar"));
  461.  
  462.        
  463.         // Debug variables
  464.         wuS3.varNames.push_back(tS("variazione"));
  465.         wuS3.varTypes.push_back(tS("scalar"));
  466.         wuS3.varNames.push_back(tS("j"));
  467.         wuS3.varTypes.push_back(tS("scalar"));
  468.         wuS3.varNames.push_back(tS("val_prec"));
  469.         wuS3.varTypes.push_back(tS("scalar"));
  470.         wuS3.varNames.push_back(tS("sum_1"));
  471.         wuS3.varTypes.push_back(tS("scalar"));  
  472.  
  473.  
  474.         wuS3.pNames.push_back(tS("A_p"));           // massimo nullo
  475.         wuS3.pNames.push_back(tS("A_m"));           // minimumo nullo
  476.         wuS3.pNames.push_back(tS("w_max"));         // massima variazione di w
  477.         wuS3.pNames.push_back(tS("dt_max"));        // valore di dt per il quale w = w_max
  478.         wuS3.pNames.push_back(tS("tau"));           // tau della risposta all'impulso
  479.         wuS3.pNames.push_back(tS("dw_m"));          // valore di dw per dt < A_m
  480.         wuS3.pNames.push_back(tS("dw_p"));          // valore di dw per dt > A_p
  481.  
  482.         // Pre-synaptic spikes code:
  483.         wuS3.simCode= tS("scalar dt = t - $(sT_post); \n\
  484.             scalar dw; \n\
  485.             $(val_prec)=$(sT_pre);\n\
  486.             if(dt < $(A_m)) dw = $(dw_m) ; \n\
  487.             else{\n\
  488.                 if(dt > $(A_p)) dw = $(dw_p) ; \n\
  489.                 else{\n\
  490.                     if((dt >= $(A_m)) && (dt <= $(dt_max))) dw = (dt - $(A_m)) * ($(w_max) / ($(dt_max) - $(A_m)));\n\
  491.                     else dw = (dt - $(A_p)) * ($(w_max) / ($(dt_max) - $(A_p)));\n\
  492.                 }\n\
  493.             }\n\
  494.             $(w)=$(w)+dw;\n\
  495.             if($(w) >= 12) $(w) = 12;\n\
  496.             else if($(w) <= -12) $(w) = -12;\n\
  497.         ");
  498.          
  499.         wuS3.evntThreshold= tS("1");
  500.         wuS3.simCodeEvnt= tS("scalar deps;\n\
  501.         scalar ts_1spike;\n\
  502.         scalar ts_2spike;\n\
  503.         scalar ts_3spike;\n\
  504.         if ((fabs(t - $(sT_pre)))<= (1.01*DT)){     \n\
  505.             if ($(flag_1)==0)  { $(spike_1t)=$(sT_pre); $(flag_1)=1; }  \n\
  506.             else if ($(flag_2)==0){\
  507.                 $(spike_2t)=$(sT_pre); $(flag_2)=1;\
  508.             }\n\
  509.             else if ($(flag_3)==0){\
  510.                 $(spike_3t)=$(sT_pre);$(flag_3)=1;\
  511.             }\n\
  512.         }\n\
  513.         \n\
  514.         $(epsilon_1t)=$(epsilon_1);\n\
  515.         $(epsilon_2t)=$(epsilon_2);\n\
  516.         $(epsilon_3t)=$(epsilon_3);\n\
  517.         $(epsilon_p)=$(epsilon);\n\
  518.         $(epsilon_1)= 0;\n\
  519.         $(epsilon_2)= 0;\n\
  520.         $(epsilon_3)= 0;\n\
  521.         ts_1spike = t - $(spike_1t);\n\
  522.         ts_2spike = t - $(spike_2t);\n\
  523.         ts_3spike = t - $(spike_3t);\n\
  524.         \n\
  525.         if (ts_1spike>0 ) {\n\
  526.             if ($(epsilon_1t)>0 || ts_1spike < 2 * $(tau)) {\n\
  527.                 $(epsilon_1) = $(epsilon_1t) + DT  * ((1/$(tau)) * (1 - (ts_1spike)/$(tau))* (exp(1 - (ts_1spike)/$(tau))));\n\
  528.             }\n\
  529.             else {\n\
  530.                 $(epsilon_1)=0;\n\
  531.                 $(flag_1)=0;\n\
  532.             }\n\
  533.         }\n\
  534.         if (ts_2spike>0) {\n\
  535.             if ($(epsilon_2t)>0 || ts_2spike < 2 * $(tau)) {\n\
  536.                 $(epsilon_2) = $(epsilon_2t) + DT  * ((1/$(tau)) * (1 - (ts_2spike)/$(tau)) * (exp(1 - (ts_2spike)/$(tau))));\n\
  537.             }\n\
  538.             else {\n\
  539.                 $(epsilon_2)=0;\n\
  540.                 $(flag_2)=0;\n\
  541.                 \n\
  542.             }\n\
  543.         }\n\
  544.         if (ts_3spike>0 ) {\n\
  545.             if ($(epsilon_3t)>0 || ts_3spike < 2 * $(tau)) {\n\
  546.                 $(epsilon_3) = $(epsilon_3t) + DT  * ((1/$(tau)) * (1 - (ts_3spike)/$(tau))* (exp(1 - (ts_3spike)/$(tau))));\n\
  547.             }\n\
  548.             else {\n\
  549.                 $(epsilon_3)=0;\n\
  550.                 $(flag_3)=0;\n\
  551.             }\n\
  552.         }\n\
  553.         $(epsilon)=$(epsilon_1) + $(epsilon_2) + $(epsilon_3);\n\
  554.         deps = $(epsilon) - ($(epsilon_p)); \n\
  555.         $(variazione)=deps; \n\
  556.         \n\
  557.         \n\
  558.         $(j)=$(w)*(deps);\n\
  559.         if ($(flag_1)==0 && $(flag_2)==0 && $(flag_3)==0) {\n\
  560.             $(addtoinSyn)=  -$(sum_1);\n\
  561.             $(sum_1)=0; \n\
  562.         }\n\
  563.         else {\
  564.             $(addtoinSyn)=$(w)*(deps); $(sum_1)=$(sum_1) + $(j); }\n\
  565.             $(updatelinsyn);\n\
  566.         if (fmod(t,3000.0) < 1e-4) $(w)= 0.95*$(w);");
  567.          
  568.          
  569.         wuS3.simLearnPost=tS("scalar dt=$(sT_pre)- t; \n\
  570.         scalar dw; \n\
  571.         $(val_prec)=$(sT_pre);\n\
  572.         if(dt < $(A_m)) dw = $(dw_m) ; \n\
  573.         else{\n\
  574.             if(dt > $(A_p)) dw = $(dw_p) ; \n\
  575.             else{\n\
  576.                 if((dt >= $(A_m)) && (dt <= $(dt_max))) dw = (dt - $(A_m)) * ($(w_max) / ($(dt_max) - $(A_m)));\n\
  577.                 else dw = (dt - $(A_p)) * ($(w_max) / ($(dt_max) - $(A_p)));\n\
  578.             }\n\
  579.         }\n\
  580.         $(w)=$(w)+dw; \n\
  581.         if($(w) >= 12) $(w) = 12;\n\
  582.         else if($(w) <= -12) $(w) = -12;\n\
  583.         ");
  584.          
  585.         wuS3.needPreSt=TRUE;
  586.         wuS3.needPostSt=TRUE;
  587.         weightUpdateModels.push_back(wuS3);
  588.         unsigned int TR_STDP = weightUpdateModels.size()-1; */
  589.     // -----------------------------------------------------------------------------------------------------------------------------
  590.    
  591.     model.setName("Classifier");
  592.    
  593.     // PARAMETERS
  594.         double Input_Layer_Params_Neuron[4] = {
  595.             0.0,        // 0 - a
  596.             -0.1,       // 1 - b
  597.             -55,        // 2 - c
  598.             0           // 3 - d
  599.         };
  600.        
  601.         double LSN_Params_Neuron[4] = {
  602.             0.02,       // 0 - a
  603.             -0.1,       // 1 - b
  604.             -55,        // 2 - c
  605.             6           // 3 - d
  606.         };
  607.        
  608.         double SN_Params_Neuron[1] = { 
  609.             5000        // 0 - decay
  610.         };
  611.            
  612.                
  613.         double LSN_No_Learning_Params_Syn[5] = {
  614.             0.4,        // 1 - A+
  615.             -0.4,       // 2 - A-
  616.             20.0,       // 3 - tau+
  617.             10.0,       // 4 - tau-
  618.             5.0         // 5 - tau
  619.         };
  620.        
  621.         double Input_LSN_No_Learning_Params_Syn[5] = {
  622.             0.4,        // 1 - A+
  623.             -0.4,       // 2 - A-
  624.             20.0,       // 3 - tau+
  625.             10.0,       // 4 - tau-
  626.             5.0         // 5 - tau
  627.         };
  628.        
  629.         double LSN_SNs_No_Learning_Params_Syn[5] = {
  630.             0.4,        // 1 - A+
  631.             -0.4,       // 2 - A-
  632.             20.0,       // 3 - tau+
  633.             10.0,       // 4 - tau-
  634.             5.0         // 5 - tau
  635.         };
  636.     // -----------------------------------------------------------------------------------------------------------------------------
  637.    
  638.     // INITIAL CONDITIONS
  639.         double Input_Init_Neuron[4] = {
  640.             -65.0,      // 0 - V
  641.             -20.0,      // 1 - U
  642.             0.0,        // 2 - Iext
  643.             0.0         // 3 - y
  644.         };
  645.        
  646.         double LSN_Init_Neuron[4] = {
  647.             -60.0,      // 0 - V
  648.             6.0,        // 1 - U
  649.             0.0,        // 2 - Iext
  650.             0.0         // 3 - y
  651.         };
  652.        
  653.         double SN_Init_Neuron[8] = {
  654.             -70,        // 0 - V
  655.             0,          // 1 - Iext
  656.             0,          // 2 - ISyn
  657.             0,          // 3 - Vpre
  658.             0,          // 4 - Ipre
  659.             0,          // 5 - gain
  660.             0,          // 6 - type = {0 = standard, 1 = square, 2 = sameness}
  661.             1           // 7 - integration flag
  662.         };
  663.        
  664.         double LSN_Init_Synapse_Excitatory_No_Learning[19] = {
  665.             10,         // 0 - w
  666.             0,          // 1 - epsilon_p
  667.             0,          // 2 - epsilon
  668.             0,          // 3 - epsilon_1
  669.             0,          // 4 - epsilon_2
  670.             0,          // 5 - epsilon_3
  671.             0,          // 6 - epsilon_1t
  672.             0,          // 7 - epsilon_2t
  673.             0,          // 8 - epsilon_3t
  674.             -100,       // 9 - spike_1t
  675.             -100,       // 10 - spike_2t
  676.             -100,       // 11 - spike_3t
  677.             0,          // 12 - flag_1
  678.             0,          // 13 - flag_2
  679.             0,          // 14 - flag_3
  680.             0,          // 15 - variazione
  681.             0,          // 16 - j
  682.             0,          // 17 - val_prec
  683.             0           // 18 - sum_1
  684.         };
  685.        
  686.         double LSN_Init_Synapse_Inhibitory_No_Learning[19] = {
  687.             -10,        // 0 - w
  688.             0,          // 1 - epsilon_p
  689.             0,          // 2 - epsilon
  690.             0,          // 3 - epsilon_1
  691.             0,          // 4 - epsilon_2
  692.             0,          // 5 - epsilon_3
  693.             0,          // 6 - epsilon_1t
  694.             0,          // 7 - epsilon_2t
  695.             0,          // 8 - epsilon_3t
  696.             -100,       // 9 - spike_1t
  697.             -100,       // 10 - spike_2t
  698.             -100,       // 11 - spike_3t
  699.             0,          // 12 - flag_1
  700.             0,          // 13 - flag_2
  701.             0,          // 14 - flag_3
  702.             0,          // 15 - variazione
  703.             0,          // 16 - j
  704.             0,          // 17 - val_prec
  705.             0           // 18 - sum_1
  706.         };
  707.        
  708.         double LSN_Init_Synapse_No_Learning[19] = {
  709.             0,          // 0 - w
  710.             0,          // 1 - epsilon_p
  711.             0,          // 2 - epsilon
  712.             0,          // 3 - epsilon_1
  713.             0,          // 4 - epsilon_2
  714.             0,          // 5 - epsilon_3
  715.             0,          // 6 - epsilon_1t
  716.             0,          // 7 - epsilon_2t
  717.             0,          // 8 - epsilon_3t
  718.             -100,       // 9 - spike_1t
  719.             -100,       // 10 - spike_2t
  720.             -100,       // 11 - spike_3t
  721.             0,          // 12 - flag_1
  722.             0,          // 13 - flag_2
  723.             0,          // 14 - flag_3
  724.             0,          // 15 - variazione
  725.             0,          // 16 - j
  726.             0,          // 17 - val_prec
  727.             0           // 18 - sum_1
  728.         };
  729.        
  730.         double Input_LSN_No_Learning[19] = {
  731.             0,          // 0 - w
  732.             0,          // 1 - epsilon_p
  733.             0,          // 2 - epsilon
  734.             0,          // 3 - epsilon_1
  735.             0,          // 4 - epsilon_2
  736.             0,          // 5 - epsilon_3
  737.             0,          // 6 - epsilon_1t
  738.             0,          // 7 - epsilon_2t
  739.             0,          // 8 - epsilon_3t
  740.             -100,       // 9 - spike_1t
  741.             -100,       // 10 - spike_2t
  742.             -100,       // 11 - spike_3t
  743.             0,          // 12 - flag_1
  744.             0,          // 13 - flag_2
  745.             0,          // 14 - flag_3
  746.             0,          // 15 - variazione
  747.             0,          // 16 - j
  748.             0,          // 17 - val_prec
  749.             0           // 18 - sum_1
  750.         };
  751.            
  752.         double LSN_SNs_No_Learning[19] = {
  753.             0,          // 0 - w
  754.             0,          // 1 - epsilon_p
  755.             0,          // 2 - epsilon
  756.             0,          // 3 - epsilon_1
  757.             0,          // 4 - epsilon_2
  758.             0,          // 5 - epsilon_3
  759.             0,          // 6 - epsilon_1t
  760.             0,          // 7 - epsilon_2t
  761.             0,          // 8 - epsilon_3t
  762.             -100,       // 9 - spike_1t
  763.             -100,       // 10 - spike_2t
  764.             -100,       // 11 - spike_3t
  765.             0,          // 12 - flag_1
  766.             0,          // 13 - flag_2
  767.             0,          // 14 - flag_3
  768.             0,          // 15 - variazione
  769.             0,          // 16 - j
  770.             0,          // 17 - val_prec
  771.             0           // 18 - sum_1
  772.         };
  773.     // -----------------------------------------------------------------------------------------------------------------------------
  774.    
  775.     // MODEL DEFINITION
  776.    
  777.         // INPUT LAYER IMPLEMENTATION
  778.         // 1. Neurons populations
  779.         model.addNeuronPopulation("INPUT",(int)NEURONS_PER_PATTERN,IZHIKEVICH_VAR_INPUT,Input_Layer_Params_Neuron,Input_Init_Neuron);
  780.         // -----------------------------------------------------------------------------------------------------------------------------
  781.        
  782.         // LSN IMPLEMENTATION
  783.         // 1. Neurons populations
  784.         model.addNeuronPopulation("LSN_EXC",(int)DIM_EXC,IZHIKEVICH_VAR_INPUT,LSN_Params_Neuron,LSN_Init_Neuron);
  785.         model.addNeuronPopulation("LSN_INH",(int)DIM_INH,IZHIKEVICH_VAR_INPUT,LSN_Params_Neuron,LSN_Init_Neuron);
  786.         // 2. Internal connections
  787.         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);
  788.         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);
  789.         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);
  790.         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);   
  791.         // -----------------------------------------------------------------------------------------------------------------------------
  792.        
  793.         // SNs IMPLEMENTATION
  794.         // 1. Neurons populations
  795.         model.addNeuronPopulation("SN",(int)N_CLASSES,SUMNEURON,SN_Params_Neuron,SN_Init_Neuron);
  796.         // -----------------------------------------------------------------------------------------------------------------------------
  797.        
  798.         // INTER-CONNECTIONS AMONG NEURONS POPULATIONS
  799.         // Check synapse type with own parameters!!!
  800.         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);
  801.         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);
  802.        
  803.         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);
  804.         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);
  805.        
  806.     // -----------------------------------------------------------------------------------------------------------------------------
  807.    
  808.     model.finalize();
  809. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement