package dr.inference.model;
/**
* @author Joseph Heled
* Date: 31/08/2009
*/
public class ParameterChooser extends Variable.BaseNumerical<Double> implements Variable<Double>, ModelListener {
private final ValuesPool pool;
private final int which[];
ParameterChooser(String name, ValuesPool pool, int which[]) {
super(name);
this.pool = pool;
this.which = which;
pool.addModelListener(this);
}
public int getSize() {
return which.length;
}
public Double getValue(int index) {
return pool.getValue(which[index]);
}
public void setValue(int index, Double value) {
assert false;
}
public Double[] getValues() {
final int size = getSize();
Double[] copyOfValues = new Double[size];
for (int i = 0; i < size; i++) {
copyOfValues[i] = getValue(i) ;
}
return copyOfValues;
}
public void storeVariableValues() {
//
}
public void restoreVariableValues() {
//
}
public void acceptVariableValues() {
//
}
private final Bounds<Double> bounds = new Bounds<Double>() {
public Double getUpperLimit(int dimension) {
return pool.getBounds().getUpperLimit(which[dimension]);
}
public Double getLowerLimit(int dimension) {
return pool.getBounds().getLowerLimit(which[dimension]);
}
public int getBoundsDimension() {
return getSize();
}
};
public Bounds<Double> getBounds() {
return bounds;
}
public void addBounds(Bounds<Double> bounds) {
final Bounds<Double> b = getBounds();
assert bounds.getBoundsDimension() == b.getBoundsDimension();
for(int dim = 0; dim < bounds.getBoundsDimension(); ++dim) {
if( bounds.getLowerLimit(dim) > b.getLowerLimit(dim) ||
bounds.getUpperLimit(dim) < b.getUpperLimit(dim) ) {
throw new RuntimeException("can't do that");
}
}
}
public void modelChangedEvent(Model model, Object object, int index) {
for(int k = 0; k < which.length; ++k) {
if( pool.hasChanged(which[k], object, index) ) {
fireVariableChanged(k);
}
}
}
public void modelRestored(Model model) {
}
}