Quetzal-CoaTL
The Coalescence Template Library
Loading...
Searching...
No Matches
merger_policy.hpp
1// Copyright 2021 Arnaud Becheler <abechele@umich.edu>
2
3/*********************************************************************** * This program is free software; you can
4 *redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free
5 *Software Foundation; either version 2 of the License, or * (at your option) any later version. *
6 * *
7 ***************************************************************************/
8
9#ifndef __COALESCENCE_MERGERS_H_INCLUDED__
10#define __COALESCENCE_MERGERS_H_INCLUDED__
11
12#include "algorithm/merge.hpp"
13
14#include <cassert>
15#include <functional> // std::plus
16#include <iterator> // std::distance
17#include <random> // bernoulli_distribution
18
19namespace quetzal
20{
21namespace coalescence
22{
23namespace merger_policy
24{
33{
60 template <class BidirectionalIterator, 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)
63 {
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);
70 if (d(g))
71 {
72 last = algorithm::binary_merge(first, last, init, op, g);
73 }
74 return last;
75 }
102 template <class BidirectionalIterator, class Generator>
103 static auto merge(BidirectionalIterator first, BidirectionalIterator last, unsigned int N, Generator &g)
104 {
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);
110 }
111};
122template <class SpectrumSamplingPolicy> struct SimultaneousMultipleMerger
123{
149 template <class BidirectionalIterator, 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)
152 {
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);
157 return algorithm::simultaneous_multiple_merge(first, last, init, SpectrumSamplingPolicy::sample(k, N, g), op,
158 g);
159 }
185 template <class BidirectionalIterator, class Generator>
186 static auto merge(BidirectionalIterator first, BidirectionalIterator last, unsigned int N, Generator &g)
187 {
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);
192 return algorithm::simultaneous_multiple_merge(first, last, SpectrumSamplingPolicy::sample(k, N, g), g);
193 }
194}; // end class SimultaneousMultipleMerger
195} // end namespace merger_policy
196} // end namespace coalescence
197} // end namespace quetzal
198
199#endif
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