/*
* Copyright (C) 2002-2009 Alexei Drummond and Andrew Rambaut
*
* 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.options;
import dr.evolution.datatype.Nucleotides;
import java.util.List;
/**
* @author Alexei Drummond
* @author Andrew Rambaut
* @author Walter Xie
* @deprecated
*/
public class PriorOptions extends ModelOptions {
// Instance variables
private final BeautiOptions options;
public PriorOptions(BeautiOptions options) {
this.options = options;
}
/**
* return a list of parameters that are required
*
* @param params the parameter list
*/
public void selectParameters(List<Parameter> params) { // todo this part needs to be reconsidered carefully !
double growthRateMaximum = 1E6;
// double birthRateMaximum = 1E6;
// double substitutionRateMaximum = 100;
// double logStdevMaximum = 10;
// double substitutionParameterMaximum = 100;
double avgInitialRootHeight = 1;
double avgInitialRate = 1;
// List<ClockModelGroup> clockModelGroupList = options.clockModelOptions.getClockModelGroups(Nucleotides.INSTANCE);
// if (clockModelGroupList.size() > 0) {
//todo assume all Nucleotides data is in one group, it needs to extend to multi-group case
double[] rootAndRate = options.clockModelOptions
.calculateInitialRootHeightAndRate(options.getDataPartitions(Nucleotides.INSTANCE));
avgInitialRootHeight = rootAndRate[0];
avgInitialRate = rootAndRate[1];
// }
// if (options.clockModelOptions.getRateOptionClockModel() == FixRateType.FIX_MEAN
// || options.clockModelOptions.getRateOptionClockModel() == FixRateType.RELATIVE_TO) {
//
// growthRateMaximum = 1E6 * avgInitialRate;
// birthRateMaximum = 1E6 * avgInitialRate;
// }
// if (options.clockModelOptions.getRateOptionClockModel() == FixRateType.FIX_MEAN) {
// double rate = options.clockModelOptions.getMeanRelativeRate();
//
// growthRateMaximum = 1E6 * rate;
// birthRateMaximum = 1E6 * rate;
//
// if (options.hasData()) {
// initialRootHeight = meanDistance / rate;
//
// initialRootHeight = round(initialRootHeight, 2);
// }
//
// } else {
// if (options.maximumTipHeight > 0) {
// initialRootHeight = options.maximumTipHeight * 10.0;
// }
//
// initialRate = round((meanDistance * 0.2) / initialRootHeight, 2);
// }
// double timeScaleMaximum = MathUtils.round(avgInitialRootHeight * 1000.0, 2);
for (Parameter param : params) {
if (!options.hasData()) param.setPriorEdited(false);
if (!param.isPriorEdited()) {
switch (param.scaleType) {
case TIME_SCALE:
// param.lower = Math.max(0.0, param.lower);
// param.upper = Math.min(timeScaleMaximum, param.upper);
if (param.isNodeHeight) { //TODO only affecting "treeModel.rootHeight", need to review
param.truncationLower = options.maximumTipHeight;
param.uniformLower = options.maximumTipHeight;
param.isTruncated = true;
// param.upper = timeScaleMaximum;
// param.initial = avgInitialRootHeight;
if (param.getOptions() instanceof PartitionTreeModel) {
param.initial = ((PartitionTreeModel) param.getOptions()).getInitialRootHeight();
}
} else {
param.initial = avgInitialRootHeight;
}
break;
case T50_SCALE:
// param.lower = Math.max(0.0, param.lower);
//param.upper = Math.min(timeScaleMaximum, param.upper);
param.initial = avgInitialRootHeight / 5.0;
break;
case GROWTH_RATE_SCALE:
param.initial = avgInitialRootHeight / 1000;
// use Laplace
if (param.getBaseName().startsWith("logistic")) {
param.scale = Math.log(1000) / avgInitialRootHeight;
// System.out.println("logistic");
} else {
param.scale = Math.log(10000) / avgInitialRootHeight;
// System.out.println("not logistic");
}
break;
case BIRTH_RATE_SCALE:
// param.lower = Math.max(0.0, param.lower);
//param.upper = Math.min(birthRateMaximum, param.upper);
break;
case SUBSTITUTION_RATE_SCALE:
// param.lower = Math.max(0.0, param.lower);
//param.upper = Math.min(substitutionRateMaximum, param.upper);
param.initial = avgInitialRate;
break;
case LOG_STDEV_SCALE:
// param.lower = Math.max(0.0, param.lower);
//param.upper = Math.min(logStdevMaximum, param.upper);
break;
case SUBSTITUTION_PARAMETER_SCALE:
// param.lower = Math.max(0.0, param.lower);
//param.upper = Math.min(substitutionParameterMaximum, param.upper);
break;
case ROOT_RATE_SCALE:
param.initial = avgInitialRate;
param.shape = 0.5;
param.scale = param.initial / 0.5;
break;
case LOG_VAR_SCALE:
param.initial = avgInitialRate;
param.shape = 2.0;
param.scale = param.initial / 2.0;
break;
}
}
}
// dataReset = false;
}
}