//! \executes all the updates to neural parameters when a given timer period //! has occurred. //! \param[in] time the timer tick value currently being executed void neuron_do_timestep_update(timer_t time) { // update each neuron individually for (index_t neuron_index = 0; neuron_index < n_neurons; neuron_index++) { // Get the parameters for this neuron neuron_pointer_t neuron = &neuron_array[neuron_index]; input_type_pointer_t input_type = &input_type_array[neuron_index]; threshold_type_pointer_t threshold_type = &threshold_type_array[neuron_index]; additional_input_pointer_t additional_input = &additional_input_array[neuron_index]; state_t voltage = neuron_model_get_membrane_voltage(neuron); // If we should be recording potential, record this neuron parameter voltages->states[neuron_index] = voltage; // Get excitatory and inhibitory input from synapses and convert it // to current input input_t exc_input_value = input_type_get_input_value( synapse_types_get_excitatory_input(input_buffers, neuron_index), input_type); input_t inh_input_value = input_type_get_input_value( synapse_types_get_inhibitory_input(input_buffers, neuron_index), input_type); input_t exc_input = input_type_convert_excitatory_input_to_current( exc_input_value, input_type, voltage); input_t inh_input = input_type_convert_inhibitory_input_to_current( inh_input_value, input_type, voltage); // Get external bias from any source of intrinsic plasticity input_t external_bias = synapse_dynamics_get_intrinsic_bias(time, neuron_index) + additional_input_get_input_value_as_current( additional_input, voltage); // If we should be recording input, record the values inputs->inputs[neuron_index].exc = exc_input_value; inputs->inputs[neuron_index].inh = inh_input_value; // update neuron parameters state_t result = neuron_model_state_update( exc_input, inh_input, external_bias, neuron); //if ((time>=7000) && (time<=7500)) // if ((exc_input_value>0) || (inh_input_value>0)) // io_printf(IO_BUF,"%dms, voltage=%d inh_input_value=%d\n", time, result, inh_input_value); //io_printf(IO_BUF,"%dms, voltage=%d exc_input_value=%d inh_input_value=%d\n", time, neuron_model_get_membrane_voltage(neuron), exc_input_value, inh_input_value); // determine if a spike should occur bool spike = threshold_type_is_above_threshold(result, threshold_type); // If the neuron has spiked if (spike) { log_debug("neuron %u spiked at time %u", neuron_index, time); //if ((time>5500) && (time<9000)) // io_printf(IO_BUF,"%dms, neuron spiked!\n", time); // Tell the neuron model neuron_model_has_spiked(neuron); // Tell the additional input additional_input_has_spiked(additional_input); // Do any required synapse processing synapse_dynamics_process_post_synaptic_event(time, neuron_index); // Record the spike out_spikes_set_spike(neuron_index); // Send the spike while (use_key && !spin1_send_mc_packet(key | neuron_index, 0, NO_PAYLOAD)) { spin1_delay_us(1); } } else { log_debug("the neuron %d has been determined to not spike", neuron_index); } } // record neuron state (membrane potential) if needed if (recording_is_channel_enabled(recording_flags, V_RECORDING_CHANNEL)) { voltages->time = time; recording_record(V_RECORDING_CHANNEL, voltages, voltages_size); } // record neuron inputs if needed if (recording_is_channel_enabled( recording_flags, GSYN_RECORDING_CHANNEL)) { inputs->time = time; recording_record(GSYN_RECORDING_CHANNEL, inputs, input_size); } // do logging stuff if required out_spikes_print(); _print_neurons(); // Record any spikes this timestep if (recording_is_channel_enabled( recording_flags, SPIKE_RECORDING_CHANNEL)) { out_spikes_record(SPIKE_RECORDING_CHANNEL, time); } out_spikes_reset(); }
//! \executes all the updates to neural parameters when a given timer period //! has occurred. //! \param[in] time the timer tic value currently being executed //! \return nothing void neuron_do_timestep_update(timer_t time) { use(time); // update each neuron individually for (index_t neuron_index = 0; neuron_index < n_neurons; neuron_index++) { // Get the parameters for this neuron neuron_pointer_t neuron = &neuron_array[neuron_index]; input_type_pointer_t input_type = &input_type_array[neuron_index]; threshold_type_pointer_t threshold_type = &threshold_type_array[neuron_index]; additional_input_pointer_t additional_input = &additional_input_array[neuron_index]; state_t voltage = neuron_model_get_membrane_voltage(neuron); // If we should be recording potential, record this neuron parameter if (recording_is_channel_enabled(recording_flags, e_recording_channel_neuron_potential)) { recording_record(e_recording_channel_neuron_potential, &voltage, sizeof(state_t)); } // Get excitatory and inhibitory input from synapses and convert it // to current input input_t exc_input_value = input_type_get_input_value( synapse_types_get_excitatory_input(input_buffers, neuron_index), input_type); input_t inh_input_value = input_type_get_input_value( synapse_types_get_inhibitory_input(input_buffers, neuron_index), input_type); input_t exc_input = input_type_convert_excitatory_input_to_current( exc_input_value, input_type, voltage); input_t inh_input = input_type_convert_inhibitory_input_to_current( inh_input_value, input_type, voltage); // Get external bias from any source of intrinsic plasticity input_t external_bias = synapse_dynamics_get_intrinsic_bias(time, neuron_index) + additional_input_get_input_value_as_current( additional_input, voltage); // If we should be recording input, record the values if (recording_is_channel_enabled(recording_flags, e_recording_channel_neuron_gsyn)) { recording_record(e_recording_channel_neuron_gsyn, &exc_input_value, sizeof(input_t)); recording_record(e_recording_channel_neuron_gsyn, &inh_input_value, sizeof(input_t)); } // update neuron parameters state_t result = neuron_model_state_update( exc_input, inh_input, external_bias, neuron); // determine if a spike should occur bool spike = threshold_type_is_above_threshold(result, threshold_type); // If the neuron has spiked if (spike) { log_debug("the neuron %d has been determined to spike", neuron_index); // Tell the neuron model neuron_model_has_spiked(neuron); // Tell the additional input additional_input_has_spiked(additional_input); // Do any required synapse processing synapse_dynamics_process_post_synaptic_event(time, neuron_index); // Record the spike out_spikes_set_spike(neuron_index); // Send the spike while (use_key && !spin1_send_mc_packet(key | neuron_index, 0, NO_PAYLOAD)) { spin1_delay_us(1); } } else { log_debug("the neuron %d has been determined to not spike", neuron_index); } } // do logging stuff if required out_spikes_print(); _print_neurons(); // Record any spikes this timestep out_spikes_record(recording_flags); out_spikes_reset(); }