bpp-phyl3 3.0.0
DetailedSiteSimulator.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: The Bio++ Development Group
2//
3// SPDX-License-Identifier: CECILL-2.1
4
5#ifndef BPP_PHYL_SIMULATION_DETAILEDSITESIMULATOR_H
6#define BPP_PHYL_SIMULATION_DETAILEDSITESIMULATOR_H
7
8
9#include "../Likelihood/ParametrizablePhyloTree.h"
10#include "MutationProcess.h"
11#include "SiteSimulator.h"
12
13// From the STL:
14#include <map>
15#include <vector>
16
17namespace bpp
18{
25{
26private:
27 mutable std::map<uint, size_t> indexes_;
29 std::vector<MutationPath> paths_;
30 std::vector<size_t> ancestralStates_;
31 std::shared_ptr<const ParametrizablePhyloTree> tree_;
32 std::vector<unsigned int> leavesId_;
33 std::shared_ptr<const StateMapInterface> statemap_;
34
35public:
37 std::shared_ptr<const ParametrizablePhyloTree> tree,
38 std::shared_ptr<const StateMapInterface> statemap,
39 size_t ancestralState) :
40 indexes_ (),
41 currentIndex_ (0),
42 paths_ (),
44 tree_ (tree),
45 leavesId_ (tree->getNodeIndexes(tree->getLeavesUnderNode(tree->getRoot()))),
46 statemap_ (statemap)
47 {
48 indexes_[tree->getRootIndex()] = 0;
49 // Warning, watch out the indices there!
50 paths_.push_back(MutationPath(getAlphabet(), ancestralState, 0));
51 ancestralStates_.push_back(ancestralState);
52 }
53
55 indexes_ (ssr.indexes_),
57 paths_ (ssr.paths_),
59 tree_ (ssr.tree_),
60 leavesId_ (ssr.leavesId_),
62 {}
63
65 {
66 indexes_ = ssr.indexes_;
68 paths_ = ssr.paths_;
70 tree_ = ssr.tree_;
71 leavesId_ = ssr.leavesId_;
72 statemap_ = ssr.statemap_;
73 return *this;
74 }
75
77
78public:
82 std::shared_ptr<const Alphabet> getAlphabet() const { return statemap_->getAlphabet(); }
83
84 const Alphabet& alphabet() const { return statemap_->alphabet(); }
85
86 virtual void addNode(unsigned int nodeId, MutationPath path)
87 {
89 indexes_[nodeId] = currentIndex_;
90 paths_.push_back(path);
91 ancestralStates_.push_back(path.getFinalState());
92 }
93
94 virtual size_t getAncestralState(size_t i) const { return ancestralStates_[i]; }
95
96 virtual size_t getAncestralState(unsigned int nodeId) const { return ancestralStates_[indexes_[nodeId]]; }
97
98 virtual const MutationPath& getMutationPath(size_t i) const { return paths_[i]; }
99
100 virtual const MutationPath& getMutationPath(unsigned int nodeId) const { return paths_[indexes_[nodeId]]; }
101
102 virtual size_t getSubstitutionCount(size_t i) const { return paths_[i].getNumberOfEvents(); }
103
105 size_t i,
107 std::vector<double>& counts) const
108 {
109 paths_[i].getEventCounts(counts, reg);
110 }
111
112 virtual size_t getSubstitutionCount(unsigned int nodeId) const { return paths_[indexes_[nodeId]].getNumberOfEvents(); }
113
115 unsigned int nodeId,
117 std::vector<double>& counts) const
118 {
119 paths_[indexes_[nodeId]].getEventCounts(counts, reg);
120 }
121
123 {
124 size_t n = paths_.size();
125 VVdouble counts(n);
126 for (size_t i = 0; i < n; ++i)
127 {
128 counts[i].resize(reg.getNumberOfSubstitutionTypes());
129 paths_[i].getEventCounts(counts[i], reg);
130 }
131 return counts;
132 }
133
137 virtual std::vector<size_t> getFinalStates() const
138 {
139 size_t n = leavesId_.size();
140 std::vector<size_t> states(n);
141 for (size_t i = 0; i < n; i++)
142 {
143 states[i] = ancestralStates_[indexes_[leavesId_[i]]];
144 }
145 return states;
146 }
147
151 virtual std::unique_ptr<SiteInterface> getSite() const
152 {
153 std::vector<size_t> mstates = getFinalStates();
154 std::vector<int> astates(mstates.size());
155 for (size_t i = 0; i < mstates.size(); ++i)
156 {
157 astates[i] = statemap_->getAlphabetStateAsInt(mstates[i]);
158 }
159
160 auto alphabet = statemap_->getAlphabet();
161 return std::make_unique<Site>(astates, alphabet);
162 }
163
167 virtual std::vector<std::string> getLeaveNames() const
168 {
169 size_t n = leavesId_.size();
170 std::vector<std::string> names(n);
171 for (size_t i = 0; i < n; i++)
172 {
173 names[i] = tree_->getNode(leavesId_[i])->getName();
174 }
175 return names;
176 }
177};
178
179// ---------------------------------------------------------------------------
180
189{
190protected:
191 double rate_;
192
193public:
195 std::shared_ptr<const ParametrizablePhyloTree> tree,
196 std::shared_ptr<const StateMapInterface> stateMap,
197 size_t ancestralStateIndex,
198 double rate) :
199 SiteSimulationResult(tree, stateMap, ancestralStateIndex),
200 rate_(rate) {}
201
203
204public:
208 virtual double getRate() const { return rate_; }
209};
210
211// ---------------------------------------------------------------------------
212
219 public virtual SiteSimulatorInterface
220{
221public:
224
226
227public:
234 virtual std::unique_ptr<SiteSimulationResult> dSimulateSite() const = 0;
235 virtual std::unique_ptr<SiteSimulationResult> dSimulateSite(size_t rateClass) const = 0;
236 virtual std::unique_ptr<SiteSimulationResult> dSimulateSite(double rate) const = 0;
237 virtual std::unique_ptr<SiteSimulationResult> dSimulateSite(size_t ancestralStateIndex, double rate) const = 0;
238};
239} // end of namespace bpp.
240#endif // BPP_PHYL_SIMULATION_DETAILEDSITESIMULATOR_H
This interface adds the dSimulate method to the SiteSimulator interface.
virtual std::unique_ptr< SiteSimulationResult > dSimulateSite(size_t rateClass) const =0
DetailedSiteSimulatorInterface * clone() const override=0
virtual std::unique_ptr< SiteSimulationResult > dSimulateSite(double rate) const =0
virtual std::unique_ptr< SiteSimulationResult > dSimulateSite() const =0
Get a detailed simulation result for one site.
virtual std::unique_ptr< SiteSimulationResult > dSimulateSite(size_t ancestralStateIndex, double rate) const =0
This class is used by MutationProcess to store detailed results of simulations.
size_t getFinalState() const
Retrieve the final state of this path.
Data structure to store the result of a DetailedSiteSimulator.
RASiteSimulationResult(std::shared_ptr< const ParametrizablePhyloTree > tree, std::shared_ptr< const StateMapInterface > stateMap, size_t ancestralStateIndex, double rate)
virtual double getRate() const
Data structure to store the result of a DetailedSiteSimulator.
virtual void addNode(unsigned int nodeId, MutationPath path)
virtual const MutationPath & getMutationPath(size_t i) const
std::shared_ptr< const StateMapInterface > statemap_
std::vector< size_t > ancestralStates_
SiteSimulationResult(std::shared_ptr< const ParametrizablePhyloTree > tree, std::shared_ptr< const StateMapInterface > statemap, size_t ancestralState)
SiteSimulationResult & operator=(const SiteSimulationResult &ssr)
virtual std::vector< size_t > getFinalStates() const
virtual size_t getSubstitutionCount(unsigned int nodeId) const
virtual std::vector< std::string > getLeaveNames() const
virtual size_t getAncestralState(unsigned int nodeId) const
virtual size_t getSubstitutionCount(size_t i) const
const Alphabet & alphabet() const
virtual void getSubstitutionCount(size_t i, const SubstitutionRegisterInterface &reg, std::vector< double > &counts) const
std::map< uint, size_t > indexes_
SiteSimulationResult(const SiteSimulationResult &ssr)
virtual size_t getAncestralState(size_t i) const
std::shared_ptr< const ParametrizablePhyloTree > tree_
virtual void getSubstitutionCount(unsigned int nodeId, const SubstitutionRegisterInterface &reg, std::vector< double > &counts) const
virtual VVdouble getSubstitutionVector(const SubstitutionRegisterInterface &reg) const
std::vector< unsigned int > leavesId_
std::shared_ptr< const Alphabet > getAlphabet() const
std::vector< MutationPath > paths_
virtual std::unique_ptr< SiteInterface > getSite() const
virtual const MutationPath & getMutationPath(unsigned int nodeId) const
The SiteSimulator interface. SiteSimulator classes can simulate single sites.
Definition: SiteSimulator.h:24
The SubstitutionRegister interface.
virtual size_t getNumberOfSubstitutionTypes() const =0
Defines the basic types of data flow nodes.
std::vector< Vdouble > VVdouble