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);
	}
}

 

Ads help maintain this website.