package dr.inferencexml.operators; import dr.inference.distribution.DeterminentalPointProcessPrior; import dr.inference.distribution.RowDimensionPoissonPrior; import dr.inference.model.AbstractModelLikelihood; import dr.inference.model.AdaptableSizeFastMatrixParameter; import dr.inference.model.LatentFactorModel; import dr.inference.model.Likelihood; import dr.inference.operators.*; import dr.xml.*; /** * Created by maxryandolinskytolkoff on 6/13/16. */ public class FactorRJMCMCOperatorParser extends AbstractXMLObjectParser{ public static final String FACTOR_RJMCMC_OPERATOR = "factorRJMCMCOperator"; public static final String WEIGHT = "weight"; public static final String LOADINGS_SPARSITY = "loadingsSparsity"; public static final String CHAIN_LENGTH = "chainLength"; public static final String FACTORS = "factors"; public static final String LOADINGS = "loadings"; public static final String CUTOFFS = "cutoffs"; public static final String SIZE_PARAMETER = "sizeParameter"; public static final String LOADINGS_PRIOR = "loadingsPrior"; public static final String FACTOR_OPERATOR = "factorOperator"; public static final String LOADINGS_OPERATOR = "loadingsOperator"; public static final String ROW_PRIOR = "rowPrior"; public static final String SPARSITY_PRIOR = "sparsityPrior"; public static final String NEGATION_OPERATOR = "negationOperator"; @Override public Object parseXMLObject(XMLObject xo) throws XMLParseException { //attributes double weight = xo.getDoubleAttribute(WEIGHT); int chainLength = xo.getIntegerAttribute(CHAIN_LENGTH); double sizeParameter = xo.getDoubleAttribute(SIZE_PARAMETER); //declaration AdaptableSizeFastMatrixParameter factors, loadings, cutoffs, loadingsSparcity; //parameters if(xo.hasChildNamed(FACTORS)) factors = (AdaptableSizeFastMatrixParameter) xo.getChild(FACTORS).getChild(AdaptableSizeFastMatrixParameter.class); else factors = null; loadings = (AdaptableSizeFastMatrixParameter) xo.getChild(LOADINGS).getChild(AdaptableSizeFastMatrixParameter.class); if(xo.hasChildNamed(CUTOFFS)){ cutoffs = (AdaptableSizeFastMatrixParameter) xo.getChild(CUTOFFS).getChild(AdaptableSizeFastMatrixParameter.class);} else cutoffs = null; if(xo.hasChildNamed(LOADINGS_SPARSITY)) loadingsSparcity = (AdaptableSizeFastMatrixParameter) xo.getChild(LOADINGS_SPARSITY).getChild(AdaptableSizeFastMatrixParameter.class); else loadingsSparcity = null; //models DeterminentalPointProcessPrior DPP = null; if(xo.getChild(SPARSITY_PRIOR) != null) DPP = (DeterminentalPointProcessPrior) xo.getChild(SPARSITY_PRIOR).getChild(DeterminentalPointProcessPrior.class); SimpleMCMCOperator NOp= null; if(xo.getChild(NEGATION_OPERATOR) != null){ NOp = (SimpleMCMCOperator) xo.getChild(NEGATION_OPERATOR).getChild(SimpleMCMCOperator.class); } AbstractModelLikelihood LFM = (AbstractModelLikelihood) xo.getChild(AbstractModelLikelihood.class); RowDimensionPoissonPrior rowPrior = (RowDimensionPoissonPrior) xo.getChild(ROW_PRIOR).getChild(RowDimensionPoissonPrior.class); Likelihood loadingsPrior = null; if(xo.hasChildNamed(LOADINGS_PRIOR)){ loadingsPrior = (Likelihood) xo.getChild(LOADINGS_PRIOR).getChild(Likelihood.class); } //operators BitFlipOperator sparsityOperator = null; if (xo.getChild(BitFlipOperator.class) != null) sparsityOperator = (BitFlipOperator) xo.getChild(BitFlipOperator.class); SimpleMCMCOperator loadingsOperator = (SimpleMCMCOperator) xo.getChild(LOADINGS_OPERATOR).getChild(SimpleMCMCOperator.class); SimpleMCMCOperator factorOperator = null; if(xo.getChild(FACTOR_OPERATOR) != null) factorOperator = (SimpleMCMCOperator) xo.getChild(FACTOR_OPERATOR).getChild(FactorTreeGibbsOperator.class); return new FactorRJMCMCOperator(weight, sizeParameter, chainLength, factors, loadings, cutoffs, loadingsSparcity, LFM, DPP, loadingsPrior, loadingsOperator, factorOperator, sparsityOperator, NOp, rowPrior); } @Override public XMLSyntaxRule[] getSyntaxRules() { return rules; } private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{ new ElementRule(LOADINGS_OPERATOR, new XMLSyntaxRule[]{ new ElementRule(SimpleMCMCOperator.class)}), new ElementRule(FACTOR_OPERATOR, new XMLSyntaxRule[]{ new ElementRule(SimpleMCMCOperator.class)}, true), new ElementRule(BitFlipOperator.class, true), new ElementRule(AbstractModelLikelihood.class), new ElementRule(SPARSITY_PRIOR, new XMLSyntaxRule[]{ new ElementRule(DeterminentalPointProcessPrior.class)}, true), new ElementRule(FACTORS, new XMLSyntaxRule[]{ new ElementRule(AdaptableSizeFastMatrixParameter.class)}, true), new ElementRule(LOADINGS, new XMLSyntaxRule[]{ new ElementRule(AdaptableSizeFastMatrixParameter.class)}), new ElementRule(CUTOFFS, new XMLSyntaxRule[]{ new ElementRule(AdaptableSizeFastMatrixParameter.class)}, true), new ElementRule(LOADINGS_SPARSITY, new XMLSyntaxRule[]{ new ElementRule(AdaptableSizeFastMatrixParameter.class)}, true), new ElementRule(NEGATION_OPERATOR, new XMLSyntaxRule[]{ new ElementRule(SimpleMCMCOperator.class)}, true), new ElementRule(ROW_PRIOR, new XMLSyntaxRule[]{ new ElementRule(RowDimensionPoissonPrior.class)}), AttributeRule.newDoubleRule(WEIGHT), AttributeRule.newIntegerRule(CHAIN_LENGTH), AttributeRule.newDoubleRule(SIZE_PARAMETER), }; @Override public String getParserDescription() { return "RJMCMC to determine the number of factors in a factor analysis model"; } @Override public Class getReturnType() { return FactorRJMCMCOperator.class; } @Override public String getParserName() { return FACTOR_RJMCMC_OPERATOR; } }