package mikera.vectorz.ops; import mikera.arrayz.INDArray; import mikera.matrixx.AMatrix; import mikera.vectorz.AVector; import mikera.vectorz.Op; public final class Offset extends ALinearOp { private final double constant; private Offset(double constant) { this.constant=constant; } public static Offset create(double offset) { return new Offset(offset); } @Override public double apply(double x) { return x+constant; } @Override public double applyInverse(double y) { return y-constant; } @Override public void applyTo(INDArray v) { v.add(constant); } @Override public void applyTo(AMatrix v) { v.add(constant); } @Override public void applyTo(AVector v) { v.add(constant); } @Override public void applyTo(double[] data) { for (int i=0; i<data.length; i++) { data[i]+=constant; } } @Override public void applyTo(double[] data, int start,int length) { for (int i=0; i<length; i++) { data[i+start]+=constant; } } @Override public double getFactor() { return 1.0; } @Override public double getConstant() { return constant; } @Override public double averageValue() { return constant; } @Override public boolean hasDerivative() { return true; } @Override public double derivative(double x) { return 1.0; } @Override public double derivativeForOutput(double y) { return 1.0; } @Override public Op getDerivativeOp() { return Constant.ONE; } @Override public boolean hasInverse() { return true; } @Override public Offset getInverse() { return Offset.create(-constant); } public Op compose(ALinearOp op) { return Linear.create(op.getFactor(), constant+op.getConstant()); } @Override public Op compose(Op op) { if (op instanceof ALinearOp) { return compose((ALinearOp) op); } return super.compose(op); } }