use of dr.evomodel.treedatalikelihood.preorder.TipRealizedValuesViaFullConditionalDelegate in project beast-mcmc by beast-dev.
the class ContinuousDataLikelihoodParser method parseXMLObject.
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
Tree treeModel = (Tree) xo.getChild(Tree.class);
MultivariateDiffusionModel diffusionModel = (MultivariateDiffusionModel) xo.getChild(MultivariateDiffusionModel.class);
BranchRateModel rateModel = (BranchRateModel) xo.getChild(BranchRateModel.class);
boolean useTreeLength = xo.getAttribute(USE_TREE_LENGTH, false);
boolean scaleByTime = xo.getAttribute(SCALE_BY_TIME, false);
boolean reciprocalRates = xo.getAttribute(RECIPROCAL_RATES, false);
if (reciprocalRates) {
throw new XMLParseException("Reciprocal rates are not yet implemented.");
}
if (rateModel == null) {
rateModel = new DefaultBranchRateModel();
}
ContinuousRateTransformation rateTransformation = new ContinuousRateTransformation.Default(treeModel, scaleByTime, useTreeLength);
final int dim = diffusionModel.getPrecisionmatrix().length;
String traitName = TreeTraitParserUtilities.DEFAULT_TRAIT_NAME;
List<Integer> missingIndices;
// Parameter sampleMissingParameter = null;
ContinuousTraitPartialsProvider dataModel;
boolean useMissingIndices = true;
boolean integratedProcess = xo.getAttribute(INTEGRATED_PROCESS, false);
if (xo.hasChildNamed(TreeTraitParserUtilities.TRAIT_PARAMETER)) {
TreeTraitParserUtilities utilities = new TreeTraitParserUtilities();
TreeTraitParserUtilities.TraitsAndMissingIndices returnValue = utilities.parseTraitsFromTaxonAttributes(xo, traitName, treeModel, true);
CompoundParameter traitParameter = returnValue.traitParameter;
missingIndices = returnValue.missingIndices;
// sampleMissingParameter = returnValue.sampleMissingParameter;
traitName = returnValue.traitName;
useMissingIndices = returnValue.useMissingIndices;
PrecisionType precisionType = PrecisionType.SCALAR;
if (xo.getAttribute(FORCE_FULL_PRECISION, false) || (useMissingIndices && !xo.getAttribute(FORCE_COMPLETELY_MISSING, false))) {
precisionType = PrecisionType.FULL;
}
if (xo.hasChildNamed(TreeTraitParserUtilities.JITTER)) {
utilities.jitter(xo, diffusionModel.getPrecisionmatrix().length, missingIndices);
}
if (!integratedProcess) {
dataModel = new ContinuousTraitDataModel(traitName, traitParameter, missingIndices, useMissingIndices, dim, precisionType);
} else {
dataModel = new IntegratedProcessTraitDataModel(traitName, traitParameter, missingIndices, useMissingIndices, dim, precisionType);
}
} else {
// Has ContinuousTraitPartialsProvider
dataModel = (ContinuousTraitPartialsProvider) xo.getChild(ContinuousTraitPartialsProvider.class);
}
ConjugateRootTraitPrior rootPrior = ConjugateRootTraitPrior.parseConjugateRootTraitPrior(xo, dataModel.getTraitDimension());
final boolean allowSingular;
if (dataModel instanceof IntegratedFactorAnalysisLikelihood) {
if (traitName == TreeTraitParserUtilities.DEFAULT_TRAIT_NAME) {
traitName = FACTOR_NAME;
}
if (xo.hasAttribute(ALLOW_SINGULAR)) {
allowSingular = xo.getAttribute(ALLOW_SINGULAR, false);
} else {
allowSingular = true;
}
} else if (dataModel instanceof RepeatedMeasuresTraitDataModel) {
traitName = ((RepeatedMeasuresTraitDataModel) dataModel).getTraitName();
allowSingular = xo.getAttribute(ALLOW_SINGULAR, false);
} else {
allowSingular = xo.getAttribute(ALLOW_SINGULAR, false);
}
List<BranchRateModel> driftModels = AbstractMultivariateTraitLikelihood.parseDriftModels(xo, diffusionModel);
List<BranchRateModel> optimalTraitsModels = AbstractMultivariateTraitLikelihood.parseOptimalValuesModels(xo, diffusionModel);
MultivariateElasticModel elasticModel = null;
if (xo.hasChildNamed(STRENGTH_OF_SELECTION_MATRIX)) {
XMLObject cxo = xo.getChild(STRENGTH_OF_SELECTION_MATRIX);
MatrixParameterInterface strengthOfSelectionMatrixParam;
strengthOfSelectionMatrixParam = (MatrixParameterInterface) cxo.getChild(MatrixParameterInterface.class);
if (strengthOfSelectionMatrixParam != null) {
elasticModel = new MultivariateElasticModel(strengthOfSelectionMatrixParam);
}
}
DiffusionProcessDelegate diffusionProcessDelegate;
if ((optimalTraitsModels != null && elasticModel != null) || xo.getAttribute(FORCE_OU, false)) {
if (!integratedProcess) {
diffusionProcessDelegate = new OUDiffusionModelDelegate(treeModel, diffusionModel, optimalTraitsModels, elasticModel);
} else {
diffusionProcessDelegate = new IntegratedOUDiffusionModelDelegate(treeModel, diffusionModel, optimalTraitsModels, elasticModel);
}
} else {
if (driftModels != null || xo.getAttribute(FORCE_DRIFT, false)) {
diffusionProcessDelegate = new DriftDiffusionModelDelegate(treeModel, diffusionModel, driftModels);
} else {
diffusionProcessDelegate = new HomogeneousDiffusionModelDelegate(treeModel, diffusionModel);
}
}
ContinuousDataLikelihoodDelegate delegate = new ContinuousDataLikelihoodDelegate(treeModel, diffusionProcessDelegate, dataModel, rootPrior, rateTransformation, rateModel, allowSingular);
if (dataModel instanceof IntegratedFactorAnalysisLikelihood) {
((IntegratedFactorAnalysisLikelihood) dataModel).setLikelihoodDelegate(delegate);
}
TreeDataLikelihood treeDataLikelihood = new TreeDataLikelihood(delegate, treeModel, rateModel);
boolean reconstructTraits = xo.getAttribute(RECONSTRUCT_TRAITS, true);
if (reconstructTraits) {
// if (missingIndices != null && missingIndices.size() == 0) {
if (!useMissingIndices) {
ProcessSimulationDelegate simulationDelegate = delegate.getPrecisionType() == PrecisionType.SCALAR ? new ConditionalOnTipsRealizedDelegate(traitName, treeModel, diffusionModel, dataModel, rootPrior, rateTransformation, delegate) : new MultivariateConditionalOnTipsRealizedDelegate(traitName, treeModel, diffusionModel, dataModel, rootPrior, rateTransformation, delegate);
TreeTraitProvider traitProvider = new ProcessSimulation(treeDataLikelihood, simulationDelegate);
treeDataLikelihood.addTraits(traitProvider.getTreeTraits());
} else {
ProcessSimulationDelegate simulationDelegate = delegate.getPrecisionType() == PrecisionType.SCALAR ? new ConditionalOnTipsRealizedDelegate(traitName, treeModel, diffusionModel, dataModel, rootPrior, rateTransformation, delegate) : new MultivariateConditionalOnTipsRealizedDelegate(traitName, treeModel, diffusionModel, dataModel, rootPrior, rateTransformation, delegate);
TreeTraitProvider traitProvider = new ProcessSimulation(treeDataLikelihood, simulationDelegate);
treeDataLikelihood.addTraits(traitProvider.getTreeTraits());
ProcessSimulationDelegate fullConditionalDelegate = new TipRealizedValuesViaFullConditionalDelegate(traitName, treeModel, diffusionModel, dataModel, rootPrior, rateTransformation, delegate);
treeDataLikelihood.addTraits(new ProcessSimulation(treeDataLikelihood, fullConditionalDelegate).getTreeTraits());
// String partialTraitName = getPartiallyMissingTraitName(traitName);
//
// ProcessSimulationDelegate partialSimulationDelegate = new ProcessSimulationDelegate.ConditionalOnPartiallyMissingTipsDelegate(partialTraitName,
// treeModel, diffusionModel, dataModel, rootPrior, rateTransformation, rateModel, delegate);
//
// TreeTraitProvider partialTraitProvider = new ProcessSimulation(partialTraitName,
// treeDataLikelihood, partialSimulationDelegate);
//
// treeDataLikelihood.addTraits(partialTraitProvider.getTreeTraits());
}
}
return treeDataLikelihood;
}
Aggregations