package mikera.vectorz.ops; import mikera.arrayz.INDArray; import mikera.vectorz.AVector; import mikera.vectorz.Op; import mikera.vectorz.Ops; import mikera.vectorz.util.DoubleArrays; public class Sqrt extends AFunctionOp { public static final Sqrt INSTANCE=new Sqrt(); private static final Op SQRT_DERIVATIVE_OP = Division.create(Constant.HALF,INSTANCE); @Override public double apply(double x) { return Math.sqrt(x); } @Override public void applyTo(INDArray a) { a.sqrt(); } @Override public void applyTo(AVector a) { a.sqrt(); } @Override public void applyTo(double[] data, int offset, int length) { DoubleArrays.sqrt(data,offset,length); } @Override public double averageValue() { return 1.0; } @Override public double derivative(double x) { return 0.5/Math.sqrt(x); } @Override public double derivativeForOutput(double y) { return 0.5/y; } @Override public boolean hasDerivative() { return true; } @Override public Op getDerivativeOp() { return SQRT_DERIVATIVE_OP; } @Override public boolean hasInverse() { return true; } @Override public Op getInverse() { return Ops.SQUARE; } @Override public double applyInverse(double y) { return y*y; } @Override public double minDomain() { return 0.0; } @Override public double minValue() { return 0.0; } }