Program Listing for File distribution1d.hpp¶
↰ Return to documentation for file (/home/runner/work/wave_tracer/wave_tracer/include/wt/math/distribution/distribution1d.hpp)
/*
*
* wave tracer
* Copyright Shlomi Steinberg
*
* LICENSE: Creative Commons Attribution-NonCommercial 4.0 International
*
*/
#pragma once
#include <vector>
#include <cassert>
#include <wt/sampler/sampler.hpp>
#include <wt/sampler/measure.hpp>
#include <wt/math/common.hpp>
#include <wt/math/range.hpp>
namespace wt {
class distribution1d_t {
public:
virtual ~distribution1d_t() noexcept = default;
[[nodiscard]] virtual std::unique_ptr<distribution1d_t> clone() const = 0;
[[nodiscard]] virtual f_t pdf(f_t x,
measure_e measure = measure_e::continuos) const noexcept = 0;
struct sample_ret_t {
f_t x;
measure_e measure;
f_t pdf;
};
[[nodiscard]] virtual sample_ret_t sample(sampler::sampler_t& sampler) const noexcept = 0;
[[nodiscard]] virtual std::vector<f_t> tabulate(const range_t<>& range, std::size_t bins) const {
std::vector<f_t> tbl;
tbl.resize(bins);
const auto rcp_bc = f_t(1)/bins;
for (auto i=0ul;i<bins;++i)
tbl[i] = pdf(m::mix(range, (i+f_t(.5))*rcp_bc));
return tbl;
}
};
}