Changeset 468

Show
Ignore:
Timestamp:
10/04/08 00:21:06 (2 months ago)
Author:
apdavison
Message:

Wrote a bunch more unit tests for nest2 module.

Code coverage went from this:

Name Stmts Exec Cover
-------------------------------------------
pyNN/common 676 398 58%
pyNN/nest2/init 824 578 70%
pyNN/nest2/cells 47 39 82%
pyNN/nest2/connectors 201 125 62%
pyNN/nest2/electrodes 16 0 0%
pyNN/nest2/synapses 70 0 0%

to this:

Name Stmts Exec Cover
-------------------------------------------

pyNN/common 676 447 66%
pyNN/nest2/init 826 619 74%
pyNN/nest2/cells 47 47 100%
pyNN/nest2/connectors 215 197 91%
pyNN/nest2/electrodes 16 0 0%
pyNN/nest2/synapses 71 53 74%

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/nest2/__init__.py

    r465 r468  
    525525                        connect_id += [Connection(src, tgt, 'static_synapse')] 
    526526    #except nest.SLIError: 
    527     except Exception: # unfortunately, SLIError seems to have disappeared.Hopefully it will be reinstated. 
    528         raise common.ConnectionError 
     527    except Exception, errmsg: # unfortunately, SLIError seems to have disappeared.Hopefully it will be reinstated. 
     528        raise common.ConnectionError, errmsg 
    529529    return connect_id 
    530530 
     
    12711271        """Each presynaptic cell makes a fixed number of connections.""" 
    12721272        n = parameters['n'] 
     1273        allow_self_connections = True 
    12731274        if parameters.has_key('allow_self_connections'): 
    12741275            allow_self_connections = parameters['allow_self_connections'] 
     
    12791280        """Each postsynaptic cell receives a fixed number of connections.""" 
    12801281        n = parameters['n'] 
     1282        allow_self_connections = True 
    12811283        if parameters.has_key('allow_self_connections'): 
    12821284            allow_self_connections = parameters['allow_self_connections'] 
  • trunk/src/nest2/connectors.py

    r442 r468  
    1717                  sin, sinh, sqrt, tan, tanh 
    1818 
     19CHECK_CONNECTIONS = True 
     20 
     21class InvalidWeightError(Exception): pass 
     22 
    1923def _convertWeight(w, synapse_type): 
    2024    weight = w*1000.0 
     
    2226        all_negative = (weight<=0).all() 
    2327        all_positive = (weight>=0).all() 
    24         assert all_negative or all_positive, "Weights must be either all positive or all negative" 
     28        if not (all_negative or all_positive): 
     29            raise InvalidWeightError("Weights must be either all positive or all negative") 
    2530        if synapse_type == 'inhibitory' and all_positive: 
    2631            weight *= -1 
     32        elif synapse_type == 'excitatory': 
     33            if not all_positive: 
     34                raise InvalidWeightError("Weights must be positive for excitatory synapses") 
    2735    elif is_number(weight): 
    2836        if synapse_type == 'inhibitory' and weight > 0: 
    2937            weight *= -1 
     38        elif synapse_type == 'excitatory': 
     39            if weight < 0: 
     40                raise InvalidWeightError("Weight must be positive for excitatory synapses. Actual value %s" % weight) 
    3041    else: 
    31         raise TypeError("we must be either a number or a numpy array") 
     42        raise TypeError("weight must be either a number or a numpy array") 
    3243    return weight 
    3344 
    34  
    35 def get_target_ports(pre, target_list, synapse_type): 
    36     # The connection dict returned by NEST contains a list of target ids, 
    37     # so it is possible to obtain the target port by finding the index of 
    38     # the target in this list. For now, we stick with saving the target port 
    39     # in Python (faster, but more memory needed), but PyNEST should soon have 
    40     # a function to do the lookup, at which point we will switch to using that. 
    41     first_port = len(nest.GetConnections([pre], synapse_type)[0]['targets']) 
    42     return range(first_port, first_port+len(target_list)) 
    43  
     45def check_connections(prj, src, intended_targets): 
     46    conn_dict = nest.GetConnections([src], prj.plasticity_name)[0] 
     47    if isinstance(conn_dict, dict): 
     48        N = len(intended_targets) 
     49        all_targets = conn_dict['targets'] 
     50        actual_targets = all_targets[-N:] 
     51        assert actual_targets == intended_targets, "%s != %s" % (actual_targets, intended_targets) 
     52    else: 
     53        raise Exception("Problem getting connections for %s" % pre) 
    4454 
    4555class AllToAllConnector(common.AllToAllConnector):     
     
    6070            projection._targets += target_list 
    6171            projection._sources += [pre]*N 
    62             #projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
    63             nest.DivergentConnectWD([pre], target_list, weights, delays) 
     72            nest.DivergentConnectWD([pre], target_list, weights, delays) 
     73            if CHECK_CONNECTIONS: 
     74                check_connections(projection, pre, target_list) 
    6475        return len(projection._targets) 
    6576 
     
    7182            projection._targets = projection.post.cell.flatten() 
    7283            N = len(projection._sources) 
    73             #projection._target_ports = [get_target_ports(pre, [None], projection._plasticity_model)[0] for pre in projection._sources] 
    7484            weights = self.getWeights(N) 
    7585            weights = _convertWeight(weights, projection.synapse_type).tolist() 
     
    7888            return projection.pre.size 
    7989        else: 
    80             raise Exception("OneToOneConnector does not support presynaptic and postsynaptic Populations of different sizes.") 
     90            raise common.InvalidDimensionsError("OneToOneConnector does not support presynaptic and postsynaptic Populations of different sizes.") 
    8191     
    8292class FixedProbabilityConnector(common.FixedProbabilityConnector): 
     
    107117            projection._targets += target_list 
    108118            projection._sources += [pre]*N 
    109             #projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
    110             nest.DivergentConnectWD([pre], target_list, weights, delays) 
     119            nest.DivergentConnectWD([pre], target_list, weights, delays) 
     120            if CHECK_CONNECTIONS: 
     121                check_connections(projection, pre, target_list) 
    111122        return len(projection._sources) 
    112123     
     
    166177            projection._targets += target_list 
    167178            projection._sources += [pre]*N  
    168             #projection._target_ports += get_target_ports(pre, target_list, projection._plasticity_model) 
    169             nest.DivergentConnectWD([pre], target_list, weights, delays) 
     179            nest.DivergentConnectWD([pre], target_list, weights, delays) 
     180            if CHECK_CONNECTIONS: 
     181                check_connections(projection, pre, target_list) 
    170182        return len(projection._sources) 
    171183 
     
    183195            else: 
    184196                n = self.n 
    185             target_list = rng.permutation(postsynaptic_neurons)[0:n] 
    186             # if self connections are not allowed, check whether pre and post are the same 
    187             if not self.allow_self_connections and pre in target_list: 
    188                 target_list.remove(pre) 
    189  
    190             N = len(target_list) 
    191             weights = self.getWeights(N) 
    192             weights = _convertWeight(weights, projection.synapse_type).tolist() 
    193             delays = self.getDelays(N).tolist() 
    194             nest.DivergentConnectWD([pre], target_list.tolist(), weights, delays) 
     197                assert n > 0 
     198                 
     199            if not self.allow_self_connections and projection.pre == projection.post: 
     200                # if self connections are not allowed, remove `post` from the target list before picking the n values 
     201                tmp_postsyn = postsynaptic_neurons.tolist() 
     202                tmp_postsyn.remove(pre) 
     203                target_list = rng.permutation(tmp_postsyn)[0:n].tolist()    
     204            else: 
     205                target_list = rng.permutation(postsynaptic_neurons)[0:n].tolist() 
     206 
     207            N = len(target_list) 
     208            weights = self.getWeights(N) 
     209            weights = _convertWeight(weights, projection.synapse_type).tolist() 
     210            delays = self.getDelays(N).tolist() 
     211            nest.DivergentConnectWD([pre], target_list, weights, delays) 
    195212            projection._sources += [pre]*N 
    196             conn_dict = nest.GetConnections([pre], projection._plasticity_model)[0] 
    197             if isinstance(conn_dict, dict): 
    198                 all_targets = conn_dict['targets'] 
    199                 total_targets = len(all_targets) 
    200                 projection._targets += all_targets[-N:] 
    201                 #projection._target_ports += range(total_targets-N, total_targets) 
    202         return len(projection._sources) 
    203  
    204 def _n_connections(population, synapse_type): 
    205     """ 
    206     Get a list of the total number of connections made by each neuron in a 
    207     population. 
    208     """ 
    209     n = numpy.zeros((len(population),),'int') 
    210     conn_dict_list = nest.GetConnections([id for id in population], synapse_type) 
    211     for i, conn_dict in enumerate(conn_dict_list): 
    212         assert isinstance(conn_dict, dict) 
    213         n[i] = len(conn_dict['targets']) 
    214     return n 
     213            projection._targets += target_list 
     214            if CHECK_CONNECTIONS: 
     215                check_connections(projection, pre, target_list) 
     216        return len(projection._sources) 
     217 
    215218 
    216219class FixedNumberPreConnector(common.FixedNumberPreConnector): 
     
    222225        else: 
    223226            rng = numpy.random 
    224         start_ports = _n_connections(projection.pre, projection._plasticity_model) 
    225227        for post in projection.post.cell.flat: 
    226228            if hasattr(self, 'rand_distr'): 
     
    228230            else: 
    229231                n = self.n 
    230             source_list = rng.permutation(presynaptic_neurons)[0:n] 
    231             # if self connections are not allowed, check whether pre and post are the same 
    232             if not self.allow_self_connections and post in source_list: 
    233                 source_list.remove(post) 
    234  
     232                 
     233            if not self.allow_self_connections and projection.pre == projection.post: 
     234                # if self connections are not allowed, remove `post` from the source list before picking the n values 
     235                tmp_presyn = presynaptic_neurons.tolist() 
     236                tmp_presyn.remove(post) 
     237                source_list = rng.permutation(tmp_presyn)[0:n].tolist()     
     238            else: 
     239                source_list = rng.permutation(presynaptic_neurons)[0:n].tolist() 
     240             
    235241            N = len(source_list) 
    236242            weights = self.getWeights(N) 
     
    238244            delays = self.getDelays(N).tolist() 
    239245 
    240             nest.ConvergentConnectWD(source_list.tolist(), [post], 
     246            nest.ConvergentConnectWD(source_list, [post], 
    241247                                     weights, delays) 
    242  
    243         end_ports = _n_connections(projection.pre, projection._plasticity_model) 
    244         for pre, start_port, end_port in zip(presynaptic_neurons, start_ports, end_ports): 
    245             #projection._target_ports += range(start_port, end_port) 
    246             projection._sources += [pre]*(end_port-start_port) 
    247             conn_dict = nest.GetConnections([pre], projection._plasticity_model)[0] 
    248             if isinstance(conn_dict, dict): 
    249                 projection._targets += conn_dict['targets'][start_port:end_port] 
     248            if CHECK_CONNECTIONS: 
     249                for src in source_list: 
     250                    check_connections(projection, src, [post]) 
     251            projection._sources += source_list 
     252            projection._targets += [post]*N 
     253 
    250254        return len(projection._sources) 
    251255 
     
    261265        projection._sources.append(src) 
    262266        projection._targets.append(tgt) 
    263         #projection._target_ports.append(get_target_ports(src, [tgt], projection._plasticity_model)[0]) 
    264267        weights.append(_convertWeight(weight, projection.synapse_type)) 
    265268        delays.append(delay) 
  • trunk/src/nest2/synapses.py

    r415 r468  
    4444    def __init__(self, U=0.5, tau_rec=100.0, tau_facil=0.0, u0=0.0, x0=1.0, y0=0.0): 
    4545        common.TsodyksMarkramMechanism.__init__(self, U, tau_rec, tau_facil, u0, x0, y0) 
    46         parameters = locals() 
    47         parameters.pop('self') 
     46        parameters = dict(locals()) # need the dict to get a copy of locals. When running 
     47        parameters.pop('self')      # through coverage.py, for some reason, the pop() doesn't have any effect 
     48        print parameters 
    4849        self.parameters = self.translate(parameters) 
    4950 
     
    6869            raise Exception("Non-zero minimum weight is not supported by NEST.") 
    6970        common.AdditiveWeightDependence.__init__(self, w_min, w_max, A_plus, A_minus) 
    70         parameters = locals(
     71        parameters = dict(locals()
    7172        parameters.pop('self') 
    7273        self.parameters = self.translate(parameters) 
     
    9394            raise Exception("Non-zero minimum weight is not supported by NEST.") 
    9495        common.MultiplicativeWeightDependence.__init__(self, w_min, w_max, A_plus, A_minus) 
    95         parameters = locals(
     96        parameters = dict(locals()
    9697        parameters.pop('self')  
    9798        self.parameters = self.translate(parameters) 
     
    117118            raise Exception("Non-zero minimum weight is not supported by NEST.") 
    118119        common.AdditivePotentiationMultiplicativeDepression.__init__(self, w_min, w_max, A_plus, A_minus) 
    119         parameters = locals(
     120        parameters = dict(locals()
    120121        parameters.pop('self')  
    121122        self.parameters = self.translate(parameters) 
     
    143144        if w_min != 0: 
    144145            raise Exception("Non-zero minimum weight is not supported by NEST.") 
    145         common.AdditivePotentiationMultiplicativeDepression.__init__(self, w_min, w_max, A_plus, A_minus) 
    146         parameters = locals(
     146        common.GutigWeightDependence.__init__(self, w_min, w_max, A_plus, A_minus) 
     147        parameters = dict(locals()
    147148        parameters.pop('self')  
    148149        self.parameters = self.translate(parameters) 
     
    159160    def __init__(self, tau_plus=20.0, tau_minus=20.0): 
    160161        common.SpikePairRule.__init__(self, tau_plus, tau_minus) 
    161         parameters = locals(
     162        parameters = dict(locals()
    162163        parameters.pop('self') 
    163164        self.parameters = self.translate(parameters) 
  • trunk/test/unittests/nest2tests.py

    r433 r468  
    2828    return (abs(a-b) < threshold).all() 
    2929 
     30def max_array_diff(a, b): 
     31    return max(abs(a-b)) 
     32 
    3033# ============================================================================== 
    3134class CreationTest(unittest.TestCase): 
     
    4043    def testCreateStandardCell(self): 
    4144        """create(): First cell created should have GID==1""" 
    42         ifcell = nest.create(nest.IF_curr_alpha) 
    43         assert ifcell == 1, 'Failed to create standard cell' 
     45        for cell_type in nest.list_standard_models(): 
     46            ifcell = nest.create(cell_type) 
     47            assert ifcell.cellclass == cell_type 
    4448         
    4549    def testCreateStandardCells(self): 
     
    428432        nest.Population.nPop = 0 
    429433        self.target33 = nest.Population((3,3),nest.IF_curr_alpha, label="target33") 
    430         self.target6  = nest.Population((6,),nest.IF_curr_alpha, label="target6") 
     434        self.target6  = nest.Population((6,),nest.IF_cond_exp, label="target6") 
    431435        self.source5  = nest.Population((5,),nest.SpikeSourcePoisson, label="source5") 
     436        self.source6  = self.target6 
    432437        self.source22 = nest.Population((2,2),nest.SpikeSourcePoisson, label="source22") 
    433438        self.source33 = nest.Population((3,3),nest.SpikeSourcePoisson, label="source33") 
     
    435440    def testAllToAll(self): 
    436441        """For all connections created with "allToAll" it should be possible to obtain the weight using pynest.getWeight()""" 
    437         for srcP in [self.source5, self.source22]: 
    438             for tgtP in [self.target6, self.target33]: 
    439                 prj1 = nest.Projection(srcP, tgtP, "allToAll", label="string") 
    440                 prj2 = nest.Projection(srcP, tgtP, nest.AllToAllConnector(), label="connector") 
    441                 for prj in prj1,prj2: 
    442                     assert len(prj._sources) == len(prj._targets) 
    443                     weights = [] 
    444                     for src,tgt in prj.connections(): 
    445                         ###print "--------", prj.label, srcP.label, tgtP.label, src, tgt 
    446                         ###print nest.nest.GetConnections([src],'static_synapse') ### 
    447                         weights.append(get_weight(src, tgt, prj.plasticity_name)) 
    448                     assert weights == [0.0]*len(prj._sources) 
     442        for srcP in [self.source5, self.source22, self.source6]: 
     443            for tgtP in [self.target6, self.target33]: 
     444                for syn_type in 'excitatory', 'inhibitory': 
     445                    for allow_self_connections in True, False: 
     446                        prj1 = nest.Projection(srcP, tgtP, "allToAll", {'allow_self_connections':allow_self_connections}, target=syn_type, label="string") 
     447                        prj2 = nest.Projection(srcP, tgtP, nest.AllToAllConnector(allow_self_connections=allow_self_connections), target=syn_type, label="connector") 
     448                        for prj in prj1,prj2: 
     449                            assert len(prj._sources) == len(prj._targets) 
     450                            weights = [] 
     451                            for src,tgt in prj.connections(): 
     452                                ###print "--------", prj.label, srcP.label, tgtP.label, src, tgt 
     453                                ###print nest.nest.GetConnections([src],'static_synapse') ### 
     454                                weights.append(get_weight(src, tgt, prj.plasticity_name)) 
     455                            assert weights == [0.0]*len(prj._sources) 
    449456     
    450457    def testOneToOne(self): 
     
    454461        assert len(prj1) == self.source33.size 
    455462        assert len(prj2) == self.source33.size 
     463        self.assertRaises(common.InvalidDimensionsError, nest.Projection, self.source33, self.target6, nest.OneToOneConnector()) 
    456464         
    457465    def testDistanceDependentProbability(self): 
     
    460468        for rngclass in (nest.NumpyRNG, nest.NativeRNG): 
    461469            for expr in ('exp(-d)', 'd < 0.5'): 
    462                 prj1 = nest.Projection(self.source33, self.target33, 
    463                                          'distanceDependentProbability', 
    464                                          {'d_expression' : expr},rng=rngclass(12345)) 
    465                 prj2 = nest.Projection(self.source33, self.target33, 
    466                                          nest.DistanceDependentProbabilityConnector(d_expression=expr), 
    467                                          rng=rngclass(12345)) 
    468                 assert (0 < len(prj1) < len(self.source33)*len(self.target33)) \ 
    469                    and (0 < len(prj2) < len(self.source33)*len(self.target33)) 
    470                 if rngclass == nest.NumpyRNG: 
    471                     assert prj1._sources == prj2._sources, "%s %s" % (rngclass, expr) 
    472                     assert prj1._targets == prj2._targets, "%s %s" % (rngclass, expr) 
     470                for allow_self_connections in True, False: 
     471                    prj1 = nest.Projection(self.source33, self.target33, 
     472                                             'distanceDependentProbability', 
     473                                             {'d_expression': expr, 'allow_self_connections':allow_self_connections}, 
     474                                             rng=rngclass(12345)) 
     475                    prj2 = nest.Projection(self.source33, self.target33, 
     476                                             nest.DistanceDependentProbabilityConnector(d_expression=expr, allow_self_connections=allow_self_connections), 
     477                                             rng=rngclass(12345)) 
     478                    assert (0 < len(prj1) < len(self.source33)*len(self.target33)) \ 
     479                       and (0 < len(prj2) < len(self.source33)*len(self.target33)) 
     480                    if rngclass == nest.NumpyRNG: 
     481                        assert prj1._sources == prj2._sources, "%s %s" % (rngclass, expr) 
     482                        assert prj1._targets == prj2._targets, "%s %s" % (rngclass, expr) 
     483 
     484    def testFixedNumberPost(self): 
     485        for srcP in [self.source5, self.source22, self.source6]: 
     486            for tgtP in [self.target6, self.target33]: 
     487                for asc in True, False: 
     488                    prj1 = nest.Projection(srcP, tgtP, "fixedNumberPost", {'n': 4, 
     489                                                                           'allow_self_connections':asc}, label="string") 
     490                    prj2 = nest.Projection(srcP, tgtP, nest.FixedNumberPostConnector(n=4, allow_self_connections=asc), label="connector") 
     491                    for prj in prj1,prj2: 
     492                        assert len(prj._sources) == len(prj._targets), "src=%s, tgt=%s" % (prj._sources, prj._targets) 
     493                        assert prj.getWeights('list') == [0.0, 0.0, 0.0, 0.0]*len(srcP), str(prj.getWeights('list')) 
     494     
     495    def testFixedNumberPre(self): 
     496        for srcP in [self.source5, self.source22, self.source6]: 
     497            for tgtP in [self.target6, self.target33]: 
     498                for asc in True, False: 
     499                    prj1 = nest.Projection(srcP, tgtP, "fixedNumberPre", {'n': 4, 
     500                                                                          'allow_self_connections':asc}, label="string") 
     501                    prj1.setWeights(0.5) 
     502                    prj2 = nest.Projection(srcP, tgtP, nest.FixedNumberPreConnector(n=4, weights=0.5, allow_self_connections=asc), label="connector") 
     503                    for prj in prj1,prj2: 
     504                        assert len(prj._sources) == len(prj._targets), "src=%s, tgt=%s" % (prj._sources, prj._targets) 
     505                        assert prj.getWeights('list') == [0.5, 0.5, 0.5, 0.5]*len(tgtP), str(prj.getWeights('list')) 
    473506 
    474507    def testFixedProbability(self): 
     
    476509        for srcP in [self.source5, self.source22]: 
    477510            for tgtP in [self.target6, self.target33]: 
    478                 prj1 = nest.Projection(srcP, tgtP, "fixedProbability", 0.5) 
    479                 prj2 = nest.Projection(srcP, tgtP, nest.FixedProbabilityConnector(0.5)) 
    480                 for prj in prj1, prj2: 
    481                     assert len(prj._sources) == len(prj._targets) 
    482                     weights = [] 
    483                     for src, tgt in prj.connections(): 
    484                         #print nest.nest.GetConnections([src],[tgt]) 
    485                         weights.append(get_weight(src, tgt, prj.plasticity_name)) 
    486                     assert weights == [0.]*len(prj._sources) 
     511                for rng in None, random.NumpyRNG(), random.NativeRNG(): 
     512                    prj1 = nest.Projection(srcP, tgtP, "fixedProbability", 0.5, rng=rng) 
     513                    prj2 = nest.Projection(srcP, tgtP, nest.FixedProbabilityConnector(0.5), rng=rng) 
     514                    for prj in prj1, prj2: 
     515                        assert len(prj._sources) == len(prj._targets) 
     516                        weights = [] 
     517                        for src, tgt in prj.connections(): 
     518                            #print nest.nest.GetConnections([src],[tgt]) 
     519                            weights.append(get_weight(src, tgt, prj.plasticity_name)) 
     520                        assert weights == [0.]*len(prj._sources) 
     521                     
     522    def testFromList(self): 
     523        conn_list_22_33 = [([0,0], [0,2], 0.25, 0.5), 
     524                           ([0,0], [1,2], 0.5, 0.5), 
     525                           ([1,0], [2,2], 0.125, 0.1)] 
     526        prj = nest.Projection(self.source22, self.target33, nest.FromListConnector(conn_list_22_33)) 
     527        assert prj.getWeights('list') == [0.25, 0.5, 0.125], str(prj.getWeights('list')) 
     528        assert prj.getDelays('list') == [0.5, 0.5, 0.1], str(prj.getDelays('list')) 
    487529                     
    488530    def testSaveAndLoad(self): 
     
    504546        assert (w1 == w2) and (d1 == d2) 
    505547 
     548    def testInitialWeightsFromPositiveArray(self): 
     549        for srcP in [self.source5, self.source22]: 
     550            for tgtP in [self.target6, self.target33]: 
     551                for syn_type in 'excitatory', 'inhibitory': 
     552                    weights_in = numpy.random.uniform(0.1,0.2,len(srcP)*len(tgtP)) 
     553                    connector = nest.AllToAllConnector(weights=weights_in) 
     554                    prj = nest.Projection(srcP, tgtP, connector, target=syn_type) 
     555                    weights_out = numpy.array(prj.getWeights(format='list')) 
     556                    if syn_type == 'inhibitory': 
     557                        weights_out *= -1 
     558                    assert arrays_almost_equal(weights_in, weights_out, 1e-9), '(%s) %s != %s' % (syn_type, weights_in, weights_out) 
     559 
     560    def testInitialInhibitoryWeightsFromNegativeArray(self): 
     561        for srcP in [self.source5, self.source22]: 
     562            for tgtP in [self.target6, self.target33]: 
     563                weights_in = numpy.random.uniform(-0.1,-0.2,len(srcP)*len(tgtP)) 
     564                connector = nest.AllToAllConnector(weights=weights_in) 
     565                prj = nest.Projection(srcP, tgtP, connector, target='inhibitory') 
     566                weights_out = numpy.array(prj.getWeights(format='list')) 
     567                assert arrays_almost_equal(weights_in, weights_out, 1e-9), '(%s) %s != %s' % (syn_type, weights_in, weights_out) 
     568                 
     569    def testInitialExcitatoryWeightsFromNegativeArray(self): 
     570        for srcP in [self.source5, self.source22]: 
     571            for tgtP in [self.target6, self.target33]: 
     572                weights_in = numpy.random.uniform(-0.1,-0.2,len(srcP)*len(tgtP)) 
     573                connector = nest.AllToAllConnector(weights=weights_in) 
     574                self.assertRaises(nest.InvalidWeightError, nest.Projection, srcP, tgtP, connector, target='excitatory') 
     575                 
     576    def testInitialWeightsFromMixedArray(self): 
     577        for srcP in [self.source5, self.source22]: 
     578            for tgtP in [self.target6, self.target33]: 
     579                weights_in = numpy.random.uniform(-0.1,0.1,len(srcP)*len(tgtP)) 
     580                connector = nest.AllToAllConnector(weights=weights_in) 
     581                self.assertRaises(nest.InvalidWeightError, nest.Projection, srcP, tgtP, connector) 
     582     
     583    def testInitialNegativeWeight(self): 
     584        for srcP in [self.source5, self.source22]: 
     585            for tgtP in [self.target6, self.target33]: 
     586                connector = nest.AllToAllConnector(weights=-1.23) 
     587                self.assertRaises(nest.InvalidWeightError, nest.Projection, srcP, tgtP, connector, target='excitatory') 
     588                prj = nest.Projection(srcP, tgtP, connector, target='inhibitory') 
     589                assert arrays_almost_equal(numpy.array(prj.getWeights(format='list')), -1.23*numpy.ones(len(srcP)*len(tgtP)), 1e-9) 
     590                 
    506591class ProjectionSetTest(unittest.TestCase): 
    507592    """Tests of the setWeights(), setDelays(), randomizeWeights() and 
     
    636721        self.assert_((self.pop2[0,2].position == (0.5,1.5,0.0)).all()) 
    637722 
     723class SynapseDynamicsTest(unittest.TestCase): 
     724     
     725    def setUp(self): 
     726        nest.setup(max_delay=0.5) 
     727        nest.Population.nPop = 0 
     728        self.target33 = nest.Population((3,3),nest.IF_curr_alpha, label="target33") 
     729        self.target6  = nest.Population((6,),nest.IF_cond_exp, label="target6") 
     730        self.source5  = nest.Population((5,),nest.SpikeSourcePoisson, label="source5") 
     731        self.source6  = self.target6 
     732        self.source22 = nest.Population((2,2),nest.SpikeSourcePoisson, label="source22") 
     733        self.source33 = nest.Population((3,3),nest.SpikeSourcePoisson, label="source33") 
     734        self.connectors = [nest.AllToAllConnector(weights=0.1, delays=0.2), 
     735                           nest.FixedProbabilityConnector(1.0, weights=0.1, delays=0.2)] 
     736 
     737    def testCreateProjectionWithTsodyksMarkramSynapses(self): 
     738        sd = nest.SynapseDynamics(fast=nest.TsodyksMarkramMechanism()) 
     739        for srcP in [self.source5, self.source22, self.source6]: 
     740            for tgtP in [self.target6, self.target33]: 
     741                for conn  in self.connectors: 
     742                    prj = nest.Projection(srcP, tgtP, 
     743                                          conn, 
     744                                          label="connector", 
     745                                          synapse_dynamics=sd) 
     746                    assert prj.getWeights('list') == [0.1]*(len(srcP)*len(tgtP)), "%s != %s" % (prj.getWeights('list'),[0.1]*(len(srcP)*len(tgtP))) 
     747                    assert prj.getDelays('list') == [0.2]*(len(srcP)*len(tgtP)) 
     748                    assert prj._get_connection_values('list', 'U', gather=False) == [0.5]*(len(srcP)*len(tgtP)) 
     749 
     750    def testCreateSimpleSTDPConnection(self): 
     751        for wd in [nest.AdditiveWeightDependence(w_max=0.7654), 
     752                   nest.GutigWeightDependence(w_max=0.7654)]: 
     753            stdp = nest.STDPMechanism(timing_dependence=nest.SpikePairRule(), 
     754                                      weight_dependence=wd) 
     755            sd = nest.SynapseDynamics(slow=stdp) 
     756            for srcP in [self.source5, self.source22, self.source6]: 
     757                for tgtP in [self.target6, self.target33]: 
     758                    for conn  in self.connectors: 
     759                        prj = nest.Projection(srcP, tgtP, 
     760                                              conn, 
     761                                              label="connector", 
     762                                              synapse_dynamics=sd) 
     763                        assert prj.getWeights('list') == [0.1]*(len(srcP)*len(tgtP)), "%s != %s" % (prj.getWeights('list'),[0.1]*(len(srcP)*len(tgtP))) 
     764                        assert prj.getDelays('list') == [0.2]*(len(srcP)*len(tgtP)) 
     765                        assert prj._get_connection_values('list', 'Kplus', gather=False) == [0.0]*(len(srcP)*len(tgtP)) 
     766                        assert nest.nest.GetSynapseDefaults(prj.plasticity_name)['Wmax'] == 0.7654*1000.0 
     767            print nest.nest.GetConnections([prj.pre.index(0)], prj.plasticity_name) 
     768            print nest.nest.GetSynapseDefaults(prj.plasticity_name) 
    638769 
    639770if __name__ == "__main__":