23#ifndef UNIVERSAL_DATA_LOGGER_IMPL_H
24#define UNIVERSAL_DATA_LOGGER_IMPL_H
37template <
typename HostNode >
38DynamicUniversalDataLogger< HostNode >::DynamicUniversalDataLogger( HostNode& host )
44template <
typename HostNode >
46DynamicUniversalDataLogger< HostNode >::reset()
48 for ( DLiter_ it = data_loggers_.begin(); it != data_loggers_.end(); ++it )
54template <
typename HostNode >
56DynamicUniversalDataLogger< HostNode >::init()
58 for ( DLiter_ it = data_loggers_.begin(); it != data_loggers_.end(); ++it )
64template <
typename HostNode >
66DynamicUniversalDataLogger< HostNode >::record_data(
long step )
68 for ( DLiter_ it = data_loggers_.begin(); it != data_loggers_.end(); ++it )
70 it->record_data( host_, step );
74template <
typename HostNode >
76DynamicUniversalDataLogger< HostNode >::handle(
const DataLoggingRequest& dlr )
78 const size_t rport = dlr.get_rport();
80 assert(
static_cast< size_t >( rport ) <= data_loggers_.size() );
81 data_loggers_[
rport - 1 ].handle( host_, dlr );
84template <
typename HostNode >
86DynamicUniversalDataLogger< HostNode >::DataLogger_::reset()
92template <
typename HostNode >
94DynamicUniversalDataLogger< HostNode >::DataLogger_::init()
103 if ( next_rec_step_ >=
kernel().simulation_manager.get_slice_origin().get_steps() )
113 rec_int_steps_ = recording_interval_.get_steps();
124 if ( recording_offset_.get_steps() != 0 )
126 next_rec_step_ = recording_offset_.get_steps() - 1;
129 next_rec_step_ += rec_int_steps_;
134 const long recs_per_slice =
static_cast< long >(
135 std::ceil(
kernel().connection_manager.get_min_delay() /
static_cast< double >( rec_int_steps_ ) ) );
137 data_.resize( 2, DataLoggingReply::Container( recs_per_slice, DataLoggingReply::Item( num_vars_ ) ) );
139 next_rec_.resize( 2 );
140 next_rec_[ 0 ] = next_rec_[ 1 ] = 0;
143template <
typename HostNode >
145DynamicUniversalDataLogger< HostNode >::DataLogger_::record_data(
const HostNode&,
long step )
147 if ( num_vars_ < 1 or step < next_rec_step_ )
154 assert( wt < next_rec_.size() );
155 assert( wt < data_.size() );
163 assert( next_rec_[ wt ] < data_[ wt ].size() );
165 DataLoggingReply::Item& dest = data_[ wt ][ next_rec_[ wt ] ];
168 dest.timestamp = Time::step( step + 1 );
171 for (
size_t j = 0; j < num_vars_; ++j )
173 dest.data[ j ] = ( *( node_access_[ j ] ) )();
176 next_rec_step_ += rec_int_steps_;
185template <
typename HostNode >
187DynamicUniversalDataLogger< HostNode >::DataLogger_::handle( HostNode& host,
const DataLoggingRequest& request )
196 assert( next_rec_.size() == 2 );
197 assert( data_.size() == 2 );
201 assert( not data_[ rt ].empty() );
206 if ( data_[ rt ][ 0 ].timestamp <=
kernel().simulation_manager.get_previous_slice_origin() )
217 if ( next_rec_[ rt ] < data_[ rt ].size() )
219 data_[ rt ][ next_rec_[ rt ] ].timestamp = Time::neg_inf();
223 DataLoggingReply reply( data_[ rt ] );
228 reply.set_sender( host );
229 reply.set_sender_node_id( host.get_node_id() );
230 reply.set_receiver( request.get_sender() );
231 reply.set_port( request.get_port() );
237template <
typename HostNode >
238UniversalDataLogger< HostNode >::UniversalDataLogger( HostNode& host )
244template <
typename HostNode >
246UniversalDataLogger< HostNode >::reset()
248 for ( DLiter_ it = data_loggers_.begin(); it != data_loggers_.end(); ++it )
254template <
typename HostNode >
256UniversalDataLogger< HostNode >::init()
258 for ( DLiter_ it = data_loggers_.begin(); it != data_loggers_.end(); ++it )
264template <
typename HostNode >
266UniversalDataLogger< HostNode >::record_data(
long step )
268 for ( DLiter_ it = data_loggers_.begin(); it != data_loggers_.end(); ++it )
270 it->record_data( host_, step );
274template <
typename HostNode >
276UniversalDataLogger< HostNode >::handle(
const DataLoggingRequest& dlr )
278 const size_t rport = dlr.get_rport();
279 assert( rport >= 1 );
280 assert(
static_cast< size_t >( rport ) <= data_loggers_.size() );
281 data_loggers_[
rport - 1 ].handle( host_, dlr );
284template <
typename HostNode >
286UniversalDataLogger< HostNode >::DataLogger_::reset()
292template <
typename HostNode >
294UniversalDataLogger< HostNode >::DataLogger_::init()
304 if ( next_rec_step_ >=
kernel().simulation_manager.get_slice_origin().get_steps() )
314 rec_int_steps_ = recording_interval_.get_steps();
325 if ( recording_offset_.get_steps() != 0 )
327 next_rec_step_ = recording_offset_.get_steps() - 1;
330 next_rec_step_ += rec_int_steps_;
335 const long recs_per_slice =
static_cast< long >(
336 std::ceil(
kernel().connection_manager.get_min_delay() /
static_cast< double >( rec_int_steps_ ) ) );
338 data_.resize( 2, DataLoggingReply::Container( recs_per_slice, DataLoggingReply::Item( num_vars_ ) ) );
340 next_rec_.resize( 2 );
341 next_rec_[ 0 ] = next_rec_[ 1 ] = 0;
344template <
typename HostNode >
346UniversalDataLogger< HostNode >::DataLogger_::record_data(
const HostNode& host,
long step )
348 if ( num_vars_ < 1 or step < next_rec_step_ )
355 assert( wt < next_rec_.size() );
356 assert( wt < data_.size() );
364 assert( next_rec_[ wt ] < data_[ wt ].size() );
366 DataLoggingReply::Item& dest = data_[ wt ][ next_rec_[ wt ] ];
369 dest.timestamp = Time::step( step + 1 );
372 for (
size_t j = 0; j < num_vars_; ++j )
374 dest.data[ j ] = ( ( host ).*( node_access_[ j ] ) )();
377 next_rec_step_ += rec_int_steps_;
386template <
typename HostNode >
388UniversalDataLogger< HostNode >::DataLogger_::handle( HostNode& host,
const DataLoggingRequest& request )
398 assert( next_rec_.size() == 2 );
399 assert( data_.size() == 2 );
403 assert( not data_[ rt ].empty() );
408 if ( data_[ rt ][ 0 ].timestamp <=
kernel().simulation_manager.get_previous_slice_origin() )
419 if ( next_rec_[ rt ] < data_[ rt ].size() )
421 data_[ rt ][ next_rec_[ rt ] ].timestamp = Time::neg_inf();
425 DataLoggingReply reply( data_[ rt ] );
430 reply.set_sender( host );
431 reply.set_sender_node_id( host.get_node_id() );
432 reply.set_receiver( request.get_sender() );
433 reply.set_port( request.get_port() );
size_t read_toggle() const
Return 1 - write_toggle().
Definition event_delivery_manager.h:520
void send_to_node(Event &e)
Send event e directly to its target node.
Definition event_delivery_manager.h:502
size_t write_toggle() const
Return 0 for even, 1 for odd time slices.
Definition event_delivery_manager_impl.h:173
Time const get_time() const
Precise time of simulation.
Definition simulation_manager.h:256
long get_steps() const
Definition nest_time.h:504
EventDeliveryManager event_delivery_manager
Definition kernel_manager.h:241
SimulationManager simulation_manager
Definition kernel_manager.h:237
const std::string rport("receptor")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
KernelManager & kernel()
Definition kernel_manager.h:311
Declarations for base class Node.