/*
* ParameterChooser.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.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) {
}
}