package mikera.vectorz.ops; import mikera.transformz.ATransform; import mikera.transformz.Transformz; import mikera.vectorz.AVector; import mikera.vectorz.Op; import mikera.vectorz.Ops; /** * Singleton identity operator * * @author Mike */ public final class Identity extends ALinearOp { public static final Identity INSTANCE = new Identity(); private Identity() { // no content } @Override public double getFactor() { return 1.0; } @Override public double getConstant() { return 0.0; } @Override public double apply(double x) { return x; } @Override public double applyInverse(double y) { return y; } @Override public void applyTo(AVector v) { // done! } @Override public void applyTo(double[] data) { // done! } @Override public void applyTo(double[] data, int start,int length) { // done! } @Override public boolean hasDerivative() { return true; } @Override public Op getDerivativeOp() { return Constant.ONE; } @Override public double averageValue() { return 0.0; } @Override public double derivative(double x) { return 1.0; } @Override public double derivativeForOutput(double y) { return 1.0; } @Override public ATransform getTransform(int dimensions) { return Transformz.identityTransform(dimensions); } @Override public Identity getInverse() { return this; } @Override public Op compose(Op op) { return op; } @Override public Op product(Op op) { if (op instanceof Identity) return Ops.SQUARE; if (op instanceof Linear) { Linear o=(Linear)op; return Quadratic.create(o.getFactor(), o.getConstant(), 0.0); } if (op instanceof Power) return Power.create(((Power)op).getExponent()); return super.compose(op); } }