From 72af827e193de650431a07491bbde59028bec12a Mon Sep 17 00:00:00 2001 From: xji3 Date: Fri, 27 Oct 2023 18:50:46 -0500 Subject: [PATCH] add parser, still need to check numbers --- .../app/beast/development_parsers.properties | 3 +- .../GMRFDistributionLikelihoodParser.java | 103 ++++++++++++++++++ .../GMRFDistributionLikelihood.java | 15 ++- 3 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 src/dr/inferencexml/distribution/GMRFDistributionLikelihoodParser.java diff --git a/src/dr/app/beast/development_parsers.properties b/src/dr/app/beast/development_parsers.properties index b41fee28de..7213744571 100644 --- a/src/dr/app/beast/development_parsers.properties +++ b/src/dr/app/beast/development_parsers.properties @@ -167,7 +167,8 @@ dr.inferencexml.hmc.LFMFactorPotentialDerivativeParser dr.inferencexml.hmc.LFMLoadingsPotentialDerivativeParser dr.inferencexml.distribution.RowDimensionMultinomialPriorParser dr.inferencexml.distribution.IndependentNormalDistributionModelParser - +dr.inferencexml.distribution.GMRFDistributionLikelihoodParser + # CONSTRAINTS dr.inference.model.EqualityConstraintModel dr.inference.model.EqualityConstrainedParameter diff --git a/src/dr/inferencexml/distribution/GMRFDistributionLikelihoodParser.java b/src/dr/inferencexml/distribution/GMRFDistributionLikelihoodParser.java new file mode 100644 index 0000000000..9a8a71054b --- /dev/null +++ b/src/dr/inferencexml/distribution/GMRFDistributionLikelihoodParser.java @@ -0,0 +1,103 @@ +/* + * GMRFDistributionLikelihoodParser.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.inferencexml.distribution; + +import dr.evomodelxml.coalescent.GMRFSkyrideLikelihoodParser; +import dr.evomodelxml.coalescent.smooth.SmoothSkygridLikelihoodParser; +import dr.inference.model.Parameter; +import dr.math.distributions.GMRFDistributionLikelihood; +import dr.xml.*; + +/** + * @author Marc Suchard + * @author Xiang Ji + */ +public class GMRFDistributionLikelihoodParser extends AbstractXMLObjectParser { + + private static final String POPULATION_PARAMETER = GMRFSkyrideLikelihoodParser.POPULATION_PARAMETER; + private static final String PRECISION_PARAMETER = GMRFSkyrideLikelihoodParser.PRECISION_PARAMETER; + + private static final String SINGLE_BETA = GMRFSkyrideLikelihoodParser.SINGLE_BETA; + private static final String TIME_AWARE_SMOOTHING = GMRFSkyrideLikelihoodParser.TIME_AWARE_SMOOTHING; + + private static final String LAMBDA_PARAMETER = GMRFSkyrideLikelihoodParser.LAMBDA_PARAMETER; + + + public final String NAME = "gmrfDistributionLikelihood"; + + @Override + public Object parseXMLObject(XMLObject xo) throws XMLParseException { + + XMLObject cxo = xo.getChild(POPULATION_PARAMETER); + Parameter popParameter = (Parameter) cxo.getChild(Parameter.class); + + cxo = xo.getChild(PRECISION_PARAMETER); + Parameter precParameter = (Parameter) cxo.getChild(Parameter.class); + + Parameter lambda; + if (xo.getChild(LAMBDA_PARAMETER) != null) { + cxo = xo.getChild(LAMBDA_PARAMETER); + lambda = (Parameter) cxo.getChild(Parameter.class); + } else { + lambda = new Parameter.Default(LAMBDA_PARAMETER, 1.0); + } + + Parameter gridPoints = SmoothSkygridLikelihoodParser.getGridPoints(xo); + return new GMRFDistributionLikelihood(NAME, precParameter, lambda, gridPoints, popParameter); + } + + @Override + public XMLSyntaxRule[] getSyntaxRules() { + return rules; + } + private final XMLSyntaxRule[] rules = { + new ElementRule(POPULATION_PARAMETER, new XMLSyntaxRule[]{ + new ElementRule(Parameter.class) + }), + new ElementRule(PRECISION_PARAMETER, new XMLSyntaxRule[]{ + new ElementRule(Parameter.class) + }), + new ElementRule(SINGLE_BETA, new XMLSyntaxRule[] { + new ElementRule(Parameter.class), + }, true), + AttributeRule.newBooleanRule(TIME_AWARE_SMOOTHING, true), + }; + + @Override + public String getParserDescription() { + return null; + } + + @Override + public Class getReturnType() { + return GMRFDistributionLikelihood.class; + } + + @Override + public String getParserName() { + return NAME; + } +} diff --git a/src/dr/math/distributions/GMRFDistributionLikelihood.java b/src/dr/math/distributions/GMRFDistributionLikelihood.java index 9f07761677..93d2730cde 100644 --- a/src/dr/math/distributions/GMRFDistributionLikelihood.java +++ b/src/dr/math/distributions/GMRFDistributionLikelihood.java @@ -30,6 +30,7 @@ import dr.inference.model.Model; import dr.inference.model.Parameter; import dr.inference.model.Variable; +import dr.xml.Reportable; import no.uib.cipr.matrix.DenseVector; import no.uib.cipr.matrix.SymmTridiagMatrix; @@ -37,7 +38,7 @@ * @author Xiang Ji * @author Marc A. Suchard */ -public class GMRFDistributionLikelihood extends AbstractModelLikelihood implements MultivariateDistribution { +public class GMRFDistributionLikelihood extends AbstractModelLikelihood implements MultivariateDistribution, Reportable { private Parameter precisionParameter; @@ -63,6 +64,7 @@ public GMRFDistributionLikelihood(String name, this.gridParameter = gridParameter; this.fieldLength = popSizeParameter.getDimension(); this.popSizeParameter = popSizeParameter; + setupGMRFWeights(); addVariable(precisionParameter); addVariable(lambdaParameter); addVariable(gridParameter); @@ -143,12 +145,12 @@ private DenseVector getMeanAdjustedGamma(double[] x) { @Override public double[][] getScaleMatrix() { - return new double[0][]; + throw new RuntimeException("Not yet implemented"); } @Override public double[] getMean() { - return new double[0]; + throw new RuntimeException("Not yet implemented"); } @Override @@ -188,11 +190,16 @@ public Model getModel() { @Override public double getLogLikelihood() { - return 0; + return logPdf(popSizeParameter.getParameterValues()); } @Override public void makeDirty() { } + + @Override + public String getReport() { + return "gmrfDistributionLikelihood(" + getLogLikelihood() + ")"; + } }