package beast.core; import java.util.List; /** * Typically, StateNodes are initialised through their inputs. However, there are initialisation scenarios * too complex for this approach to work. For example, initialisation may require additional information not * provided by the inputs, or several dependent beastObjects need to initialise together, * such as gene trees and a species tree. * <p/> * StateNodeInitialisers take one or more StateNodes as input and initializes them in initStateNodes(). * getInitialisedStateNodes() reports back which nodes has been initialized, but this is currently only used to * check for multiple initialiser for the same object. * <p/> * Like any other isEASTObject, a state initialiser must have an initAndValidate(), which is called once. * getInitialisedStateNodes(), on the other hand, may be called multiple times as its inputs change while the system * tries to establish a valid starting state. initAndValidate is executed in order that the XML parser see objects, * so the inputs are not guaranteed to be initialized at this time. initStateNodes is executed in order of appearance * in MCMC, so inputs requiring initialization are properly initialized when initStateNodes is called. * * @author remco */ public interface StateNodeInitialiser { /** * Called to set up start state. May be called multiple times. * */ void initStateNodes(); /** * @return list of StateNodes that are initialised * This information is used to ensure StateNode are not initialised more than once. * @param stateNodes */ void getInitialisedStateNodes(List<StateNode> stateNodes); }