/// \brief Get the latest Monte Carlo integration record of a given /// variable /// /// \details /// For a `dim` dimension Monitor, `id` shall be 0 to `dim` - 1 double record(std::size_t id) const { std::size_t iter = iter_size() ? iter_size() - 1 : iter_size(); VSMC_RUNTIME_ASSERT_CORE_MONITOR_ID(record); VSMC_RUNTIME_ASSERT_CORE_MONITOR_ITER(record); return record_[iter * dim_ + id]; }
void push_back (std::size_t iter, double grid, double integrand) { index_.push_back(iter); grid_.push_back(grid); integrand_.push_back(integrand); if (iter_size() > 1) { std::size_t i = iter_size() - 1; log_zconst_ += 0.5 * (grid_[i] - grid_[i - 1]) * (integrand_[i] + integrand_[i - 1]); } }
void read_record(std::size_t id, OutputIter first) const { const std::size_t N = iter_size(); const double *riter = record_.data() + id; for (std::size_t i = 0; i != N; ++i, ++first, riter += dim_) *first = *riter; }
/** kmeans_reduce() * Updates the sum calculation for the various points */ void kmeans_reduce(void *key_in, iterator_t *itr) { assert (key_in); assert (itr); int i; int *sum; int *mean; void *val; int vals_len = iter_size (itr); sum = (int *)calloc(dim, sizeof(int)); mean = (int *)malloc(dim * sizeof(int)); i = 0; while (iter_next (itr, &val)) { add_to_sum (sum, val); ++i; } assert (i == vals_len); for (i = 0; i < dim; i++) { mean[i] = sum[i] / vals_len; } free(sum); emit(key_in, (void *)mean); }
void read_record_matrix(OutputIter first) const { const std::size_t N = iter_size(); if (Layout == ColMajor) { for (std::size_t d = 0; d != dim_; ++d) { const double *riter = record_.data() + d; for (std::size_t i = 0; i != N; ++i, ++first, riter += dim_) *first = *riter; } } if (Layout == RowMajor) std::copy(record_.begin(), record_.end(), first); }