From b0ddc008930334996f3be11a70a7af1b6ee21a5a Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:32:31 +0100 Subject: [PATCH 01/12] Add activation marker support in nestkernel Co-authored-by: Susanne Kunkel --- libnestutil/nest_types.h | 1 + nestkernel/event.h | 33 +++++++++++ nestkernel/event_delivery_manager.cpp | 50 ++++++++++++++++ nestkernel/event_delivery_manager_impl.h | 2 +- nestkernel/spike_data.h | 74 ++++++++++++++++++++---- 5 files changed, 148 insertions(+), 12 deletions(-) diff --git a/libnestutil/nest_types.h b/libnestutil/nest_types.h index ad55ddfb9b..24dca07381 100644 --- a/libnestutil/nest_types.h +++ b/libnestutil/nest_types.h @@ -90,6 +90,7 @@ constexpr uint8_t NUM_BITS_SYN_ID = 6U; constexpr uint8_t NUM_BITS_LCID = 27U; constexpr uint8_t NUM_BITS_PROCESSED_FLAG = 1U; constexpr uint8_t NUM_BITS_MARKER_SPIKE_DATA = 2U; +constexpr uint8_t NUM_BITS_MARKER_ACTIVATION = 1U; constexpr uint8_t NUM_BITS_LAG = 14U; constexpr uint8_t NUM_BITS_DELAY = 21U; constexpr uint8_t NUM_BITS_NODE_ID = 61U; diff --git a/nestkernel/event.h b/nestkernel/event.h index 780234b4d5..d173b7c2fc 100644 --- a/nestkernel/event.h +++ b/nestkernel/event.h @@ -322,6 +322,21 @@ class Event */ void set_stamp( Time const& ); + /** + * Sets the activation flag. + */ + void set_activation(); + + /** + * Unsets the activation flag. + */ + void unset_activation(); + + /** + * Returns whether the activation flag is set. + */ + bool get_activation(); + protected: size_t sender_node_id_; //!< node ID of sender or 0 SpikeData sender_spike_data_; //!< spike data of sender node, in some cases required to retrieve node ID @@ -976,6 +991,24 @@ Event::set_stamp( Time const& s ) // get_rel_delivery_steps) } +inline void +Event::set_activation() +{ + sender_spike_data_.set_activation_marker(); +} + +inline void +Event::unset_activation() +{ + sender_spike_data_.unset_activation_marker(); +} + +inline bool +Event::get_activation() +{ + return sender_spike_data_.is_activation_marker(); +} + inline long Event::get_delay_steps() const { diff --git a/nestkernel/event_delivery_manager.cpp b/nestkernel/event_delivery_manager.cpp index 8ba790b740..ff656b3d03 100644 --- a/nestkernel/event_delivery_manager.cpp +++ b/nestkernel/event_delivery_manager.cpp @@ -664,6 +664,14 @@ EventDeliveryManager::deliver_events_( const size_t tid, const std::vector< Spik syn_id_batch[ j ] = spike_data.get_syn_id(); lcid_batch[ j ] = spike_data.get_lcid(); se_batch[ j ].set_sender_node_id_info( tid_batch[ j ], syn_id_batch[ j ], lcid_batch[ j ] ); + if ( spike_data.is_activation_marker() ) + { + se_batch[ j ].set_activation(); + } + else + { + se_batch[ j ].unset_activation(); + } } for ( size_t j = 0; j < SPIKES_PER_BATCH; ++j ) { @@ -685,6 +693,14 @@ EventDeliveryManager::deliver_events_( const size_t tid, const std::vector< Spik syn_id_batch[ j ] = spike_data.get_syn_id(); lcid_batch[ j ] = spike_data.get_lcid(); se_batch[ j ].set_sender_node_id_info( tid_batch[ j ], syn_id_batch[ j ], lcid_batch[ j ] ); + if ( spike_data.is_activation_marker() ) + { + se_batch[ j ].set_activation(); + } + else + { + se_batch[ j ].unset_activation(); + } } for ( size_t j = 0; j < num_remaining_entries; ++j ) { @@ -705,6 +721,14 @@ EventDeliveryManager::deliver_events_( const size_t tid, const std::vector< Spik se_batch[ j ].set_stamp( prepared_timestamps[ spike_data.get_lag() ] ); se_batch[ j ].set_offset( spike_data.get_offset() ); + if ( spike_data.is_activation_marker() ) + { + se_batch[ j ].set_activation(); + } + else + { + se_batch[ j ].unset_activation(); + } syn_id_batch[ j ] = spike_data.get_syn_id(); // for compressed spikes lcid holds the index in the // compressed_spike_data structure @@ -723,7 +747,16 @@ EventDeliveryManager::deliver_events_( const size_t tid, const std::vector< Spik { // non-local sender -> receiver retrieves ID of sender Node from SourceTable based on tid, syn_id, lcid // only if needed, as this is computationally costly + auto activation = se_batch[ j ].get_activation(); se_batch[ j ].set_sender_node_id_info( tid, syn_id_batch[ j ], lcid_batch[ j ] ); + if ( activation ) + { + se_batch[ j ].set_activation(); + } + else + { + se_batch[ j ].unset_activation(); + } } } for ( size_t j = 0; j < SPIKES_PER_BATCH; ++j ) @@ -742,6 +775,14 @@ EventDeliveryManager::deliver_events_( const size_t tid, const std::vector< Spik recv_buffer[ rank * spike_buffer_size_per_rank + num_batches * SPIKES_PER_BATCH + j ]; se_batch[ j ].set_stamp( prepared_timestamps[ spike_data.get_lag() ] ); se_batch[ j ].set_offset( spike_data.get_offset() ); + if ( spike_data.is_activation_marker() ) + { + se_batch[ j ].set_activation(); + } + else + { + se_batch[ j ].unset_activation(); + } syn_id_batch[ j ] = spike_data.get_syn_id(); // for compressed spikes lcid holds the index in the // compressed_spike_data structure @@ -760,7 +801,16 @@ EventDeliveryManager::deliver_events_( const size_t tid, const std::vector< Spik { // non-local sender -> receiver retrieves ID of sender Node from SourceTable based on tid, syn_id, lcid // only if needed, as this is computationally costly + auto activation = se_batch[ j ].get_activation(); se_batch[ j ].set_sender_node_id_info( tid, syn_id_batch[ j ], lcid_batch[ j ] ); + if ( activation ) + { + se_batch[ j ].set_activation(); + } + else + { + se_batch[ j ].unset_activation(); + } } } for ( size_t j = 0; j < num_remaining_entries; ++j ) diff --git a/nestkernel/event_delivery_manager_impl.h b/nestkernel/event_delivery_manager_impl.h index 55310a24bd..8d8b629443 100644 --- a/nestkernel/event_delivery_manager_impl.h +++ b/nestkernel/event_delivery_manager_impl.h @@ -112,7 +112,7 @@ EventDeliveryManager::send_remote( size_t tid, SpikeEvent& e, const long lag ) // Unroll spike multiplicity as plastic synapses only handle individual spikes. for ( size_t i = 0; i < e.get_multiplicity(); ++i ) { - ( *emitted_spikes_register_[ tid ] ).emplace_back( target, lag ); + ( *emitted_spikes_register_[ tid ] ).emplace_back( target, lag, e.get_activation() ); } } } diff --git a/nestkernel/spike_data.h b/nestkernel/spike_data.h index 87b1205ba0..4a1f678acd 100644 --- a/nestkernel/spike_data.h +++ b/nestkernel/spike_data.h @@ -85,6 +85,12 @@ enum enum_status_spike_data_id SPIKE_DATA_ID_INVALID }; +enum enum_activation_id +{ + SPIKE_DATA_ID_ACTIVATION_DEFAULT, + SPIKE_DATA_ID_ACTIVATION +}; + /** * Used to communicate spikes. These are the elements of the MPI * buffers. @@ -96,16 +102,17 @@ class SpikeData protected: static constexpr int MAX_LAG = generate_max_value( NUM_BITS_LAG ); - size_t lcid_ : NUM_BITS_LCID; //!< local connection index - unsigned int marker_ : NUM_BITS_MARKER_SPIKE_DATA; //!< status flag - unsigned int lag_ : NUM_BITS_LAG; //!< lag in this min-delay interval - unsigned int tid_ : NUM_BITS_TID; //!< thread index - synindex syn_id_ : NUM_BITS_SYN_ID; //!< synapse-type index + size_t lcid_ : NUM_BITS_LCID; //!< local connection index + unsigned int marker_ : NUM_BITS_MARKER_SPIKE_DATA; //!< status flag + unsigned int activation_marker_ : NUM_BITS_MARKER_ACTIVATION; //!< activation flag + unsigned int lag_ : NUM_BITS_LAG; //!< lag in this min-delay interval + unsigned int tid_ : NUM_BITS_TID; //!< thread index + synindex syn_id_ : NUM_BITS_SYN_ID; //!< synapse-type index public: SpikeData(); SpikeData( const SpikeData& rhs ); - SpikeData( const Target& target, const size_t lag ); + SpikeData( const Target& target, const size_t lag, const bool activation ); SpikeData( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag ); SpikeData& operator=( const SpikeData& rhs ); @@ -183,10 +190,25 @@ class SpikeData */ bool is_invalid_marker() const; + /** + * Returns whether the marker is the default marker. + */ + bool is_activation_marker() const; + /** * Returns offset. */ double get_offset() const; + + /** + * Sets the activation marker. + */ + void set_activation_marker(); + + /** + * Unsets the activation marker. + */ + void unset_activation_marker(); }; //! check legal size @@ -195,6 +217,7 @@ using success_spike_data_size = StaticAssert< sizeof( SpikeData ) == 8 >::succes inline SpikeData::SpikeData() : lcid_( 0 ) , marker_( SPIKE_DATA_ID_DEFAULT ) + , activation_marker_( SPIKE_DATA_ID_ACTIVATION_DEFAULT ) , lag_( 0 ) , tid_( 0 ) , syn_id_( 0 ) @@ -204,24 +227,31 @@ inline SpikeData::SpikeData() inline SpikeData::SpikeData( const SpikeData& rhs ) : lcid_( rhs.lcid_ ) , marker_( rhs.marker_ ) + , activation_marker_( rhs.activation_marker_ ) , lag_( rhs.lag_ ) , tid_( rhs.tid_ ) , syn_id_( rhs.syn_id_ ) { } -inline SpikeData::SpikeData( const Target& target, const size_t lag ) +inline SpikeData::SpikeData( const Target& target, const size_t lag, const bool activation ) : lcid_( target.get_lcid() ) , marker_( SPIKE_DATA_ID_DEFAULT ) + , activation_marker_( SPIKE_DATA_ID_ACTIVATION_DEFAULT ) , lag_( lag ) , tid_( target.get_tid() ) , syn_id_( target.get_syn_id() ) { + if ( activation ) + { + activation_marker_ = SPIKE_DATA_ID_ACTIVATION; + } } inline SpikeData::SpikeData( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag ) : lcid_( lcid ) , marker_( SPIKE_DATA_ID_DEFAULT ) + , activation_marker_( SPIKE_DATA_ID_ACTIVATION_DEFAULT ) , lag_( lag ) , tid_( tid ) , syn_id_( syn_id ) @@ -233,6 +263,7 @@ SpikeData::operator=( const SpikeData& rhs ) { lcid_ = rhs.lcid_; marker_ = rhs.marker_; + activation_marker_ = rhs.activation_marker_; lag_ = rhs.lag_; tid_ = rhs.tid_; syn_id_ = rhs.syn_id_; @@ -249,6 +280,7 @@ SpikeData::set( const size_t tid, const synindex syn_id, const size_t lcid, cons lcid_ = lcid; marker_ = SPIKE_DATA_ID_DEFAULT; + activation_marker_ = SPIKE_DATA_ID_ACTIVATION_DEFAULT; lag_ = lag; tid_ = tid; syn_id_ = syn_id; @@ -263,6 +295,7 @@ SpikeData::set( const TargetT& target, const unsigned int lag ) assert( lag < MAX_LAG ); lcid_ = target.get_lcid(); marker_ = SPIKE_DATA_ID_DEFAULT; + activation_marker_ = SPIKE_DATA_ID_ACTIVATION_DEFAULT; lag_ = lag; tid_ = target.get_tid(); syn_id_ = target.get_syn_id(); @@ -347,12 +380,30 @@ SpikeData::is_invalid_marker() const return marker_ == SPIKE_DATA_ID_INVALID; } +inline bool +SpikeData::is_activation_marker() const +{ + return activation_marker_ == SPIKE_DATA_ID_ACTIVATION; +} + inline double SpikeData::get_offset() const { return 0; } +inline void +SpikeData::set_activation_marker() +{ + activation_marker_ = SPIKE_DATA_ID_ACTIVATION; +} + +inline void +SpikeData::unset_activation_marker() +{ + activation_marker_ = SPIKE_DATA_ID_ACTIVATION_DEFAULT; +} + class OffGridSpikeData : public SpikeData { private: @@ -386,7 +437,7 @@ inline OffGridSpikeData::OffGridSpikeData() } inline OffGridSpikeData::OffGridSpikeData( const Target& target, const size_t lag, const double offset ) - : SpikeData( target, lag ) + : SpikeData( target, lag, false ) , offset_( offset ) { } @@ -447,6 +498,7 @@ OffGridSpikeData::set( const size_t tid, lcid_ = lcid; marker_ = SPIKE_DATA_ID_DEFAULT; + activation_marker_ = SPIKE_DATA_ID_ACTIVATION_DEFAULT; lag_ = lag; tid_ = tid; syn_id_ = syn_id; @@ -476,15 +528,15 @@ OffGridSpikeData::get_offset() const */ struct SpikeDataWithRank { - SpikeDataWithRank( const Target& target, const size_t lag ); + SpikeDataWithRank( const Target& target, const size_t lag, const bool activation ); const size_t rank; //!< rank of target neuron const SpikeData spike_data; //! data on spike transmitted }; -inline SpikeDataWithRank::SpikeDataWithRank( const Target& target, const size_t lag ) +inline SpikeDataWithRank::SpikeDataWithRank( const Target& target, const size_t lag, const bool activation ) : rank( target.get_rank() ) - , spike_data( target, lag ) + , spike_data( target, lag, activation ) { } From 1d14bdaa5ad376bb03b2d4d3beefb6c5e35dd1fa Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Thu, 15 Jan 2026 15:12:22 +0100 Subject: [PATCH 02/12] Implement activation events --- models/eprop_iaf.cpp | 108 ++++++----- models/eprop_iaf.h | 13 +- models/eprop_iaf_adapt.cpp | 112 +++++++----- models/eprop_iaf_adapt.h | 13 +- models/eprop_iaf_adapt_bsshslm_2020.cpp | 47 +++-- models/eprop_iaf_adapt_bsshslm_2020.h | 8 + models/eprop_iaf_bsshslm_2020.cpp | 47 +++-- models/eprop_iaf_bsshslm_2020.h | 7 + models/eprop_iaf_psc_delta.cpp | 106 ++++++----- models/eprop_iaf_psc_delta.h | 13 +- models/eprop_iaf_psc_delta_adapt.cpp | 110 +++++++----- models/eprop_iaf_psc_delta_adapt.h | 13 +- models/eprop_input_neuron.cpp | 113 ++++++++++++ models/eprop_input_neuron.h | 170 ++++++++++++++++++ models/eprop_readout.cpp | 68 ++++--- models/eprop_readout.h | 5 +- models/eprop_readout_bsshslm_2020.cpp | 15 +- models/eprop_synapse.h | 56 ++++-- models/eprop_synapse_bsshslm_2020.h | 72 ++++++-- modelsets/eprop | 2 +- modelsets/full | 1 + nestkernel/archiving_node.cpp | 6 +- nestkernel/archiving_node.h | 6 + nestkernel/eprop_archiving_node.h | 5 +- nestkernel/eprop_archiving_node_impl.h | 88 +++++---- nestkernel/eprop_archiving_node_recurrent.h | 27 +++ .../eprop_archiving_node_recurrent_impl.h | 2 + nestkernel/histentry.h | 6 +- nestkernel/nest_names.cpp | 1 + nestkernel/nest_names.h | 1 + nestkernel/node.cpp | 19 +- nestkernel/node.h | 19 +- ...tion_evidence-accumulation_bsshslm_2020.py | 2 +- ...vised_classification_neuromorphic_mnist.py | 2 +- ...sed_regression_handwriting_bsshslm_2020.py | 2 +- ...ised_regression_lemniscate_bsshslm_2020.py | 2 +- .../eprop_supervised_regression_sine-waves.py | 2 +- ...ised_regression_sine-waves_bsshslm_2020.py | 2 +- .../test_neurons_handle_multiplicity.py | 2 + .../test_eprop_bsshslm_2020_plasticity.py | 8 +- testsuite/pytests/test_eprop_plasticity.py | 43 ++--- 41 files changed, 1015 insertions(+), 329 deletions(-) create mode 100644 models/eprop_input_neuron.cpp create mode 100644 models/eprop_input_neuron.h diff --git a/models/eprop_iaf.cpp b/models/eprop_iaf.cpp index fb336a40f4..4a2d2ac8d1 100644 --- a/models/eprop_iaf.cpp +++ b/models/eprop_iaf.cpp @@ -85,6 +85,7 @@ eprop_iaf::Parameters_::Parameters_() , kappa_( 0.97 ) , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) + , activation_interval_( 3000.0 ) { } @@ -131,6 +132,7 @@ eprop_iaf::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa, kappa_ ); def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); + def< double >( d, names::activation_interval, activation_interval_ ); } double @@ -168,6 +170,7 @@ eprop_iaf::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::kappa, kappa_, node ); updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); + updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); if ( C_m_ <= 0 ) { @@ -209,11 +212,16 @@ eprop_iaf::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Firing rate low-pass filter for regularization kappa_reg from range [0, 1] required." ); } - if ( eprop_isi_trace_cutoff_ < 0.0 ) + if ( activation_interval_ < 0 ) { - throw BadProperty( "Cutoff of integration of eprop trace between spikes eprop_isi_trace_cutoff ≥ 0 required." ); + throw BadProperty( "Interval between activations activation_interval ≥ 0 required." ); } + if ( eprop_isi_trace_cutoff_ < 0.0 or eprop_isi_trace_cutoff_ > activation_interval_ ) + { + throw BadProperty( + "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); + } return delta_EL; } @@ -271,6 +279,7 @@ eprop_iaf::pre_run_hook() V_.RefractoryCounts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); V_.eprop_isi_trace_cutoff_steps_ = Time( Time::ms( P_.eprop_isi_trace_cutoff_ ) ).get_steps(); + V_.activation_interval_steps_ = Time( Time::ms( P_.activation_interval_ ) ).get_steps(); // calculate the entries of the propagator matrix for the evolution of the state vector @@ -314,6 +323,14 @@ eprop_iaf::update( Time const& origin, const long from, const long to ) S_.z_ = 1.0; S_.v_m_ -= P_.V_th_ * S_.z_; S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); } append_new_eprop_history_entry( t ); @@ -380,61 +397,70 @@ eprop_iaf::compute_gradient( const long t_spike, double& epsilon, double& weight, const CommonSynapseProperties& cp, - WeightOptimizer* optimizer ) + WeightOptimizer* optimizer, + const bool activation, + const bool previous_event_was_activation, + double& sum_grad ) { - double e = 0.0; // eligibility trace - double z = 0.0; // spiking variable - double z_current_buffer = 1.0; // buffer containing the spike that triggered the current integration - double psi = 0.0; // surrogate gradient - double L = 0.0; // learning signal - double firing_rate_reg = 0.0; // firing rate regularization - double grad = 0.0; // gradient + const auto& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); + const auto& opt_cp = *ecp.optimizer_cp_; + const bool optimize_each_step = opt_cp.optimize_each_step_; - const EpropSynapseCommonProperties& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); - const auto optimize_each_step = ( *ecp.optimizer_cp_ ).optimize_each_step_; + if ( not previous_event_was_activation ) + { + sum_grad = 0.0; // sum of gradients + } auto eprop_hist_it = get_eprop_history( t_spike_previous - 1 ); - const long t_compute_until = std::min( t_spike_previous + V_.eprop_isi_trace_cutoff_steps_, t_spike ); + const long cutoff_end = t_spike_previous + V_.eprop_isi_trace_cutoff_steps_; + const long t_compute_until = std::min( cutoff_end, t_spike ); - for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + if ( not previous_event_was_activation ) { - z = z_previous_buffer; - z_previous_buffer = z_current_buffer; - z_current_buffer = 0.0; - - psi = eprop_hist_it->surrogate_gradient_; - L = eprop_hist_it->learning_signal_; - firing_rate_reg = eprop_hist_it->firing_rate_reg_; + double z_current_buffer = 1.0; // spike that triggered current computation - z_bar = V_.P_v_m_ * z_bar + z; - e = psi * z_bar; - e_bar = P_.kappa_ * e_bar + e; - e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; - - if ( optimize_each_step ) + for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) { - grad = L * e_bar + firing_rate_reg * e_bar_reg; - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t, grad, weight ); - } - else - { - grad += L * e_bar + firing_rate_reg * e_bar_reg; + const double z = z_previous_buffer; // spiking variable + z_previous_buffer = z_current_buffer; + z_current_buffer = 0.0; + + const double psi = eprop_hist_it->surrogate_gradient_; // surrogate gradient + const double L = eprop_hist_it->learning_signal_; // learning signal + const double firing_rate_reg = eprop_hist_it->firing_rate_reg_; // firing rate regularization + + z_bar = V_.P_v_m_ * z_bar + z; + const double e = psi * z_bar; // eligibility trace + e_bar = P_.kappa_ * e_bar + e; + e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; + + const double grad = L * e_bar + firing_rate_reg * e_bar_reg; + + if ( optimize_each_step ) + { + sum_grad = grad; + weight = optimizer->optimized_weight( opt_cp, t, sum_grad, weight ); + } + else + { + sum_grad += grad; + } } } - if ( not optimize_each_step ) + const long trace_decay_interval = t_spike - ( previous_event_was_activation ? t_spike_previous : t_compute_until ); + + if ( trace_decay_interval > 0 ) { - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t_compute_until, grad, weight ); + z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); + e_bar *= std::pow( P_.kappa_, trace_decay_interval ); + e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); } - const long cutoff_to_spike_interval = t_spike - t_compute_until; - - if ( cutoff_to_spike_interval > 0 ) + if ( not( activation or optimize_each_step ) ) { - z_bar *= std::pow( V_.P_v_m_, cutoff_to_spike_interval ); - e_bar *= std::pow( P_.kappa_, cutoff_to_spike_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, cutoff_to_spike_interval ); + weight = optimizer->optimized_weight( opt_cp, t_compute_until, sum_grad, weight ); } } diff --git a/models/eprop_iaf.h b/models/eprop_iaf.h index 225de65333..6a7aa0e149 100644 --- a/models/eprop_iaf.h +++ b/models/eprop_iaf.h @@ -230,6 +230,8 @@ Parameter Unit Math equivalent Default Des ---------------------------------------------------------------------------------------------------------------- Parameter Unit Math equivalent Default Description =============================== ======= =========================== ================== ========================= +``activation_interval`` ms 3000.0 Interval between two + activations ``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing rate regularization ``eprop_isi_trace_cutoff`` ms :math:`{\Delta t}_\text{c}` maximum value Cutoff for integration of @@ -397,7 +399,10 @@ class eprop_iaf : public EpropArchivingNodeRecurrent< false > double&, double&, const CommonSynapseProperties&, - WeightOptimizer* ) override; + WeightOptimizer*, + const bool, + const bool, + double& ) override; long get_shift() const override; bool is_eprop_recurrent_node() const override; @@ -458,6 +463,9 @@ class eprop_iaf : public EpropArchivingNodeRecurrent< false > //! Time interval from the previous spike until the cutoff of e-prop update integration between two spikes (ms). double eprop_isi_trace_cutoff_; + //! Interval between two activations. + long activation_interval_; + //! Default constructor. Parameters_(); @@ -535,6 +543,9 @@ class eprop_iaf : public EpropArchivingNodeRecurrent< false > //! Time steps from the previous spike until the cutoff of e-prop update integration between two spikes. long eprop_isi_trace_cutoff_steps_; + + //! Time steps of activation interval. + long activation_interval_steps_; }; //! Get the current value of the membrane voltage. diff --git a/models/eprop_iaf_adapt.cpp b/models/eprop_iaf_adapt.cpp index 10cb9ff224..7a3a617645 100644 --- a/models/eprop_iaf_adapt.cpp +++ b/models/eprop_iaf_adapt.cpp @@ -89,6 +89,7 @@ eprop_iaf_adapt::Parameters_::Parameters_() , kappa_( 0.97 ) , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) + , activation_interval_( 3000.0 ) { } @@ -139,6 +140,7 @@ eprop_iaf_adapt::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa, kappa_ ); def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); + def< double >( d, names::activation_interval, activation_interval_ ); } double @@ -178,6 +180,7 @@ eprop_iaf_adapt::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::kappa, kappa_, node ); updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); + updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); if ( adapt_beta_ < 0 ) { @@ -229,11 +232,16 @@ eprop_iaf_adapt::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Firing rate low-pass filter for regularization kappa_reg from range [0, 1] required." ); } - if ( eprop_isi_trace_cutoff_ < 0.0 ) + if ( activation_interval_ < 0 ) { - throw BadProperty( "Cutoff of integration of eprop trace between spikes eprop_isi_trace_cutoff ≥ 0 required." ); + throw BadProperty( "Interval between activations activation_interval ≥ 0 required." ); } + if ( eprop_isi_trace_cutoff_ < 0.0 or eprop_isi_trace_cutoff_ > activation_interval_ ) + { + throw BadProperty( + "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); + } return delta_EL; } @@ -305,6 +313,7 @@ eprop_iaf_adapt::pre_run_hook() V_.RefractoryCounts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); V_.eprop_isi_trace_cutoff_steps_ = Time( Time::ms( P_.eprop_isi_trace_cutoff_ ) ).get_steps(); + V_.activation_interval_steps_ = Time( Time::ms( P_.activation_interval_ ) ).get_steps(); // calculate the entries of the propagator matrix for the evolution of the state vector @@ -353,6 +362,14 @@ eprop_iaf_adapt::update( Time const& origin, const long from, const long to ) S_.z_ = 1.0; S_.v_m_ -= P_.V_th_ * S_.z_; S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); } append_new_eprop_history_entry( t ); @@ -419,63 +436,72 @@ eprop_iaf_adapt::compute_gradient( const long t_spike, double& epsilon, double& weight, const CommonSynapseProperties& cp, - WeightOptimizer* optimizer ) + WeightOptimizer* optimizer, + const bool activation, + const bool previous_event_was_activation, + double& sum_grad ) { - double e = 0.0; // eligibility trace - double z = 0.0; // spiking variable - double z_current_buffer = 1.0; // buffer containing the spike that triggered the current integration - double psi = 0.0; // surrogate gradient - double L = 0.0; // learning signal - double firing_rate_reg = 0.0; // firing rate regularization - double grad = 0.0; // gradient + const auto& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); + const auto& opt_cp = *ecp.optimizer_cp_; + const bool optimize_each_step = opt_cp.optimize_each_step_; - const EpropSynapseCommonProperties& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); - const auto optimize_each_step = ( *ecp.optimizer_cp_ ).optimize_each_step_; + if ( not previous_event_was_activation ) + { + sum_grad = 0.0; // sum of gradients + } auto eprop_hist_it = get_eprop_history( t_spike_previous - 1 ); - const long t_compute_until = std::min( t_spike_previous + V_.eprop_isi_trace_cutoff_steps_, t_spike ); + const long cutoff_end = t_spike_previous + V_.eprop_isi_trace_cutoff_steps_; + const long t_compute_until = std::min( cutoff_end, t_spike ); - for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + if ( not previous_event_was_activation ) { - z = z_previous_buffer; - z_previous_buffer = z_current_buffer; - z_current_buffer = 0.0; - - psi = eprop_hist_it->surrogate_gradient_; - L = eprop_hist_it->learning_signal_; - firing_rate_reg = eprop_hist_it->firing_rate_reg_; + double z_current_buffer = 1.0; // spike that triggered current computation - z_bar = V_.P_v_m_ * z_bar + z; - e = psi * ( z_bar - P_.adapt_beta_ * epsilon ); - epsilon = V_.P_adapt_ * epsilon + e; - e_bar = P_.kappa_ * e_bar + e; - e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; - - if ( optimize_each_step ) + for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) { - grad = L * e_bar + firing_rate_reg * e_bar_reg; - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t, grad, weight ); - } - else - { - grad += L * e_bar + firing_rate_reg * e_bar_reg; + const double z = z_previous_buffer; // spiking variable + z_previous_buffer = z_current_buffer; + z_current_buffer = 0.0; + + const double psi = eprop_hist_it->surrogate_gradient_; // surrogate gradient + const double L = eprop_hist_it->learning_signal_; // learning signal + const double firing_rate_reg = eprop_hist_it->firing_rate_reg_; // firing rate regularization + + z_bar = V_.P_v_m_ * z_bar + z; + const double e = psi * ( z_bar - P_.adapt_beta_ * epsilon ); // eligibility trace + epsilon = V_.P_adapt_ * epsilon + e; + e_bar = P_.kappa_ * e_bar + e; + e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; + + const double grad = L * e_bar + firing_rate_reg * e_bar_reg; + + if ( optimize_each_step ) + { + sum_grad = grad; + weight = optimizer->optimized_weight( opt_cp, t, sum_grad, weight ); + } + else + { + sum_grad += grad; + } } } - if ( not optimize_each_step ) + const long trace_decay_interval = t_spike - ( previous_event_was_activation ? t_spike_previous : t_compute_until ); + + if ( trace_decay_interval > 0 ) { - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t_compute_until, grad, weight ); + z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); + e_bar *= std::pow( P_.kappa_, trace_decay_interval ); + e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); + epsilon *= std::pow( V_.P_adapt_, trace_decay_interval ); } - const long cutoff_to_spike_interval = t_spike - t_compute_until; - - if ( cutoff_to_spike_interval > 0 ) + if ( not( activation or optimize_each_step ) ) { - z_bar *= std::pow( V_.P_v_m_, cutoff_to_spike_interval ); - e_bar *= std::pow( P_.kappa_, cutoff_to_spike_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, cutoff_to_spike_interval ); - epsilon *= std::pow( V_.P_adapt_, cutoff_to_spike_interval ); + weight = optimizer->optimized_weight( opt_cp, t_compute_until, sum_grad, weight ); } } diff --git a/models/eprop_iaf_adapt.h b/models/eprop_iaf_adapt.h index d404dcbd69..3799cbf3bc 100644 --- a/models/eprop_iaf_adapt.h +++ b/models/eprop_iaf_adapt.h @@ -213,6 +213,8 @@ Parameter Unit Math equivalent Default Des ---------------------------------------------------------------------------------------------------------------- Parameter Unit Math equivalent Default Description =============================== ======= =========================== ================== ========================= +``activation_interval`` ms 3000.0 Interval between two + activations ``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing rate regularization ``eprop_isi_trace_cutoff`` ms :math:`{\Delta t}_\text{c}` maximum value Cutoff for integration of @@ -365,7 +367,10 @@ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > double&, double&, const CommonSynapseProperties&, - WeightOptimizer* ) override; + WeightOptimizer*, + const bool, + const bool, + double& ) override; long get_shift() const override; bool is_eprop_recurrent_node() const override; @@ -432,6 +437,9 @@ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > //! Time interval from the previous spike until the cutoff of e-prop update integration between two spikes (ms). double eprop_isi_trace_cutoff_; + //! Interval between two activations. + long activation_interval_; + //! Default constructor. Parameters_(); @@ -518,6 +526,9 @@ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > //! Time steps from the previous spike until the cutoff of e-prop update integration between two spikes. long eprop_isi_trace_cutoff_steps_; + + //! Time steps of activation interval. + long activation_interval_steps_; }; //! Get the current value of the membrane voltage. diff --git a/models/eprop_iaf_adapt_bsshslm_2020.cpp b/models/eprop_iaf_adapt_bsshslm_2020.cpp index f37f2203a0..95d68c06e5 100644 --- a/models/eprop_iaf_adapt_bsshslm_2020.cpp +++ b/models/eprop_iaf_adapt_bsshslm_2020.cpp @@ -87,6 +87,7 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::Parameters_() , tau_m_( 10.0 ) , V_min_( -std::numeric_limits< double >::max() ) , V_th_( -55.0 - E_L_ ) + , activation_interval_( 3 * kernel().simulation_manager.get_eprop_update_interval().get_ms() ) { } @@ -135,6 +136,7 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::tau_m, tau_m_ ); def< double >( d, names::V_min, V_min_ + E_L_ ); def< double >( d, names::V_th, V_th_ + E_L_ ); + def< double >( d, names::activation_interval, activation_interval_ ); } double @@ -162,6 +164,7 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* updateValueParam< double >( d, names::gamma, gamma_, node ); updateValueParam< double >( d, names::I_e, I_e_, node ); updateValueParam< bool >( d, names::regular_spike_arrival, regular_spike_arrival_, node ); + updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); if ( updateValueParam< std::string >( d, names::surrogate_gradient_function, surrogate_gradient_function_, node ) ) { @@ -213,6 +216,19 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* throw BadProperty( "Spike threshold voltage V_th ≥ minimal voltage V_min required." ); } + if ( activation_interval_ < 0 ) + { + throw BadProperty( "Interval between activations activation_interval ≥ 0 required." ); + } + + if ( Time( Time::ms( activation_interval_ ) ).get_steps() + % kernel().simulation_manager.get_eprop_update_interval().get_steps() + != 0 ) + { + throw BadProperty( + "Interval between activations activation_interval required to be an integer multiple of the e-prop update " + "interval." ); + } return delta_EL; } @@ -283,6 +299,7 @@ eprop_iaf_adapt_bsshslm_2020::pre_run_hook() B_.logger_.init(); // ensures initialization in case multimeter connected after Simulate V_.RefractoryCounts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); + V_.activation_interval_steps_ = Time( Time::ms( P_.activation_interval_ ) ).get_steps(); // calculate the entries of the propagator matrix for the evolution of the state vector @@ -353,6 +370,14 @@ eprop_iaf_adapt_bsshslm_2020::update( Time const& origin, const long from, const S_.z_ = 1.0; S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); } append_new_eprop_history_entry( t ); @@ -423,43 +448,39 @@ eprop_iaf_adapt_bsshslm_2020::compute_gradient( std::vector< long >& presyn_isis { auto eprop_hist_it = get_eprop_history( t_previous_trigger_spike ); - double e = 0.0; // eligibility trace double e_bar = 0.0; // low-pass filtered eligibility trace double epsilon = 0.0; // adaptive component of eligibility vector double grad = 0.0; // gradient value to be calculated - double L = 0.0; // learning signal - double psi = 0.0; // surrogate gradient double sum_e = 0.0; // sum of eligibility traces - double z = 0.0; // spiking variable double z_bar = 0.0; // low-pass filtered spiking variable - for ( long presyn_isi : presyn_isis ) + for ( const long presyn_isi : presyn_isis ) { - z = 1.0; // set spiking variable to 1 for each incoming spike + double z = 1.0; // set spiking variable to 1 for each incoming spike - for ( long t = 0; t < presyn_isi; ++t ) + for ( long t = 0; t < presyn_isi; ++t, ++eprop_hist_it ) { assert( eprop_hist_it != eprop_history_.end() ); - psi = eprop_hist_it->surrogate_gradient_; - L = eprop_hist_it->learning_signal_; + const double psi = eprop_hist_it->surrogate_gradient_; // surrogate gradient + const double L = eprop_hist_it->learning_signal_; // learning signal z_bar = V_.P_v_m_ * z_bar + V_.P_z_in_ * z; - e = psi * ( z_bar - P_.adapt_beta_ * epsilon ); + const double e = psi * ( z_bar - P_.adapt_beta_ * epsilon ); // eligibility trace epsilon = V_.P_adapt_ * epsilon + e; e_bar = kappa * e_bar + ( 1.0 - kappa ) * e; + grad += L * e_bar; sum_e += e; - z = 0.0; // set spiking variable to 0 between spikes - ++eprop_hist_it; + z = 0.0; // set spiking variable to 0 between spikes } } presyn_isis.clear(); const long update_interval = kernel().simulation_manager.get_eprop_update_interval().get_steps(); const long learning_window = kernel().simulation_manager.get_eprop_learning_window().get_steps(); - const auto firing_rate_reg = get_firing_rate_reg_history( t_previous_update + get_shift() + update_interval ); + const double firing_rate_reg = get_firing_rate_reg_history( t_previous_update + get_shift() + update_interval ); grad += firing_rate_reg * sum_e; diff --git a/models/eprop_iaf_adapt_bsshslm_2020.h b/models/eprop_iaf_adapt_bsshslm_2020.h index f8d8009ba2..3426bf082c 100644 --- a/models/eprop_iaf_adapt_bsshslm_2020.h +++ b/models/eprop_iaf_adapt_bsshslm_2020.h @@ -196,6 +196,8 @@ Parameter Unit Math equivalent Default Des ---------------------------------------------------------------------------------------------------------------- Parameter Unit Math equivalent Default Description =============================== ======= ======================= ================== ============================= +``activation_interval`` ms 3000.0 Interval between two + activations ``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing rate regularization ``f_target`` Hz :math:`f^\text{target}` 10.0 Target firing rate of rate @@ -386,6 +388,9 @@ class eprop_iaf_adapt_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Spike threshold voltage relative to the leak membrane potential (mV). double V_th_; + //! Interval between two activations. + long activation_interval_; + //! Default constructor. Parameters_(); @@ -473,6 +478,9 @@ class eprop_iaf_adapt_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Total refractory steps. int RefractoryCounts_; + + //! Time steps of activation interval. + long activation_interval_steps_; }; //! Get the current value of the membrane voltage. diff --git a/models/eprop_iaf_bsshslm_2020.cpp b/models/eprop_iaf_bsshslm_2020.cpp index a4c52557ff..5959194f54 100644 --- a/models/eprop_iaf_bsshslm_2020.cpp +++ b/models/eprop_iaf_bsshslm_2020.cpp @@ -83,6 +83,7 @@ eprop_iaf_bsshslm_2020::Parameters_::Parameters_() , tau_m_( 10.0 ) , V_min_( -std::numeric_limits< double >::max() ) , V_th_( -55.0 - E_L_ ) + , activation_interval_( 3 * kernel().simulation_manager.get_eprop_update_interval().get_ms() ) { } @@ -127,6 +128,7 @@ eprop_iaf_bsshslm_2020::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::tau_m, tau_m_ ); def< double >( d, names::V_min, V_min_ + E_L_ ); def< double >( d, names::V_th, V_th_ + E_L_ ); + def< double >( d, names::activation_interval, activation_interval_ ); } double @@ -152,6 +154,7 @@ eprop_iaf_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::gamma, gamma_, node ); updateValueParam< double >( d, names::I_e, I_e_, node ); updateValueParam< bool >( d, names::regular_spike_arrival, regular_spike_arrival_, node ); + updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); if ( updateValueParam< std::string >( d, names::surrogate_gradient_function, surrogate_gradient_function_, node ) ) { @@ -193,6 +196,19 @@ eprop_iaf_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Spike threshold voltage V_th ≥ minimal voltage V_min required." ); } + if ( activation_interval_ < 0 ) + { + throw BadProperty( "Interval between activations activation_interval ≥ 0 required." ); + } + + if ( Time( Time::ms( activation_interval_ ) ).get_steps() + % kernel().simulation_manager.get_eprop_update_interval().get_steps() + != 0 ) + { + throw BadProperty( + "Interval between activations activation_interval required to be an integer multiple of the e-prop update " + "interval." ); + } return delta_EL; } @@ -249,6 +265,7 @@ eprop_iaf_bsshslm_2020::pre_run_hook() B_.logger_.init(); // ensures initialization in case multimeter connected after Simulate V_.RefractoryCounts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); + V_.activation_interval_steps_ = Time( Time::ms( P_.activation_interval_ ) ).get_steps(); // calculate the entries of the propagator matrix for the evolution of the state vector @@ -313,6 +330,14 @@ eprop_iaf_bsshslm_2020::update( Time const& origin, const long from, const long S_.z_ = 1.0; S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); } append_new_eprop_history_entry( t ); @@ -383,41 +408,37 @@ eprop_iaf_bsshslm_2020::compute_gradient( std::vector< long >& presyn_isis, { auto eprop_hist_it = get_eprop_history( t_previous_trigger_spike ); - double e = 0.0; // eligibility trace double e_bar = 0.0; // low-pass filtered eligibility trace double grad = 0.0; // gradient value to be calculated - double L = 0.0; // learning signal - double psi = 0.0; // surrogate gradient double sum_e = 0.0; // sum of eligibility traces - double z = 0.0; // spiking variable double z_bar = 0.0; // low-pass filtered spiking variable - for ( long presyn_isi : presyn_isis ) + for ( const long presyn_isi : presyn_isis ) { - z = 1.0; // set spiking variable to 1 for each incoming spike + double z = 1.0; // set spiking variable to 1 for each incoming spike - for ( long t = 0; t < presyn_isi; ++t ) + for ( long t = 0; t < presyn_isi; ++t, ++eprop_hist_it ) { assert( eprop_hist_it != eprop_history_.end() ); - psi = eprop_hist_it->surrogate_gradient_; - L = eprop_hist_it->learning_signal_; + const double psi = eprop_hist_it->surrogate_gradient_; // surrogate gradient + const double L = eprop_hist_it->learning_signal_; // learning signal z_bar = V_.P_v_m_ * z_bar + V_.P_z_in_ * z; - e = psi * z_bar; + const double e = psi * z_bar; // eligibility trace e_bar = kappa * e_bar + ( 1.0 - kappa ) * e; + grad += L * e_bar; sum_e += e; - z = 0.0; // set spiking variable to 0 between spikes - ++eprop_hist_it; + z = 0.0; // set spiking variable to 0 between spikes } } presyn_isis.clear(); const long update_interval = kernel().simulation_manager.get_eprop_update_interval().get_steps(); const long learning_window = kernel().simulation_manager.get_eprop_learning_window().get_steps(); - const auto firing_rate_reg = get_firing_rate_reg_history( t_previous_update + get_shift() + update_interval ); + const double firing_rate_reg = get_firing_rate_reg_history( t_previous_update + get_shift() + update_interval ); grad += firing_rate_reg * sum_e; diff --git a/models/eprop_iaf_bsshslm_2020.h b/models/eprop_iaf_bsshslm_2020.h index 34cc9a575d..2abad4464e 100644 --- a/models/eprop_iaf_bsshslm_2020.h +++ b/models/eprop_iaf_bsshslm_2020.h @@ -183,6 +183,7 @@ Parameter Unit Math equivalent Default Des ---------------------------------------------------------------------------------------------------------------- Parameter Unit Math equivalent Default Description =============================== ==== ======================= ================== ================================ +``activation_interval`` ms 3000.0 Interval between two activations ``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing rate regularization ``f_target`` Hz :math:`f^\text{target}` 10.0 Target firing rate of rate @@ -365,6 +366,9 @@ class eprop_iaf_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Spike threshold voltage relative to the leak membrane potential (mV). double V_th_; + //! Interval between two activations. + long activation_interval_; + //! Default constructor. Parameters_(); @@ -443,6 +447,9 @@ class eprop_iaf_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Total refractory steps. int RefractoryCounts_; + + //! Time steps of activation interval. + long activation_interval_steps_; }; //! Get the current value of the membrane voltage. diff --git a/models/eprop_iaf_psc_delta.cpp b/models/eprop_iaf_psc_delta.cpp index a8b13ac4e4..e17555fd05 100644 --- a/models/eprop_iaf_psc_delta.cpp +++ b/models/eprop_iaf_psc_delta.cpp @@ -87,6 +87,7 @@ eprop_iaf_psc_delta::Parameters_::Parameters_() , kappa_( 0.97 ) , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) + , activation_interval_( 3000.0 ) { } @@ -134,6 +135,7 @@ eprop_iaf_psc_delta::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa, kappa_ ); def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); + def< double >( d, names::activation_interval, activation_interval_ ); } double @@ -174,6 +176,7 @@ eprop_iaf_psc_delta::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::kappa, kappa_, node ); updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); + updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); if ( V_th_ < V_min_ ) { @@ -225,11 +228,16 @@ eprop_iaf_psc_delta::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Firing rate low-pass filter for regularization kappa_reg from range [0, 1] required." ); } - if ( eprop_isi_trace_cutoff_ < 0.0 ) + if ( activation_interval_ < 0 ) { - throw BadProperty( "Cutoff of integration of eprop trace between spikes eprop_isi_trace_cutoff ≥ 0 required." ); + throw BadProperty( "Interval between activations activation_interval ≥ 0 required." ); } + if ( eprop_isi_trace_cutoff_ < 0.0 or eprop_isi_trace_cutoff_ > activation_interval_ ) + { + throw BadProperty( + "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); + } return delta_EL; } @@ -287,6 +295,7 @@ eprop_iaf_psc_delta::pre_run_hook() V_.RefractoryCounts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); V_.eprop_isi_trace_cutoff_steps_ = Time( Time::ms( P_.eprop_isi_trace_cutoff_ ) ).get_steps(); + V_.activation_interval_steps_ = Time( Time::ms( P_.activation_interval_ ) ).get_steps(); // calculate the entries of the propagator matrix for the evolution of the state vector @@ -347,6 +356,14 @@ eprop_iaf_psc_delta::update( Time const& origin, const long from, const long to kernel().event_delivery_manager.send( *this, se, lag ); z = 1.0; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); } append_new_eprop_history_entry( t ); @@ -413,61 +430,70 @@ eprop_iaf_psc_delta::compute_gradient( const long t_spike, double& epsilon, double& weight, const CommonSynapseProperties& cp, - WeightOptimizer* optimizer ) + WeightOptimizer* optimizer, + const bool activation, + const bool previous_event_was_activation, + double& sum_grad ) { - double e = 0.0; // eligibility trace - double z = 0.0; // spiking variable - double z_current_buffer = 1.0; // buffer containing the spike that triggered the current integration - double psi = 0.0; // surrogate gradient - double L = 0.0; // learning signal - double firing_rate_reg = 0.0; // firing rate regularization - double grad = 0.0; // gradient + const auto& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); + const auto& opt_cp = *ecp.optimizer_cp_; + const bool optimize_each_step = opt_cp.optimize_each_step_; - const EpropSynapseCommonProperties& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); - const auto optimize_each_step = ( *ecp.optimizer_cp_ ).optimize_each_step_; + if ( not previous_event_was_activation ) + { + sum_grad = 0.0; // sum of gradients + } auto eprop_hist_it = get_eprop_history( t_spike_previous - 1 ); - const long t_compute_until = std::min( t_spike_previous + V_.eprop_isi_trace_cutoff_steps_, t_spike ); + const long cutoff_end = t_spike_previous + V_.eprop_isi_trace_cutoff_steps_; + const long t_compute_until = std::min( cutoff_end, t_spike ); - for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + if ( not previous_event_was_activation ) { - z = z_previous_buffer; - z_previous_buffer = z_current_buffer; - z_current_buffer = 0.0; + double z_current_buffer = 1.0; // spike that triggered current computation - psi = eprop_hist_it->surrogate_gradient_; - L = eprop_hist_it->learning_signal_; - firing_rate_reg = eprop_hist_it->firing_rate_reg_; + for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + { + const double z = z_previous_buffer; // spiking variable + z_previous_buffer = z_current_buffer; + z_current_buffer = 0.0; - z_bar = V_.P_v_m_ * z_bar + z; - e = psi * z_bar; - e_bar = P_.kappa_ * e_bar + e; - e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; + const double psi = eprop_hist_it->surrogate_gradient_; // surrogate gradient + const double L = eprop_hist_it->learning_signal_; // learning signal + const double firing_rate_reg = eprop_hist_it->firing_rate_reg_; // firing rate regularization - if ( optimize_each_step ) - { - grad = L * e_bar + firing_rate_reg * e_bar_reg; - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t, grad, weight ); - } - else - { - grad += L * e_bar + firing_rate_reg * e_bar_reg; + z_bar = V_.P_v_m_ * z_bar + z; + const double e = psi * z_bar; // eligibility trace + e_bar = P_.kappa_ * e_bar + e; + e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; + + const double grad = L * e_bar + firing_rate_reg * e_bar_reg; + + if ( optimize_each_step ) + { + sum_grad = grad; + weight = optimizer->optimized_weight( opt_cp, t, sum_grad, weight ); + } + else + { + sum_grad += grad; + } } } - if ( not optimize_each_step ) + const long trace_decay_interval = t_spike - ( previous_event_was_activation ? t_spike_previous : t_compute_until ); + + if ( trace_decay_interval > 0 ) { - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t_compute_until, grad, weight ); + z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); + e_bar *= std::pow( P_.kappa_, trace_decay_interval ); + e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); } - const long cutoff_to_spike_interval = t_spike - t_compute_until; - - if ( cutoff_to_spike_interval > 0 ) + if ( not( activation or optimize_each_step ) ) { - z_bar *= std::pow( V_.P_v_m_, cutoff_to_spike_interval ); - e_bar *= std::pow( P_.kappa_, cutoff_to_spike_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, cutoff_to_spike_interval ); + weight = optimizer->optimized_weight( opt_cp, t_compute_until, sum_grad, weight ); } } diff --git a/models/eprop_iaf_psc_delta.h b/models/eprop_iaf_psc_delta.h index c36066a984..04738a7841 100644 --- a/models/eprop_iaf_psc_delta.h +++ b/models/eprop_iaf_psc_delta.h @@ -236,6 +236,8 @@ Parameter Unit Math equivalent Default Des ---------------------------------------------------------------------------------------------------------------- Parameter Unit Math equivalent Default Description =============================== ======= =========================== ================== ========================= +``activation_interval`` ms 3000.0 Interval between two + activations ``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing rate regularization ``eprop_isi_trace_cutoff`` ms :math:`{\Delta t}_\text{c}` maximum value Cutoff for integration of @@ -409,7 +411,10 @@ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > double&, double&, const CommonSynapseProperties&, - WeightOptimizer* ) override; + WeightOptimizer*, + const bool, + const bool, + double& ) override; long get_shift() const override; bool is_eprop_recurrent_node() const override; @@ -476,6 +481,9 @@ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > //! Time interval from the previous spike until the cutoff of e-prop update integration between two spikes (ms). double eprop_isi_trace_cutoff_; + //! Interval between two activations. + long activation_interval_; + //! Default constructor. Parameters_(); @@ -550,6 +558,9 @@ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > //! Time steps from the previous spike until the cutoff of e-prop update integration between two spikes. long eprop_isi_trace_cutoff_steps_; + + //! Time steps of activation interval. + long activation_interval_steps_; }; //! Get the current value of the membrane voltage. diff --git a/models/eprop_iaf_psc_delta_adapt.cpp b/models/eprop_iaf_psc_delta_adapt.cpp index 9ffe2a8b69..9ebf077b17 100644 --- a/models/eprop_iaf_psc_delta_adapt.cpp +++ b/models/eprop_iaf_psc_delta_adapt.cpp @@ -91,6 +91,7 @@ eprop_iaf_psc_delta_adapt::Parameters_::Parameters_() , kappa_( 0.97 ) , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) + , activation_interval_( 3000.0 ) { } @@ -143,6 +144,7 @@ eprop_iaf_psc_delta_adapt::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa, kappa_ ); def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); + def< double >( d, names::activation_interval, activation_interval_ ); } double @@ -184,6 +186,7 @@ eprop_iaf_psc_delta_adapt::Parameters_::set( const DictionaryDatum& d, Node* nod updateValueParam< double >( d, names::kappa, kappa_, node ); updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); + updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); if ( V_th_ < V_min_ ) { @@ -245,11 +248,16 @@ eprop_iaf_psc_delta_adapt::Parameters_::set( const DictionaryDatum& d, Node* nod throw BadProperty( "Firing rate low-pass filter for regularization kappa_reg from range [0, 1] required." ); } - if ( eprop_isi_trace_cutoff_ < 0.0 ) + if ( activation_interval_ < 0 ) { - throw BadProperty( "Cutoff of integration of eprop trace between spikes eprop_isi_trace_cutoff ≥ 0 required." ); + throw BadProperty( "Interval between activations activation_interval ≥ 0 required." ); } + if ( eprop_isi_trace_cutoff_ < 0.0 or eprop_isi_trace_cutoff_ > activation_interval_ ) + { + throw BadProperty( + "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); + } return delta_EL; } @@ -321,6 +329,7 @@ eprop_iaf_psc_delta_adapt::pre_run_hook() V_.RefractoryCounts_ = Time( Time::ms( P_.t_ref_ ) ).get_steps(); V_.eprop_isi_trace_cutoff_steps_ = Time( Time::ms( P_.eprop_isi_trace_cutoff_ ) ).get_steps(); + V_.activation_interval_steps_ = Time( Time::ms( P_.activation_interval_ ) ).get_steps(); // calculate the entries of the propagator matrix for the evolution of the state vector @@ -386,6 +395,14 @@ eprop_iaf_psc_delta_adapt::update( Time const& origin, const long from, const lo kernel().event_delivery_manager.send( *this, se, lag ); S_.z_ = 1.0; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); } append_new_eprop_history_entry( t ); @@ -452,63 +469,72 @@ eprop_iaf_psc_delta_adapt::compute_gradient( const long t_spike, double& epsilon, double& weight, const CommonSynapseProperties& cp, - WeightOptimizer* optimizer ) + WeightOptimizer* optimizer, + const bool activation, + const bool previous_event_was_activation, + double& sum_grad ) { - double e = 0.0; // eligibility trace - double z = 0.0; // spiking variable - double z_current_buffer = 1.0; // buffer containing the spike that triggered the current integration - double psi = 0.0; // surrogate gradient - double L = 0.0; // learning signal - double firing_rate_reg = 0.0; // firing rate regularization - double grad = 0.0; // gradient + const auto& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); + const auto& opt_cp = *ecp.optimizer_cp_; + const bool optimize_each_step = opt_cp.optimize_each_step_; - const EpropSynapseCommonProperties& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); - const auto optimize_each_step = ( *ecp.optimizer_cp_ ).optimize_each_step_; + if ( not previous_event_was_activation ) + { + sum_grad = 0.0; // sum of gradients + } auto eprop_hist_it = get_eprop_history( t_spike_previous - 1 ); - const long t_compute_until = std::min( t_spike_previous + V_.eprop_isi_trace_cutoff_steps_, t_spike ); + const long cutoff_end = t_spike_previous + V_.eprop_isi_trace_cutoff_steps_; + const long t_compute_until = std::min( cutoff_end, t_spike ); - for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + if ( not previous_event_was_activation ) { - z = z_previous_buffer; - z_previous_buffer = z_current_buffer; - z_current_buffer = 0.0; + double z_current_buffer = 1.0; // spike that triggered current computation - psi = eprop_hist_it->surrogate_gradient_; - L = eprop_hist_it->learning_signal_; - firing_rate_reg = eprop_hist_it->firing_rate_reg_; + for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + { + const double z = z_previous_buffer; // spiking variable + z_previous_buffer = z_current_buffer; + z_current_buffer = 0.0; - z_bar = V_.P_v_m_ * z_bar + z; - e = psi * ( z_bar - P_.adapt_beta_ * epsilon ); - epsilon = V_.P_adapt_ * epsilon + e; - e_bar = P_.kappa_ * e_bar + e; - e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; + const double psi = eprop_hist_it->surrogate_gradient_; // surrogate gradient + const double L = eprop_hist_it->learning_signal_; // learning signal + const double firing_rate_reg = eprop_hist_it->firing_rate_reg_; // firing rate regularization - if ( optimize_each_step ) - { - grad = L * e_bar + firing_rate_reg * e_bar_reg; - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t, grad, weight ); - } - else - { - grad += L * e_bar + firing_rate_reg * e_bar_reg; + z_bar = V_.P_v_m_ * z_bar + z; + const double e = psi * ( z_bar - P_.adapt_beta_ * epsilon ); // eligibility trace + epsilon = V_.P_adapt_ * epsilon + e; + e_bar = P_.kappa_ * e_bar + e; + e_bar_reg = P_.kappa_reg_ * e_bar_reg + ( 1.0 - P_.kappa_reg_ ) * e; + + const double grad = L * e_bar + firing_rate_reg * e_bar_reg; + + if ( optimize_each_step ) + { + sum_grad = grad; + weight = optimizer->optimized_weight( opt_cp, t, sum_grad, weight ); + } + else + { + sum_grad += grad; + } } } - if ( not optimize_each_step ) + const long trace_decay_interval = t_spike - ( previous_event_was_activation ? t_spike_previous : t_compute_until ); + + if ( trace_decay_interval > 0 ) { - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t_compute_until, grad, weight ); + z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); + e_bar *= std::pow( P_.kappa_, trace_decay_interval ); + e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); + epsilon *= std::pow( V_.P_adapt_, trace_decay_interval ); } - const long cutoff_to_spike_interval = t_spike - t_compute_until; - - if ( cutoff_to_spike_interval > 0 ) + if ( not( activation or optimize_each_step ) ) { - z_bar *= std::pow( V_.P_v_m_, cutoff_to_spike_interval ); - e_bar *= std::pow( P_.kappa_, cutoff_to_spike_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, cutoff_to_spike_interval ); - epsilon *= std::pow( V_.P_adapt_, cutoff_to_spike_interval ); + weight = optimizer->optimized_weight( opt_cp, t_compute_until, sum_grad, weight ); } } diff --git a/models/eprop_iaf_psc_delta_adapt.h b/models/eprop_iaf_psc_delta_adapt.h index 3c0949de3a..77110ddb48 100644 --- a/models/eprop_iaf_psc_delta_adapt.h +++ b/models/eprop_iaf_psc_delta_adapt.h @@ -249,6 +249,8 @@ Parameter Unit Math equivalent Default Des ---------------------------------------------------------------------------------------------------------------- Parameter Unit Math equivalent Default Description =============================== ======= =========================== ================== ========================= +``activation_interval`` ms 3000.0 Interval between two + activations ``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing rate regularization ``eprop_isi_trace_cutoff`` ms :math:`{\Delta t}_\text{c}` maximum value Cutoff for integration of @@ -425,7 +427,10 @@ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > double&, double&, const CommonSynapseProperties&, - WeightOptimizer* ) override; + WeightOptimizer*, + const bool, + const bool, + double& ) override; long get_shift() const override; bool is_eprop_recurrent_node() const override; @@ -498,6 +503,9 @@ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > //! Time interval from the previous spike until the cutoff of e-prop update integration between two spikes (ms). double eprop_isi_trace_cutoff_; + //! Interval between two activations. + long activation_interval_; + //! Default constructor. Parameters_(); @@ -584,6 +592,9 @@ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > //! Time steps from the previous spike until the cutoff of e-prop update integration between two spikes. long eprop_isi_trace_cutoff_steps_; + + //! Time steps of activation interval. + long activation_interval_steps_; }; //! Get the current value of the membrane voltage. diff --git a/models/eprop_input_neuron.cpp b/models/eprop_input_neuron.cpp new file mode 100644 index 0000000000..b7b8aa5d2c --- /dev/null +++ b/models/eprop_input_neuron.cpp @@ -0,0 +1,113 @@ +/* + * eprop_input_neuron.cpp + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + + +#include "eprop_input_neuron.h" + +// Includes from libnestutil: +#include "numerics.h" + +// Includes from nestkernel: +#include "event_delivery_manager_impl.h" +#include "exceptions.h" +#include "kernel_manager.h" +#include "nest_impl.h" + +// Includes from sli: +#include "dictutils.h" + +namespace nest +{ +void +register_eprop_input_neuron( const std::string& name ) +{ + register_node_model< eprop_input_neuron >( name ); +} + + +eprop_input_neuron::eprop_input_neuron() + : ArchivingNode() +{ +} + +void +eprop_input_neuron::init_buffers_() +{ + B_.n_spikes_.clear(); // includes resize + ArchivingNode::clear_history(); +} + +void +eprop_input_neuron::update( Time const& origin, const long from, const long to ) +{ + for ( long lag = from; lag < to; ++lag ) + { + const long t = origin.get_steps() + lag; + const unsigned long current_spikes_n = static_cast< unsigned long >( B_.n_spikes_.get_value( lag ) ); + if ( current_spikes_n > 0 ) + { + // create a new SpikeEvent, set its multiplicity and send it + SpikeEvent se; + se.set_multiplicity( current_spikes_n ); + kernel().event_delivery_manager.send( *this, se, lag ); + + // set the spike times, respecting the multiplicity + for ( unsigned long i = 0; i < current_spikes_n; i++ ) + { + set_spiketime( Time::step( t + 1 ) ); + } + last_event_time_ = t; + } + else if ( last_event_time_ > 0 and t - last_event_time_ >= activation_interval_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + last_event_time_ = t; + } + } +} + +void +eprop_input_neuron::get_status( DictionaryDatum& d ) const +{ + ArchivingNode::get_status( d ); +} + +void +eprop_input_neuron::set_status( const DictionaryDatum& d ) +{ + ArchivingNode::set_status( d ); +} + +void +eprop_input_neuron::handle( SpikeEvent& e ) +{ + // Repeat only spikes incoming on port 0, port 1 will be ignored + if ( 0 == e.get_rport() ) + { + B_.n_spikes_.add_value( e.get_rel_delivery_steps( kernel().simulation_manager.get_slice_origin() ), + static_cast< double >( e.get_multiplicity() ) ); + } +} + +} // namespace diff --git a/models/eprop_input_neuron.h b/models/eprop_input_neuron.h new file mode 100644 index 0000000000..58971aed11 --- /dev/null +++ b/models/eprop_input_neuron.h @@ -0,0 +1,170 @@ +/* + * eprop_input_neuron.h + * + * This file is part of NEST. + * + * Copyright (C) 2004 The NEST Initiative + * + * NEST is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * NEST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NEST. If not, see . + * + */ + +#ifndef EPROP_INPUT_NEURON_H +#define EPROP_INPUT_NEURON_H + +// Includes from nestkernel: +#include "archiving_node.h" +#include "connection.h" +#include "event.h" +#include "nest_types.h" +#include "ring_buffer.h" + +namespace nest +{ + +/* BeginUserDocs: neuron, parrot + +Short description ++++++++++++++++++ + +Neuron that repeats incoming spikes + +Description ++++++++++++ + +The parrot neuron simply emits one spike for every incoming spike. +An important application is to provide identical poisson spike +trains to a group of neurons. The ``poisson_generator`` sends a different +spike train to each of its target neurons. By connecting one +``poisson_generator`` to a ``eprop_input_neuron`` and then that ``eprop_input_neuron`` to +a group of neurons, all target neurons will receive the same poisson +spike train. + +Please note that weights of connections *to* the ``eprop_input_neuron`` +are ignored, while weights on connections *from* the ``eprop_input_neuron`` +to the target are handled as usual. Delays are honored on both +incoming and outgoing connections. + +Only spikes arriving on connections to port 0 will be repeated. +Connections onto port 1 will be accepted, but spikes incoming +through port 1 will be ignored. This allows setting exact pre- +and postsynaptic spike times for STDP protocols by connecting +two parrot neurons spiking at desired times by, for example, a +``stdp_synapse`` onto port 1 on the postsynaptic parrot neuron. + +Receives +++++++++ + +SpikeEvent + +Sends ++++++ + +SpikeEvent + +Examples using this model ++++++++++++++++++++++++++ + +.. listexamples:: eprop_input_neuron + +EndUserDocs */ + +void register_eprop_input_neuron( const std::string& name ); + +class eprop_input_neuron : public ArchivingNode +{ + +public: + eprop_input_neuron(); + + /** + * Import sets of overloaded virtual functions. + * @see Technical Issues / Virtual Functions: Overriding, + * Overloading, and Hiding + */ + using Node::handle; + using Node::handles_test_event; + using Node::receives_signal; + using Node::sends_signal; + + size_t send_test_event( Node&, size_t, synindex, bool ) override; + SignalType sends_signal() const override; + SignalType receives_signal() const override; + + void handle( SpikeEvent& ) override; + size_t handles_test_event( SpikeEvent&, size_t ) override; + + void get_status( DictionaryDatum& ) const override; + void set_status( const DictionaryDatum& ) override; + +private: + void init_buffers_() override; + void + pre_run_hook() override + { + } // no variables + + void update( Time const&, const long, const long ) override; + + /** + Buffers and accumulates the number of incoming spikes per time step; + RingBuffer stores doubles; for now the numbers are casted. + */ + struct Buffers_ + { + RingBuffer n_spikes_; + }; + + Buffers_ B_; +}; + +inline size_t +eprop_input_neuron::send_test_event( Node& target, size_t receptor_type, synindex, bool ) +{ + SpikeEvent e; + e.set_sender( *this ); + + return target.handles_test_event( e, receptor_type ); +} + +inline size_t +eprop_input_neuron::handles_test_event( SpikeEvent&, size_t receptor_type ) +{ + // Allow connections to port 0 (spikes to be repeated) + // and port 1 (spikes to be ignored). + if ( receptor_type == 0 or receptor_type == 1 ) + { + return receptor_type; + } + else + { + throw UnknownReceptorType( receptor_type, get_name() ); + } +} + +inline SignalType +eprop_input_neuron::sends_signal() const +{ + return ALL; +} + +inline SignalType +eprop_input_neuron::receives_signal() const +{ + return ALL; +} + +} // namespace + +#endif // EPROP_INPUT_NEURON_H diff --git a/models/eprop_readout.cpp b/models/eprop_readout.cpp index b2f740d70e..4a9507bd1c 100644 --- a/models/eprop_readout.cpp +++ b/models/eprop_readout.cpp @@ -314,51 +314,63 @@ eprop_readout::compute_gradient( const long t_spike, double& epsilon, double& weight, const CommonSynapseProperties& cp, - WeightOptimizer* optimizer ) + WeightOptimizer* optimizer, + const bool activation, + const bool previous_event_was_activation, + double& sum_grad ) { - double z = 0.0; // spiking variable - double z_current_buffer = 1.0; // buffer containing the spike that triggered the current integration - double L = 0.0; // error signal - double grad = 0.0; // gradient + const auto& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); + const auto& opt_cp = *ecp.optimizer_cp_; + const bool optimize_each_step = opt_cp.optimize_each_step_; - const EpropSynapseCommonProperties& ecp = static_cast< const EpropSynapseCommonProperties& >( cp ); - const auto optimize_each_step = ( *ecp.optimizer_cp_ ).optimize_each_step_; + if ( not previous_event_was_activation ) + { + sum_grad = 0.0; // sum of gradients + } auto eprop_hist_it = get_eprop_history( t_spike_previous - 1 ); - const long t_compute_until = std::min( t_spike_previous + V_.eprop_isi_trace_cutoff_steps_, t_spike ); + const long cutoff_end = t_spike_previous + V_.eprop_isi_trace_cutoff_steps_; + const long t_compute_until = std::min( cutoff_end, t_spike ); - for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + if ( not previous_event_was_activation ) { - z = z_previous_buffer; - z_previous_buffer = z_current_buffer; - z_current_buffer = 0.0; + double z_current_buffer = 1.0; // spike that triggered current computation - L = eprop_hist_it->error_signal_; + for ( long t = t_spike_previous; t < t_compute_until; ++t, ++eprop_hist_it ) + { + const double z = z_previous_buffer; // spiking variable + z_previous_buffer = z_current_buffer; + z_current_buffer = 0.0; - z_bar = V_.P_v_m_ * z_bar + z; + const double E = eprop_hist_it->error_signal_; // error signal - if ( optimize_each_step ) - { - grad = L * z_bar; - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t, grad, weight ); - } - else - { - grad += L * z_bar; + z_bar = V_.P_v_m_ * z_bar + z; + + const double grad = E * z_bar; + + if ( optimize_each_step ) + { + sum_grad = grad; + weight = optimizer->optimized_weight( opt_cp, t, sum_grad, weight ); + } + else + { + sum_grad += grad; + } } } - if ( not optimize_each_step ) + const long trace_decay_interval = t_spike - ( previous_event_was_activation ? t_spike_previous : t_compute_until ); + + if ( trace_decay_interval > 0 ) { - weight = optimizer->optimized_weight( *ecp.optimizer_cp_, t_compute_until, grad, weight ); + z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); } - const long cutoff_to_spike_interval = t_spike - t_compute_until; - - if ( cutoff_to_spike_interval > 0 ) + if ( not( activation or optimize_each_step ) ) { - z_bar *= std::pow( V_.P_v_m_, cutoff_to_spike_interval ); + weight = optimizer->optimized_weight( opt_cp, t_compute_until, sum_grad, weight ); } } diff --git a/models/eprop_readout.h b/models/eprop_readout.h index b96c007542..e3e0492156 100644 --- a/models/eprop_readout.h +++ b/models/eprop_readout.h @@ -308,7 +308,10 @@ class eprop_readout : public EpropArchivingNodeReadout< false > double&, double&, const CommonSynapseProperties&, - WeightOptimizer* ) override; + WeightOptimizer*, + const bool, + const bool, + double& ) override; long get_shift() const override; bool is_eprop_recurrent_node() const override; diff --git a/models/eprop_readout_bsshslm_2020.cpp b/models/eprop_readout_bsshslm_2020.cpp index 79f059fb59..10d70f2d59 100644 --- a/models/eprop_readout_bsshslm_2020.cpp +++ b/models/eprop_readout_bsshslm_2020.cpp @@ -387,25 +387,22 @@ eprop_readout_bsshslm_2020::compute_gradient( std::vector< long >& presyn_isis, auto eprop_hist_it = get_eprop_history( t_previous_trigger_spike ); double grad = 0.0; // gradient value to be calculated - double L = 0.0; // error signal - double z = 0.0; // spiking variable double z_bar = 0.0; // low-pass filtered spiking variable - for ( long presyn_isi : presyn_isis ) + for ( const long presyn_isi : presyn_isis ) { - z = 1.0; // set spiking variable to 1 for each incoming spike + double z = 1.0; // set spiking variable to 1 for each incoming spike - for ( long t = 0; t < presyn_isi; ++t ) + for ( long t = 0; t < presyn_isi; ++t, ++eprop_hist_it ) { assert( eprop_hist_it != eprop_history_.end() ); - L = eprop_hist_it->error_signal_; + const double E = eprop_hist_it->error_signal_; // error signal z_bar = V_.P_v_m_ * z_bar + V_.P_z_in_ * z; - grad += L * z_bar; - z = 0.0; // set spiking variable to 0 between spikes + grad += E * z_bar; - ++eprop_hist_it; + z = 0.0; // set spiking variable to 0 between spikes } } presyn_isis.clear(); diff --git a/models/eprop_synapse.h b/models/eprop_synapse.h index 5509019296..b109ecc02b 100644 --- a/models/eprop_synapse.h +++ b/models/eprop_synapse.h @@ -317,6 +317,9 @@ class eprop_synapse : public Connection< targetidentifierT > //! The time step when the previous spike arrived. long t_spike_previous_ = 0; + //! Last event was an activation. + bool previous_event_was_activation_ = false; + //! The time step when the spike arrived that triggered the previous e-prop update. long t_previous_trigger_spike_ = 0; @@ -335,6 +338,9 @@ class eprop_synapse : public Connection< targetidentifierT > //! Value of spiking variable one time step before t_previous_spike_. double z_previous_buffer_ = 0.0; + //! Sum of gradients. + double sum_grad_ = 0.0; + /** * Optimizer * @@ -365,6 +371,7 @@ eprop_synapse< targetidentifierT >::eprop_synapse() : ConnectionBase() , weight_( 1.0 ) , t_spike_previous_( 0 ) + , previous_event_was_activation_( false ) , t_previous_trigger_spike_( 0 ) , optimizer_( nullptr ) { @@ -399,12 +406,14 @@ eprop_synapse< targetidentifierT >::operator=( const eprop_synapse& es ) weight_ = es.weight_; t_spike_previous_ = es.t_spike_previous_; + previous_event_was_activation_ = es.previous_event_was_activation_; t_previous_trigger_spike_ = es.t_previous_trigger_spike_; z_bar_ = es.z_bar_; e_bar_ = es.e_bar_; e_bar_reg_ = es.e_bar_reg_; epsilon_ = es.epsilon_; z_previous_buffer_ = es.z_previous_buffer_; + sum_grad_ = es.sum_grad_; optimizer_ = es.optimizer_; return *this; @@ -415,11 +424,14 @@ eprop_synapse< targetidentifierT >::eprop_synapse( eprop_synapse&& es ) : ConnectionBase( es ) , weight_( es.weight_ ) , t_spike_previous_( es.t_spike_previous_ ) + , previous_event_was_activation_( es.previous_event_was_activation_ ) , t_previous_trigger_spike_( es.t_previous_trigger_spike_ ) , z_bar_( es.z_bar_ ) , e_bar_( es.e_bar_ ) , e_bar_reg_( es.e_bar_reg_ ) , epsilon_( es.epsilon_ ) + , z_previous_buffer_( es.z_previous_buffer_ ) + , sum_grad_( es.sum_grad_ ) , optimizer_( es.optimizer_ ) { // Move operator, therefore we must null the optimizer pointer in the source of the move. @@ -440,13 +452,14 @@ eprop_synapse< targetidentifierT >::operator=( eprop_synapse&& es ) weight_ = es.weight_; t_spike_previous_ = es.t_spike_previous_; + previous_event_was_activation_ = es.previous_event_was_activation_; t_previous_trigger_spike_ = es.t_previous_trigger_spike_; z_bar_ = es.z_bar_; e_bar_ = es.e_bar_; e_bar_reg_ = es.e_bar_reg_; epsilon_ = es.epsilon_; z_previous_buffer_ = es.z_previous_buffer_; - + sum_grad_ = es.sum_grad_; optimizer_ = es.optimizer_; // Move assignment, therefore we must null the optimizer pointer in the source of the move. @@ -471,7 +484,7 @@ eprop_synapse< targetidentifierT >::check_connection( Node& s, ConnTestDummyNode dummy_target; ConnectionBase::check_connection_( dummy_target, s, t, receptor_type ); - t.register_eprop_connection(); + t.register_synapse(); optimizer_ = cp.optimizer_cp_->get_optimizer(); } @@ -492,24 +505,43 @@ eprop_synapse< targetidentifierT >::send( Event& e, size_t thread, const EpropSy assert( target ); const long t_spike = e.get_stamp().get_steps(); + const bool activation = e.get_activation(); + + if ( previous_event_was_activation_ and activation ) + { + return false; + } if ( t_spike_previous_ != 0 ) { - target->compute_gradient( - t_spike, t_spike_previous_, z_previous_buffer_, z_bar_, e_bar_, e_bar_reg_, epsilon_, weight_, cp, optimizer_ ); + target->compute_gradient( t_spike, + t_spike_previous_, + z_previous_buffer_, + z_bar_, + e_bar_, + e_bar_reg_, + epsilon_, + weight_, + cp, + optimizer_, + activation, + previous_event_was_activation_, + sum_grad_ ); } - const long eprop_isi_trace_cutoff = target->get_eprop_isi_trace_cutoff(); - target->write_update_to_history( t_spike_previous_, t_spike, eprop_isi_trace_cutoff ); + target->erase_used_eprop_history( t_spike, t_spike_previous_ ); t_spike_previous_ = t_spike; + previous_event_was_activation_ = activation; - e.set_receiver( *target ); - e.set_weight( weight_ ); - e.set_delay_steps( get_delay_steps() ); - e.set_rport( get_rport() ); - e(); - + if ( not activation ) + { + e.set_receiver( *target ); + e.set_weight( weight_ ); + e.set_delay_steps( get_delay_steps() ); + e.set_rport( get_rport() ); + e(); + } return true; } diff --git a/models/eprop_synapse_bsshslm_2020.h b/models/eprop_synapse_bsshslm_2020.h index 3ac9144827..e02fc8055f 100644 --- a/models/eprop_synapse_bsshslm_2020.h +++ b/models/eprop_synapse_bsshslm_2020.h @@ -331,9 +331,14 @@ class eprop_synapse_bsshslm_2020 : public Connection< targetidentifierT > //! Synaptic weight. double weight_; + double gradient_sum_; + //! The time step when the previous spike arrived. long t_spike_previous_; + //! Last event was an activation. + bool previous_event_was_activation_; + //! The time step when the previous e-prop update was. long t_previous_update_; @@ -384,7 +389,9 @@ template < typename targetidentifierT > eprop_synapse_bsshslm_2020< targetidentifierT >::eprop_synapse_bsshslm_2020() : ConnectionBase() , weight_( 1.0 ) + , gradient_sum_( 0.0 ) , t_spike_previous_( 0 ) + , previous_event_was_activation_( false ) , t_previous_update_( 0 ) , t_next_update_( 0 ) , t_previous_trigger_spike_( 0 ) @@ -406,7 +413,9 @@ template < typename targetidentifierT > eprop_synapse_bsshslm_2020< targetidentifierT >::eprop_synapse_bsshslm_2020( const eprop_synapse_bsshslm_2020& es ) : ConnectionBase( es ) , weight_( es.weight_ ) + , gradient_sum_( es.gradient_sum_ ) , t_spike_previous_( 0 ) + , previous_event_was_activation_( false ) , t_previous_update_( 0 ) , t_next_update_( kernel().simulation_manager.get_eprop_update_interval().get_steps() ) , t_previous_trigger_spike_( 0 ) @@ -430,7 +439,9 @@ eprop_synapse_bsshslm_2020< targetidentifierT >::operator=( const eprop_synapse_ ConnectionBase::operator=( es ); weight_ = es.weight_; + gradient_sum_ = es.gradient_sum_; t_spike_previous_ = es.t_spike_previous_; + previous_event_was_activation_ = es.previous_event_was_activation_; t_previous_update_ = es.t_previous_update_; t_next_update_ = es.t_next_update_; t_previous_trigger_spike_ = es.t_previous_trigger_spike_; @@ -446,7 +457,9 @@ template < typename targetidentifierT > eprop_synapse_bsshslm_2020< targetidentifierT >::eprop_synapse_bsshslm_2020( eprop_synapse_bsshslm_2020&& es ) : ConnectionBase( es ) , weight_( es.weight_ ) + , gradient_sum_( es.gradient_sum_ ) , t_spike_previous_( 0 ) + , previous_event_was_activation_( false ) , t_previous_update_( 0 ) , t_next_update_( es.t_next_update_ ) , t_previous_trigger_spike_( 0 ) @@ -471,7 +484,9 @@ eprop_synapse_bsshslm_2020< targetidentifierT >::operator=( eprop_synapse_bsshsl ConnectionBase::operator=( es ); weight_ = es.weight_; + gradient_sum_ = es.gradient_sum_; t_spike_previous_ = es.t_spike_previous_; + previous_event_was_activation_ = es.previous_event_was_activation_; t_previous_update_ = es.t_previous_update_; t_next_update_ = es.t_next_update_; t_previous_trigger_spike_ = es.t_previous_trigger_spike_; @@ -524,6 +539,19 @@ eprop_synapse_bsshslm_2020< targetidentifierT >::send( Event& e, assert( target ); const long t_spike = e.get_stamp().get_steps(); + const bool activation = e.get_activation(); + + if ( previous_event_was_activation_ ) + { + if ( activation ) + { + return false; + } + + t_spike_previous_ = t_spike; + t_previous_trigger_spike_ = t_spike; + } + const long update_interval = kernel().simulation_manager.get_eprop_update_interval().get_steps(); const long shift = target->get_shift(); @@ -541,8 +569,8 @@ eprop_synapse_bsshslm_2020< targetidentifierT >::send( Event& e, if ( t_spike_previous_ > 0 ) { - const long t = t_spike >= t_next_update_ + shift ? t_next_update_ + shift : t_spike; - presyn_isis_.push_back( t - t_spike_previous_ ); + presyn_isis_.push_back( + std::min( t_spike, t_next_update_ + shift ) - std::min( t_spike_previous_, t_next_update_ + shift ) ); } if ( t_spike > t_next_update_ + shift ) @@ -550,26 +578,50 @@ eprop_synapse_bsshslm_2020< targetidentifierT >::send( Event& e, const long idx_current_update = ( t_spike - shift ) / update_interval; const long t_current_update = idx_current_update * update_interval; - target->write_update_to_history( t_previous_update_, t_current_update ); + target->write_update_to_history( t_previous_update_, t_current_update, activation, previous_event_was_activation_ ); const double gradient = target->compute_gradient( presyn_isis_, t_previous_update_, t_previous_trigger_spike_, kappa_, cp.average_gradient_ ); - weight_ = optimizer_->optimized_weight( *cp.optimizer_cp_, idx_current_update, gradient, weight_ ); + gradient_sum_ += gradient; + if ( not activation ) + { + weight_ = optimizer_->optimized_weight( *cp.optimizer_cp_, idx_current_update, gradient_sum_, weight_ ); + gradient_sum_ = 0.0; + } t_previous_update_ = t_current_update; t_next_update_ = t_current_update + update_interval; t_previous_trigger_spike_ = t_spike; } + else + { + if ( not activation and previous_event_was_activation_ ) + { + const long idx_current_update = ( t_spike - shift ) / update_interval; + const long t_current_update = idx_current_update * update_interval; + + target->write_update_to_history( + t_previous_update_, t_current_update, activation, previous_event_was_activation_ ); + + weight_ = optimizer_->optimized_weight( *cp.optimizer_cp_, idx_current_update, gradient_sum_, weight_ ); + gradient_sum_ = 0.0; + } + } - t_spike_previous_ = t_spike; + if ( not activation ) + { + t_spike_previous_ = t_spike; + + e.set_receiver( *target ); + e.set_weight( weight_ ); + e.set_delay_steps( get_delay_steps() ); + e.set_rport( get_rport() ); + e(); + } - e.set_receiver( *target ); - e.set_weight( weight_ ); - e.set_delay_steps( get_delay_steps() ); - e.set_rport( get_rport() ); - e(); + previous_event_was_activation_ = activation; return true; } diff --git a/modelsets/eprop b/modelsets/eprop index 0a9a5ed696..6825e1d7d4 100644 --- a/modelsets/eprop +++ b/modelsets/eprop @@ -4,7 +4,6 @@ multimeter spike_recorder weight_recorder -parrot_neuron poisson_generator spike_generator step_rate_generator @@ -12,6 +11,7 @@ step_rate_generator rate_connection_delayed static_synapse +eprop_input_neuron eprop_iaf_bsshslm_2020 eprop_iaf_adapt_bsshslm_2020 eprop_readout_bsshslm_2020 diff --git a/modelsets/full b/modelsets/full index 46d6c6ee5a..67c021fb35 100644 --- a/modelsets/full +++ b/modelsets/full @@ -21,6 +21,7 @@ correlomatrix_detector correlospinmatrix_detector dc_generator diffusion_connection +eprop_input_neuron eprop_iaf_bsshslm_2020 eprop_iaf_adapt_bsshslm_2020 eprop_readout_bsshslm_2020 diff --git a/nestkernel/archiving_node.cpp b/nestkernel/archiving_node.cpp index 7ad511eb3c..f1d8e7c574 100644 --- a/nestkernel/archiving_node.cpp +++ b/nestkernel/archiving_node.cpp @@ -34,7 +34,9 @@ namespace nest // member functions for ArchivingNode nest::ArchivingNode::ArchivingNode() - : n_incoming_( 0 ) + : activation_interval_( 3 * kernel().simulation_manager.get_eprop_update_interval().get_steps() ) + , last_event_time_( 0 ) + , n_incoming_( 0 ) , Kminus_( 0.0 ) , Kminus_triplet_( 0.0 ) , tau_minus_( 20.0 ) @@ -49,6 +51,8 @@ nest::ArchivingNode::ArchivingNode() nest::ArchivingNode::ArchivingNode( const ArchivingNode& n ) : StructuralPlasticityNode( n ) + , activation_interval_( n.activation_interval_ ) + , last_event_time_( n.last_event_time_ ) , n_incoming_( n.n_incoming_ ) , Kminus_( n.Kminus_ ) , Kminus_triplet_( n.Kminus_triplet_ ) diff --git a/nestkernel/archiving_node.h b/nestkernel/archiving_node.h index 86b402ed1a..6eef397cf8 100644 --- a/nestkernel/archiving_node.h +++ b/nestkernel/archiving_node.h @@ -98,6 +98,12 @@ class ArchivingNode : public StructuralPlasticityNode void set_status( const DictionaryDatum& d ) override; protected: + //! Interval between two activations in steps. + long activation_interval_; + + //! Time of last spike or activation event in steps. + long last_event_time_; + /** * Record spike history */ diff --git a/nestkernel/eprop_archiving_node.h b/nestkernel/eprop_archiving_node.h index 04cfc2d3ba..0bbe4f4d19 100644 --- a/nestkernel/eprop_archiving_node.h +++ b/nestkernel/eprop_archiving_node.h @@ -66,10 +66,13 @@ class EpropArchivingNode : public Node */ EpropArchivingNode( const EpropArchivingNode& other ); + void register_synapse() override; void register_eprop_connection() override; void write_update_to_history( const long t_previous_update, const long t_current_update, + const bool activation, + const bool previous_event_was_activation, const long eprop_isi_trace_cutoff = 0 ) override; /** @@ -104,7 +107,7 @@ class EpropArchivingNode : public Node * * @param eprop_isi_trace_cutoff The cutoff value for the inter-spike integration of the eprop trace. */ - void erase_used_eprop_history( const long eprop_isi_trace_cutoff ); + void erase_used_eprop_history( const long t_spike, const long t_spike_previous ); /** * @brief Retrieves eprop history size. diff --git a/nestkernel/eprop_archiving_node_impl.h b/nestkernel/eprop_archiving_node_impl.h index 7c4c60a52e..f8de1345ab 100644 --- a/nestkernel/eprop_archiving_node_impl.h +++ b/nestkernel/eprop_archiving_node_impl.h @@ -48,6 +48,13 @@ EpropArchivingNode< HistEntryT >::EpropArchivingNode( const EpropArchivingNode& { } +template < typename HistEntryT > +void +EpropArchivingNode< HistEntryT >::register_synapse() +{ + ++eprop_indegree_; +} + template < typename HistEntryT > void EpropArchivingNode< HistEntryT >::register_eprop_connection() @@ -72,6 +79,8 @@ template < typename HistEntryT > void EpropArchivingNode< HistEntryT >::write_update_to_history( const long t_previous_update, const long t_current_update, + const bool activation, + const bool previous_event_was_activation, const long eprop_isi_trace_cutoff ) { if ( eprop_indegree_ == 0 ) @@ -80,32 +89,35 @@ EpropArchivingNode< HistEntryT >::write_update_to_history( const long t_previous } const long shift = model_dependent_history_shift_(); + const long t_curr_update_shifted = t_current_update + shift; + const long t_prev_update_shifted = t_previous_update + shift; - const auto it_hist_curr = get_update_history( t_current_update + shift ); - - if ( it_hist_curr != update_history_.end() and it_hist_curr->t_ == t_current_update + shift ) + if ( not activation ) { - ++it_hist_curr->access_counter_; - } - else - { - update_history_.insert( it_hist_curr, HistEntryEpropUpdate( t_current_update + shift, 1 ) ); + auto it_hist_curr = get_update_history( t_curr_update_shifted ); - if ( not history_shift_required_() ) + if ( it_hist_curr != update_history_.end() and it_hist_curr->t_ == t_curr_update_shifted ) { - erase_used_eprop_history( eprop_isi_trace_cutoff ); + ++it_hist_curr->access_counter_; + } + else + { + update_history_.insert( it_hist_curr, HistEntryEpropUpdate( t_curr_update_shifted, 1 ) ); } } - const auto it_hist_prev = get_update_history( t_previous_update + shift ); - - if ( it_hist_prev != update_history_.end() and it_hist_prev->t_ == t_previous_update + shift ) + if ( not previous_event_was_activation ) { - // If an entry exists for the previous update time, decrement its access counter - --it_hist_prev->access_counter_; - if ( it_hist_prev->access_counter_ == 0 ) + auto it_hist_prev = get_update_history( t_prev_update_shifted ); + + if ( it_hist_prev != update_history_.end() and it_hist_prev->t_ == t_prev_update_shifted ) { - update_history_.erase( it_hist_prev ); + // If an entry exists for the previous update time, decrement its access counter + --it_hist_prev->access_counter_; + if ( it_hist_prev->access_counter_ == 0 ) + { + update_history_.erase( it_hist_prev ); + } } } } @@ -159,27 +171,43 @@ EpropArchivingNode< HistEntryT >::erase_used_eprop_history() template < typename HistEntryT > void -EpropArchivingNode< HistEntryT >::erase_used_eprop_history( const long eprop_isi_trace_cutoff ) +EpropArchivingNode< HistEntryT >::erase_used_eprop_history( const long t_spike, const long t_spike_previous ) { - if ( eprop_history_.empty() // nothing to remove - or update_history_.size() < 2 // no time markers to check - ) + + if ( not update_history_.empty() and update_history_.back().t_ == t_spike ) { - return; + ++update_history_.back().access_counter_; + } + else + { + update_history_.emplace_back( t_spike, 1 ); } - const long t_prev = ( update_history_.end() - 2 )->t_; - const long t_curr = ( update_history_.end() - 1 )->t_; + if ( t_spike_previous != 0 ) + { + auto it_hist_prev = std::lower_bound( update_history_.begin(), update_history_.end(), t_spike_previous ); - if ( t_prev + eprop_isi_trace_cutoff < t_curr ) + if ( it_hist_prev != update_history_.end() and it_hist_prev->t_ == t_spike_previous ) + { + --it_hist_prev->access_counter_; + if ( it_hist_prev->access_counter_ == 0 ) + { + update_history_.erase( it_hist_prev ); + } + } + } + + if ( eprop_history_.empty() ) { - // erase no longer needed entries to be ignored by trace cutoff - eprop_history_.erase( get_eprop_history( t_prev + eprop_isi_trace_cutoff ), get_eprop_history( t_curr ) ); + return; } + const long time_end = update_history_.front().t_ - 1; + auto it_end = std::lower_bound( eprop_history_.begin(), eprop_history_.end(), time_end ); - // erase no longer needed entries before the earliest current update - eprop_history_.erase( - get_eprop_history( std::numeric_limits< long >::min() ), get_eprop_history( update_history_.begin()->t_ - 1 ) ); + if ( it_end != eprop_history_.end() and it_end->t_ == time_end ) + { + eprop_history_.erase( eprop_history_.begin(), it_end ); + } } template < typename HistEntryT > diff --git a/nestkernel/eprop_archiving_node_recurrent.h b/nestkernel/eprop_archiving_node_recurrent.h index a8872e3297..150c8c82d8 100644 --- a/nestkernel/eprop_archiving_node_recurrent.h +++ b/nestkernel/eprop_archiving_node_recurrent.h @@ -239,12 +239,25 @@ class EpropArchivingNodeRecurrent : public EpropArchivingNode< HistEntryEpropRec */ void reset_spike_count(); + /** + * Sets the time the neuron spiked. + */ + void set_last_event_time( const long last_event_time ); + + /** + * Gets the last time the neuron spiked. + */ + long get_last_event_time(); + //! Firing rate regularization. double firing_rate_reg_; //! Average firing rate. double f_av_; + //! Last time the neuron spiked. + long last_event_time_; + protected: long model_dependent_history_shift_() const override; bool history_shift_required_() const override; @@ -283,6 +296,20 @@ EpropArchivingNodeRecurrent< hist_shift_required >::reset_spike_count() n_spikes_ = 0; } +template < bool hist_shift_required > +inline void +EpropArchivingNodeRecurrent< hist_shift_required >::set_last_event_time( const long last_event_time ) +{ + last_event_time_ = last_event_time; +} + +template < bool hist_shift_required > +inline long +EpropArchivingNodeRecurrent< hist_shift_required >::get_last_event_time() +{ + return last_event_time_; +} + template < bool hist_shift_required > long EpropArchivingNodeRecurrent< hist_shift_required >::model_dependent_history_shift_() const diff --git a/nestkernel/eprop_archiving_node_recurrent_impl.h b/nestkernel/eprop_archiving_node_recurrent_impl.h index 58dde7a87e..be1df3e5d6 100644 --- a/nestkernel/eprop_archiving_node_recurrent_impl.h +++ b/nestkernel/eprop_archiving_node_recurrent_impl.h @@ -48,6 +48,7 @@ EpropArchivingNodeRecurrent< hist_shift_required >::EpropArchivingNodeRecurrent( : EpropArchivingNode() , firing_rate_reg_( 0.0 ) , f_av_( 0.0 ) + , last_event_time_( 0 ) , n_spikes_( 0 ) { } @@ -57,6 +58,7 @@ EpropArchivingNodeRecurrent< hist_shift_required >::EpropArchivingNodeRecurrent( : EpropArchivingNode( n ) , firing_rate_reg_( n.firing_rate_reg_ ) , f_av_( n.f_av_ ) + , last_event_time_( n.last_event_time_ ) , n_spikes_( n.n_spikes_ ) { } diff --git a/nestkernel/histentry.h b/nestkernel/histentry.h index 7d8985f998..635072ca4c 100644 --- a/nestkernel/histentry.h +++ b/nestkernel/histentry.h @@ -82,13 +82,13 @@ class HistEntryEprop { } - friend bool operator<( const HistEntryEprop& he, long t ); + friend bool operator<( const HistEntryEprop& a, const HistEntryEprop& b ); }; inline bool -operator<( const HistEntryEprop& he, long t ) +operator<( const HistEntryEprop& a, const HistEntryEprop& b ) { - return he.t_ < t; + return a.t_ < b.t_; } /** diff --git a/nestkernel/nest_names.cpp b/nestkernel/nest_names.cpp index 2b1d98435e..22ede20823 100644 --- a/nestkernel/nest_names.cpp +++ b/nestkernel/nest_names.cpp @@ -102,6 +102,7 @@ const Name capacity( "capacity" ); const Name center( "center" ); const Name circular( "circular" ); const Name clear( "clear" ); +const Name activation_interval( "activation_interval" ); const Name comp_idx( "comp_idx" ); const Name comparator( "comparator" ); const Name compartments( "compartments" ); diff --git a/nestkernel/nest_names.h b/nestkernel/nest_names.h index 44a75f62d0..6b704e35fc 100644 --- a/nestkernel/nest_names.h +++ b/nestkernel/nest_names.h @@ -129,6 +129,7 @@ extern const Name capacity; extern const Name center; extern const Name circular; extern const Name clear; +extern const Name activation_interval; extern const Name comp_idx; extern const Name comparator; extern const Name compartments; diff --git a/nestkernel/node.cpp b/nestkernel/node.cpp index 6f54cc1075..bf74f8e0f6 100644 --- a/nestkernel/node.cpp +++ b/nestkernel/node.cpp @@ -218,6 +218,12 @@ Node::register_stdp_connection( double, double ) throw IllegalConnection( "The target node does not support STDP synapses." ); } +void +Node::register_synapse() +{ + throw IllegalConnection( "The target node does not support eprop synapses." ); +} + void Node::register_eprop_connection() { @@ -231,7 +237,13 @@ Node::get_shift() const } void -Node::write_update_to_history( const long, const long, const long ) +Node::write_update_to_history( const long, const long, const bool, const bool, const long ) +{ + throw IllegalConnection( "The target node is not an e-prop neuron." ); +} + +void +Node::erase_used_eprop_history( const long, const long ) { throw IllegalConnection( "The target node is not an e-prop neuron." ); } @@ -559,7 +571,10 @@ nest::Node::compute_gradient( const long, double&, double&, const CommonSynapseProperties&, - WeightOptimizer* ) + WeightOptimizer*, + bool, + bool, + double& ) { throw IllegalConnection( "The target node does not support compute_gradient()." ); } diff --git a/nestkernel/node.h b/nestkernel/node.h index 12742558cc..825869e3b9 100644 --- a/nestkernel/node.h +++ b/nestkernel/node.h @@ -487,6 +487,16 @@ class Node */ virtual void register_stdp_connection( double, double ); + /** + * @brief Registers an eprop synapse and initializes the update history. + * + * The time for the first entry of the update history is set to the neuron specific shift for `bsshslm_2020` + * models and to the negative transmission delay from the recurrent to the output layer otherwise. + * + * @throws IllegalConnection + */ + virtual void register_synapse(); + /** * @brief Registers an eprop synapse and initializes the update history. * @@ -525,8 +535,12 @@ class Node */ virtual void write_update_to_history( const long t_previous_update, const long t_current_update, + const bool activation, + const bool previous_event_was_activation, const long eprop_isi_trace_cutoff = 0 ); + virtual void erase_used_eprop_history( const long t_spike, const long t_spike_previous ); + /** * Retrieves the maximum number of time steps integrated between two consecutive spikes. * @@ -858,7 +872,10 @@ class Node double& epsilon, double& weight, const CommonSynapseProperties& cp, - WeightOptimizer* optimizer ); + WeightOptimizer* optimizer, + bool activation, + bool previous_event_was_activation, + double& sum_grad ); /** * Compute gradient change for eprop synapses. diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py index fc734ed8d4..d0b9cc454c 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py @@ -263,7 +263,7 @@ # since devices cannot establish plastic synapses for technical reasons gen_spk_in = nest.Create("spike_generator", n_in) -nrns_in = nest.Create("parrot_neuron", n_in) +nrns_in = nest.Create("eprop_input_neuron", n_in) # The suffix _bsshslm_2020 follows the NEST convention to indicate in the model name the paper # that introduced it by the first letter of the authors' last names and the publication year. diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py b/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py index 84a0b990bf..30a6c16c52 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py @@ -244,7 +244,7 @@ # since devices cannot establish plastic synapses for technical reasons gen_spk_in = nest.Create("spike_generator", n_in) -nrns_in = nest.Create("parrot_neuron", n_in) +nrns_in = nest.Create("eprop_input_neuron", n_in) nrns_rec = nest.Create(model_nrn_rec, n_rec, params_nrn_rec) nrns_out = nest.Create("eprop_readout", n_out, params_nrn_out) diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py index ef2fa7a51b..4d854eb339 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py @@ -233,7 +233,7 @@ # since devices cannot establish plastic synapses for technical reasons gen_spk_in = nest.Create("spike_generator", n_in) -nrns_in = nest.Create("parrot_neuron", n_in) +nrns_in = nest.Create("eprop_input_neuron", n_in) # The suffix _bsshslm_2020 follows the NEST convention to indicate in the model name the paper # that introduced it by the first letter of the authors' last names and the publication year. diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py index 3b42282ae3..53668561be 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py @@ -219,7 +219,7 @@ # since devices cannot establish plastic synapses for technical reasons gen_spk_in = nest.Create("spike_generator", n_in) -nrns_in = nest.Create("parrot_neuron", n_in) +nrns_in = nest.Create("eprop_input_neuron", n_in) # The suffix _bsshslm_2020 follows the NEST convention to indicate in the model name the paper # that introduced it by the first letter of the authors' last names and the publication year. diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py index bf0a66e992..0e0235fdbf 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py @@ -217,7 +217,7 @@ # since devices cannot establish plastic synapses for technical reasons gen_spk_in = nest.Create("spike_generator", n_in) -nrns_in = nest.Create("parrot_neuron", n_in) +nrns_in = nest.Create("eprop_input_neuron", n_in) nrns_rec = nest.Create(model_nrn_rec, n_rec, params_nrn_rec) nrns_out = nest.Create("eprop_readout", n_out, params_nrn_out) diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py index 46387e4df5..cf667efc93 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py @@ -208,7 +208,7 @@ # since devices cannot establish plastic synapses for technical reasons gen_spk_in = nest.Create("spike_generator", n_in) -nrns_in = nest.Create("parrot_neuron", n_in) +nrns_in = nest.Create("eprop_input_neuron", n_in) # The suffix _bsshslm_2020 follows the NEST convention to indicate in the model name the paper # that introduced it by the first letter of the authors' last names and the publication year. diff --git a/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py b/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py index 0ed52cac1f..d5c92999bd 100644 --- a/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py +++ b/testsuite/pytests/sli2py_neurons/test_neurons_handle_multiplicity.py @@ -55,6 +55,8 @@ "rate_transformer_sigmoid_gg_1998", # rate transformer "parrot_neuron", "parrot_neuron_ps", + "eprop_input_neuron", + "eprop_input_neuron_ps", "spike_train_injector", # spike emitting neuron, does not support spike input "cm_default", # cannot readout V_m directly "iaf_cond_alpha_mc", # cannot readout V_m directly diff --git a/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py b/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py index 69ed7d8fff..f53d8a28c5 100644 --- a/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py +++ b/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py @@ -171,7 +171,7 @@ def test_eprop_regression(): params_nrn_rec["beta"] /= np.abs(params_nrn_rec["V_th"]) gen_spk_in = nest.Create("spike_generator", n_in) - nrns_in = nest.Create("parrot_neuron", n_in) + nrns_in = nest.Create("eprop_input_neuron", n_in) nrns_rec = nest.Create("eprop_iaf_bsshslm_2020", n_rec, params_nrn_rec) nrns_out = nest.Create("eprop_readout_bsshslm_2020", n_out, params_nrn_out) gen_rate_target = nest.Create("step_rate_generator", n_out) @@ -513,6 +513,7 @@ def test_eprop_classification(batch_size, loss_nest_reference): "tau_m": 20.0, "V_m": 0.0, "V_th": 0.6, + "activation_interval": 3 * duration["sequence"], } params_nrn_reg["gamma"] /= params_nrn_reg["V_th"] @@ -534,6 +535,7 @@ def test_eprop_classification(batch_size, loss_nest_reference): "tau_m": 20.0, "V_m": 0.0, "V_th": 0.6, + "activation_interval": 3 * duration["sequence"], } params_nrn_ad["gamma"] /= params_nrn_ad["V_th"] @@ -545,7 +547,7 @@ def test_eprop_classification(batch_size, loss_nest_reference): ) gen_spk_in = nest.Create("spike_generator", n_in) - nrns_in = nest.Create("parrot_neuron", n_in) + nrns_in = nest.Create("eprop_input_neuron", n_in) nrns_reg = nest.Create("eprop_iaf_bsshslm_2020", n_reg, params_nrn_reg) nrns_ad = nest.Create("eprop_iaf_adapt_bsshslm_2020", n_ad, params_nrn_ad) nrns_out = nest.Create("eprop_readout_bsshslm_2020", n_out, params_nrn_out) @@ -861,7 +863,7 @@ def test_eprop_history_cleaning(neuron_model, eprop_history_duration_reference): # Create neurons gen_spk_in = nest.Create("spike_generator", 3) - nrns_in = nest.Create("parrot_neuron", 3) + nrns_in = nest.Create("eprop_input_neuron", 3) nrns_rec = nest.Create(neuron_model, 1) # Create recorders diff --git a/testsuite/pytests/test_eprop_plasticity.py b/testsuite/pytests/test_eprop_plasticity.py index 6bb51436ef..98705bfbbf 100644 --- a/testsuite/pytests/test_eprop_plasticity.py +++ b/testsuite/pytests/test_eprop_plasticity.py @@ -214,7 +214,7 @@ def test_eprop_regression(neuron_model, optimizer, loss_nest_reference): params_nrn_rec["adaptation"] = 0.0 gen_spk_in = nest.Create("spike_generator", n_in) - nrns_in = nest.Create("parrot_neuron", n_in) + nrns_in = nest.Create("eprop_input_neuron", n_in) nrns_rec = nest.Create(neuron_model, n_rec, params_nrn_rec) nrns_out = nest.Create("eprop_readout", n_out, params_nrn_out) gen_rate_target = nest.Create("step_rate_generator", n_out) @@ -523,7 +523,7 @@ def test_eprop_surrogate_gradients(surrogate_gradient_type, surrogate_gradient_r } gen_spk_in = nest.Create("spike_generator", 1) - nrns_in = nest.Create("parrot_neuron", 1) + nrns_in = nest.Create("eprop_input_neuron", 1) nrns_rec = nest.Create("eprop_iaf", 1, params_nrn_rec) params_mm_rec = { @@ -558,23 +558,9 @@ def test_eprop_surrogate_gradients(surrogate_gradient_type, surrogate_gradient_r @pytest.mark.parametrize( - "neuron_model,eprop_isi_trace_cutoff,eprop_history_duration_reference", - [ - ( - "eprop_iaf", - 5.0, - np.hstack( - [ - np.arange(x, y) - for x, y in [[1, 12], [6, 16], [11, 21], [16, 26], [21, 31], [17, 27], [12, 42], [12, 30]] - ] - ), - ), - ("eprop_iaf", 100000.0, np.hstack([np.arange(x, y) for x, y in [[1, 52], [33, 43], [23, 53], [43, 61]]])), - ("eprop_readout", 100000.0, np.hstack([np.arange(x, y) for x, y in [[1, 52], [33, 43], [23, 53], [43, 61]]])), - ], + "neuron_model,eprop_isi_trace_cutoff", [("eprop_iaf", 5.0), ("eprop_iaf", 100000.0), ("eprop_readout", 100000.0)] ) -def test_eprop_history_cleaning(neuron_model, eprop_isi_trace_cutoff, eprop_history_duration_reference): +def test_eprop_history_cleaning(neuron_model, eprop_isi_trace_cutoff): """ Test the e-prop archiving mechanism's cleaning process by ensuring that the length of the `eprop_history` buffer matches the expected values based on a given input firing pattern. These reference length values @@ -599,13 +585,16 @@ def test_eprop_history_cleaning(neuron_model, eprop_isi_trace_cutoff, eprop_hist # Create neurons - params_nrn_rec = { + params_nrn = { "eprop_isi_trace_cutoff": eprop_isi_trace_cutoff, } + if neuron_model != "eprop_readout": + params_nrn["activation_interval"] = eprop_isi_trace_cutoff + gen_spk_in = nest.Create("spike_generator", 3) - nrns_in = nest.Create("parrot_neuron", 3) - nrns_rec = nest.Create(neuron_model, 1, params_nrn_rec) + nrns_in = nest.Create("eprop_input_neuron", 3) + nrns = nest.Create(neuron_model, 1, params_nrn) # Create recorders @@ -635,8 +624,8 @@ def test_eprop_history_cleaning(neuron_model, eprop_isi_trace_cutoff, eprop_hist params_syn_in = params_syn_base.copy() nest.Connect(gen_spk_in, nrns_in, params_conn_one_to_one, params_syn_static) - nest.Connect(nrns_in, nrns_rec, params_conn_all_to_all, params_syn_in) - nest.Connect(mm_rec, nrns_rec, params_conn_all_to_all, params_syn_static) + nest.Connect(nrns_in, nrns, params_conn_all_to_all, params_syn_in) + nest.Connect(mm_rec, nrns, params_conn_all_to_all, params_syn_static) # Create input @@ -659,7 +648,11 @@ def test_eprop_history_cleaning(neuron_model, eprop_isi_trace_cutoff, eprop_hist events_mm_rec = mm_rec.get("events") eprop_history_duration = events_mm_rec["eprop_history_duration"] - senders = events_mm_rec["senders"] - eprop_history_duration = np.array([eprop_history_duration[senders == i] for i in set(senders)])[0] + eprop_history_duration_reference = np.hstack( + [ + np.arange(x, y + 1) + for x, y in [[1.0, 11.0], [2.0, 21.0], [12.0, 31.0], [12.0, 21.0], [12.0, 41.0], [32.0, 49.0]] + ] + ) assert np.allclose(eprop_history_duration, eprop_history_duration_reference, rtol=1e-8) From 09cbc6cd0beae6bb7e9d02221c86e571539f67ac Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:05:47 +0100 Subject: [PATCH 03/12] Replace `insert` with `emplace_back` for efficiency --- nestkernel/eprop_archiving_node_impl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nestkernel/eprop_archiving_node_impl.h b/nestkernel/eprop_archiving_node_impl.h index f8de1345ab..d489cfcd6a 100644 --- a/nestkernel/eprop_archiving_node_impl.h +++ b/nestkernel/eprop_archiving_node_impl.h @@ -67,7 +67,7 @@ EpropArchivingNode< HistEntryT >::register_eprop_connection() if ( it_hist == update_history_.end() or it_hist->t_ != t_first_entry ) { - update_history_.insert( it_hist, HistEntryEpropUpdate( t_first_entry, 1 ) ); + update_history_.emplace_back( t_first_entry, 1 ); } else { @@ -102,7 +102,7 @@ EpropArchivingNode< HistEntryT >::write_update_to_history( const long t_previous } else { - update_history_.insert( it_hist_curr, HistEntryEpropUpdate( t_curr_update_shifted, 1 ) ); + update_history_.emplace_back( t_curr_update_shifted, 1 ); } } From 6ecb3b92fbb4b7a6483b3940a0c11be1958ce544 Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:06:07 +0100 Subject: [PATCH 04/12] Optimize erasing beginning of eprop history --- nestkernel/eprop_archiving_node_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nestkernel/eprop_archiving_node_impl.h b/nestkernel/eprop_archiving_node_impl.h index d489cfcd6a..22d1473750 100644 --- a/nestkernel/eprop_archiving_node_impl.h +++ b/nestkernel/eprop_archiving_node_impl.h @@ -166,7 +166,7 @@ EpropArchivingNode< HistEntryT >::erase_used_eprop_history() } } // erase no longer needed entries before the earliest current update - eprop_history_.erase( get_eprop_history( 0 ), get_eprop_history( update_history_.begin()->t_ ) ); + eprop_history_.erase( eprop_history_.begin(), get_eprop_history( update_history_.begin()->t_ ) ); } template < typename HistEntryT > From ed422b0479ec4d90642f2dd1a02fa28a162cbcc8 Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:40:44 +0100 Subject: [PATCH 05/12] Erase only if count exceeds half of eprop history capacity --- nestkernel/eprop_archiving_node.h | 3 +++ nestkernel/eprop_archiving_node_impl.h | 13 ++++++++++--- .../pytests/test_eprop_bsshslm_2020_plasticity.py | 9 +++++++-- testsuite/pytests/test_eprop_plasticity.py | 5 +---- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/nestkernel/eprop_archiving_node.h b/nestkernel/eprop_archiving_node.h index 0bbe4f4d19..bbac6fbb34 100644 --- a/nestkernel/eprop_archiving_node.h +++ b/nestkernel/eprop_archiving_node.h @@ -136,6 +136,9 @@ class EpropArchivingNode : public Node //! History of dynamic variables needed for e-prop plasticity. std::vector< HistEntryT > eprop_history_; + // Count of leading entries in eprop_history that are scheduled for erasure. + size_t eprop_head_ = 0; + // The following shifts are, for now, hardcoded to 1 time step since the current // implementation only works if all the delays are equal to the simulation resolution. diff --git a/nestkernel/eprop_archiving_node_impl.h b/nestkernel/eprop_archiving_node_impl.h index 22d1473750..0d8922826c 100644 --- a/nestkernel/eprop_archiving_node_impl.h +++ b/nestkernel/eprop_archiving_node_impl.h @@ -133,7 +133,7 @@ template < typename HistEntryT > typename std::vector< HistEntryT >::iterator EpropArchivingNode< HistEntryT >::get_eprop_history( const long time_step ) { - return std::lower_bound( eprop_history_.begin(), eprop_history_.end(), time_step ); + return std::lower_bound( eprop_history_.begin() + eprop_head_, eprop_history_.end(), time_step ); } template < typename HistEntryT > @@ -202,11 +202,18 @@ EpropArchivingNode< HistEntryT >::erase_used_eprop_history( const long t_spike, return; } const long time_end = update_history_.front().t_ - 1; - auto it_end = std::lower_bound( eprop_history_.begin(), eprop_history_.end(), time_end ); + auto it_begin = eprop_history_.begin() + eprop_head_; + auto it_end = std::lower_bound( it_begin, eprop_history_.end(), time_end ); if ( it_end != eprop_history_.end() and it_end->t_ == time_end ) { - eprop_history_.erase( eprop_history_.begin(), it_end ); + eprop_head_ += std::distance( it_begin, it_end ); + + if ( eprop_head_ > eprop_history_.capacity() / 2 ) + { + eprop_history_.erase( eprop_history_.begin(), eprop_history_.begin() + eprop_head_ ); + eprop_head_ = 0; + } } } diff --git a/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py b/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py index f53d8a28c5..2ace4a26fc 100644 --- a/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py +++ b/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py @@ -829,10 +829,15 @@ def test_unsupported_surrogate_gradient(source_model): @pytest.mark.parametrize( "neuron_model,eprop_history_duration_reference", [ - ("eprop_iaf_bsshslm_2020", np.hstack([np.arange(x, y) for x, y in [[1, 3], [1, 61], [21, 61], [41, 48]]])), + ( + "eprop_iaf_bsshslm_2020", + np.hstack([np.arange(x, y + 1) for x, y in [[1.0, 2.0], [1.0, 60.0], [21.0, 60.0], [41.0, 47.0]]]), + ), ( "eprop_readout_bsshslm_2020", - np.hstack([np.arange(x, y) for x, y in [[1, 4], [2, 22], [21, 61], [21, 61], [41, 47]]]), + np.hstack( + [np.arange(x, y + 1) for x, y in [[1.0, 3.0], [1.0, 20.0], [20.0, 59.0], [20.0, 59.0], [40.0, 45.0]]] + ), ), ], ) diff --git a/testsuite/pytests/test_eprop_plasticity.py b/testsuite/pytests/test_eprop_plasticity.py index 98705bfbbf..25dedc5fac 100644 --- a/testsuite/pytests/test_eprop_plasticity.py +++ b/testsuite/pytests/test_eprop_plasticity.py @@ -650,9 +650,6 @@ def test_eprop_history_cleaning(neuron_model, eprop_isi_trace_cutoff): eprop_history_duration = events_mm_rec["eprop_history_duration"] eprop_history_duration_reference = np.hstack( - [ - np.arange(x, y + 1) - for x, y in [[1.0, 11.0], [2.0, 21.0], [12.0, 31.0], [12.0, 21.0], [12.0, 41.0], [32.0, 49.0]] - ] + [np.arange(x, y + 1) for x, y in [[1.0, 11.0], [2.0, 51.0], [12.0, 59.0]]] ) assert np.allclose(eprop_history_duration, eprop_history_duration_reference, rtol=1e-8) From 49769394573f4f21380e7f419c8eafdba068291c Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:46:26 +0100 Subject: [PATCH 06/12] Accelerate power computation --- models/eprop_iaf.cpp | 6 +++--- models/eprop_iaf_adapt.cpp | 8 ++++---- models/eprop_iaf_psc_delta.cpp | 6 +++--- models/eprop_iaf_psc_delta_adapt.cpp | 8 ++++---- models/eprop_readout.cpp | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/models/eprop_iaf.cpp b/models/eprop_iaf.cpp index 4a2d2ac8d1..a1ecbafe55 100644 --- a/models/eprop_iaf.cpp +++ b/models/eprop_iaf.cpp @@ -453,9 +453,9 @@ eprop_iaf::compute_gradient( const long t_spike, if ( trace_decay_interval > 0 ) { - z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); - e_bar *= std::pow( P_.kappa_, trace_decay_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); + z_bar *= std::exp( std::log( V_.P_v_m_ ) * trace_decay_interval ); + e_bar *= std::exp( std::log( P_.kappa_ ) * trace_decay_interval ); + e_bar_reg *= std::exp( std::log( P_.kappa_reg_ ) * trace_decay_interval ); } if ( not( activation or optimize_each_step ) ) diff --git a/models/eprop_iaf_adapt.cpp b/models/eprop_iaf_adapt.cpp index 7a3a617645..5f7ccc4897 100644 --- a/models/eprop_iaf_adapt.cpp +++ b/models/eprop_iaf_adapt.cpp @@ -493,10 +493,10 @@ eprop_iaf_adapt::compute_gradient( const long t_spike, if ( trace_decay_interval > 0 ) { - z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); - e_bar *= std::pow( P_.kappa_, trace_decay_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); - epsilon *= std::pow( V_.P_adapt_, trace_decay_interval ); + z_bar *= std::exp( std::log( V_.P_v_m_ ) * trace_decay_interval ); + e_bar *= std::exp( std::log( P_.kappa_ ) * trace_decay_interval ); + e_bar_reg *= std::exp( std::log( P_.kappa_reg_ ) * trace_decay_interval ); + epsilon *= std::exp( std::log( V_.P_adapt_ ) * trace_decay_interval ); } if ( not( activation or optimize_each_step ) ) diff --git a/models/eprop_iaf_psc_delta.cpp b/models/eprop_iaf_psc_delta.cpp index e17555fd05..b87f64f90e 100644 --- a/models/eprop_iaf_psc_delta.cpp +++ b/models/eprop_iaf_psc_delta.cpp @@ -486,9 +486,9 @@ eprop_iaf_psc_delta::compute_gradient( const long t_spike, if ( trace_decay_interval > 0 ) { - z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); - e_bar *= std::pow( P_.kappa_, trace_decay_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); + z_bar *= std::exp( std::log( V_.P_v_m_ ) * trace_decay_interval ); + e_bar *= std::exp( std::log( P_.kappa_ ) * trace_decay_interval ); + e_bar_reg *= std::exp( std::log( P_.kappa_reg_ ) * trace_decay_interval ); } if ( not( activation or optimize_each_step ) ) diff --git a/models/eprop_iaf_psc_delta_adapt.cpp b/models/eprop_iaf_psc_delta_adapt.cpp index 9ebf077b17..8df2e13fbe 100644 --- a/models/eprop_iaf_psc_delta_adapt.cpp +++ b/models/eprop_iaf_psc_delta_adapt.cpp @@ -526,10 +526,10 @@ eprop_iaf_psc_delta_adapt::compute_gradient( const long t_spike, if ( trace_decay_interval > 0 ) { - z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); - e_bar *= std::pow( P_.kappa_, trace_decay_interval ); - e_bar_reg *= std::pow( P_.kappa_reg_, trace_decay_interval ); - epsilon *= std::pow( V_.P_adapt_, trace_decay_interval ); + z_bar *= std::exp( std::log( V_.P_v_m_ ) * trace_decay_interval ); + e_bar *= std::exp( std::log( P_.kappa_ ) * trace_decay_interval ); + e_bar_reg *= std::exp( std::log( P_.kappa_reg_ ) * trace_decay_interval ); + epsilon *= std::exp( std::log( V_.P_adapt_ ) * trace_decay_interval ); } if ( not( activation or optimize_each_step ) ) diff --git a/models/eprop_readout.cpp b/models/eprop_readout.cpp index 4a9507bd1c..b891e1567d 100644 --- a/models/eprop_readout.cpp +++ b/models/eprop_readout.cpp @@ -365,7 +365,7 @@ eprop_readout::compute_gradient( const long t_spike, if ( trace_decay_interval > 0 ) { - z_bar *= std::pow( V_.P_v_m_, trace_decay_interval ); + z_bar *= std::exp( std::log( V_.P_v_m_ ) * trace_decay_interval ); } if ( not( activation or optimize_each_step ) ) From e93f842d580125fd052762325edf5ed07468d51c Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:46:40 +0100 Subject: [PATCH 07/12] Simplify clamping weight between min. and max. --- models/weight_optimizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/weight_optimizer.cpp b/models/weight_optimizer.cpp index f38e81fc9e..7739292a96 100644 --- a/models/weight_optimizer.cpp +++ b/models/weight_optimizer.cpp @@ -145,7 +145,7 @@ WeightOptimizer::optimized_weight( const WeightOptimizerCommonProperties& cp, if ( optimization_step_ < current_optimization_step ) { sum_gradients_ /= cp.batch_size_; - weight = std::max( cp.Wmin_, std::min( optimize_( cp, weight, current_optimization_step ), cp.Wmax_ ) ); + weight = std::clamp( optimize_( cp, weight, current_optimization_step ), cp.Wmin_, cp.Wmax_ ); eta_current_ = cp.eta_; n_optimize_ += 1; optimization_step_ = current_optimization_step; From 8a0bd92ba143f6fa583677bc0ab82c875ef27ac2 Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:46:53 +0100 Subject: [PATCH 08/12] Resolve git check errors in weight optimizer class --- models/weight_optimizer.cpp | 9 +++++++-- models/weight_optimizer.h | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/models/weight_optimizer.cpp b/models/weight_optimizer.cpp index 7739292a96..7f0d91968e 100644 --- a/models/weight_optimizer.cpp +++ b/models/weight_optimizer.cpp @@ -115,12 +115,12 @@ WeightOptimizer::WeightOptimizer() } void -WeightOptimizer::get_status( DictionaryDatum& d ) const +WeightOptimizer::get_status( DictionaryDatum& ) const { } void -WeightOptimizer::set_status( const DictionaryDatum& d ) +WeightOptimizer::set_status( const DictionaryDatum& ) { } @@ -153,6 +153,11 @@ WeightOptimizer::optimized_weight( const WeightOptimizerCommonProperties& cp, return weight; } +WeightOptimizerCommonPropertiesGradientDescent::WeightOptimizerCommonPropertiesGradientDescent() + : WeightOptimizerCommonProperties() +{ +} + WeightOptimizerCommonProperties* WeightOptimizerCommonPropertiesGradientDescent::clone() const { diff --git a/models/weight_optimizer.h b/models/weight_optimizer.h index 3bed762225..c0f42410cd 100644 --- a/models/weight_optimizer.h +++ b/models/weight_optimizer.h @@ -320,6 +320,12 @@ class WeightOptimizerCommonPropertiesGradientDescent : public WeightOptimizerCom friend class WeightOptimizerGradientDescent; public: + //! Default constructor. + WeightOptimizerCommonPropertiesGradientDescent(); + + //! Copy constructor. + WeightOptimizerCommonPropertiesGradientDescent( const WeightOptimizerCommonPropertiesGradientDescent& ) = default; + //! Assignment operator. WeightOptimizerCommonPropertiesGradientDescent& operator=( const WeightOptimizerCommonPropertiesGradientDescent& ) = delete; @@ -380,6 +386,9 @@ class WeightOptimizerCommonPropertiesAdam : public WeightOptimizerCommonProperti //! Default constructor. WeightOptimizerCommonPropertiesAdam(); + //! Copy constructor. + WeightOptimizerCommonPropertiesAdam( const WeightOptimizerCommonPropertiesAdam& ) = default; + //! Assignment operator. WeightOptimizerCommonPropertiesAdam& operator=( const WeightOptimizerCommonPropertiesAdam& ) = delete; From 03621875e1595cfdeac1b91fbc9294e82c5b2a5b Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:47:18 +0100 Subject: [PATCH 09/12] Remove bsshslm_2020 from sine waves illustration --- ...eprop_supervised_regression_sine-waves.png | Bin 1254200 -> 1196395 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.png b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.png index 2e3ac6cd23a670fb6145e1f00c92c8ad1d1de6aa..2746cbe94721b10d52d15ad391faa40c88690750 100644 GIT binary patch delta 171802 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 VB}Os@#*2VLV7zgAi}!?|`xkJ_sQUl_ delta 229057 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

>?_zLHLdO-n4242Gq)CsM9Pm<&W!F}_>sS`Gf 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�%(|6K~Ac4|~a|-4GPdUu$Y3Qsn)&>&G@g zfGpDG5AGB9jd$6}4#KE}Omy(|b~_ophJzf~3X~j{DvUD4coYxlU?tKRNI4*8Ab*qw zVR-!^-EAf-@vP@Mtk#DoFjWs1VLzsSskHEYF}3BgB9l>HW4xgjQuQB@p~kB7rbu=j zx37j7oIL3}3-9XF7x6c479UzFXn`204;EZj3m;{HF`gS7L?9W)C;g?!%WKi3iH_RO z4MsnKy5_|MvFlu-A--(+%hIbaeqJGq!ToH2tn^gOwe8W-JW(p2fON@k=9Z z_s6`pSJ!q=UMoEVGKW(6UY??mZ2cQfjDxcuU#q1ow>EUxG`gA$!m!xs_l_*4QNY9H zMo}GwLBT*PnBowx-DoqAgv=Q#6y_Vi;yUzo%q+5(-~}E606+*WKD{qyx0Dy!av)Pc zV}U9xEx+I?W@UH0Xq@F|ecSTgX!~4bMO}|rb_%))FR%bwB}fx{pd$9D257n5{(UD; z3wr8+IdnGKvo~hg=w<05-BjX|=Fj&dH8)z^VXGn)GEn%Vy5#6d-Cz*w1&)aq+^1Y@ z=Lx(ZTwBD_fYeBv>HdJH`=pGZ;yh->me`L={XdGWqih}Na$+nhZS6Q_ie6h+ zF6&l@f{r;jPij)O8TR*=K0#*xV~ucu?q^<+Ynq4%C~hlam9UtY_Oqh~MPpdgmCX2% zU;9dVKK6>VIOEpG%p@;k ziDdF=oSnetjZDh8QIM8kEB5V)B(%9A{J9xTsvECR=bYN{Ba~jfk|f_v)PVxeNgF)D z@^=PPM9;6DXy|>fU5uk{@xlu!K5ErPE0W&yL2ybf;SaZS^)dhul`l`>UR-W<&hU7I zPp>{gujvPBO!YGQ@fF#i+&6k#n%~SIYoSmf6>)=>*@OCF7!iJdEL){Z1kXwm`wd*pwHj-S4jFc3I7u`8bG`x54HHsbPR z>)Am+Ck@AJb<#9h5`i$bGy-*NGwqSl(G^o8?8m9X7{YK~k;d7gc&(c7=>r5dF5xqT z*&|Zf)*a=>RpoyddEj3TC^N9N!xIVI~PsXVZc3&>V0z2hHOYBPykYX5Z3`g zt(RWaI|iEn+5`tr8ib$9$Ex}%$_^y%v1$Z7Ra8X;mI(_)^77V`p1NHM*&=5IWAefM`3l01bm?zHdRl}$Z=(vdx3@MV)uv>ZCwlrXyR~!ew&Kdd7PAaCRdG%( zf=5w(r3A^ZtbW>%V2_gdJkM&gOQ9|W>1)@nx^Q!S1>zOv6YqU?q*FGlh!ve?yL%9w^{ zyZNJoKi`yl{ucf6TzxG}TCP>lEQrB!WPKfYha!xG4#F+Jjw?@HzB*6e`W=_h_lcVu zuKrd`a9p`7o{-m(oyip&8nsd0xr&!R0uD#WZ98hhkj{T2%4Lsz$=PKRMnEo6seVgy z#8iXueBzc4?Aw~UrLH0 zTSK~R)D|qHzTw@dSm;+&yiPw)osw6*6qMh7k&5(X!tIwFdcK8831$;d#Fjo}$o^1D zjQ4HVUSlp?upyc4|HvlQ@W>^MGMVOhQAZasCuZA2BBtP? znEf+u`ND#UnqxrARsi)YvG{!;a%Cg@ktL_V5xEY-&M(HM-kqn3HPo0z49}TSN=ojh zG9d{D1%5)mN#2gluKF6u%FcXe=q~S8r^xyH;e#)1zxBp~YMa4!(26%~O(FgAtqB)A zb2hSY^wz2h#-xdH<}J*zpZF7-O{hi~H;~zS^YJwo#;?nAd??QfqN|Y9|BsIsY} z@bgWl|1QimJJ~sr#S!?<;AZTXVlcKfN@Tc+#X;xmqyEeDJ^vQF7A*Ep#tH7cP?gK& z*U4|5caIgi1~7WAbR@Ie7v}Gb&M>$O{XP2B*UD zMCg^!C5|j<%C_+oqsMqn~CH zpC_YHz39Z$*kGadS%rbBGh5rx_%}A^5ZMaFGVcWqtj=0%j%M7hpPvsAql zZ*FQJ%#TiWvj(`Zv~4gJJJN~ire>q$a_mjZ_f;jIuEb0;YS3%6Z9zGceQz2L6hMg% z4EG7XTZ7`X$>9^9sd85+6o^ zb3p3Kus&!<%JNB+r8?gb14Wiid-9RS{sm;)hiXt2xFHlu6G>7LI?16wuhg(&DYUUE zdf0f3y{q+GGg(kdc(V*7S-7$4e62-C02ikulk^+;DvG4rDP0obvWEyS&XuKWk+$AQ z{!I38pn3PxILV@q|1ZG?b~b0Pv{&jV2i*aiT3!o7-zWr% zVV6f*X=Fd1u2w{Sib~}?cSE^Ve)09xudZ{)(!g5a1E{$f42F*sCzVH7did#nv)sBI zgmF6j`8fI#t-^Y4O)}&g)91deo7L}4B`o0k+q&7!I!+&B5#h_v4s>uE$C+TduX1a_ zerLMx(-WE0W#0;D(YKEzzwy;6lR^iGexU}gN3Cm^D_t8k9VVtbtECb}*jML~5Ix<* zaI-oZ!6&jEy#J0T0VDvylORs6pf);Wk)Su2`1S zK+!BAZYL(#V@TB?qy6wejd`w(_Y)h))Bie2WKq)w>D9}D@X{rMPUK=dW3hdiT)R}* zXJV_~dxZqMuPiV!bX@-$d$nFWkW%~J3|FY9=?kAs8ix`2paqB}eiEa3dJiH_6 z>uEH^Mzm+Tr_u1LA{0nFfGL+##b*U3NlqN9%vUu|lRpA_2)L(Jev&sM zF9~K-0JCuXAts2r&42K#$aMRD9Q%oyZ?jXm5&3;{6HArfO_FH`MXvw( zk8VX3(QG9vt1jCb)f{mG1V9`rPD(E5K(q99*^7Cxz7&(5$x7$|P42ZTmO`+T|DT>& zR>~`BxtTXDm2lEf=RqQ{6=Ix`^xCa=Fcm$>$3R5^Rcy7~gvWg7@!A-{SDc zdj20*X91PvwuS2->5}eNN|Z)Q>5vAc8w3Oa>8_6wq)X`*kWLBdknS$&2I=m*IOp7Z z_PLDV*g7^i_Wr(qtu@!2@B6&$JyqH2RNWkRJ*%|~F;bw|bsQA*0k95b*By3-=GSh? zH<*Xl3Bl}vFeV?{ZSotN~{qYY?CqI1d2*M;e)~)G$;+Ly?#&t%zqb$q(DSlplSYCCPYeu zBZCT?mHFn`?YrU)O3SxD!^KiKf{Ka>lCl|;dza$bxBV4aX8-iz|Fk_Jb{uR6N+BPk zE*_1>Jk84v*ydZa_h=q5z1?`(gPm?kRPIcS2F2gOtvd2W1w$(v3$8xY@mNmGDxe(C z8;gUKi`OaCA^p!pg97hdMv2iKbD$yBoyPc=6pW0TLu#Rpo^yntdlK!76H}XPQ#Q(4#I57}RH$T7R^MlKIi}qrmqnXVh(wGFe zk9)X%R}A=W7)^F~{nwM+T0t#>Xum z9M{*MODDwvlr#J|vWkBFFs}=*OM%<|6MsKWZ3FVxa^GqlBm`)C5y;3?%%nph8}dFQ z`rLQl8k5S?DgjEm!X(C+@3^MAe^RnrI3^LvOl+`%z)~JSv}0tLWnQOZ zj!fQM&9@J&ujdUVs;%?hJ&x}TSI?#t7`2vfKx2Lz!CfL;E?2WeFHQ+=oe4dfn!d5i zp@DSXN(HL)O4JBB7Cr{plmw7y!OxUBV6iP&K81OQFU_!~A2~X4oIdCt_h-v6MMF*& zG#)2mumqc;(N@J@*}-CMnHG*s>T?_mYzKLQKz~XLSK!Tvu}tAP?!%Zvv2EU}5b)>x znS-u~|Hf?m`2#ixV%B`N60~NRc!4V_AH55vu{A-ehmZ3c;PnP&Iq7B zD;6{;AZDY6e>*gDeIKFxW9lPK-ID(0<*XR8|LN`rAH6r#caOnD45NYN1l{v_HAH(C z^83(uS~AHvVHkeIfW3V^p6yHLwt)M+~50K?R%qg6p z6avlu>>W_qJ22cv!d^Ea8A_vJbXqAM3fbv0IYL?U`}o-Lw^Y@jJK||SMeI1OKv`j| zZ)kMuD$e#<)0@z*d;5<>a0;qF6G2_CO5+IlKW*;F19!kD);+l|_B;n$)Z0rJ3_vs^^Ej?-D&&0y8|bgsl1S*QEkaw;jo4YGw89CFf#wz8fcW ztpAS3NR@j%Pi^Jlgv?~#Ah!luac%OZ6%AZ?s6On~^6jVbcRr^S)KPRxkl^Fjw=IHw z`lG*9xOv1Ph^%(LYrxW*FB00fr>ZCV)qX`12c|s?NB?_)zZV6ot-C_R4bEUCJ!4Ux zoV+mNsJ=hvKE_h9*ibB20ON^X{N4z%oD-68; zRgKTuM~XAhU-C`&)2J64b1f5hW_c8a2BiH}@l8w{PvH*KHGUvWtmJ?^4p=uwV?)o` ztodRe?r{qOTuY9mBk3_wj0_wU#db#ZyMFQGPXIgttLl^Gu`6yAFyEPRj3p2i@65=9 zb@}XQa0bNC4Ab2zB+N`AnNP-bfi87`U`Crc1WVt#y9Bnct$Z)D# z$NqUZFANym<51p2qk}b7A%EzU8^j~qWPu}9KGZJ0WP-9YPUzqZ%+3T_Pgy}^K(q-4 z9ej)S80OLk3hT1@jV}RUNY}o@`(Gq3oZJ83}UZOe~r+1TT}p*V(7-o~f0IU7oYpld&#-yk7p7^3>Wyvi zR!NYGPaOYiJpMLAwd;QtmOEC>(pi94BzNhLBRKdV@gHl$CEA;V#=UxuqK*8){q9*p zgMzx*`gd<-6lxs~^j$0840DH)HSrO(GE zXP8oi%`^o*l^sbpbP=W8+t27uZ%LmY$uI)67v7D=FyJ3q0 zY#;B>N{ny2AzN4K#h^{?E)q)#rdIH&>Q?W6sg&-D_z*ja+`(p7-I;qoi-$Jc8_@|~ z{R+-2RA>V-;w$Q;B|+&d4WSAHHYe6F2!VKKf(d`*|D(n_Dq$OX9PZB0XiBPQEk4r4 z-7C>DbMU~-TsT0o6uT109hmaIJw4`3_!eC>%bMw;`TgG zU376=k1dBzAQS}ZhZ0Z@KUu-et04WT5(^F?f($T_qSr$G#?kX)WYZhNxA>nBdZvSQ zo#WN4-($m!mwi!pro7Mp3Sbb!`6teIqZ+Hb6XZaW4Z1}gZ6g3`N4@yIuiNKPM8goi zVzAkXUHGd+<*@3vzCPvUe^%Cu6&Dof(RP~qBl&yx=X;$357s4_9KntuYuIT0qsfua zxxdcUE@Xg7Q0f}AuL_Q?3#Fs<_EBLNp5K~?+LM^Q)s_Wry@j@}f?PIqZWtas9=|-m zfD4exrG6nvr#wYQG^$qkLTrp~xTbMVCkYTCxt@RZz6e&CB27GF0E2Oey@#7=AOb2U zcL#ect>zFb%RhEnRDU{*Z1uP)#Jcu^dENf0(t_K;;{5r*9Kt5^46|;lS;4KLQpyy0 zrk`1#o)I$tBxPBBbUcpP)5y!46~W&^dtZDUmyJo&3y?lbXGn$|X80CwtO>4j=fJSX zkK|G8*C9x&#DVcQxEV^Gs$1a@gu^49zGF4sN^kLeM+;xzwEqLu=5SyQ^?k1%GC=cW z6!!Q9lVWWr-Ii7&4E@Du-X~hb`f~6boBn-8g}m^S!-s^Ky_B&A%F=kQ&C&5Eu0`b` zOXn*K;Z$*-U(ROfYZO`?EOnSxf7f?LA9%%0)d@xP`;L=C5xWm`#O(FT{P7o_b8E+M z<|7m+Q&GP+;#2Bxf)$1^pP(94;#Ja;@MdlKXPfTgiZ8=(8E-Uk1!3$W1m{uXGD7s1p1#vH>*wq@7^g}iTnT(i#Sj7ke z)9nKY!?_x-pc9F0X3M?jF?xNPyWSc1CDl|KvErxuv*?&@nN2t=HSsTMtu|+=_SQng zVh=gVg>VI8+b=W5MYNT2J&b06UU;w?Yiu%aC|V8Z(*V)fyQ%zcqcM!UDbZQBMq)UGSipp(a|BE!o)qQ_} z5R;A_cHYl(Q$mChU!8oGZEt)LmB2tAzRoHb``1(=4Xf&W!QXR&r<4-H1+81Mn8huZ z)*}iSKp1J?S{Qq#HQEfM6}UBI9<>l!G(_fincaepeVjPWTt}DmpJ> z2@~nTwQSM-sJndrleUuMu_}l^K!32Gae3hLhS^#0&^@h8#jz(0aiA#ziDv^nJV-?} z{_h5zv<8i|&P6aE0GL9z(mC!_ut+C>_m_JuI?QcLT6Gvi47I^T*AMD=DJ>AU&EFm` z&H)4NFO?@Cvg4-ftEdPSD#iH(5sx}*3cy^n>w{JJTQHA&?waYsK_g-nCw2EReSYIgi52QAx4G;5)n{Zj8)#m3SlJ zV2RsK31BAyCP*|i>d-f2&eMmT+w`ENX zeX^@K<@`;R?-oA_tm+&8;Sibo!EdO}o!v``pB{6t`9frCv(IKOKj49yVfK=|d~}RV zSu+%4>C;`;b$uTf#Q+~a7FA!Ym+fO%VhUXSs~y;UiX#mCcgRsj1qF$XvX`o(*?Vie ziT$9uQ7cmtBS@I1=BOt(yyF7ON8!J|?fi+Rf>VJYu8QN^OA?oQFGZmf=&hkg{-{hE z1I!&e{ZBNF_a0F7x*UYf_3ezzdD`+M^FLFcmh`#h3>hy&_J-NR=w@Bz{#gwBNB#zv z&oaE9)zni{)S3#Dl}Sfos6L9)pA9U`&lmivB)|B=!qwOLq8r^6C923AQ!-Hit%}%< z==sFsPa6&@duA2HAeL4M@qIuK)GJk=qC-;T$s>rmxn<`MP+9l7Y&|+!as77t9_zpR5_vt4& zM=c$0T+oqVqR=hX2}t>S?e-$HO;QBN$lgz0A2KPaf-aKUEmTR;slj7r{O$2V^9fAh8e!r|-qGFoI+_{IKZ`8ZkbTW)W*1aRrp ztn42Q|ro`}3|Hea-9}rXk<^!TwnwKrkMJy=!ij8-Sz~lrQ zkdPC+^r?ewN_5bGh;I>6RyG873UDz6F^QpDGdbT^l;5f31&(gf^&Y65riR(^Z#goL zVd(95)z4O?Tg~_hd+#1Afaz^knsZre(IZ}pl`8^v3~GE5qO|3ohrhT#3{ChaBJW#L zD6)Z2&WPk|N@Y5gi0lX$cE!pdxd+LQe~(1D|9x47{&UJmJ({M&2^gUpLSlxmd0?|C{H~S<45@L|=JwC{iRm0~u{W=ENnYk4=V-YYq!pTrP?l3~y5gS>N9! z(u4bAZKUcCa(FOQj=?Lp-Ig(N3MzAv4;cc3u znG;g$RUL&1%U?$OB|r``;68%DPX=eS7j@d%?Bh!mf5S`Bnq(#ou;-G`t|~=PmUMrN z$IU6kYWkRL{3BmqeFbsbRsQh^uB;jTklP#yIt!SRn$#l=F>6iw1E{<4W8|i#!U13? zQ|RH|W_9Zr>}zwu__}yjn&Ny&F8u#>jk?}qXFylJj+Jt2`POx6OR?h8*wk(fi})z> zix@~|c6KHU#rU6SwBr>(XGe*{o9(G`*(WNdDUCrDh1tA{R_37Mc>_PY40BjIb7=qF z4wwiJ?*=T|Wn{dI@0ipo%Jfmn zC=HFFK|z^GOjkY7YIv$|%Aou&`D9B6QqG|4WTiGf^OG_{voHJZjkOA)=ZkG9lcC}d zB7}TnkMOU+>jgsE;9Cr_cJ^po zT%qI(x*MaC$}exAAGX%HGni8*pbf7WGFd+;NOe5Fw-%YVlL|9PAxu4&J}E7dXeZCf z%}j3#hrm)5O@A+>?5ca7+U2?W@j&w1M4=JJ9$o__HPR$%;X;DT>$8U;C`YEg&Oh29 zxKg@Cn{hN~_A%FpIZ{AEZO3_%i+XtZjN)kgtqRX?t0%sH>IF?6p`e#zvZJE)_m7GF zSX;#Me|(<{{`L?RwM1~abPR4W|?^xd87R278TsvS;2=+L%W?&w~j1zwLi(nNqVfS2k+tUWU(z zemx&3l&QayM^x6t#FA^O#Cj+@YEPF0bLuJzsZI- z5b;r{ft|6#xVVh_d7a}SM^GeTtU;>T!PfTc!N=S(fd#NK^r>Y`qyxg|2tS@0^JPc8 zDfA`a3PmqLN+MP$gNbWb!rwHhzvJPVmeh5GWCn`)NAX4UKp6jldR+&E(d-!pyFJz?? zFZQsKo|%H2Dv7T>u}?0?4lFSVc$Ao}8CFZ_v4_TySL9*iPwwZhM%E*Fo85|V3)~x* zPS#|$hdf=QK^})xVyGPGh*FzV{bE>d<^?;^ztf_uZn0it=}ua)olv0|bqhZXl<56- z-HD4H$}C#Qh$_ahjp86~&!?&WML8yl=*|N8z316EObZHm00B}C!ue(F3_qt|*m1#C z9K3dswVOMBnsM19^Y(gZ4m(95=V<*fCem>!(qbM*`x6;9-C@@>KSn?bzmv zhtxQdXFXowpnLGbMUanSBLYm2-C1|SKkk1M{hEOX5G-#1(Y8nD!cyTS@8eBv;}+l~ z;dPQDymB&vlDZNtm!Boel!T>KVVii~$P%R9$M3e&rNXDyXYhoR6zzqSZ-x5AD>z#c z!Wm*V$yRsVId3cNI8E8kjn2mJ>nD4vQ11QuS=U;0#W3OiEgTFiIYR5UQlI~05z)Q_ z(`<0#+7BmDGa1ywwJ|I zuK!FRE_TvG^udu)-n{n7tVzKu%$AO;NRzLE0rhY1lscSFZ}Qy`15^73GyP=st~+ZDgb!GOoqrVdoYK_wuCmRi+di3`muJL%xIlxWnDYmUvZs zs!V6_kvF}7?sULUziN$yRwIP$>m%CjLH>MW&v0W>ZrlX*g)bdE`mq~Y`q&^@hv?4J zeJNf5eUW#w_T1lfRU^Jr(ZBIc$>t6U4cK>8InLPYr$dt=EPqRe-@~g^c?N)^Y7p3dX27pK%P|-_L_pWD1Rll9b2FigG;!J@jE3QO} zpb`b04(Sg+IUfJx!-Cqnf|=P);szJO)qyzo>Pg;Uz$28kr86eH86xydQC6z#PBsmO zr>f6Mgg1{E>o%LTL>L8yW)GF0W0&pLW(%R0h>FA`w=;?Ryfl#6I*$7JY1HafG354Y zJ1K@iCH8k({Hai=NORPg5RyOy0q$FDCQ7538*<$1CbY|+Q_TgW$=AIT_;af4F>Tv<_Yh!d`Px6W*LZ2 zMlVR{$n$4h>-{wj9IfxxkFa#d;TaVB-j+&yGQy<(TDzb9m5@REfMy5s$~8QuL@su< zd#*!S#l9jPXtDyN#*BaR??*nm#)s7#zuJ8eGv0Z_c-m@`_I~~2<}LaJ$6@O2{U0uu ziNY_A$|yAKgt?4w+D;gTkJe1PpgYwATgr*=KWi{8gZ)MA!!F0BnCshrnIH)M+>Cbuo`05Zkk7G9a1*Uf;XTYiZLTgf*#yX6EWoiyF2F(Qr|ywllk}({xZ~9W65qGz*@Qfet-lFI zPf|bAPjN3xPlLaEIHeQJZr>Udg`>qrZc+o-CrodxY;u18ZIgOF-09R$)q9uBlRzzn zfc;KiA&d6dJ`03_!KcNBKX3(VO&-6)mAE+HlRO3-Xke)aj`%jWK75S`LCSh)`iZqJ z1i<%OT>wEG1^n_4xfULEQ?2=}G(gvSv%&*}a+siFOSuF}p5nu-9 z{^54b3p{`jNee*|5oGV#a@}~Jz)&zm7L%uOW2!18PA-+sFK!R4 zrn^-1V!nm_`8X(+R0Q3TVvO~)9n4CA%@iq zs>>C5)o;6^$?NY{QK?me^*Y-Nt^C4i4#L@MSl`vlDAH>TN~CZ*b&3tzy~ck`ZOq5; zH7{=0{)eE1r?xCb&EK*jd_gIEqPn}lqIt;dipnpw^MPL`>rD8aTK3mxc#ud6()50- zj#e%Gd^Kq_&r}suv;>$NTbrPb8m2jlymGMA6YzR(X1{gxem3xFv9@2FAZwh!K_vDg z51uB%i28;&SAkx4mfZmR@B#Izx4QZ^sYr;FL>MC zD$J4defZ0hqNghkW$4chQDty$dnm=il})Wk>_O!UU&R~1COIKd`P5p>a^TH`+c!Zf z)YDnm1F7M|YcUXObe}WP3j}Xpww&pZLeSyM8YJZ$@_r--`4Z^|J~&-=4tJ-50lF{) z1PKov&BbBUiApTv$R@4aUd4B{J>)p-HTkt7cSCHSPw32)UiLZ)zYs;bD^4oI%ChA! z90p#m7jXG7U29tY9Kpzqmi7aH7Z1A?aEZQ%zU7OC)=IlKPkQP=M~`gWDGN}Ihe2cn zh|3_K5_H4zm0kC4ZUWP62jiJPuK~7z0}whMCAZ{i2>6b|b^g`Nt=&Qc32;;%+3xrS zA(7!sO4@!P4@a!DF+8sxT*d4t6FW{`Q0tRAP+r z!@{iARh_hl(--hP0mY8^f@tV5S)(0$?)f2p&95p^9?d!@ZoDTF?!vumt|7w-QH4E~ zy?7G&dc!C)xBAki|K}&@ZJ_wam*gYLKf4r0Y1%VCPv`n{H;c8|51I2xr8u%EVmB3~ zFP0e-6)cFY-@OSCo(Ir8!;vA3hj3l08wVIcr6p^g#C!JybRNMv3L~VPrJxc@Isy-zUxYqcopEa`^m4D6q68U)j zhlHcc;^|!9!kqTtPOz-PW|rl5(XQ?xzm2R;9!z$$3?odzK6SP)apMDa48<-U=%5pr za}*O`VsKUDnLhm6>Tgn7UZ+p(&?M%a_m>ZEU>})~Z_5G{!H6E;>L0^P8ro?W=Us18 zXl`4B#}6Af@W$P#RbLfVSH!R|370d7xHY3{isi##sf}g%3#EapA%OtbB(KE}v|WITZzG8ZX3WWw@Mc*}`yj^; zJC`5Z@f8Zq+u-p^5e!!8XdloITor=O(LmUB`r6Lm;#`$PS*@>p*aJjq3QGN4n6&3> zJA~c79UP>Q8d6rzy)O*@ZLX^eleqI&LjqDvuDp+nqnyp!gK z>S5mo|CNY{EC>M`goc_kj-|Y?TGjII<(m{{W?|v06lZy-aI_*+c?<-l z^RcG@g3zs!swgcnk2eZOT768<B?s= zzs>JlBg>YJ`Ka*P;Y;>KJmWK1^9V74D9O-<>bXp<_S>)4;v!Wv`Q9;rIE{$y1QQMQ z!kWIOa^2?Kbk%Y3fEy6vrUJ>`2cwz%efo0S4BeE}b)gzyKsb+)eUuj<~ zPWgOv*$Q8dM-+mnRN^gu&rmpZ+f~X7j>Dr&M+p3nlvK18k5>t2haOvWIo^7I{xO9x zaj(Q%JV}fVQnAQX-%z7&qV^X$|JA++t9A*3V0z9~tL~fBb zG2`XAMuL8Q5Bzy5TXG=P0OM-}kOP+v?N7kZ+&nrUv{3n!2OWL{W-@WZWCg6@9aLRL zNkeA*+UHmg&D;n|ETH3haMggZEXV_8dZ(Vg4Fh{W#m5c(;FDt(wXDa#%5BRxb^vWC0<~|IBbx1Ry1VMn)^j^JcmGx3aFHZDICrvA zpl2Xiwe8mdmJ2sjY=r&^D~`HZ@Y=nGr%+-~Oi^?)Z)M;mHLVs@=5B=Dl9`9Se}FPXw~a!zVeuIYe2@0R!z(Gz>cnnXlbx}rtCWKUSw}& zP;{Xv5d2WssXaP(IR)~sG6Zb%ayzqPVsNZy;$A`RbpJh7XhllZtkfA8U{IfMc+krj<|UoJBFNJ~WV^bt zT!3$Ay;i(i0HOC~2F%yJ8G)G6otK?!My-(;Xi-mag2wl0daY@iDUExBH~8cr@rh7dcsvRF;Yy~d|LW{il}6tLp^FxMRBbQ4(%hq zAJgYJ-586*L!~(6i!N5C8DXs_-y+g`44EMQu~2WRGl8$y1`{z2RtsH_P4B(w1ehz= zCUbikpv}wAF>mJoK*|=la)D4-7+wR$bcL+|@V~XG*9Kl*J_-?*-~)klp*I`)-%YXo z#leJF6y)YSRq7_Z$=`YB|4=B!MCaS|W_>)GYCJA%3ARHc&oyT1B+bl4cvu1_3?Lrx zOWtc!4x0U8Q()041m9bRgneaX^A|A?-nT)bT&J*&0n`IfWVrwT$_24sz`5R0BVt!E zP~+Hr&p4pfB*wI4MQ!IeVV=-QHR#)Ra?ciW{skZRzTMb(HUeY{VShjUNUEL1Fquf) zq#R}E{{C3k!F{?BxlkmU)~&>&n_GkhDC>S${rzm~H$q?$lH6iK>s59Je>BIEwAu`K_H7MLs|X9HKXhKDIB~st^mZHv-+Na7Pmm%NmA9Y-Az$KL zF=*a}7i;^V&ViWl#fu5l`n7S&!s&@4b!tQOGgXNuvz~~M?ctXTU&sc-Bb2yAaod4$ zwq~V01%++?`qyHO#~(*q9uqPGC}6-nH~RzSt4U$_)gNE7_ueZ(KzF4Fb_ zG-OFYAWoST8V&7$%?D07vB1t+683hIP`S1DBv*tMnGD<+5I2mPZLEJQ+UU?|!k&F< zBveBJy~2ONMzZSmOARJiBNAA%oU0G#2#K`;DzWr{;B2KG2>=Cgg4|0^L=yG+bh9Cw zOr&4f(NZoI5_V-O8JZn7wQMLrMmRQ$1332npwL=8u?JTU5HqqkSC5m*Otv&vMFMi) za(AGI5baHV$AHt^6=Sn9JKl;Dom+#@0g0BCC=3+3VT-#}NN$ZQVY;jKmNGto(K*7e z*mD`rltVf;NL2`jIn~gE*+S}5yoQi^>Y*3%))XkM(s;_kCXE~$6jxi^O1P#*Fg`hj zw-#Np4)6PI+R4Oz2gk?O=3tb==ah`+&|i#X2U1uwC_MqwvuNd_C@H}&Th#XM^3_ko z&r(f`Be~UdfbaR^=}JFge5bs>>mP9tdSnOi^_+kN0{(#q)D+^LVFZ@u;vnwk0rE%S zNhu;#j>^sRef{p$;(~sMiXJ%m?0yJf$!pb?V;W`k?*CQ^e~F=_aK{97z*=vn{D(kt zB%u2Gf{Z!2H9kL_UsytjVhgwuv+XiTF~|q?#_6Ac1z(2w3i9gUue>ZnPkZou^OOFs z_gf@OE8BX5Pp1r>JH**3Xpp{Nv|4s8GNq%c-gk7)c2G5Th%cLqOLj74U}%!o_pd{h zG?WM4F=ZxWRREPtmx8)eceG@H{gc?!9J=mH;{B?>jt0GYTSSCt_81qNWpIpLYTO=e zZNvajLDp*>jk{cS5117g%nI#8%PKmK<~!EE_t1FMfXx7yNHwauk<<}<$`qWjog06m zFDO!Bq|)^1usoDnx`0koyG~|11Fh=7gq1_6Ku)aD<@$#gde&kRpNv^go32z5=^ytu zr_VpLG)(|Rv<7TSEP_gQ_~@u`;lgo!&F-`&RP%VL#6%o@`_o;QTP z`G=+e70a59dM98OXhu-K=xH$~VIL6zLda=#do2O`kM1r5CWe~qjh}P{8Z2XjxRz}{ zvX~aI3CuV+5_(Yk%TVzNC8D-;4CW%F+L``-;nSdz9_V!G_#vBSW374=@h~=zC>i66iDo8sWQp!2}L`EM;OxSJ$52 zZ^hvY#UY|4hsq`vT6S}QvW7tGiBRmJAHnMlJ_y_SfJoPc%l0-z0qiMf0k>HIDz31?7v zx^B!!)-0uUTc4#@9;()6xUSnC90(vBDMc%Hk`ABvYj};5FvbJs4j%0 zp)TIGq?%Tgtv{6upVQ*TR(`jQK_uJh4@VHoQ`HA*!^%`y z5v%Ur{C=zTb5b@75sIFIHuskM?7`l{J-^#;X7n`DCf!I68LIAG*CK)ZChs0oHqULax zG%J%$RK(mh@l@b*N6tTvp~!=TP6gpR`;z9n(Q}ZUht@J~ z>-Q5yTID@8Y!vw1E16=*e&{!(f)RoJoES25(4PuAjP@)LKY07qD6k<6ive zmJ4r>&}>zOQ7b7I*~rci78aOjIjF>B{A~>^Lkl;!r3AK0;z12x6W_4zNmFzM;0a5=j^M~b%|)sg1rt7OpKuSL9VKp6V4(aaBBnrSdl0Xg*E3>**z z*xa%6)Gr7(Q33qV7tjDu$;}=P+1M8@+}@SaLBEe=$r`3UZ|qb-9g!Qut~2h$pIAMA zs-#Xf=~M8@5Y-)bjs;?IM19+3nPc+sS|5`z#_X%FAF ze@!cz9I%vK!N}<-rvcmfoD1|wh5&d;LmwgnBIZGsZ(8^tQnZS;X&f>cGY`LQEG6>< z?qdDqU;T5<2*A_NXG>84%QOm%mplalLRV}-zF}}0#Puoj{p%9+uXm2zK4~uY&$sVn zOCI>wfg*orX~IMX)v^GxPi-2{Z{bE-4g$YSiCz6`IZ@X|DHE zBS#~&_D+!V2Pf0>>tDrs`=`+h$s5j2&L6^GZ~Tgz=q%#<@FA)LV?auTN8nXf6~k8j zVA@4mlk2pT<_lehpWTMlW`okdX6)Y;Tk%?y-fO-Iac3p zZ3Ud3n`uB1EU&B58ZR;wA{weR(bbdCBNOX#_0ZKJ9`ogcK3ZqgtPXv z(jzT(Ydgj0fsT3mWmE|Qu{u>Ol{5~r6NzNja>4K@z4`F`$7gg*?5?-QWO zN=kw^ibH7s?+vHEef6wHy@|hn@g2UB-a#fID}mlxMLhx=%VS)$?Yb)X!kyD@=Rw+d zGb4PRNK4E~{3bd#tQ!YWc8{s@l1IJrVt=I-+^ub_u-sjL&(Wk}yk6y$Lte~Eocrxg z{Z2PKcYz_KH^n#n?m77L)=dcXMLVYKzU7%VTcS}~akrW=%bzDd4RzzR3xy~Px*@MN zZSG!vH_Pa{OZ^YwA}=&GpEafWpN!!Ro?-@yP5h~^fve64+j%#J6W#LHS>fTNLPDEdd+}4LQFNyRMZX|uU2tIvOyX;p_ zdc0P#zE*Hi9B8sX{;E5rGQw!n=5kqwHH3TYxz1aw?POM*_ZjKFWRsmm6C7hdx&ZUXeA92d%8Jv)n!h07!<|piuVN7EHzH5lNi+GqA(f=2Fr_{ z84m-H zPMZz?<*6X=q4$^^OH7ukE#xabB;YW!F*tFt5O^D+^K3KAljAjail?}K!~LvuB0qQU zn8n1m3x4JU_SC&9A%O%#;zagm>Z}Vd_0-e2hfa0`lk}5*7ki(a?UuXgIxN^-`mGak z%|Vl|=b&j6%_3b^4<+*kJ+^e-JLkX4mGWqB`Vd*@Td@jA<;TOw5}{h`+TfY=fqKt8 z?zkj$D)O<}Y*TBJg8IM3M1mJjIfa@G7<00B-Z_WQ6F}$xen>D_y8Y)W%Xi~`&L4Lq zO!F=)G%3)i92CU-il8|RL<|ZTVm%pg@eW0x1&%QYWA{6fXY?@nJz2}5GSxmkG$PWts`-p18gi`dFU*2)IaU2kH_ zQ(3i}p}yi9O_n72v&P%#1&k50^Qf72HjH0CId_LE$t|K{J;&fc9k zR4wcE)Ez)}r(PGR%I70=-RHaN(tBu9`opn=s(AkJ;Y4sj=M|q_R|4Cc zmg-!>eo4&N6|`IQe;%ZB=o>$T)~$X>+{z<}W`*Fu*V|geTARhPVoQtg+%I4~U%40L z_@j0zZ%1wHsjQLIt9(CK<|2P{-h6P^jj1nQ(7)y-v0NDQEzV>#z9lcIufjohTj*(& z8&tqk$!Nf#^eiei{^BvEVEPVpxB6lFboKQ6ODnUReST?hPO$vKbX0PlO-t=#!+2O3 zw^u~#l=bV*sFt(71emppscW_+CO2mL&wjaW2IG`F4j;5o$&*pt)65e>D(Lb^ZFH^b zA=@hxE^}(ill-_D`7F5=R{Hs2+3N$)=oQhc(?3Na_I@{;{bw-Wh*|IF}WW&_3a}qxO7T z@m6QH`H0Te0wY2lyk+U#r!!OOO4Acr;bqJ%s)ub0f8mjTq~q}hMtlv0F6`gcYBMUC zS=_Y$oQrW%5Me0twLlSuy=yU~|3ZiV&cMW6=(v?&Em%c0$3ZUMRHLW|kTFci-LmrB z?$3{7{=B`O4h}YPSsC0qXVv}cYjxM8!jk$2?{lxriXK*(@kSTBgG(@f^dox0Qps&i z`(xw&5UPMB{Tgb-Ioj9;XaUy!AwqjYpYYy8VE9QGCR!58jV(qnRWXv3z`4!>yQTP_ zL@8IzA3Eq_%kg|A=r4AXjbu3|J$5~>drLd-1s~N!jClnZGG52yeY2mq%mL67kGR!v z{+zm9Ma2zb4!L$`q4(QYa#{KBGWwI=4G~1@WqPGCS=A}{5Uht^Lg2t*y6YD!Kc|XZ z9pLW}ur1Hyzi%DWg}B{|W=+b^#dBS+*k3kYJKMJth8&gDE6fX=DVQr#tda9+19gm%2Ee&ADf&x)Tkh;ujUVB3DV z-X)?(LQlE4nG3$Z>ArX3WoHpt6cU`loXAI2YAboBHfplOwwy=Hk$0j|8a?o?)oMs8 zdU&DQagX8rqgS1@9A{m{`d{yuZu6#B{Hrz^;D_oXB$IdvwQH-Sm!w`GQowDk1geGs zQt+DjVUqTkLqrhY)m({WkJZlAXmgGt8`0`ncDF%I_>9uFvb4#~%2J+D`MaazqCBjv z!dJ28x7=Bn}R-n!DB9cula}c+S`ZYh3@^`Pt9-|`c}>- zIEaMzktcdyOoV9NO)iFi_&XOfo+Vh2OWD?lzQ9+p+1;*j%n{8TG9hT?pV-6c{nX*?hJnaVg^(SsF zGITzK*S(6dADgOqndgOt!1GC|204u?N3{V`d_lek@3)T3L+V5YTv+AU4AQwNa3WQpm-@Ul2;L(Zm*AzI_S>Uq^&4c(CChcSX zphkDg8Q5jz$h63lMKAOz`WF=7&(sK7QKYT0g|~isEO%A= z03S9NnsjqdX>mUcHf} zqwIKpRmBMH_OCi2P48L+Glz?7+u{xVb>wI+Iul=rs zUjGI)VYDNA{hWQ{y7p`6@po6*Z32{bsM-8SRKl}Oq<;E4!sGH?P^XNW9$OGd?;bmE zirY7q$Zxq+5XF;Oza#a$3#Ew8uoYWQdpb52_-;tP^IuQv1)*5yt~P!(3+}gV(o4@r zLR#fj(i_lRW#1TkBCR}GT#=BDz`MupZgOx*+$`E3IQE5-;}Ule?~}Dn@~x_a__{xd zzx!k)WxDW7#ey4@Du2K257}3Tt1gJDN57H{y|E0G#0E$|<5^d|Xs(;b&zUAWFp>B4;Nd3dQ z{i{-speL1iDRF6X?E12QNG+;H1QFB|fL z2;;Qp8_vSCiHa0=?eRaEtP^wAn19Y|t`+~dBoOKFR{!R*VB&A`D$kKMFkz2p?7Wm> znf$7|LL~9TJmFaSC`p=)GtFnXRtr&`MG>6E;~ay3UUE$S?v~y|n3Gm~J?Si;Ogp_I z#5#8~{qWAkKlnD)9-bGDuD;Y?s2_v$j!!*rv-8+A1$zw%&!hMUN;SUPHq#uUe}5}M zR_j&c^l0_QO6tA;ic(8XzOkC?8U3SUSz$48NBDTXyVkb(?4=e<8@mE=h)Z zlGa|tE3YsW(>?hSIkdm`OVqSM9x zcVu@>xz|3Dk5BTUGES?x9V+##^rYgvOzvC>3#S|B1gQ$5F(&*VAyw;yYxZ~N6qoA^dG0Whl>HU!ch?8gh1Sb~BqpX)a-UZm=tku{ph>PQ#b)h? z$7Xp|L$2(2Bj}^nJIS+?{3`#c=7%ANBcdW zq|v$`&8y`G*8VWt#h*8{&i}VufxQb_Y$RMFpf|bX;1x zoAGd!5Ks^hkR09Jjes!e?wE88n8X;h?f=>Le!suJ#~sh{aCr8_yI%2rjzhkF3W|7o zi;e~&zoHb>>`qr3iVHA(BIJMU0P^DP@K-*E^(F;B-m?#Qs=ICfl_1UWa@`3dpd_%@ zWU_oll(T-M{P3IPpu_3$2avgpqk?@j{#mJ6fSYsg#=egjGCcg@3J>q)ojguinjq6I z)x6*NA~V!{YAJ-LOVNN_S-ZqpJmI>X&FKo1xgv5fy4NrzWSk|v`xjgA^w6Lj+~<$~ zU>Dsy3lyTk5g-w>1>E?;+WGPYY|g!M6MYmsTf8*88{_&TkJU3yCv_et2%D5Ri(&PA zCh`f_ zTM(`l=H{%;EEg{PHvZ$r{~C1GQQOg>mR+U^9;4B(9=G;m@|)Q6dS;le>V0DAQtEjn z{?6w-=+1;AcGK7xNquRnWI@j4!ZMl#NqtzMOSvP!&JAkr#Da#)@`RwE>|sRcuh3VI z3aK`h9ha{Qgj}S>1}wv&#>cQW zRfS36O>{OTCj+@*#|#ak#W*1mOWmgQGlWBb}ufZyfNR(N6Yr6yjlDp4T+h)NzZSHm*!EhVL|Z} zPtNe}(f>{m6V~rM8OXv8kB!`ws_QfVW$IsJIJh97^}z>oeEPSx+c9&HWvcy9AxkU= zcE(aeK?mb!#85l1T=5QJ7|kek?SH9W{R4=B?n>l>vu(S+aG^y>==}Df)pek}U)MNT zM|2gtQZVt^zOh-;lW~b);J5WZw|aFK1y@jOl_q1#4&Ws;CCi1;9oc&=kAMAiIW5)- z*UYMLzRq*k2ofcmm%}J=>gmC{;ST!dt4 zw@)UYiT8{JUtgsCM~ItN=Met3>*d+h{{HGc@dplu??$hjw1h$av$1tuN?#ZEx{7TH zc5xX>`6oP%ryFpMi<nzlr%eTkNAbSjdlNlI=5 zaR`=L_L(_&>*&Qw)5S6_Op6lX1of>zB$hoLkYvyQ|cl0GjMl_;TK;1dz0_?Zwq-NP4vdG4`Q`C5poL}JVx_(YArFG zJnX6OIG9y=3PZVvBG27p-lre&uS5?loMot2bN-3ds|QXD&9uqGYtudZ9#re80p|5;vfw;U3a2 zw@@!%$)9nsYg7UTbIG#!80*oeB9X&G{;65muZs9E!$b)I!cru<_VjSmvsxa#jE&?T zGhb?QYt28gX4wC~xFCdsxZpkb0(B^nHIB9Xt};zu8LZt2OSFQDa^rOZ>j+jD9FIZsS$y8@Q@Fx3_NfiilK{sJpcwe*SXL%~^Zr99K+ zVv0y{2c>6ZNU3N|TsuNTfJ%)0Agu#D=u&52^M5y$v^zapnT8M6xj$(&#yYY~vp$;{ zDY_D~?1dA(-#woOHExEkpGL1tn>jKp9KXnHDP7OuN#+|a(w%m;edylpYnjRYn9)rQ zkzv-~5a0JXrp-!p=Hr=MzL~Sf&cSibmc!X-Ou{whD-D%8tQkFLyN}`g{Z7v`y?PB@ z66&rF(drsFc;^g)5@K(oXro&0xIlkBz6)$U5w&cxd)+Ayp)(izTl05Ma+N06ll>zq zB19ip<5`nDSzOmeDIE#C){=p?1>@(_NM|%fZtob1>%s*&9xdm~|33R8eSL;YA*=oR z$>-NhH}BJhZx*tNQyKN{>j`;lo_7uo3&Y6`6YE{iTgS2b@Y8v2$)`>QY&XV79b;MH z$?(6r`!dZXvy_gc@8KkeV)@FE+JGeoHqagd3r2%B|SQp5+N|1G@g?isdp)$xld8?w#_R(?AMO(nQsFWopfQ3XEez?)Hzc zq=~kmVPWo45a{!;he~E&7v)idFG^<%{=$W^+-CXnHFg8lmoiv0e!fb1>gInQlI<#B zFUBgr-qZ5@75!YL0jkta5Qf;P-W&um^6{TN7B@_fvQ%DeegmqxLO$wa=pnQrZ1avP zNsK=>OM`kV_V?a@f#3_zZEi?>W43$Uyt3eqt8)i9JPc<#NWt>)1aISoFO_FO+NFgg z+=zBtxhHN^V+3ECc-_-G_WKAezr$AN@Hx>E{&&GdBjz9Zoz?aCg<5&5Nh`r=uP0l|Xt5{JBQiWRYFNxJX6S@MeNgjRala+kM$J=;dro=g;lyUtZ(J*9 zorn9#X&!u0CG2ZFoBi1_e^RI!!l~ObDCYd^T`E5GTwbc{r77g)fzpUeJ|6r#NI_wQ zPfoC7<-}uo*71>M+?-W3+Svcaa4=J8%zgQze?F|<6MmTAoaVb_4I;+ex&CW;WIfKi z-z@Uc%t-V~1kGS{%&l7XY1C#)f8{I%!|w6L-hWmV#wFHAvyMjg`?dEWqT%_=LfAqx zPQiwM!yh0=&d?&4E4o!jpb`vWrfwv@s695;*_KE5oNw5*^WjaHnMdPw z$0m*4(3qH6ooEYYAAp6Pw&K}1*PoWly>jQ5GAj^1D9fagB1GO@IBB#&c(=R3kGicM zods&dOsH^q;pUKIo^_=7D>8`t%DiRlqjen#_`i-u%*Bdt&w#$*Lg?!Y5B`m-FP0v6 zqw=?({lj<=H^zNuX|V#9q^GHNYtE$qQ;Lg4t#iI018|VG^1L~3SYMbfpl&UA>n~$C zq(I~uPwekb@*q_6FCyUCGHJ&eW2NDxF^oNYv z{PFSKAf-PZZ40m~n1xufW=AsBV@@dduRfHYC1jS`YgyQzUt?`l`Kg9zKTh|O`$XvE z(?E=4poFHuO(hHe`MtxLEPED1eIEAty>)C@Ck@NvgG}F4Lw@Knp?q)g>Gf3?y_gBv ziaw#63!-(7r;0#84bm38K93J__&jT^hPfoWpLDSyjd#^Q#r;fO0|}JCrU9~0i?`yO z?aR$yMIC3~#IC^Ywd&(aRqRxqpV5rY50;3)e79aSuPC>dzqo&A{57t4$g_8u|H=dT z1m?oj7VD}m3T3>vX$F%ZuQ5Js34tk|8Ow;5etUj-C$gnMxB4>}JsP1;-6MgE3D;Oa z>-+B?R{FLNn;ZaF0X>uV9HnD(&KkdEZdztZ?qW(Scb&D&NDby}*Y;!$4*I?51UAr5 zvlmAWnBNH&h?E%6w8tAGG~ONLWF6il57NZWo@L3M*EbC~-vUps04ID~ZU@1vEqFt2 z<_JwZO@0UojXR?aVm#uC^PXA5|DG)pt?v=r-Z&0g{KAE)heb8atcb+EI+B7fPaL=4 z->N|_?~z#(ID>Z`4d9Z0Kl1iSdZ6#y>Klh%u^*MO%KO5hnD%@`ozin-!=ta$Y&;qG0OE1VBdz9OQ=|wRGAp#NPM|}Q_ zjmulxlZ~!{v&NZtJ~}(rP#hO-Iw{awgGYftLkc-$-0N6IxFRq4!-#~7ozb`H?&-8> zQaZLe6bPd?Zbgq=ZfH&QC?RGREi1<@ej*yk)K$F#Ur{7~u!a3Yv-Y`b!moyvAURKn z3;+-y2RRhftaYO}b{xe=#_|%8%)&7AystEXi=#)bHi+#0<^CxlK(%8ty85yIJ74V~ z5}g-5Hpy8h<$s~785MBb?XsI>`8!Q;2o+vesi(M0Nrpj_C_dcR{BApLw&cvNpQ0Ww z=NjG_7H<(w4cd{8e(Op>!j7LHeJk`lhc)ubXO^bI8EHbB8+>9f_tE;;)0hzjE>Ju{ zq?@0&>nIAT;9oqs<*G9Cu*@eLG#XF+(>vR%K{XV+R%r9zYG~bMDO5E$P%mDzN0yQ3 z=yLO5cRQSAYiVLzJXZc&w}4BUw(Q_1=}n%yF(oG*HvL9J^-#=!?UszsuTDx%N(@Di zSp%VbT%Mt_=0TP|LV$k5edJ>IHP{AM#B8k&ndniS`#-9h@pG-}pZoVZ{+!u5%AK@6 zx#HT!K!0zRe{ngfynL+ms&SZfTdpL)o`zg8c0w@UiJNPe{))Q891rU_^IXm8_z-)!;J;z#WT8C4Ze1ojXXhs! zg-KQQbEuL@k1P z{bztfP8C<$Q%B>1imkN#Q-E;$ti?U)>Hh>7#ZW<4jy%u-)+eAxQ`?+u)z7AbmLdSt zx6jV|^rp>*vz{9W@ms>Xk?+&<_~1@KYrG)rG4A@mB7go1vt zwI5lB0ml_85=wDJ+n}nCK*a@hSiRR<=xEd!)gN*Eunuv^and&BFIi-9sIXw(Vs-p% zHQtLc}U$i+Ujn>dsJR5TBXL zS{o$L)()5~iRW6TdeQz=O^WH!ya1UwFlTbjpa}WP!LX`DITkmUqw}mBt?&aB;d#%HhvTrl za9%nKgpnPOK^ zvd7~16W4Jb_?gk5w(HRSOHroER}-ak9}guKXz1>~{eG(A#1jrK+$Yyt3$j+-66bdq z29A*iAoFSxC)aNYJ5*)AhEbn)ja74jS)_X*Y5nlxg$;`T53Ot*8lU_X2@`uC#(Ze~Ev_O&lpY|vlDy`7pej2bl=X5;vQ z;Nh1ClbKtaWbgP`be;SXbqiGW!qH#Pq`>3!*ltJo0f&iM?YObjqfti04{CCo@Z#8u zhJ;^lUn@!+i2A>Kle-J42*Lf%Lq6P1{HtMePblma4Nezk#5APq$umAfW87X7dWaoT zV8pJrHv~GkPM@;R9|qQwB~X2fD{X_%?c7~2o{kk;*~hrgXBJk^y-I`BG6aP~-0^0G z%M-d3*0@m7oZ4AZcGqvreoa4L`x0qTsfroM*L;-RKz4_j(ECOMf$>%DQFuLEK zhvtqq@=(J;%k(k})DiWq#K$~#&Cl4XU}3pxqZ=)2JMwdv1aB_mc)^u@L<~hWsT);{2%{KG0*kxdzJbA6vf}uby1u{Tnp0NOG*-B z`^0IWRx)Fis@cu2qScX9nrQTsM-31;1*g>1Y;I7AGa#&1n`=4MVGOksPK~h^E-!Z7 zES}x#ky@qDs3!IO&S%(bhE7#S)45|3=*t?_B`G;Sn@7I}exBF*j3F2Tr3qrlKA5`) z=8Y@PkwP+c$hvP4aBgv*C{_vkmo%!|staL9XocHzbyD4iczzW10nEQwh^z6GhAa-^ zb(j}v%+iC4K`k9?&E|#>TC1t0W}A^u4(r=WD^SPLBWJcdc|iDA|x4a zl83+!a*;4xUkuZXvI-rj{i~CPB^BsW&0Y~>&bamqjaw+mw0ANxb7HuG#+}<^Fu?+J#~IC2Cn+ul|nBN;XbT`AUW#c0J5;#Ur2|sXam02L;h! zD}z3adcIia@!q15H2sWT#*7tWYe?AcgsftX9$;gB#2u>7qvN0@`Re_{ImhO*0)74# zL7ax}<(=?Xn%LixV7y4lKmCNKikpAs#9Ah~>BquZWu3`|X;RCMN93*zTCzz{xXIce z&NA~4zSJZmNh2rJZQ7OwW`Q?sRw-Ex^a!;n#WcJ3e@ql<;<@>|NUEYo`f4~M{_9h5 zi5!p>!N0mQ<9(rHwACqdw>?+qT%%%4Z=dABJ53l4mGH&2&Iy*ywc9W~<{bt9{@mi8 z*Siq#>g2U)MBb?<^|#c@81LgJJ(9C?Ck_o|mg|qu#}Mf3CR&f^g$4%^94t`{ zmv*MsB+gCr1pKRNLQlM1jSE2xQatK)Dcqohk;T|-E8+db!fBOnk$vbZ(}q*e!o$5X}}8*gHo{|89~ z42&PQiO=}#O#`a_@0u-~Oz7*ZK)g9c|UMkYm%4&BoQZe`&mRFU<6T>p}M{_sCRQ7j9u>B79J*Q>ir$ zg4$}CX23g`X2;r7fVz^_b0H1LIhgLML}y4L3Ls*D4Z@#i)ui?UA>QOaq@jjMR`i&_ znOUrnN2*>6zQAz#B%V)ex|C0SS-;f&0JU@ZO0{jHB<$}!>Vl@_EB2B^LDJ#dg~sI> zxdCsvmEJfmfIFzG2JpVO2Q<%X-OQ?Y)Sa6|wRWwETFd?S0|TR+o-+q+ ztVcVXN3_1e+`Uya)-cp_Fd=8l&v+1qb;KzA+)Hs>ycBEb{m)Cr33o63jeDuqzCRmr z{y8>g7h4Nv`~H|Lg-wsgC;F?@u`6qJ_2I<@+3#bMLAtE)lIUsOp3FffN#o;tN?KmE zx!clAbf}O`7ORcRc-o?atn$1Ea+wxVUFQPpgh=J7-#CZ;PEDmb!Y#3=bM1WssR8UP zp5!v!7h64g1>I%TbVh!*dBSjL0#+yw=&rlJQ+)oGcqT`xTG(HPT%u>J}^CY$nWG=uB1Tu=9QhrK-*cklw-_Y z=3~)_ydG<(bwa7lsqWyAs=VtR-}Bg8sk4ZrfZbYbR2sb5`)uXo1VT;ZD||b&0xMij z^-{2)AOxc}T0}h~sRf!qaG|+Sp2kV&oo_MbnAj2|jjYSQ zn-jScyJfow*TU-FZ$-@X6}2TlayxAkJ#@^TWG&-FaKCSfS(bL!i>?1`IUSu{WB<`_ zq*_?YS2}v_j28X%gO9Bfi|5PJKZ7z8TbtAn1Es@PT?=7qXRXv3?m5~-SP4+T0Y#?M zs#Pt&fvH)(indhK+g=e!FsT4zyshY!_fp%U{7%Ec`*g9r)6V^?%POq8E$O;Qqe@kJ z#E@|=^O%B%{;ZU2tAS1~fObl&+16MB8@7L3ygMfT1i~=g41Ehy@S8%BnvMOKt5s*> z<^#CuhBfL!*yOw2^n4jl{-G5$i9cr;*r^7`rXCpa8qyOhms23oSiS0eU7Uf0LFQG= zGYW70ny+WrDcdCM#CFfl#3zRB@e1sk6mqEf_=B3E)1Zr?`__dNZygqf;Ng;;CZWcc zo)XOint-$*{U?^+quRE}KA|;3?Lb>_D?++>w54&y7G>yCja07RZxEMyF#@pTaots) z{m;BP(#C_3RE8M}J8uv9RP@YzVTR!0qz`*!-xy(ZU&!@s$rbjEW;#7pCAv%WdZ8!Z+njDMxrJ* z0@3uFBJ@<_Sy5|)j5hzy`{ELWbIx$+!Mw-9mp~(h@Hb`+i+e(+zqnn=?}+ZuN&56Z z+7aUuH<5G`YE=3;eAAb1iv@usHW#6`M)xLpM<}hp%0ge-M5#9v!5Kb#cy;`4tkU(M ze%>C>-C?*;Rw+`G_kY9hh6J#l=OoIq><$UfjaofgUm3l|wEYlt50J)$Ge_YfHePA` ztR*Eknq`d}&=+65r-mzVJBTk*fLJ?Mpzp@@YXh}M!b2h0wP}Y8LHO^8_SI~z<8jK0 zwUruM#`I#gf+n1BkRsn#d-S-ht}J4xq|Segi#C|28CUFQba z8tDK6iafhGNTUVQsV%cf{-HcZ;< zC%yqaTJ}4c5BWZWMrS{TEd3e*h`efi&P@h#mRIjuT{TGJ;Jr23IXGfE0H2~gF?b7S z4$A>OFygmh*78>i`Ss}~1YFpWWI^W#t)cq#whmg;?(y7bKSsa8&$|V-?UOLK z!e5O6Nq&Lv;$WC&oMYopo7iUJ^LFom+pZ)bym4}I!#YA3#zLB?Yf<-+LyJAne%+|| zOkmd^KI-5D`F@}OSWAg`ntMrs-oAFgss5{H+bUPT#3L2~s>d^dwO0SS} zg+ycj7vK2J3fkKqUbE#oiY?y81-qTn+*Q^e@+Zxi{S}j1ImBW*mtk$Cj+!S}?QeQh zq7x%UGr24ppu%!32gs}>NXYkSTkiA<_3_s8rbN#hcDr}P3_uQ^ZL-fY zS|E!D`7pbkZEuj8HGeOqwa{Yso&}RpZ%7a|itP2lci9Il(8D7A#h`Lf;yIIVu=g2#S!+=(Fz; zhhIUNaZ#Dk)kUUek*Yq7#h_6yTiYlN6m@m*u=XzGI)-#b3XYM!gV5mVb0E1BuPR0y zD9+08R!WDCK7R!R*g+hFFSi*{X63H*li~^@0JK++;&L5)EMJVQpHQ68es1a(awZp*Xag?F`z=653_Mw0nYLG{ z&)uC^9Gqi0p~t5+&=a%1ySO467ZT1q9~qPb=pm9WG|yrn7eowrjXc?Y-;{o;p=XTi zc3@zjT@YZ?e$N<>9}{NPS!rsah3JIrPnZ9^|7uYEtR2x8RQxvD#QzD$*}h0*hJoTqC%|ijA)O<(w$LPMiP-NO;8n5kbev4l415@MH*hQ|=Ya1z|YjjJ02Ale9A}mgO zuUgDlzsj-Pg^~*myUcCJo<|xC9N#K6E&m4KjjEa-xoox|-G;rvmldcfNx8=S8Ep;Z z)p|`i^5a;d_#%8a!-vUl8Yf2l<}c<eEsr=xd^EqIR3j z>yjffrz258r&h`gGVv~j4gjp5HYOGTww5z8SM68K@@p52pqFH(1u=}G}dctBR| zv$O2NtJl1IV+=9t8Q-LQO;Ze*kq89cAk*37O7FFl;?v{CyN1sD7l2I4SgWvJe!oyy z2pu|E`;BVyOBQfjIGnEjJ&KiU3XedShGUEY!m`>$$K<>7Qi%moeCvpNg3qiXHoh6c zcbXM!y+8G_{;)vIP)9({we(q(;0i6s25ja)ZW#1);s=SlKf^7i~6NhHeHf5#;|HeV&^NH62ZQ zw8jC|0{8kSSK9mnO_1*Tn(yCMUlxb7mm3|sMQuLKHSY3F)`eD3GuzlKo&trM-0S+6 zNg`YzcV6m^e^h3gu=#p4y1Tj8jZCXlwW{O@f(ZRYyeF3^QP2YMn;dAg>Ufw-^X=bk z*^C1&*TxGi#A)u*649A)URV;dxM38o4Bn(V^!KWvUu*#jFhatMvURH=9|J(uD}e!u zYw%Fg<4ze(Nq!ur(c9+qw=PU)$3s&+4Zr4r7hpI;SZ{-hFF7hM4XO+O@_>kP{lHuf#)DKj5G z3=pq*M+vzr3*OqKst1Jr71&K%o78uLH&pA)D}gHtII-$U=UwMtoZq=T+bikbaPlij z?iCh-D}Tnc7Js@-4aIuaN?Nc8nm1y?L3jTv5w;IMi%pcm$3I-P5TElq3eDv-FnW98 z!O*pe2ub;WEW$~tZFBOE$r7#pTdgsv$0RY6LUWFSI5uxiU!{n4?eh|qg(73keydKOQ9gE`0}(_jg)NTj z-MDdj`|B|^bhMs5dj_)gT@l&?o9lVI_0oy{N?8qC(ih2tC%Ju51Rz-ax#Yo3N5wre zlHqis6{Jv`s3$m6i8R{ZE%&s&@F1G&Y-JSYy{?pFBf~h6f4F}DwAWz*R1%6Md$%n5 z2cT&Ocvj6D!fWZglY>b8%h?{k8*5iqxG)*qpl=GFX&~SD0|0rn^DebL{_as3N}qF# zZsnJ#?`S}(^9qAMpTdJBG(c_XtE+n<3J9>pFrb|(`2uaeJXwbdoxH6ddYC0usEBF+ zFB}n%ziI5WV-suanviV9Q5AesB>`%fhlh2VUN14s21?|y!$se)iOK5x+V|WgN;*!I z|4x0qqRR%ra21U~*RL7f2+iBf#El7}5iSua_c6@A-J%{Dz){jUzbG>`wsCHyNJp=x9!Y$1#CAJz^k05aGki+s{OU zBcnkZIDLJo^nfnB^LBpG7ibT+568#)9kdEFz2TD=%}wD|c=JZq(6wS=wS=&~jo-)CBNotoJXI{ax39dmn=BD*5OrdT{fTHm4g<^Mq|3 zJA-oW_0mQqI(l25OBaR`{=ENROnc-j(qi0O7B_yGf7gpyYm7Ax&7zO$xhQ^lb1jP1K;>z6XiqyY@8dF zpRAZ080VddY(#%PAuuD8aOI!@3_k8J|#kM?>JIrI528S-d! zMNKz!D!a;M#ptzOb@}VTrpoa{TP~XqKHJs2q)!hJDb+!d`a$(n^(k6G?P}v9LDeRO zD%s<09#}!2FWNXGfj+nIS`T+5#1xc6Uh_kBJ7na-ai{L99ff1usC2l;z-Y;Gg-}te z{%h%3B32)-SCu2AXw&xAl{ysv6LcT-=HFauZZZEeHf0qr(f{phCa94K1(BV4G8*fA zHk3Y$s?fGN=2D12voQDyWbbc|3k6l@_mv97U?{^M%)|E{uVU`^-Izy$L9d`eDr=gY zfLpvGuh&qbyMAt&a0TmOjYv7DI{3yzxwEbYB&vKNuK`0`{rN#L|DJVQ*c-TTt5&Z_ zmHi%n?P$hTK9&a|k|!oj>2ljdrct@*4u?GG*M~c!l)Ww zN4-;&f?n|wKGtZFX{z5;t+EeEBkm=UhZH=nUFT80`u7>Qfm?B|!5hKIezHzTVI=p! z7Q1<_H(eYItlD|nEiw$ug@AFfVQeQM1C;%1GFPFh*}&~AvRliL_q-PVNc%6h9wi0E zkXL-Dp(1@^opP;Yvob#1@b1)XHczAy_zIN$CdJ%)2~x!4e9((A*ZBqJKeqVaG(2%4%qus)q$4V+8FJnimY~1Zca=Eb zvUrwa0tA|jYVWZ``ZnT$+tYB&A$JwdvIX!%&_?4Q(&_Lz?Rdh%L&wy zG}%z+qp!o$)4DIF`_y+~4p-8rHKy>|bFMTjsZ=YghH~)ZvEG=#x(3MIn$hNU^A)t% zXkd?}tIc&U-_j|m>S z>#JDzSNWPHnRYe4`QR_oNZ-1ocfh|9XtuWdqY}OAqBIR7oUqf!M|Aqr>~aF1d{lLr z4xQs0^oi>IG*JH9v)PIYsZ)BGCA;zE%tmYrkKJ`@nK_{+*RIYN&Z^WvGA>g{cYh)!%{MjERJL}aV`>b z0DNH@e|JAT0I~;KfV*D`hu+Oc^s?zYJ3_kTVdl<_1YfYv;*q+3v6Dro@Q3#3&LtPl zgQ34*#Gddq+x}Uy9pd5Ca}WXq8AjX zqUq`4Nr?|_6K2W%jI)PEC!CX6DY3psWIH~*L$@%01u5vuY(o+bUrl}{#&AQnMlD74 z-U7*d3{)YeQ6EkHTY)|EA?@mQ?XT5mjqJpVLW}->gnS z{Y*5zuW!^s;n)T3YRlpY6KF+BEa}1SL$$av;>PAl;@{92vJ2LIWqL5D{(i2;rAxqm zqS(xC&;YB3{9jf>kbed?@pbD(V1IZUoc_)=rkzdyHs8}$zFEj;&kN?XQ(RH!(e z7awNN#V%a)6TM{w2mA@N_N3>x z+X8QrG0`-w#dtW4mQlY(Uqg#&%vhRd)OdF9Y500@s1*>86^w83K44U~zaAmfVH3sNU>XQA zJgZxy{Y{F_s(OhVA`*>|WW`fEpQVOjPD;-mk|?m#R2`VXVea-ssmIF|F{kM7n`H9S z!U2bFhkXx0d2}O^gQu!Nl{IITF>&_Z%O>8KHT1T8#tbUD~ z4{_V%w<(WjY0GHr9n_sxD*~~mERW?nJ*6In=N_a&KPAzAWO2M|@9;A_6R!%m#*Y{D zZTuiiabP6ElaTF#5oBAOeT@{oLaDZQIkI3W&i3{~L$=}U#}mKn_6DUxUD#{8d{2Oq z?GZpJHHrHN_Wt&L7>w$#XjU-IXfE=4c9-diS20~+GIOqnxt%o^)a^7-wU*AdH}?vX z((wuXRD$ii!*Cvu(u8Sp5JaUIg7+bQd^O1_;Xljy)stYM{;Vj68l^D(4Je8=y$%fR z^{Qrm!G}!9v<)(g<5NdVzGSh;2#P(#wD+!pxlg05a6``^6PbTJa8=V8T^%MY1khlT z8BqPskVUW%w|=LmWY#{qM70jQ6Ocaw^vjR5vohd=V~z>{%Hv*Nfl__@uXIn|8o)vW zOD=^QHD{XMll{bN@WMmMI`$P5&dweEWu4DVnUR>t+ayOxK8q8wa>NU+uB$&VMTWNNG zdW)rK@MqPw(h?}%(wZq%0pvW`{t;bPp4=kcb& zKqbV8(d_Kk<}Nd}PBLP&x6%B&8_X+Fz5}m&rf}Z_?a0CY4n>@i{k?ymuZ^{2s&GEh z2mT**blp`;`wLWg=oDUPr*zPN+(>}zV5|drs~%8Nx`N7feVc7czm1R^@MpV^PJdXf z!fh*z)uxKS8tt;k^_w$9T5h%|gy4?5%|(bVWdqU;j=4vVE!^T#TiuggD#dVZZz6jO zI7(RNIZepdndY@~?@fuXE}PC?cV+U~o>AMcQzxGIt#V#=TOu^8OYwJ0i zLXd0lgZabW2SB55^cJZU+iuWE@H@Ekd7J&8S<>Ya==f6d%sYTjBJSYH1tJ;ehH(InL}M~C4%zwAKE-4mcnV2JYS17a@b^`t6OxecoQw~`Z~YHJ2^fekN3}WI z0{S5jhe2o!fA+i~_019jzSNU=gKPi{$1KX>o4QI^!RWi1_?UBbS&Tzby$!}=kN|M= z9YzNHIW*k740 zmRFbbfj&lxt6}+~?o$B`Dd7O3MSl;ZwKq@Q+uVEj_0#%1?)${^ zFzD)+uJ-i0(#=iepkZ`>$vJn)CS5q@E^z;YSRswl`QNrT0XW{weEh+VEQpAYTy&b7 z+>_dPX6uj|=Fp-LERJ>Mc2$;^O}NSuweKADY#=Ig9Ni{s!SXn-QeXZNFq?#7@Wnt@ z<6#8dq6>EcKU!~O zHDs>8-GvKfN|L_rR{uWMX^hWYN*{h^zAgP}xv&#^dVbchA~JR@WB6ODZ>{F4P+MKK z)x8;6;QQd*xGwIp)z*xy^+hI~&ML7*_C{BfT?WDf6wxP(q(ex&2(j%*vT3W#KYkOz z%uIMB56I9kjVoK}+;808{%n)KdK*2h-}Q*U(Y50$1ZJ-MT*te`OHE^vubigk@$TS} z)(~dyOL#1yp@Mq$W}2Y}+{P;X!|xUy?hC_sbphsvRJ9LHr25h$H*8ft{%{^X{5Zw! zIgX+!S%6EUbRK&8!Yl-AIavM=1-MO-F_5G{_998!QbcmT zDmvOkK;`xTdE6LpMB4t188fU*dL|)LiV|1*>rc@u|1B-|cg&f5EAGjJfT7?|=5478 zDrvoDW`Fe~z9V13x!tdU_Hsm{8z)`j(8@iL2W-po(SZEnYS}Sj@Sw{UrjV)6MP$CW zb%!XGqPCrv*L26WqJ5OIF&EFd5y&?(|xamFkrhV7})V9Q;qkn8^N%nEVQKbS*JFe1;v zMR>V@r{3MxqUiyWP$LM3H(G#G$(>A*Ru(LHabRv{X?jXeqUbstv!WO?uy>c5F1$iTQiE&~#U37xb@*~;PWCO2f@K`2 z=Z4c9=NTa8K9W=dhFvd03XfAmER=@5#R3kO0YTLaF?*{=L}h9S=M)=5SpN;@dJbjf z>2JrzU~@zm#{U(=)qBwuPbh0;gG3h6x6M@EPJg>_;l32us{QYs9!c)E+1L#a>9+jb z`lT%ip$XoR3wAKY>Jg8d)O#m7QKb*y^9?J31klG>e!BB(9F0>NVxp&jy-;2cD$}Ka ztby=y-naX4zqe2P*Wd#SAN$jTelxeB!xc#T(h{95j%1VkLr8kIB-i0iX66y!+YJvZ zT_K zpX16_Wyo3N(|p?o*V8 zPIl7GPG`?(*-noCZ&Lzmh>*B`GqacGbZ#mea4EY`u;hb{N`HBkF}hIPEm~-Wzx9qM zoI>w8)O$>$fKj}sb;}3qyGO|&e?4h>ZD@f4ticG7@ZFA``-egX@X~4RNxQ6N%T`Uk zyO~ld5*!d16VwG#i#=Ir@oO(ujoq>-^w$TLPeqYwZJ>sjRZ!pgI_6AKtAEnk@IsU$ zC2q|5ix==h<+nh7Y9zp2SIki=nC&kOhO0~^M${4o=L-I@U+nLK#b5sJA6y0``0L5X zX19C9_UO4<4le3eR>X)<1$aCqeHrFlsYpnYdvG^Y@{KDnmp8NEV=5vfb|C`q%-n4p zc7liQz9%sF>X%BT%m$7Zkn#WmnHpugeLS$kCO;>xq=w)~B@y_&PV5dXt?;2Q6K0FO zC2^g2BEm8Jb!OP9p2x9I$LdzxgF7jmLY7TFlE>dbQsQvGclO1EtA&W$hjyEd)sZi3 zbPf1OYA#Y;B5eoq^Rrbe2U==&zsBH>bO11DgZ{ENF{8|B@Kf{ndg%Jfw2;swTL1z* zuzotbJa21^_1+@$#);=)7wc{d+@tcQ@naeR%XEB*iz@ruHC8WclLo-KDK|qzSyF}R z_KHaF7)LKc9A91c83feNMS^zu=P`eQwru0;awie_cqQS92AmnvN}acKd#CYlFM^J> z?HN;Ub+kdx8j}EubA^(n#H#^yK%}|lj&Y22Z_n>;Mp&0WTK@Id*x4e7IY#=v_wsi^ zQZBL3<|cwn7#%a`erRxuJs;Ow*a5B;U`hN?Y;Ty{Rt@mbUo5QX4 z3nqqw>?F$s;De+ocP8s!+z#CzZn6OYr~RDRzZhNnWW$~C&Y`_CI&_)j^}~VnSQ5Xf zS8a`?e$V#4-{#$U8Abn`sCLNUBh6A}iW=uBUZ0hMs2TjS%REGEzamugilzY%6eRO5 zyEk@3IfX9zZUP)kBhpwzkEBNI77<1R^ZPZHOqFzvR*8zph}qmag%JHiKBui}U-k{p zQo9krYH{6F*gnerG%(`Gcdy_@a}1-)#|Xx;*LfZPmd_gX;ef!^6k9Hn>e**sJAz0mMi=EfC@ z5E)Sp#KN@weKLyh*9jm*F-B(vCzVkC-hA!tnKHhU%lgGG5qH>dC5^o#|93_9JGB%0 zC)-q{*6Oabj|vGHC|_F(bU^9NDV)$7JpdABcDKg)(Bd>z&~UM#+Q|waEE^de9P#@J zz(jhaj#z>9Q7+!-`IweYmQkccJ`e>IbwN!JUf&X@2mHwUef~y00NBtp7-mHXiKv{! z6ZCYEDMekL5K4Wt2x32XwbkcI&~;Jz#tH&#b=ti)t2weFQe1bJQv-H(XtvL>U-|tp ziE3L-g+Cy7zhvFMkXuR`SlcMk1;01J?Q-F|@;ReLbDKQBSjf5){iW<}aROWE)HmcPBMvU3wD0BWDhpo9u3 zLji(88xRcK21YYSl+!ydD#=BCGLfKLv7Y4(pO}=7Vv?RU@8A6K>(rrVp%&pIc^-I| zKoI#4TM8erj|3-6I?=w4h&YpKcDqI}E-tedkOlyfWc&9TRCv9_D50sXNDFX?Iej0f z;%)c&1fuVJT}u!%EV&jlcGxCv<8|N&5H2=9ipj6}JyM&3^=~2-j%)s@+1drk$FzSy zt&Mh)3(%Y3_Z8X@w#_*2y`Awox_CL(nZ$YcrWG+HTtl@Km&pZ*%$1Og-KW2ps{2wh z<=mGb>Bf;zv+wt5QN*jj=b3q`ZLAK~M+HWjfZ2VTBbjUPQ^GyW{rr&=sc5Uo`ITvR zks$7#6~ICIf%PTO9(5SmrE4r`NT+xo=ud#8{o#7q&1=)_hDvUV30X<3Fd=DeBp)Hn>9|CWym3h07B z1yLDT{OeYY600&0Vy=R#;?Ca+mhGWneercdcS$;p^_8b9^R|dUdr&r6=?WkHHx}l9 zkeC}JYV6%fFq6t3uwyipNc=h^< z0e-WXrg=}kUhkYKsZQ;S{p4oI(FFKB@EXlxAxdf4y_*mR1U^tWYU(lB;g05%!;ey- zk-ILUX6hw&)-+XXE_&`e3?JO5KE0I0uF=8Im6Sq0{27A7ZDcH;ZKiFKg<8{anpEB; zNg&1iQKqDWEgWaPM8BQE)!WrFBnogTAh$KLKIE+TI?NK*qbKdhtwRnM7LO{P*7Z*_ zt(wocqp~~P`}!VAo~+UJ>(A|dhZ0EZK>lBQXZ{aWANFw+m9+(xUAPM)5=tUVLXv%_ zqC~c28ATjzx>JlLrbyYcj&CL^-W=kR1Q5G4K zG-p!2f@bMlk!QcO6Z_u0)6w;Eqet#h`n8!5Zw;}zGv#)%KHsm|yt`jq>OB?x>W?qu zQ)R0n2)XxpxLddQ@V2FvAGETf-R-Y}r#X+~AupBZdy^~$(6_2E4vAU)pbsjB_bFAg z!1nn}+2kMSx|;7zeapcr`|MYW&Pc3UHB%a@9Am%znb`q!Q~7BuRMVq}q)b3Gp3ysZ zT=!bF^zPbH` zB8qtnl*a$e<0Y-K1ea}6*>Jl(1YtN$T7+n!^=lf@2$3w;*Ktftdk)tC=z*&u44M*b ziz^G;&%W&y@%bVC5}shbxv~M`N^r$bddK7_Ln*@gfgj^jM1{RT&Ht3jqVGDS2h^Jf zrZtK%`7!M_YPQY-+bTnlL->w<;)f|1oxv88Uu^_uIF(#ESO9cR5GKpLT*oiEO3TWH}5 zToXx_GnX=i5q()8jm11aX`PL||JQFH@mQ$L%N6$@3(wnIxsZ>keK*H)RlLBJHt$_| zWPjjzdW*;cY0XT3LH~m7I3(I?t&TPd_O;7A&b{jt7Lno5mZ(>OR$qSF!1ie6*cMrGRzYEvGRSs)w=mGKb$%@&4M@Kp_*OK)YuWs>sNYmfO0dP*wq07 z00Ep*b|;q$W8R%Rf=GyzG#$ZzjRQSc8N-{2t5fah2*MNoK3kS)j-=%d~264d@^Kq^~YCZ&52xh zCnE5tQV1e3DOB*a1rYT%lr!=@O~hx#GTrF5^NICh(72(s`gmLRTT{W@;<=$Bu`UMSo6H4w zwU*81#?_*$c})CyO9J+bs_j2+%jakJFv>cz+jyndx8$dtZh`%3iITvdRhP0zGXfK@Tkag8{CpsUoaSw{$VzH(TP!{(bya<|NO6@p)$|!qmK-;FQh$-n$=;EP zlb+7zn!r3PqCd|g3!f5@OqE*% zsRIPN!K@xH`;~3X*^ZOqT028K=l*Ql50y(`udvSL9h;!!`8SwhB&QZT$q7?js4jrq zp_cEvV~9&Z59ZafiI+n@vkd4r@$&Rq1$vHbph|r(>e(_lkpzK)mp=N#Tt?W!kmSXK z%#$gB)x!~kSQH~|KH!@};pVIPxexY=u+V6~I?G^cedpY`bQ?}#LOUu(*&;Z+~Xn$!wj=L4+sO=@bS!=1@q%lj!N?ygjMh-97|P4qu&rq|Dh> zaHSwQ)eb4+>HiTnPo9);#-Ucz1zx@yKPA_ocgJd4_YwAlji5dPkSziaD}Q4~vmoEU zW!22A#mdqd#B-)OZX0eh6Ob1L?Z=I8rt#ENe(p+tGh|wu?iXcU9_`D!q#I_u!5sNE z^O0u@UP#ONr_AaRuf^zev!X8+$ZjprA6+T&d^k%idiHEc(|~GFn-&DUeLuc-i-~nx z3>xceIwWfga)i~`7$(-FQkV6j*S38-&PH?GeVQSpOa1s<$2YFdNHNe$lagj9DiNB* z7syljA>jKZ* zYC!pq`rl*V_7!N%Yd@Rfl76<14#1mXOjZJeLbX|>`N5nQ=Wi5la^LMp%7jR-{)C-+ z5?z0+g9h4sD8sY%!dnA5SyM6`Eiql>FvfU~2g`)1O-!Oaxu+t&go;WLr|Y^gPLJRn z`>nKqkPeLBSF9d86O0z(SyILyd3u_JxqU9GSJ-$7e?=QJ{$N#oyHS0-#_roc`8nSN z$9nPN3nesjk~nd0Db-9UoI3ixVzy+Nq5fNyCb}T49~|CHFO7)yT7{lTR*!G!7&Q zc{hFZ<4qcS9UP5RSgt5MY?TR#WkrIqW+T2l1)t&c$MC$3KTkmwv~c5zJCkn&)PVi> zyW!}fn4M<#_SDqRxmJR)&!zJkt;&hA#XChQT~fW6fK*<1m?8aN`o|6^}2k=7;0Fe9Cf_K+<6U z`LZlWdyP<)MCiA4)}T+hE{5?VKvB+fV&r)#2m#L1j6<pZbkh460lo#G-4LvO5kTVccpt4e{GX;2^Zk1`nk5*~G#V4{_b*!71YHT% zlk43sf{C~B(qla~OcUl~?L)e+(O{%(mU|C_z>D+NX68S>{*cxJuc1<)SP0fBi3!Qp z$63mm0pNCj+d=%V%$;mVYDdLNsPbeNaP>fhhPiA@e}+b{p<>Kix@;3y=+XJ{h-^)e zwvyU^TIDYP&ry>91mq~`ILxxhS|jAU!>@G5FA zsT7Xtu;7ao-}_}`)=vh%oR{60$##%4a+u+KPj8DhR3S8RYxW7QC#Si)nYSBfd+YUT z5qNs~4V*rIP!lZTcj%7kjqF2um*~~3?d|uZ zmCMHYCuT+74`JOo9eAUFqxgHF?-@#Rc}@>zPtS4mj2a`EmA_4Um8tqxo)TiEv2pSR zgf2!M0+dMlD{fE?==%0cgSExv00PD<8nfMba87Ei?#h-(2HxS_Z zR6P2_ibJ+FD(6Jl7iv~Sv1M<@G2?0d3jB2V!ElfEU-jQcsSY!%eXM!5;sdfroc(>W z7+Cle78)N@sMjnSd3E}pBSv6m-kzJ)hUAQl2>HG-xunHg8sB|RKGvl2_JlNK8ATl~ z-2CYMpL2@O@*jx)ydso@vkpJ$=7kvt7+)Usug9el%_W!&nSACp2MB808ynn+cP<(?u%R zcR1~HveQ{_5KrF7!=ov-ejk>X-m}e;Q``(gFTl_4Bd3je7QhatRngp;hRe}jQhoaQ zKV5^b4?VBNw>roCHBc1GyDaaH_BhYGzL*&$HTtx;+4)wJ0*WPAAu{;_sH;B zFi%1TNH-xT&Pg7Xdroypa&ap%ocpcyM%%vqHMYKm;&nRPG2E%3FQ+so7uuuDr95?g zYzyXjL17GajCQcN8V(#Wwk-(H-oXZ{8g-|@NL!zn5mVmWja_Mm`Ek~!bM!ar>LUiT z8nR5-7-%7MWlPC0D9o{d)cPWeJu&6`3S^F(G#f8daqpemlHcB+D_?3sh$9DU&2)}A zU^Bqa;ok%lAcBcRj5>gF4B584g}rZ1HirWUJt&`LtEp77=t8ku;P3ujiCo$qKl6Ok zv@?AT5-Sj+SpO0AqbEdJqHS+;>$Po98uoX*vcwDEdk-K>cr4fLkb(klBhxOY_Xm zF)7sk*h_3CPs#lKK3I-P{v*xLLiN_Ww8UGLzB0h@Fkh8=p~=!D>HTD6uA?Opu0`D4 z8-T5&MU!sSLu00swYiXRU6O z#-G`c`qAQPz$}+YV|JS71C$vOK0dr(h^n#_38k-CEV-*>TM#1QLm$1e^h-Fpk52E} z!1ECY2b&mTkNPW9oR-m6_X29tAD1gUp25_&mETXu)@@ z1NX+M?@#lzEufhS24Vne(QS4XumUPhYFAmsGY9WZrtN0NSTa`W+$q-wsC2V4{=?0^Y=(TX zl8bWcosE~Ik>#Q_hH_oZUiFn%{yk#k#`SQIMvccAv0q_=sPiS7B^k}Gy{5d6^T?~? zZMP1A>P!8Z5kXY8vvK!7`yoLXADhj>gM2>@=Vf;Lm0!Eh9lp(6-t&>CM!f=dVV16YHDe-(e%n9!ZJu{+Uy z^sT~BiUcVzl;jE_ZvS_)F={#PSbQw&PIh#EvC{ANC);_&=O_lZ)s;bSfKVrUYmw?0Lqz5`EPw38cM6*EmR9sb0TeHdyc ze6}Ur)0qSRAa*AY`Y$FLKPf!FApGkVp85_g=Kt67f3;r*3wLtw_uITqX5N}P?p#Ou zf)sJPiB^LB{9!thBx-BC&FVhhkStmvpO6O&W47Nq044b=HO?y;gv7EF`7o>p@T-dZ h*@-gZUd-$dsA?tL-$u0k8H#ow4b{u%GnB7A{2!={Vvzs< From e5a7a9abd346bae0e3c093934c755f84442b54d9 Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:48:06 +0100 Subject: [PATCH 10/12] Use sorted `np.unique` instead of unsorted `set` to ensure deterministic ordering --- .../pytests/test_eprop_bsshslm_2020_plasticity.py | 10 +++++----- testsuite/pytests/test_eprop_plasticity.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py b/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py index 2ace4a26fc..b06132a447 100644 --- a/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py +++ b/testsuite/pytests/test_eprop_bsshslm_2020_plasticity.py @@ -342,8 +342,8 @@ def generate_superimposed_sines(steps_sequence, periods): target_signal = events_mm_out["target_signal"] senders = events_mm_out["senders"] - readout_signal = np.array([readout_signal[senders == i] for i in set(senders)]) - target_signal = np.array([target_signal[senders == i] for i in set(senders)]) + readout_signal = np.array([readout_signal[senders == i] for i in np.unique(senders)]) + target_signal = np.array([target_signal[senders == i] for i in np.unique(senders)]) readout_signal = readout_signal.reshape((n_out, n_iter, batch_size, steps["sequence"])) target_signal = target_signal.reshape((n_out, n_iter, batch_size, steps["sequence"])) @@ -784,8 +784,8 @@ def generate_evidence_accumulation_input_output(batch_size, n_in, steps, input): target_signal = events_mm_out["target_signal"] senders = events_mm_out["senders"] - readout_signal = np.array([readout_signal[senders == i] for i in set(senders)]) - target_signal = np.array([target_signal[senders == i] for i in set(senders)]) + readout_signal = np.array([readout_signal[senders == i] for i in np.unique(senders)]) + target_signal = np.array([target_signal[senders == i] for i in np.unique(senders)]) readout_signal = readout_signal.reshape((n_out, n_iter, batch_size, steps["sequence"])) target_signal = target_signal.reshape((n_out, n_iter, batch_size, steps["sequence"])) @@ -925,6 +925,6 @@ def test_eprop_history_cleaning(neuron_model, eprop_history_duration_reference): eprop_history_duration = events_mm_rec["eprop_history_duration"] senders = events_mm_rec["senders"] - eprop_history_duration = np.array([eprop_history_duration[senders == i] for i in set(senders)])[0] + eprop_history_duration = np.array([eprop_history_duration[senders == i] for i in np.unique(senders)])[0] assert np.allclose(eprop_history_duration, eprop_history_duration_reference, rtol=1e-8) diff --git a/testsuite/pytests/test_eprop_plasticity.py b/testsuite/pytests/test_eprop_plasticity.py index 25dedc5fac..20a3ac16c2 100644 --- a/testsuite/pytests/test_eprop_plasticity.py +++ b/testsuite/pytests/test_eprop_plasticity.py @@ -412,8 +412,8 @@ def generate_superimposed_sines(steps_sequence, periods): target_signal = events_mm_out["target_signal"] senders = events_mm_out["senders"] - readout_signal = np.array([readout_signal[senders == i] for i in set(senders)]) - target_signal = np.array([target_signal[senders == i] for i in set(senders)]) + readout_signal = np.array([readout_signal[senders == i] for i in np.unique(senders)]) + target_signal = np.array([target_signal[senders == i] for i in np.unique(senders)]) readout_signal = readout_signal.reshape((n_out, n_iter, group_size, steps["sequence"])) target_signal = target_signal.reshape((n_out, n_iter, group_size, steps["sequence"])) From 78682ebba22a2126620b593e3e328cfae8baedc4 Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:48:21 +0100 Subject: [PATCH 11/12] Update reference --- models/eprop_iaf.h | 9 +++++---- models/eprop_iaf_adapt.h | 9 +++++---- models/eprop_iaf_adapt_bsshslm_2020.h | 7 ++++--- models/eprop_iaf_bsshslm_2020.h | 7 ++++--- models/eprop_iaf_psc_delta.h | 9 +++++---- models/eprop_iaf_psc_delta_adapt.h | 9 +++++---- models/eprop_learning_signal_connection.h | 9 +++++---- .../eprop_learning_signal_connection_bsshslm_2020.h | 7 ++++--- models/eprop_readout.h | 9 +++++---- models/eprop_readout_bsshslm_2020.h | 7 ++++--- models/eprop_synapse.h | 13 +++++++------ models/eprop_synapse_bsshslm_2020.h | 7 ++++--- nestkernel/eprop_archiving_node.h | 4 ++-- nestkernel/node.h | 4 ++-- pynest/examples/eprop_plasticity/README.rst | 7 ++++--- ...sification_evidence-accumulation_bsshslm_2020.py | 7 ++++--- ..._supervised_classification_neuromorphic_mnist.py | 7 ++++--- ...upervised_regression_handwriting_bsshslm_2020.py | 7 ++++--- ...supervised_regression_lemniscate_bsshslm_2020.py | 7 ++++--- .../eprop_supervised_regression_sine-waves.py | 7 ++++--- ...supervised_regression_sine-waves_bsshslm_2020.py | 7 ++++--- 21 files changed, 89 insertions(+), 70 deletions(-) diff --git a/models/eprop_iaf.h b/models/eprop_iaf.h index 6a7aa0e149..c2e8ab0b29 100644 --- a/models/eprop_iaf.h +++ b/models/eprop_iaf.h @@ -302,9 +302,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 .. start_surrogate-gradient-references @@ -354,7 +355,7 @@ void register_eprop_iaf( const std::string& name ); * * Class implementing a current-based leaky integrate-and-fire neuron model with delta-shaped postsynaptic currents for * e-prop plasticity according to Bellec et al. (2020) with additional biological features described in - * Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * Korcsak-Gorzo et al. (2025). */ class eprop_iaf : public EpropArchivingNodeRecurrent< false > { diff --git a/models/eprop_iaf_adapt.h b/models/eprop_iaf_adapt.h index 3799cbf3bc..7514e18cd0 100644 --- a/models/eprop_iaf_adapt.h +++ b/models/eprop_iaf_adapt.h @@ -287,9 +287,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 .. include:: ../models/eprop_iaf.rst :start-after: .. start_surrogate-gradient-references @@ -322,7 +323,7 @@ void register_eprop_iaf_adapt( const std::string& name ); * * Class implementing a current-based leaky integrate-and-fire neuron model with delta-shaped postsynaptic currents and * threshold adaptation for e-prop plasticity according to Bellec et al. (2020) with additional biological features - * described in Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * described in Korcsak-Gorzo et al. (2025). */ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > { diff --git a/models/eprop_iaf_adapt_bsshslm_2020.h b/models/eprop_iaf_adapt_bsshslm_2020.h index 3426bf082c..1651ee7c36 100644 --- a/models/eprop_iaf_adapt_bsshslm_2020.h +++ b/models/eprop_iaf_adapt_bsshslm_2020.h @@ -258,9 +258,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 .. include:: ../models/eprop_iaf.rst :start-after: .. start_surrogate-gradient-references diff --git a/models/eprop_iaf_bsshslm_2020.h b/models/eprop_iaf_bsshslm_2020.h index 2abad4464e..94a508003c 100644 --- a/models/eprop_iaf_bsshslm_2020.h +++ b/models/eprop_iaf_bsshslm_2020.h @@ -242,9 +242,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 .. include:: ../models/eprop_iaf.rst :start-after: .. start_surrogate-gradient-references diff --git a/models/eprop_iaf_psc_delta.h b/models/eprop_iaf_psc_delta.h index 04738a7841..cb77a04a5e 100644 --- a/models/eprop_iaf_psc_delta.h +++ b/models/eprop_iaf_psc_delta.h @@ -308,9 +308,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 .. [3] Neftci EO, Mostafa H, Zenke F (2019). Surrogate Gradient Learning in Spiking Neural Networks. IEEE Signal Processing Magazine, 36(6), 51-63. @@ -366,7 +367,7 @@ void register_eprop_iaf_psc_delta( const std::string& name ); * * Class implementing a current-based leaky integrate-and-fire neuron model with delta-shaped postsynaptic currents for * e-prop plasticity according to Bellec et al. (2020) with additional biological features described in - * Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * Korcsak-Gorzo et al. (2025). */ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > { diff --git a/models/eprop_iaf_psc_delta_adapt.h b/models/eprop_iaf_psc_delta_adapt.h index 77110ddb48..f6e36b8ae4 100644 --- a/models/eprop_iaf_psc_delta_adapt.h +++ b/models/eprop_iaf_psc_delta_adapt.h @@ -323,9 +323,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 .. [3] Neftci EO, Mostafa H, Zenke F (2019). Surrogate Gradient Learning in Spiking Neural Networks. IEEE Signal Processing Magazine, 36(6), 51-63. @@ -382,7 +383,7 @@ void register_eprop_iaf_psc_delta_adapt( const std::string& name ); * * Class implementing a current-based leaky integrate-and-fire neuron model with delta-shaped postsynaptic currents * and spike threshold adaptation for e-prop plasticity according to Bellec et al. (2020) with additional biological - * features described in Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * features described in Korcsak-Gorzo et al. (2025). */ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > { diff --git a/models/eprop_learning_signal_connection.h b/models/eprop_learning_signal_connection.h index c40b27a296..df100d975c 100644 --- a/models/eprop_learning_signal_connection.h +++ b/models/eprop_learning_signal_connection.h @@ -106,9 +106,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 See also ++++++++ @@ -127,7 +128,7 @@ void register_eprop_learning_signal_connection( const std::string& name ); * * Class implementing a synapse model transmitting secondary feedback learning signals for e-prop plasticity * according to Bellec et al. (2020) with additional biological features described in - * Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * Korcsak-Gorzo et al. (2025). */ template < typename targetidentifierT > class eprop_learning_signal_connection : public Connection< targetidentifierT > diff --git a/models/eprop_learning_signal_connection_bsshslm_2020.h b/models/eprop_learning_signal_connection_bsshslm_2020.h index cf829a46db..6820d7a564 100644 --- a/models/eprop_learning_signal_connection_bsshslm_2020.h +++ b/models/eprop_learning_signal_connection_bsshslm_2020.h @@ -110,9 +110,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 See also ++++++++ diff --git a/models/eprop_readout.h b/models/eprop_readout.h index e3e0492156..71efba439e 100644 --- a/models/eprop_readout.h +++ b/models/eprop_readout.h @@ -222,9 +222,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 Sends +++++ @@ -253,7 +254,7 @@ void register_eprop_readout( const std::string& name ); * * Class implementing a current-based leaky integrate readout neuron model with delta-shaped postsynaptic currents for * e-prop plasticity according to Bellec et al. (2020) with additional biological features described in - * Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * Korcsak-Gorzo et al. (2025). */ class eprop_readout : public EpropArchivingNodeReadout< false > { diff --git a/models/eprop_readout_bsshslm_2020.h b/models/eprop_readout_bsshslm_2020.h index 36ae6e7134..ad0df13564 100644 --- a/models/eprop_readout_bsshslm_2020.h +++ b/models/eprop_readout_bsshslm_2020.h @@ -217,9 +217,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 Sends +++++ diff --git a/models/eprop_synapse.h b/models/eprop_synapse.h index b109ecc02b..f21bc865e0 100644 --- a/models/eprop_synapse.h +++ b/models/eprop_synapse.h @@ -137,9 +137,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 See also ++++++++ @@ -155,8 +156,8 @@ EndUserDocs */ * @brief Base class implementing common properties for e-prop synapses with additional biological features. * * Base class implementing common properties for the e-prop synapse model according to Bellec et al. (2020) with - * additional biological features described in Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. - * (in preparation). + * additional biological features described in Korcsak-Gorzo et al. (2025). + * * This class in particular manages a pointer to weight-optimizer common properties to support * exchanging the weight optimizer at runtime. Setting the weight-optimizer common properties @@ -202,7 +203,7 @@ void register_eprop_synapse( const std::string& name ); * @brief Class implementing a synapse model for e-prop plasticity with additional biological features. * * Class implementing a synapse model for e-prop plasticity according to Bellec et al. (2020) with - * additional biological features described in Korcsak-Gorzo, Stapmanns, and Espinoza Valverde et al. (in preparation). + * additional biological features described in Korcsak-Gorzo et al. (2025). * * @note Each synapse has an optimizer_ object managed through a `WeightOptimizer*`, pointing to an object of * a specific weight optimizer type. This optimizer, drawing also on parameters in the `WeightOptimizerCommonProperties` diff --git a/models/eprop_synapse_bsshslm_2020.h b/models/eprop_synapse_bsshslm_2020.h index e02fc8055f..e38c8b4fcc 100644 --- a/models/eprop_synapse_bsshslm_2020.h +++ b/models/eprop_synapse_bsshslm_2020.h @@ -151,9 +151,10 @@ References networks of spiking neurons. Nature Communications, 11:3625. https://doi.org/10.1038/s41467-020-17236-y -.. [2] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [2] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 See also ++++++++ diff --git a/nestkernel/eprop_archiving_node.h b/nestkernel/eprop_archiving_node.h index bbac6fbb34..0b4d6dda68 100644 --- a/nestkernel/eprop_archiving_node.h +++ b/nestkernel/eprop_archiving_node.h @@ -38,8 +38,8 @@ namespace nest * @brief Base class implementing archiving for node models supporting e-prop plasticity. * * Base class implementing an intermediate archiving node model for node models supporting e-prop plasticity - * according to Bellec et al. (2020) and supporting additional biological features described in Korcsak-Gorzo, - * Stapmanns, and Espinoza Valverde et al. (in preparation). + * according to Bellec et al. (2020) and supporting additional biological features described in + * Korcsak-Gorzo et al. (2025). * * A node which archives the history of dynamic variables, the firing rate * regularization, and update times needed to calculate the weight updates for diff --git a/nestkernel/node.h b/nestkernel/node.h index 825869e3b9..b5ad0e0a20 100644 --- a/nestkernel/node.h +++ b/nestkernel/node.h @@ -848,8 +848,8 @@ class Node * Compute gradient change for eprop synapses. * * This method is called from an eprop synapse on the eprop target neuron. It updates various parameters related to - * e-prop plasticity according to Bellec et al. (2020) with additional biological features described in Korcsak-Gorzo, - * Stapmanns, and Espinoza Valverde et al. (in preparation). + * e-prop plasticity according to Bellec et al. (2020) with additional biological features described in + * Korcsak-Gorzo et al. (2025). * * @param t_spike [in] Time of the current spike. * @param t_spike_previous [in] Time of the previous spike. diff --git a/pynest/examples/eprop_plasticity/README.rst b/pynest/examples/eprop_plasticity/README.rst index 9bfae72eb4..f9e532ea23 100644 --- a/pynest/examples/eprop_plasticity/README.rst +++ b/pynest/examples/eprop_plasticity/README.rst @@ -41,6 +41,7 @@ References .. [2] https://github.com/IGITUGraz/eligibility_propagation/blob/master/Figure_3_and_S7_e_prop_tutorials/ -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py index d0b9cc454c..f7e60b253d 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_classification_evidence-accumulation_bsshslm_2020.py @@ -68,9 +68,10 @@ .. [2] https://github.com/IGITUGraz/eligibility_propagation/blob/master/Figure_3_and_S7_e_prop_tutorials/tutorial_evidence_accumulation_with_alif.py -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 """ # pylint: disable=line-too-long # noqa: E501 diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py b/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py index 30a6c16c52..c9f8997466 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_classification_neuromorphic_mnist.py @@ -64,9 +64,10 @@ .. [2] Orchard, G., Jayawant, A., Cohen, G. K., & Thakor, N. (2015). Converting static image datasets to spiking neuromorphic datasets using saccades. Frontiers in neuroscience, 9, 159859. -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 """ # pylint: disable=line-too-long # noqa: E501 diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py index 4d854eb339..d648c2540e 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_handwriting_bsshslm_2020.py @@ -75,9 +75,10 @@ .. [2] https://github.com/IGITUGraz/eligibility_propagation/blob/master/Figure_3_and_S7_e_prop_tutorials/tutorial_pattern_generation.py -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 """ # pylint: disable=line-too-long # noqa: E501 diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py index 53668561be..16e69ba4c0 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_lemniscate_bsshslm_2020.py @@ -65,9 +65,10 @@ .. [2] https://github.com/IGITUGraz/eligibility_propagation/blob/master/Figure_3_and_S7_e_prop_tutorials/tutorial_pattern_generation.py -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 """ # pylint: disable=line-too-long # noqa: E501 diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py index 0e0235fdbf..e37a320a8f 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves.py @@ -63,9 +63,10 @@ .. [2] https://github.com/IGITUGraz/eligibility_propagation/blob/master/Figure_3_and_S7_e_prop_tutorials/tutorial_pattern_generation.py -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 """ # pylint: disable=line-too-long # noqa: E501 diff --git a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py index cf667efc93..3b014f0bdd 100644 --- a/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py +++ b/pynest/examples/eprop_plasticity/eprop_supervised_regression_sine-waves_bsshslm_2020.py @@ -62,9 +62,10 @@ .. [2] https://github.com/IGITUGraz/eligibility_propagation/blob/master/Figure_3_and_S7_e_prop_tutorials/tutorial_pattern_generation.py -.. [3] Korcsak-Gorzo A, Stapmanns J, Espinoza Valverde JA, Plesser HE, - Dahmen D, Bolten M, Van Albada SJ, Diesmann M. Event-based - implementation of eligibility propagation (in preparation) +.. [3] Korcsak-Gorzo A, Espinoza Valverde JA, Stapmanns J, Plesser HE, Dahmen D, + Bolten M, van Albada SJ, Diesmann M (2025). Event-driven eligibility + propagation in large sparse networks: efficiency shaped by biological + realism. arXiv:2511.21674. https://doi.org/10.48550/arXiv.2511.21674 """ # pylint: disable=line-too-long # noqa: E501 From b8abd239d58c937eff2cbb0c359fb00d0c128c64 Mon Sep 17 00:00:00 2001 From: Agnes Korcsak-Gorzo <40828647+akorgor@users.noreply.github.com> Date: Fri, 9 Jan 2026 15:55:26 +0100 Subject: [PATCH 12/12] Implement ignore-and-fire neuron models --- models/eprop_iaf.cpp | 74 ++++++++++++++++++++----- models/eprop_iaf.h | 27 +++++++++ models/eprop_iaf_adapt.cpp | 74 ++++++++++++++++++++----- models/eprop_iaf_adapt.h | 27 +++++++++ models/eprop_iaf_adapt_bsshslm_2020.cpp | 73 ++++++++++++++++++++---- models/eprop_iaf_adapt_bsshslm_2020.h | 27 +++++++++ models/eprop_iaf_bsshslm_2020.cpp | 73 ++++++++++++++++++++---- models/eprop_iaf_bsshslm_2020.h | 27 +++++++++ models/eprop_iaf_psc_delta.cpp | 73 ++++++++++++++++++++---- models/eprop_iaf_psc_delta.h | 27 +++++++++ models/eprop_iaf_psc_delta_adapt.cpp | 73 ++++++++++++++++++++---- models/eprop_iaf_psc_delta_adapt.h | 27 +++++++++ models/iaf_psc_delta.cpp | 61 +++++++++++++++++--- models/iaf_psc_delta.h | 26 +++++++++ modelsets/eprop | 1 + nestkernel/nest_names.cpp | 1 + nestkernel/nest_names.h | 1 + 17 files changed, 610 insertions(+), 82 deletions(-) diff --git a/models/eprop_iaf.cpp b/models/eprop_iaf.cpp index a1ecbafe55..83f1843e58 100644 --- a/models/eprop_iaf.cpp +++ b/models/eprop_iaf.cpp @@ -86,6 +86,9 @@ eprop_iaf::Parameters_::Parameters_() , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) , activation_interval_( 3000.0 ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -133,6 +136,9 @@ eprop_iaf::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); def< double >( d, names::activation_interval, activation_interval_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -171,6 +177,9 @@ eprop_iaf::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); if ( C_m_ <= 0 ) { @@ -222,6 +231,16 @@ eprop_iaf::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); } + + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } return delta_EL; } @@ -250,6 +269,10 @@ eprop_iaf::eprop_iaf() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } eprop_iaf::eprop_iaf( const eprop_iaf& n ) @@ -258,6 +281,10 @@ eprop_iaf::eprop_iaf( const eprop_iaf& n ) , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -315,22 +342,43 @@ eprop_iaf::update( Time const& origin, const long from, const long to ) S_.surrogate_gradient_ = ( this->*compute_surrogate_gradient_ )( S_.r_, S_.v_m_, P_.V_th_, P_.beta_, P_.gamma_ ); - if ( S_.v_m_ >= P_.V_th_ and S_.r_ == 0 ) + if ( P_.ignore_and_fire_ ) { - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); - - S_.z_ = 1.0; - S_.v_m_ -= P_.V_th_ * S_.z_; - S_.r_ = V_.RefractoryCounts_; - set_last_event_time( t ); + if ( V_.firing_phase_steps_ == 0 ) + { + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + S_.v_m_ -= P_.V_th_ * S_.z_; + S_.r_ = V_.RefractoryCounts_; + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; + set_last_event_time( t ); + } + else + { + --V_.firing_phase_steps_; + } } - else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + else { - SpikeEvent se; - se.set_activation(); - kernel().event_delivery_manager.send( *this, se, lag ); - set_last_event_time( t ); + if ( S_.v_m_ >= P_.V_th_ and S_.r_ == 0 ) + { + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + S_.v_m_ -= P_.V_th_ * S_.z_; + S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); + } } append_new_eprop_history_entry( t ); diff --git a/models/eprop_iaf.h b/models/eprop_iaf.h index c2e8ab0b29..756b5c7c55 100644 --- a/models/eprop_iaf.h +++ b/models/eprop_iaf.h @@ -467,6 +467,15 @@ class eprop_iaf : public EpropArchivingNodeRecurrent< false > //! Interval between two activations. long activation_interval_; + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + //! Default constructor. Parameters_(); @@ -533,6 +542,12 @@ class eprop_iaf : public EpropArchivingNodeRecurrent< false > //! Structure of internal variables. struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; + //! Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user documentation). double P_v_m_; @@ -586,6 +601,13 @@ class eprop_iaf : public EpropArchivingNodeRecurrent< false > //! Map storing a static set of recordables. static RecordablesMap< eprop_iaf > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; inline long @@ -679,6 +701,11 @@ eprop_iaf::set_status( const DictionaryDatum& d ) P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace nest diff --git a/models/eprop_iaf_adapt.cpp b/models/eprop_iaf_adapt.cpp index 5f7ccc4897..af7e9c3283 100644 --- a/models/eprop_iaf_adapt.cpp +++ b/models/eprop_iaf_adapt.cpp @@ -90,6 +90,9 @@ eprop_iaf_adapt::Parameters_::Parameters_() , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) , activation_interval_( 3000.0 ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -141,6 +144,9 @@ eprop_iaf_adapt::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); def< double >( d, names::activation_interval, activation_interval_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -181,6 +187,9 @@ eprop_iaf_adapt::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); if ( adapt_beta_ < 0 ) { @@ -242,6 +251,16 @@ eprop_iaf_adapt::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); } + + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } return delta_EL; } @@ -284,6 +303,10 @@ eprop_iaf_adapt::eprop_iaf_adapt() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } eprop_iaf_adapt::eprop_iaf_adapt( const eprop_iaf_adapt& n ) @@ -292,6 +315,10 @@ eprop_iaf_adapt::eprop_iaf_adapt( const eprop_iaf_adapt& n ) , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -354,22 +381,43 @@ eprop_iaf_adapt::update( Time const& origin, const long from, const long to ) S_.surrogate_gradient_ = ( this->*compute_surrogate_gradient_ )( S_.r_, S_.v_m_, S_.v_th_adapt_, P_.beta_, P_.gamma_ ); - if ( S_.v_m_ >= S_.v_th_adapt_ and S_.r_ == 0 ) + if ( P_.ignore_and_fire_ ) { - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); - - S_.z_ = 1.0; - S_.v_m_ -= P_.V_th_ * S_.z_; - S_.r_ = V_.RefractoryCounts_; - set_last_event_time( t ); + if ( V_.firing_phase_steps_ == 0 ) + { + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + S_.v_m_ -= P_.V_th_ * S_.z_; + S_.r_ = V_.RefractoryCounts_; + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; + set_last_event_time( t ); + } + else + { + --V_.firing_phase_steps_; + } } - else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + else { - SpikeEvent se; - se.set_activation(); - kernel().event_delivery_manager.send( *this, se, lag ); - set_last_event_time( t ); + if ( S_.v_m_ >= S_.v_th_adapt_ and S_.r_ == 0 ) + { + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + S_.v_m_ -= P_.V_th_ * S_.z_; + S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); + } } append_new_eprop_history_entry( t ); diff --git a/models/eprop_iaf_adapt.h b/models/eprop_iaf_adapt.h index 7514e18cd0..27297465b2 100644 --- a/models/eprop_iaf_adapt.h +++ b/models/eprop_iaf_adapt.h @@ -441,6 +441,15 @@ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > //! Interval between two activations. long activation_interval_; + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + //! Default constructor. Parameters_(); @@ -513,6 +522,12 @@ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > //! Structure of internal variables. struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; + //! Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user documentation). double P_v_m_; @@ -583,6 +598,13 @@ class eprop_iaf_adapt : public EpropArchivingNodeRecurrent< false > //! Map storing a static set of recordables. static RecordablesMap< eprop_iaf_adapt > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; inline long @@ -676,6 +698,11 @@ eprop_iaf_adapt::set_status( const DictionaryDatum& d ) P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace nest diff --git a/models/eprop_iaf_adapt_bsshslm_2020.cpp b/models/eprop_iaf_adapt_bsshslm_2020.cpp index 95d68c06e5..d948b78e49 100644 --- a/models/eprop_iaf_adapt_bsshslm_2020.cpp +++ b/models/eprop_iaf_adapt_bsshslm_2020.cpp @@ -88,6 +88,9 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::Parameters_() , V_min_( -std::numeric_limits< double >::max() ) , V_th_( -55.0 - E_L_ ) , activation_interval_( 3 * kernel().simulation_manager.get_eprop_update_interval().get_ms() ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -137,6 +140,9 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::V_min, V_min_ + E_L_ ); def< double >( d, names::V_th, V_th_ + E_L_ ); def< double >( d, names::activation_interval, activation_interval_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -165,6 +171,9 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* updateValueParam< double >( d, names::I_e, I_e_, node ); updateValueParam< bool >( d, names::regular_spike_arrival, regular_spike_arrival_, node ); updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); if ( updateValueParam< std::string >( d, names::surrogate_gradient_function, surrogate_gradient_function_, node ) ) { @@ -230,6 +239,16 @@ eprop_iaf_adapt_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* "interval." ); } return delta_EL; + + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } } void @@ -271,6 +290,10 @@ eprop_iaf_adapt_bsshslm_2020::eprop_iaf_adapt_bsshslm_2020() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } eprop_iaf_adapt_bsshslm_2020::eprop_iaf_adapt_bsshslm_2020( const eprop_iaf_adapt_bsshslm_2020& n ) @@ -279,6 +302,10 @@ eprop_iaf_adapt_bsshslm_2020::eprop_iaf_adapt_bsshslm_2020( const eprop_iaf_adap , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -361,23 +388,45 @@ eprop_iaf_adapt_bsshslm_2020::update( Time const& origin, const long from, const S_.surrogate_gradient_ = ( this->*compute_surrogate_gradient_ )( S_.r_, S_.v_m_, S_.v_th_adapt_, P_.beta_, P_.gamma_ ); - if ( S_.v_m_ >= S_.v_th_adapt_ and S_.r_ == 0 ) + if ( P_.ignore_and_fire_ ) { - count_spike(); + if ( V_.firing_phase_steps_ == 0 ) + { + count_spike(); - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); - S_.z_ = 1.0; - S_.r_ = V_.RefractoryCounts_; - set_last_event_time( t ); + S_.z_ = 1.0; + S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; + } + else + { + --V_.firing_phase_steps_; + } } - else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + else { - SpikeEvent se; - se.set_activation(); - kernel().event_delivery_manager.send( *this, se, lag ); - set_last_event_time( t ); + if ( S_.v_m_ >= S_.v_th_adapt_ and S_.r_ == 0 ) + { + count_spike(); + + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); + } } append_new_eprop_history_entry( t ); diff --git a/models/eprop_iaf_adapt_bsshslm_2020.h b/models/eprop_iaf_adapt_bsshslm_2020.h index 1651ee7c36..7916227040 100644 --- a/models/eprop_iaf_adapt_bsshslm_2020.h +++ b/models/eprop_iaf_adapt_bsshslm_2020.h @@ -392,6 +392,15 @@ class eprop_iaf_adapt_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Interval between two activations. long activation_interval_; + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + //! Default constructor. Parameters_(); @@ -464,6 +473,12 @@ class eprop_iaf_adapt_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Structure of internal variables. struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; + //! Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user documentation). double P_v_m_; @@ -535,6 +550,13 @@ class eprop_iaf_adapt_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Map storing a static set of recordables. static RecordablesMap< eprop_iaf_adapt_bsshslm_2020 > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; inline long @@ -622,6 +644,11 @@ eprop_iaf_adapt_bsshslm_2020::set_status( const DictionaryDatum& d ) P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace nest diff --git a/models/eprop_iaf_bsshslm_2020.cpp b/models/eprop_iaf_bsshslm_2020.cpp index 5959194f54..efa56fcadc 100644 --- a/models/eprop_iaf_bsshslm_2020.cpp +++ b/models/eprop_iaf_bsshslm_2020.cpp @@ -84,6 +84,9 @@ eprop_iaf_bsshslm_2020::Parameters_::Parameters_() , V_min_( -std::numeric_limits< double >::max() ) , V_th_( -55.0 - E_L_ ) , activation_interval_( 3 * kernel().simulation_manager.get_eprop_update_interval().get_ms() ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -129,6 +132,9 @@ eprop_iaf_bsshslm_2020::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::V_min, V_min_ + E_L_ ); def< double >( d, names::V_th, V_th_ + E_L_ ); def< double >( d, names::activation_interval, activation_interval_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -155,6 +161,9 @@ eprop_iaf_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::I_e, I_e_, node ); updateValueParam< bool >( d, names::regular_spike_arrival, regular_spike_arrival_, node ); updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); if ( updateValueParam< std::string >( d, names::surrogate_gradient_function, surrogate_gradient_function_, node ) ) { @@ -209,6 +218,16 @@ eprop_iaf_bsshslm_2020::Parameters_::set( const DictionaryDatum& d, Node* node ) "Interval between activations activation_interval required to be an integer multiple of the e-prop update " "interval." ); } + + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } return delta_EL; } @@ -237,6 +256,10 @@ eprop_iaf_bsshslm_2020::eprop_iaf_bsshslm_2020() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } eprop_iaf_bsshslm_2020::eprop_iaf_bsshslm_2020( const eprop_iaf_bsshslm_2020& n ) @@ -245,6 +268,10 @@ eprop_iaf_bsshslm_2020::eprop_iaf_bsshslm_2020( const eprop_iaf_bsshslm_2020& n , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -321,23 +348,45 @@ eprop_iaf_bsshslm_2020::update( Time const& origin, const long from, const long S_.surrogate_gradient_ = ( this->*compute_surrogate_gradient_ )( S_.r_, S_.v_m_, P_.V_th_, P_.beta_, P_.gamma_ ); - if ( S_.v_m_ >= P_.V_th_ and S_.r_ == 0 ) + if ( P_.ignore_and_fire_ ) { - count_spike(); + if ( V_.firing_phase_steps_ == 0 ) + { + count_spike(); - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); - S_.z_ = 1.0; - S_.r_ = V_.RefractoryCounts_; - set_last_event_time( t ); + S_.z_ = 1.0; + S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; + } + else + { + --V_.firing_phase_steps_; + } } - else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + else { - SpikeEvent se; - se.set_activation(); - kernel().event_delivery_manager.send( *this, se, lag ); - set_last_event_time( t ); + if ( S_.v_m_ >= P_.V_th_ and S_.r_ == 0 ) + { + count_spike(); + + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + S_.r_ = V_.RefractoryCounts_; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); + } } append_new_eprop_history_entry( t ); diff --git a/models/eprop_iaf_bsshslm_2020.h b/models/eprop_iaf_bsshslm_2020.h index 94a508003c..04ae3eb61c 100644 --- a/models/eprop_iaf_bsshslm_2020.h +++ b/models/eprop_iaf_bsshslm_2020.h @@ -370,6 +370,15 @@ class eprop_iaf_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Interval between two activations. long activation_interval_; + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + //! Default constructor. Parameters_(); @@ -436,6 +445,12 @@ class eprop_iaf_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Structure of internal variables. struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; + //! Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user documentation). double P_v_m_; @@ -490,6 +505,13 @@ class eprop_iaf_bsshslm_2020 : public EpropArchivingNodeRecurrent< true > //! Map storing a static set of recordables. static RecordablesMap< eprop_iaf_bsshslm_2020 > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; inline long @@ -577,6 +599,11 @@ eprop_iaf_bsshslm_2020::set_status( const DictionaryDatum& d ) P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace nest diff --git a/models/eprop_iaf_psc_delta.cpp b/models/eprop_iaf_psc_delta.cpp index b87f64f90e..76f690da80 100644 --- a/models/eprop_iaf_psc_delta.cpp +++ b/models/eprop_iaf_psc_delta.cpp @@ -88,6 +88,9 @@ eprop_iaf_psc_delta::Parameters_::Parameters_() , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) , activation_interval_( 3000.0 ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -136,6 +139,9 @@ eprop_iaf_psc_delta::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); def< double >( d, names::activation_interval, activation_interval_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -177,6 +183,9 @@ eprop_iaf_psc_delta::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); if ( V_th_ < V_min_ ) { @@ -238,6 +247,16 @@ eprop_iaf_psc_delta::Parameters_::set( const DictionaryDatum& d, Node* node ) throw BadProperty( "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); } + + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } return delta_EL; } @@ -266,6 +285,10 @@ eprop_iaf_psc_delta::eprop_iaf_psc_delta() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } eprop_iaf_psc_delta::eprop_iaf_psc_delta( const eprop_iaf_psc_delta& n ) @@ -274,6 +297,10 @@ eprop_iaf_psc_delta::eprop_iaf_psc_delta( const eprop_iaf_psc_delta& n ) , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -347,23 +374,45 @@ eprop_iaf_psc_delta::update( Time const& origin, const long from, const long to S_.surrogate_gradient_ = ( this->*compute_surrogate_gradient_ )( S_.r_, S_.v_m_, P_.V_th_, P_.beta_, P_.gamma_ ); - if ( S_.v_m_ >= P_.V_th_ ) + if ( P_.ignore_and_fire_ ) { - S_.r_ = V_.RefractoryCounts_; - S_.v_m_ = P_.V_reset_; + if ( V_.firing_phase_steps_ == 0 ) + { + S_.r_ = V_.RefractoryCounts_; + S_.v_m_ = P_.V_reset_; + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); - z = 1.0; - set_last_event_time( t ); + z = 1.0; + set_last_event_time( t ); + } + else + { + --V_.firing_phase_steps_; + } } - else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + else { - SpikeEvent se; - se.set_activation(); - kernel().event_delivery_manager.send( *this, se, lag ); - set_last_event_time( t ); + if ( S_.v_m_ >= P_.V_th_ ) + { + S_.r_ = V_.RefractoryCounts_; + S_.v_m_ = P_.V_reset_; + + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + z = 1.0; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); + } } append_new_eprop_history_entry( t ); diff --git a/models/eprop_iaf_psc_delta.h b/models/eprop_iaf_psc_delta.h index cb77a04a5e..0380d0fe6f 100644 --- a/models/eprop_iaf_psc_delta.h +++ b/models/eprop_iaf_psc_delta.h @@ -485,6 +485,15 @@ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > //! Interval between two activations. long activation_interval_; + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + //! Default constructor. Parameters_(); @@ -548,6 +557,12 @@ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > //! Structure of internal variables. struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; + //! Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user documentation). double P_v_m_; @@ -601,6 +616,13 @@ class eprop_iaf_psc_delta : public EpropArchivingNodeRecurrent< false > //! Map storing a static set of recordables. static RecordablesMap< eprop_iaf_psc_delta > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; inline long @@ -694,6 +716,11 @@ eprop_iaf_psc_delta::set_status( const DictionaryDatum& d ) P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace nest diff --git a/models/eprop_iaf_psc_delta_adapt.cpp b/models/eprop_iaf_psc_delta_adapt.cpp index 8df2e13fbe..1d71049948 100644 --- a/models/eprop_iaf_psc_delta_adapt.cpp +++ b/models/eprop_iaf_psc_delta_adapt.cpp @@ -92,6 +92,9 @@ eprop_iaf_psc_delta_adapt::Parameters_::Parameters_() , kappa_reg_( 0.97 ) , eprop_isi_trace_cutoff_( 1000.0 ) , activation_interval_( 3000.0 ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -145,6 +148,9 @@ eprop_iaf_psc_delta_adapt::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::kappa_reg, kappa_reg_ ); def< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_ ); def< double >( d, names::activation_interval, activation_interval_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -187,6 +193,9 @@ eprop_iaf_psc_delta_adapt::Parameters_::set( const DictionaryDatum& d, Node* nod updateValueParam< double >( d, names::kappa_reg, kappa_reg_, node ); updateValueParam< double >( d, names::eprop_isi_trace_cutoff, eprop_isi_trace_cutoff_, node ); updateValueParam< double >( d, names::activation_interval, activation_interval_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); if ( V_th_ < V_min_ ) { @@ -258,6 +267,16 @@ eprop_iaf_psc_delta_adapt::Parameters_::set( const DictionaryDatum& d, Node* nod throw BadProperty( "Computation cutoff of eprop trace 0 ≤ eprop trace eprop_isi_trace_cutoff ≤ activation_interval required." ); } + + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } return delta_EL; } @@ -300,6 +319,10 @@ eprop_iaf_psc_delta_adapt::eprop_iaf_psc_delta_adapt() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } eprop_iaf_psc_delta_adapt::eprop_iaf_psc_delta_adapt( const eprop_iaf_psc_delta_adapt& n ) @@ -308,6 +331,10 @@ eprop_iaf_psc_delta_adapt::eprop_iaf_psc_delta_adapt( const eprop_iaf_psc_delta_ , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -386,23 +413,45 @@ eprop_iaf_psc_delta_adapt::update( Time const& origin, const long from, const lo S_.surrogate_gradient_ = ( this->*compute_surrogate_gradient_ )( S_.r_, S_.v_m_, S_.v_th_adapt_, P_.beta_, P_.gamma_ ); - if ( S_.v_m_ >= S_.v_th_adapt_ ) + if ( P_.ignore_and_fire_ ) { - S_.r_ = V_.RefractoryCounts_; - S_.v_m_ = P_.V_reset_; + if ( V_.firing_phase_steps_ == 0 ) + { + S_.r_ = V_.RefractoryCounts_; + S_.v_m_ = P_.V_reset_; + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); - S_.z_ = 1.0; - set_last_event_time( t ); + S_.z_ = 1.0; + set_last_event_time( t ); + } + else + { + --V_.firing_phase_steps_; + } } - else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + else { - SpikeEvent se; - se.set_activation(); - kernel().event_delivery_manager.send( *this, se, lag ); - set_last_event_time( t ); + if ( S_.v_m_ >= S_.v_th_adapt_ ) + { + S_.r_ = V_.RefractoryCounts_; + S_.v_m_ = P_.V_reset_; + + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + + S_.z_ = 1.0; + set_last_event_time( t ); + } + else if ( get_last_event_time() > 0 and t - get_last_event_time() >= V_.activation_interval_steps_ ) + { + SpikeEvent se; + se.set_activation(); + kernel().event_delivery_manager.send( *this, se, lag ); + set_last_event_time( t ); + } } append_new_eprop_history_entry( t ); diff --git a/models/eprop_iaf_psc_delta_adapt.h b/models/eprop_iaf_psc_delta_adapt.h index f6e36b8ae4..c4baa34b7d 100644 --- a/models/eprop_iaf_psc_delta_adapt.h +++ b/models/eprop_iaf_psc_delta_adapt.h @@ -507,6 +507,15 @@ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > //! Interval between two activations. long activation_interval_; + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + //! Default constructor. Parameters_(); @@ -579,6 +588,12 @@ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > //! Structure of internal variables. struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; + //! Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user documentation). double P_v_m_; @@ -649,6 +664,13 @@ class eprop_iaf_psc_delta_adapt : public EpropArchivingNodeRecurrent< false > //! Map storing a static set of recordables. static RecordablesMap< eprop_iaf_psc_delta_adapt > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; inline long @@ -742,6 +764,11 @@ eprop_iaf_psc_delta_adapt::set_status( const DictionaryDatum& d ) P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace nest diff --git a/models/iaf_psc_delta.cpp b/models/iaf_psc_delta.cpp index 4de329ed60..a17e8ff79f 100644 --- a/models/iaf_psc_delta.cpp +++ b/models/iaf_psc_delta.cpp @@ -79,6 +79,9 @@ nest::iaf_psc_delta::Parameters_::Parameters_() , V_min_( -std::numeric_limits< double >::max() ) // relative E_L_-55.0-E_L_ , V_reset_( -70.0 - E_L_ ) // mV, rel to E_L_ , with_refr_input_( false ) + , ignore_and_fire_( false ) + , firing_phase_( 1.0 ) + , firing_rate_( 10.0 ) { } @@ -106,6 +109,9 @@ nest::iaf_psc_delta::Parameters_::get( DictionaryDatum& d ) const def< double >( d, names::tau_m, tau_m_ ); def< double >( d, names::t_ref, t_ref_ ); def< bool >( d, names::refractory_input, with_refr_input_ ); + def< bool >( d, names::ignore_and_fire, ignore_and_fire_ ); + def< double >( d, names::phase, firing_phase_ ); + def< double >( d, names::rate, firing_rate_ ); } double @@ -167,6 +173,17 @@ nest::iaf_psc_delta::Parameters_::set( const DictionaryDatum& d, Node* node ) updateValueParam< bool >( d, names::refractory_input, with_refr_input_, node ); + updateValueParam< bool >( d, names::ignore_and_fire, ignore_and_fire_, node ); + updateValueParam< double >( d, names::phase, firing_phase_, node ); + updateValueParam< double >( d, names::rate, firing_rate_, node ); + if ( firing_phase_ <= -1.0 or firing_phase_ > 1.0 ) + { + throw BadProperty( "Firing phase must be > -1 and <= 1." ); + } + if ( firing_rate_ <= -1.0 ) + { + throw BadProperty( "Firing rate must be > -1." ); + } return delta_EL; } @@ -210,6 +227,10 @@ nest::iaf_psc_delta::iaf_psc_delta() , B_( *this ) { recordablesMap_.create(); + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } nest::iaf_psc_delta::iaf_psc_delta( const iaf_psc_delta& n ) @@ -218,6 +239,10 @@ nest::iaf_psc_delta::iaf_psc_delta( const iaf_psc_delta& n ) , S_( n.S_ ) , B_( n.B_, *this ) { + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } /* ---------------------------------------------------------------- @@ -310,17 +335,37 @@ nest::iaf_psc_delta::update( Time const& origin, const long from, const long to --S_.r_; } - // threshold crossing - if ( S_.y3_ >= P_.V_th_ ) + if ( P_.ignore_and_fire_ ) + { + if ( V_.firing_phase_steps_ == 0 ) + { + S_.r_ = V_.RefractoryCounts_; + S_.y3_ = P_.V_reset_; + V_.firing_phase_steps_ = V_.firing_interval_steps_ - 1; + + set_spiketime( Time::step( origin.get_steps() + lag + 1 ) ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + } + else + { + --V_.firing_phase_steps_; + } + } + else { - S_.r_ = V_.RefractoryCounts_; - S_.y3_ = P_.V_reset_; + // threshold crossing + if ( S_.y3_ >= P_.V_th_ ) + { + S_.r_ = V_.RefractoryCounts_; + S_.y3_ = P_.V_reset_; - // EX: must compute spike time - set_spiketime( Time::step( origin.get_steps() + lag + 1 ) ); + // EX: must compute spike time + set_spiketime( Time::step( origin.get_steps() + lag + 1 ) ); - SpikeEvent se; - kernel().event_delivery_manager.send( *this, se, lag ); + SpikeEvent se; + kernel().event_delivery_manager.send( *this, se, lag ); + } } // set new input current diff --git a/models/iaf_psc_delta.h b/models/iaf_psc_delta.h index fde397dc15..0b4c15e886 100644 --- a/models/iaf_psc_delta.h +++ b/models/iaf_psc_delta.h @@ -276,6 +276,15 @@ class iaf_psc_delta : public ArchivingNode bool with_refr_input_; //!< spikes arriving during refractory period are //!< counted + //! If True, the neuron is an ignore-and-fire neuron. + bool ignore_and_fire_; + + //! Time offset of the first forced spike within each second (ms). + double firing_phase_; + + //! Rate for forced firing mode (spikes/s). + double firing_rate_; + Parameters_(); //!< Sets default parameter values void get( DictionaryDatum& ) const; //!< Store current values in dictionary @@ -341,6 +350,11 @@ class iaf_psc_delta : public ArchivingNode */ struct Variables_ { + //! Current state counter holding the remaining steps until the next forced spike. + long firing_phase_steps_; + + //! Number of simulation steps between two consecutive forced spikes. + long firing_interval_steps_; double P30_; double P33_; @@ -373,6 +387,13 @@ class iaf_psc_delta : public ArchivingNode //! Mapping of recordables names to access functions static RecordablesMap< iaf_psc_delta > recordablesMap_; + + inline void + calc_initial_variables_() + { + V_.firing_interval_steps_ = Time( Time::ms( 1. / P_.firing_rate_ * 1000. ) ).get_steps(); + V_.firing_phase_steps_ = Time( Time::ms( P_.firing_phase_ / P_.firing_rate_ * 1000. ) ).get_steps(); + } }; @@ -440,6 +461,11 @@ iaf_psc_delta::set_status( const DictionaryDatum& d ) // if we get here, temporaries contain consistent set of properties P_ = ptmp; S_ = stmp; + + if ( P_.ignore_and_fire_ ) + { + calc_initial_variables_(); + } } } // namespace diff --git a/modelsets/eprop b/modelsets/eprop index 6825e1d7d4..670ac3b697 100644 --- a/modelsets/eprop +++ b/modelsets/eprop @@ -10,6 +10,7 @@ step_rate_generator rate_connection_delayed static_synapse +iaf_psc_delta eprop_input_neuron eprop_iaf_bsshslm_2020 diff --git a/nestkernel/nest_names.cpp b/nestkernel/nest_names.cpp index 22ede20823..fa87844945 100644 --- a/nestkernel/nest_names.cpp +++ b/nestkernel/nest_names.cpp @@ -270,6 +270,7 @@ const Name Inact_h( "Inact_h" ); const Name Inact_p( "Inact_p" ); const Name IP3( "IP3" ); const Name IP3_0( "IP3_0" ); +const Name ignore_and_fire( "ignore_and_fire" ); const Name indegree( "indegree" ); const Name index_map( "index_map" ); const Name individual_spike_trains( "individual_spike_trains" ); diff --git a/nestkernel/nest_names.h b/nestkernel/nest_names.h index 6b704e35fc..99fd821781 100644 --- a/nestkernel/nest_names.h +++ b/nestkernel/nest_names.h @@ -298,6 +298,7 @@ extern const Name Inact_h; extern const Name Inact_p; extern const Name IP3; extern const Name IP3_0; +extern const Name ignore_and_fire; extern const Name indegree; extern const Name index_map; extern const Name individual_spike_trains;