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
|
/*
* modelunrest.cpp
*
* Created on: 24/05/2016
* Author: mdw2
*/
#include "modelunrest.h"
ModelUnrest::ModelUnrest(PhyloTree *tree, string model_params)
: ModelMarkov(tree, false)
{
num_params = getNumRateEntries() - 1;
// model_parameters = new double [num_params];
for (int i=0; i <= num_params; i++) rates[i] = 1.0;
// setRates();
if (model_params != "") {
cout << "WARNING: Supplying model params to constructor not yet properly implemented -- ignored" << endl;
// TODO: parse model_params into model_parameters, then call setRates().
}
name = "UNREST";
full_name = "Unrestricted model (non-reversible)";
ModelMarkov::init(FREQ_ESTIMATE);
}
/* static */ bool ModelUnrest::validModelName(string model_name) {
return (model_name == "UNREST");
}
void ModelUnrest::setBounds(double *lower_bound, double *upper_bound, bool *bound_check) {
int i, ndim = getNDim();
for (i = 1; i <= ndim; i++) {
lower_bound[i] = MIN_RATE;
upper_bound[i] = MAX_RATE;
bound_check[i] = false;
}
}
/*
void ModelUnrest::setRates() {
// For UNREST, parameters are simply the off-diagonal rate matrix entries
// (except [4,3] = rates[11], which is constrained to be 1)
memcpy(rates, model_parameters, num_params*sizeof(double));
rates[num_params]=1;
}
*/
void ModelUnrest::setStateFrequency(double* freq) {
// DOES NOTHING
}
void ModelUnrest::startCheckpoint() {
checkpoint->startStruct("ModelUnrest");
}
void ModelUnrest::saveCheckpoint() {
startCheckpoint();
if (!fixed_parameters)
CKP_ARRAY_SAVE(getNumRateEntries(), rates);
endCheckpoint();
ModelMarkov::saveCheckpoint();
}
void ModelUnrest::restoreCheckpoint() {
ModelMarkov::restoreCheckpoint();
startCheckpoint();
if (!fixed_parameters)
CKP_ARRAY_RESTORE(getNumRateEntries(), rates);
endCheckpoint();
decomposeRateMatrix();
if (phylo_tree)
phylo_tree->clearAllPartialLH();
}
|