Changeset 433

Show
Ignore:
Timestamp:
08/05/08 13:59:20 (2 months ago)
Author:
pierre
Message:

Work on nest2.py, still to improve the building time of a large network. The _targets_ports are removed, and we use the FindConnections?() method of nest to retrieve the connections after they have been build. It seems to work. unit tests have also been updated, just to take into account the fact that now, we use a particular synapse_context for each projection, and that connections are retrieved within those contexts. Minor others stuffs, like adding the Result directory to the test directory, changing the simple_STDP.py test file to deal with the new way of handling synaptic_contexts.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/nest1/connectors.py

    r415 r433  
    2121        all_positive = (weight>=0).all() 
    2222        assert all_negative or all_positive, "Weights must be either all positive or all negative" 
    23         if synapse_type == 'inhibitory': 
    24             if all_positive: 
    25                 weight *= -1 
     23        if synapse_type == 'inhibitory' and all_positive: 
     24            weight *= -1 
    2625    elif is_number(weight): 
    2726        if synapse_type == 'inhibitory' and weight > 0: 
     
    7372        presynaptic_neurons  = numpy.reshape(projection.pre.cell,(projection.pre.cell.size,)) 
    7473        npre = projection.pre.size 
     74        if projection.rng: 
     75            if isinstance(projection.rng, NativeRNG): 
     76                print "Warning: use of NativeRNG not implemented. Using NumpyRNG" 
     77                rng = numpy.random 
     78            else: 
     79                rng = projection.rng 
     80        else: 
     81            rng = numpy.random 
    7582        for post in postsynaptic_neurons: 
    76             if projection.rng: 
    77                 rarr = projection.rng.uniform(0,1,(npre,)) # what about NativeRNG? 
    78             else: 
    79                 rarr = numpy.random.uniform(0,1,(npre,)) 
     83            rarr = rng.uniform(0, 1, npre) # what about NativeRNG? 
    8084            source_list = numpy.compress(numpy.less(rarr, self.p_connect), presynaptic_neurons).tolist() 
    8185            # if self connections are not allowed, check whether pre and post are the same 
  • trunk/src/nest2/__init__.py

    r432 r433  
    125125        if file is False: 
    126126            device_parameters.update(to_file=False, to_memory=True) 
     127        # line needed for old version of nest 2.0 
     128        # device_parameters.pop('to_memory') 
    127129        nest.SetStatus(self._device, device_parameters) 
    128130 
     
    574576        if isinstance(cellclass, type): 
    575577            self.celltype = cellclass(cellparams) 
     578            self.cellparams = self.celltype.parameters 
    576579            if not parent: 
    577580                self.cell = nest.Create(self.celltype.nest_name, self.size) 
     
    579582                #A SubPopulation has been created, those fields will be filled later 
    580583                self.cell = [] 
    581             self.cellparams = self.celltype.parameters 
    582584        elif isinstance(cellclass, str): 
    583585            if not parent: 
     
    911913            nest.sps(self.recorders['spikes']._device[0]) 
    912914            nest.sr("%d GetAddress %d append" %(self.recorders['spikes']._device[0], node)) 
     915            #nest.sr("GetStatus /events get") 
    913916            nest.sr("GetStatus /n_events get") 
    914917            n_spikes += nest.spp() 
     
    985988 
    986989        def __init__(self, parent): 
    987             self.parent = parent 
     990            self.parent    = parent 
     991            self.port_idx  = 0 
     992            self.last_conn = (0,0) 
     993         
     994        def reset(self): 
     995            self.port_idx  = 0 
     996            self.last_conn = (0,0) 
    988997 
    989998        def __getitem__(self, id): 
    990999            """Returns a (source address, target port number) tuple.""" 
    991             assert isinstance(id, int) 
    992             return (self.parent._sources[id], self.parent._target_ports[id]) 
     1000            src = self.parent._sources[id] 
     1001            tgt = self.parent._targets[id] 
     1002            connections = nest.FindConnections([src],[tgt], self.parent.plasticity_name) 
     1003            # We keep this counter to be sure that, when several connections have been 
     1004            # established for the same source <-> target, we iterates over those connections 
     1005            # Note that, for the moment, there may a problem if the sources/targets lists are 
     1006            # not sorted according to the sources. 
     1007            if (src,tgt) == self.last_conn: 
     1008                self.port_idx += 1 
     1009            else: 
     1010                self.port_idx  = 0 
     1011                self.last_conn = (src,tgt) 
     1012            return (src,connections['ports'][self.port_idx]) 
    9931013 
    9941014    def __init__(self, presynaptic_population, postsynaptic_population, 
     
    10421062        # Set synaptic plasticity parameters 
    10431063        original_synapse_context = nest.GetSynapseContext() 
    1044         #self.plasticity_name = self.label.replace(" ","_to_") 
    1045         #nest.CopySynapseType(self._plasticity_model,"excitatory") 
    1046         nest.SetSynapseContext(self._plasticity_model) 
     1064         
     1065        # We create a particular synapse context just for this projection, by copying 
     1066        # the one which is desired. The name of the synapse context is randomly generated 
     1067        # and will be available as projection.plasticity_name 
     1068        self.plasticity_name = "%d" %numpy.random.random_integers(0,1000) 
     1069        #self.plasticity_name = self.label.replace(" → ","_to_") 
     1070        nest.CopySynapseType(self._plasticity_model,self.plasticity_name) 
     1071        # Then we define this copy of the standard plasticity model as the current one) 
     1072        nest.SetSynapseContext(self.plasticity_name) 
    10471073 
    10481074        if hasattr(self, '_short_term_plasticity_parameters') and self._short_term_plasticity_parameters: 
    1049             synapse_defaults = nest.GetSynapseDefaults(self._plasticity_model
     1075            synapse_defaults = nest.GetSynapseDefaults(self.plasticity_name
    10501076            synapse_defaults.pop('num_connections') # otherwise NEST tells you to check your spelling! 
    10511077            if 'num_connectors' in synapse_defaults: 
    10521078                synapse_defaults.pop('num_connectors') 
    10531079            synapse_defaults.update(self._short_term_plasticity_parameters) 
    1054              
    1055             nest.SetSynapseDefaults(self._plasticity_model, synapse_defaults) 
     1080            nest.SetSynapseDefaults(self.plasticity_name, synapse_defaults) 
    10561081 
    10571082        if hasattr(self, '_stdp_parameters') and self._stdp_parameters: 
     
    10681093                raise Exception("Postsynaptic cell model does not support STDP.") 
    10691094 
    1070             synapse_defaults = nest.GetSynapseDefaults(self._plasticity_model
     1095            synapse_defaults = nest.GetSynapseDefaults(self.plasticity_name
    10711096            if 'num_connectors' in synapse_defaults: 
    10721097                synapse_defaults.pop('num_connectors') # otherwise NEST tells you to check your spelling! 
    10731098            synapse_defaults.pop('num_connections') # otherwise NEST tells you to check your spelling! 
    10741099            synapse_defaults.update(self._stdp_parameters) 
    1075             nest.SetSynapseDefaults(self._plasticity_model, synapse_defaults) 
     1100            nest.SetSynapseDefaults(self.plasticity_name, synapse_defaults) 
    10761101 
    10771102        # Create connections 
     
    10971122    def connections(self): 
    10981123        """for conn in prj.connections()...""" 
     1124        self.connection.reset() 
    10991125        for i in xrange(len(self)): 
    11001126            yield self.connection[i] 
     
    12301256            if optimized: 
    12311257                for src in self.pre.cell.flat: 
    1232                     _set_connections(src, self._plasticity_model, **{name: value}) 
     1258                    _set_connections(src, self.plasticity_name, **{name: value}) 
    12331259            else: 
    12341260                for src, port in self.connections(): 
    1235                     _set_connection(src, port, self._plasticity_model, **{name: value}) 
     1261                    _set_connection(src, port, self.plasticity_name, **{name: value}) 
    12361262        elif isinstance(value, (list, numpy.ndarray)): 
    12371263            # this is probably not the most efficient way - should sort by src and then use SetConnections? 
     
    12391265            for (src,port),v in zip(self.connections(), value): 
    12401266                try: 
    1241                     _set_connection(src, port, self._plasticity_model, **{name: v}) 
     1267                    _set_connection(src, port, self.plasticity_name, **{name: v}) 
    12421268                except common.RoundingWarning: 
    12431269                    logging.warning("Rounding occurred when setting %s to %s" % (name, v)) 
     
    12961322                                                                    self._method) 
    12971323        print "\tsource\ttarget\tport" 
    1298         for conn in zip(self._sources, self._targets, self._target_ports): 
    1299             print "\t%d\t%d\t%d" % conn 
     1324        for src,tgt in zip(self._sources, self._targets): 
     1325            connections = nest.FindConnections([src],[tgt],self.plasticity_name) 
     1326            for port in connections['ports']: 
     1327                print "\t%d\t%d\t%d" % (src, tgt, port) 
    13001328        print "Connection data for the presynaptic population (%s)" % self.pre.label 
    13011329        for src in self.pre.cell.flat: 
    1302             print src, nest.GetConnections([src], self._plasticity_model
     1330            print src, nest.GetConnections([src], self.plasticity_name
    13031331 
    13041332    def _get_connection_values(self, format, parameter_name, gather): 
     
    13071335            values = [] 
    13081336            for src, port in self.connections(): 
    1309                 values.append(_get_connection(src, port, self._plasticity_model, parameter_name)) 
     1337                values.append(_get_connection(src, port, self.plasticity_name, parameter_name)) 
    13101338        elif format == 'array': 
    13111339            values = numpy.zeros((self.pre.size, self.post.size)) 
    13121340            for src, port in self.connections(): 
    1313                 v, tgt = _get_connection(src, port, self._plasticity_model
     1341                v, tgt = _get_connection(src, port, self.plasticity_name
    13141342                                         parameter_name, 'target') 
    13151343                # note that we assume that Population ids are consecutive, which is the case, but we should 
     
    13501378        weights = []; delays = [] 
    13511379        for src, port in self.connections(): 
    1352             weight, delay = _get_connection(src, port, self._plasticity_model
     1380            weight, delay = _get_connection(src, port, self.plasticity_name
    13531381                                            'weight', 'delay') 
    13541382            # Note unit change from pA to nA or nS to uS, depending on synapse type 
     
    13941422        """ 
    13951423        description = common.Projection.describe(self, template) 
    1396         description += "\n    Parameters of connection from %d to %d [port %d]" % (self._sources[0], self._targets[0], self._target_ports[0]) 
    1397         dict = nest.GetConnections([self.pre.cell.flat[0]], self._plasticity_model)[0] 
     1424        src = self._sources[0] 
     1425        tgt = self._targets[0] 
     1426        port = nest.FindConnections([src],[tgt],self.plasticity_name)['ports'][0] 
     1427        description += "\n    Parameters of connection from %d to %d [port %d]" % (src, tgt, port) 
     1428        dict = nest.GetConnections([self.pre.cell.flat[0]], self.plasticity_name)[0] 
    13981429        for i in xrange(len(self._targets)): 
    13991430            idx  = numpy.where(numpy.array(dict['targets']) == self._targets[i])[0] 
  • trunk/src/nest2/connectors.py

    r415 r433  
    1212from pyNN.random import RandomDistribution, NativeRNG 
    1313from math import * 
     14from random import sample 
    1415from numpy import arccos, arcsin, arctan, arctan2, ceil, cos, cosh, e, exp, \ 
    1516                  fabs, floor, fmod, hypot, ldexp, log, log10, modf, pi, power, \ 
     
    2223        all_positive = (weight>=0).all() 
    2324        assert all_negative or all_positive, "Weights must be either all positive or all negative" 
    24         if synapse_type == 'inhibitory': 
    25             if all_positive: 
    26                 weight *= -1 
     25        if synapse_type == 'inhibitory' and all_positive: 
     26            weight *= -1 
    2727    elif is_number(weight): 
    2828        if synapse_type == 'inhibitory' and weight > 0: 
     
    4646 
    4747    def connect(self, projection): 
    48         postsynaptic_neurons  = projection.post.cell.flatten() 
     48        postsynaptic_neurons  = projection.post.cell_local.flatten() 
    4949        target_list = postsynaptic_neurons.tolist() 
    5050        for pre in projection.pre.cell.flat: 
     
    6060            projection._targets += target_list 
    6161            projection._sources += [pre]*N 
    62             projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
     62            #projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
    6363            nest.DivergentConnectWD([pre], target_list, weights, delays) 
    6464        return len(projection._targets) 
     
    7171            projection._targets = projection.post.cell.flatten() 
    7272            N = len(projection._sources) 
    73             projection._target_ports = [get_target_ports(pre, [None], projection._plasticity_model)[0] for pre in projection._sources] 
     73            #projection._target_ports = [get_target_ports(pre, [None], projection._plasticity_model)[0] for pre in projection._sources] 
    7474            weights = self.getWeights(N) 
    7575            weights = _convertWeight(weights, projection.synapse_type).tolist() 
     
    8383     
    8484    def connect(self, projection): 
    85         postsynaptic_neurons = projection.post.cell.flatten() 
     85        postsynaptic_neurons = projection.post.cell_local 
    8686        npost = len(postsynaptic_neurons) 
    87         for pre in projection.pre.cell.flat: 
    88             if projection.rng: 
    89                 rarr = projection.rng.uniform(0, 1, (npost,)) # what about NativeRNG? 
    90             else: 
    91                 rarr = numpy.random.uniform(0, 1, (npost,)) 
     87        if projection.rng: 
     88            if isinstance(projection.rng, NativeRNG): 
     89                print "Warning: use of NativeRNG not implemented. Using NumpyRNG" 
     90                rng = numpy.random 
     91            else: 
     92                rng = projection.rng 
     93        else: 
     94            rng = numpy.random 
     95        for pre in projection.pre.cell.flat: 
     96            rarr = rng.uniform(0, 1, npost) # what about NativeRNG? 
    9297            target_list = numpy.compress(numpy.less(rarr, self.p_connect), postsynaptic_neurons).tolist() 
     98            #N           = rng.binomial(npost,self.p_connect,1)[0] 
     99            #target_list = sample(postsynaptic_neurons, N) 
    93100            # if self connections are not allowed, check whether pre and post are the same 
    94101            if not self.allow_self_connections and pre in target_list: 
     
    97104            weights = self.getWeights(N) 
    98105            weights = _convertWeight(weights, projection.synapse_type).tolist() 
    99             delays = self.getDelays(N).tolist() 
     106            delays = self.getDelays(N).tolist() 
    100107            projection._targets += target_list 
    101108            projection._sources += [pre]*N 
    102             projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
     109            #projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
    103110            nest.DivergentConnectWD([pre], target_list, weights, delays) 
    104111        return len(projection._sources) 
     
    157164            projection._targets += target_list 
    158165            projection._sources += [pre]*N  
    159             projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
     166            #projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
    160167            nest.DivergentConnectWD([pre], target_list, weights, delays) 
    161168        return len(projection._sources) 
     
    191198                total_targets = len(all_targets) 
    192199                projection._targets += all_targets[-N:] 
    193                 projection._target_ports += range(total_targets-N, total_targets) 
     200                #projection._target_ports += range(total_targets-N, total_targets) 
    194201        return len(projection._sources) 
    195202 
     
    235242        end_ports = _n_connections(projection.pre, projection._plasticity_model) 
    236243        for pre, start_port, end_port in zip(presynaptic_neurons, start_ports, end_ports): 
    237             projection._target_ports += range(start_port, end_port) 
     244            #projection._target_ports += range(start_port, end_port) 
    238245            projection._sources += [pre]*(end_port-start_port) 
    239246            conn_dict = nest.GetConnections([pre], projection._plasticity_model)[0] 
     
    253260        projection._sources.append(src) 
    254261        projection._targets.append(tgt) 
    255         projection._target_ports.append(get_target_ports(src, [tgt], projection._plasticity_model)[0]) 
     262        #projection._target_ports.append(get_target_ports(src, [tgt], projection._plasticity_model)[0]) 
    256263        weights.append(_convertWeight(weight, projection.synapse_type)) 
    257264        delays.append(delay) 
  • trunk/test/VAbenchmarks.py

    r409 r433  
    140140rng = NumpyRNG(seed=rngseed, parallel_safe=False, rank=node_id, num_processes=np) 
    141141uniformDistr = RandomDistribution('uniform', [v_reset,v_thresh], rng=rng) 
    142 if simulator == "brian": 
    143     uniformDistr = RandomDistribution('uniform', [v_reset*0.001,v_thresh*0.001], rng=rng) 
    144142exc_cells.randomInit(uniformDistr) 
    145143inh_cells.randomInit(uniformDistr) 
  • trunk/test/simple_STDP.py

    r415 r433  
    3636 
    3737if simulator == "nest2": 
    38     print nest.GetConnection([p1[0]], 'stdp_synapse_hom', 0) 
     38    print nest.GetConnection([p1[0]], prj.plasticity_name, 0) 
    3939    print nest.GetStatus([p2[0]]) 
    4040 
     
    4747    while t < 50: 
    4848        t = run(1.0) 
    49         syn_dict = nest.GetConnection([p1[0]], 'stdp_synapse_hom', 0) 
     49        syn_dict = nest.GetConnection([p1[0]], prj.plasticity_name, 0) 
    5050        print "%4.1f   %6.4f   %7.3f   %6.4f" % (t, prj.getWeights()[0], syn_dict['Kplus'], syn_dict['weight']) 
    5151#run(1000.0) 
  • trunk/test/unittests/nest2tests.py

    r410 r433  
    1111import os 
    1212 
    13 def get_weight(src, port): 
    14     conn_dict = nest.nest.GetConnection([src], 'static_synapse', port) 
     13def get_weight(src, port, plasticity_name): 
     14    conn_dict = nest.nest.GetConnection([src], plasticity_name, port) 
    1515    if isinstance(conn_dict, dict): 
    1616        return conn_dict['weight'] 
     
    1818        raise Exception("Either the source id (%s) or the port number (%s) or both is invalid." % (src, port)) 
    1919 
    20 def get_delay(src, port): 
    21     conn_dict = nest.nest.GetConnection([src], 'static_synapse', port) 
     20def get_delay(src, port, plasticity_name): 
     21    conn_dict = nest.nest.GetConnection([src], plasticity_name, port) 
    2222    if isinstance(conn_dict, dict): 
    2323        return conn_dict['delay'] 
     
    445445                        ###print "--------", prj.label, srcP.label, tgtP.label, src, tgt 
    446446                        ###print nest.nest.GetConnections([src],'static_synapse') ### 
    447                         weights.append(get_weight(src, tgt)) 
     447                        weights.append(get_weight(src, tgt, prj.plasticity_name)) 
    448448                    assert weights == [0.0]*len(prj._sources) 
    449449     
     
    483483                    for src, tgt in prj.connections(): 
    484484                        #print nest.nest.GetConnections([src],[tgt]) 
    485                         weights.append(get_weight(src, tgt)) 
     485                        weights.append(get_weight(src, tgt, prj.plasticity_name)) 
    486486                    assert weights == [0.]*len(prj._sources) 
    487487                     
     
    497497        # are equal. 
    498498        for src,tgt in prj1.connections(): 
    499             w1.append(get_weight(src, tgt)) 
    500             d1.append(get_delay(src, tgt)) 
     499            w1.append(get_weight(src, tgt, prj1.plasticity_name)) 
     500            d1.append(get_delay(src, tgt, prj1.plasticity_name)) 
    501501        for src,tgt in prj2.connections(): 
    502             w2.append(get_weight(src, tgt)) 
    503             d2.append(get_delay(src, tgt)) 
     502            w2.append(get_weight(src, tgt, prj2.plasticity_name)) 
     503            d2.append(get_delay(src, tgt, prj2.plasticity_name)) 
    504504        assert (w1 == w2) and (d1 == d2) 
    505505 
     
    527527            prj.setWeights(1.234) 
    528528            for src, tgt in prj.connections(): 
    529                 assert get_weight(src, tgt) == 1234.0 # note the difference in units between pyNN and NEST 
     529                assert get_weight(src, tgt, prj.plasticity_name) == 1234.0 # note the difference in units between pyNN and NEST 
    530530 
    531531    #def testSetAndGetID(self): 
     
    540540            weights_out = [] 
    541541            for src,tgt in prj.connections(): 
    542                 weights_out.append(0.001*get_weight(src, tgt)) # units conversion 
     542                weights_out.append(0.001*get_weight(src, tgt, prj.plasticity_name)) # units conversion 
    543543            self.assert_(arrays_almost_equal(weights_in, weights_out, 1e-8), "%s != %s" % (weights_in, weights_out)) 
    544544             
     
    549549        w1 = []; w2 = []; 
    550550        for src,tgt in prj1.connections(): 
    551             w1.append(get_weight(src, tgt)) 
     551            w1.append(get_weight(src, tgt, prj1.plasticity_name)) 
    552552        prj1.randomizeWeights(self.distrib_Numpy)         
    553553        for src, tgt in prj1.connections(): 
    554             w2.append(get_weight(src, tgt)) 
     554            w2.append(get_weight(src, tgt, prj1.plasticity_name)) 
    555555        self.assertNotEqual(w1,w2) 
    556556         
     
    561561        d1 = []; d2 = []; 
    562562        for src,tgt in prj1.connections(): 
    563             d1.append(get_delay(src,tgt)) 
     563            d1.append(get_delay(src,tgt, prj1.plasticity_name)) 
    564564        prj1.randomizeDelays(self.distrib_Numpy)         
    565565        for src, tgt in prj1.connections(): 
    566             d2.append(get_delay(src,tgt)) 
     566            d2.append(get_delay(src,tgt, prj1.plasticity_name)) 
    567567        self.assertNotEqual(d1,d2) 
    568568