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;
/**
* The renowned exponential function
*
* @author Mike
*
*/
public final class Log extends AFunctionOp {
public static final Op INSTANCE=new Log();
@Override
public double apply(double x) {
return Math.log(x);
}
@Override
public void applyTo(INDArray a) {
a.log();
}
@Override
public void applyTo(AVector a) {
a.log();
}
@Override
public void applyTo(double[] data, int offset, int length) {
DoubleArrays.log(data,offset,length);
}
@Override
public double derivative(double x) {
return 1.0/x;
}
@Override
public double derivativeForOutput(double y) {
return 1/Math.exp(y);
}
@Override public double applyInverse(double y) {
return Math.exp(y);
}
@Override public boolean hasDerivative() {return true;}
@Override public boolean hasInverse() {return true;}
@Override public double minDomain() {return Double.MIN_VALUE;}
@Override public Op getInverse() {return Exp.INSTANCE;}
@Override public Op getDerivativeOp() {return Ops.RECIPROCAL;}
}