/* * ContinuousComponentOptions.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.app.beauti.components.continuous; import dr.app.beauti.options.*; import dr.app.beauti.types.OperatorType; import dr.app.beauti.types.PriorScaleType; import dr.evolution.datatype.ContinuousDataType; import no.uib.cipr.matrix.SymmDenseEVD; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Andrew Rambaut * @version $Id$ */ public class ContinuousComponentOptions implements ComponentOptions { public final static String PRECISION_GIBBS_OPERATOR = "precisionGibbsOperator"; public final static String HALF_DF = "halfDF"; public final static String STDEV = "stdev"; public final static String LAMBDA = "lambda"; public final static String RRW_CATEGORIES = "rrwCategories"; final private BeautiOptions options; public ContinuousComponentOptions(final BeautiOptions options) { this.options = options; } public void createParameters(ModelOptions modelOptions) { for (AbstractPartitionData partitionData : options.getDataPartitions(ContinuousDataType.INSTANCE)) { String prefix = partitionData.getName() + "."; if (!modelOptions.parameterExists(prefix + HALF_DF)) { modelOptions.createParameterGammaPrior(prefix + HALF_DF, "half DF of 1 parameter gamma distributed RRW", PriorScaleType.NONE, 0.5, 0.001, 1000.0, false); modelOptions.createScaleOperator(prefix + HALF_DF, modelOptions.demoTuning, 1.0); } if (!modelOptions.parameterExists(prefix + STDEV)) { modelOptions.createParameterExponentialPrior(prefix + STDEV, "standard deviation of lognormal distributed RRW", PriorScaleType.NONE, 1.0 / 3.0, 1.0 / 3.0, 0.0); modelOptions.createScaleOperator(prefix + STDEV, modelOptions.demoTuning, 5.0); } if (!modelOptions.parameterExists(prefix + LAMBDA)) { modelOptions.createParameterBetaDistributionPrior(prefix + LAMBDA, "phylogenetic signal parameter", 0.5, 2.0, 2.0, 0.0); // don't autooptimize modelOptions.createOperator(prefix + LAMBDA, OperatorType.RANDOM_WALK_ABSORBING, 0.3, 10.0, false); } if (!modelOptions.parameterExists(prefix + "swap." + RRW_CATEGORIES)) { modelOptions.createParameter(prefix + RRW_CATEGORIES, "relaxed random walk rate categories"); modelOptions.createOperator(prefix + "swap." + RRW_CATEGORIES, prefix + RRW_CATEGORIES, "Performs a swap of RRW rate categories", prefix + RRW_CATEGORIES, OperatorType.SWAP, 1, 30); modelOptions.createOperator(prefix + "draw." + RRW_CATEGORIES, prefix + RRW_CATEGORIES, "Performs an integer uniform draw of RRW rate categories", prefix + RRW_CATEGORIES, OperatorType.INTEGER_UNIFORM, 1, 10); } } } public void selectOperators(ModelOptions modelOptions, List<Operator> ops) { for (AbstractPartitionData partitionData : options.getDataPartitions(ContinuousDataType.INSTANCE)) { String prefix = partitionData.getName() + "."; if (partitionData.getPartitionSubstitutionModel().getContinuousSubstModelType() == ContinuousSubstModelType.GAMMA_RRW) { ops.add(modelOptions.getOperator(prefix + HALF_DF)); } else if (partitionData.getPartitionSubstitutionModel().getContinuousSubstModelType() == ContinuousSubstModelType.LOGNORMAL_RRW) { ops.add(modelOptions.getOperator(prefix + STDEV)); } if (useLambda(partitionData.getPartitionSubstitutionModel())) { ops.add(modelOptions.getOperator(prefix + LAMBDA)); } if (partitionData.getPartitionSubstitutionModel().getContinuousSubstModelType() != ContinuousSubstModelType.HOMOGENOUS) { ops.add(modelOptions.getOperator(prefix + "swap." + RRW_CATEGORIES)); ops.add(modelOptions.getOperator(prefix + "draw." + RRW_CATEGORIES)); } } } public void selectParameters(ModelOptions modelOptions, List<Parameter> params) { for (AbstractPartitionData partitionData : options.getDataPartitions(ContinuousDataType.INSTANCE)) { if (partitionData.getPartitionSubstitutionModel().getContinuousSubstModelType() == ContinuousSubstModelType.GAMMA_RRW) { params.add(modelOptions.getParameter(partitionData.getName() + "." + HALF_DF)); } else if (partitionData.getPartitionSubstitutionModel().getContinuousSubstModelType() == ContinuousSubstModelType.LOGNORMAL_RRW) { params.add(modelOptions.getParameter(partitionData.getName() + "." + STDEV)); } if (useLambda(partitionData.getPartitionSubstitutionModel())) { params.add(modelOptions.getParameter(partitionData.getName() + "." + LAMBDA)); } } } public void selectStatistics(ModelOptions modelOptions, List<Parameter> stats) { // Do nothing } public BeautiOptions getOptions() { return options; } public boolean useLambda(PartitionSubstitutionModel model) { Boolean useLambda = useLambdaMap.get(model); if (useLambda != null) { return useLambda; } return false; } public void setUseLambda(PartitionSubstitutionModel model, boolean useLambda) { useLambdaMap.put(model, useLambda); } final private Map<PartitionSubstitutionModel, Boolean> useLambdaMap = new HashMap<PartitionSubstitutionModel, Boolean>(); }