def analyse_and_generate_neuron(neuron): # type: (ASTNeuron) -> None """ Analysis a single neuron, solves it and generates the corresponding code. :param neuron: a single neuron. """ code, message = Messages.get_start_processing_neuron(neuron.get_name()) Logger.log_message(neuron, code, message, neuron.get_source_position(), LoggingLevel.INFO) # make normalization # apply spikes to buffers # get rid of convolve, store them and apply then at the end equations_block = neuron.get_equations_block() shape_to_buffers = {} if neuron.get_equations_block() is not None: # extract function names and corresponding incoming buffers convolve_calls = OdeTransformer.get_sum_function_calls(equations_block) for convolve in convolve_calls: shape_to_buffers[str(convolve.get_args()[0])] = str(convolve.get_args()[1]) OdeTransformer.refactor_convolve_call(neuron.get_equations_block()) make_functions_self_contained(equations_block.get_ode_functions()) replace_functions_through_defining_expressions(equations_block.get_ode_equations(), equations_block.get_ode_functions()) # transform everything into gsl processable (e.g. no functional shapes) or exact form. transform_shapes_and_odes(neuron, shape_to_buffers) # update the symbol table neuron.accept(ASTSymbolTableVisitor()) generate_nest_code(neuron) # now store the transformed model store_transformed_model(neuron) # at that point all shapes are transformed into the ODE form and spikes can be applied code, message = Messages.get_code_generated(neuron.get_name(), FrontendConfiguration.get_target_path()) Logger.log_message(neuron, code, message, neuron.get_source_position(), LoggingLevel.INFO)
def generate_neurons(self, neurons: List[ASTNode]): """ Generate code for the given neurons. :param neurons: a list of neurons. :type neurons: List[ASTNode] """ from pynestml.frontend.frontend_configuration import FrontendConfiguration for neuron in neurons: self.generate_neuron_code(neuron) if not Logger.has_errors(neuron): code, message = Messages.get_code_generated(neuron.get_name(), FrontendConfiguration.get_target_path()) Logger.log_message(neuron, code, message, neuron.get_source_position(), LoggingLevel.INFO)
def generate_neurons(self, neurons): # type: (list(ASTNeuron)) -> None """ Analyse a list of neurons, solve them and generate the corresponding code. :param neurons: a list of neurons. """ from pynestml.frontend.frontend_configuration import FrontendConfiguration for neuron in neurons: self.generate_neuron_code(neuron) if not Logger.has_errors(neuron): code, message = Messages.get_code_generated( neuron.get_name(), FrontendConfiguration.get_target_path()) Logger.log_message(neuron, code, message, neuron.get_source_position(), LoggingLevel.INFO)
def generate_synapses(self, synapses: Sequence[ASTSynapse]) -> None: """ Generates code for a list of synapses. :param synapses: a list of synapses. """ from pynestml.frontend.frontend_configuration import FrontendConfiguration for synapse in synapses: if Logger.logging_level == LoggingLevel.INFO: print("Generating code for the synapse {}.".format( synapse.get_name())) self.generate_synapse_code(synapse) code, message = Messages.get_code_generated( synapse.get_name(), FrontendConfiguration.get_target_path()) Logger.log_message(synapse, code, message, synapse.get_source_position(), LoggingLevel.INFO)