Skip to content

Commit d54d67b

Browse files
author
JT
committed
better thorney xml requires branch rate model - slight change at root
1 parent a6fba82 commit d54d67b

9 files changed

Lines changed: 86 additions & 192 deletions

File tree

src/dr/app/beast/development_parsers.properties

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,7 @@ dr.evomodelxml.bigfasttree.BigFastTreeModelParser
216216
dr.evomodelxml.treelikelihood.thorneytreelikelihood.ConstrainedBranchLengthProviderParser
217217
dr.evomodelxml.treelikelihood.thorneytreelikelihood.ConstrainedTreeModelParser
218218
dr.evomodelxml.treelikelihood.thorneytreelikelihood.ConstraintsTreeLikelihoodParser
219-
dr.evomodelxml.treelikelihood.thorneytreelikelihood.StrictClockBranchLengthLikelihoodParser
220-
dr.evomodelxml.treelikelihood.thorneytreelikelihood.BranchLengthLikelihoodParser
219+
dr.evomodelxml.treelikelihood.thorneytreelikelihood.PoissonBranchLengthLikelihoodParser
221220
dr.evomodelxml.treelikelihood.thorneytreelikelihood.ThorneyTreeLikelihoodParser
222221
dr.evomodelxml.treelikelihood.thorneytreelikelihood.UniformSubtreePruneRegraftParser
223222
dr.inferencexml.operators.RepeatOperatorParser

src/dr/evomodel/treelikelihood/thorneytreelikelihood/BranchLengthLikelihoodDelegate.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/dr/evomodel/treelikelihood/thorneytreelikelihood/StrictClockBranchLengthLikelihoodDelegate.java renamed to src/dr/evomodel/treelikelihood/thorneytreelikelihood/PoissonBranchLengthLikelihoodDelegate.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
11
package dr.evomodel.treelikelihood.thorneytreelikelihood;
22

3+
import dr.evolution.tree.NodeRef;
4+
import dr.evolution.tree.Tree;
5+
import dr.evomodel.branchratemodel.BranchRateModel;
36
import dr.inference.model.*;
47
import org.apache.commons.math.special.Gamma;
58
import org.apache.commons.math.util.FastMath;
69

7-
public class StrictClockBranchLengthLikelihoodDelegate extends AbstractModel implements ThorneyBranchLengthLikelihoodDelegate {
8-
private final Parameter rate;
10+
public class PoissonBranchLengthLikelihoodDelegate extends AbstractModel implements ThorneyBranchLengthLikelihoodDelegate {
11+
private final BranchRateModel branchRateModel;
912
private final double scale;
1013

11-
public StrictClockBranchLengthLikelihoodDelegate(String name, Parameter rate, double scale){
14+
public PoissonBranchLengthLikelihoodDelegate(String name, BranchRateModel branchRateModel, double scale){
1215
super(name);
13-
this.rate = rate;
14-
addVariable(rate);
16+
this.branchRateModel = branchRateModel;
17+
addModel(branchRateModel);
1518
this.scale = scale;
1619
}
1720

1821
@Override
19-
public double getLogLikelihood(double mutations, double time) {
20-
return SaddlePointExpansion.logPoissonProbability(time*rate.getValue(0)*scale, (int) Math.round(mutations));
22+
public double getLogLikelihood(double mutations, double time, Tree tree , NodeRef node) {
23+
double rate = this.branchRateModel.getBranchRate(tree, node);
24+
return SaddlePointExpansion.logPoissonProbability(time*rate*scale, (int) Math.round(mutations));
2125
}
2226

2327
@Override
2428
protected void handleModelChangedEvent(Model model, Object object, int index) {
25-
29+
fireModelChanged(this,index);
2630
}
2731

2832
/**
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dr.evomodel.treelikelihood.thorneytreelikelihood;
22

3-
import dr.inference.model.Parameter;
3+
import dr.evolution.tree.NodeRef;
4+
import dr.evolution.tree.Tree;
5+
46

57
public interface ThorneyBranchLengthLikelihoodDelegate {
6-
double getLogLikelihood(double observed,double expected);
8+
double getLogLikelihood(double observed, double expected, Tree tree, NodeRef node);
79

810
}

src/dr/evomodel/treelikelihood/thorneytreelikelihood/ThorneyTreeLikelihood.java

Lines changed: 59 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -51,28 +51,18 @@
5151

5252
public class ThorneyTreeLikelihood extends AbstractModelLikelihood implements Reportable {
5353

54-
public ThorneyTreeLikelihood(String name, TreeModel treeModel, BranchLengthProvider branchLengthProvider, ThorneyBranchLengthLikelihoodDelegate thorneyBranchLengthLikelihoodDelegate, BranchRateModel branchRateModel) {
54+
public ThorneyTreeLikelihood(String name, TreeModel treeModel, BranchLengthProvider branchLengthProvider, ThorneyBranchLengthLikelihoodDelegate thorneyBranchLengthLikelihoodDelegate) {
5555

5656
super(name);
5757

5858
this.treeModel = treeModel;
5959
addModel(treeModel);
6060
this.thorneyBranchLengthLikelihoodDelegate = thorneyBranchLengthLikelihoodDelegate;
6161
this.branchLengthProvider = branchLengthProvider;
62-
this.branchRateModel = branchRateModel;
62+
assert thorneyBranchLengthLikelihoodDelegate instanceof Model;
63+
addModel((Model) thorneyBranchLengthLikelihoodDelegate);
6364

64-
if(this.thorneyBranchLengthLikelihoodDelegate instanceof Model & this.branchRateModel!=null){
65-
throw new IllegalArgumentException("Can't use a branch rate likelihood with a rate parameter in combination with a branch rate model. Please remove either the parameter or the model");
66-
}
67-
if(this.branchRateModel!=null){
68-
this.likelihoodDelegate=new branchRateModelLikelihood();
69-
addModel(this.branchRateModel);
70-
}else{
71-
this.likelihoodDelegate=new additiveRateLikelihood();
72-
assert thorneyBranchLengthLikelihoodDelegate instanceof Model;
73-
addModel((Model) thorneyBranchLengthLikelihoodDelegate);
7465

75-
}
7666

7767
updateNode = new boolean[treeModel.getNodeCount()];
7868
Arrays.fill(updateNode, true);
@@ -85,9 +75,7 @@ public ThorneyTreeLikelihood(String name, TreeModel treeModel, BranchLengthProvi
8575
cachedRootChild1 = treeModel.getChild(treeModel.getRoot(), 0).getNumber();
8676
cachedRootChild2 = treeModel.getChild(treeModel.getRoot(), 1).getNumber();
8777
}
88-
public ThorneyTreeLikelihood(String name, TreeModel treeModel, BranchLengthProvider branchLengthProvider, ThorneyBranchLengthLikelihoodDelegate thorneyBranchLengthLikelihoodDelegate) {
89-
this(name, treeModel, branchLengthProvider, thorneyBranchLengthLikelihoodDelegate, null);
90-
}
78+
9179

9280

9381
/**
@@ -201,13 +189,9 @@ protected void handleModelChangedEvent(Model model, Object object, int index) {
201189
} else if (model == thorneyBranchLengthLikelihoodDelegate) {
202190
if (index == -1) {
203191
updateAllNodes();
204-
}
205-
} else if (model == branchRateModel) {
206-
if (index == -1) {
207-
updateAllNodes();
208-
} else {
209-
updateNode(treeModel.getNode(index));
210-
}
192+
} else {
193+
updateNode(treeModel.getNode(index));
194+
}
211195
}
212196
else{
213197
throw new RuntimeException("Unknown componentChangedEvent");
@@ -250,41 +234,36 @@ protected void acceptState() {
250234
// **************************************************************
251235
// Likelihood IMPLEMENTATION
252236
// **************************************************************
253-
// private double calculateLogLikelihood(NodeRef node, int root, int rootChild1, int rootChild2) {
254-
// int nodeIndex = node.getNumber();
255-
//
256-
// if (updateNode[nodeIndex]) {
257-
// double logL;
258-
// if(nodeIndex==root || nodeIndex==rootChild2){
259-
// logL=0;
260-
// }else{
261-
// double time = treeModel.getBranchLength(node);
262-
// double mutations = branchLengthProvider.getBranchLength(treeModel, node);
263-
//
264-
// if (nodeIndex == rootChild1) {
265-
// // sum the branches on both sides of the root
266-
// NodeRef node2 = treeModel.getNode(rootChild2);
267-
// time += treeModel.getBranchLength(node2);
268-
// mutations += branchLengthProvider.getBranchLength(treeModel, node2);
269-
// }
270-
//// gamma.setScale(1.0);
271-
//// branchLogL[i] = gamma.logPdf(x);
272-
// if(this.branchRateModel!=null) {
273-
// logL = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations, time); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
274-
// }else{
275-
// logL = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations, time); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
276-
//
277-
// }
278-
// }
279-
//
280-
// for (int i = 0; i < treeModel.getChildCount(node); i++) {
281-
// logL += calculateLogLikelihood(treeModel.getChild(node, i),root,rootChild1,rootChild2);
282-
// }
283-
// branchLogL[nodeIndex] = logL;
284-
// updateNode[nodeIndex] = false;
285-
// }
286-
// return branchLogL[nodeIndex];
287-
// }
237+
public double calculateLogLikelihood(NodeRef node, int root, int rootChild1, int rootChild2) {
238+
int nodeIndex = node.getNumber();
239+
240+
if (updateNode[nodeIndex]) {
241+
double logL;
242+
if(nodeIndex==root){
243+
logL=0;
244+
}else{
245+
double time = treeModel.getBranchLength(node);
246+
double mutations = branchLengthProvider.getBranchLength(treeModel, node);
247+
248+
// if (nodeIndex == rootChild1) {
249+
// // sum the branches on both sides of the root
250+
// NodeRef node2 = treeModel.getNode(rootChild2);
251+
// time += treeModel.getBranchLength(node2);
252+
// mutations += branchLengthProvider.getBranchLength(treeModel, node2);
253+
// }
254+
// gamma.setScale(1.0);
255+
// branchLogL[i] = gamma.logPdf(x);
256+
logL = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations, time,treeModel,node); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
257+
258+
}
259+
for (int i = 0; i < treeModel.getChildCount(node); i++) {
260+
logL += this.calculateLogLikelihood(treeModel.getChild(node, i),root,rootChild1,rootChild2);
261+
}
262+
branchLogL[nodeIndex] = logL;
263+
updateNode[nodeIndex] = false;
264+
}
265+
return branchLogL[nodeIndex];
266+
}
288267
private double calculateLogLikelihoodLinear() {
289268

290269
// makeDirty();
@@ -301,25 +280,25 @@ private double calculateLogLikelihoodLinear() {
301280

302281
double logL = 0.0;
303282
for (int i = 0; i < treeModel.getNodeCount(); i++) {
304-
if (updateNode[i] && i != root && i != rootChild2) {
283+
if (updateNode[i] && i != root) {
305284
NodeRef node = treeModel.getNode(i);
306285
// skip the root and the second child of the root (this is added to the first child)
307286

308287
double time = treeModel.getBranchLength(node);
309288
double mutations = branchLengthProvider.getBranchLength(treeModel, node);
310289

311-
if (i == rootChild1) {
312-
// sum the branches on both sides of the root
313-
NodeRef node2 = treeModel.getNode(rootChild2);
314-
time += treeModel.getBranchLength(node2);
315-
mutations += branchLengthProvider.getBranchLength(treeModel, node2);
316-
}
317-
// double mean = expected * sequenceLength;
318-
319-
// gamma.setScale(1.0);
320-
// branchLogL[i] = gamma.logPdf(x);
290+
// if (i == rootChild1) {
291+
// // sum the branches on both sides of the root
292+
// NodeRef node2 = treeModel.getNode(rootChild2);
293+
// time += treeModel.getBranchLength(node2);
294+
// mutations += branchLengthProvider.getBranchLength(treeModel, node2);
295+
// }
296+
//// double mean = expected * sequenceLength;
297+
//
298+
//// gamma.setScale(1.0);
299+
//// branchLogL[i] = gamma.logPdf(x);
321300

322-
branchLogL[i] = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations,time);
301+
branchLogL[i] = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations,time,treeModel,node);
323302
//SaddlePointExpansion.logPoissonProbability(mean,(int)x); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
324303
}
325304
updateNode[i] = false;
@@ -337,7 +316,7 @@ private double calculateLogLikelihood() {
337316
updateNode[rootChild1] = updateNode[rootChild1] || updateNode[rootChild2] ;
338317
assert updateNode[root];
339318

340-
return likelihoodDelegate.calculateLogLikelihood(treeModel.getRoot(), root, rootChild1, rootChild2);
319+
return calculateLogLikelihood(treeModel.getRoot(), root, rootChild1, rootChild2);
341320

342321
}
343322
public final Model getModel() {
@@ -375,57 +354,23 @@ public double calculateLogLikelihood(NodeRef node, int root, int rootChild1, int
375354

376355
if (updateNode[nodeIndex]) {
377356
double logL;
378-
if(nodeIndex==root || nodeIndex==rootChild2){
357+
if(nodeIndex==root){
379358
logL=0;
380359
}else{
381360
double time = treeModel.getBranchLength(node);
382361
double mutations = branchLengthProvider.getBranchLength(treeModel, node);
383362

384-
if (nodeIndex == rootChild1) {
385-
// sum the branches on both sides of the root
386-
NodeRef node2 = treeModel.getNode(rootChild2);
387-
time += treeModel.getBranchLength(node2);
388-
mutations += branchLengthProvider.getBranchLength(treeModel, node2);
389-
}
363+
// if (nodeIndex == rootChild1) {
364+
// // sum the branches on both sides of the root
365+
// NodeRef node2 = treeModel.getNode(rootChild2);
366+
// time += treeModel.getBranchLength(node2);
367+
// mutations += branchLengthProvider.getBranchLength(treeModel, node2);
368+
// }
390369
// gamma.setScale(1.0);
391370
// branchLogL[i] = gamma.logPdf(x);
392-
logL = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations, time); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
393-
394-
}
395-
396-
for (int i = 0; i < treeModel.getChildCount(node); i++) {
397-
logL += this.calculateLogLikelihood(treeModel.getChild(node, i),root,rootChild1,rootChild2);
398-
}
399-
branchLogL[nodeIndex] = logL;
400-
updateNode[nodeIndex] = false;
401-
}
402-
return branchLogL[nodeIndex];
403-
}
404-
}
405-
private class branchRateModelLikelihood implements LikelihoodDelegate{
406-
407-
public double calculateLogLikelihood(NodeRef node, int root, int rootChild1, int rootChild2) {
408-
int nodeIndex = node.getNumber();
409-
410-
if (updateNode[nodeIndex]) {
411-
double logL;
412-
if(nodeIndex==root || nodeIndex==rootChild2){
413-
logL=0;
414-
}else{
415-
double expectation = treeModel.getBranchLength(node) * branchRateModel.getBranchRate(treeModel, node);
416-
double mutations = branchLengthProvider.getBranchLength(treeModel, node);
371+
logL = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations, time,treeModel,node); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
417372

418-
if (nodeIndex == rootChild1) {
419-
// sum the branches on both sides of the root
420-
NodeRef node2 = treeModel.getNode(rootChild2);
421-
expectation += treeModel.getBranchLength(node2)*branchRateModel.getBranchRate(treeModel, node2);
422-
mutations += branchLengthProvider.getBranchLength(treeModel, node2);
423-
}
424-
// gamma.setScale(1.0);
425-
// branchLogL[i] = gamma.logPdf(x);
426-
logL = thorneyBranchLengthLikelihoodDelegate.getLogLikelihood(mutations, expectation); //SaddlePointExpansion.logBinomialProbability((int)x, sequenceLength, expected, 1.0D - expected);
427373
}
428-
429374
for (int i = 0; i < treeModel.getChildCount(node); i++) {
430375
logL += this.calculateLogLikelihood(treeModel.getChild(node, i),root,rootChild1,rootChild2);
431376
}
@@ -447,7 +392,7 @@ public double calculateLogLikelihood(NodeRef node, int root, int rootChild1, int
447392

448393
private final ThorneyBranchLengthLikelihoodDelegate thorneyBranchLengthLikelihoodDelegate;
449394
private final BranchLengthProvider branchLengthProvider;
450-
private final BranchRateModel branchRateModel;
395+
451396

452397
//private final double[][] distanceMatrix;
453398

src/dr/evomodelxml/treelikelihood/thorneytreelikelihood/BranchLengthLikelihoodParser.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)