#ifndef CALCUL_H
#define CALCUL_H

#include "structs.h"
#include "parameter.h"

///Contains various math functions.
class calcul
{
public:
	static double distanceDtwEuklid(vtr<double> const &u, vtr<double> const &v);
	static double distanceDtwManhattan(vtr<double> const &u, vtr<double> const &v);
	static double distanceDtwCsiChroma(vtr<double> const &u, vtr<double> const &v, double threshold = 0.07);
	static double distanceDtwCsiChord(vtr<double> const &u, vtr<double> const &v, vtr<int> const &uKey, vtr<int> const &vKey);
	
	//static double distance_dtw_euklid2(input_method const &series, int idxA, int idxB);
	//static double distance_dtw_manhattan2(input_method const &series, int idxA, int idxB);
	//static double distance_dtw_csiChroma2(input_method const &series, int idxA, int idxB);
	//static double distance_dtw_csiChord2(input_method const &series, int idxA, int idxB);
	
	static double distanceLcss(vtr<double> const &u, vtr<double> const &v, int idx);
		
	static double scoreDtwS1(double scoreRaw);
	static double scoreDtwS2(double scoreRaw, size_t pathLength);
	static double scoreDtwS3(size_t lenA, size_t lenB, size_t lenPath);
	static double scoreDtwS4(double scoreRaw, double scoreRawMax);
	static double scoreDtwS5(double scoreRaw, double scoreRawMax, double coefficient);
	static double scoreDtwMax(vtr2<double> const &A, vtr2<double> const &B, coord start, coord end);
		
	static double scoreLcssS1(double scoreRaw, size_t pathLength);
	static double scoreLcssS2(double scoreRaw, size_t maxABLen);
	static double scoreLcssS3(double scoreRaw);
	
	static double lenRatio(size_t lenA, size_t lenB);
	static double ratio(size_t dividend, size_t divisor);
	
	static double scoreAverageRank(int ref, vtr<int> const &queryAnswer, inputGroundTruth const &clusters);
	static double scoreAveragePrecision(int ref, vtr<int> const &queryAnswer, inputGroundTruth const &clusters);
	
	static double scoreMap(vtr<double> const &averagePrecisions);
	static double scorePrecision(int ref, vtr<int> const &top, inputGroundTruth const &clusters);
	static double scoreRecall(int ref, vtr<int> const &top, inputGroundTruth const &cluster);
	
	static double lbKeogh(vtr2<double> const &A, vtr2<double> const &B, parameter const &params);

	static int dtwPassStart(size_t i, int w, double coeficient);
	static int dtwPassEnd(size_t i, int w, double coeficient, int lenB);
	static bool isFlexiblePass(int row, int col, coord const &past, int w);
	
	template <typename T> static T vtrMax(vtr<T> const &input);
	template <typename T> static T vtrMax(vtr2<T> const &input);
	template <typename T> static T vtrMax(vtr3<T> const &input);
	template <typename T> static T vtrMin(vtr<T> const &input);
	template <typename T> static T vtrMin(vtr2<T> const &input);

	static double vtrMean(vtr<double> const &v);
	static vtr<double> vtrMean(vtr2<double> const &v);
	static double vtrStd(vtr<double> const &v);
};

#endif //CALCUL_H