package mikera.vectorz.ops;

import mikera.vectorz.AVector;
import mikera.vectorz.Op;
import mikera.vectorz.impl.ADenseArrayVector;

public final class Quadratic extends APolynomialOp {
	private final double a;
	private final double b;
	private final double c;
	
	private Quadratic(double a,double b, double c) {
		this.a=a;
		this.b=b;
		this.c=c;
	}
	
	public static Op create(double a,double b, double c) {
		if (a==0.0) {
			return Linear.create(b,c);
		}
		if ((a==1.0)&&(b==0.0)&&(c==0.0)) {
			return Square.INSTANCE;
		}
		return new Quadratic(a,b,c);
	}
	
	@Override
	public final double apply(double x) {
		return (a*x*x)+(b*x)+c;
	}
	
	@Override
	public double applyInverse(double y) {
		throw new UnsupportedOperationException();
	}
	
	@Override
	public void applyTo(AVector v) {
		if (v instanceof ADenseArrayVector) {
			ADenseArrayVector av=(ADenseArrayVector)v;
			applyTo(av.getArray(),av.getArrayOffset(),av.length());
			return;
		}
		int len=v.length();
		for (int i=0; i 

Ads help maintain this website.