mirror of
http://43.156.76.180:8026/YuuMJ/EukPhylo.git
synced 2025-12-28 01:20:24 +08:00
132 lines
4.5 KiB
C++
132 lines
4.5 KiB
C++
#ifndef ___3STATE_MODEL
|
|
#define ___3STATE_MODEL
|
|
|
|
#include "definitions.h"
|
|
#include "replacementModel.h"
|
|
#include "fromQtoPt.h"
|
|
#include "errorMsg.h"
|
|
#include "matrixUtils.h"
|
|
|
|
class threeStateModel : public replacementModel {
|
|
public:
|
|
explicit threeStateModel(const MDOUBLE m1, const MDOUBLE m2,
|
|
const MDOUBLE m3, const MDOUBLE m4,const Vdouble &freq, bool useMarkovLimiting = true);
|
|
threeStateModel(const threeStateModel& other) {*this = other;}
|
|
virtual threeStateModel& operator=(const threeStateModel &other);
|
|
virtual threeStateModel* clone() const { return new threeStateModel(*this); }
|
|
virtual ~threeStateModel() {}
|
|
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 threeStateModel, 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 threeStateModel, 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 threeStateModel::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 _gainState1;}
|
|
const MDOUBLE getMu2() const {return _gainState0;}
|
|
const MDOUBLE getMu3() const {return _lossState1;}
|
|
const MDOUBLE getMu4() const {return _lossState0;}
|
|
void computeMarkovLimitingDistribution(); // compute P(infinity), which specifies the stationary distribution
|
|
|
|
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 _gainState1; // _Q[0][2]
|
|
MDOUBLE _gainState0; // _Q[1][2]
|
|
MDOUBLE _lossState1; // _Q[2][0]
|
|
MDOUBLE _lossState0; // _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 VVdoubleRep _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) { _gainState1 = val; updateQ(isReversible);}
|
|
void setMu2(const MDOUBLE val,bool isReversible=true) { _gainState0 = val; updateQ(isReversible);}
|
|
const MDOUBLE getMu1() const {return _gainState1;}
|
|
const MDOUBLE getMu2() const {return _gainState0;}
|
|
|
|
|
|
protected:
|
|
virtual void updateQ(bool isReversible=true);
|
|
virtual void normalizeQ();
|
|
|
|
|
|
protected:
|
|
Vdouble _freq;
|
|
MDOUBLE _gainState1;
|
|
MDOUBLE _gainState0;
|
|
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
|
|
|
|
|