bpp-phyl  2.2.0
RHomogeneousMixedTreeLikelihood.cpp
Go to the documentation of this file.
1 //
2 // File: RHomogeneousMixedTreeLikelihood.h
3 // Created by: David Fournier, Laurent Gueguen
4 //
5 
6 /*
7  Copyright or © or Copr. CNRS, (November 16, 2004)
8 
9  This software is a computer program whose purpose is to provide classes
10  for phylogenetic data analysis.
11 
12  This software is governed by the CeCILL license under French law and
13  abiding by the rules of distribution of free software. You can use,
14  modify and/ or redistribute the software under the terms of the CeCILL
15  license as circulated by CEA, CNRS and INRIA at the following URL
16  "http://www.cecill.info".
17 
18  As a counterpart to the access to the source code and rights to copy,
19  modify and redistribute granted by the license, users are provided only
20  with a limited warranty and the software's author, the holder of the
21  economic rights, and the successive licensors have only limited
22  liability.
23 
24  In this respect, the user's attention is drawn to the risks associated
25  with loading, using, modifying and/or developing or reproducing the
26  software by the user in light of its specific status of free software,
27  that may mean that it is complicated to manipulate, and that also
28  therefore means that it is reserved for developers and experienced
29  professionals having in-depth computer knowledge. Users are therefore
30  encouraged to load and test the software's suitability as regards their
31  requirements in conditions enabling the security of their systems and/or
32  data to be ensured and, more generally, to use and operate it in the
33  same conditions as regards security.
34 
35  The fact that you are presently reading this means that you have had
36  knowledge of the CeCILL license and that you accept its terms.
37  */
38 
40 
41 
42 // From the STL:
43 #include <iostream>
44 
45 #include <math.h>
46 #include "../PatternTools.h"
47 
48 #include <Bpp/Numeric/VectorTools.h>
49 #include <Bpp/App/ApplicationTools.h>
50 
51 using namespace bpp;
52 using namespace std;
53 
55  const Tree& tree,
56  SubstitutionModel* model,
57  DiscreteDistribution* rDist,
58  bool checkRooted,
59  bool verbose,
60  bool usePatterns) throw (Exception) :
61  RHomogeneousTreeLikelihood(tree, model, rDist, checkRooted, verbose, usePatterns),
62  treeLikelihoodsContainer_(),
63  probas_()
64 {
65  MixedSubstitutionModel* mixedmodel;
66  if ((mixedmodel = dynamic_cast<MixedSubstitutionModel*>(model_)) == 0)
67  throw Exception("Bad model: RHomogeneousMixedTreeLikelihood needs a MixedSubstitutionModel.");
68  size_t s = mixedmodel->getNumberOfModels();
69  for (size_t i = 0; i < s; i++)
70  {
71  treeLikelihoodsContainer_.push_back(
72  new RHomogeneousTreeLikelihood(tree, mixedmodel->getNModel(i), rDist, checkRooted, false, usePatterns));
73  probas_.push_back(mixedmodel->getNProbability(i));
74  }
75 }
76 
78  const Tree& tree,
79  const SiteContainer& data,
80  SubstitutionModel* model,
81  DiscreteDistribution* rDist,
82  bool checkRooted,
83  bool verbose,
84  bool usePatterns) throw (Exception) :
85  RHomogeneousTreeLikelihood(tree, model, rDist, checkRooted, verbose, usePatterns),
86  treeLikelihoodsContainer_(),
87  probas_()
88 {
89  MixedSubstitutionModel* mixedmodel;
90 
91  if ((mixedmodel = dynamic_cast<MixedSubstitutionModel*>(model_)) == 0)
92  throw Exception("Bad model: RHomogeneousMixedTreeLikelihood needs a MixedSubstitutionModel.");
93 
94  size_t s = mixedmodel->getNumberOfModels();
95  for (size_t i = 0; i < s; i++)
96  {
97  treeLikelihoodsContainer_.push_back(
98  new RHomogeneousTreeLikelihood(tree, mixedmodel->getNModel(i), rDist, checkRooted, false, usePatterns));
99  probas_.push_back(mixedmodel->getNProbability(i));
100  }
101  setData(data);
102 }
103 
105 {
107 
108  treeLikelihoodsContainer_.clear();
109  probas_.clear();
110 
111  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
112  {
113  treeLikelihoodsContainer_.push_back(lik.treeLikelihoodsContainer_[i]->clone());
114  probas_.push_back(lik.probas_[i]);
115  }
116 
117  return *this;
118 }
119 
120 
123  treeLikelihoodsContainer_(lik.treeLikelihoodsContainer_.size()),
124  probas_(lik.probas_.size())
125 {
126  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
127  {
129  probas_.push_back(lik.probas_[i]);
130  }
131 }
132 
134 {
135  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
136  {
137  delete treeLikelihoodsContainer_[i];
138  }
139 }
140 
141 
143 {
144  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
145  {
146  treeLikelihoodsContainer_[i]->initialize();
147  }
148 
150 }
151 
152 void RHomogeneousMixedTreeLikelihood::setData(const SiteContainer& sites) throw (Exception)
153 {
155 
156  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
157  {
158  treeLikelihoodsContainer_[i]->setData(sites);
159  }
160 }
161 
162 
164 {
165  // checks in the model will change
166  bool modelC=model_->getParameters().testParametersValues(params);
167 
168  applyParameters();
169  MixedSubstitutionModel* mixedmodel = dynamic_cast<MixedSubstitutionModel*>(model_);
170  size_t s = mixedmodel->getNumberOfModels();
171 
172  const SubstitutionModel* pm;
173  for (size_t i = 0; i < s; i++)
174  {
175  ParameterList pl;
176  pm = mixedmodel->getNModel(i);
177  pl.addParameters(pm->getParameters());
178  pl.includeParameters(getParameters());
179 
180  if (modelC){
181  treeLikelihoodsContainer_[i]->setParameters(pl);
182  }
183  else
184  treeLikelihoodsContainer_[i]->matchParametersValues(pl);
185  }
186 
187  probas_ = mixedmodel->getProbabilities();
189 }
190 
192 {
193  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
194  {
195  treeLikelihoodsContainer_[i]->computeTreeLikelihood();
196  }
197 }
198 
199 /******************************************************************************
200  * Likelihoods *
201  ******************************************************************************/
203 {
204  double res = 0;
205 
206  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
207  {
208  res += treeLikelihoodsContainer_[i]->getLikelihoodForASiteForARateClass(site, rateClass) * probas_[i];
209  }
210 
211  return res;
212 }
213 
215 {
216  double x = getLikelihoodForASiteForARateClass(site, rateClass);
217  if (x < 0)
218  x = 0;
219  return log(x);
220 }
221 
222 double RHomogeneousMixedTreeLikelihood::getLikelihoodForASiteForARateClassForAState(size_t site, size_t rateClass, int state) const
223 {
224  double res = 0;
225 
226  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
227  {
228  res += treeLikelihoodsContainer_[i]->getLikelihoodForASiteForARateClassForAState(site, rateClass, state) * probas_[i];
229  }
230 
231  return res;
232 }
233 
234 double RHomogeneousMixedTreeLikelihood::getLogLikelihoodForASiteForARateClassForAState(size_t site, size_t rateClass, int state) const
235 {
236  double x = getLikelihoodForASiteForARateClassForAState(site, rateClass, state);
237  if (x < 0)
238  x = 0;
239  return log(x);
240 }
241 
242 
243 /******************************************************************************
244 * First Order Derivatives *
245 ******************************************************************************/
247 {
248  double res = 0;
249 
250  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
251  {
252  res += treeLikelihoodsContainer_[i]->getDLikelihoodForASiteForARateClass(site, rateClass) * probas_[i];
253  }
254 
255  return res;
256 }
257 
259 {
260  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
261  {
262  treeLikelihoodsContainer_[i]->computeTreeDLikelihood(variable);
263  }
264 }
265 
266 /******************************************************************************
267 * Second Order Derivatives *
268 ******************************************************************************/
270 {
271  double res = 0;
272 
273  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
274  {
275  res += treeLikelihoodsContainer_[i]->getD2LikelihoodForASiteForARateClass(site, rateClass) * probas_[i];
276  }
277 
278  return res;
279 }
280 
281 
283 {
284  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
285  {
286  treeLikelihoodsContainer_[i]->computeTreeD2Likelihood(variable);
287  }
288 }
289 
291 {
292  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
293  {
294  treeLikelihoodsContainer_[i]->computeSubtreeLikelihood(node);
295  }
296 }
297 
299 {
300  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
301  {
302  treeLikelihoodsContainer_[i]->computeDownSubtreeDLikelihood(node);
303  }
304 }
305 
307 {
308  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
309  {
310  treeLikelihoodsContainer_[i]->computeDownSubtreeD2Likelihood(node);
311  }
312 }
313 
314 
316 {
317  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
318  {
319  treeLikelihoodsContainer_[i]->computeAllTransitionProbabilities();
320  }
321 }
322 
323 
325 {
326  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
327  {
328  treeLikelihoodsContainer_[i]->computeTransitionProbabilitiesForNode(node);
329  }
330 }
331 
332 
334 {
335  for (size_t i = 0; i < treeLikelihoodsContainer_.size(); i++)
336  {
337  treeLikelihoodsContainer_[i]->displayLikelihood(node);
338  }
339 }
virtual void computeTreeDLikelihood(const std::string &variable)
double getLikelihoodForASiteForARateClassForAState(size_t site, size_t rateClass, int state) const
Get the likelihood for a site knowing its rate class and its ancestral state.
RHomogeneousMixedTreeLikelihood & operator=(const RHomogeneousMixedTreeLikelihood &lik)
Interface for all substitution models.
virtual double getNProbability(size_t i) const =0
Returns the probability of a specific model from the mixture.
double getLogLikelihoodForASiteForARateClass(size_t site, size_t rateClass) const
Get the logarithm of the likelihood for a site knowing its rate class.
STL namespace.
Interface for phylogenetic tree objects.
Definition: Tree.h:148
std::vector< RHomogeneousTreeLikelihood * > treeLikelihoodsContainer_
This class implement the &#39;traditional&#39; way of computing likelihood for a tree.
RHomogeneousTreeLikelihood & operator=(const RHomogeneousTreeLikelihood &lik)
virtual double getD2LikelihoodForASiteForARateClass(size_t site, size_t rateClass) const
void setData(const SiteContainer &sites)
Set the dataset for which the likelihood must be evaluated.
void computeAllTransitionProbabilities()
This method is used by fireParameterChanged method.
double getLogLikelihoodForASiteForARateClassForAState(size_t site, size_t rateClass, int state) const
Get the logarithm of the likelihood for a site knowing its rate class and its ancestral state...
virtual double getDLikelihoodForASiteForARateClass(size_t site, size_t rateClass) const
void fireParameterChanged(const ParameterList &params)
double getLogLikelihood() const
Get the logarithm of the likelihood for the whole dataset.
virtual const std::vector< double > & getProbabilities() const =0
RHomogeneousMixedTreeLikelihood(const Tree &tree, SubstitutionModel *model, DiscreteDistribution *rDist, bool checkRooted=true, bool verbose=true, bool usePatterns=true)
Build a new RHomogeneousMixedTreeLikelihood object without data.
double getLikelihoodForASiteForARateClass(size_t site, size_t rateClass) const
Get the likelihood for a site knowing its rate class.
The phylogenetic node class.
Definition: Node.h:90
virtual void displayLikelihood(const Node *node)
This method is mainly for debugging purpose.
void computeTransitionProbabilitiesForNode(const Node *node)
This method is used by fireParameterChanged method.
virtual void computeTreeD2Likelihood(const std::string &variable)
virtual size_t getNumberOfModels() const =0
virtual void computeSubtreeLikelihood(const Node *node)
Compute the likelihood for a subtree defined by the Tree::Node node.
virtual void applyParameters()
All parameters are stored in a parameter list. This function apply these parameters to the substituti...
virtual const SubstitutionModel * getNModel(size_t i) const =0
Returns a specific model from the mixture.
void setData(const SiteContainer &sites)
Set the dataset for which the likelihood must be evaluated.
Interface for Substitution models, defined as a mixture of "simple" substitution models.