Note
Go to the end to download the full example code.
Using CSA with spatial populations¶
Run this example as a Jupyter notebook:
See our guide for more information and troubleshooting.
This example shows a brute-force way of specifying connections between NEST populations with spatial data using Connection Set Algebra instead of the built-in connection routines.
Using the CSA requires NEST to be compiled with support for libneurosim. For details, see [1].
See Also¶
References¶
First, we import all necessary modules.
import matplotlib.pyplot as plt
import nest
Next, we check for the availability of the CSA Python module. If it does not import, we exit with an error message.
try:
import csa
haveCSA = True
except ImportError:
print(
"This example requires CSA to be installed in order to run.\n"
+ "Please make sure you compiled NEST using\n"
+ " -Dwith-libneurosim=[OFF|ON|</path/to/libneurosim>]\n"
+ "and CSA and libneurosim are available."
)
import sys
sys.exit(1)
We define a factory that returns a CSA-style geometry function for the given layer. The function returned will return for each CSA-index the position in space of the given neuron as a 2- or 3-element list.
This function stores a copy of the neuron positions internally, entailing memory overhead.
def geometryFunction(population):
positions = nest.GetPosition(population)
def geometry_function(idx):
return positions[idx]
return geometry_function
We create two spatial populations that have 20x20 neurons of type
iaf_psc_alpha
.
pop1 = nest.Create("iaf_psc_alpha", positions=nest.spatial.grid([20, 20]))
pop2 = nest.Create("iaf_psc_alpha", positions=nest.spatial.grid([20, 20]))
For each population, we create a CSA-style geometry function and a CSA metric based on them.
g1 = geometryFunction(pop1)
g2 = geometryFunction(pop2)
d = csa.euclidMetric2d(g1, g2)
The connection set cg describes a Gaussian connectivity profile with
sigma = 0.2
and cutoff at 0.5, and two values (10000.0 and 1.0) used as
weight
and delay
, respectively.
cg = csa.cset(csa.random * (csa.gaussian(0.2, 0.5) * d), 10000.0, 1.0)
We can now connect the populations using the Connect
function
with the conngen
rule. It takes the IDs of pre- and postsynaptic
neurons (pop1
and pop2
), the connection set (cg
) and a
dictionary that map the parameters weight and delay to positions in
the value set associated with the connection set (params_map
).
params_map = {"weight": 0, "delay": 1}
connspec = {"rule": "conngen", "cg": cg, "params_map": params_map}
nest.Connect(pop1, pop2, connspec)
Finally, we use the PlotTargets
function to show all targets in pop2
starting at the center neuron of pop1.
cntr = nest.FindCenterElement(pop1)
nest.PlotTargets(cntr, pop2)
plt.show()