package mikera.vectorz.ops;
import mikera.vectorz.AVector;
import mikera.vectorz.Op;
import mikera.vectorz.util.DoubleArrays;
public final class Square extends APolynomialOp {
public static final Square INSTANCE=new Square();
private Square() {
}
public static Op create() {
return INSTANCE;
}
@Override
public final double apply(double x) {
return x*x;
}
@Override
public double applyInverse(double y) {
return Math.sqrt(y);
}
@Override
public void applyTo(AVector v) {
v.square();
}
@Override
public void applyTo(double[] data) {
for (int i=0; i<data.length; i++) {
double x=data[i];
data[i]=x*x;
}
}
@Override
public void applyTo(double[] data, int start,int length) {
DoubleArrays.square(data, start, length);
}
@Override
public double averageValue() {
return 1.0;
}
@Override
public boolean hasDerivative() {
return true;
}
@Override
public boolean hasDerivativeForOutput() {
return false;
}
@Override
public double derivative(double x) {
return 2.0*x;
}
@Override
public Op getDerivativeOp() {
return Linear.create(2.0,0.0);
}
@Override
public boolean hasInverse() {
return false;
}
public Op compose(ALinearOp op) {
double a=op.getFactor();
double b=op.getConstant();
return Quadratic.create(a*a,(2*a*b),b*b);
}
@Override
public Op compose(Op op) {
if (op instanceof ALinearOp) {
return compose((ALinearOp) op);
}
return super.compose(op);
}
}