/*
* MCMCOperator.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.inference.operators;
import java.io.Serializable;
/**
* An MCMC operator.
*
* @author Alexei Drummond
* @author Andrew Rambaut
* @version $Id: MCMCOperator.java,v 1.6 2005/06/14 10:40:34 rambaut Exp $
*/
public interface MCMCOperator extends Serializable {
public static final String WEIGHT = "weight";
// This attribute is now called AUTO_OPTIMIZE and is in CoercableMCMCOperator
// public static final String ADAPT = "adapt";
/**
* operates on the model.
*
* @return the hastings ratio of this operator.
*/
double operate();
/**
* Called to tell operator that operation was accepted
*
* @param deviation the log ratio accepted on
*/
void accept(double deviation);
/**
* Called to tell operator that operation was rejected
*/
void reject();
/**
* Reset operator acceptance records.
*/
void reset();
/**
* @return the total number of operations since last call to reset().
*/
long getCount();
/**
* @return the number of acceptances since last call to reset().
*/
long getAcceptCount();
/**
* Set the number of acceptances since last call to reset(). This is used
* to restore the state of the operator
*
* @param acceptCount number of acceptances
*/
void setAcceptCount(long acceptCount);
/**
* @return the number of rejections since last call to reset().
*/
long getRejectCount();
/**
* Set the number of rejections since last call to reset(). This is used
* to restore the state of the operator
*
* @param rejectCount number of rejections
*/
void setRejectCount(long rejectCount);
/**
* @return the mean deviation in log posterior per accepted operations.
*/
double getMeanDeviation();
double getSumDeviation();
//double getSpan(boolean reset);
void setSumDeviation(double sumDeviation);
/**
* @return the optimal acceptance probability
*/
double getTargetAcceptanceProbability();
/**
* @return the minimum acceptable acceptance probability
*/
double getMinimumAcceptanceLevel();
/**
* @return the maximum acceptable acceptance probability
*/
double getMaximumAcceptanceLevel();
/**
* @return the minimum good acceptance probability
*/
double getMinimumGoodAcceptanceLevel();
/**
* @return the maximum good acceptance probability
*/
double getMaximumGoodAcceptanceLevel();
/**
* @return a short descriptive message of the performance of this operator.
*/
String getPerformanceSuggestion();
/**
* @return the relative weight of this operator.
*/
double getWeight();
/**
* sets the weight of this operator. The weight
* determines the proportion of time spent using
* this operator. This is relative to a 'standard'
* operator weight of 1.
*
* @param weight the relative weight of this parameter - should be positive.
*/
void setWeight(double weight);
/**
* @return the name of this operator
*/
String getOperatorName();
double getMeanEvaluationTime();
void addEvaluationTime(long time);
long getTotalEvaluationTime();
class Utils {
public static double getAcceptanceProbability(MCMCOperator op) {
final long accepted = op.getAcceptCount();
final long rejected = op.getRejectCount();
return (double) accepted / (double) (accepted + rejected);
}
public static long getOperationCount(MCMCOperator op) {
return op.getAcceptCount() + op.getRejectCount();
}
}
}