/*
* HierarchicalModelComponentOptions.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.hpm;
import dr.app.beauti.options.*;
import dr.app.beauti.priorsPanel.PriorsPanel;
import dr.app.beauti.types.PriorScaleType;
import dr.app.beauti.types.PriorType;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Marc A. Suchard
* @version $Id$
*/
public class HierarchicalModelComponentOptions implements ComponentOptions {
public HierarchicalModelComponentOptions(final BeautiOptions options) {
this.options = options;
hpmList = new ArrayList<HierarchicalPhylogeneticModel>();
}
public void createParameters(final ModelOptions modelOptions) {
// Do nothing; this is only called at launch
}
public void selectParameters(final ModelOptions modelOptions, final List<Parameter> params) {
// Do nothing because priors are previously defined for idref in operator schedule
// for (HierarchicalPhylogeneticModel hpm : hpmList) {
// if (!hpm.isEmpty()) {
// List<Parameter> hpmParameterList = hpm.getConditionalParameterList();
// params.addAll(hpmParameterList);
// }
// }
}
public void selectStatistics(final ModelOptions modelOptions, final List<Parameter> stats) {
// No statistics
}
public void selectOperators(final ModelOptions modelOptions, final List<Operator> ops) {
// Do nothing because Gibbs operator format do not fit into the current Operator implementation
// for (HierarchicalPhylogeneticModel hpm : hpmList) {
// if (!hpm.isEmpty()) {
// hpm.selectOperators(modelOptions, ops);
// }
// }
}
public boolean modelExists(String name) {
boolean found = false;
for (HierarchicalPhylogeneticModel hpm : hpmList) {
if (hpm.getName().compareTo(name) == 0) {
found = true;
break;
}
}
return found;
}
public HierarchicalPhylogeneticModel addHPM(String text, List<Parameter> parameterList, PriorType priorType) {
List<Parameter> argumentList = new ArrayList<Parameter>();
// TODO May have to remove these constructors
String meanName = text + HierarchicalModelComponentGenerator.MEAN_SUFFIX;
Parameter mean = options.parameterExists(meanName) ?
options.getParameter(meanName) :
options.createParameterNormalPrior(meanName, "Unknown mean of HPM",
PriorScaleType.NONE, 0.0, 0.0, 1.0, 0.0);
argumentList.add(mean);
String precisionName = text + HierarchicalModelComponentGenerator.PRECISION_SUFFIX;
Parameter precision = options.parameterExists(precisionName) ?
options.getParameter(precisionName) :
options.createParameterGammaPrior(precisionName, "Unknown precision of HPM",
PriorScaleType.NONE, 1.0, 0.001, 1000.0, true);
argumentList.add(precision);
HierarchicalPhylogeneticModel hpm = new HierarchicalPhylogeneticModel(text, parameterList, argumentList, priorType);
hpmList.add(hpm);
for (Parameter parameter : parameterList) {
parameter.linkedName = hpm.getName();
}
return hpm;
}
public boolean isHierarchicalParameter(Parameter parameter) {
boolean found = false;
for (HierarchicalPhylogeneticModel hpm : hpmList) {
if (hpm.getArgumentParameterList().contains(parameter)) {
found = true;
break;
}
}
return found;
}
public int removeParameter(PriorsPanel priorsPanel, Parameter parameter, boolean caution) {
HierarchicalPhylogeneticModel toRemove = null;
for (HierarchicalPhylogeneticModel hpm : hpmList) {
List<Parameter> parameterList = hpm.getArgumentParameterList();
if (parameterList.contains(parameter)) {
if (caution && parameterList.size() == 2 && priorsPanel != null) {
String modelName = hpm.getName();
// Throw special warning
int option = JOptionPane.showConfirmDialog(priorsPanel,
"Removing this parameter from HPM '" + modelName + "' will result in only one\n" +
"parameter remaining the HPM. Single parameter models are not recommended.\n" +
"Continue?",
"HPM warning",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (option == JOptionPane.NO_OPTION) {
return JOptionPane.NO_OPTION;
}
}
parameterList.remove(parameter);
}
if (hpm.isEmpty()) {
toRemove = hpm;
}
}
if (toRemove != null) {
hpmList.remove(toRemove);
}
return JOptionPane.YES_OPTION;
}
public List<HierarchicalPhylogeneticModel> getHPMList() {
return hpmList;
}
// public void generateDistributions(final XMLWriter writer) {
// for (HierarchicalPhylogeneticModel hpm : hpmList) {
// hpm.generateDistribution(writer);
// }
// }
final private BeautiOptions options;
final private List<HierarchicalPhylogeneticModel> hpmList;
// public void generatePriors(final XMLWriter writer) {
// for (HierarchicalPhylogeneticModel hpm : hpmList) {
// hpm.generatePriors(writer);
// }
// }
public boolean isEmpty() {
return hpmList.isEmpty();
}
}