9#ifndef __OCCUPANCY_SPECTRUM_DISTRIBUTION_H_INCLUDED__
10#define __OCCUPANCY_SPECTRUM_DISTRIBUTION_H_INCLUDED__
13#include "editor_policy.hpp"
14#include "filter_policy.hpp"
23#include <boost/multiprecision/cpp_dec_float.hpp>
24#include <boost/multiprecision/cpp_int.hpp>
25#include <boost/random.hpp>
31namespace occupancy_spectrum
69template <
class FilterPolicy = filter_policy::return_always_true,
class EditorPolicy = editor_policy::
identity>
74 using BigInt = boost::multiprecision::cpp_int;
76 using BigFloat = boost::multiprecision::cpp_dec_float_50;
82 using support_type = std::vector<spectrum_type>;
84 using probabilities_type = std::vector<double>;
92 support_type m_support;
94 probabilities_type m_probas;
96 mutable std::discrete_distribution<size_t> m_distribution;
114 auto callback = make_callback(m_k, m_N);
117 m_distribution = std::discrete_distribution<size_t>(m_probas.cbegin(), m_probas.cend());
118 assert(m_support.size() == m_probas.size());
148 return m_support[m_distribution(g)];
185 BigFloat numerator(Factorial(
m) * Factorial(
n));
186 BigFloat denominator(1.0);
188 for (
auto m_j : m_js)
190 denominator *= boost::multiprecision::pow(BigFloat(Factorial(j)), BigFloat(m_j)) * BigFloat(Factorial(m_j));
193 denominator *= BigFloat(std::pow(
m,
n));
194 BigFloat result = numerator / denominator;
195 return static_cast<double>(result);
204 for (
int i = 0; i < dist.
support().size(); ++i)
212 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(os,
", "));
215 os <<
"\t) = " << dist.
weights()[i] <<
"\n";
224 auto make_callback(
int k,
int N)
226 return [
this, k, N](spectrum_type &&M_j) {
230 this->m_support.push_back(EditorPolicy::edit(std::move(M_j)));
231 this->m_probas.push_back(p);
238 static BigInt Factorial(
int num)
241 for (
int i = num; i > 1; --i)
An occupancy spectrum as defined in Becheler & Knowles, 2020.
Definition OccupancySpectrum.hpp:42
Occupancy spectrum distributed according to the probability function given by von Mises (1939).
Definition ProbabilityDistribution.hpp:71
int m() const
The number of urns (parents) used in the random experience.
Definition ProbabilityDistribution.hpp:160
const support_type & support() const
Get a constant reference on the support of occupancy spectrum distribution.
Definition ProbabilityDistribution.hpp:167
ProbabilityDistribution()=default
Default constructor.
int n() const
The number of balls (coalescing lineages) that are thrown in the random experience.
Definition ProbabilityDistribution.hpp:153
ProbabilityDistribution(int n, int m, FilterPolicy pred=FilterPolicy())
Construct the occupancy spectrum distribution resulting from throwing balls into urns.
Definition ProbabilityDistribution.hpp:112
const spectrum_type & operator()(Generator &g) const
Generates random occupancy spectrum that are distributed according to the associated probability func...
Definition ProbabilityDistribution.hpp:146
static double compute_probability(int n, int m, spectrum_type const &m_js)
Computes the probability of a given spectrum for a given experiment.
Definition ProbabilityDistribution.hpp:183
self_type & operator=(self_type &&)=default
Move assignment operator.
friend std::ostream & operator<<(std::ostream &os, self_type const &dist)
Stream operator to print the distribution support and probabilities.
Definition ProbabilityDistribution.hpp:202
ProbabilityDistribution(self_type &&)=default
Move constructor.
ProbabilityDistribution(const self_type &)=delete
Copy constructor.
self_type & operator=(const self_type &)=delete
Deleted copy assignment operator.
const probabilities_type & weights() const
Get a constant reference the weights associated to each spectrum.
Definition ProbabilityDistribution.hpp:176
Set of occupancy spectrums resulting from throwing balls (the number of coalescing gene copies) into...
Definition Support.hpp:28
void generate(UnaryOperation op) const
Generate all possible configurations.
Definition Support.hpp:52
Simulation of coalescence-based models of molecular evolution.
Definition coalescence.hpp:21