package cc.mallet.optimize;
import java.util.ArrayList;
import cc.mallet.types.MatrixOps;
public class OptimizableCollection {
public class ByGradientValue implements Optimizable.ByGradientValue
{
ArrayList<Optimizable.ByGradientValue> optimizables;
public ByGradientValue (Optimizable.ByGradientValue... ops) {
optimizables = new ArrayList<Optimizable.ByGradientValue>(ops.length);
for (Optimizable.ByGradientValue o : ops)
optimizables.add(o);
}
public void getValueGradient (double[] buffer) {
double[] b2 = new double[buffer.length];
for (Optimizable.ByGradientValue o : optimizables) {
MatrixOps.setAll(b2, 0);
o.getValueGradient(b2);
MatrixOps.plusEquals(buffer, b2);
}
}
public double getValue () {
double ret = 0;
for (Optimizable.ByGradientValue o : optimizables)
ret += o.getValue();
return ret;
}
// Here we rely on all optimizables pointing to the same set of parameters!
public int getNumParameters() {
return optimizables.get(0).getNumParameters();
}
public double getParameter(int index) {
return optimizables.get(0).getParameter(index);
}
public void getParameters(double[] buffer) {
optimizables.get(0).getParameters(buffer);
}
public void setParameter(int index, double value) {
optimizables.get(0).setParameter(index, value);
}
public void setParameters(double[] params) {
optimizables.get(0).setParameters(params);
}
}
}