/* * ConvergenceListener.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.evomodel.tree; import dr.evolution.tree.Tree; import dr.inference.markovchain.MarkovChain; import dr.inference.markovchain.MarkovChainListener; import dr.inference.model.Model; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; /** * @author shhn001 */ public class ConvergenceListener implements MarkovChainListener { private MarkovChain chain; private final int LOG_EVERY = 10; private String outputFilename; private Convergence convergence; private double threshold; private long startTime; private double distance; /** * */ public ConvergenceListener(MarkovChain chain, String cladeFilename, String outputfile, Tree tree, double threshold) { convergence = new Convergence(tree, LOG_EVERY, cladeFilename); this.chain = chain; this.outputFilename = outputfile; File f = new File(outputFilename); if (f.exists()) { f.delete(); } this.threshold = threshold; startTime = System.currentTimeMillis(); } /* (non-Javadoc) * @see dr.inference.markovchain.MarkovChainListener#bestState(int, dr.inference.model.Model) */ public void bestState(long state, MarkovChain markovChain, Model bestModel) { // do nothing } /* (non-Javadoc) * @see dr.inference.markovchain.MarkovChainListener#currentState(int, dr.inference.model.Model) */ public void currentState(long state, MarkovChain markovChain, Model currentModel) { distance = convergence.log(state); if (distance <= threshold) { chain.pleaseStop(); } } /* (non-Javadoc) * @see dr.inference.markovchain.MarkovChainListener#finished(int) */ public void finished(long chainLength, MarkovChain markovChain) { // write the time used long time = System.currentTimeMillis() - startTime; try { File f = new File(outputFilename); FileWriter fw = new FileWriter(f); BufferedWriter bw = new BufferedWriter(fw); bw.write("" + time); bw.newLine(); bw.write("" + distance); bw.newLine(); bw.write("" + chainLength); bw.newLine(); bw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Time needed:\t\t" + time); System.out.println("Iterations needed:\t" + chainLength); System.out.println("Time per Iteration:\t" + ((double) time) / chainLength); } }