mirror of
http://43.156.76.180:8026/YuuMJ/EukPhylo.git
synced 2025-12-28 03:20:25 +08:00
134 lines
4.5 KiB
C++
134 lines
4.5 KiB
C++
#ifndef ___1_2_more_STATE_MODEL
|
|
#define ___1_2_more_STATE_MODEL
|
|
|
|
#include "definitions.h"
|
|
#include "replacementModel.h"
|
|
#include "fromQtoPt.h"
|
|
#include "errorMsg.h"
|
|
#include "matrixUtils.h"
|
|
|
|
class oneTwoMoreModel : public replacementModel {
|
|
public:
|
|
explicit oneTwoMoreModel(const MDOUBLE m1, const MDOUBLE m2,
|
|
const MDOUBLE m3, const MDOUBLE m4,const Vdouble &freq, bool useMarkovLimiting = true);
|
|
oneTwoMoreModel(const oneTwoMoreModel& other) {*this = other;}
|
|
virtual oneTwoMoreModel& operator=(const oneTwoMoreModel &other);
|
|
virtual oneTwoMoreModel* clone() const { return new oneTwoMoreModel(*this); }
|
|
virtual ~oneTwoMoreModel() {}
|
|
const int alphabetSize() const {return 3;} // two states and an intermediate (both states at once)
|
|
const MDOUBLE err_allow_for_pijt_function() const {return 1e-4;} // same as q2p definitions
|
|
const MDOUBLE Pij_t(const int i,const int j, const MDOUBLE d) const ;
|
|
const MDOUBLE dPij_dt(const int i,const int j, const MDOUBLE d) const{
|
|
if (d==0.0)
|
|
return _Q[i][j];
|
|
errorMsg::reportError("Error in oneTwoMoreModel, dPij_dt called");
|
|
return 0.0; // not supposed to be here
|
|
}
|
|
const MDOUBLE d2Pij_dt2(const int i,const int j, const MDOUBLE d) const{
|
|
errorMsg::reportError("Error in oneTwoMoreModel, d2Pij_dt2 called");
|
|
return 0.0; // not supposed to be here
|
|
}
|
|
const MDOUBLE freq(const int i) const {
|
|
if (i >= _freq.size())
|
|
errorMsg::reportError("Error in oneTwoMoreModel::freq, i > size of frequency vector");
|
|
return _freq[i];
|
|
}
|
|
const Vdouble getFreqs() const {return _freq;}
|
|
void setFreq(const Vdouble &freq);
|
|
void setMu1(const MDOUBLE val) ;
|
|
void setMu2(const MDOUBLE val) ;
|
|
void setMu3(const MDOUBLE val) ;
|
|
void setMu4(const MDOUBLE val) ;
|
|
const MDOUBLE getMu1() const {return _gain;}
|
|
const MDOUBLE getMu2() const {return _more;}
|
|
const MDOUBLE getMu3() const {return _less;}
|
|
const MDOUBLE getMu4() const {return _loss;}
|
|
void computeMarkovLimitingDistribution(); // compute P(infinity), which specifies the stationary distribution
|
|
MDOUBLE sumPijQij();
|
|
void norm(const MDOUBLE scale);
|
|
|
|
private:
|
|
virtual void updateQ();
|
|
void setEpsilonForZeroParams();
|
|
bool checkIsNullModel();
|
|
bool pijt_is_prob_value(MDOUBLE val) const;
|
|
bool areFreqsValid(Vdouble freq) const; // tests if frequencies are valid (>0, sum=1)
|
|
|
|
private:
|
|
|
|
MDOUBLE _gain; // _Q[0][1] not _Q[0][2]
|
|
MDOUBLE _more; // _Q[1][2]
|
|
MDOUBLE _less; // _Q[2][1] not _Q[2][0]
|
|
MDOUBLE _loss; // _Q[2][1]
|
|
VVdouble _Q;
|
|
Vdouble _freq;
|
|
bool _useMarkovLimiting; // should the markov limiting distribution be used to estimate the root frequencies
|
|
mutable bool _bQchanged; //indicates whether the Q matrix was changed after the last Pij_t call
|
|
mutable MDOUBLE _lastTcalculated;
|
|
mutable VVdouble _lastPtCalculated;
|
|
|
|
|
|
|
|
};
|
|
|
|
/*class gainLossModel : public replacementModel {
|
|
public:
|
|
explicit gainLossModel(const MDOUBLE m1, const MDOUBLE m2, const Vdouble freq);
|
|
virtual replacementModel* clone() const { return new gainLossModel(*this); }
|
|
gainLossModel(const gainLossModel& other): _q2pt(NULL) {*this = other;}
|
|
virtual gainLossModel& operator=(const gainLossModel &other);
|
|
|
|
virtual ~gainLossModel() {if (_q2pt) delete _q2pt;}
|
|
const int alphabetSize() const {return 3;} // two states and an intermediate (both states at once)
|
|
const MDOUBLE err_allow_for_pijt_function() const {return 1e-4;} // same as q2p definitions
|
|
const MDOUBLE Pij_t(const int i,const int j, const MDOUBLE d) const {
|
|
return _q2pt->Pij_t(i,j,d);
|
|
}
|
|
const MDOUBLE dPij_dt(const int i,const int j, const MDOUBLE d) const{
|
|
return _q2pt->dPij_dt(i,j,d);
|
|
}
|
|
const MDOUBLE d2Pij_dt2(const int i,const int j, const MDOUBLE d) const{
|
|
return _q2pt->d2Pij_dt2(i,j,d);
|
|
}
|
|
const MDOUBLE freq(const int i) const {
|
|
if (i >= _freq.size())
|
|
errorMsg::reportError("Error in gainLossModel::freq, i > size of frequency vector");
|
|
return _freq[i];
|
|
}
|
|
void setMu1(const MDOUBLE val, bool isReversible=true) { _gain = val; updateQ(isReversible);}
|
|
void setMu2(const MDOUBLE val,bool isReversible=true) { _more = val; updateQ(isReversible);}
|
|
const MDOUBLE getMu1() const {return _gain;}
|
|
const MDOUBLE getMu2() const {return _more;}
|
|
|
|
|
|
protected:
|
|
virtual void updateQ(bool isReversible=true);
|
|
virtual void normalizeQ();
|
|
|
|
|
|
protected:
|
|
Vdouble _freq;
|
|
MDOUBLE _gain;
|
|
MDOUBLE _more;
|
|
VVdouble _Q;
|
|
q2pt *_q2pt;
|
|
|
|
|
|
|
|
};
|
|
*/
|
|
/*
|
|
Q is a matrix of the following form:
|
|
|
|
0 1 01
|
|
0 1-m1 0 m1
|
|
1 0 1-m2 m2
|
|
01 (filled in assuming reversibility)
|
|
|
|
i.e. no direct change from state 0 to state 1 is allowed
|
|
*/
|
|
|
|
#endif // ___3STATE_MODEL
|
|
|
|
|