package mikera.vectorz.ops; import mikera.arrayz.INDArray; import mikera.vectorz.AVector; import mikera.vectorz.Op; public abstract class ALinearOp extends APolynomialOp { public abstract double getFactor(); public abstract double getConstant(); @Override public boolean hasDerivative() { return true; } @Override public void applyTo(INDArray a) { a.scaleAdd(getFactor(), getConstant()); } @Override public void applyTo(AVector v) { v.scaleAdd(getFactor(), getConstant()); } @Override public double derivative(double x) { return getFactor(); } @Override public double derivativeForOutput(double y) { return getFactor(); } @Override public Op getDerivativeOp() { return Constant.create(getFactor()); } @Override public boolean hasInverse() { return true; } @Override public Op compose(Op op) { if ((getFactor()==1.0)&&(getConstant()==0.0)) { return op; } return super.compose(op); } public Op sum(ALinearOp op) { return Linear.create(getFactor()+op.getFactor(), getConstant()+op.getConstant()); } @Override public Op sum(Op op) { if ((getFactor()==0.0)&&(getConstant()==0.0)) { return op; } return super.sum(op); } }