use of dr.evomodel.arg.ARGModel.Node in project beast-mcmc by beast-dev.
the class ARGAddRemoveEventOperator method AddOperation.
private double AddOperation() {
double logHastings = 0;
double treeHeight = arg.getNodeHeight(arg.getRoot());
double newBifurcationHeight = Double.POSITIVE_INFINITY;
double newReassortmentHeight = Double.POSITIVE_INFINITY;
double theta = probBelowRoot / treeHeight;
while (newBifurcationHeight > treeHeight && newReassortmentHeight > treeHeight) {
newBifurcationHeight = MathUtils.nextExponential(theta);
newReassortmentHeight = MathUtils.nextExponential(theta);
}
logHastings += theta * (newBifurcationHeight + newReassortmentHeight) - LOG_TWO - 2.0 * Math.log(theta) + Math.log(1 - Math.exp(-2.0 * treeHeight * theta));
if (newBifurcationHeight < newReassortmentHeight) {
double temp = newBifurcationHeight;
newBifurcationHeight = newReassortmentHeight;
newReassortmentHeight = temp;
}
//2. Find the possible re-assortment and bifurcation points.
ArrayList<NodeRef> potentialBifurcationChildren = new ArrayList<NodeRef>();
ArrayList<NodeRef> potentialReassortmentChildren = new ArrayList<NodeRef>();
int totalPotentialBifurcationChildren = findPotentialAttachmentPoints(newBifurcationHeight, potentialBifurcationChildren);
int totalPotentialReassortmentChildren = findPotentialAttachmentPoints(newReassortmentHeight, potentialReassortmentChildren);
assert totalPotentialBifurcationChildren > 0;
assert totalPotentialReassortmentChildren > 0;
logHastings += Math.log((double) potentialBifurcationChildren.size() * potentialReassortmentChildren.size());
//3. Choose your re-assortment location.
Node reassortChild = (Node) potentialReassortmentChildren.get(MathUtils.nextInt(totalPotentialReassortmentChildren));
Node reassortLeftParent = reassortChild.leftParent;
Node reassortRightParent = reassortChild.rightParent;
Node reassortSplitParent = reassortChild.leftParent;
boolean splitReassortLeftParent = true;
if (!reassortChild.bifurcation) {
boolean[] tester = { arg.getNodeHeight(reassortLeftParent) > newReassortmentHeight, arg.getNodeHeight(reassortRightParent) > newReassortmentHeight };
if (tester[0] && tester[1]) {
if (MathUtils.nextBoolean()) {
splitReassortLeftParent = false;
reassortSplitParent = reassortRightParent;
}
// logHastings += LOG_TWO;
} else if (tester[0]) {
//nothing to do, setup above
} else if (tester[1]) {
splitReassortLeftParent = false;
reassortSplitParent = reassortRightParent;
} else {
assert false;
}
}
// if (recParentL != recParentR) {
// boolean[] tester = {arg.getNodeHeight(recParentL) > newReassortmentHeight,
// arg.getNodeHeight(recParentR) > newReassortmentHeight};
//
// if (tester[0] && tester[1]) {
// if (MathUtils.nextBoolean()) {
// recParent = recParentR;
// }
//
// logHastings += LOG_TWO;
// } else if (tester[0]) {
// recParent = recParentL;
// } else {
// recParent = recParentR;
// }
// }
//4. Choose your bifurcation location.
Node bifurcationChild = (Node) potentialBifurcationChildren.get(MathUtils.nextInt(potentialBifurcationChildren.size()));
Node bifurcationLeftParent = bifurcationChild.leftParent;
Node bifurcationRightParent = bifurcationChild.rightParent;
Node bifurcationSplitParent = bifurcationLeftParent;
boolean splitBifurcationLeftParent = true;
if (!bifurcationChild.bifurcation) {
boolean[] tester = { arg.getNodeHeight(bifurcationLeftParent) > newBifurcationHeight, arg.getNodeHeight(bifurcationRightParent) > newBifurcationHeight };
if (tester[0] && tester[1]) {
if (MathUtils.nextBoolean()) {
splitBifurcationLeftParent = false;
bifurcationSplitParent = bifurcationRightParent;
}
// logHastings += LOG_TWO;
} else if (tester[0]) {
//nothing to do
} else if (tester[1]) {
splitBifurcationLeftParent = false;
bifurcationSplitParent = bifurcationRightParent;
} else {
assert false;
}
}
boolean attachNewReassortNewBifurcationThroughLeft = MathUtils.nextBoolean();
//During the delete step, this guy gets cancelled out!
logHastings += LOG_TWO;
// if (sisParentL != sisParentR) {
// boolean[] tester = {arg.getNodeHeight(sisParentL) > newBifurcationHeight,
// arg.getNodeHeight(sisParentR) > newBifurcationHeight};
//
// if (tester[0] && tester[1]) {
// if (MathUtils.nextBoolean()) {
// sisParent = sisParentR;
// }
// logHastings += LOG_TWO;
// } else if (tester[0]) {
// sisParent = sisParentL;
// } else {
// sisParent = sisParentR;
// }
// }
//5. Make the new nodes.
//Note: The height stuff is taken care of below.
Node newReassortment = arg.new Node();
newReassortment.bifurcation = false;
double[] reassortmentValues = { 1.0 };
if (relaxed) {
reassortmentValues = ratePrior.generateValues();
}
// logHastings += ratePrior.getAddHastingsRatio(reassortmentValues);
newReassortment.rateParameter = new Parameter.Default(reassortmentValues);
newReassortment.rateParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0, reassortmentValues.length));
newReassortment.number = arg.getNodeCount() + 1;
Node newBifurcation = arg.new Node();
double[] bifurcationValues = { 1.0 };
if (relaxed) {
bifurcationValues = ratePrior.generateValues();
logHastings += ratePrior.getAddHastingsRatio(bifurcationValues);
}
newBifurcation.rateParameter = new Parameter.Default(bifurcationValues);
newBifurcation.rateParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0, bifurcationValues.length));
newBifurcation.number = arg.getNodeCount();
//6. Begin editing the tree.
arg.beginTreeEdit();
adjustRandomPartitioning();
if (newBifurcationHeight < treeHeight) {
if (bifurcationChild == reassortChild) {
if (bifurcationChild.bifurcation) {
bifurcationChild.leftParent = bifurcationChild.rightParent = newReassortment;
newReassortment.leftChild = newReassortment.rightChild = bifurcationChild;
newReassortment.leftParent = newReassortment.rightParent = newBifurcation;
newBifurcation.leftChild = newBifurcation.rightChild = newReassortment;
newBifurcation.leftParent = newBifurcation.rightParent = bifurcationSplitParent;
if (bifurcationSplitParent.bifurcation) {
if (bifurcationSplitParent.leftChild == bifurcationChild) {
bifurcationSplitParent.leftChild = newBifurcation;
} else {
bifurcationSplitParent.rightChild = newBifurcation;
}
} else {
bifurcationSplitParent.leftChild = bifurcationSplitParent.rightChild = newBifurcation;
}
logHastings -= LOG_TWO;
} else {
if (splitBifurcationLeftParent && splitReassortLeftParent) {
bifurcationChild.leftParent = newReassortment;
newReassortment.leftChild = newReassortment.rightChild = bifurcationChild;
newReassortment.leftParent = newReassortment.rightParent = newBifurcation;
newBifurcation.leftChild = newBifurcation.rightChild = newReassortment;
newBifurcation.leftParent = newBifurcation.rightParent = bifurcationSplitParent;
if (bifurcationSplitParent.bifurcation) {
if (bifurcationSplitParent.leftChild == bifurcationChild) {
bifurcationSplitParent.leftChild = newBifurcation;
} else {
bifurcationSplitParent.rightChild = newBifurcation;
}
} else {
bifurcationSplitParent.leftChild = bifurcationSplitParent.rightChild = newBifurcation;
}
} else if (splitBifurcationLeftParent) {
//bifurcation on left, reassortment on right
bifurcationChild.leftParent = newBifurcation;
bifurcationChild.rightParent = newReassortment;
newBifurcation.leftChild = bifurcationChild;
newBifurcation.rightChild = newReassortment;
newBifurcation.leftParent = newBifurcation.rightParent = bifurcationSplitParent;
if (bifurcationSplitParent.bifurcation) {
if (bifurcationSplitParent.leftChild == bifurcationChild) {
bifurcationSplitParent.leftChild = newBifurcation;
} else {
bifurcationSplitParent.rightChild = newBifurcation;
}
} else {
bifurcationSplitParent.leftChild = bifurcationSplitParent.rightChild = newBifurcation;
}
newReassortment.leftChild = newReassortment.rightChild = bifurcationChild;
if (attachNewReassortNewBifurcationThroughLeft) {
newReassortment.leftParent = newBifurcation;
newReassortment.rightParent = reassortSplitParent;
} else {
newReassortment.rightParent = newBifurcation;
newReassortment.leftParent = reassortSplitParent;
}
if (reassortSplitParent.bifurcation) {
if (reassortSplitParent.leftChild == reassortChild) {
reassortSplitParent.leftChild = newReassortment;
} else {
reassortSplitParent.rightChild = newReassortment;
}
} else {
reassortSplitParent.leftChild = reassortSplitParent.rightChild = newReassortment;
}
} else if (splitReassortLeftParent) {
//bifurcation on right, reassortment on left
bifurcationChild.rightParent = newBifurcation;
bifurcationChild.leftParent = newReassortment;
newBifurcation.leftChild = bifurcationChild;
newBifurcation.rightChild = newReassortment;
newBifurcation.leftParent = newBifurcation.rightParent = bifurcationSplitParent;
if (bifurcationSplitParent.bifurcation) {
if (bifurcationSplitParent.leftChild == bifurcationChild) {
bifurcationSplitParent.leftChild = newBifurcation;
} else {
bifurcationSplitParent.rightChild = newBifurcation;
}
} else {
bifurcationSplitParent.leftChild = bifurcationSplitParent.rightChild = newBifurcation;
}
newReassortment.leftChild = newReassortment.rightChild = bifurcationChild;
if (attachNewReassortNewBifurcationThroughLeft) {
newReassortment.leftParent = newBifurcation;
newReassortment.rightParent = reassortSplitParent;
} else {
newReassortment.rightParent = newBifurcation;
newReassortment.leftParent = reassortSplitParent;
}
if (reassortSplitParent.bifurcation) {
if (reassortSplitParent.leftChild == reassortChild) {
reassortSplitParent.leftChild = newReassortment;
} else {
reassortSplitParent.rightChild = newReassortment;
}
} else {
reassortSplitParent.leftChild = reassortSplitParent.rightChild = newReassortment;
}
} else {
bifurcationChild.rightParent = newReassortment;
newReassortment.leftChild = newReassortment.rightChild = bifurcationChild;
newReassortment.leftParent = newReassortment.rightParent = newBifurcation;
newBifurcation.leftChild = newBifurcation.rightChild = newReassortment;
newBifurcation.leftParent = newBifurcation.rightParent = bifurcationSplitParent;
if (bifurcationSplitParent.bifurcation) {
if (bifurcationSplitParent.leftChild == bifurcationChild) {
bifurcationSplitParent.leftChild = newBifurcation;
} else {
bifurcationSplitParent.rightChild = newBifurcation;
}
} else {
bifurcationSplitParent.leftChild = bifurcationSplitParent.rightChild = newBifurcation;
}
logHastings -= LOG_TWO;
}
}
} else {
newReassortment.leftChild = newReassortment.rightChild = reassortChild;
newBifurcation.leftParent = newBifurcation.rightParent = bifurcationSplitParent;
newBifurcation.leftChild = newReassortment;
newBifurcation.rightChild = bifurcationChild;
if (attachNewReassortNewBifurcationThroughLeft) {
newReassortment.leftParent = newBifurcation;
newReassortment.rightParent = reassortSplitParent;
} else {
newReassortment.rightParent = newBifurcation;
newReassortment.leftParent = reassortSplitParent;
}
if (reassortChild.bifurcation) {
reassortChild.leftParent = reassortChild.rightParent = newReassortment;
} else if (splitReassortLeftParent) {
reassortChild.leftParent = newReassortment;
} else {
reassortChild.rightParent = newReassortment;
}
if (reassortSplitParent.bifurcation) {
if (reassortSplitParent.leftChild == reassortChild) {
reassortSplitParent.leftChild = newReassortment;
} else {
reassortSplitParent.rightChild = newReassortment;
}
} else {
reassortSplitParent.leftChild = reassortSplitParent.rightChild = newReassortment;
}
if (bifurcationChild.bifurcation) {
bifurcationChild.leftParent = bifurcationChild.rightParent = newBifurcation;
} else if (splitBifurcationLeftParent) {
bifurcationChild.leftParent = newBifurcation;
} else {
bifurcationChild.rightParent = newBifurcation;
}
if (bifurcationSplitParent.bifurcation) {
if (bifurcationSplitParent.leftChild == bifurcationChild) {
bifurcationSplitParent.leftChild = newBifurcation;
} else {
bifurcationSplitParent.rightChild = newBifurcation;
}
} else {
bifurcationSplitParent.leftChild = bifurcationSplitParent.rightChild = newBifurcation;
}
}
Parameter partition = new Parameter.Default(arg.getNumberOfPartitions());
drawRandomPartitioning(partition);
newReassortment.partitioning = partition;
newBifurcation.heightParameter = new Parameter.Default(newBifurcationHeight);
newReassortment.heightParameter = new Parameter.Default(newReassortmentHeight);
newBifurcation.setupHeightBounds();
newReassortment.setupHeightBounds();
arg.expandARG(newBifurcation, newReassortment, internalNodeParameters, internalAndRootNodeParameters, nodeRates);
// nodeRates);
assert nodeCheck() : arg.toARGSummary();
} else {
assert newReassortmentHeight < treeHeight;
//New bifurcation takes the place of the old root.
//Much easier to program.
newReassortment.heightParameter = new Parameter.Default(newReassortmentHeight);
newReassortment.setupHeightBounds();
bifurcationChild = newBifurcation;
if (arg.isRoot(reassortSplitParent))
reassortSplitParent = newBifurcation;
Node root = (Node) arg.getRoot();
Node rootLeftChild = root.leftChild;
Node rootRightChild = root.rightChild;
arg.singleRemoveChild(root, rootLeftChild);
arg.singleRemoveChild(root, rootRightChild);
arg.singleAddChild(newBifurcation, rootLeftChild);
arg.singleAddChild(newBifurcation, rootRightChild);
if (reassortSplitParent.isBifurcation())
arg.singleRemoveChild(reassortSplitParent, reassortChild);
else
arg.doubleRemoveChild(reassortSplitParent, reassortChild);
arg.doubleAddChild(newReassortment, reassortChild);
arg.singleAddChild(root, newBifurcation);
Parameter partitioning = new Parameter.Default(arg.getNumberOfPartitions());
drawRandomPartitioning(partitioning);
arg.addChildAsRecombinant(root, reassortSplitParent, newReassortment, partitioning);
if (attachNewReassortNewBifurcationThroughLeft) {
newReassortment.leftParent = root;
newReassortment.rightParent = reassortSplitParent;
} else {
newReassortment.leftParent = reassortSplitParent;
newReassortment.rightParent = root;
}
newBifurcation.heightParameter = new Parameter.Default(root.getHeight());
newBifurcation.setupHeightBounds();
root.heightParameter.setParameterValue(0, newBifurcationHeight);
arg.expandARG(newBifurcation, newReassortment, internalNodeParameters, internalAndRootNodeParameters, nodeRates);
assert nodeCheck();
}
//6a. This is when we do not create a new root.
// if (newBifurcationHeight < treeHeight) {
// newBifurcation.heightParameter = new Parameter.Default(newBifurcationHeight);
// newReassortment.heightParameter = new Parameter.Default(newReassortmentHeight);
// newBifurcation.setupHeightBounds();
// newReassortment.setupHeightBounds();
//
// if (sisParent.bifurcation)
// arg.singleRemoveChild(sisParent, bifurcationChild);
// else
// arg.doubleRemoveChild(sisParent, bifurcationChild);
// if (bifurcationChild != reassortChild) {
// if (recParent.bifurcation)
// arg.singleRemoveChild(recParent, reassortChild);
// else
// arg.doubleRemoveChild(recParent, reassortChild);
// }
// if (sisParent.bifurcation)
// arg.singleAddChild(sisParent, newBifurcation);
// else
// arg.doubleAddChild(sisParent, newBifurcation);
// if (bifurcationChild != reassortChild)
// arg.singleAddChild(newBifurcation, bifurcationChild);
// arg.doubleAddChild(newReassortment, reassortChild);
//
// Parameter partitioning = new Parameter.Default(arg.getNumberOfPartitions());
// drawRandomPartitioning(partitioning);
//
// if (bifurcationChild != reassortChild) {
// arg.addChildAsRecombinant(newBifurcation, recParent,
// newReassortment, partitioning);
// } else {
// arg.addChildAsRecombinant(newBifurcation, newBifurcation,
// newReassortment, partitioning);
// }
// arg.expandARGWithRecombinant(newBifurcation, newReassortment,
// internalNodeParameters,
// internalAndRootNodeParameters,
// nodeRates);
// assert nodeCheck();
//
// //6b. But here we do.
// } else if (newReassortmentHeight < treeHeight) {
//
// newReassortment.heightParameter = new Parameter.Default(newReassortmentHeight);
// newReassortment.setupHeightBounds();
//
// bifurcationChild = newBifurcation;
// if (arg.isRoot(recParent))
// recParent = newBifurcation;
//
//
// Node root = (Node) arg.getRoot();
// Node rootLeftChild = root.leftChild;
// Node rootRightChild = root.rightChild;
//
// arg.singleRemoveChild(root, rootLeftChild);
// arg.singleRemoveChild(root, rootRightChild);
// arg.singleAddChild(newBifurcation, rootLeftChild);
// arg.singleAddChild(newBifurcation, rootRightChild);
//
// if (recParent.isBifurcation())
// arg.singleRemoveChild(recParent, reassortChild);
// else
// arg.doubleRemoveChild(recParent, reassortChild);
//
// arg.doubleAddChild(newReassortment, reassortChild);
// arg.singleAddChild(root, newBifurcation);
//
// Parameter partitioning = new Parameter.Default(arg.getNumberOfPartitions());
// drawRandomPartitioning(partitioning);
//
//
// arg.addChildAsRecombinant(root, recParent, newReassortment, partitioning);
//
// newBifurcation.heightParameter = new Parameter.Default(root.getHeight());
//
// newBifurcation.setupHeightBounds();
// root.heightParameter.setParameterValue(0, newBifurcationHeight);
//
//
// arg.expandARGWithRecombinant(newBifurcation, newReassortment,
// internalNodeParameters, internalAndRootNodeParameters,
// nodeRates);
//
// assert nodeCheck();
//
// } else {
//
// Node root = (Node) arg.getRoot();
// Node rootLeftChild = root.leftChild;
// Node rootRightChild = root.rightChild;
//
// arg.singleRemoveChild(root, rootLeftChild);
// arg.singleRemoveChild(root, rootRightChild);
// arg.singleAddChild(newBifurcation, rootLeftChild);
// arg.singleAddChild(newBifurcation, rootRightChild);
//
// arg.doubleAddChild(newReassortment, newBifurcation);
// arg.doubleAddChild(root, newReassortment);
//
// Parameter partitioning = new Parameter.Default(arg.getNumberOfPartitions());
// drawRandomPartitioning(partitioning);
//
// newReassortment.partitioning = partitioning;
//
// newBifurcation.heightParameter = new Parameter.Default(arg.getNodeHeight(root));
// newReassortment.heightParameter = new Parameter.Default(newReassortmentHeight);
// root.heightParameter.setParameterValueQuietly(0, newBifurcationHeight);
//
// newBifurcation.setupHeightBounds();
// newReassortment.setupHeightBounds();
//
// arg.expandARGWithRecombinant(newBifurcation, newReassortment,
// internalNodeParameters, internalAndRootNodeParameters,
// nodeRates);
//
// assert nodeCheck();
//
// }
arg.pushTreeSizeIncreasedEvent();
arg.endTreeEdit();
try {
arg.checkTreeIsValid();
} catch (MutableTree.InvalidTreeException ite) {
throw new RuntimeException(ite.toString() + "\n" + arg.toString() + "\n" + TreeUtils.uniqueNewick(arg, arg.getRoot()));
}
assert nodeCheck();
logHastings -= Math.log((double) findPotentialNodesToRemove(null));
assert nodeCheck();
assert !Double.isNaN(logHastings) && !Double.isInfinite(logHastings);
if (newReassortment.leftParent.bifurcation && newReassortment.rightParent.bifurcation && newReassortment.leftParent != newReassortment.rightParent) {
logHastings -= LOG_TWO;
}
//You're done, return the hastings ratio!
// System.out.println(logHastings);
logHastings += getPartitionAddHastingsRatio(newReassortment.partitioning.getParameterValues());
return logHastings;
}
use of dr.evomodel.arg.ARGModel.Node in project beast-mcmc by beast-dev.
the class RecombinationPartitionStatistic method getStatisticValue.
public double getStatisticValue(int dim) {
Node x = (Node) arg.getExternalNode(dim);
assert x.taxon.toString().equals(taxaNames[dim]);
boolean c = x.hasReassortmentAncestor();
if (c) {
return 1.0;
}
return 0.0;
}
use of dr.evomodel.arg.ARGModel.Node in project beast-mcmc by beast-dev.
the class ARGRatePrior method calculateLogLikelihood.
private double calculateLogLikelihood() {
double logLike = 0;
for (int i = 0, n = arg.getNodeCount(); i < n; i++) {
Node x = (Node) arg.getNode(i);
if (!x.isRoot() && x.isBifurcation()) {
double[] values = x.rateParameter.getParameterValues();
logLike += calculateLogLikelihood(values);
}
}
return logLike;
}
use of dr.evomodel.arg.ARGModel.Node in project beast-mcmc by beast-dev.
the class ARGReassortmentTimingStatistic method getStatisticValue.
public double getStatisticValue(int dim) {
String max = "((((((<(FC,FN)>,CN),CC),<(FC,FN)>),DC),((EC,EN),DN)),AN);";
if (!arg.toExtendedNewick().equals(max)) {
return Double.NaN;
}
if (dim == 0) {
return arg.getRootHeightParameter().getParameterValue(0);
} else if (dim == 1) {
Node a = (Node) arg.getRoot();
Node aLeft = a.leftChild;
Node aRight = a.rightChild;
return Math.max(aLeft.heightParameter.getParameterValue(0), aRight.heightParameter.getParameterValue(0));
} else if (dim == 2) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("EN")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
} else if (dim == 3) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("DN")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
} else if (dim == 4) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("DC")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
} else if (dim == 5) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("CC")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
} else if (dim == 6) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("FN")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
} else if (dim == 7) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("FN")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.leftParent.heightParameter.getParameterValue(0);
} else if (dim == 8) {
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("CN")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}
int value = 0;
Node a = (Node) arg.getExternalNode(0);
while (!a.taxon.toString().equals("CC")) {
value++;
a = (Node) arg.getExternalNode(value);
}
return a.leftParent.leftParent.heightParameter.getParameterValue(0);
}
use of dr.evomodel.arg.ARGModel.Node in project beast-mcmc by beast-dev.
the class ARGSubtreeSlideOperator method sanityCheck.
public void sanityCheck() {
int len = tree.getNodeCount();
for (int i = 0; i < len; i++) {
Node node = (Node) tree.getNode(i);
if (node.bifurcation) {
boolean equalChild = (node.leftChild == node.rightChild);
if ((equalChild && node.leftChild != null)) {
if (!node.leftChild.bifurcation && ((node.leftChild).leftParent == node))
;
else {
System.err.println("Node " + (i + 1) + " is insane.");
System.err.println(tree.toGraphString());
System.exit(-1);
}
}
} else {
if ((node.leftChild != node.rightChild)) {
System.err.println("Node " + (i + 1) + " is insane.");
System.err.println(tree.toGraphString());
System.exit(-1);
}
}
}
}
Aggregations