package mikera.vectorz.ops; import mikera.arrayz.INDArray; import mikera.matrixx.AMatrix; import mikera.vectorz.AVector; /** * Operator for clamping values within a given range * @author Mike * */ public final class Clamp extends ABoundedOp { private final double min; private final double max; public static final Clamp ZERO_TO_ONE=new Clamp(0,1); public Clamp(double min, double max) { this.min=min; this.max=max; } @Override public double apply(double x) { if (x<=min) return min; if (x>=max) return max; return x; } @Override public void applyTo(INDArray v) { v.clamp(min, max); } @Override public void applyTo(AVector v) { v.clamp(min, max); } @Override public void applyTo(AMatrix v) { v.clamp(min, max); } @Override public void applyTo(double[] data, int start,int length) { for (int i=0; i<length; i++) { double x=data[start+i]; data[start+i]=(x<min) ? min : ((x>max)?max:x); } } @Override public double minValue() { return min; } @Override public double maxValue() { return max; } @Override public boolean hasDerivative() { return true; } @Override public double derivative(double x) { if ((x<=min)||(x>=max)) return 0.0; return 1.0; } @Override public double derivativeForOutput(double y) { if ((y<=min)||(y>=max)) return 0.0; return 1.0; } }