File: distributionPlusInvariant.cpp

package info (click to toggle)
fastml 3.11-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,772 kB
  • sloc: cpp: 48,522; perl: 3,588; ansic: 819; makefile: 386; python: 83; sh: 55
file content (77 lines) | stat: -rw-r--r-- 1,880 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "definitions.h"
#include "distributionPlusInvariant.h"
#include "errorMsg.h"
#include "logFile.h"

//#define RATE_INVARIANT 1e-10


distributionPlusInvariant::distributionPlusInvariant(
	distribution* pDist, const MDOUBLE pInv, const MDOUBLE globalRate, MDOUBLE rateInvariantVal) 
{
	_globalRate=globalRate;
	_Pinv = pInv;
	_rateInvariantVal = rateInvariantVal;
	_pBaseDist = NULL;
	if (pDist!= NULL)
		_pBaseDist = pDist->clone();
}

distributionPlusInvariant::distributionPlusInvariant() 
{
	_globalRate=1.0;
	_Pinv = 0;
	_rateInvariantVal = 0;
	_pBaseDist = NULL;
}


distributionPlusInvariant& distributionPlusInvariant::operator=(const distributionPlusInvariant& other)
{
	_globalRate = other._globalRate;
	_Pinv = other._Pinv;
	_rateInvariantVal = other._rateInvariantVal;
	_pBaseDist = NULL;	
	if (other._pBaseDist != NULL) 
		_pBaseDist = other._pBaseDist->clone();
	return *this;
}

distributionPlusInvariant::~distributionPlusInvariant()
{
	if (_pBaseDist != NULL)
		delete _pBaseDist;
}


//gets cumulative probability till a certain point
const MDOUBLE distributionPlusInvariant::getCumulativeProb(const MDOUBLE x) const
{
	if (x < 0)
		errorMsg::reportError("x < 0 in distributionPlusInvariant::getCumulativeProb()");
	return (_Pinv + (1 -_Pinv) * _pBaseDist->getCumulativeProb(x));
}


const MDOUBLE distributionPlusInvariant::ratesProb(const int category) const
{
	if (category == categories()-1)
		return _Pinv;
	else
		return (1 - _Pinv) * _pBaseDist->ratesProb(category);
}

const MDOUBLE distributionPlusInvariant::rates(const int category) const
{
	if (category == categories()-1)
		return _rateInvariantVal; //RATE_INVARIANT
	else
		return _pBaseDist->rates(category);
}

const int distributionPlusInvariant::categories() const
{
	return 1 + _pBaseDist->categories(); 
}