57 template <
typename Space,
typename Tree,
typename Generator,
typename Binop,
typename TimeFun>
65 throw std::logic_error(
"The forest to coalesce is empty.");
71 assert(std::distance(range.first, range.second) == 1);
72 return range.first->second;
74 assert(forest.
nb_trees() >= 2 &&
"Trying to coalesce less than 2 nodes.");
76 return coalesce(trees, N, gen, branch, make_tree);
89 template <
typename Generator>
90 static unsigned int sample_waiting_time(
unsigned int k,
unsigned int N, Generator &gen)
93 double mean =
static_cast<double>(N) / boost::math::binomial_coefficient<double>(k, 2);
94 double p = 1 / (1 + mean);
95 assert(0 < p && p <= 1);
96 std::geometric_distribution dist(p);
120 template <
typename Tree,
typename Generator,
typename Binop,
typename TimeFun>
121 static Tree coalesce(std::vector<Tree> &trees,
unsigned int N, Generator &gen, Binop branch, TimeFun make_tree)
123 assert(trees.size() >= 2 &&
"Trying to coalesce less than 2 nodes.");
124 if (trees.size() > N)
131 auto last = smm_type::merge(trees.begin(), trees.end(), N, make_tree(g), branch, gen);
132 trees.erase(last, trees.end());
134 unsigned int k = trees.size();
135 assert(k <= N &&
"number of lineages greater than ancestral Wright-Fisher population size.");
136 auto last = trees.end();
139 unsigned int g = sample_waiting_time(k, N, gen);
143 return *(trees.begin());
170 typename Tree,
typename Generator,
typename Binop,
typename TimeFun>
171 static std::vector<Tree> coalesce(std::vector<Tree> &trees,
unsigned int N,
unsigned int g, Generator &gen,
172 Binop branch, TimeFun make_tree)
174 assert(trees.size() >= 2 &&
"Trying to coalesce less than 2 nodes.");
175 assert(g > 0 &&
"Number of generations for the coalescence process should be at least 1");
176 assert(N >= 1 &&
"Population size should be positive for evaluating coalescence probability");
177 using merger_type = MergerType;
179 auto last = trees.end();
180 while (t < g && std::distance(trees.begin(), last) > 1)
182 last = merger_type::merge(trees.begin(), last, N, make_tree(t), branch, gen);
185 trees.erase(last, trees.end());
std::pair< const_iterator, const_iterator > trees_at_same_position(const Position &position) const
non-modifying access to trees in the forest at a given position
Definition Forest.hpp:155
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