paradiseo/contribution/branches/PhyloMOEA/PhyloMOEA/likelihoodcalculator.h
wcancino 7a8ab5fb50 New openMP development for test cases
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@1489 331e1502-861f-0410-8da2-ba01fb791d7f
2009-03-09 12:52:05 +00:00

156 lines
6 KiB
C++

/***************************************************************************
* Copyright (C) 2005 by Waldo Cancino *
* wcancino@icmc.usp.br *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef LIKELIHOODCALCULATOR_H
#define LIKELIHOODCALCULATOR_H
#include <phylotreeIND.h>
#include <SubsModel.h>
#include <probmatrixcontainer.h>
//#include <pthread.h>
#include <tree_limits.h>
/**
@author Waldo Cancino
*/
class LikelihoodCalculator{
private:
edge bfocus; // branch focus
node a,b; // bfocus vertices (b can be a taxon, a never can be)
double **prob; // point to the probability matrix associated to bfocus
int worker; // for threading, not used really
int nrates;
double *rates_prob; // rate probabilities
double *rates_freq; // rate frequences
double alpha;
node root; // root of the likelihood calculator
node oldroot, invalid_node; // old root and first root when change the focus of the likelihood calculations
// continous allocated memory to store partial results
double *part_memory_internal, // conditional likelihood of internal nodes
*part_memory_taxons, // conditional likelihood of internal nodes, no longer used
*part_memory_factors; // correction factors for nodes
ProbMatrix **part_memory_probmatrix_ptr;
double *site_liks; // site likelihoods
// maps nodes to the continous memory
node_map< double *> Partials; // maps nodes to the corresponding conditional likelihood
node_map<double *> Factors; // maps node to the corresponding correct factors
edge_map<ProbMatrix **> edgeprobmatrix; // maps the edge to the corresponding probability matrixs
// external data
phylotreeIND *tree_ptr; // point to the tree
SubstModel *model; // substitution model
ProbMatrixContainer *probmatrixs; // container of probmatrixs
Sequences *SeqData; // sequence data
bool invalid_partials_taxons; // when received a new tree, the partials are invalidated
// init partials memory
void init_partials();
// prepare the post-order tree iterator
void calculate_partials(node n, node *);
void calculate_partials_omp(node n, node *, int pos);
// calculate conditional likelihood for the node father, from the son conditionals
void calculate_node_partial( node father, node son, edge edgeaux);
void calculate_node_partial_omp( node father, node son, edge edgeaux, int pos);
// likelihood sum of partial for the focus branch
double sum_partials( int pos);
double sum_partials_a_to_taxon( int pos );
double sum_partials_a_to_b_notaxon( int pos);
// sum the site likelihoods
double sum_site_liks();
double sum_site_liks_omp(int pos);
// allocate partial memory
void allocate_partials()
{
long total_pos = SeqData->pattern_count();
int ntaxons = SeqData->num_seqs();
//int nedges = tree_ptr->TREE.number_of_edges();
unsigned long tamanho = (ntaxons-2) * nrates * total_pos * 4;
cout << "tamanho de alocacao:" << tamanho << endl;
part_memory_internal = new double[ tamanho ];
tamanho = (2*ntaxons-2) * total_pos;
cout << "tamanho de alocacao:" << tamanho << endl;
part_memory_factors = new double [ tamanho ];
part_memory_probmatrix_ptr = new ProbMatrix* [ (2*ntaxons-3) * nrates ] ;
site_liks = new double[total_pos];
cout << "allocating done..." << endl;
}
// destroy partial memory
void deallocate_partials()
{
delete [] part_memory_probmatrix_ptr;
delete [] part_memory_internal;
delete [] part_memory_factors;
delete [] site_liks;
}
// deprecated
double sum_partials2( node a, node b, edge edgeaux, int pos, int which=0);
void build_rates_sites();
public:
bool corrected;
LikelihoodCalculator( phylotreeIND &ind, SubstModel &m, ProbMatrixContainer &p, unsigned int nr=1);
LikelihoodCalculator( phylotreeIND &ind, Sequences &Seqs, SubstModel &m, ProbMatrixContainer &p, unsigned int nr=1);
// main functions, prepare the object to calculate likelihood
double calculate_likelihood();
double calculate_likelihood_omp();
double get_site_lik(int i) { return site_liks[i]; }
double calculate_likelihood_exp(edge focus);
double calculate_all_likelihoods();
void update_partials();
void recalculate_cj(node n, node father);
void set_alpha(double a) { alpha = a; build_rates_sites(); };
// change the tree '
void set_tree( phylotreeIND &ind );
double rate_probabilities(int i) { return rates_prob[i]; }
int number_rates() { return nrates; }
~LikelihoodCalculator()
{
//cout << "deallocando partialas" << endl;
deallocate_partials();
//cout << "deallocando o restante" << endl;
if(prob!=NULL) delete[] prob;
if(rates_prob!=NULL) delete [] rates_prob;
if(rates_freq!=NULL) delete [] rates_freq;
}
// change the dataset
void set_data( const Sequences &seqs);
friend void* lik_slave_class(void *);
// frind class to do optimizations
friend class Step_LikOptimizer;
};
#endif