Skip to content
Snippets Groups Projects
calcul.cpp 11.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Martin Rusek's avatar
    Martin Rusek committed
    #pragma once
    #include "calcul.h"
    #include <ctime>
    
    Martin Rusek's avatar
    Martin Rusek committed
    #include <numeric>
    
    Martin Rusek's avatar
    Martin Rusek committed
    #include <deque>
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    using namespace std;
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::distance_dtw_euklid(vtr<double> const &u, vtr<double> const &v)
    //{
    //	double sum = 0;
    //
    //	for (size_t i = 0; i < u.size(); i++)
    //	{		
    //		sum += pow(u[i] - v[i], 2);
    //	}
    //
    //	return sum;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::distance_dtw_manhattan(vtr<double> const &u, vtr<double> const &v)
    //{
    //	double sum = 0;
    //
    //	for (size_t i = 0; i < u.size(); i++)
    //	{
    //		sum += abs(u[i] - v[i]);		
    //	}
    //
    //	return sum;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    double calcul::distance_dtw_simd(vtr<double> const &u, vtr<double> const &v, size_t simds, size_t rest)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    	double sum = 0;
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    	if (simds > 0) 
    	{
    		//_mm256_zeroall();
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    		size_t iEnd = u.size() - 4 < 0 ? 0 : u.size();
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    		for (size_t i = 0; i < u.size() - rest; i += 4)
    		{
    			//__m256d u256 = _mm256_set_pd(u[i], u[i + 1], u[i + 2], u[i + 3]);
    			//__m256d v256 = _mm256_set_pd(v[i], v[i + 1], v[i + 2], v[i + 3]);
    
    Martin Rusek's avatar
    Martin Rusek committed
    			__m256d result = _mm256_sub_pd(_mm256_set_pd(u[i], u[i + 1], u[i + 2], u[i + 3]), _mm256_set_pd(v[i], v[i + 1], v[i + 2], v[i + 3]));
    			result = _mm256_mul_pd(result, result);
    			
    			auto r = result.m256d_f64; // == double* f = (double*)&result;
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    			sum += r[0] + r[1] + r[2] + r[3];
    		}
    	}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    	for (size_t i = u.size() - rest; i < u.size(); i++)
    	{
    		sum += pow(u[i] - v[i], 2);
    	}
    	
    
    Martin Rusek's avatar
    Martin Rusek committed
    	return sum;
    }
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    double calcul::distance_dtw_csi(vtr<double> const &u, vtr<double> const &v)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    
    Martin Rusek's avatar
    Martin Rusek committed
    	double result = 0;
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    	return result;
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::distancesMany_dtw(vtr2<double> const &points)
    //{
    //	double sum = 0;
    //
    //	for (size_t i = 0; i < points.size(); i++)
    //	{
    //		for (size_t j = i + 1; j < points.size(); j++)
    //		{
    //			sum += distance_dtw_euklid(points[i], points[j]);
    //		}
    //	}
    //
    //	return sum;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::distance_lcss(vtr<double> const &u, vtr<double> const &v, int idx)
    //{
    //	if (u.size() == 0 || v.size() == 0)
    //		return 0;
    //
    //	double sum = abs(u[idx] - v[idx]);
    //
    //	return sum;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::scorePair_dtw_s1(double ratioRaw)
    //{
    //	return ratioRaw;
    //}
    //
    //double calcul::scorePair_dtw_s2(double ratioRaw, size_t pathLength)
    //{
    //	return sqrt(ratioRaw) / static_cast<double>(pathLength);
    //}
    //
    //double calcul::scorePair_dtw_s3(size_t lenA, size_t lenB, size_t lenPath)
    //{
    //	return 1 - (lenA / static_cast<double>(lenPath) + lenB / static_cast<double>(lenPath)) / 2;
    //}
    //
    //double calcul::scorePair_dtw_s4(double ratioRaw, double ratioRawMax)
    //{
    //	return /*1 -*/ (sqrt(ratioRaw) / sqrt(ratioRawMax));
    //}
    //
    //double calcul::scorePair_dtw_s5(double ratioRaw, double ratioRawMax, double coeficient)
    //{
    //	return (/*1 -*/ sqrt(ratioRaw) / sqrt(ratioRawMax)) * coeficient;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    double calcul::scorePair_dtw_max(vtr2<double> const &A, vtr2<double> const &B, coords start, coords end)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    
    	double min = numeric_limits<double>::max();
    	double max = numeric_limits<double>::min();
    		
    	size_t sA = 0;
    	size_t eA = (int)A.size();
    	size_t sB = 0;
    	size_t eB = (int)B.size();
     
    	if (A.size() < B.size()) {
    		sB = start.col;
    		eB = end.col;
    	}
    
    	if (B.size() < A.size()) {
    		sA = start.row;
    		eA = end.row;
    	}
    
    	for (size_t i = sA; i < eA; i++)
    
    		for (size_t j = 0; j < A[i].size(); j++)	
    
    		if (min > sum)	
    			min = sum;
    
    		if (max < sum)		//added
    			max = sum;
    
    	for (size_t i = sB; i < eB; i++)
    
    	{
    		double sum = 0;
    		for (size_t j = 0; j < B[i].size(); j++)
    		{
    			sum += B[i][j];
    		}
    
    
    		if (min > sum)		//added
    			min = sum;
    
    		if (max < sum)
    			max = sum;
    
    	return pow(max - min, 2) * std::max(eA - sA, eB - sB);
    }
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::coeficient_auto(size_t lenA, size_t lenB)
    //{
    //	if (lenA < lenB)
    //		return (double)lenA / lenB;
    //	else if (lenB < lenA)
    //		return (double)lenB / lenA;
    //	else
    //		return 1;
    //}
    //
    //double calcul::coeficient(size_t dividend, size_t divisor)
    //{
    //	return dividend / (double)divisor;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::scorePair_lcss_s1(double ratioRaw, size_t pathLength)
    //{
    //	return 1 -  ratioRaw / static_cast<double>(pathLength);
    //}
    //
    //double calcul::scorePair_lcss_s2(double ratioRaw, size_t maxABLen)
    //{
    //	return 1 - ratioRaw / maxABLen;
    //}
    //
    //double calcul::scorePair_lcss_s3(double ratioRaw)
    //{
    //	return ratioRaw;
    //}
    
    
    //double calcul::getPairRatio_lcss(int lenIN, int rawscore)
    //{
    //	return rawscore / (lenIN / 2.0);
    //}
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    double calcul::scoreMulti_dtw(vtr3<double> const &input, vtr3<double> const &output)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    
    	size_t sumA = 0;
    	for (auto s : input)
    		sumA += s.size();
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    	size_t sumB = 0;
    	for (auto s : output)
    		sumB += s.size();
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    	return sumA / static_cast<double>(sumB);
    
    //double calcul::GetMRRratio(vtr2<int> const &orderMatrix, map<int, int> &clusters)
    
    Martin Rusek's avatar
    Martin Rusek committed
    //{
    //    double mapRatio = 0;
    //    for (size_t i = 0; i < orderMatrix.size(); i++)         //query (ref sequence) //column
    //    {
    //        double pr = 0;
    //        double coverIdx = 0;
    //        for (size_t j = 1; j < orderMatrix.size(); j++)     // row / rank
    //        {
    //            if (clusters[orderMatrix[j][i]] == clusters[i + 1])
    //                //pr += 1.0 / j;
    //                pr += ++coverIdx / j;
    //        }
    //        mapRatio += pr / coverIdx;
    //        cout << setw(5) << pr / coverIdx << " ";
    //    }
    //    cout << endl;
    //
    //    return (orderMatrix.size() - 1);
    //}
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    double calcul::scoreAverageRank(int ref, vtr<int> const &queryAnswer, clusters const &clusters)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    
    	const int clusterSize = clusters.getClusterSize(ref);
    
    Martin Rusek's avatar
    Martin Rusek committed
    	
    	int counter = 0;
    	double averageRank = 0;
    	for (size_t i = 0; i < queryAnswer.size(); i++)         //query (ref sequence) //column
    
    		if (clusters.getClusterID(queryAnswer[i]) == clusters.getClusterID(ref))
    
    Martin Rusek's avatar
    Martin Rusek committed
    			averageRank += (int)i+1;
    			counter++;
    			if (counter == clusterSize - 1)
    				break;
    
    Martin Rusek's avatar
    Martin Rusek committed
    	averageRank = averageRank / (clusterSize - 1);
    	return averageRank;
    }
    
    double calcul::scoreAveragePrecision(int ref, vtr<int> const &queryAnswer, clusters const &clusters)
    {	
    
    	const int clusterSize = clusters.getClusterSize(ref);
    
    Martin Rusek's avatar
    Martin Rusek committed
    	int counter = 0;
    	for (size_t i = 0; i < queryAnswer.size(); i++)         //query (ref sequence) //column
    	{
    
    		if (clusters.getClusterID(queryAnswer[i]) == clusters.getClusterID(ref))
    
    Martin Rusek's avatar
    Martin Rusek committed
    		{
    			pr += ++counter / (double)(i + 1);
    			if (counter == clusterSize - 1)
    				break;
    		}
    	}
    
    	double ap = pr / (clusterSize - 1);
    	return ap;
    }
    
    double calcul::scoreMap(vtr<double> const &averagePrecisions)
    {	
    	//vtr<double> ratios;
    	//double mapRatio = 0;
    	//for (size_t i = 0; i < orderMatrix.size(); i++)         //query (ref sequence) //column
    	//{
    	//	double pr = 0;
    	//	double coverIdx = 0;
    	//	for (size_t j = 1; j < orderMatrix.size(); j++)     // row / rank
    	//	{
    	//		if (clusters.strIDcID.at(orderMatrix[j][i]).idCluster == clusters.strIDcID.at((int)i + 1).idCluster)
    	//			pr += ++coverIdx / j;
    	//	}
    	//	double tmpPrecision = 0;
    	//	if (pr == 0 && coverIdx == 0)
    	//		tmpPrecision = 0;
    	//	else
    	//		tmpPrecision += pr / coverIdx;
    
    	//		mapRatio += tmpPrecision;
    	//	
    	//	ratios.push_back(tmpPrecision);
    	//}
    
    	//ratios.push_back(mapRatio / (orderMatrix.size()));	
    
    	return accumulate(averagePrecisions.begin(), averagePrecisions.end(), 0.0) / averagePrecisions.size();
    }
    
    
    double calcul::scorePrecision(int ref, vtr<int> const &queryAnswer, clusters const &clusters)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    	int truePositives = 0;
    	int falsePositives = 0;
    	//int range = min(topThreshold, (int)top.size());
    
    	for (int i = 0; i < clusters.getClusterSize(ref) - 1; i++)
    
    		if (clusters.getClusterID(queryAnswer[i]) == clusters.getClusterID(ref))
    
    Martin Rusek's avatar
    Martin Rusek committed
    			truePositives++;
    		else
    			falsePositives++;
    	}
    
    	double precision = (double)truePositives / (truePositives + falsePositives);
    	return precision;
    }
    
    
    double calcul::scoreRecall(int ref, vtr<int> const &queryAnswer, clusters const &clusters)
    {	
    	int clusterSize = clusters.getClusterSize(ref);
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    	int truePositives = 0;
    
    	for (int i = 0; i < clusterSize - 1; i++)
    
    		if (clusters.getClusterID(queryAnswer[i]) == clusters.getClusterID(ref))
    
    Martin Rusek's avatar
    Martin Rusek committed
    			truePositives++;
    	}
    
    
    	double recall = (double)truePositives / (clusterSize - 1);
    
    Martin Rusek's avatar
    Martin Rusek committed
    	return recall;
    }
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    //bool calcul::isInWindow(int row, int col, float ratio, int percent)
    //{
    //	if (ratio < 1)
    //	{
    //		float r = 1 / ratio;
    //		float tmp = ceil(col * r - row);
    //		if (tmp >= -(percent - 1) * r && tmp < (r * percent))
    //			return true;
    //	}
    //	else
    //	{
    //		float tmp = ceil(row * ratio - col);
    //		if (tmp >= -(percent - 1) * ratio && tmp < (ratio * percent))
    //			return true;
    //	}
    //	return false;
    //}
    
    Martin Rusek's avatar
    Martin Rusek committed
    double calcul::ts_mean(vtr2<double> const &ts)
    
    Martin Rusek's avatar
    Martin Rusek committed
    {
    	double mean = 0;
    	for (size_t i = 0; i < ts.size(); i++) //lenght of sequence
    	{
    		mean += ts[i][0];
    	}
    
    Martin Rusek's avatar
    Martin Rusek committed
    	return mean / ts.size();
    
    Martin Rusek's avatar
    Martin Rusek committed
    //double calcul::ts_std(tseries const &ts)
    
    Martin Rusek's avatar
    Martin Rusek committed
    //
    //double GetMultiRatiolcss(Vtr<string, 3> input, vector<int> raws)
    //{
    //    size_t sumA = 0;
    //    for (auto s: input)
    //        sumA += s.size();
    //
    //    int sumB = 0;
    //    for (auto s: raws)
    //        sumB += s;
    //
    //    return sumA / (double)sumB;
    //}
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    double calcul::lb_keogh(vtr2<double> const &A, vtr2<double> const &B, parameter const &params)
    {
    	int width = 1 + 2 * (int)params.w;
    	int w = (int)params.w;
    	deque<int> maxfifo, minfifo;
    	maxfifo.push_back(0);
    	minfifo.push_back(0);
    
    	vtr<double> maxvalues(B.size());
    	vtr<double> minvalues(B.size());
    
    	for (size_t i = 1; i < A.size(); ++i) {
    		if (i >= w + 1) {
    			maxvalues[i - w - 1] = A[maxfifo.front()][0];
    			minvalues[i - w - 1] = A[minfifo.front()][0];
    		}
    		if (A[i][0] > A[i - 1][0]) { //overshoot
    			maxfifo.pop_back();
    			while (maxfifo.size() > 0) {
    				if (A[i][0] <= A[maxfifo.back()][0]) break;
    				maxfifo.pop_back();
    			}
    		}
    		else {
    			minfifo.pop_back();
    			while (minfifo.size() > 0) {
    				if (A[i][0] >= A[minfifo.back()][0]) break;
    				minfifo.pop_back();
    			}
    		}
    		maxfifo.push_back((int)i);
    		minfifo.push_back((int)i);
    		if (i == width + maxfifo.front()) maxfifo.pop_front();
    		else if (i == width + minfifo.front()) minfifo.pop_front();
    	}
    	for (size_t i = A.size(); i <= A.size() + w; ++i) {
    		maxvalues[i - w - 1] = A[maxfifo.front()][0];
    		minvalues[i - w - 1] = A[minfifo.front()][0];
    		if (i - maxfifo.front() >= width) maxfifo.pop_front();
    		if (i - minfifo.front() >= width) minfifo.pop_front();
    	}
    
    	double result = 0;
    	for (size_t i = 0; i < A.size(); i++)
    	{
    		if (B[i][0] > maxvalues[i])
    			result += pow(B[i][0] - maxvalues[i], 2);
    		else if (B[i][0] < minvalues[i])
    			result += pow(B[i][0] - minvalues[i], 2);
    	}
    
    Martin Rusek's avatar
    Martin Rusek committed
    
    
    Martin Rusek's avatar
    Martin Rusek committed
    	return result;
    }
    
    //double calcul::lowerBound_keogh(vtr2<double> const &A, vtr2<double> const &B, parameter const &params)
    
    Martin Rusek's avatar
    Martin Rusek committed
    //{
    
    Martin Rusek's avatar
    Martin Rusek committed
    //	vtr<double> U(B.size());
    //	vtr<double> L(B.size());
    //	
    //	int w = (int)params.w;
    //	double min(2 * w);
    //	double max(2 * w);
    //
    //	for (size_t i = 1; i < w; i++)
    //	{
    //		if (max < A[i][0])
    //			max = A[i][0];
    //		if (min > A[i][0])
    //			min = A[i][0];
    //	}
    //
    //	for (size_t i = 0; i < A.size() - w; i++)
    //	{
    //		if (max < A[i + w][0])
    //			max = A[i +	w][0];
    //		if (min > A[i +	w][0])
    //			min = A[i +	w][0];
    //
    //		U[i] = max;
    //		L[i] = min;		
    //	}
    //
    //	double result = 0;
    //	for (size_t i = 0; i < B.size(); i++)
    //	{
    //		if (B[i][0] > U[i])
    //			result += pow(B[i][0] - U[i], 2);
    //		else if (B[i][0] < L[i])
    //			result += pow(B[i][0] - L[i], 2);
    //	}
    
    Martin Rusek's avatar
    Martin Rusek committed
    //
    
    Martin Rusek's avatar
    Martin Rusek committed
    //	return result;
    
    Martin Rusek's avatar
    Martin Rusek committed
    //}
    
    //float calcul::GetManyDistances(Vtr<string, 2> const  &S)
    //{
    //	float sum = 0;
    //	size_t a = S.size();
    //
    //	for (int i = 0; i < a; i++)
    //	{
    //		for (int j = i + 1; j < a; j++)
    //		{
    //			sum += GetDistance(S[i], S[j]);
    //		}
    //	}
    //
    //	return sum;
    //}
    
    //float calcul::GetDistance(string* const &u, string* const &v)
    //{
    //	int uL = sizeof(u) / sizeof(u);
    //	int vL = sizeof(v) / sizeof(v);
    //	double sum = 0;
    //	int shorterDim = (uL < vL) ? uL : vL;
    //
    //	//if (u == null || v == null)
    //	//    return 0;
    //	//else
    //	for (int i = 0; i < shorterDim; i++)
    //	{
    //		//sum += SubstitutionMatrixManager.GetDistance(u[i].ToString() + v[i].ToString());
    //	}
    //
    //	return (float)sum;
    //}