#include <iostream> using namespace std; #include "mvaspike.h" #define NE 3200 #define NI 800 // Benchmark 4 implementation // simplest: flat model (no populations) // using only basic primitives (can be verbose) // using precalculated stimuli (easier to understand) // using only built-in objects int main() { Root r; DCoupled c; Lif n[NE+NI]; ExtSpikeTrain stim[NE+NI]; MemSpikeRecorder rec; r.set_system(c); for (int i=0;i<NE+NI;i++) { c.add_component(n[i]); // time unit: ms n[i].set_Trefra(5); n[i].set_Tau(20); // voltage unit: mV n[i].set_threshold(-50); n[i].set_Vreset(-60); // using I (baseline) to take the Leak reversal potential into account. n[i].set_I(-49); n[i].set_V(-60); } for (int i=0;i<NE+NI;i++) for (int j=0;j<NE+NI;j++) // no self-connection, proba connection 0.02 if ((i!=j) &&((rnd(1.0)<0.02))) { // add an input port (a synapse) to the post-synaptic neuron int p=n[j].add_inport(); // connect from i to j, no delay c.connect(i,0,j,p,0); // synaptic parameters if (i<NE) // pre-synaptic is excitatory n[j].set_w(p,.25); // so post-synaptic effect is excitatory else n[j].set_w(p,-2.25); // resp. inhibitory } // only used for initial stimulation: random // poisson processes for (int i=0;i<NE+NI;i++) { c.add_component(stim[i]); int p=n[i].add_inport(); c.connect(i+NE+NI,0,i,p,0.0); n[i].set_w(p,10.0); // check if ok double t=rnd_poisson(10.0); while (t<50.0) { stim[i].add_spike(t); t+=rnd_poisson(10.0); } } r.record(rec); r.init(); // we are now ready to go: the model has been described. // and digested by the simulator (init). cerr << "init done." << endl; // initial random stimulation r.run(50); cerr << "stimulation done." << endl; r.run(5000); // saving stuff rec.save("spikes.txt"); }