Brian2 is an improved and partly rewritten version of Brian, the spiking neural network simulator (see http://briansimulator.org). For the documentation, see http://brian2.readthedocs.org
mstimberg on function_compiler_kwds
Add .c and .pxd to the list of … Make Cython compilation quiet a… (compare)
mstimberg on function_compiler_kwds
Document the new features for u… (compare)
mstimberg on function_compiler_kwds
Include external source files a… (compare)
mstimberg on function_compiler_kwds
Minor bug-fixes for new additio… Support external source files f… Add tests for functions with ex… (compare)
run(...)
statements, then the second one will continue where the previous simulation stopped. This includes all variables such as synaptic weights. Statements like S.w = 'rand()'
are only executed at the point in the code where they are written. They do not get automatically re-executed for a second run.
how about when I import my weights as initialization instead of rand()?
Not sure I understand, you mean when you initialize weights with some concrete values S.w = some_values
? This does not change anything, this assignment is executed only once like any other assignment.
Hi @RNaderi . Would you mind asking this question on https://brian.discourse.group ? It's not a simple answer, and I think others could benefit from it. Thanks!
for sure. I thought it would be short. That was why I asked here. Thank you.
clk.dt_
is not a private attribute (that would be clk._dt
), the ..._
syntax is just the value without the units, and normally setting clk.dt_ = ...
or clk.dt = 0.00001
or clk.dt = 0.001*ms
should do the exact same thing. That value seems to be a bit on the tiny side, though.
Network
object. Something like this should work:# .. define network
p = PoissonInput(...)
net = Network(collect()) # create network with all objects
net.run(...) # run first simulation
net.remove(p) # remove previous PoissonInput
p = PoissonInput(...) # create new PoissonInput
net.add(p) # add the new object to the network
net.run(...) # run new simulation
Network
object, an alternative would be to create all your inputs in the beginning, but only make one of them active at a time. Something along the lines of# ... define network
p1 = PoissonInput(...)
p2 = PoissonInput(...)
p2.active = False # switch off second input
run(...)
# switch from first to second input
p1.active = False
p2.active = True
run(...)
Since I don't have deep understanding of Poisson input , I wanted to ask you if I generate 2 PoissonInput with the same rate(with the same initialization), will the result be the same ? I mean in terms of correlation of input spikes.
Note sure I undertand. The results will not be exactly the same (different random numbers), but the statistics are the same in both cases. The spikes are uncorrelated.
If you remove/add elements to an existing network as in my example, everything else in the network is unaffected. Synaptic weights, state variables, etc. are all unchanged, and the simulation continues where it left off. I did not think of it earlier, but if you want to keep your previous approach without creating a
Network
object, an alternative would be to create all your inputs in the beginning, but only make one of them active at a time. Something along the lines of# ... define network p1 = PoissonInput(...) p2 = PoissonInput(...) p2.active = False # switch off second input run(...) # switch from first to second input p1.active = False p2.active = True run(...)
How interesting. Thank you very much.
Since I don't have deep understanding of Poisson input , I wanted to ask you if I generate 2 PoissonInput with the same rate(with the same initialization), will the result be the same ? I mean in terms of correlation of input spikes.
Note sure I undertand. The results will not be exactly the same (different random numbers), but the statistics are the same in both cases. The spikes are uncorrelated.
Is there any way to monitor poisoninput in the way that be used for PoissonGroup (SpikeMonitor(Poissongroup)) ?
Ah sorry, I did not think about that. In cases like this you have to be more explicit about what the components of your model are, by creating a
Network
object. Something like this should work:# .. define network p = PoissonInput(...) net = Network(collect()) # create network with all objects net.run(...) # run first simulation net.remove(p) # remove previous PoissonInput p = PoissonInput(...) # create new PoissonInput net.add(p) # add the new object to the network net.run(...) # run new simulation
when I am using this way, after the first run I recieve this message : "neurongroup has already been run in the context of another network. Use add/remove to change the objects in a simulated network instead of creating a new one." should I also remove neuronGroup each time?
from brian2 import *
G = NeuronGroup(1, 'dv/dt = -v/(10*ms) : 1')
p1 = PoissonInput(G, 'v', 10, 50*Hz, 0.1)
state_mon = StateMonitor(G, 'v', record=0)
net = Network(collect())
net.run(100*ms)
net.remove(p1)
p2 = PoissonInput(G, 'v', 10, 5*Hz, 0.1)
net.add(p2)
net.run(100*ms)
plt.plot(state_mon.t/ms, state_mon.v[0])
plt.show()
Is there any way to monitor poisoninput in the way that be used for PoissonGroup (SpikeMonitor(Poissongroup)) ?
It is not as straightforward, since it does not generate any individual events/spikes, but instead determines the total number of spikes for each time step (this is much faster if you have several neurons, i.e. N >> 1. If this is not the case, then rather use a PoissonGroup
). If the PoissonInput
is the only thing that updates the target variable (g_e
in your earlier example), then you can use a StateMonitor
to observe that variable and see the effect of PoissonInput
. By comparing the value before and after the update, you get its effect. Here's how to update my earlier example to plot the PoissonInput
contribution:
from brian2 import *
G = NeuronGroup(1, 'dv/dt = -v/(10*ms) : 1')
p1 = PoissonInput(G, 'v', 10, 50*Hz, 0.1)
state_mon = StateMonitor(G, 'v', record=0)
poisson_mon_before = StateMonitor(G, 'v', record=0, when='before_synapses')
poisson_mon_after = StateMonitor(G, 'v', record=0, when='after_synapses')
net = Network(collect())
net.run(100*ms)
net.remove(p1)
p2 = PoissonInput(G, 'v', 10, 5*Hz, 0.1)
net.add(p2)
net.run(100*ms)
fig, (ax_top, ax_bottom) = plt.subplots(2, 1, sharex=True)
ax_top.plot(state_mon.t/ms, state_mon.v[0])
ax_bottom.plot(poisson_mon_before.t/ms, poisson_mon_after.v[0] - poisson_mon_before.v[0])
plt.show()
PoissonInput
contribution.
Synapses
object, then you have to use when='synapses'
for the StateMonitor
s, and use the order
argument of the StateMonitor
s and the PoissonInput
to make sure that the order of operations is : first monitor → PoissonInput → second monitor (see https://brian2.readthedocs.io/en/stable/user/running.html#scheduling)
I would be grateful if you could take a look at my issue in this link : https://brian.discourse.group/t/issues-with-spikegeneratorgroup/626/1
I've just solved this problem with adding an offset over run to spike_times of each input.
I would be grateful if you could take a look at my issue in this link : https://brian.discourse.group/t/issues-with-spikegeneratorgroup/626/1
I've just solved this problem with adding an offset over run to spike_times of each input.
Great, that's what I would have suggested :blush: Could you answer/close your question on the discourse group as well, please?
consider a neurongroup : Neurons=NeuronGroup(N, eqs , threshold='v>v_thr' ) exc_neurons = neurons[:N_e]
inh_neurons = neurons[N_e:] , I want to give 2 different "v_thr" for excitatory and inhibitory neurons ( N=N_e+N_i ). how can I define V>v_thr as input parameter in neuron equation?
You can define an individual threshold for each neuron, by adding the threshold as a parameter to the equations (as in the second example in the documentation. Then you can write exc_neurons.v_thr = ...
and inh_neurons.v_thr = ...
)
I would be grateful if you could take a look at my issue in this link : https://brian.discourse.group/t/issues-with-spikegeneratorgroup/626/1
I've just solved this problem with adding an offset over run to spike_times of each input.
Great, that's what I would have suggested :blush: Could you answer/close your question on the discourse group as well, please?
For sure. I'll do it.
consider a neurongroup : Neurons=NeuronGroup(N, eqs , threshold='v>v_thr' ) exc_neurons = neurons[:N_e]
inh_neurons = neurons[N_e:] , I want to give 2 different "v_thr" for excitatory and inhibitory neurons ( N=N_e+N_i ). how can I define V>v_thr as input parameter in neuron equation?You can define an individual threshold for each neuron, by adding the threshold as a parameter to the equations (as in the second example in the documentation. Then you can write
exc_neurons.v_thr = ...
andinh_neurons.v_thr = ...
)
exc_neurons.reset='v = -65mV'
inh_neurons.reset='v = -60mV' . I had done them but I recieved this message: Could not find a state variable with name "reset". Use the add_attribute method if you intend to add a new attribute to the object.
reset
, but rather something like v_reset
. I.e., add v_reset : volt (constant)
to the equations, then you can do exc_neurons.v_reset = -65*mV
and the same for the inhibitory neurons.
Thanks @mstimberg I meant for ">" on equation. exc_neurons.v_thr ='v>-65' is it correct ? and should it be defined as constant ?
No, this is not correct. Your threshold condition in the neuron group should be v > v_thr
and v_thr : volt (constant)
should be in your equations (as in the example in the documentation: https://brian2.readthedocs.io/en/stable/user/models.html#threshold-and-reset). Then, you can set exc_neurons.v_thr = -65*mV
.
when I was using :exc_neurons.v_reset = -65mV or exc_neurons.v_reset='v=-65mV' , for both , I recieve this error over simulation : Parsing the statement failed: v_reset
I am a bit confused: in addition to the threshold, you also want to set the reset differently for excitatory and inhibitory neurons, right? These lines will not give that error, but I guess you made an error elsewhere? E.g. did you write reset='v_reset'
in the NeuronGroup
definition, instead of `reset='v = v_reset'?
I tried to install Brian2 with the following command:
pip3 install --target=/home/wxie/Brian2/pkgs --upgrade brian2 pytest sphinx docutils mpi4py
when importing brian2, it shows the following errors:
from brian2 import *
/home/wxie/Brian2/pkgs/_distutils_hack/init.py:17: UserWarning: Distutils was imported before Setuptools, but importing Setuptools also replaces thedistutils
module insys.modules
. This may lead to undesirable behaviors or errors. To avoid these issues, avoid using distutils directly, ensure that setuptools is installed in the traditional way (e.g. not an editable install), and/or make sure that setuptools is always imported before distutils.
warnings.warn(
/home/wxie/Brian2/pkgs/_distutils_hack/init.py:30: UserWarning: Setuptools is replacing distutils.
warnings.warn("Setuptools is replacing distutils.")
any hints are appreciated
setuptools
. Could you check that you are using a recent setuptools
version, or simply update it to the latest version?
Hi @Willam_Xavier. This project is about working on the Brian2GeNN interface so that it supports more of GeNN’s features. Except for unforeseen bug fixes, etc., it should not involve changing anything on GeNN’s side. All that said, please note that the application deadline for this year’s Google Summer of Code was on April 19th…
Hi @mstimberg , I thought GeNN doesn't support heterogeneous synapses delays. Is that right GeNN actually does support the feature and one just need to add another interface to bridge Brian2 and GeNN?