diff --git a/python/example/brunel.py b/python/example/brunel.py index 30dc11e241ebd2850124db4072618e6bf667b151..37c415cd5b0de09cd283393ca958341baf62ee47 100755 --- a/python/example/brunel.py +++ b/python/example/brunel.py @@ -1,7 +1,9 @@ #!/usr/bin/env python3 import arbor -import numpy,argparse +import argparse +import numpy as np +from numpy.random import RandomState ''' A Brunel network consists of nexc excitatory LIF neurons and ninh inhibitory LIF neurons. @@ -20,14 +22,12 @@ Call with parameters, for example: # Samples m unique values in interval [start, end) - gid. # We exclude gid because we don't want self-loops. -def sample_subset(gid, start, end, m): - gen = numpy.random.RandomState(gid+42) - s = set() - while len(s) < m: - val = gen.randint(low=start,high=end) - if val != gid: - s.add(val) - return s +def sample_subset(gen, gid, start, end, m): + idx = np.arange(start, end) + if start <= gid < end: + idx = np.delete(idx, gid - start) + gen.shuffle(idx) + return idx[:m] class brunel_recipe (arbor.recipe): def __init__(self, nexc, ninh, next, in_degree_prop, weight, delay, rel_inh_strength, poiss_lambda, seed = 42): @@ -61,12 +61,13 @@ class brunel_recipe (arbor.recipe): return arbor.cell_kind.lif def connections_on(self, gid): + gen = RandomState(gid + self.seed_) connections=[] # Add incoming excitatory connections. - for i in sample_subset(gid, 0, self.ncells_exc_, self.in_degree_exc_): + for i in sample_subset(gen, gid, 0, self.ncells_exc_, self.in_degree_exc_): connections.append(arbor.connection((i,"src"), "tgt", self.weight_exc_, self.delay_)) # Add incoming inhibitory connections. - for i in sample_subset(gid, self.ncells_exc_, self.ncells_exc_ + self.ncells_inh_, self.in_degree_inh_): + for i in sample_subset(gen, gid, self.ncells_exc_, self.ncells_exc_ + self.ncells_inh_, self.in_degree_inh_): connections.append(arbor.connection((i,"src"), "tgt", self.weight_inh_, self.delay_)) return connections