/* * Model.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 dr.util.Identifiable; import java.io.Serializable; import java.util.*; /** * An interface that describes a model of some data. * * @version $Id: Model.java,v 1.6 2005/05/24 20:26:00 rambaut Exp $ * * @author Alexei Drummond * @author Andrew Rambaut */ public interface Model extends Identifiable, Serializable { /** * Adds a listener that is notified when the this model changes. */ void addModelListener(ModelListener listener); /** * Remove a listener previously addeed by addModelListener * @param listener */ void removeModelListener(ModelListener listener); /** * This function should be called to store the state of the * entire model. This makes the model state invalid until either * an acceptModelState or restoreModelState is called. */ void storeModelState(); /** * This function should be called to restore the state of the entire model. */ void restoreModelState(); /** * This function should be called to accept the state of the entire model */ void acceptModelState(); /** * @return whether this model is in a valid state */ boolean isValidState(); /** * @return the total number of sub-models */ int getModelCount(); /** * @return the ith sub-model */ Model getModel(int i); /** * @return the total number of variable in this model */ int getVariableCount(); /** * @return the ith variable */ Variable getVariable(int i); /** * @return the variable of the component with a given name */ //Parameter getParameter(String name); /** * @return the name of this model */ String getModelName(); /** * is the model being listened to by another or by a likelihood? * @return */ boolean isUsed(); /** * A helper class for storing listeners and firing events. */ public class ListenerHelper implements Serializable { public void fireModelChanged(Model model) { fireModelChanged(model, model, -1); } public void fireModelChanged(Model model, Object object) { fireModelChanged(model, object, -1); } public void fireModelChanged(Model model, Object object, int index) { if (listeners != null) { for (ModelListener listener : listeners) { listener.modelChangedEvent(model, object, index); } } } public void addModelListener(ModelListener listener) { if (listeners == null) { listeners = new java.util.ArrayList<ModelListener>(); } listeners.add(listener); } public void removeModelListener(ModelListener listener) { if (listeners != null) { listeners.remove(listener); } } public void addModelRestoreListener(ModelListener listener) { if (restoreListeners == null) { restoreListeners = new java.util.ArrayList<ModelListener>(); } restoreListeners.add(listener); } public void fireModelRestored(Model model) { if (restoreListeners != null) { for (ModelListener listener : restoreListeners ) { listener.modelRestored(model); } } } public int getListenerCount() { return listeners != null ? listeners.size() : 0; } private ArrayList<ModelListener> listeners = null; private ArrayList<ModelListener> restoreListeners = null; } // set to store all created models final static Set<Model> FULL_MODEL_SET = new HashSet<Model>(); final static Set<Model> CONNECTED_MODEL_SET = new HashSet<Model>(); }