class DerivateTransformDistance implements IDistanceMetric {

	@Override
	public double distance(final double[] a, final double[] b) {
		double[] derivateA = this.derivate.transform(a);
		double[] derivateB = this.derivate.transform(b);
		double[] transformA = this.transform.transform(a);
		double[] transformB = this.transform.transform(b);

		return this.a * this.timeSeriesDistance.distance(a, b) + this.b * this.derivateDistance.distance(derivateA, derivateB) + this.c * this.transformDistance.distance(transformA, transformB);
	}

	public  DerivateTransformDistance(final double a, final double b, final double c, final ADerivateFilter derivate, final IVectorTransform transform, final IDistanceMetric timeSeriesDistance, final IDistanceMetric derivateDistance,
			final IDistanceMetric transformDistance);
	public  DerivateTransformDistance(final double a, final double b, final double c, final IDistanceMetric timeSeriesDistance, final IDistanceMetric derivateDistance, final IDistanceMetric transformDistance);
	public  DerivateTransformDistance(final double a, final double b, final double c, final ADerivateFilter derivate, final IVectorTransform transform, final IDistanceMetric distance);
	public  DerivateTransformDistance(final double a, final double b, final double c, final IDistanceMetric distance);

}