package dr.evomodel.antigenic.phyloClustering.statistics;
import java.util.LinkedList;
import dr.inference.model.*;
import dr.xml.*;
/**
* @author Charles Cheung
* @author Trevor Bedford
*/
public class ActiveIndicatorsStatistic extends Statistic.Abstract implements VariableListener {
private LinkedList<Double> activeNodes = new LinkedList<Double>();
private int max_dim;
public static final String ACTIVE_INDICATORS_STATISTIC = "activeIndicatorsStatistic";
public ActiveIndicatorsStatistic(Parameter indicators, int maxDim_in) {
this.indicatorsParameter = indicators;
indicatorsParameter.addParameterListener(this);
max_dim = maxDim_in;
}
public int getDimension() {
return max_dim;
}
//assume print in order... so before printing the first number,
//determine all the nodes that are active.
public double getStatisticValue(int dim) {
if(dim ==0){
activeNodes = new LinkedList<Double>(); // reset linkedlist
//determine all the nodes that are active.
for(int i=0; i < indicatorsParameter.getDimension(); i++){
if( (int) indicatorsParameter.getParameterValue(i) == 1 ){
activeNodes.addLast(new Double(i));
}
}
//System.out.println("active node size is = " + activeNodes.size() );
}
double val = -1;
if(dim < activeNodes.size()){
val = activeNodes.get(dim).doubleValue();
}
//if the number of active nodes is more than the max number allowed, then for the last placeholder, print -9999999 instead
//to indicate that there are more than MAX_DIM of active nodes and we aren't able to print them all.
if(dim == (max_dim -1) && ( activeNodes.size() > max_dim) ){
val = -9999999;
}
return val;
}
public String getDimensionName(int dim) {
String name = "on_" + (dim+1);
return name;
}
public void variableChangedEvent(Variable variable, int index, Parameter.ChangeType type) {
// do nothing
//System.out.println("hi got printed");
}
public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
public final static String INDICATORS = "indicators";
public final static String MAXDIMSTR = "maxDim";
public String getParserName() {
return ACTIVE_INDICATORS_STATISTIC;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
Parameter indicators = (Parameter) xo.getElementFirstChild(INDICATORS);
int maxDim = 30;
if(xo.hasAttribute(MAXDIMSTR)){
maxDim = xo.getIntegerAttribute(MAXDIMSTR);
}
return new ActiveIndicatorsStatistic(indicators, maxDim);
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "This element returns a statistic that shifts a matrix of locations by location drift in the first dimension.";
}
public Class getReturnType() {
return ActiveIndicatorsStatistic.class;
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{
new ElementRule(INDICATORS, Parameter.class),
AttributeRule.newDoubleRule(MAXDIMSTR, true, "the variance of mu"),
};
};
private Parameter indicatorsParameter;
}