/* * MultivariateTDiffusionModel.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.continuous; import dr.inference.model.MatrixParameterInterface; import dr.inference.model.Parameter; import dr.math.distributions.TDistribution; import dr.xml.*; /** * @author Marc A. Suchard */ public class MultivariateTDiffusionModel extends MultivariateDiffusionModel { public static final String DIFFUSION_PROCESS = "multivariateTDiffusionModel"; public static final String DIFFUSION_CONSTANT = "precisionParameter"; // public static final String BIAS = "mu"; // public static final String PRECISION_TREE_ATTRIBUTE = "precision"; public static final String DF = "dfParameter"; public MultivariateTDiffusionModel(Parameter df, MatrixParameterInterface precision) { super(); this.dfParameter = df; this.precisionParameter = precision; addVariable(dfParameter); addVariable(precisionParameter); } public double getLogLikelihood(double[] start, double[] stop, double time) { double df = dfParameter.getParameterValue(0); // double scale0 = diffusionPrecisionMatrixParameter.getParameterValue(0,0); // double scale1 = diffusionPrecisionMatrixParameter.getParameterValue(1,1); double scale0 = precisionParameter.getParameterValue(0); double scale1 = precisionParameter.getParameterValue(1); // todo Make this truely multivariate return TDistribution.logPDF(stop[0], start[0], time / scale0, df) + TDistribution.logPDF(stop[1], start[1], time / scale1, df); } // ***************************************************************** // Interface Model // ***************************************************************** // No need to just call super of function, is there? // public void handleModelChangedEvent(Model model, Object object, int index) { // super.handleModelChangedEvent(model, object, index); //To change body of overridden methods use File | Settings | File Templates. // } /* protected final void handleVariableChangedEvent(Parameter parameter, int index, Parameter.ChangeType type) { // if( parameter.getId().compareTo("allTraits")!= 0) // System.err.println("parameter = "+parameter.getId()); super.handleVariableChangedEvent(parameter, index, type); //To change body of overridden methods use File | Settings | File Templates. } */ public MatrixParameterInterface getPrecisionParameter() { return precisionParameter; } protected void calculatePrecisionInfo() { // Nothing to do? } public static XMLObjectParser PARSER = new AbstractXMLObjectParser() { public String getParserName() { return DIFFUSION_PROCESS; } public Object parseXMLObject(XMLObject xo) throws XMLParseException { XMLObject cxo = xo.getChild(DIFFUSION_CONSTANT); MatrixParameterInterface diffusionParam = (MatrixParameterInterface) cxo.getChild(MatrixParameterInterface.class); cxo = xo.getChild(DF); Parameter df = (Parameter) cxo.getChild(Parameter.class); return new MultivariateTDiffusionModel(df, diffusionParam); } //************************************************************************ // AbstractXMLObjectParser implementation //************************************************************************ public String getParserDescription() { return "Describes a multivariate t-distribution diffusion process."; } public XMLSyntaxRule[] getSyntaxRules() { return rules; } private final XMLSyntaxRule[] rules = { new ElementRule(DIFFUSION_CONSTANT, new XMLSyntaxRule[]{new ElementRule(Parameter.class)}), new ElementRule(DF, new XMLSyntaxRule[]{new ElementRule(Parameter.class)}) }; public Class getReturnType() { return MultivariateTDiffusionModel.class; } }; // ************************************************************** // Private instance variables // ************************************************************** private final Parameter dfParameter; private final MatrixParameterInterface precisionParameter; }