package dr.evomodel.MSSD;
import dr.evolution.tree.Tree;
import dr.evomodel.tree.TreeModel;
import dr.inference.model.AbstractModelLikelihood;
import dr.inference.model.Model;
import dr.inference.model.Parameter;
import dr.inference.model.Variable;
/**
* @author Alexander V. Alekseyenko (alexander.alekseyenko@gmail.com)
* @author Marc A. Suchard
*
* Date: Aug 22, 2008
* Time: 3:26:57 PM
*/
public class CTMCScalePrior extends AbstractModelLikelihood {
final private Parameter ctmcScale;
final private TreeModel treeModel;
private double treeLength;
private boolean treeLengthKnown;
public CTMCScalePrior(String name, Parameter ctmcScale, TreeModel treeModel) {
super(name);
this.ctmcScale = ctmcScale;
this.treeModel = treeModel;
addModel(treeModel);
treeLengthKnown = false;
}
private void updateTreeLength() {
treeLength = Tree.Utils.getTreeLength(treeModel, treeModel.getRoot());
}
protected void handleModelChangedEvent(Model model, Object object, int index) {
if (model == treeModel) {
treeLengthKnown = false;
}
}
protected final void handleVariableChangedEvent(Variable variable, int index, Parameter.ChangeType type) {
}
protected void storeState() {
}
protected void restoreState() {
treeLengthKnown = false;
}
protected void acceptState() {
}
public Model getModel() {
return this;
}
public double getLogLikelihood() {
double ab = ctmcScale.getParameterValue(0);
// if (!treeLengthKnown) {
// updateTreeLength();
// treeLengthKnown = true;
// }
double totalTreeTime = Tree.Utils.getTreeLength(treeModel, treeModel.getRoot());
return -0.5 * Math.log(ab) - ab * totalTreeTime; // TODO Change to treeLength and confirm results
}
public void makeDirty() {
treeLengthKnown = false;
}
}