/*
* FixedColouredOperator.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 allows parameters upon which the tree colouring proposal distribution depends
* (other than the tree) to change without changing the current colouring. It ensures that the proposal probability of the tree
* colouring is re-computed when necessary.
*
* @author Gerton Lunter
* @author Alexei Drummond
* @version $Id: FixedColouredOperator.java,v 1.1 2006/08/12 12:55:44 gerton Exp $
*/
// Cleaning out untouched stuff. Can be resurrected if needed
@Deprecated
public class FixedColouredOperator implements CoercableMCMCOperator {
public static final double ACCEPTANCE_FACTOR = 0.5;
public static final String FIXED_COLOURED_OPERATOR = "fixedColouredOperator";
private ColourSamplerModel colouringModel;
private MCMCOperator innerOperator;
public FixedColouredOperator(ColourSamplerModel colouringModel, MCMCOperator operator) {
this.colouringModel = colouringModel;
this.innerOperator = operator;
}
public final double operate() {
colouringModel.invalidateProposalProbability();
return innerOperator.operate();
}
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 innerOperator.getTargetAcceptanceProbability();
}
public double getMinimumAcceptanceLevel() {
return innerOperator.getMinimumAcceptanceLevel();
}
public double getMaximumAcceptanceLevel() {
return innerOperator.getMaximumAcceptanceLevel();
}
public double getMinimumGoodAcceptanceLevel() {
return innerOperator.getMinimumGoodAcceptanceLevel();
}
public double getMaximumGoodAcceptanceLevel() {
return innerOperator.getMaximumGoodAcceptanceLevel();
}
// 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 FIXED_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 (or a ColouredOperator) must wrap any operator that changes a parameter upon which the colouring proposal distribution depends";
}
public Class getReturnType() {
return ColouredOperator.class;
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{
new ElementRule(MCMCOperator.class),
new ElementRule(ColourSamplerModel.class)
};
};
}