Changeset 974

Show
Ignore:
Timestamp:
05/30/11 00:18:03 (12 months ago)
Author:
emuller
Message:

NEST 9ML prototype backend is working.
Most pressing issues are: NEST build system,
Parameterization of initial and default values -> UL integration

Files:
1 modified

Legend:

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

    r973 r974  
    3333#recording.simulator = simulator 
    3434 
     35 
     36 
    3537logger = logging.getLogger("PyNN") 
    3638 
     
    4648 
    4749 
    48  
    49  
    50  
    51  
    52  
    5350def nineml_celltype_from_model(name, nineml_model, synapse_components): 
    5451    """ 
     
    5754     
    5855    dct = {'nineml_model':nineml_model, 
    59            'synapse_components':synapse_components, 
    60            'builder': _compile_nmodl}  
     56           'synapse_components':synapse_components} 
    6157    return _nest_build_nineml_celltype(name, (NineMLCellType,), dct) 
    6258 
     
    7066    def __new__(cls, name, bases, dct): 
    7167         
     68        import nineml.abstraction_layer as nineml 
     69        from nineml.abstraction_layer import models                
     70        import nest 
    7271         
    7372        #Extract Parameters Back out from Dict: 
     
    7675 
    7776        # Reduce the model:                     
    78         from nineml.abstraction_layer import models                
    79         #reduction_process = models.ModelToSingleComponentReducer(nineml_model, componentname=name) 
    80         #reduced_component = reduction_process.reducedcomponent 
    81         reduced_component = models.reduce_to_single_component( nineml_model, componentname=name ) 
     77        reduced_component = models.reduce_to_single_component( nineml_model, 
     78                                                               componentname=name ) 
     79 
     80        reduced_component.short_description = "Auto-generated 9ML neuron model for PyNN.nest" 
     81        reduced_component.long_description = "Auto-generated 9ML neuron model for PyNN.nest" 
    8282 
    8383        # synapse ports: 
    8484        synapse_ports = [] 
    85         for syn in in synapse_components: 
    86             pass 
    87         # TODO: need to be able to get inferred event ports from model Component, i.e. 
    88         # access to the true component below! 
    89      
     85        for syn in synapse_components: 
     86            # get recv event ports 
     87            # TODO: model namespace look 
     88            #syn_component = nineml_model[syn.namespace] 
     89            syn_component = nineml_model.subnodes[syn.namespace] 
     90            recv_event_ports = list(syn_component.filter_ports(cls=nineml.EventPort, mode='recv')) 
     91            # check there's only one 
     92            if len(recv_event_ports)!=1: 
     93                raise ValueError, "A synapse component has multiple recv ports.  Cannot dis-ambiguate" 
     94            synapse_ports.append(syn.namespace+'_'+recv_event_ports[0].symbol) 
     95 
    9096         
    9197        # New: 
    92         dct["combined_model"] = reduction_process.reducedcomponent 
     98        dct["combined_model"] = reduced_component 
     99        # TODO: Override this with user layer 
     100        #default_values = ModelToSingleComponentReducer.flatten_namespace_dict( parameters ) 
    93101        dct["default_parameters"] = dict( (name, 1.0) for name in reduced_component.parameters ) 
    94102        dct["default_initial_values"] = dict((name, 0.0) for name in reduced_component.state_variables) 
     
    98106        dct["conductance_based"] = True # how to determine this?? 
    99107        dct["model_name"] = name 
    100          
     108        dct["nest_model"] = name 
     109 
    101110         
    102111        # Recording from bindings: 
    103         dct["recordable"] = [port.name for port in reduced_component.analog_ports] + ['spikes', 'regime'] + [binding.name for binding in reduced_component.bindings] 
     112        dct["recordable"] = [port.name for port in reduced_component.analog_ports] + ['spikes', 'regime'] 
     113        # TODO bindings -> alias and support recording of them in nest template 
     114        #+ [binding.name for binding in reduced_component.bindings] 
    104115         
    105116        dct["weight_variables"] = dict([ (syn.namespace,syn.namespace+'_'+syn.weight_connector ) 
    106117                                         for syn in synapse_components ]) 
    107         #{'cobaInhib':'cobaInhib_q', 'cobaExcit':'cobaExcit_q',} 
    108          
    109118         
    110119        logger.debug("Creating class '%s' with bases %s and dictionary %s" % (name, bases, dct)) 
    111         # generate and compile NMODL code, then load the mechanism into NEUORN 
    112         dct["builder"](reduced_component, dct["weight_variables"], hierarchical_mode=True) 
    113         # TODO: weight variables should really be stored within combined_model 
     120 
     121        # TODO: UL configuration of initial regime. 
     122        initial_regime = reduced_component.regime_map.keys()[0] 
     123 
     124        from nestbuilder import NestFileBuilder 
     125        nfb = NestFileBuilder(  nest_classname = name,  
     126                                component = reduced_component,  
     127                                synapse_ports = synapse_ports, 
     128                                initial_regime =  initial_regime, 
     129                                initial_values = dct["default_initial_values"], 
     130                                default_values = dct["default_parameters"], 
     131                                ) 
     132        #nfb.compile_files() 
     133        nest.Install('mymodule') 
    114134         
    115135        return type.__new__(cls, name, bases, dct)