Revision: 6749
Author: msuchard
Date: Thu Apr 23 23:20:13 2015 UTC
Log: Swap all parameter values for tipDate swaps
https://code.google.com/p/beast-mcmc/source/detail?r=6749
Added:
/trunk/src/dr/inference/operators/SwapParameterOperator.java
=======================================
--- /dev/null
+++ /trunk/src/dr/inference/operators/SwapParameterOperator.java Thu Apr 23
23:20:13 2015 UTC
@@ -0,0 +1,108 @@
+/*
+ * SwapParameterOperator.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.operators;
+
+import dr.inference.model.Parameter;
+import dr.inferencexml.operators.SwapOperatorParser;
+import dr.math.MathUtils;
+
+import java.util.List;
+
+/**
+ * A generic operator swapping all values (dimensions) between two or more
parameters
+ *
+ * @author Marc A. Suchard
+ */
+public class SwapParameterOperator extends SimpleMCMCOperator {
+
+ public SwapParameterOperator(List<Parameter> parameterList, double
weight) {
+ this.parameterList = parameterList;
+
+ if (parameterList.size() < 2) {
+ throw new IllegalArgumentException("More than 1 parameter is
needed");
+ }
+
+ int size = parameterList.get(0).getDimension();
+ for (int i = 1; i < parameterList.size(); ++i) {
+ if (size != parameterList.get(i).getDimension()) {
+ throw new IllegalArgumentException("All parameters most be
the same size");
+ }
+ }
+
+ setWeight(weight);
+ }
+
+
+ /**
+ * swap all values in two random parameters.
+ */
+ public final double doOperation() {
+
+ int i = MathUtils.nextInt(parameterList.size());
+ int j = i;
+
+ while (j == i) {
+ j = MathUtils.nextInt(parameterList.size());
+ }
+
+ Parameter a = parameterList.get(i);
+ Parameter b = parameterList.get(j);
+
+ for (int k = 0; k < a.getDimension(); ++k) {
+ double tmp = a.getParameterValue(k);
+ a.setParameterValueQuietly(k, b.getParameterValue(k));
+ b.setParameterValueQuietly(k, tmp);
+ }
+
+ a.fireParameterChangedEvent();
+ b.fireParameterChangedEvent();
+
+ return 0.0;
+ }
+
+ private String getParameterNames() {
+ if (parameterNames == null) {
+ StringBuilder sb = new StringBuilder();
+ for (Parameter p : parameterList) {
+ sb.append(p.getParameterName()).append(".");
+ }
+ }
+ return parameterNames;
+ }
+
+ public String getOperatorName() {
+ return SwapOperatorParser.SWAP_OPERATOR + "(" +
getParameterNames() + "swap)";
+ }
+
+ public String getPerformanceSuggestion() {
+ return "No suggestions";
+ }
+
+ //PRIVATE STUFF
+
+ private final List<Parameter> parameterList;
+ private String parameterNames = null;
+}