Katzlab dd76ab1d12 Added PTL2 Scripts
These are PTL2 files from Auden 2/9
2023-02-14 11:20:52 -05:00

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