package dr.inference.model;
import dr.xml.*;
/**
* @author Marc Suchard
*/
public class VectorSliceParameter extends CompoundParameter {
public final static String VECTOR_SLICE_PARAMETER = "vectorSlice";
public static final String SLICE_DIMENSION = "sliceDimension";
private final int sliceDimension;
public VectorSliceParameter(String name, int sliceDimension) {
super(name);
this.sliceDimension = sliceDimension;
}
public int getDimension() {
return getParameterCount();
}
public double getParameterValue(int dim) {
Parameter parameter = getParameter(dim);
return parameter.getParameterValue(sliceDimension);
}
public void addDimension(int index, double value) {
throw new RuntimeException("Not yet implemented.");
}
public double removeDimension(int index) {
throw new RuntimeException("Not yet implemented.");
}
public void setParameterValue(int dim, double value) {
Parameter parameter = getParameter(dim);
parameter.setParameterValue(sliceDimension, value);
}
public void setParameterValueQuietly(int dim, double value) {
Parameter parameter = getParameter(dim);
parameter.setParameterValueQuietly(sliceDimension, value);
}
public void setParameterValueNotifyChangedAll(int dim, double value){
Parameter parameter = getParameter(dim);
parameter.setParameterValueNotifyChangedAll(sliceDimension, value);
}
public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
public String getParserName() {
return VECTOR_SLICE_PARAMETER;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
int sliceDimension = xo.getIntegerAttribute(SLICE_DIMENSION);
VectorSliceParameter vectorSlice = new VectorSliceParameter(xo.getId(), sliceDimension - 1);
for (int i = 0; i < xo.getChildCount(); i++) {
Parameter parameter = (Parameter) xo.getChild(i);
vectorSlice.addParameter(parameter);
if (sliceDimension < 1 || sliceDimension > parameter.getDimension()) {
throw new XMLParseException("Slice dimension " + sliceDimension + " is invalid for a parameter" +
" with dimension = " + parameter.getDimension());
}
}
return vectorSlice;
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "A vector parameter constructed from a slice of component parameters.";
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private final XMLSyntaxRule[] rules = {
new ElementRule(Parameter.class, 1, Integer.MAX_VALUE),
AttributeRule.newIntegerRule(SLICE_DIMENSION),
};
public Class getReturnType() {
return VectorSliceParameter.class;
}
};
}