/* * Simulator.java * * Copyright (C) 2002-2006 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.evomodel.simulator; import dr.evolution.tree.Tree; import dr.evolution.util.TaxonList; import dr.evomodel.coalescent.CoalescentSimulator; import dr.evomodel.coalescent.DemographicModel; import dr.evomodel.tree.TreeStatistic; import dr.inference.loggers.Logger; import dr.xml.*; import java.util.ArrayList; /** * Runs a coalescent simulator multiple times, logging statistics. * * @version $Id: Simulator.java,v 1.5 2004/10/01 22:40:04 alexei Exp $ * * @author Andrew Rambaut * @author Alexei Drummond */ public class Simulator implements Runnable { public static final String SIMULATOR = "simulator"; public static final String REPEATS = "repeats"; /** the coalescent simulator */ private final DemographicModel demographicModel; private final TaxonList taxa; private final int simulationCount; private final TreeStatistic[] statistics; private final Logger[] loggers; /** * */ public Simulator( int simulationCount, DemographicModel demographicModel, TaxonList taxa, TreeStatistic[] statistics, Logger[] loggers) { this.simulationCount = simulationCount; this.demographicModel = demographicModel; this.taxa = taxa; this.loggers = loggers; this.statistics = statistics; } public void run() { simulate(); } /** * This method actually intiates the MCMC analysis. * @return a sample of the posterior distribution. Note that * the site patterns have been dropped from the site model * to reduce the footprint of the sample. */ public void simulate() { if (loggers != null) { for(Logger logger : loggers) { logger.startLogging(); } } CoalescentSimulator coalSim = new CoalescentSimulator(); timer.start(); for (int i = 0; i < simulationCount; i++) { Tree tree = coalSim.simulateTree(taxa, demographicModel); if (loggers != null) { for(TreeStatistic statistic : statistics) { statistic.setTree(tree); } for(Logger logger : loggers) { logger.log(i); } } } if (loggers != null) { for(Logger logger : loggers) { logger.stopLogging(); } } timer.stop(); } /** @return the timer. */ public dr.util.Timer getTimer() { return timer; } /** @return the length of this analysis.*/ public final int getSimulationCount() { return simulationCount; } /** * @return a tree object based on the XML element it was passed. */ public static XMLObjectParser getXMLObjectParser() { return new AbstractXMLObjectParser() { public String getParserName() { return SIMULATOR; } public Object parseXMLObject(XMLObject xo) throws XMLParseException { DemographicModel demoModel = (DemographicModel)xo.getChild(DemographicModel.class); TaxonList taxa = (TaxonList)xo.getChild(TaxonList.class); ArrayList<TreeStatistic> statistics = new ArrayList<TreeStatistic>(); ArrayList<Logger> loggers = new ArrayList<Logger>(); int repeats = xo.getIntegerAttribute(REPEATS); for (int i = 0; i < xo.getChildCount(); i++) { final Object child = xo.getChild(i); if (child instanceof TreeStatistic) { statistics.add((TreeStatistic) child); } else if (child instanceof Logger) { loggers.add((Logger) child); } } TreeStatistic[] statArray = new TreeStatistic[statistics.size()]; statistics.toArray(statArray); Logger[] logArray = new Logger[loggers.size()]; loggers.toArray(logArray); Simulator simulator = new Simulator(repeats, demoModel, taxa, statArray, logArray); return simulator; } //************************************************************************ // AbstractXMLObjectParser implementation //************************************************************************ public String getParserDescription() { return "A simulator."; } public Class getReturnType() { return Simulator.class; } public XMLSyntaxRule[] getSyntaxRules() { return rules; } private final XMLSyntaxRule[] rules = { AttributeRule.newIntegerRule(REPEATS), new ElementRule(DemographicModel.class), new ElementRule(TaxonList.class), new ElementRule(TreeStatistic.class, 1, Integer.MAX_VALUE), new ElementRule(Logger.class, 1, Integer.MAX_VALUE) }; }; } // PRIVATE TRANSIENTS private final dr.util.Timer timer = new dr.util.Timer(); }