/* * PatternWeightIncrementOperator.java * * Copyright (c) 2002-2016 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.operators; import dr.evomodel.treelikelihood.BeagleTreeLikelihood; import dr.inference.operators.GibbsOperator; import dr.inference.operators.SimpleMCMCOperator; import jebl.math.Random; /** * @author Andrew Rambaut */ // Cleaning out untouched stuff. Can be resurrected if needed @Deprecated public class PatternWeightIncrementOperator extends SimpleMCMCOperator implements GibbsOperator { public static final String PATTERN_WEIGHT_INCREMENT_OPERATOR = "patternWeightIncrementOperator"; public PatternWeightIncrementOperator(BeagleTreeLikelihood treeLikelihood, double weight) { this.treeLikelihood = treeLikelihood; setWeight(weight); finalPatternWeights = treeLikelihood.getPatternWeights(); double[] weights = new double[finalPatternWeights.length]; treeLikelihood.setPatternWeights(finalPatternWeights); // treeLikelihood.setPatternWeights(weights); } public double doOperation() { if (allPatternsAdded) { return 0.0; } double[] weights = treeLikelihood.getPatternWeights(); double[] w = new double[weights.length]; double sum = 0.0; for (int i = 0; i < weights.length; i++) { w[i] = finalPatternWeights[i] - weights[i]; sum += w[i]; } // System.out.println("PatternWeightIncrementOperator - Sites remaining: " + sum); if (sum < 1.0) { allPatternsAdded = true; System.out.println("PatternWeightIncrementOperator - All sites added"); return 0.0; } for (int i = 0; i < weights.length; i++) { w[i] /= sum; if (i > 0) { w[i] += w[i - 1]; } } int r = Random.randomChoice(w); weights[r] ++; if (weights[r] > finalPatternWeights[r]) { throw new RuntimeException("Pattern weight exceeding final weight"); } treeLikelihood.setPatternWeights(weights); treeLikelihood.makeDirty(); return 0; } public void reject() { super.reject(); } @Override public int getStepCount() { return 0; } public String getPerformanceSuggestion() { if (Utils.getAcceptanceProbability(this) < getMinimumAcceptanceLevel()) { return ""; } else if (Utils.getAcceptanceProbability(this) > getMaximumAcceptanceLevel()) { return ""; } else { return ""; } } public String getOperatorName() { return PATTERN_WEIGHT_INCREMENT_OPERATOR; } private final BeagleTreeLikelihood treeLikelihood; private final double[] finalPatternWeights; private boolean allPatternsAdded = false; }