32 #ifndef VSMC_CORE_MONITOR_HPP 33 #define VSMC_CORE_MONITOR_HPP 37 #define VSMC_RUNTIME_ASSERT_CORE_MONITOR_ID(func) \ 38 VSMC_RUNTIME_ASSERT( \ 39 (id < dim()), "**Monitor::" #func "** INVALID ID NUMBER ARGUMENT") 41 #define VSMC_RUNTIME_ASSERT_CORE_MONITOR_ITER(func) \ 42 VSMC_RUNTIME_ASSERT((iter < iter_size()), \ 43 "**Monitor::" #func "** INVALID ITERATION NUMBER ARGUMENT") 45 #define VSMC_RUNTIME_ASSERT_CORE_MONITOR_EVAL \ 46 VSMC_RUNTIME_ASSERT(static_cast<bool>(eval_), \ 47 "**Monitor::eval** INVALID EVALUATION OBJECT") 68 std::function<void(std::size_t, std::size_t, Particle<T> &,
double *)>;
82 std::size_t
dim()
const {
return dim_; }
91 std::size_t
iter_size()
const {
return index_.size(); }
97 record_.reserve(dim_ * num);
101 bool empty()
const {
return !
static_cast<bool>(eval_); }
110 std::string &
name(std::size_t
id)
118 const std::string &
name(std::size_t
id)
const 134 std::size_t
index(std::size_t iter)
const 152 return record_[iter * dim_ + id];
160 double record(std::size_t
id, std::size_t iter)
const 165 return record_[iter * dim_ + id];
169 template <
typename OutputIter>
172 std::copy(index_.begin(), index_.end(), first);
176 const std::size_t *
index_data()
const {
return index_.data(); }
186 return record_.data() + iter * dim_;
191 template <
typename OutputIter>
195 const double *riter = record_.data() + id;
196 for (std::size_t i = 0; i != N; ++i, ++first, riter += dim_)
204 template <
typename OutputIterIter>
207 for (std::size_t d = 0; d != dim_; ++d, ++first)
221 template <MatrixLayout Layout,
typename OutputIter>
226 for (std::size_t d = 0; d != dim_; ++d) {
227 const double *riter = record_.data() + d;
228 for (std::size_t i = 0; i != N; ++i, ++first, riter += dim_)
234 std::copy(record_.begin(), record_.end(), first);
252 result_.resize(dim_);
254 eval_(iter, dim_, particle, result_.data());
260 const std::size_t N =
static_cast<std::size_t
>(particle.
size());
261 buffer_.resize(N * dim_);
262 eval_(iter, dim_, particle, buffer_.data());
263 ::cblas_dgemv(::CblasColMajor, ::CblasNoTrans,
264 static_cast<VSMC_CBLAS_INT>(dim_), static_cast<VSMC_CBLAS_INT>(N),
266 particle.
weight().data(), 1, 0.0, result_.data(), 1);
298 void push_back(std::size_t iter)
300 index_.push_back(iter);
301 record_.insert(record_.end(), result_.begin(), result_.end());
307 #endif // VSMC_CORE_MONITOR_HPP bool empty() const
Whether the evaluation object is valid.
#define VSMC_RUNTIME_ASSERT_CORE_MONITOR_EVAL
void read_record(std::size_t id, OutputIter first) const
Read the record history for a given variable through an output iterator.
Particle class representing the whole particle set.
typename std::conditional< std::is_scalar< T >::value, AlignedVector< T >, std::vector< T >>::type Vector
AlignedVector for scalar type and std::vector for others.
bool record_only() const
If this is a record only Monitor.
MonitorStage
Monitor stage.
void read_index(OutputIter first) const
Read the index history through an output iterator.
void clear()
Clear all records of the index and integrations.
weight_type & weight()
Read and write access to the weight collection object.
void eval(std::size_t iter, Particle< T > &particle, MonitorStage stage)
Perform the evaluation for a given iteration and a Particle<T> object.
void reserve(std::size_t num)
Reserve space for a specified number of iterations.
void turn_off()
Turn off the recording.
Monitor evaluated after moves.
void turn_on()
Turn on the recording.
#define VSMC_RUNTIME_ASSERT_CORE_MONITOR_ITER(func)
Monitor(std::size_t dim, const eval_type &eval, bool record_only=false, MonitorStage stage=MonitorMCMC)
std::size_t dim() const
The dimension of the Monitor.
void set_eval(const eval_type &new_eval)
Set a new evaluation object of type eval_type.
const std::size_t * index_data() const
Read only access to the raw data of the index vector.
void read_record_matrix(OutputIter first) const
Read the record history of all variables through an output iterator.
std::size_t iter_size() const
The number of iterations has been recorded.
const double * record_data() const
Read only access to the raw data of records (a row major matrix)
std::string & name(std::size_t id)
Read and write access to the names of variables.
const std::string & name(std::size_t id) const
Read only access to the names of variables.
const double * record_data(std::size_t iter) const
Read only access to the raw data of records for a given Monitor iteration.
std::size_t index(std::size_t iter) const
Get the iteration index of the sampler of a given Monitor iteration.
MonitorStage stage() const
The stage of the Montior.
double record(std::size_t id) const
Get the latest Monte Carlo integration record of a given variable.
Monitor evaluated after MCMC moves.
Monitor for Monte Carlo integration.
#define VSMC_RUNTIME_ASSERT_CORE_MONITOR_ID(func)
void read_record_matrix(OutputIterIter first) const
Read the record history of all variables through an array of output iterators.
bool recording() const
Whether the Monitor is actively recording results.
size_type size() const
Number of particles.
std::function< void(std::size_t, std::size_t, Particle< T > &, double *)> eval_type
double record(std::size_t id, std::size_t iter) const
Get the Monte Carlo integration record of a given variable and the Monitor iteration.
Monitor evaluated after resampling.