Changeset 1003 for trunk

Show
Ignore:
Timestamp:
10/31/11 14:42:54 (7 months ago)
Author:
apdavison
Message:

Removed _simulator attribute from Connector classes. The simulator kernel is now only used within connect(projection), via the _simulator attribute of Projection. This changes means: (i) it should now be possible to run more than one simulator at the same time, without cross-talk via the common Connector classes; (ii) checking for valid delays no longer happens on Connector construction, but is delayed until connect() is called

Location:
trunk
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/brian/connectors.py

    r1000 r1003  
    2424                            WeightGenerator, \ 
    2525                            DelayGenerator, \ 
    26                             ProbaGenerator, Connector 
    27 from pyNN.brian import simulator 
    28  
    29 Connector._simulator = simulator 
     26                            ProbaGenerator 
    3027 
    3128 
     
    122119     
    123120    def connect(self, projection): 
    124         """Connect-up a Projection."""         
     121        """Connect-up a Projection.""" 
     122        if self.delays is None: 
     123            self.delays = projection._simulator.state.min_delay 
    125124        if projection.pre.size == projection.post.size: 
    126125            N                 = projection.post.size 
  • trunk/src/connectors.py

    r1000 r1003  
    6666        self.safe       = safe 
    6767        if self.safe: 
    68             self.get = self.get_safe     
     68            self.get = self.get_safe 
     69        if isinstance(self.source, list): 
     70            self.source = numpy.array(self.source) 
    6971        if isinstance(self.source, numpy.ndarray): 
    7072            self.source_iterator = iter(self.source) 
     
    131133            return values 
    132134        else: 
    133             raise Exception("Invalid source") 
     135            raise Exception("Invalid source (%s)" % type(self.source)) 
    134136 
    135137    def get_safe(self, N, distance_matrix=None, sub_mask=None): 
     
    190192        if not (all_negative and all_positive): 
    191193            raise errors.ConnectionError("delay (%s) is out of range [%s,%s]" % (delay, min_delay, max_delay)) 
    192         return delay     
     194        return delay 
    193195 
    194196 
     
    234236        self.safe    = safe 
    235237        self.verbose = verbose 
    236         min_delay    = self._simulator.state.min_delay 
    237         if delays is None: 
    238             self.delays = min_delay 
    239         else: 
    240             if core.is_listlike(delays): 
    241                 if min(delays) < min_delay: 
    242                     raise errors.ConnectionError("smallest delay (%g) is smaller than minimum delay (%g)" % (min(delays), min_delay)) 
    243             elif not (isinstance(delays, basestring) or isinstance(delays, RandomDistribution)): 
    244                 if delays < min_delay: 
    245                     raise errors.ConnectionError("delay (%g) is smaller than minimum delay (%g)" % (delays, min_delay)) 
    246             self.delays = delays         
    247          
     238        self.delays = delays 
     239     
    248240    def connect(self, projection): 
    249241        raise NotImplementedError() 
     
    252244        self.prog = utility.ProgressBar(0, N, 20, mode='fixed')         
    253245     
    254     def progression(self, count): 
     246    def progression(self, count, mpi_rank): 
    255247        self.prog.update_amount(count) 
    256         if self.verbose and self._simulator.state.mpi_rank == 0:            
     248        if self.verbose and mpi_rank == 0:            
    257249            print self.prog, "\r", 
    258250            sys.stdout.flush() 
     
    291283        else: 
    292284            self.rng = projection.rng 
    293          
     285        if self.delays is None: 
     286            self.delays = projection._simulator.state.min_delay 
    294287        self.local             = projection.post._mask_local 
    295288        self.N                 = projection.post.size 
    296289        self.weights_generator = WeightGenerator(weights, self.local, projection, safe) 
    297         self.delays_generator  = DelayGenerator(delays, self.local, kernel=projection._simulator.state, safe=safe) 
     290        self.delays_generator  = DelayGenerator(self.delays, self.local, kernel=projection._simulator.state, safe=safe) 
    298291        self.probas_generator  = ProbaGenerator(RandomDistribution('uniform', (0,1), rng=self.rng), self.local) 
    299292        self._distance_matrix  = None 
     
    385378        for count, src in enumerate(projection.pre.all()): 
    386379            connector._probabilistic_connect(src, 1) 
    387             self.progression(count) 
     380            self.progression(count, projection._simulator.state.mpi_rank) 
    388381             
    389382     
     
    428421        for count, src in enumerate(projection.pre.all()): 
    429422            connector._probabilistic_connect(src, self.p_connect) 
    430             self.progression(count) 
     423            self.progression(count, projection._simulator.state.mpi_rank) 
    431424             
    432425 
     
    479472                proba = proba.astype(float) 
    480473            connector._probabilistic_connect(src, proba, self.n_connections) 
    481             self.progression(count) 
     474            self.progression(count, projection._simulator.state.mpi_rank) 
    482475     
    483476 
     
    500493        """ 
    501494        # needs extending for dynamic synapses. 
    502         Connector.__init__(self, 0.0, self._simulator.state.min_delay, safe=safe, verbose=verbose) 
     495        Connector.__init__(self, 0.0, None, safe=safe, verbose=verbose) 
    503496        self.conn_list  = numpy.array(conn_list)                
    504497         
     
    531524            #projection._divergent_connect(src, tgts[idx].tolist(), weights[idx], delays[idx]) 
    532525            projection._divergent_connect(src, tgts.tolist(), weights, delays) 
    533             self.progression(count) 
     526            self.progression(count, projection._simulator.state.mpi_rank) 
    534527            count += 1 
    535528 
     
    552545                         distributed simulations. 
    553546        """ 
    554         Connector.__init__(self, 0.0, self._simulator.state.min_delay, safe=safe, verbose=verbose) 
     547        Connector.__init__(self, 0.0, None, safe=safe, verbose=verbose) 
    555548         
    556549        if isinstance(file, basestring): 
     
    613606         
    614607    def connect(self, projection): 
    615         """Connect-up a Projection."""         
     608        """Connect-up a Projection.""" 
     609        if self.delays is None: 
     610            self.delays = projection._simulator.state.min_delay 
    616611        local             = numpy.ones(len(projection.post), bool) 
    617612        weights_generator = WeightGenerator(self.weights, local, projection, self.safe) 
     
    651646                projection._divergent_connect(src, targets.tolist(), weights, delays) 
    652647             
    653             self.progression(count) 
     648            self.progression(count, projection._simulator.state.mpi_rank) 
    654649 
    655650 
     
    700695    def connect(self, projection): 
    701696        """Connect-up a Projection.""" 
     697        if self.delays is None: 
     698            self.delays = projection._simulator.state.min_delay 
    702699        local             = numpy.ones(len(projection.pre), bool) 
    703700        weights_generator = WeightGenerator(self.weights, local, projection, self.safe) 
     
    736733                projection._divergent_connect(src, tgt, w, d) 
    737734             
    738             self.progression(count) 
     735            self.progression(count, projection._simulator.state.mpi_rank) 
    739736             
    740737 
     
    762759     
    763760    def connect(self, projection): 
    764         """Connect-up a Projection."""         
     761        """Connect-up a Projection.""" 
     762        if self.delays is None: 
     763            self.delays = projection._simulator.state.min_delay 
    765764        if projection.pre.size == projection.post.size: 
    766765            N                 = projection.post.size 
     
    780779                # the float is in case the values are of type numpy.float64, which NEST chokes on 
    781780                projection._divergent_connect(src, [tgt], [float(w)], [float(d)]) 
    782                 self.progression(count) 
     781                self.progression(count, projection._simulator.state.mpi_rank) 
    783782                count += 1 
    784783        else: 
     
    866865    def connect(self, projection): 
    867866        """Connect-up a Projection.""" 
     867        if self.delays is None: 
     868            self.delays = projection._simulator.state.min_delay 
    868869        local                  = numpy.ones(len(projection.post), bool) 
    869870        self.N                 = projection.post.size         
     
    885886            proba = proba_generator.get(self.N, self.distance_matrix).astype(float) 
    886887            self._smallworld_connect(src, proba, self.n_connections) 
    887             self.progression(count) 
     888            self.progression(count, projection._simulator.state.mpi_rank) 
    888889 
    889890 
     
    895896            """ 
    896897            """ 
    897             min_delay = self._simulator.state.min_delay 
    898898            Connector.__init__(self, None, None, safe=safe, verbose=verbose) 
    899899            self.cset = cset 
     
    905905                    self.weights = DEFAULT_WEIGHT 
    906906                self.delays = delays 
    907                 if delays is None: 
    908                     self.delays = self._simulator.state.min_delay 
    909907            else: 
    910908                assert cset.arity == 2, 'must specify mask or connection-set with arity 2' 
     
    926924    def connect(self, projection): 
    927925        """Connect-up a Projection.""" 
     926        if self.delays is None: 
     927            self.delays = projection._simulator.state.min_delay 
    928928        i0 = projection.pre.first_id 
    929929        size1 = projection.pre.last_id - i0 
  • trunk/src/nemo/connectors.py

    r1000 r1003  
    2121                            FixedNumberPostConnector, \ 
    2222                            SmallWorldConnector, \ 
    23                             CSAConnector, \ 
    24                             WeightGenerator, \ 
    25                             DelayGenerator, \ 
    26                             ProbaGenerator, \ 
    27                             Connector 
    28 from pyNN.nemo import simulator 
    29  
    30 Connector._simulator = simulator 
     23                            CSAConnector 
  • trunk/src/nest/connectors.py

    r1000 r1003  
    1313                            FromListConnector, FromFileConnector, WeightGenerator, \ 
    1414                            DelayGenerator, ProbaGenerator, DistanceMatrix, CSAConnector 
    15 from pyNN.nest import simulator 
     15 
    1616import numpy 
    1717from pyNN.space import Space 
    1818 
    19 Connector._simulator = simulator 
     19 
    2020 
    2121 
     
    2929        else: 
    3030            self.rng = projection.rng 
    31          
     31        if self.delays is None: 
     32            self.delays = projection._simulator.state.min_delay 
    3233        self.N                 = projection.pre.size    
    3334        idx                    = numpy.arange(self.N*rank(), self.N*(rank()+1))         
  • trunk/src/neuron/connectors.py

    r1000 r1003  
    1818                            FixedNumberPostConnector, \ 
    1919                            SmallWorldConnector, \ 
    20                             CSAConnector, \ 
    21                             Connector 
    22  
    23 Connector._simulator = simulator 
     20                            CSAConnector 
  • trunk/src/pcsim/connectors.py

    r1000 r1003  
    1616                            FixedNumberPreConnector, \ 
    1717                            FixedNumberPostConnector, \ 
    18                             SmallWorldConnector, \ 
    19                             Connector 
    20 from pyNN.pcsim import simulator 
    21  
    22  
    23 Connector._simulator = simulator 
     18                            SmallWorldConnector 
  • trunk/test/unittests/test_connectors.py

    r1000 r1003  
    186186                      (20, 82, 162.0, 0.5)]) 
    187187 
    188     def test_create_with_delays_None(self): 
     188    def test_connect_with_delays_None(self): 
    189189        C = connectors.AllToAllConnector(weights=0.1, delays=None) 
    190190        assert_equal(C.weights, 0.1) 
    191         assert_equal(C.delays, C._simulator.state.min_delay) 
     191        assert_equal(C.delays, None) 
    192192        assert C.safe 
    193193        assert C.allow_self_connections 
    194          
    195     def test_create_with_delays_too_small(self): 
    196         assert_raises(errors.ConnectionError, 
    197                       connectors.AllToAllConnector, 
    198                       allow_self_connections=True, 
    199                       delays=0.0) 
    200  
    201     def test_create_with_list_delays_too_small(self): 
    202         assert_raises(errors.ConnectionError, 
    203                       connectors.AllToAllConnector, 
    204                       allow_self_connections=True, 
    205                       delays=[1.0, 1.0, 0.0]) 
    206      
     194        C.connect(self.prj) 
     195        assert_equal(self.prj.connections[0][3], self.prj._simulator.state.min_delay) 
     196         
     197    def test_connect_with_delays_too_small(self): 
     198        C = connectors.AllToAllConnector(weights=0.1, delays=0.0) 
     199        assert_raises(errors.ConnectionError, C.connect, self.prj) 
     200 
     201    def test_connect_with_list_delays_too_small(self): 
     202        C = connectors.AllToAllConnector(weights=0.1, delays=[1.0, 1.0, 0.0, 0.0, 3.0, 1.5, 2.3, 0.9]) 
     203        assert_raises(errors.ConnectionError, C.connect, self.prj) 
     204 
    207205 
    208206class TestFixedProbabilityConnector(object): 
  • trunk/test/unittests/test_simulation_control.py

    r1000 r1003  
    3939def test_reset(): 
    4040    simulator = MockSimulator() 
    41     reset = common.control.build_reset(simulator) 
     41    reset = common.build_reset(simulator) 
    4242    reset() 
    4343    assert simulator.reset_called 
     
    5151def test_current_time(): 
    5252    simulator = MockSimulator() 
    53     get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.control.build_state_queries(simulator) 
     53    get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.build_state_queries(simulator) 
    5454    get_current_time() 
    5555    assert_equal(simulator.state.accesses, ['t']) 
     
    5757def test_time_step(): 
    5858    simulator = MockSimulator() 
    59     get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.control.build_state_queries(simulator) 
     59    get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.build_state_queries(simulator) 
    6060    get_time_step() 
    6161    assert_equal(simulator.state.accesses, ['dt']) 
     
    6363def test_min_delay(): 
    6464    simulator = MockSimulator() 
    65     get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.control.build_state_queries(simulator) 
     65    get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.build_state_queries(simulator) 
    6666    get_min_delay() 
    6767    assert_equal(simulator.state.accesses, ['min_delay']) 
     
    6969def test_max_delay(): 
    7070    simulator = MockSimulator() 
    71     get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.control.build_state_queries(simulator) 
     71    get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.build_state_queries(simulator) 
    7272    get_max_delay() 
    7373    assert_equal(simulator.state.accesses, ['max_delay']) 
     
    7575def test_num_processes(): 
    7676    simulator = MockSimulator() 
    77     get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.control.build_state_queries(simulator) 
     77    get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.build_state_queries(simulator) 
    7878    num_processes() 
    7979    assert_equal(simulator.state.accesses, ['num_processes']) 
     
    8181def test_rank(): 
    8282    simulator = MockSimulator() 
    83     get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.control.build_state_queries(simulator) 
     83    get_current_time, get_time_step, get_min_delay, get_max_delay, num_processes, rank = common.build_state_queries(simulator) 
    8484    rank() 
    8585    assert_equal(simulator.state.accesses, ['mpi_rank'])