Skip to content
Snippets Groups Projects
Commit ee7567a0 authored by Martin Rusek's avatar Martin Rusek
Browse files

add: -time switch, prints elapsed time measures

update: lcss score functions in calcul class
update: -r switch behaviour changed, now its preprocess input sequences by taking every [th] element
update: warpPath class modified, removed unnecessary variables
fix: parameterPriority function crash when adding parameterless switch
parent 44e6ac95
No related branches found
No related tags found
No related merge requests found
...@@ -110,24 +110,51 @@ double calcul::scorePair_dtw_max(vtr2<double> const &A, vtr2<double> const &B) ...@@ -110,24 +110,51 @@ double calcul::scorePair_dtw_max(vtr2<double> const &A, vtr2<double> const &B)
for (size_t i = 0; i < A.size(); i++) for (size_t i = 0; i < A.size(); i++)
{ {
if (minA > A[i][0]) double sum = 0;
minA = A[i][0]; for (size_t j = 0; j < A[i].size(); j++)
{
sum += A[i][j];
}
if (minA > sum)
minA = sum;
} }
for (size_t i = 0; i < B.size(); i++) for (size_t i = 0; i < B.size(); i++)
{ {
if (maxB < B[i][0]) double sum = 0;
maxB = B[i][0]; for (size_t j = 0; j < B[i].size(); j++)
{
sum += B[i][j];
}
if (maxB < sum)
maxB = sum;
} }
return pow(maxB - minA, 2) * std::max(A.size(), B.size()); return pow(maxB - minA, 2) * std::max(A.size(), B.size());
} }
double calcul::getPairRatio_lcss(int lenIN, int rawscore) 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 rawscore / (lenIN / 2.0); 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);
//}
double calcul::getMultiRatio_dtw(vtr3<double> const &input, vtr3<double> const &output) double calcul::getMultiRatio_dtw(vtr3<double> const &input, vtr3<double> const &output)
{ {
size_t sumA = 0; size_t sumA = 0;
......
...@@ -30,8 +30,12 @@ public: ...@@ -30,8 +30,12 @@ public:
static double scorePair_dtw_max(vtr2<double> const &A, vtr2<double> const &B); static double scorePair_dtw_max(vtr2<double> const &A, vtr2<double> const &B);
static double scorePair_lcss_s1(double ratioRaw, size_t lenPath);
static double scorePair_lcss_s2(double ratioRaw, size_t maxABLen);
static double scorePair_lcss_s3(double ratioRaw);
//Returns similarity in <0, 1> interval. //Returns similarity in <0, 1> interval.
static double getPairRatio_lcss(int lenIN, int rawscore); //static double getPairRatio_lcss(int lenIN, int rawscore);
//Return similarity in <0, 1> interval. //Return similarity in <0, 1> interval.
static double getMultiRatio_dtw(vtr3<double> const &input, vtr3<double> const &output); static double getMultiRatio_dtw(vtr3<double> const &input, vtr3<double> const &output);
//Retruns Mean Average Precision. //Retruns Mean Average Precision.
......
...@@ -27,27 +27,29 @@ double dtw::alignment(vtr2<double> const &A, vtr2<double> const &B, parameter co ...@@ -27,27 +27,29 @@ double dtw::alignment(vtr2<double> const &A, vtr2<double> const &B, parameter co
{ {
warpPath backtrack; warpPath backtrack;
if(params.dmDataType == "double") if(params.dmDataType == "double")
backtrack = dtw::createMatrix2<double>(A, B, params); backtrack = dtw::createMatrix<double>(A, B, params);
else if(params.dmDataType == "int") else if(params.dmDataType == "int")
backtrack = dtw::createMatrix2<int>(A, B, params); backtrack = dtw::createMatrix<int>(A, B, params);
else if (params.dmDataType == "float") else if (params.dmDataType == "float")
backtrack = dtw::createMatrix2<float>(A, B, params); backtrack = dtw::createMatrix<float>(A, B, params);
else if (params.dmDataType == "char" || params.dmDataType == "byte") else if (params.dmDataType == "char" || params.dmDataType == "byte")
backtrack = dtw::createMatrix2<char>(A, B, params); backtrack = dtw::createMatrix<char>(A, B, params);
//help::mark(m, A.size(), B.size()); //k cemu je mark fce? lol lepsi mena pako //help::mark(m, A.size(), B.size()); //k cemu je mark fce? lol lepsi mena pako
double result = 0; double result = 0;
if (params.scoreType == 1) if (params.scoreType == 1)
result = calcul::scorePair_dtw_s1(backtrack.rawScore, backtrack.path.size()); result = calcul::scorePair_dtw_s1(backtrack.scoreRaw, backtrack.path.size());
else if (params.scoreType == 2) else if (params.scoreType == 2)
result = calcul::scorePair_dtw_s2(A.size(), B.size(), backtrack.path.size()); result = calcul::scorePair_dtw_s2(A.size(), B.size(), backtrack.path.size());
else if (params.scoreType == 3) else if (params.scoreType == 3)
result = backtrack.rawScore; result = backtrack.scoreRaw;
else if (params.scoreType == 4) else if (params.scoreType == 4)
result = calcul::scorePair_dtw_s4(backtrack.rawScore, calcul::scorePair_dtw_max(A, B)); result = calcul::scorePair_dtw_s4(backtrack.scoreRaw, calcul::scorePair_dtw_max(A, B));
else if (params.scoreType == 5) else if (params.scoreType == 5)
result = calcul::scorePair_dtw_s5(backtrack.rawScore, calcul::scorePair_dtw_max(A, B), A.size() < B.size() ? A.size() / (double) B.size() : B.size() / (double)A.size()); result = calcul::scorePair_dtw_s5(backtrack.scoreRaw, calcul::scorePair_dtw_max(A, B), A.size() < B.size() ? A.size() / (double)B.size() : B.size() / (double)A.size());
else
result = 0;
if (params.isRatioReversed()) // -rr switch if (params.isRatioReversed()) // -rr switch
return 1 - result; return 1 - result;
...@@ -57,143 +59,6 @@ double dtw::alignment(vtr2<double> const &A, vtr2<double> const &B, parameter co ...@@ -57,143 +59,6 @@ double dtw::alignment(vtr2<double> const &A, vtr2<double> const &B, parameter co
template<class T> template<class T>
warpPath dtw::createMatrix(vtr2<double> const &A, vtr2<double> const &B, parameter const &params) warpPath dtw::createMatrix(vtr2<double> const &A, vtr2<double> const &B, parameter const &params)
{
node<T>** m = new node<T>*[A.size() + 1];
for (int i = 0; i < A.size() + 1; i++)
m[i] = new node<T>[B.size() + 1];
m[0][0].value = 0;
int w = (int)(B.size() * params.w);
for (int i = 1; i < A.size() + 1; i++) //row - y
{
int start = max(1, (int)(ceil((i - 1) * (B.size() / (double)A.size() + 0.0000000001)) - w));
int end = min((int)B.size() + 1, (int)(ceil(i * B.size() / (double)A.size()) + 1) + w);
for (int j = start; j < end; j++) //col - x
{
double u = m[i - 1][j].value;
double l = m[i][j - 1].value;
double d = m[i - 1][j - 1].value;
//double minim = min({ u, l, d });
//double minim = min({ m[i - 1][j].value, m[i][j - 1].value, m[i - 1][j - 1].value });
double minim = 0;
if (l < u)
minim = l;
else
minim = u;
if (minim > d)
minim = d;
m[i][j].value = static_cast<T>(calcul::getDistance_dtw(A[i - 1], B[j - 1]) + minim);
/* if(m[i - 1][j].value > m[i][j].value && m[i][j - 1].value > m[i][j].value && m[i - 1][j - 1].value > m[i][j].value)
minim++;
if (m[i][j].value < minim)
minim++;*/
}
}
//stringstream ss;
//ss << endl;
//ss << setprecision(4);
//for (size_t i = 0; i < 20; i++)
//{
// for (size_t j = 0; j < 20; j++)
// {
// ss << setw(9) << m[i][j].value << " ";
// }
// ss << endl;
//}
// /*ss << setprecision(4);
// for (size_t i = A.size() - 20; i < A.size() + 1; i++)
// {
// for (size_t j = B.size() - 20; j < B.size() + 1; j++)
// {
// ss << m[i][j].value<< " ";
// }
// ss << endl;
// }*/
// cout << ss.str() << endl;
auto backtrack = backtrack(m, A.size(), B.size());
backtrack.rawScore = m[A.size()][B.size()].value;
for (int i = 0; i < A.size() + 1; i++) {
delete[] m[i];
}
delete[] m;
return backtrack;
}
template<class T>
warpPath dtw::backtrack(node<T>** const &m, size_t i, size_t j)
{
warpPath wp;
double ratio = j / static_cast<double>(i);
while (i > 0 && j > 0)
{
wp.sumScore += m[i][j].value;
double u = m[i - 1][j].value;
double l = m[i][j - 1].value;
double d = m[i - 1][j - 1].value;
if (min({ d, u, l }) == d /*&& y > 1 && x > 1*/)
{
wp.path = "M" + wp.path;
i--;
j--;
}
else
{
if(l < u)
{
wp.path = "L" + wp.path;
j--;
}
else if(u < l)
{
wp.path = "U" + wp.path;
i--;
}
else
{
if(i * ratio > 1)
{
wp.path = "U" + wp.path;
i--;
}
else
{
wp.path = "L" + wp.path;
j--;
}
}
}
}
while (i > 0)
{
wp.path = "U" + wp.path;
i--;
}
while (j > 0)
{
wp.path = "L" + wp.path;
j--;
}
return wp;
}
template<class T>
warpPath dtw::createMatrix2(vtr2<double> const &A, vtr2<double> const &B, parameter const &params)
{ {
Vtr<node<T>, 2> m(A.size() + 1); Vtr<node<T>, 2> m(A.size() + 1);
for (int i = 0; i < A.size() + 1; i++) for (int i = 0; i < A.size() + 1; i++)
...@@ -236,26 +101,25 @@ warpPath dtw::createMatrix2(vtr2<double> const &A, vtr2<double> const &B, parame ...@@ -236,26 +101,25 @@ warpPath dtw::createMatrix2(vtr2<double> const &A, vtr2<double> const &B, parame
minim++;*/ minim++;*/
} }
} }
auto end = findMinEnd(m, params.relaxation);
auto backtrack = backtrack2(m, end.i, end.j, params); auto end = findRelaxedEnd(m, params.relaxation);
backtrack.rawScore = m[end.i][end.j].value; auto back = backtrack(m, end.i, end.j, params);
back.scoreRaw = m[end.i][end.j].value;
if (params.isPin()) if (params.isPin())
cout << endl << print::printPathShape(backtrack.path, end, (int)A.size() + 1, (int)B.size() + 1); cout << endl << print::printPathShape(back.path, end, (int)A.size() + 1, (int)B.size() + 1);
return backtrack; return back;
} }
template<class T> template<class T>
warpPath dtw::backtrack2(vtr2<node<T>> const &m, size_t i, size_t j, parameter const &params) warpPath dtw::backtrack(vtr2<node<T>> const &m, size_t i, size_t j, parameter const &params)
{ {
warpPath wp; warpPath wp;
double ratio = j / static_cast<double>(i); double ratio = j / static_cast<double>(i);
while (i > 0 && j > 0) while (i > 0 && j > 0)
{ {
wp.sumScore += m[i][j].value;
double u = m[i - 1][j].value; double u = m[i - 1][j].value;
double l = m[i][j - 1].value; double l = m[i][j - 1].value;
double d = m[i - 1][j - 1].value; double d = m[i - 1][j - 1].value;
...@@ -309,7 +173,7 @@ warpPath dtw::backtrack2(vtr2<node<T>> const &m, size_t i, size_t j, parameter c ...@@ -309,7 +173,7 @@ warpPath dtw::backtrack2(vtr2<node<T>> const &m, size_t i, size_t j, parameter c
} }
template<class T> template<class T>
coords dtw::findMinEnd(vtr2<node<T>> const &m, int relaxation) coords dtw::findRelaxedEnd(vtr2<node<T>> const &m, int relaxation)
{ {
double tmp = numeric_limits<double>::max(); double tmp = numeric_limits<double>::max();
coords min; coords min;
...@@ -361,3 +225,140 @@ coords dtw::findMinEnd(vtr2<node<T>> const &m, int relaxation) ...@@ -361,3 +225,140 @@ coords dtw::findMinEnd(vtr2<node<T>> const &m, int relaxation)
// //
// return str; // return str;
//} //}
//template<class T>
//warpPath dtw::createMatrix(vtr2<double> const &A, vtr2<double> const &B, parameter const &params)
//{
// node<T>** m = new node<T>*[A.size() + 1];
// for (int i = 0; i < A.size() + 1; i++)
// m[i] = new node<T>[B.size() + 1];
//
// m[0][0].value = 0;
//
// int w = (int)(B.size() * params.w);
// for (int i = 1; i < A.size() + 1; i++) //row - y
// {
// int start = max(1, (int)(ceil((i - 1) * (B.size() / (double)A.size() + 0.0000000001)) - w));
// int end = min((int)B.size() + 1, (int)(ceil(i * B.size() / (double)A.size()) + 1) + w);
// for (int j = start; j < end; j++) //col - x
// {
// double u = m[i - 1][j].value;
// double l = m[i][j - 1].value;
// double d = m[i - 1][j - 1].value;
// //double minim = min({ u, l, d });
//
// //double minim = min({ m[i - 1][j].value, m[i][j - 1].value, m[i - 1][j - 1].value });
// double minim = 0;
// if (l < u)
// minim = l;
// else
// minim = u;
//
// if (minim > d)
// minim = d;
//
// m[i][j].value = static_cast<T>(calcul::distance_dtw(A[i - 1], B[j - 1]) + minim);
//
// /* if(m[i - 1][j].value > m[i][j].value && m[i][j - 1].value > m[i][j].value && m[i - 1][j - 1].value > m[i][j].value)
// minim++;
//
// if (m[i][j].value < minim)
// minim++;*/
// }
// }
//
// //stringstream ss;
//
// //ss << endl;
// //ss << setprecision(4);
// //for (size_t i = 0; i < 20; i++)
// //{
// // for (size_t j = 0; j < 20; j++)
// // {
// // ss << setw(9) << m[i][j].value << " ";
// // }
// // ss << endl;
// //}
// // /*ss << setprecision(4);
// // for (size_t i = A.size() - 20; i < A.size() + 1; i++)
// // {
// // for (size_t j = B.size() - 20; j < B.size() + 1; j++)
// // {
// // ss << m[i][j].value<< " ";
// // }
// // ss << endl;
// // }*/
// // cout << ss.str() << endl;
//
// auto backtrack = this.backtrack(m, A.size(), B.size());
// backtrack.rawScore = m[A.size()][B.size()].value;
//
// for (int i = 0; i < A.size() + 1; i++) {
// delete[] m[i];
// }
// delete[] m;
//
// return backtrack;
//}
//
//template<class T>
//warpPath dtw::backtrack(node<T>** const &m, size_t i, size_t j)
//{
// warpPath wp;
// double ratio = j / static_cast<double>(i);
//
// while (i > 0 && j > 0)
// {
// wp.sumScore += m[i][j].value;
//
// double u = m[i - 1][j].value;
// double l = m[i][j - 1].value;
// double d = m[i - 1][j - 1].value;
// if (min({ d, u, l }) == d /*&& y > 1 && x > 1*/)
// {
// wp.path = "M" + wp.path;
// i--;
// j--;
// }
// else
// {
// if (l < u)
// {
// wp.path = "L" + wp.path;
// j--;
// }
// else if (u < l)
// {
// wp.path = "U" + wp.path;
// i--;
// }
// else
// {
// if (i * ratio > 1)
// {
// wp.path = "U" + wp.path;
// i--;
// }
// else
// {
// wp.path = "L" + wp.path;
// j--;
// }
// }
// }
// }
//
// while (i > 0)
// {
// wp.path = "U" + wp.path;
// i--;
// }
//
// while (j > 0)
// {
// wp.path = "L" + wp.path;
// j--;
// }
//
// return wp;
//}
\ No newline at end of file
...@@ -11,18 +11,13 @@ public: ...@@ -11,18 +11,13 @@ public:
//Returns alignment similarity. //Returns alignment similarity.
static double alignment(vtr2<double> const &, vtr2<double> const &, parameter const &params); static double alignment(vtr2<double> const &, vtr2<double> const &, parameter const &params);
//Returns 'distance matrix' for 2 input sequence. //Returns 'distance matrix' for 2 input sequence.
template<class T>
static warpPath createMatrix(vtr2<double> const &, vtr2<double> const &, parameter const &params);
//Returns 'warping path' generated form distance matrix.
template<class T>
static warpPath backtrack(node<T>** const &m, size_t, size_t);
template<class T> template<class T>
static warpPath createMatrix2(vtr2<double> const &, vtr2<double> const &, parameter const &params); static warpPath createMatrix(vtr2<double> const &, vtr2<double> const &, parameter const &params);
template<class T> template<class T>
static warpPath backtrack2(vtr2<node<T>> const & m, size_t i, size_t j, parameter const &params); static warpPath backtrack(vtr2<node<T>> const & m, size_t i, size_t j, parameter const &params);
template<class T> template<class T>
static coords findMinEnd(vtr2<node<T>> const &m, int relaxation); static coords findRelaxedEnd(vtr2<node<T>> const &m, int relaxation);
//Log //Log
//static std::string log(result const &, parameter const &); //static std::string log(result const &, parameter const &);
...@@ -36,4 +31,10 @@ public: ...@@ -36,4 +31,10 @@ public:
//template<class T> //template<class T>
//static warpPath Backtrack2(T** const &m, size_t, size_t); //static warpPath Backtrack2(T** const &m, size_t, size_t);
//template<class T>
//static warpPath createMatrix(vtr2<double> const &, vtr2<double> const &, parameter const &params);
////Returns 'warping path' generated form distance matrix.
//template<class T>
//static warpPath backtrack(node<T>** const &m, size_t, size_t);
}; };
...@@ -25,13 +25,13 @@ public: ...@@ -25,13 +25,13 @@ public:
class warpPath class warpPath
{ {
public: public:
warpPath() : path(""), rawScore(0), normScore(0), sumScore(0) {} warpPath() : path(""), scoreRaw(0)/*, normScore(0), sumScore(0)*/ {}
~warpPath() {} ~warpPath() {}
std::string path; //path std::string path; //path
double rawScore; double scoreRaw;
double normScore; //double normScore;
double sumScore; //double sumScore;
}; };
struct result_operation struct result_operation
...@@ -42,7 +42,7 @@ struct result_operation ...@@ -42,7 +42,7 @@ struct result_operation
struct result_pdtw struct result_pdtw
{ {
double normScore; double scoreNorm;
std::string tree; std::string tree;
}; };
......
...@@ -273,27 +273,16 @@ vtr3<double> help::separateSequenceOne(vtr2<double> const &input) ...@@ -273,27 +273,16 @@ vtr3<double> help::separateSequenceOne(vtr2<double> const &input)
return output; return output;
} }
void help::reduce(vtr3<double> &input, string const &skip) void help::reduce(vtr3<double> &input, int skip)
{ {
vtr3<double> output(input.size());
for (size_t i = 0; i < input.size(); i++) for (size_t i = 0; i < input.size(); i++)
{ {
for (int j = 0; j < skip.size(); j++) vtr2<double> row;
{ for (int j = skip - 1; j < input[i].size(); j += skip)
vtr2<double> s;
int c = 1;
int remove = skip.at(j) - '0';
for (int k = 0; k < input[i].size(); k++) //lenght of sequence
{ {
if (c % remove != 0) row.push_back(input[i][j]);
s.push_back(input[i][k]);
c++;
}
input[i] = s;
} }
input[i] = row;
} }
} }
......
...@@ -29,7 +29,7 @@ public: ...@@ -29,7 +29,7 @@ public:
static void normalizeZeroOne(vtr3<double> &input, double max); static void normalizeZeroOne(vtr3<double> &input, double max);
//Returns shortened input sequence by skiping some of their elements. //Returns shortened input sequence by skiping some of their elements.
static void reduce(vtr3<double> &input, std::string const &skip); static void reduce(vtr3<double> &input, int skip);
//Returns piecewise aggregate approximation of sequence. //Returns piecewise aggregate approximation of sequence.
static vtr3<double> paa(vtr3<double> const &input, int ratio); static vtr3<double> paa(vtr3<double> const &input, int ratio);
......
...@@ -33,11 +33,14 @@ double lcss::alignment(vtr2<double> const &A, vtr2<double> const &B, parameter c ...@@ -33,11 +33,14 @@ double lcss::alignment(vtr2<double> const &A, vtr2<double> const &B, parameter c
double result = 0; double result = 0;
if (params.scoreType == 1) if (params.scoreType == 1)
result = 1 - backtrack.rawScore / backtrack.path.size(); result = calcul::scorePair_lcss_s1(backtrack.scoreRaw, backtrack.path.size());
//result = 1 - backtrack.rawScore / backtrack.path.size();
else if (params.scoreType == 2) else if (params.scoreType == 2)
result = backtrack.normScore; result = calcul::scorePair_lcss_s1(backtrack.scoreRaw, min(A.size(), B.size()));
else if (params.scoreType == 3)
result = backtrack.scoreRaw;
else else
result = backtrack.rawScore; result = 0;
if (params.isRatioReversed()) if (params.isRatioReversed())
return 1 - result; return 1 - result;
...@@ -134,8 +137,8 @@ warpPath lcss::backtrack(vector<vector<node<T>>> const &m, vtr2<double> const &A ...@@ -134,8 +137,8 @@ warpPath lcss::backtrack(vector<vector<node<T>>> const &m, vtr2<double> const &A
warpPath wp; warpPath wp;
wp.path = path; wp.path = path;
wp.rawScore = m[A.size()][B.size()].value; wp.scoreRaw = m[A.size()][B.size()].value;
wp.normScore = 1 - calcul::getPairRatio_lcss((int)(A.size() + B.size()), (int)wp.rawScore); //wp.normScore = 1 - calcul::getPairRatio_lcss((int)(A.size() + B.size()), (int)wp.rawScore);
return wp; return wp;
} }
\ No newline at end of file
...@@ -37,11 +37,13 @@ int main(int argc, char* argv[]) ...@@ -37,11 +37,13 @@ int main(int argc, char* argv[])
if(scripts.size() > 0) if(scripts.size() > 0)
{ {
size_t start = args.size() >= 3 ? stoi(args[2]) - 1 : 0; //size_t start = args.size() >= 3 ? stoi(args[2]) - 1 : 0;
size_t end = args.size() == 4 ? stoi(args[3]) : scripts.size(); //size_t end = args.size() == 4 ? stoi(args[3]) : scripts.size();
for (size_t i = start; i < end; i++) for (size_t i = 0; i < scripts.size(); i++)
{ {
mainLogic(help::split(scripts[i], " \t")); auto argsSub = help::split(scripts[i], " \t");
parameter::parameterPriority(argsSub, args);
mainLogic(argsSub);
} }
} }
else else
...@@ -54,7 +56,7 @@ void mainLogic(vtrS const &args) ...@@ -54,7 +56,7 @@ void mainLogic(vtrS const &args)
{ {
auto params = parameter::setParameters(args); auto params = parameter::setParameters(args);
chrono::steady_clock::time_point begin = chrono::steady_clock::now(); auto begin = chrono::steady_clock::now();
//INPUT DATA PARSING //INPUT DATA PARSING
...@@ -64,6 +66,7 @@ void mainLogic(vtrS const &args) ...@@ -64,6 +66,7 @@ void mainLogic(vtrS const &args)
try{ try{
files = dataParser::getFiles(params.inPath); files = dataParser::getFiles(params.inPath);
input = dataParser::readData(params.inPath); input = dataParser::readData(params.inPath);
if(params.isTime())
cout << print::printElapsed("parsing", begin) << endl; cout << print::printElapsed("parsing", begin) << endl;
if(params.isClusterInfo()) if(params.isClusterInfo())
...@@ -96,6 +99,7 @@ void mainLogic(vtrS const &args) ...@@ -96,6 +99,7 @@ void mainLogic(vtrS const &args)
if (params.isSmooth()) if (params.isSmooth())
input = help::smooth(input, params.smooth); input = help::smooth(input, params.smooth);
if(params.isTime())
cout << print::printElapsed("preprocesing", begin) << endl; cout << print::printElapsed("preprocesing", begin) << endl;
if(params.pin) if(params.pin)
...@@ -105,10 +109,17 @@ void mainLogic(vtrS const &args) ...@@ -105,10 +109,17 @@ void mainLogic(vtrS const &args)
auto result = operation::main(input, clusters, params); auto result = operation::main(input, clusters, params);
if(params.isOutput()){ if(params.isWriteOutput()){
print::write(print::printMatrix(result.matrixSimilarity, params), params.outputPath, false); print::write(print::printMatrix(result.matrixSimilarity, params), params.outputPath, false);
} }
if (params.isPrintOutput()) {
if(result.matrixSimilarity.size() > 0)
cout << print::printMatrix(result.matrixSimilarity, params);
if (result.matrixCluster.size() > 0)
cout << print::printMatrix(result.matrixCluster, params);
}
if (params.isHtml()) { if (params.isHtml()) {
print::write(print::printParameterString(args) + "</br>" + print::write(print::printParameterString(args) + "</br>" +
print::printMapRatios(calcul::getMAPratio(result.matrixCluster, clusters)) + print::printMapRatios(calcul::getMAPratio(result.matrixCluster, clusters)) +
...@@ -118,11 +129,5 @@ void mainLogic(vtrS const &args) ...@@ -118,11 +129,5 @@ void mainLogic(vtrS const &args)
if (params.isGdf()) if (params.isGdf())
print::write(print::printGdf(files, input, result.matrixSimilarity, clusters), params.gdf, false); print::write(print::printGdf(files, input, result.matrixSimilarity, clusters), params.gdf, false);
if (params.isOmp()) {
if(result.matrixSimilarity.size() > 0)
cout << print::printMatrix(result.matrixSimilarity, params);
if (result.matrixCluster.size() > 0)
cout << print::printMatrix(result.matrixCluster, params);
}
} }
...@@ -87,6 +87,7 @@ result_operation operation::getSimilarityMatrix(vtr3<double> const &input, param ...@@ -87,6 +87,7 @@ result_operation operation::getSimilarityMatrix(vtr3<double> const &input, param
cout << endl; cout << endl;
} }
if (params.isTime())
cout << print::printElapsed("elapsed", params.startStamp) << endl; cout << print::printElapsed("elapsed", params.startStamp) << endl;
result_operation result; result_operation result;
...@@ -123,6 +124,7 @@ result_operation operation::getSimilarityMatrix_omp(vtr3<double> const &input, p ...@@ -123,6 +124,7 @@ result_operation operation::getSimilarityMatrix_omp(vtr3<double> const &input, p
matrix[j][i] = matrix[i][j]; matrix[j][i] = matrix[i][j];
} }
if (params.isTime())
cout << print::printElapsed("elapsed", params.startStamp) << endl; cout << print::printElapsed("elapsed", params.startStamp) << endl;
result_operation result; result_operation result;
...@@ -208,7 +210,7 @@ result_operation operation::getSimilarityMatrix_dimensions(vtr3<double> const &i ...@@ -208,7 +210,7 @@ result_operation operation::getSimilarityMatrix_dimensions(vtr3<double> const &i
const size_t dims = input[0][0].size(); const size_t dims = input[0][0].size();
vtr3<double> inputSeparated; vtr3<double> inputSeparated;
if (params.operation == 3 || params.operation == 4) //if (params.operation == 3 || params.operation == 4)
inputSeparated = help::separateSequence(input, 2); inputSeparated = help::separateSequence(input, 2);
vtr2<double> matrix; vtr2<double> matrix;
...@@ -219,16 +221,18 @@ result_operation operation::getSimilarityMatrix_dimensions(vtr3<double> const &i ...@@ -219,16 +221,18 @@ result_operation operation::getSimilarityMatrix_dimensions(vtr3<double> const &i
vector<double> simRow; vector<double> simRow;
for (size_t j = dims; j < inputSeparated.size(); j++) for (size_t j = dims; j < inputSeparated.size(); j++)
{ {
double tmp; double tmp = f(inputSeparated[i], inputSeparated[j], params); // needs to be calculated both diagonal matrices !
tmp = f(inputSeparated[i], inputSeparated[j], params); if(params.operation == 3)
cout << setw(params.precision + 3) << fixed << tmp; cout << setw(params.precision + 3) << fixed << tmp;
simRow.push_back(tmp); simRow.push_back(tmp);
} }
if (params.operation == 3)
cout << endl; cout << endl;
matrix.push_back(simRow); matrix.push_back(simRow);
} }
if (params.isTime() && params.operation == 3)
cout << print::printElapsed("elapsed", params.startStamp); cout << print::printElapsed("elapsed", params.startStamp);
result_operation result; result_operation result;
...@@ -242,7 +246,6 @@ result_operation operation::getSimilarityMatrix_dimensions_omp(vtr3<double> cons ...@@ -242,7 +246,6 @@ result_operation operation::getSimilarityMatrix_dimensions_omp(vtr3<double> cons
const int dims = (int)input[0][0].size(); const int dims = (int)input[0][0].size();
vtr3<double> inputSeparated; vtr3<double> inputSeparated;
if (params.operation == 3 || params.operation == 4)
inputSeparated = help::separateSequence(input, 2); inputSeparated = help::separateSequence(input, 2);
vtr2<double> matrix(dims); vtr2<double> matrix(dims);
...@@ -261,9 +264,10 @@ result_operation operation::getSimilarityMatrix_dimensions_omp(vtr3<double> cons ...@@ -261,9 +264,10 @@ result_operation operation::getSimilarityMatrix_dimensions_omp(vtr3<double> cons
double tmp = f(inputSeparated[i], inputSeparated[j + dims], params); double tmp = f(inputSeparated[i], inputSeparated[j + dims], params);
matrix[i][j] = tmp; matrix[i][j] = tmp;
matrix[j][i] = tmp; //matrix[j][i] = tmp;
} }
if (params.isTime())
cout << print::printElapsed("elapsed", params.startStamp) << endl; cout << print::printElapsed("elapsed", params.startStamp) << endl;
result_operation result; result_operation result;
...@@ -274,7 +278,8 @@ result_operation operation::getSimilarityMatrix_dimensions_omp(vtr3<double> cons ...@@ -274,7 +278,8 @@ result_operation operation::getSimilarityMatrix_dimensions_omp(vtr3<double> cons
result_operation operation::getBestSimilarityMatrix_dimensions(vtr3<double> const &input, parameter const &params, FUNC f) result_operation operation::getBestSimilarityMatrix_dimensions(vtr3<double> const &input, parameter const &params, FUNC f)
{ {
vtr2<double> matrix; result_operation result;
vtr2<double> matrixSim;
cout << setprecision(params.precision); cout << setprecision(params.precision);
for (size_t i = 0; i < input.size(); i++) for (size_t i = 0; i < input.size(); i++)
...@@ -289,15 +294,15 @@ result_operation operation::getBestSimilarityMatrix_dimensions(vtr3<double> cons ...@@ -289,15 +294,15 @@ result_operation operation::getBestSimilarityMatrix_dimensions(vtr3<double> cons
if (i >= j) if (i >= j)
{ {
matrixSim = getSimilarityMatrix_dimensions(subInput, params, f).matrixSimilarity;
double maxSim = -1; double maxSim = -1;
for (int i = 0; i < matrix.size(); i++) for (int i = 0; i < matrixSim.size(); i++)
{ {
for (int j = 0; j < matrix[i].size(); j++) for (int j = 0; j < matrixSim[i].size(); j++)
{
if (maxSim < matrix[i][j])
{ {
maxSim = matrix[i][j]; if (maxSim < matrixSim[i][j])
} maxSim = matrixSim[i][j];
} }
} }
...@@ -309,13 +314,14 @@ result_operation operation::getBestSimilarityMatrix_dimensions(vtr3<double> cons ...@@ -309,13 +314,14 @@ result_operation operation::getBestSimilarityMatrix_dimensions(vtr3<double> cons
} }
cout << endl; cout << endl;
matrix.push_back(simRow); result.matrixSimilarity.push_back(simRow);
} }
if (params.isTime())
cout << print::printElapsed("elapsed", params.startStamp); cout << print::printElapsed("elapsed", params.startStamp);
result_operation result; /* result_operation result;
result.matrixSimilarity = matrix; result.matrixSimilarity = matrix;*/
return result; return result;
} }
...@@ -341,13 +347,17 @@ result_operation operation::getBestSimilarityMatrix_dimensions_omp(vtr3<double> ...@@ -341,13 +347,17 @@ result_operation operation::getBestSimilarityMatrix_dimensions_omp(vtr3<double>
if (i >= j) if (i >= j)
{ {
matrix = getSimilarityMatrix_dimensions(subInput, params, f).matrixSimilarity;
double maxSim = -1; double maxSim = -1;
for (int i = 0; i < matrix.size(); i++) for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j< matrix[i].size(); j++) for (int j = 0; j< matrix[i].size(); j++)
if (maxSim < matrix[i][j])
{ {
if (maxSim < matrix[i][j])
maxSim = matrix[i][j]; maxSim = matrix[i][j];
} }
}
cout << setw(params.precision + 3) << fixed << maxSim; cout << setw(params.precision + 3) << fixed << maxSim;
simRow.push_back(maxSim); simRow.push_back(maxSim);
...@@ -359,7 +369,8 @@ result_operation operation::getBestSimilarityMatrix_dimensions_omp(vtr3<double> ...@@ -359,7 +369,8 @@ result_operation operation::getBestSimilarityMatrix_dimensions_omp(vtr3<double>
matrix.push_back(simRow); matrix.push_back(simRow);
} }
cout << print::printElapsed("elapsed", params.startStamp); if(params.isTime())
cout << print::printElapsed("elapsed", params.startStamp) << endl;
result_operation result; result_operation result;
result.matrixSimilarity = matrix; result.matrixSimilarity = matrix;
......
...@@ -37,12 +37,6 @@ parameter parameter::setParameters(vtrS const &args) ...@@ -37,12 +37,6 @@ parameter parameter::setParameters(vtrS const &args)
map<string, string> parameter::mapParameters(vtrS const &args) map<string, string> parameter::mapParameters(vtrS const &args)
{ {
map<string, string> map; map<string, string> map;
/*vector<string> args;
for (size_t i = 0; i < argc; i++)
{
args.push_back(argv[i]);
}*/
for (size_t i = 0; i < args.size() - 1; i++) for (size_t i = 0; i < args.size() - 1; i++)
{ {
...@@ -71,6 +65,8 @@ map<string, string> parameter::mapParameters(vtrS const &args) ...@@ -71,6 +65,8 @@ map<string, string> parameter::mapParameters(vtrS const &args)
map["-smooth"] = mapOptionalParameter(args, (int)i + 1, "3"); map["-smooth"] = mapOptionalParameter(args, (int)i + 1, "3");
else if (args[i] == "-rr") else if (args[i] == "-rr")
map["-rr"] = "true"; map["-rr"] = "true";
else if (args[i] == "-time")
map["-time"] = "true";
} }
} }
...@@ -139,7 +135,7 @@ void parameter::checkParameters(parameter const &params, map<string, string> con ...@@ -139,7 +135,7 @@ void parameter::checkParameters(parameter const &params, map<string, string> con
throw runtime_error("Invalid score type setting"); throw runtime_error("Invalid score type setting");
} }
if (mapSetting.count("-r") > 0 && params.reduce != "") if (mapSetting.count("-r") > 0 && params.reduce < 2)
{ {
throw runtime_error("Invalid reduction setting"); throw runtime_error("Invalid reduction setting");
} }
...@@ -186,10 +182,11 @@ parameter parameter::useParameters(map<string, string> &mapSetting) ...@@ -186,10 +182,11 @@ parameter parameter::useParameters(map<string, string> &mapSetting)
params.normalize = mapSetting.count("-n") > 0 ? stoi(mapSetting.at("-n")) : params.normalize; params.normalize = mapSetting.count("-n") > 0 ? stoi(mapSetting.at("-n")) : params.normalize;
params.omp = mapSetting.count("-omp") > 0 ? stoi(mapSetting.at("-omp")) : params.omp; params.omp = mapSetting.count("-omp") > 0 ? stoi(mapSetting.at("-omp")) : params.omp;
params.precision = mapSetting.count("-p") > 0 ? stoi(mapSetting.at("-p")) : params.precision; params.precision = mapSetting.count("-p") > 0 ? stoi(mapSetting.at("-p")) : params.precision;
params.reduce = mapSetting.count("-r") > 0 ? mapSetting.at("-r") : params.reduce; params.reduce = mapSetting.count("-r") > 0 ? stoi(mapSetting.at("-r")) : params.reduce;
params.paa = mapSetting.count("-paa") > 0 ? stoi(mapSetting.at("-paa")) : params.paa; params.paa = mapSetting.count("-paa") > 0 ? stoi(mapSetting.at("-paa")) : params.paa;
params.dmDataType = mapSetting.count("-type") > 0 ? mapSetting.at("-type") : params.dmDataType; params.dmDataType = mapSetting.count("-type") > 0 ? mapSetting.at("-type") : params.dmDataType;
params.pin = mapSetting.count("-pin") > 0 ? true : params.pin; params.pin = mapSetting.count("-pin") > 0 ? true : params.pin;
params.timeMeasure = mapSetting.count("-time") > 0 ? true : params.timeMeasure;
params.clusterInfoPath = mapSetting.count("-c") > 0 ? mapSetting.at("-c") : ""; params.clusterInfoPath = mapSetting.count("-c") > 0 ? mapSetting.at("-c") : "";
params.smooth = mapSetting.count("-smooth") > 0 ? stoi(mapSetting.at("-smooth")): 0; params.smooth = mapSetting.count("-smooth") > 0 ? stoi(mapSetting.at("-smooth")): 0;
params.scoreReversed = mapSetting.count("-rr") > 0 ? true : false; params.scoreReversed = mapSetting.count("-rr") > 0 ? true : false;
...@@ -212,7 +209,15 @@ bool parameter::isOmp() const ...@@ -212,7 +209,15 @@ bool parameter::isOmp() const
return false; return false;
} }
bool parameter::isOutput() const bool parameter::isWriteOutput() const
{
if (outputPath != "")
return true;
else
return false;
}
bool parameter::isPrintOutput() const
{ {
if (outputPath != "") if (outputPath != "")
return true; return true;
...@@ -230,7 +235,7 @@ bool parameter::isPaa() const ...@@ -230,7 +235,7 @@ bool parameter::isPaa() const
bool parameter::isReduce() const bool parameter::isReduce() const
{ {
if (reduce != "") if (reduce > 1)
return true; return true;
else else
return false; return false;
...@@ -270,11 +275,6 @@ bool parameter::isClusterInfo() const ...@@ -270,11 +275,6 @@ bool parameter::isClusterInfo() const
return false; return false;
} }
bool parameter::isPin() const
{
return pin;
}
bool parameter::isHtml() const bool parameter::isHtml() const
{ {
if (html != "") if (html != "")
...@@ -283,6 +283,49 @@ bool parameter::isHtml() const ...@@ -283,6 +283,49 @@ bool parameter::isHtml() const
return false; return false;
} }
bool parameter::isPin() const
{
return pin;
}
bool parameter::isTime() const
{
return timeMeasure;
}
void parameter::parameterPriority(vtr<string> &args, vtr<string> const &argsPriority)
{
for (size_t i = 2; i < argsPriority.size(); i++)
{
if (argsPriority[i][0] != '-')
continue;
bool insert = true;
for (size_t j = 0; j < args.size(); j++)
{
if (args[j][0] != '-')
continue;
if (argsPriority[i] == args[j]) {
args[j + 1] = argsPriority[i + 1];
insert = false;
}
}
if (insert)
{
args.push_back(argsPriority[i]);
int c = 1;
while (i + c < argsPriority.size() && argsPriority[i + c][0] != '-')
{
args.push_back(argsPriority[i + 1]);
c++;
}
}
}
}
void parameter::printHelp() void parameter::printHelp()
{ {
cout << "I/O options"; cout << "I/O options";
......
...@@ -31,7 +31,7 @@ public: ...@@ -31,7 +31,7 @@ public:
std::string dmDataType; //data type of nodes in distance matrix std::string dmDataType; //data type of nodes in distance matrix
//data preprocessing options //data preprocessing options
std::string reduce; //reduction of input data by omiting elements from sequence -r [2-every second, 3-every hird elm removed] int reduce; //reduction of input data by omiting elements from sequence -r [2 - takes every second, 3 - every third elm removed]
bool interpolate; //parameter -i will interpolate input s to same length bool interpolate; //parameter -i will interpolate input s to same length
bool znormalize; //parameter -n will normalize input data bool znormalize; //parameter -n will normalize input data
int normalize; //parameter -zn will normalize data into interval <0,1> int normalize; //parameter -zn will normalize data into interval <0,1>
...@@ -45,14 +45,15 @@ public: ...@@ -45,14 +45,15 @@ public:
//time stamp when choosen method started //not used currently //time stamp when choosen method started //not used currently
std::chrono::steady_clock::time_point startStamp; std::chrono::steady_clock::time_point startStamp;
bool timeMeasure;
//default init //default init
parameter() : parameter() :
method("dtw"), operation(0), scoreType(1), omp(0), dmDataType("double"), scoreReversed(false), method("dtw"), operation(0), scoreType(1), omp(0), dmDataType("double"), scoreReversed(false),
w(1), delta(10), epsilon(0), relaxation(0), w(1), delta(10), epsilon(0), relaxation(0),
gdf(""), outputPath(""), clusterInfoPath(""), html(""), gdf(""), outputPath(""), clusterInfoPath(""), html(""),
normalize(-1), znormalize(false), interpolate(false), precision(3), reduce(""), paa(1), smooth(0), normalize(-1), znormalize(false), interpolate(false), precision(3), reduce(0), paa(1), smooth(0),
pin(false) pin(false), timeMeasure(false)
{}; {};
~parameter() {}; ~parameter() {};
...@@ -63,11 +64,13 @@ public: ...@@ -63,11 +64,13 @@ public:
static parameter useParameters(std::map<std::string, std::string> &mapSetting); static parameter useParameters(std::map<std::string, std::string> &mapSetting);
static std::string mapMultiParameter(vtrS const &args, int idx); static std::string mapMultiParameter(vtrS const &args, int idx);
static void checkParameters(parameter const &params, std::map<std::string, std::string> const &mapSetting); static void checkParameters(parameter const &params, std::map<std::string, std::string> const &mapSetting);
static void parameterPriority(vtr<std::string> &args, vtr<std::string> const &argsPriority);
static void printHelp(); static void printHelp();
bool isClusterInfo() const; bool isClusterInfo() const;
bool isGdf() const; bool isGdf() const;
bool isOutput() const; bool isWriteOutput() const;
bool isPrintOutput() const;
bool isHtml() const; bool isHtml() const;
bool isZNormalization() const; bool isZNormalization() const;
...@@ -80,4 +83,5 @@ public: ...@@ -80,4 +83,5 @@ public:
bool isRatioReversed() const; bool isRatioReversed() const;
bool isPin() const; bool isPin() const;
bool isTime() const;
}; };
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment