TEST(LIF, cpuFI) { // MATLAB ground truth float matlab_rates[] = {0.0f, 0.0f, 0.0f, 0.0f, 33.3f, 58.8f, 76.9f, 90.9f, 100.0f, 111.1f, 125.0f}; // create a network on CPU of single LIF neuron and a dummy Izhi neuron for making a connection // ---------------- CONFIG STATE ------------------- // create a network on CPU int numGPUs = 1; int randSeed = 123; CARLsim* sim = new CARLsim("Simple LIF neuron tuning", CPU_MODE, SILENT, numGPUs, randSeed); // configure the network // set up a single LIF neuron network to record its fi curve Grid3D gridSingle(1,1,1); // pre is on a 1x1 grid Grid3D gridDummy(1,1,1); // dummy is on a 1x1 grid int gSingleLIF=sim->createGroupLIF("input", gridSingle, EXCITATORY_NEURON, 0, CPU_CORES); int gDummyIzh=sim->createGroup("output", gridDummy, EXCITATORY_NEURON, 1, CPU_CORES); // set neuron parameters sim->setNeuronParametersLIF(gSingleLIF, 10, 2, -50.0f, -65.0f, RangeRmem(5.0f)); sim->setNeuronParameters(gDummyIzh, 0.02f, 0.2f, -65.0f, 8.0f); // connect sim->connect(gSingleLIF, gDummyIzh, "full", RangeWeight(0.05), 1.0f, RangeDelay(1)); sim->setConductances(false); sim->setIntegrationMethod(FORWARD_EULER, 1); // ---------------- SETUP STATE ------------------- // build the network sim->setupNetwork(); // set some monitors SpikeMonitor* smLIF = sim->setSpikeMonitor(gSingleLIF, "NULL"); // ---------------- RUN STATE ------------------- // run for a total of 10 seconds for different amount of external current for (int i=0; i<=10; i++) { std::vector<float> current(1, (float)i*0.8f); sim->setExternalCurrent(gSingleLIF, current); smLIF->startRecording(); sim->runNetwork(10,0); smLIF->stopRecording(); EXPECT_NEAR(smLIF->getPopMeanFiringRate(), matlab_rates[i], 0.5f); } delete sim; }
//! trigger all UserErrors // TODO: add more error checking TEST(Interface, connectDeath) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; CARLsim* sim = new CARLsim("Interface.connectDeath",CPU_MODE,SILENT,1,42); int g1=sim->createSpikeGeneratorGroup("excit", 10, EXCITATORY_NEURON); int g2=sim->createGroup("excit", Grid3D(2,3,4), EXCITATORY_NEURON); sim->setNeuronParameters(g2, 0.02f, 0.2f,-65.0f,8.0f); // regular connect call EXPECT_DEATH(sim->connect(g1,g1,"random",RangeWeight(0.1f),0.1f),""); // g-post cannot be PoissonGroup EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(-0.01f),0.1f),""); // weight cannot be negative EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(0.01f,0.1f,0.1f),0.1f),""); // wt.min>0 EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(0.0f,0.01f,0.1f),0.1f),""); // SYN_FIXED wt.init!=wt.max EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(0.0f,0.01f,0.1f),-0.1f),""); // prob<0 EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(0.0f,0.01f,0.1f),2.3f),""); // prob>1 EXPECT_DEATH(sim->connect(g1,g2,"one-to-one",RangeWeight(0.1f),0.1f,RangeDelay(1),RadiusRF(3,0,0)),""); // rad>0 EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(0.1f),0.1f,RangeDelay(1),RadiusRF(-1),SYN_FIXED,-1.0f,0.0f),""); // mulSynFast<0 EXPECT_DEATH(sim->connect(g1,g2,"random",RangeWeight(0.1f),0.1f,RangeDelay(1),RadiusRF(-1),SYN_FIXED,0.0f,-1.0f),""); // mulSynSlow<0 // custom ConnectionGenerator ConnectionGenerator* CGNULL = NULL; DummyCG* CG = new DummyCG; EXPECT_DEATH({sim->connect(g1,g2,CGNULL);},""); // CG=NULL
void MCNeuronSim::setupGroups(){ //int poissonGroup[scenCount]; /* * (A) first setup groups for somatic scenarios! - connect compartments for MC! */ float G_up, G_dn; for(int k = 0; k < scenCount; k++) { //std::string poissonGroupName = "poisson_" + patch::to_string(k); //poissonGroup[k] = network->createSpikeGeneratorGroup(poissonGroupName, popSize_neuronCount, EXCITATORY_NEURON); for(int c=0; c<compCount; c++) { std::string excGroupName = "exc_" + patch::to_string(k) + patch::to_string(c); excGroup[k][c] = network->createGroup(excGroupName, popSize_neuronCount, EXCITATORY_NEURON); network->setNeuronParameters(excGroup[k][c], 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f); // network->setExternalCurrent(excGroup[k][c], 0); if(compCount>1){ G_up = 0; G_dn = 0; network->setCompartmentParameters(excGroup[k][c], G_up, G_dn); } excMonitor[k][c] = network->setSpikeMonitor(excGroup[k][c], "/dev/null"); if(c>0){//connect compartments based on layout if(compCount>2 && c==1 && connLayout[c]==connLayout[c+1]){ //meaning 2 dendrites (dend 1 and dend2 ) connecting to the same point network->connectCompartments(excGroup[k][c], excGroup[k][connLayout[c]]); }else{ network->connectCompartments(excGroup[k][connLayout[c]], excGroup[k][c]); } } } //???????????? //network->connect(poissonGroup[k], excGroup[k][0],"random", RangeWeight(0.0f), 0.5f, RangeDelay(1)); //???????????? } /* * (B) secondly, setup groups for MC scenarios! - connect compartments depending on scenarios as below * - 1. rheo group : decoupled * - 2. IR: decoupled * - 3. spike prop: Coupled * - 4. syn ampl: Coupled */ for(int k = scenCount; k < scenCount+mcScenCount; k++) { for(int c=0; c<compCount; c++) { std::string excGroupName = "mcc_exc_" + patch::to_string(k) + patch::to_string(c); excGroup[k][c] = network->createGroup(excGroupName, popSize_neuronCount, EXCITATORY_NEURON); network->setNeuronParameters(excGroup[k][c], 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f); if(k>=scenCount+2){// coupled scenarios for mcc G_up = 0; G_dn = 0; network->setCompartmentParameters(excGroup[k][c], G_up, G_dn); } excMonitor[k][c] = network->setSpikeMonitor(excGroup[k][c], "/dev/null"); if(k>=scenCount+2){ if(c>0){//connect compartments based on layout if(compCount>2 && c==1 && connLayout[c]==connLayout[c+1]){ //meaning 2 dendrites (dend 1 and dend2 ) connecting to the same point network->connectCompartments(excGroup[k][c], excGroup[k][connLayout[c]]); }else{ network->connectCompartments(excGroup[k][connLayout[c]], excGroup[k][c]); } } } } } //single neuron single compartment for EPSP stimulation for(int pssg=0; pssg<nPreSynSpikerGroups;pssg++){ excGroup[scenCount+mcScenCount][pssg] = network->createGroup("spiker_"+patch::to_string(pssg), 1, EXCITATORY_NEURON); network->setNeuronParameters(excGroup[scenCount+mcScenCount][pssg], 121.0f, 0.5343182f,-61.20764f,-40.00114f, 0.0336908f, 6.5490165f, 35.965454f,-41.31163f, 7.0f); } float connProb=0.3f; if(writeAllVs){ connProb=1.0f; } const int epspGrpRowStartIdx = scenCount + 2+ (compCount-1); float _weight = 1.0f; for(int kc=0; kc<(compCount-1); kc++){ /* * new addition for CA1 pyramidal dendrites analysis */ if(compCount==4 && kc==0) _weight = 1.0f; if(compCount==4 && kc==1) _weight = 1.0f/3.0f;//1.0f/6.0f; if(compCount==4 && kc==2) _weight = 2.5f*(1.0f/3.0f); //3.0f*(1.0f/3.0f); /*if(compCount==4 && kc==2) _weight = 1.0f; */ /* * new addition ends */ for(int pssg=0; pssg<nPreSynSpikerGroups;pssg++){ network->connect(excGroup[scenCount+mcScenCount][pssg], excGroup[epspGrpRowStartIdx + kc][kc+1], "random", RangeWeight(_weight), connProb, RangeDelay(1), RadiusRF(-1), SYN_FIXED, 1.0f, 0.0f); } } //multi neuron single compartment spikers for new spike prop implementation via synaptic stimulation for(int pssg=nPreSynSpikerGroups; pssg<nPreSynSpikerGroups*2;pssg++){ //excGroup[scenCount+mcScenCount][pssg] = network->createGroup("spiker_"+ patch::to_string(pssg), 16, EXCITATORY_NEURON); excGroup[scenCount+mcScenCount][pssg] = network->createGroup("spiker_"+ patch::to_string(pssg), 85, EXCITATORY_NEURON); network->setNeuronParameters(excGroup[scenCount+mcScenCount][pssg], 121.0f, 0.5343182f,-61.20764f,-40.00114f, 0.0336908f, 6.5490165f, 35.965454f,-41.31163f, 7.0f); } const int propRateGrpRowStartIdx = scenCount + 2; //_weight =33.0f; _weight =2.0f; for(int kc=0; kc<(compCount-1); kc++){ //if(kc+1>1) // _weight = 10.0f; if(compCount==4 && kc==0) _weight = 1.0f; if(compCount==4 && kc==1) _weight = 1.0f; //_weight = 0; //0, cuz this is not a check for prop in SR. By setting this weight 0, SR only has the I(=700?, {see determine prop rate function})- this is a baseline to test conditional spike propagation if(compCount==4 && kc==2) _weight = 2.0f; for(int pssg=nPreSynSpikerGroups; pssg<nPreSynSpikerGroups*2;pssg++){ network->connect(excGroup[scenCount+mcScenCount][pssg], excGroup[propRateGrpRowStartIdx + kc][kc+1], "random", RangeWeight(_weight), connProb, RangeDelay(1,10), RadiusRF(-1), SYN_FIXED, 1.0f, 0.0f ); } } if(customI==1){ std::cout<<"pre - in"; custom_grp_in=network->createSpikeGeneratorGroup("custom_input_0", 1, EXCITATORY_NEURON); std::vector<int> spkTimes = {150, 250, 400, 600}; SpikeGeneratorFromVector SGV(spkTimes); network->setSpikeGenerator(custom_grp_in, &SGV); int compartment_to_stimulate = 1; //create poisson group! network->connect(custom_grp_in, excGroup[0][compartment_to_stimulate], "full", RangeWeight(10), 1, RangeDelay(1),RadiusRF(-1),SYN_FIXED); std::cout<<"custom_input EXIT "; // } // /* * (C) Now, setup network! */ network->setConductances(true); network->setIntegrationMethod(RUNGE_KUTTA4, time_step); network->setupNetwork(); }