/*
* CompoundModel.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.model;
import java.util.ArrayList;
import java.util.List;
/**
* An interface that describes a model of some data.
*
* @version $Id: CompoundModel.java,v 1.8 2005/05/24 20:25:59 rambaut Exp $
*
* @author Alexei Drummond
* @author Andrew Rambaut
*/
public class CompoundModel implements Model {
public static final String COMPOUND_MODEL = "compoundModel";
public CompoundModel(String name) { this.name = name; }
public void addModel(Model model) {
if ( !models.contains(model) ) {
models.add(model);
// add all listeners to this model
for( ModelListener ml : listeners ) {
model.addModelListener(ml);
}
}
}
public int getModelCount() {
return models.size();
}
public final Model getModel(int i) {
return models.get(i);
}
public boolean isUsed() {
return listeners.size() > 0;
}
public void addModelListener(ModelListener listener) {
// add listener to all models comprizing this compund model - a change in any one of them
// means the compund model changed
listeners.add(listener);
for( Model m : models ) {
m.addModelListener(listener);
}
//throw new IllegalArgumentException("Compound models don't have listeners");
}
public void removeModelListener(ModelListener listener) {
for( Model m : models ) {
m.removeModelListener(listener);
}
listeners.remove(listener);
// throw new IllegalArgumentException("Compound models don't have listeners");
}
public void storeModelState() {
for (Model model : models) {
model.storeModelState();
}
}
public void restoreModelState() {
for (Model model : models) {
model.restoreModelState();
}
}
public void acceptModelState() {
for (Model model : models) {
model.acceptModelState();
}
}
public boolean isValidState() {
for (int i = 0; i < models.size(); i++) {
if (!getModel(i).isValidState()) {
return false;
}
}
return true;
}
public int getVariableCount() { return 0; }
public Variable getVariable(int index) {
throw new IllegalArgumentException("Compound models don't have parameters");
}
// **************************************************************
// Identifiable IMPLEMENTATION
// **************************************************************
private String id = null;
public void setId(String id) { this.id = id; }
public String getId() { return id; }
/**
* @return the name of this model
*/
public String getModelName() { return name; }
/* AER - do we need a parser?
public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
public String getParserName() { return COMPOUND_MODEL; }
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
CompoundModel compoundModel = new CompoundModel("model");
int childCount = xo.getChildCount();
for (int i = 0; i < childCount; i++) {
Object xoc = xo.getChild(i);
if (xoc instanceof Model) {
compoundModel.addModel((Model)xoc);
}
}
return compoundModel;
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "This element represents a combination of models.";
}
public Class getReturnType() { return CompoundModel.class; }
public XMLSyntaxRule[] getSyntaxRules() { return rules; }
private XMLSyntaxRule[] rules = new XMLSyntaxRule[] {
new OneOrMoreRule(Model.class)
};
};*/
private String name = null;
private final ArrayList<Model> models = new ArrayList<Model>();
private final List<ModelListener> listeners = new ArrayList<ModelListener>();
}