7#include "../alignment/alignment.h"
8#include "../utils/matrix.h"
9#include "../utils/tools.h"
22 void initEqualStateFreqs();
34 void readStateFreq(std::istream& in);
41 void updateMutMatbyMutCount();
49 ModelsBlock* model_block =
nullptr;
60 ModelsBlock* readModelsDefinition(
const char* builtin_models);
67 bool readParametersString(std::string& model_str);
74 void readRates(std::istream& in,
const bool is_reversible);
80 void normalizeQMatrix();
86 virtual void extractRootFreqs(
const Alignment* aln);
97 template <cmaple::StateType num_states>
98 void updateMutationMat();
106 template <cmaple::StateType num_states>
107 bool updateMutationMatEmpiricalTemplate();
189 const static std::map<std::string, SubModel> dna_models_mapping;
194 const static std::map<std::string, SubModel> aa_models_mapping;
206 const cmaple::StateType num_states_ = 0;
211 cmaple::RealNumType* pseu_mutation_count =
nullptr;
216 cmaple::RealNumType* root_freqs =
nullptr;
221 cmaple::RealNumType* mutation_mat =
nullptr;
226 cmaple::RealNumType* root_log_freqs =
nullptr;
231 cmaple::RealNumType* diagonal_mut_mat =
nullptr;
236 cmaple::RealNumType* transposed_mut_mat =
nullptr;
241 cmaple::RealNumType* inverse_root_freqs =
nullptr;
246 cmaple::RealNumType* freqi_freqj_qij =
nullptr;
251 cmaple::RealNumType* freq_j_transposed_ij =
nullptr;
256 cmaple::StateType* row_index =
nullptr;
261 cmaple::RealNumType normalized_factor = 1.0;
266 bool fixed_params =
false;
271 std::string getModelName()
const;
276 std::string exportRootFrequenciesStr();
281 std::string exportQMatrixStr();
288 void extractRefInfo(
const Alignment* aln);
294 virtual void initMutationMat(){}
303 virtual bool updateMutationMatEmpirical() {
313 virtual void updatePesudoCount(
const Alignment* aln,
314 const SeqRegions& regions1,
315 const SeqRegions& regions2);
332template <StateType num_states>
333void cmaple::ModelBase::updateMutationMat() {
335 updateMutMatbyMutCount();
338 RealNumType total_rate = 0;
339 total_rate -= dotProduct<num_states>(root_freqs, diagonal_mut_mat);
342 normalized_factor = total_rate;
345 total_rate = 1.0 / total_rate;
348 RealNumType* mutation_mat_row = mutation_mat;
349 RealNumType* freqi_freqj_qij_row = freqi_freqj_qij;
350 for (StateType i = 0; i < num_states_; ++i, mutation_mat_row += num_states_,
351 freqi_freqj_qij_row += num_states_) {
352 for (StateType j = 0; j < num_states_; ++j) {
353 mutation_mat_row[j] *= total_rate;
358 freqi_freqj_qij_row[j] =
359 root_freqs[i] * inverse_root_freqs[j] * mutation_mat_row[j];
362 freqi_freqj_qij_row[j] = mutation_mat_row[j];
366 transposed_mut_mat[row_index[j] + i] = mutation_mat_row[j];
370 diagonal_mut_mat[i] = mutation_mat_row[i];
374 RealNumType* transposed_mut_mat_row = transposed_mut_mat;
375 RealNumType* freq_j_transposed_ij_row = freq_j_transposed_ij;
377 for (StateType i = 0; i < num_states_; ++i,
378 transposed_mut_mat_row += num_states_,
379 freq_j_transposed_ij_row += num_states_) {
380 setVecByProduct<num_states>(freq_j_transposed_ij_row, root_freqs,
381 transposed_mut_mat_row);
385template <StateType num_states>
386auto cmaple::ModelBase::updateMutationMatEmpiricalTemplate()
392 RealNumType* tmp_mut_mat =
new RealNumType[row_index[num_states_]];
393 memcpy(tmp_mut_mat, mutation_mat,
394 row_index[num_states_] *
sizeof(RealNumType));
397 updateMutationMat<num_states>();
400 const RealNumType change_thresh = 1e-3;
401 RealNumType sum_change = 0;
402 RealNumType* tmp_mut_mat_ptr = tmp_mut_mat;
403 RealNumType* mutation_mat_ptr = mutation_mat;
404 for (StateType i = 0; i < num_states_;
405 ++i, tmp_mut_mat_ptr += num_states_, mutation_mat_ptr += num_states_) {
406 for (StateType j = 0; j < num_states_; ++j) {
407 sum_change += fabs(tmp_mut_mat_ptr[j] - mutation_mat_ptr[j]);
410 sum_change -= fabs(tmp_mut_mat_ptr[i] - mutation_mat_ptr[i]);
413 update = sum_change > change_thresh;
416 delete[] tmp_mut_mat;
Definition modelbase.h:17
SubModel
Definition modelbase.h:116
@ PMB
Definition modelbase.h:142
@ DEFAULT
Default - GTR for DNA, and LG for Protein data.
Definition modelbase.h:166
@ Q_MAMMAL
Definition modelbase.h:135
@ NQ_INSECT
Definition modelbase.h:161
@ MTINV
Definition modelbase.h:150
@ Q_PFAM
Definition modelbase.h:133
@ HIVW
Definition modelbase.h:154
@ MTVER
Definition modelbase.h:149
@ NQ_MAMMAL
Definition modelbase.h:160
@ FLAVI
Definition modelbase.h:152
@ JTT
Definition modelbase.h:132
@ CPREV
Definition modelbase.h:157
@ Q_PLANT
Definition modelbase.h:137
@ LG
Definition modelbase.h:130
@ HIVB
Definition modelbase.h:153
@ Q_YEAST
Definition modelbase.h:138
@ NQ_PLANT
Definition modelbase.h:162
@ FLU
Definition modelbase.h:155
@ VT
Definition modelbase.h:141
@ UNREST
Definition modelbase.h:122
@ MTMAM
Definition modelbase.h:151
@ Q_BIRD
Definition modelbase.h:134
@ DCMUT
Definition modelbase.h:140
@ MTMET
Definition modelbase.h:148
@ NONREV
Definition modelbase.h:129
@ MTART
Definition modelbase.h:146
@ JC
Definition modelbase.h:120
@ NQ_BIRD
Definition modelbase.h:159
@ MTREV
Definition modelbase.h:145
@ BLOSUM62
Definition modelbase.h:143
@ NQ_PFAM
Definition modelbase.h:158
@ GTR20
Definition modelbase.h:128
@ WAG
Definition modelbase.h:131
@ NQ_YEAST
Definition modelbase.h:163
@ GTR
Definition modelbase.h:121
@ Q_INSECT
Definition modelbase.h:136
@ JTTDCMUT
Definition modelbase.h:139
@ DAYHOFF
Definition modelbase.h:144
@ UNKNOWN
Unknown model.
Definition modelbase.h:167
@ MTZOA
Definition modelbase.h:147
@ RTREV
Definition modelbase.h:156
SeqType
Definition seqregion.h:25