9#ifndef __COALESCENCE_MERGERS_H_INCLUDED__
10#define __COALESCENCE_MERGERS_H_INCLUDED__
23namespace merger_policy
60 template <
class B
idirectionalIterator,
class T,
class BinaryOperation,
class Generator>
61 static auto merge(BidirectionalIterator first, BidirectionalIterator last,
unsigned int N, T init,
62 BinaryOperation
const &op, Generator &g)
64 assert(N >= 1 &&
"Population size should be more than 1 for evaluating coalescence probability");
65 assert(std::distance(first, last) > 1 &&
66 "Coalescence should operate on a range containing more than one element.");
67 double k =
static_cast<double>(std::distance(first, last));
68 double coal_proba = (k * (k - 1.0)) /
static_cast<double>(2 * N);
69 std::bernoulli_distribution d(coal_proba);
102 template <
class B
idirectionalIterator,
class Generator>
103 static auto merge(BidirectionalIterator first, BidirectionalIterator last,
unsigned int N, Generator &g)
105 assert(N >= 1 &&
"Population size should be positive for evaluating coalescence probability");
106 assert(std::distance(first, last) > 1 &&
107 "Coalescence should operate on a range containing more than one element.");
108 using T =
typename BidirectionalIterator::value_type;
109 return merge(first, last, N, T(), std::plus<T>(), g);
149 template <
class B
idirectionalIterator,
class T,
class BinaryOperation,
class Generator>
150 static auto merge(BidirectionalIterator first, BidirectionalIterator last,
unsigned int N, T
const &init,
151 BinaryOperation
const &op, Generator &g)
153 assert(N >= 1 &&
"Population size should be positive for evaluating coalescence probability");
154 assert(std::distance(first, last) > 1 &&
155 "Coalescence should operate on a range containing more than one element.");
156 unsigned int k = std::distance(first, last);
185 template <
class B
idirectionalIterator,
class Generator>
186 static auto merge(BidirectionalIterator first, BidirectionalIterator last,
unsigned int N, Generator &g)
188 assert(N >= 1 &&
"Population size should be positive for evaluating coalescence probability");
189 assert(std::distance(first, last) > 1 &&
190 "Coalescence should operate on a range containing more than one element.");
191 unsigned int k = std::distance(first, last);
BidirectionalIterator binary_merge(BidirectionalIterator first, BidirectionalIterator last, T init, BinaryOperation op, Generator &g)
merges 2 randomly selected elements in a range.
Definition merge.hpp:50
BidirectionalIterator simultaneous_multiple_merge(BidirectionalIterator first, BidirectionalIterator last, T init, OccupancySpectrum const &sp, BinaryOperation op, Generator &g)
merges randomly selected elements in a range according to an occupancy spectrum.
Definition merge.hpp:114
Simulation of coalescence-based models of molecular evolution.
Definition coalescence.hpp:21
Discrete generation binary merger.
Definition merger_policy.hpp:33
static auto merge(BidirectionalIterator first, BidirectionalIterator last, unsigned int N, T init, BinaryOperation const &op, Generator &g)
merges 2 randomly selected elements in a range.
Definition merger_policy.hpp:61
static auto merge(BidirectionalIterator first, BidirectionalIterator last, unsigned int N, Generator &g)
merges 2 randomly selected elements in a range.
Definition merger_policy.hpp:103
Discrete generation simultaneous multiple merger.
Definition merger_policy.hpp:123
static auto merge(BidirectionalIterator first, BidirectionalIterator last, unsigned int N, T const &init, BinaryOperation const &op, Generator &g)
merges multiple randomly selected elements in a range.
Definition merger_policy.hpp:150
static auto merge(BidirectionalIterator first, BidirectionalIterator last, unsigned int N, Generator &g)
merges multiple randomly selected elements in a range.
Definition merger_policy.hpp:186