Changeset 1010

Show
Ignore:
Timestamp:
11/22/11 16:10:25 (6 months ago)
Author:
apdavison
Message:

Starting to work again on nineml module

Location:
trunk/src
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/neuron/nineml.py

    r1001 r1010  
    113113 
    114114 
    115 def nineml_cell_type(name, neuron_model, port_map={}, weight_variables={}, **synapse_models): 
     115def nineml_cell_type(name, neuron_model, synapse_models): 
    116116    """ 
    117117    Return a new NineMLCellType subclass. 
    118118    """ 
    119     return _build_nineml_celltype(name, (NineMLCellType,), 
    120                                   {'neuron_model': neuron_model, 
    121                                    'synapse_models': synapse_models, 
    122                                    'port_map': port_map, 
    123                                    'weight_variables': weight_variables, 
    124                                    'builder': _compile_nmodl}) 
    125  
    126  
    127  
    128  
    129  
    130  
     119    return _mh_build_nineml_celltype(name, (NineMLCellType,), 
     120                                     {'neuron_model': neuron_model, 
     121                                      'synapse_models': synapse_models, 
     122                                      'builder': _compile_nmodl}) 
    131123 
    132124def nineml_celltype_from_model(name, nineml_model, synapse_components): 
  • trunk/src/nineml/__init__.py

    r1001 r1010  
    108108    net.to_nineml().write(output_filename) 
    109109     
    110 get_min_delay = common.get_min_delay 
    111 num_processes = common.num_processes 
     110 
     111get_current_time, get_time_step, get_min_delay, get_max_delay, \ 
     112            num_processes, rank = common.build_state_queries(simulator) 
    112113 
    113114def run(tstop): 
  • trunk/src/nineml/cells.py

    r982 r1010  
    218218 
    219219        #Extract Parameters Back out from Dict: 
    220         nineml_model = dct['nineml_model'] 
     220        combined_model = dct['nineml_model'] 
    221221        synapse_components = dct['synapse_components'] 
    222222 
    223223        # Flatten the model: 
    224         assert isinstance(nineml_model, al.ComponentClass) 
    225         if nineml_model.is_flat(): 
    226             flat_component = nineml_model 
     224        assert isinstance(combined_model, al.ComponentClass) 
     225        if combined_model.is_flat(): 
     226            flat_component = combined_model 
    227227        else: 
    228             flat_component = flattening.flatten( nineml_model,name ) 
     228            flat_component = flattening.flatten( combined_model,name ) 
    229229         
    230230        # Make the substitutions: 
  • trunk/src/nineml/read.py

    r957 r1010  
    11""" 
    22Enables creating neuronal network models in PyNN from a 9ML description. 
    3  
    4 For now, there is no support for the 9ML abstraction layer. Instead we use a 
    5 mapping between URIs and PyNN classes. The URIs may point to an abstraction layer 
    6 file which is asserted to represent the same model as the PyNN class. In time, 
    7 the plan is to implement all these abstraction layer files, and then this module 
    8 will actually parse them rather than using name mapping. 
    93 
    104Classes: 
     
    1610 
    1711import nineml.user_layer as nineml 
     12import nineml.abstraction_layer as al 
    1813import pyNN.nineml 
    1914import pyNN.random 
     
    2116import re 
    2217 
    23 def generate_spiking_node_description_map(): 
    24     """ 
    25     Return a mapping between URIs and StandardCellType classes. 
    26     """ 
    27     map = {} 
    28     for m in pyNN.nineml.list_standard_models(): 
    29         definition_url = m.spiking_mechanism_definition_url 
    30         if definition_url in map: 
    31             map[definition_url].add(m) 
    32         else: 
    33             map[definition_url] = set([m]) 
    34     return map 
    35  
    36 def generate_post_synaptic_response_description_map(): 
    37     """ 
    38     Return a mapping between URIs and StandardCellType classes. 
    39     """ 
    40     map = {} 
    41     for m in pyNN.nineml.list_standard_models(): 
    42         if m.synapse_types: # exclude spike sources 
    43             definition_url = m.synaptic_mechanism_definition_urls['excitatory'] 
    44             assert definition_url == m.synaptic_mechanism_definition_urls['inhibitory'] 
    45             if definition_url in map: 
    46                 map[definition_url].add(m) 
    47             else: 
    48                 map[definition_url] = set([m]) 
    49     return map 
    50  
    51 def generate_connector_map(): 
    52     """ 
    53     Return a mapping between URIs and Connector classes. 
    54     """ 
    55     map = {} 
    56     for c in pyNN.nineml.connectors.list_connectors(): 
    57         map[c.definition_url] = c 
    58     return map 
     18#def generate_spiking_node_description_map(): 
     19#    """ 
     20#    Return a mapping between URIs and StandardCellType classes. 
     21#    """ 
     22#    map = {} 
     23#    for m in pyNN.nineml.list_standard_models(): 
     24#        definition_url = m.spiking_mechanism_definition_url 
     25#        if definition_url in map: 
     26#            map[definition_url].add(m) 
     27#        else: 
     28#            map[definition_url] = set([m]) 
     29#    return map 
     30 
     31#def generate_post_synaptic_response_description_map(): 
     32#    """ 
     33#    Return a mapping between URIs and StandardCellType classes. 
     34#    """ 
     35#    map = {} 
     36#    for m in pyNN.nineml.list_standard_models(): 
     37#        if m.synapse_types: # exclude spike sources 
     38#            definition_url = m.synaptic_mechanism_definition_urls['excitatory'] 
     39#            assert definition_url == m.synaptic_mechanism_definition_urls['inhibitory'] 
     40#            if definition_url in map: 
     41#                map[definition_url].add(m) 
     42#            else: 
     43#                map[definition_url] = set([m]) 
     44#    return map 
     45 
     46#def generate_connector_map(): 
     47#    """ 
     48#    Return a mapping between URIs and Connector classes. 
     49#    """ 
     50#    map = {} 
     51#    for c in pyNN.nineml.connectors.list_connectors(): 
     52#        map[c.definition_url] = c 
     53#    return map 
    5954 
    6055def reverse_map(D): 
     
    7065 
    7166def scale(parameter_name, unit): 
    72     """Primitive unit handling. Should probably use Piquant, or similar.""" 
     67    """Primitive unit handling. Should probably use Piquant, quantities, or similar.""" 
    7368    ms = 1 
    7469    mV = 1 
     
    173168 
    174169 
     170def _generate_variable_name(name): 
     171    return name.replace(" ", "_").replace("-", "") 
     172         
     173 
    175174class Network(object): 
    176175    """ 
     
    205204        self.assemblies = {} 
    206205        self.projections = {} 
     206        _tmp = __import__(sim.__name__, globals(), locals(), ["nineml"]) 
     207        self._nineml_module = _tmp.nineml 
    207208        self._build() 
    208209         
     
    233234            self._build_projection(projection, self.assemblies[group.name]) 
    234235     
    235     def _determine_cell_type(self, nineml_population): 
    236         """Determine cell class from standardcell--catalog mapping""" 
    237         cellclass_map = generate_spiking_node_description_map() 
    238         possible_cell_classes_from_spiking_node = cellclass_map[nineml_population.prototype.definition.url] 
    239         if nineml_population.name in self.psr_map: 
    240             synapse_definition_urls = set(psr.definition.url for psr in self.psr_map[nineml_population.name]) 
    241             assert len(synapse_definition_urls) == 1 # exc and inh always same model at present 
    242             synapse_definition_url = list(synapse_definition_urls)[0] 
    243             synapsetype_map = generate_post_synaptic_response_description_map() 
    244             possible_cell_classes_from_psr = synapsetype_map[synapse_definition_url] 
    245             possible_cell_classes = possible_cell_classes_from_spiking_node.intersection(possible_cell_classes_from_psr) 
    246             assert len(possible_cell_classes) == 1 
    247             cell_class = list(possible_cell_classes)[0] 
    248         else: 
    249             print "Population '%s' is not the target of any Projections, so we can choose any synapse model." % nineml_population.name 
    250             cell_class = list(possible_cell_classes_from_spiking_node)[0] 
    251         return cell_class 
    252      
    253     def _determine_cell_type_and_parameters(self, nineml_population): 
     236    #def _determine_cell_type(self, nineml_population): 
     237    #    """Determine cell class from standardcell--catalog mapping""" 
     238    #   cellclass_map = generate_spiking_node_description_map() 
     239    #    possible_cell_classes_from_spiking_node = cellclass_map[nineml_population.prototype.definition.url] 
     240    #    if nineml_population.name in self.psr_map: 
     241    #        synapse_definition_urls = set(psr.definition.url for psr in self.psr_map[nineml_population.name]) 
     242    #        assert len(synapse_definition_urls) == 1 # exc and inh always same model at present 
     243    #        synapse_definition_url = list(synapse_definition_urls)[0] 
     244    #        synapsetype_map = generate_post_synaptic_response_description_map() 
     245    #        possible_cell_classes_from_psr = synapsetype_map[synapse_definition_url] 
     246    #        possible_cell_classes = possible_cell_classes_from_spiking_node.intersection(possible_cell_classes_from_psr) 
     247    #        assert len(possible_cell_classes) == 1 
     248    #        cell_class = list(possible_cell_classes)[0] 
     249    #    else: 
     250    #        print "Population '%s' is not the target of any Projections, so we do not have a synapse model." % nineml_population.name 
     251    #    return cell_class 
     252     
     253 
     254     
     255    def _generate_cell_type_and_parameters(self, nineml_population): 
    254256        """ 
    255257        Determine cell class from standardcell--catalog mapping and cellparams 
    256258        from nineml_population.prototype.parameters and standardcell.translations 
    257259        """ 
    258         cell_class = self._determine_cell_type(nineml_population) 
    259          
    260         nineml_params = nineml_population.prototype.parameters 
    261         if "i_offset" in cell_class.default_parameters: 
    262             nineml_params["offsetCurrent"] = nineml.Parameter("offsetCurrent", 0.0, "nA") 
    263          
     260        neuron_model = nineml_population.prototype.definition.component 
     261        neuron_namespace = _generate_variable_name(nineml_population.prototype.name) 
     262        synapse_models = {} 
     263        cell_params = {} # to be implemented 
    264264        if nineml_population.name in self.psr_map: 
    265             synapse_params = list(self.psr_map[nineml_population.name])[0].parameters 
    266             for target in "excitatory", "inhibitory": 
    267                 for name, value in synapse_params.items(): 
    268                     nineml_params["%s_%s" % (target, name)] = value 
    269         else: # take default values, since the synapses won't be used in any case. 
    270             synapse_params = {"excitatory_decayTimeConstant": nineml.Parameter("decayTimeConstant", 5.0, "ms"), 
    271                               "inhibitory_decayTimeConstant": nineml.Parameter("decayTimeConstant", 5.0, "ms"), 
    272                               "excitatory_reversalPotential": nineml.Parameter("reversalPotential", 0.0, "mV"), 
    273                               "inhibitory_reversalPotential": nineml.Parameter("reversalPotential", -70.0, "mV")} 
    274             nineml_params.update(synapse_params) 
    275          
    276         cell_params = cell_class.reverse_translate(nineml_params) 
     265            for psr_component in self.psr_map[nineml_population.name]: 
     266                synapse_models[_generate_variable_name(psr_component.name)] = psr_component.definition.component 
     267        subnodes = {neuron_namespace: neuron_model} 
     268        subnodes.update(synapse_models) 
     269        combined_model = al.ComponentClass(name=_generate_variable_name(nineml_population.name), 
     270                                           subnodes=subnodes) 
     271        # now connect ports 
     272        connections = [] 
     273        for source in [port for port in neuron_model.analog_ports if port.mode == 'send']: 
     274            for synapse_name, syn_model in synapse_models.items(): 
     275                for target in [port for port in syn_model.analog_ports if port.mode == 'recv']: 
     276                    connections.append(("%s.%s" % (neuron_namespace, source.name), "%s.%s" % (synapse_name, target.name))) 
     277        for synapse_name, syn_model in synapse_models.items(): 
     278            for source in [port for port in syn_model.analog_ports if port.mode == 'send']: 
     279                for target in [port for port in neuron_model.analog_ports if port.mode in ('recv, reduce')]: 
     280                    connections.append(("%s.%s" % (synapse_name, source.name), "%s.%s" % (neuron_namespace, target.name))) 
     281        #import pdb; pdb.set_trace() 
     282        for connection in connections: 
     283            combined_model.connect_ports(*connection) 
     284        synapse_components = [self._nineml_module.CoBaSyn(namespace=name,  weight_connector='q') for name in synapse_models.keys()] 
     285        celltype_cls = self._nineml_module.nineml_cell_type( 
     286            combined_model.name, combined_model, synapse_components) 
    277287        cell_params, random_params = resolve_parameters(cell_params, self.random_distributions) 
    278         return cell_class, cell_params, random_params 
     288        return celltype_cls, cell_params, random_params 
     289     
     290     
     291    #    iaf_2coba_model = al.ComponentClass(  
     292    #        name="iaf_2coba",  
     293    #        subnodes = {"iaf" : iaf.get_component(),  
     294    #                    "cobaExcit" : coba_synapse.get_component(),  
     295    #                    "cobaInhib" : coba_synapse.get_component()} ) 
     296    # 
     297    ## Connections have to be setup as strings, because we are deep-copying objects. 
     298    #iaf_2coba_model.connect_ports( "iaf.V", "cobaExcit.V" ) 
     299    #iaf_2coba_model.connect_ports( "iaf.V", "cobaInhib.V" ) 
     300    #iaf_2coba_model.connect_ports( "cobaExcit.I", "iaf.ISyn" ) 
     301    #iaf_2coba_model.connect_ports( "cobaInhib.I", "iaf.ISyn" ) 
    279302     
    280303    def _build_population(self, nineml_population, assembly): 
     
    282305                n = nineml_population.number 
    283306                pyNN_structure = _build_structure(nineml_population.positions.structure) 
    284                 cell_class, cell_params, random_parameters = self._determine_cell_type_and_parameters(nineml_population) 
     307                cell_class, cell_params, random_parameters = self._generate_cell_type_and_parameters(nineml_population) 
    285308                 
    286309                p_obj = self.sim.Population(n, getattr(self.sim, cell_class.__name__),