package dr.evomodel.tree; import dr.evolution.tree.NodeRef; import dr.evolution.tree.Tree; import dr.evolution.util.Taxon; import dr.math.MathUtils; import dr.inference.operators.MCMCOperator; import dr.inference.operators.OperatorFailedException; import dr.inference.operators.SimpleMCMCOperator; import dr.inference.model.Statistic; import dr.inference.model.StatisticList; import dr.inference.model.AbstractModel; import java.util.Iterator; import java.util.List; import java.util.logging.Logger; /** * @author Andrew Rambaut * @version $Id$ */ public class EmpiricalTreeDistributionModel extends TreeModel { public EmpiricalTreeDistributionModel(final Tree[] trees) { super(EMPIRICAL_TREE_DISTRIBUTION_MODEL); this.trees = trees; drawTreeIndex(); addStatistic(new Statistic.Abstract("Current Tree") { public int getDimension() { return 1; } public double getStatisticValue(int dim) { return currentTreeIndex; } }); } protected void storeState() { storedTreeIndex = currentTreeIndex; } protected void restoreState() { currentTreeIndex = storedTreeIndex; } protected void acceptState() { } public void drawTreeIndex() { // System.err.print("Drawing new tree, (old tree = " + currentTreeIndex); currentTreeIndex = MathUtils.nextInt(trees.length); // System.err.println(") new tree = " + currentTreeIndex); fireModelChanged(new TreeModel.TreeChangedEvent()); } public NodeRef getRoot() { return trees[currentTreeIndex].getRoot(); } public int getNodeCount() { return trees[currentTreeIndex].getNodeCount(); } public NodeRef getNode(final int i) { return trees[currentTreeIndex].getNode(i); } public NodeRef getInternalNode(final int i) { return trees[currentTreeIndex].getInternalNode(i); } public NodeRef getExternalNode(final int i) { return trees[currentTreeIndex].getExternalNode(i); } public int getExternalNodeCount() { return trees[currentTreeIndex].getExternalNodeCount(); } public int getInternalNodeCount() { return trees[currentTreeIndex].getInternalNodeCount(); } public Taxon getNodeTaxon(final NodeRef node) { return trees[currentTreeIndex].getNodeTaxon(node); } public boolean hasNodeHeights() { return trees[currentTreeIndex].hasNodeHeights(); } public double getNodeHeight(final NodeRef node) { return trees[currentTreeIndex].getNodeHeight(node); } public boolean hasBranchLengths() { return trees[currentTreeIndex].hasBranchLengths(); } public double getBranchLength(final NodeRef node) { return trees[currentTreeIndex].getBranchLength(node); } public double getNodeRate(final NodeRef node) { return trees[currentTreeIndex].getNodeRate(node); } public Object getNodeAttribute(final NodeRef node, final String name) { return trees[currentTreeIndex].getNodeAttribute(node, name); } public Iterator getNodeAttributeNames(final NodeRef node) { return trees[currentTreeIndex].getNodeAttributeNames(node); } public boolean isExternal(final NodeRef node) { return trees[currentTreeIndex].isExternal(node); } public boolean isRoot(final NodeRef node) { return trees[currentTreeIndex].isRoot(node); } public int getChildCount(final NodeRef node) { return trees[currentTreeIndex].getChildCount(node); } public NodeRef getChild(final NodeRef node, final int j) { return trees[currentTreeIndex].getChild(node, j); } public NodeRef getParent(final NodeRef node) { return trees[currentTreeIndex].getParent(node); } public Tree getCopy() { return trees[currentTreeIndex].getCopy(); } public int getTaxonCount() { return trees[currentTreeIndex].getTaxonCount(); } public Taxon getTaxon(final int taxonIndex) { return trees[currentTreeIndex].getTaxon(taxonIndex); } public String getTaxonId(final int taxonIndex) { return trees[currentTreeIndex].getTaxonId(taxonIndex); } public int getTaxonIndex(final String id) { return trees[currentTreeIndex].getTaxonIndex(id); } public int getTaxonIndex(final Taxon taxon) { return trees[currentTreeIndex].getTaxonIndex(taxon); } public List<Taxon> asList() { return trees[currentTreeIndex].asList(); } public Object getTaxonAttribute(final int taxonIndex, final String name) { return trees[currentTreeIndex].getTaxonAttribute(taxonIndex, name); } public Iterator<Taxon> iterator() { return trees[currentTreeIndex].iterator(); } public Type getUnits() { return trees[currentTreeIndex].getUnits(); } public void setUnits(final Type units) { trees[currentTreeIndex].setUnits(units); } public void setAttribute(final String name, final Object value) { trees[currentTreeIndex].setAttribute(name, value); } public Object getAttribute(final String name) { return trees[currentTreeIndex].getAttribute(name); } public Iterator<String> getAttributeNames() { return trees[currentTreeIndex].getAttributeNames(); } public static final String EMPIRICAL_TREE_DISTRIBUTION_MODEL = "empiricalTreeDistributionModel"; private final Tree[] trees; private int currentTreeIndex; private int storedTreeIndex; }