-
Notifications
You must be signed in to change notification settings - Fork 3
/
modelset.cpp
127 lines (102 loc) · 3.45 KB
/
modelset.cpp
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 2012 BUI Quang Minh <email>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "modelset.h"
ModelSet::ModelSet(const char *model_name, PhyloTree *tree) : GTRModel(tree)
{
name = full_name = model_name;
name += "+SSF";
full_name += "+site-specific state-frequency model (unpublished)";
}
void ModelSet::computeTransMatrix(double time, double* trans_matrix)
{
for (iterator it = begin(); it != end(); it++) {
(*it)->computeTransMatrix(time, trans_matrix);
trans_matrix += (num_states * num_states);
}
}
void ModelSet::computeTransMatrixFreq(double time, double* trans_matrix)
{
for (iterator it = begin(); it != end(); it++) {
(*it)->computeTransMatrixFreq(time, trans_matrix);
trans_matrix += (num_states * num_states);
}
}
void ModelSet::computeTransDerv(double time, double* trans_matrix, double* trans_derv1, double* trans_derv2)
{
for (iterator it = begin(); it != end(); it++) {
(*it)->computeTransDerv(time, trans_matrix, trans_derv1, trans_derv2);
trans_matrix += (num_states * num_states);
trans_derv1 += (num_states * num_states);
trans_derv2 += (num_states * num_states);
}
}
void ModelSet::computeTransDervFreq(double time, double rate_val, double* trans_matrix, double* trans_derv1, double* trans_derv2)
{
for (iterator it = begin(); it != end(); it++) {
(*it)->computeTransDervFreq(time, rate_val, trans_matrix, trans_derv1, trans_derv2);
trans_matrix += (num_states * num_states);
trans_derv1 += (num_states * num_states);
trans_derv2 += (num_states * num_states);
}
}
int ModelSet::getPtnModelID(int ptn)
{
assert(ptn >= 0 && ptn < pattern_model_map.size());
assert(pattern_model_map[ptn] >= 0 && pattern_model_map[ptn] < size());
return pattern_model_map[ptn];
}
double ModelSet::computeTrans(double time, int model_id, int state1, int state2) {
return at(model_id)->computeTrans(time, state1, state2);
}
double ModelSet::computeTrans(double time, int model_id, int state1, int state2, double &derv1, double &derv2) {
return at(model_id)->computeTrans(time, state1, state2, derv1, derv2);
}
int ModelSet::getNDim()
{
assert(size());
return front()->getNDim();
}
void ModelSet::writeInfo(ostream& out)
{
assert(size());
if (verbose_mode >= VB_MED) {
int i = 1;
for (iterator it = begin(); it != end(); it++, i++) {
out << "Partition " << i << ":" << endl;
(*it)->writeInfo(out);
}
} else {
front()->writeInfo(out);
}
}
void ModelSet::decomposeRateMatrix()
{
for (iterator it = begin(); it != end(); it++)
(*it)->decomposeRateMatrix();
}
void ModelSet::getVariables(double* variables)
{
assert(size());
for (iterator it = begin(); it != end(); it++)
(*it)->getVariables(variables);
}
void ModelSet::setVariables(double* variables)
{
assert(size());
front()->setVariables(variables);
}
ModelSet::~ModelSet()
{
}