TimeSeries< FP > Class Template Reference

CPP API: mio::TimeSeries< FP > Class Template Reference

stores vectors of values at time points (or some other abstract variable) the value at each time point is a vector. More...

#include <time_series.h>

Public Types

using const_iterator = TimeSeriesValueIterator< FP, true >
 
using const_reverse_iterator = std::reverse_iterator< const_iterator >
 
using const_reverse_time_iterator = std::reverse_iterator< const_time_iterator >
 
using const_time_iterator = TimeSeriesTimeIterator< FP, true >
 
using difference_type = typename iterator::difference_type
 
using iterator = TimeSeriesValueIterator< FP, false >
 
using Matrix = Eigen::Matrix< FP, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >
 type that stores the data More...
 
using reference = typename iterator::reference
 
using reverse_iterator = std::reverse_iterator< iterator >
 
using reverse_time_iterator = std::reverse_iterator< time_iterator >
 
using size_type = Eigen::Index
 
using time_iterator = TimeSeriesTimeIterator< FP, false >
 
using value_type = typename iterator::value_type
 
using Vector = Eigen::Matrix< FP, Eigen::Dynamic, 1 >
 base type of expressions of vector values at a time point More...
 

Public Member Functions

Eigen::Ref< Vectoradd_time_point ()
 add one uninitialized time point More...
 
Eigen::Ref< Vectoradd_time_point (FP t)
 add one time point. More...
 
template<class Expr >
Eigen::Ref< Vectoradd_time_point (FP t, Expr &&expr)
 add one time point. More...
 
iterator begin ()
 
const_iterator begin () const
 
const_iterator cbegin () const
 
const_iterator cend () const
 
const_reverse_iterator crbegin () const
 
const_reverse_iterator crend () const
 
FP * data ()
 raw data storage. More...
 
const FP * data () const
 
iterator end ()
 
const_iterator end () const
 
IOResult< void > export_csv (const std::string &filename, const std::vector< std::string > &column_labels={}, char separator=',', int precision=6) const
 Exports a TimeSeries object into a CSV file. More...
 
Eigen::Index get_capacity () const
 current capacity More...
 
Range< const_reverse_time_iteratorget_const_reverse_times () const
 
Range< const_time_iteratorget_const_times () const
 
FP & get_last_time ()
 time of time point at index num_time_points - 1 More...
 
const FP & get_last_time () const
 
Eigen::Ref< Vectorget_last_value ()
 
Eigen::Ref< const Vectorget_last_value () const
 reference to value vector at time point (num_timepoints - 1) More...
 
Eigen::Index get_num_elements () const
 number of elements of vector at each time point More...
 
Eigen::Index get_num_rows () const
 number of rows in data storage (includes time) More...
 
Eigen::Index get_num_time_points () const
 number of time points in the series More...
 
Range< reverse_time_iteratorget_reverse_times ()
 
Range< const_reverse_time_iteratorget_reverse_times () const
 
FP & get_time (Eigen::Index i)
 time of time point at index i More...
 
const FP & get_time (Eigen::Index i) const
 
Range< time_iteratorget_times ()
 
Range< const_time_iteratorget_times () const
 
Eigen::Ref< Vectorget_value (Eigen::Index i)
 
Eigen::Ref< const Vectorget_value (Eigen::Index i) const
 reference to value vector at time point i More...
 
bool is_strictly_monotonic () const
 Check if the time is strictly monotonic increasing. More...
 
TimeSeriesoperator= (const TimeSeries &other)
 copy assignment More...
 
TimeSeriesoperator= (TimeSeries &&other)=default
 
Eigen::Ref< Vectoroperator[] (Eigen::Index i)
 
Eigen::Ref< const Vectoroperator[] (Eigen::Index i) const
 
reverse_iterator rbegin ()
 
const_reverse_iterator rbegin () const
 
void remove_last_time_point ()
 
void remove_time_point (Eigen::Index i)
 remove time point. More...
 
reverse_iterator rend ()
 
const_reverse_iterator rend () const
 
void reserve (Eigen::Index n)
 reserve capacity for n time points More...
 
template<class IOContext >
void serialize (IOContext &io) const
 
 TimeSeries (const TimeSeries &other)
 copy ctor More...
 
 TimeSeries (Eigen::Index num_elements)
 initialize empty TimeSeries. More...
 
template<typename Expr >
 TimeSeries (FP t, Expr &&expr)
 initialize TimeSeries with one time point. More...
 
 TimeSeries (std::vector< std::vector< FP >> table)
 Initialize a TimeSeries with a table. More...
 
 TimeSeries (TimeSeries &&other)=default
 move ctor and assignment More...
 
auto matrix ()
 Matrix expression that contains one time point per column. More...
 
auto matrix () const
 Matrix expression that contains one time point per column. More...
 
void print_table (std::ostream &out, const std::vector< std::string > &column_labels={}, size_t width=16, size_t precision=5, char separator=' ', const std::string header_prefix="\n") const
 Print out the TimeSeries as a table. More...
 
void print_table (const std::vector< std::string > &column_labels={}, size_t width=16, size_t precision=5, char separator=' ', const std::string header_prefix="\n") const
 Print out the TimeSeries as a table. More...
 

Static Public Member Functions

template<class IOContext >
static IOResult< TimeSeriesdeserialize (IOContext &io)
 
static TimeSeries zero (Eigen::Index num_time_points, Eigen::Index num_elements)
 constructs TimeSeries instance and initializes it with zeros More...
 

Private Member Functions

void add_time_point_noinit ()
 
auto get_valid_block ()
 currently occupied block of storage More...
 
auto get_valid_block () const
 

Private Attributes

Matrix m_data
 data storage More...
 
Eigen::Index m_num_time_points
 number of time points (i.e. More...
 

Friends

void PrintTo (const TimeSeries &self, std::ostream *os)
 print this object (googletest) More...
 

Detailed Description

template<class FP>
class mio::TimeSeries< FP >

stores vectors of values at time points (or some other abstract variable) the value at each time point is a vector.

size of the vector is determined at runtime but is equal for all time points. grows efficiently (like std::vector) in time dimension. Time and values of a single point are stored together in memory: {t0, v0[0], v0[1], ...}, {t1, v1[0], v1[1], ...}, {t2, v20, ...

Template Parameters
FPany floating point like type accepted by Eigen

Member Typedef Documentation

◆ const_iterator

template<class FP >
using mio::TimeSeries< FP >::const_iterator = TimeSeriesValueIterator<FP, true>

◆ const_reverse_iterator

template<class FP >
using mio::TimeSeries< FP >::const_reverse_iterator = std::reverse_iterator<const_iterator>

◆ const_reverse_time_iterator

template<class FP >
using mio::TimeSeries< FP >::const_reverse_time_iterator = std::reverse_iterator<const_time_iterator>

◆ const_time_iterator

template<class FP >
using mio::TimeSeries< FP >::const_time_iterator = TimeSeriesTimeIterator<FP, true>

◆ difference_type

template<class FP >
using mio::TimeSeries< FP >::difference_type = typename iterator::difference_type

◆ iterator

template<class FP >
using mio::TimeSeries< FP >::iterator = TimeSeriesValueIterator<FP, false>

◆ Matrix

template<class FP >
using mio::TimeSeries< FP >::Matrix = Eigen::Matrix<FP, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>

type that stores the data

◆ reference

template<class FP >
using mio::TimeSeries< FP >::reference = typename iterator::reference

◆ reverse_iterator

template<class FP >
using mio::TimeSeries< FP >::reverse_iterator = std::reverse_iterator<iterator>

◆ reverse_time_iterator

template<class FP >
using mio::TimeSeries< FP >::reverse_time_iterator = std::reverse_iterator<time_iterator>

◆ size_type

template<class FP >
using mio::TimeSeries< FP >::size_type = Eigen::Index

◆ time_iterator

template<class FP >
using mio::TimeSeries< FP >::time_iterator = TimeSeriesTimeIterator<FP, false>

◆ value_type

template<class FP >
using mio::TimeSeries< FP >::value_type = typename iterator::value_type

◆ Vector

template<class FP >
using mio::TimeSeries< FP >::Vector = Eigen::Matrix<FP, Eigen::Dynamic, 1>

base type of expressions of vector values at a time point

Constructor & Destructor Documentation

◆ TimeSeries() [1/5]

template<class FP >
mio::TimeSeries< FP >::TimeSeries ( Eigen::Index  num_elements)
inline

initialize empty TimeSeries.

Parameters
num_elementssize of vector at each time point

◆ TimeSeries() [2/5]

template<class FP >
template<typename Expr >
mio::TimeSeries< FP >::TimeSeries ( FP  t,
Expr &&  expr 
)
inline

initialize TimeSeries with one time point.

size of vector at each time point determined from input.

Template Parameters
Exprany type that can be assigned to TimeSeries::Vector
Parameters
ttime of initial time point
exprvector expression that evaluates to value at first time point

◆ TimeSeries() [3/5]

template<class FP >
mio::TimeSeries< FP >::TimeSeries ( std::vector< std::vector< FP >>  table)
inline

Initialize a TimeSeries with a table.

Parameters
tableConsists of a list of time points, each of the form (time, value_0, value_1, ..., value_n) for some fixed n >= 0.

◆ TimeSeries() [4/5]

template<class FP >
mio::TimeSeries< FP >::TimeSeries ( const TimeSeries< FP > &  other)
inline

copy ctor

◆ TimeSeries() [5/5]

template<class FP >
mio::TimeSeries< FP >::TimeSeries ( TimeSeries< FP > &&  other)
default

move ctor and assignment

Member Function Documentation

◆ add_time_point() [1/3]

template<class FP >
Eigen::Ref<Vector> mio::TimeSeries< FP >::add_time_point ( )
inline

add one uninitialized time point

◆ add_time_point() [2/3]

template<class FP >
Eigen::Ref<Vector> mio::TimeSeries< FP >::add_time_point ( FP  t)
inline

add one time point.

initialize time;

◆ add_time_point() [3/3]

template<class FP >
template<class Expr >
Eigen::Ref<Vector> mio::TimeSeries< FP >::add_time_point ( FP  t,
Expr &&  expr 
)
inline

add one time point.

Initialize time and value. Expr can be any vector expression assignable to TimeSeries::Vector.

◆ add_time_point_noinit()

template<class FP >
void mio::TimeSeries< FP >::add_time_point_noinit ( )
inlineprivate

◆ begin() [1/2]

template<class FP >
iterator mio::TimeSeries< FP >::begin ( )
inline

◆ begin() [2/2]

template<class FP >
const_iterator mio::TimeSeries< FP >::begin ( ) const
inline

◆ cbegin()

template<class FP >
const_iterator mio::TimeSeries< FP >::cbegin ( ) const
inline

◆ cend()

template<class FP >
const_iterator mio::TimeSeries< FP >::cend ( ) const
inline

◆ crbegin()

template<class FP >
const_reverse_iterator mio::TimeSeries< FP >::crbegin ( ) const
inline

◆ crend()

template<class FP >
const_reverse_iterator mio::TimeSeries< FP >::crend ( ) const
inline

◆ data() [1/2]

template<class FP >
FP* mio::TimeSeries< FP >::data ( )
inline

raw data storage.

at least num_rows * num_time_points scalars. packed {t0, v0[0], v0[1], ...}, {t1, v1[0], v1[1], ...}, ...

◆ data() [2/2]

template<class FP >
const FP* mio::TimeSeries< FP >::data ( ) const
inline

◆ deserialize()

template<class FP >
template<class IOContext >
static IOResult<TimeSeries> mio::TimeSeries< FP >::deserialize ( IOContext &  io)
inlinestatic

◆ end() [1/2]

template<class FP >
iterator mio::TimeSeries< FP >::end ( )
inline

◆ end() [2/2]

template<class FP >
const_iterator mio::TimeSeries< FP >::end ( ) const
inline

◆ export_csv()

template<class FP >
IOResult<void> mio::TimeSeries< FP >::export_csv ( const std::string &  filename,
const std::vector< std::string > &  column_labels = {},
char  separator = ',',
int  precision = 6 
) const
inline

Exports a TimeSeries object into a CSV file.

The first column of the CSV file contains the time points. The remaining columns contain the values at each time point. Column headers can be specified with column_labels. This function utilizes the print_table method with a width of 1, the specified separator, and an empty string as header prefix.

Parameters
[in]filepathPath to the CSV file.
[in]column_labels[Default: {}] Vector of labels for each column after the time column.
[in]separator[Default: ','] Separator character.
[in]precision[Default: 6] Number of decimals for floating point values.
Returns
IOResult<void> indicating success or failure.

◆ get_capacity()

template<class FP >
Eigen::Index mio::TimeSeries< FP >::get_capacity ( ) const
inline

current capacity

◆ get_const_reverse_times()

template<class FP >
Range<const_reverse_time_iterator> mio::TimeSeries< FP >::get_const_reverse_times ( ) const
inline

◆ get_const_times()

template<class FP >
Range<const_time_iterator> mio::TimeSeries< FP >::get_const_times ( ) const
inline

◆ get_last_time() [1/2]

template<class FP >
FP& mio::TimeSeries< FP >::get_last_time ( )
inline

time of time point at index num_time_points - 1

◆ get_last_time() [2/2]

template<class FP >
const FP& mio::TimeSeries< FP >::get_last_time ( ) const
inline

◆ get_last_value() [1/2]

template<class FP >
Eigen::Ref<Vector> mio::TimeSeries< FP >::get_last_value ( )
inline

◆ get_last_value() [2/2]

template<class FP >
Eigen::Ref<const Vector> mio::TimeSeries< FP >::get_last_value ( ) const
inline

reference to value vector at time point (num_timepoints - 1)

◆ get_num_elements()

template<class FP >
Eigen::Index mio::TimeSeries< FP >::get_num_elements ( ) const
inline

number of elements of vector at each time point

◆ get_num_rows()

template<class FP >
Eigen::Index mio::TimeSeries< FP >::get_num_rows ( ) const
inline

number of rows in data storage (includes time)

◆ get_num_time_points()

template<class FP >
Eigen::Index mio::TimeSeries< FP >::get_num_time_points ( ) const
inline

number of time points in the series

◆ get_reverse_times() [1/2]

template<class FP >
Range<reverse_time_iterator> mio::TimeSeries< FP >::get_reverse_times ( )
inline

◆ get_reverse_times() [2/2]

template<class FP >
Range<const_reverse_time_iterator> mio::TimeSeries< FP >::get_reverse_times ( ) const
inline

◆ get_time() [1/2]

template<class FP >
FP& mio::TimeSeries< FP >::get_time ( Eigen::Index  i)
inline

time of time point at index i

◆ get_time() [2/2]

template<class FP >
const FP& mio::TimeSeries< FP >::get_time ( Eigen::Index  i) const
inline

◆ get_times() [1/2]

template<class FP >
Range<time_iterator> mio::TimeSeries< FP >::get_times ( )
inline

◆ get_times() [2/2]

template<class FP >
Range<const_time_iterator> mio::TimeSeries< FP >::get_times ( ) const
inline

◆ get_valid_block() [1/2]

template<class FP >
auto mio::TimeSeries< FP >::get_valid_block ( )
inlineprivate

currently occupied block of storage

◆ get_valid_block() [2/2]

template<class FP >
auto mio::TimeSeries< FP >::get_valid_block ( ) const
inlineprivate

◆ get_value() [1/2]

template<class FP >
Eigen::Ref<Vector> mio::TimeSeries< FP >::get_value ( Eigen::Index  i)
inline

◆ get_value() [2/2]

template<class FP >
Eigen::Ref<const Vector> mio::TimeSeries< FP >::get_value ( Eigen::Index  i) const
inline

reference to value vector at time point i

◆ is_strictly_monotonic()

template<class FP >
bool mio::TimeSeries< FP >::is_strictly_monotonic ( ) const
inline

Check if the time is strictly monotonic increasing.

◆ matrix() [1/2]

template<class FP >
auto mio::TimeSeries< FP >::matrix ( )
inline

Matrix expression that contains one time point per column.

Each column contains the corresponding time at index 0.

◆ matrix() [2/2]

template<class FP >
auto mio::TimeSeries< FP >::matrix ( ) const
inline

Matrix expression that contains one time point per column.

Each column contains the corresponding time at index 0.

◆ operator=() [1/2]

template<class FP >
TimeSeries& mio::TimeSeries< FP >::operator= ( const TimeSeries< FP > &  other)
inline

copy assignment

◆ operator=() [2/2]

template<class FP >
TimeSeries& mio::TimeSeries< FP >::operator= ( TimeSeries< FP > &&  other)
default

◆ operator[]() [1/2]

template<class FP >
Eigen::Ref<Vector> mio::TimeSeries< FP >::operator[] ( Eigen::Index  i)
inline

◆ operator[]() [2/2]

template<class FP >
Eigen::Ref<const Vector> mio::TimeSeries< FP >::operator[] ( Eigen::Index  i) const
inline

◆ print_table() [1/2]

template<class FP >
void mio::TimeSeries< FP >::print_table ( const std::vector< std::string > &  column_labels = {},
size_t  width = 16,
size_t  precision = 5,
char  separator = ' ',
const std::string  header_prefix = "\n" 
) const
inline

Print out the TimeSeries as a table.

All row entries in the table are separated by the given separator, followed by additional spaces filling the width of the next entry. Each row is terminated by a newline character '
'. The first row of the table starts with "Time", followed by other column labels. Each row after that contains the time (see get_time) followed by the value (see get_value) for every row (i.e. time point) in the TimeSeries. The width parameter sets the minimum width of each table entry. For the numbers from the TimeSeries, this width includes the decimals and decimal point. If a number or column label is too long, they will not be cut off, but the table will no longer look nicely formatted. If the column_labels vector is too short, the default column label "#i" is used for the i-th column (starting at 1, as "Time" is used for column 0). Labels in the column_labels vector that go beyond the TimeSeries column numbers are ignored.

This method can be called in two ways:

  1. With an output stream as the first parameter: print_table(out, column_labels, width, precision, separator, header_prefix)
  2. Without specifying an output stream (defaults to std::cout): print_table(column_labels, width, precision, separator, header_prefix)
Parameters
[in,out]outWhich ostream to use (optional, see above).
[in]column_labelsVector of custom labels for each column.
[in]widthThe number of characters reserved for each number.
[in]precisionThe number of decimals.
[in]separatorSeparator character between columns.
[in]header_prefixPrefix before the header row.

◆ print_table() [2/2]

template<class FP >
void mio::TimeSeries< FP >::print_table ( std::ostream &  out,
const std::vector< std::string > &  column_labels = {},
size_t  width = 16,
size_t  precision = 5,
char  separator = ' ',
const std::string  header_prefix = "\n" 
) const
inline

Print out the TimeSeries as a table.

All row entries in the table are separated by the given separator, followed by additional spaces filling the width of the next entry. Each row is terminated by a newline character '
'. The first row of the table starts with "Time", followed by other column labels. Each row after that contains the time (see get_time) followed by the value (see get_value) for every row (i.e. time point) in the TimeSeries. The width parameter sets the minimum width of each table entry. For the numbers from the TimeSeries, this width includes the decimals and decimal point. If a number or column label is too long, they will not be cut off, but the table will no longer look nicely formatted. If the column_labels vector is too short, the default column label "#i" is used for the i-th column (starting at 1, as "Time" is used for column 0). Labels in the column_labels vector that go beyond the TimeSeries column numbers are ignored.

This method can be called in two ways:

  1. With an output stream as the first parameter: print_table(out, column_labels, width, precision, separator, header_prefix)
  2. Without specifying an output stream (defaults to std::cout): print_table(column_labels, width, precision, separator, header_prefix)
Parameters
[in,out]outWhich ostream to use (optional, see above).
[in]column_labelsVector of custom labels for each column.
[in]widthThe number of characters reserved for each number.
[in]precisionThe number of decimals.
[in]separatorSeparator character between columns.
[in]header_prefixPrefix before the header row.

◆ rbegin() [1/2]

template<class FP >
reverse_iterator mio::TimeSeries< FP >::rbegin ( )
inline

◆ rbegin() [2/2]

template<class FP >
const_reverse_iterator mio::TimeSeries< FP >::rbegin ( ) const
inline

◆ remove_last_time_point()

template<class FP >
void mio::TimeSeries< FP >::remove_last_time_point ( )
inline

◆ remove_time_point()

template<class FP >
void mio::TimeSeries< FP >::remove_time_point ( Eigen::Index  i)
inline

remove time point.

Parameters
iindex to remove

◆ rend() [1/2]

template<class FP >
reverse_iterator mio::TimeSeries< FP >::rend ( )
inline

◆ rend() [2/2]

template<class FP >
const_reverse_iterator mio::TimeSeries< FP >::rend ( ) const
inline

◆ reserve()

template<class FP >
void mio::TimeSeries< FP >::reserve ( Eigen::Index  n)
inline

reserve capacity for n time points

◆ serialize()

template<class FP >
template<class IOContext >
void mio::TimeSeries< FP >::serialize ( IOContext &  io) const
inline

◆ zero()

template<class FP >
static TimeSeries mio::TimeSeries< FP >::zero ( Eigen::Index  num_time_points,
Eigen::Index  num_elements 
)
inlinestatic

constructs TimeSeries instance and initializes it with zeros

Parameters
num_time_pointsnumber of time steps
num_elementsnumber of compartiments * number of groups
Returns

Friends And Related Function Documentation

◆ PrintTo

template<class FP >
void PrintTo ( const TimeSeries< FP > &  self,
std::ostream *  os 
)
friend

print this object (googletest)

Member Data Documentation

◆ m_data

template<class FP >
Matrix mio::TimeSeries< FP >::m_data
private

data storage

◆ m_num_time_points

template<class FP >
Eigen::Index mio::TimeSeries< FP >::m_num_time_points
private

number of time points (i.e.

occupied columns in m_data)