File userdata-meat.hpp¶
File List > epiworld > userdata-meat.hpp
Go to the documentation of this file
#ifndef EPIWORLD_USERDATA_MEAT_HPP
#define EPIWORLD_USERDATA_MEAT_HPP
template<typename TSeq>
class UserData;
template<typename TSeq>
inline UserData<TSeq>::UserData(std::vector< std::string > names)
{
k = names.size();
data_names = names;
}
template<typename TSeq>
inline void UserData<TSeq>::add(std::vector<epiworld_double> x)
{
if (x.size() != k)
throw std::out_of_range(
"The size of -x-, " + std::to_string(x.size()) + ", does not match " +
"the number of elements registered (" + std::to_string(k));
for (auto & i : x)
data_data.push_back(i);
data_dates.push_back(model->today());
n++;
last_day = model->today();
}
template<typename TSeq>
inline void UserData<TSeq>::add(epiworld_fast_uint j, epiworld_double x)
{
// Starting with a new day?
if (static_cast<int>(model->today()) != last_day)
{
std::vector< epiworld_double > tmp(k, 0.0);
tmp[j] = x;
add(tmp);
}
else
{
this->operator()(n - 1, j) = x;
}
}
template<typename TSeq>
inline std::vector< std::string > & UserData<TSeq>::get_names()
{
return data_names;
}
template<typename TSeq>
inline std::vector< int > & UserData<TSeq>::get_dates()
{
return data_dates;
}
template<typename TSeq>
inline std::vector< epiworld_double > & UserData<TSeq>::get_data()
{
return data_data;
}
template<typename TSeq>
inline void UserData<TSeq>::get_all(
std::vector< std::string > * names,
std::vector< int > * date,
std::vector< epiworld_double > * data
)
{
if (names != nullptr)
names = &this->data_names;
if (date != nullptr)
date = &this->data_dates;
if (data != nullptr)
data = &this->data_data;
}
template<typename TSeq>
inline epiworld_double & UserData<TSeq>::operator()(
epiworld_fast_uint i,
epiworld_fast_uint j
)
{
if (j >= k)
throw std::out_of_range("j cannot be greater than k - 1.");
if (i >= n)
throw std::out_of_range("j cannot be greater than n - 1.");
return data_data[k * i + j];
}
template<typename TSeq>
inline epiworld_double & UserData<TSeq>::operator()(
epiworld_fast_uint i,
std::string name
)
{
int loc = -1;
for (epiworld_fast_uint l = 0u; l < k; ++l)
{
if (name == data_names[l])
{
loc = l;
break;
}
}
if (loc < 0)
throw std::range_error(
"The variable \"" + name + "\" is not present " +
"in the user UserData database."
);
return operator()(i, static_cast<epiworld_fast_uint>(loc));
}
template<typename TSeq>
inline epiworld_fast_uint UserData<TSeq>::nrow() const
{
return n;
}
template<typename TSeq>
inline epiworld_fast_uint UserData<TSeq>::ncol() const
{
return k;
}
template<typename TSeq>
inline void UserData<TSeq>::write(std::string fn)
{
std::ofstream file_ud(fn, std::ios_base::out);
// File header
file_ud << "\"date\"";
for (auto & cn : data_names)
file_ud << " \"" + cn + "\"";
file_ud << "\n";
epiworld_fast_uint ndata = 0u;
for (epiworld_fast_uint i = 0u; i < n; ++i)
{
file_ud << data_dates[i];
for (epiworld_fast_uint j = 0u; j < k; ++j)
file_ud << " " << data_data[ndata++];
file_ud << "\n";
}
return;
}
template<typename TSeq>
inline void UserData<TSeq>::print() const
{
// File header
printf_epiworld("Total records: %llu\n", n);
printf_epiworld("date");
for (auto & cn : data_names)
{
printf_epiworld(" %s", cn.c_str());
}
printf_epiworld("\n");
epiworld_fast_uint ndata = 0u;
for (epiworld_fast_uint i = 0u; i < n; ++i)
{
printf_epiworld("%i", data_dates[i]);
for (epiworld_fast_uint j = 0u; j < k; ++j)
{
printf_epiworld(" %.2f", data_data[ndata++]);
}
printf_epiworld("\n");
}
return;
}
#endif