File: distributionPlusCategory.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 (104 lines) | stat: -rw-r--r-- 2,623 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "distributionPlusCategory.h"

distributionPlusCategory::distributionPlusCategory(const distribution* pBaseDist, MDOUBLE baseDistProb,MDOUBLE categoryVal,MDOUBLE globalRate)
:
_globalRate(globalRate),
_categoryVal(categoryVal),
_baseDistProb(baseDistProb)
{
	if (pBaseDist!= NULL)
		_pBaseDist = pBaseDist->clone();
	if ((baseDistProb < 0.0) || (baseDistProb>1.0) ) {
		errorMsg::reportError("illegal baseDistProb in distributionPlusCategory::distributionPlusCategory");
	}
}

distributionPlusCategory::distributionPlusCategory()
:
_globalRate(1.0),
_pBaseDist(NULL),
_categoryVal(1.0),
_baseDistProb(0.0)
{
}

distributionPlusCategory::distributionPlusCategory(const distributionPlusCategory& other)
{
	(*this) = other;
}

distributionPlusCategory& distributionPlusCategory::operator=(const distributionPlusCategory &other)
{
	if (this != &other) 
	{
		_globalRate = other._globalRate;
		if (other._pBaseDist) {
			_pBaseDist = other._pBaseDist->clone();
		}
		else {
			_pBaseDist = NULL;
		}
		_categoryVal = other._categoryVal;
		_baseDistProb = other._baseDistProb;

	}
   return *this;
}

distributionPlusCategory::~distributionPlusCategory()
{
	if (_pBaseDist)
		delete _pBaseDist;
}

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


const MDOUBLE distributionPlusCategory::rates(const int category) const
{
	if (category < _pBaseDist->categories())
		return _pBaseDist->rates(category);
	else 
		return _categoryVal;
}


const MDOUBLE distributionPlusCategory::ratesProb(const int category) const
{
	if (category < _pBaseDist->categories())
		return _pBaseDist->ratesProb(category) * _baseDistProb;
	else 
		return (1-_baseDistProb); //category prob
}


//gets cumulative probability till a certain point
const MDOUBLE distributionPlusCategory::getCumulativeProb(const MDOUBLE x) const
{
	MDOUBLE res(0.0);
	if (x < 0)
		errorMsg::reportError("x < 0 in distributionPlusCategory::getCumulativeProb()");
	if (x > _categoryVal - EPSILON)
		res += 1-_baseDistProb;
	res += _baseDistProb * _pBaseDist->getCumulativeProb(x);
	return res;
}


void distributionPlusCategory::change_number_of_categories(int in_number_of_categories)
{
	_pBaseDist->change_number_of_categories(in_number_of_categories);
}


void distributionPlusCategory::setBaseDistProb(MDOUBLE baseDistProb)
{
	if ((baseDistProb < 0.0) || (baseDistProb > 1.0) ) {
		errorMsg::reportError("illegal baseDistProb in distributionPlusCategory::setBaseDistProb");
	}
	
	_baseDistProb = baseDistProb;
}