/* * ColouredOperator.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.evomodel.operators; import dr.evomodel.coalescent.structure.ColourSamplerModel; import dr.inference.operators.CoercableMCMCOperator; import dr.inference.operators.CoercionMode; import dr.inference.operators.MCMCOperator; import dr.xml.*; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * An operator that wraps another operator and performs a re-colouring of the tree * immediately afterwards. * * @author Alexei Drummond * @version $Id: ColouredOperator.java,v 1.10 2006/07/28 11:41:23 rambaut Exp $ */ // Cleaning out untouched stuff. Can be resurrected if needed @Deprecated public class ColouredOperator implements CoercableMCMCOperator { public static final double ACCEPTANCE_FACTOR = 0.5; public static final String COLOURED_OPERATOR = "colouredOperator"; private final ColourSamplerModel colouringModel; private final MCMCOperator innerOperator; public ColouredOperator(ColourSamplerModel colouringModel, MCMCOperator operator) { this.colouringModel = colouringModel; this.innerOperator = operator; } public final double operate() { double logP = colouringModel.getTreeColouring().getLogProbabilityDensity(); double logO = innerOperator.operate(); colouringModel.resample(); double logQ = colouringModel.getTreeColouring().getLogProbabilityDensity(); return logO + logP - logQ; } public double getCoercableParameter() { if (innerOperator instanceof CoercableMCMCOperator) { return ((CoercableMCMCOperator) innerOperator).getCoercableParameter(); } throw new IllegalArgumentException(); } public void setCoercableParameter(double value) { if (innerOperator instanceof CoercableMCMCOperator) { ((CoercableMCMCOperator) innerOperator).setCoercableParameter(value); return; } throw new IllegalArgumentException(); } public double getRawParameter() { if (innerOperator instanceof CoercableMCMCOperator) { return ((CoercableMCMCOperator) innerOperator).getRawParameter(); } throw new IllegalArgumentException(); } public CoercionMode getMode() { if (innerOperator instanceof CoercableMCMCOperator) { return ((CoercableMCMCOperator) innerOperator).getMode(); } return CoercionMode.COERCION_OFF; } public String getOperatorName() { return "Coloured(" + innerOperator.getOperatorName() + ")"; } public Element createOperatorElement(Document d) { throw new RuntimeException("not implemented"); } // public double getTargetAcceptanceProbability() { return 0.117; } // public double getMinimumAcceptanceLevel() { return 0.01; } // public double getMinimumGoodAcceptanceLevel() { return 0.05; } // public double getMaximumAcceptanceLevel() { return 0.40; } // public double getMaximumGoodAcceptanceLevel() { return 0.30; } public double getTargetAcceptanceProbability() { return innerOperator.getTargetAcceptanceProbability() * ACCEPTANCE_FACTOR; } public double getMinimumAcceptanceLevel() { return innerOperator.getMinimumAcceptanceLevel() * ACCEPTANCE_FACTOR; } public double getMaximumAcceptanceLevel() { return innerOperator.getMaximumAcceptanceLevel() * ACCEPTANCE_FACTOR; } public double getMinimumGoodAcceptanceLevel() { return innerOperator.getMinimumGoodAcceptanceLevel() * ACCEPTANCE_FACTOR; } public double getMaximumGoodAcceptanceLevel() { return innerOperator.getMaximumGoodAcceptanceLevel() * ACCEPTANCE_FACTOR; } // All of this is copied and modified from SimpleMCMCOperator /** * @return the weight of this operator. */ public final double getWeight() { return innerOperator.getWeight(); } /** * Sets the weight of this operator. */ public final void setWeight(double w) { innerOperator.setWeight(w); } public final void accept(double deviation) { innerOperator.accept(deviation); } public final void reject() { innerOperator.reject(); } public final void reset() { innerOperator.reset(); } public final long getCount() { return innerOperator.getCount(); } public final long getAcceptCount() { return innerOperator.getAcceptCount(); } public final void setAcceptCount(long accepted) { innerOperator.setAcceptCount(accepted); } public final long getRejectCount() { return innerOperator.getRejectCount(); } public final void setRejectCount(long rejected) { innerOperator.setRejectCount(rejected); } public final double getMeanDeviation() { return innerOperator.getMeanDeviation(); } public final double getSumDeviation() { return innerOperator.getSumDeviation(); } public double getSpan(boolean reset) { return 0; } public final void setSumDeviation(double sumDeviation) { innerOperator.setSumDeviation(sumDeviation); } public String getPerformanceSuggestion() { return innerOperator.getPerformanceSuggestion(); } public double getMeanEvaluationTime() { return innerOperator.getMeanEvaluationTime(); } public long getTotalEvaluationTime() { return innerOperator.getTotalEvaluationTime(); } public void addEvaluationTime(long time) { innerOperator.addEvaluationTime(time); } public static XMLObjectParser PARSER = new AbstractXMLObjectParser() { public String getParserName() { return COLOURED_OPERATOR; } public Object parseXMLObject(XMLObject xo) { MCMCOperator operator = (MCMCOperator) xo.getChild(MCMCOperator.class); ColourSamplerModel colourSamplerModel = (ColourSamplerModel) xo.getChild(ColourSamplerModel.class); return new ColouredOperator(colourSamplerModel, operator); } //************************************************************************ // AbstractXMLObjectParser implementation //************************************************************************ public String getParserDescription() { return "This element represents an arbitrary operator immediately followed by a re-colouring of the tree"; } public Class getReturnType() { return ColouredOperator.class; } public XMLSyntaxRule[] getSyntaxRules() { return rules; } private final XMLSyntaxRule[] rules = { new ElementRule(MCMCOperator.class), new ElementRule(ColourSamplerModel.class) }; }; }