/*
* MatrixMatrixProductParser.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.model;
import dr.inference.model.CompoundParameter;
import dr.inference.model.MatrixMatrixProduct;
import dr.inference.model.MatrixParameter;
import dr.inference.model.Parameter;
import dr.xml.*;
/**
* Created by max on 10/22/14.
*/
public class MatrixMatrixProductParser extends AbstractXMLObjectParser {
final static String MATRIX_MATRIX_PRODUCT = "MatrixMatrixProduct";
final static String LEFT="left";
final static String RIGHT="right";
final static String IN_PLACE="InPlace";
final static String COLUMN_MASK="ColumnMask";
private final XMLSyntaxRule[] rules = {
new ElementRule(LEFT, MatrixParameter.class),
new ElementRule(RIGHT, CompoundParameter.class),
new ElementRule(COLUMN_MASK, Parameter.class, "Only some columns need to be multiplied", true),
new ElementRule(IN_PLACE, MatrixParameter.class, "Matrix values that are returned", true)
};
@Override
public Object parseXMLObject (XMLObject xo)throws XMLParseException {
MatrixParameter[] temp=new MatrixParameter[3];
temp[0]=(MatrixParameter) xo.getChild(LEFT).getChild(MatrixParameter.class);
temp[1]=MatrixParameter.recast(((CompoundParameter) xo.getChild(RIGHT).getChild(CompoundParameter.class)).getVariableName(), (CompoundParameter) xo.getChild(RIGHT).getChild(CompoundParameter.class));
if(xo.getChild(IN_PLACE)!=null){
temp[2]=(MatrixParameter) xo.getChild(IN_PLACE).getChild(MatrixParameter.class);
}
else{
int rowDim=temp[0].getRowDimension();
int colDim=temp[1].getColumnDimension();
Parameter[] params=new Parameter[colDim];
for (int i = 0; i <colDim ; i++) {
params[i]=new Parameter.Default(rowDim);
}
temp[2]=new MatrixParameter(null, params);
}
Parameter ColumnMask;
if(xo.getChild(COLUMN_MASK)!=null)
ColumnMask=(Parameter) xo.getChild(COLUMN_MASK).getChild(MatrixParameter.class);
else
ColumnMask=new Parameter.Default(null, temp[1].getColumnDimension(), 1);
return new MatrixMatrixProduct(temp, ColumnMask);
}
@Override
public XMLSyntaxRule[] getSyntaxRules () {
return rules;
}
@Override
public String getParserDescription () {
return "Gets Latent Factor Model to return data with residuals computed";
}
@Override
public Class getReturnType () {
return MatrixMatrixProduct.class;
}
@Override
public String getParserName () {
return MATRIX_MATRIX_PRODUCT;
}
};