package org.geogebra.common.kernel.advanced;
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.geogebra.common.kernel.arithmetic.NumberValue;
import org.geogebra.common.kernel.geos.GeoElement;
/**
* Common class for minimizing a function over number interval or path
*
*/
public abstract class Optimizer implements UnivariateFunction {
private NumberValue dep;
/**
* @param dep
* dependent number
*/
public Optimizer(NumberValue dep) {
this.dep = dep;
}
/**
* @return optimization result
*/
public abstract GeoElement getGeo();
/**
* @return function value at current param
*/
public abstract double getValue();
/**
* @return whether the number is restricted to an interval or point is
* restricted to path
*/
public abstract boolean hasBounds();
/**
* @return min parameter
*/
public abstract double getIntervalMin();
/**
* @return max parameter
*/
public abstract double getIntervalMax();
/**
* @param old
* parameter value
*/
public abstract void setValue(double old);
@Override
public double value(double x) {
if ((dep != null) && (getGeo() != null)) {
setValue(x);
getGeo().updateCascade();
// result = geodep.getDouble();
// if type
return dep.getDouble();
}
return Double.NaN;
// if variables are ok
}
}