Changeset 878 for branches

Show
Ignore:
Timestamp:
12/17/10 08:07:44 (17 months ago)
Author:
apdavison
Message:

In reorganization branch, fixed nest.Population.set() for computed parameters and for NativeCellType.

Location:
branches/reorganization
Files:
1 added
6 modified

Legend:

Unmodified
Added
Removed
  • branches/reorganization/src/common.py

    r877 r878  
    506506        else: 
    507507            raise errors.InvalidParameterValueError 
    508         for name, val in param_dict.items(): 
    509             if name not in self.celltype.get_parameter_names(): 
    510                 raise errors.NonExistentParameterError(name, self.celltype, self.celltype.get_parameter_names()) 
    511             if isinstance(val, (float, int)): 
    512                 param_dict[name] = float(val) 
    513             elif isinstance(val, (list, numpy.ndarray)): 
    514                 pass  # ought to check list/array only contains numeric types 
    515             else: 
    516                 raise errors.InvalidParameterValueError 
     508        param_dict = self.celltype.checkParameters(param_dict, with_defaults=False) 
    517509        logger.debug("%s.set(%s)", self.label, param_dict) 
    518510        if hasattr(self, "_set_array"): 
     
    865857        for variable, value in self.celltype.default_initial_values.items(): 
    866858            self.initialize(variable, value) 
    867 #        # should only create recorders for recordable variables: pointless creating a 'v' recorder for a spike source 
    868 #        self.recorders = {'spikes': self.recorder_class('spikes', population=self), 
    869 #                          'v'     : self.recorder_class('v', population=self), 
    870 #                          'gsyn'  : self.recorder_class('gsyn', population=self)} 
    871859        self.recorders = {} 
    872860        Population.nPop += 1 
     
    975963 
    976964class PopulationView(BasePopulation): 
     965    """ 
     966    docstring needed 
     967    """ 
    977968 
    978969    def __init__(self, parent, selector, label=None): 
  • branches/reorganization/src/nest/__init__.py

    r876 r878  
    77import nest 
    88from pyNN.nest import simulator 
    9 from pyNN import common, recording, errors, space, standardmodels, __doc__ 
     9from pyNN import common, recording, errors, space, __doc__ 
    1010common.simulator = simulator 
    1111recording.simulator = simulator 
     
    2424from pyNN.nest.recording import * 
    2525from pyNN.random import RandomDistribution 
     26from pyNN import standardmodels 
    2627 
    2728Set = set 
     
    222223        else: 
    223224            raise errors.InvalidParameterValueError 
    224          
     225        param_dict = self.celltype.checkParameters(param_dict, with_defaults=False) 
    225226        # The default implementation in common is is not very efficient for 
    226227        # simple and scaled parameters. 
     
    231232        # in the computation vary between cells, since if this is not the case 
    232233        # we can do the computation here and use nest.SetStatus. 
    233         to_be_set = {} 
    234         for key, value in param_dict.items(): 
    235             if not isinstance(self.celltype, str): 
    236                 # Here we check the consistency of the given parameters 
    237                 try: 
    238                     self.celltype.default_parameters[key] 
    239                 except Exception: 
    240                     raise errors.NonExistentParameterError(key, self.celltype.__class__) 
    241                 if type(value) != type(self.celltype.default_parameters[key]): 
    242                     if isinstance(value, int) and isinstance(self.celltype.default_parameters[key], float): 
    243                         value = float(value) 
    244                     elif (isinstance(value, numpy.ndarray) and len(value.shape) == 1) and isinstance(self.celltype.default_parameters[key], list): 
    245                         pass 
    246                     else: 
    247                         raise errors.InvalidParameterValueError("The parameter %s should be a %s, you supplied a %s" % (key, 
    248                                                                                                                         type(self.celltype.default_parameters[key]), 
    249                                                                                                                         type(value))) 
    250                 # Then we do the call to SetStatus 
    251                 if key in self.celltype.scaled_parameters() or key in self.celltype.computed_parameters(): 
     234         
     235        if isinstance(self.celltype, standardmodels.StandardCellType): 
     236            to_be_set = {} 
     237            for key, value in param_dict.items(): 
     238                if key in self.celltype.scaled_parameters(): 
    252239                    translation = self.celltype.translations[key] 
    253240                    value = eval(translation['forward_transform'], globals(), {key:value}) 
    254                     to_be_set[translation['translated_name']] = value 
     241                    to_be_set[translation['translated_name']] = value                 
    255242                elif key in self.celltype.simple_parameters(): 
    256243                    translation = self.celltype.translations[key] 
    257244                    to_be_set[translation['translated_name']] = value                     
    258245                else: 
    259                     to_be_set[key] = value 
    260             else: 
    261                 try: 
    262                     nest.SetStatus(self.local_cells, key, value) 
    263                 except Exception: 
    264                     raise errors.InvalidParameterValueError 
     246                    assert key in self.celltype.computed_parameters() 
    265247            nest.SetStatus(self.local_cells.tolist(), to_be_set) 
     248            for key, value in param_dict.items(): 
     249                if key in self.celltype.computed_parameters(): 
     250                    for cell in self: 
     251                        cell.set_parameters(**{key:value}) 
     252        else: 
     253            nest.SetStatus(self.local_cells.tolist(), param_dict) 
    266254 
    267255    def initialize(self, variable, value): 
  • branches/reorganization/src/standardmodels/__init__.py

    r875 r878  
    5858     
    5959    def __init__(self, parameters): 
     60        assert set(self.translations.keys()) == set(self.default_parameters.keys()), \ 
     61               "%s != %s" % (self.translations.keys(), self.default_parameters.keys()) 
    6062        self.parameters = self.__class__.checkParameters(parameters, with_defaults=True) 
    6163        self.parameters = self.__class__.translate(self.parameters) 
     
    122124 
    123125 
    124  
    125  
    126126class StandardCellType(StandardModelType, models.BaseCellType): 
    127127    """Base class for standardized cell model classes.""" 
  • branches/reorganization/test/system/test_nest.py

    r876 r878  
    2828     
    2929    class ht_neuron(nest.NativeCellType): 
    30         default_initial_values = { 
    31             'V_m': -65.0, 
    32             'Theta': -51.0 
    33         } 
    34         default_parameters = { 
    35             'Tau_m': 16.0, 
    36             'Theta_eq': -51.0, 
    37         } 
    3830        nest_model = 'ht_neuron' 
    3931        conductance_based = True 
    40         synapse_types = ['AMPA'] 
    4132        standard_receptor_type = False 
    4233     
     
    4435        injectable = False 
    4536        nest_model = "poisson_generator" 
    46         default_parameters = { 
    47             'rate': 0.0, 
    48             'start': 0.0, 
    49             'stop': 1e12 
    50         } 
    5137     
    5238    parameters = {'Tau_m': 17.0} 
     
    5440    p1.initialize('V_m', -70.0) 
    5541    p1.initialize('Theta', -50.0) 
     42    p1.set('Theta_eq', -51.5) 
     43    assert_equal(p1.get('Theta_eq'), [-51.5]*10) 
    5644    print p1.get('Tau_m') 
    5745    p1.rset('Tau_m', RandomDistribution('uniform', [15.0, 20.0])) 
  • branches/reorganization/test/unittests/test_basepopulation.py

    r870 r878  
    1111class MockStandardCell(standardmodels.StandardCellType): 
    1212    recordable = ['v', 'spikes'] 
    13     default_parameters = {'tau_m': 999.9, 'i_offset': 321, 'spike_times': [0,1,2], 'foo': 33.3} 
     13    default_parameters = {'tau_m': 999.9, 'i_offset': 321.0, 'spike_times': [0,1,2], 'foo': 33.3} 
     14    translations = {'tau_m': None, 'i_offset': None, 'spike_times': None, 'foo': None} 
    1415    @classmethod 
    1516    def translate(cls, parameters): 
     
    202203    assert_raises(errors.InvalidParameterValueError, p.set, {'foo': 'bar'}) 
    203204 
     205def test_set_inconsistent_type(): 
     206    p = MockPopulation() 
     207    p._set_array = Mock() 
     208    assert_raises(errors.InvalidParameterValueError, p.set, 'tau_m', [12.34, 56.78]) 
     209 
    204210def test_set_with_no_get_array(): 
    205211    mock_cell = Mock() 
     
    214220    p = MockPopulation() 
    215221    p._set_array = Mock() 
    216     p.set('foo', range(10)) 
    217     p._set_array.assert_called_with(**{'foo': range(10)}) 
     222    p.set('spike_times', range(10)) 
     223    p._set_array.assert_called_with(**{'spike_times': range(10)}) 
    218224     
    219225def test_tset_with_numeric_values(): 
  • branches/reorganization/test/unittests/test_standardmodels.py

    r814 r878  
    4848    """ 
    4949    M = StandardModelType 
     50    M.default_parameters = {'a': 0.0, 'b': 0.0} 
     51    M.translations = {'a': None, 'b': None} 
    5052    P1 = {'a': 22.2, 'b': 33.3} 
    5153    P2 = {'A': 22.2, 'B': 333}