aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/util/lib/LTKDynamicTimeWarping.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/util/lib/LTKDynamicTimeWarping.h')
-rw-r--r--src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/util/lib/LTKDynamicTimeWarping.h566
1 files changed, 0 insertions, 566 deletions
diff --git a/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/util/lib/LTKDynamicTimeWarping.h b/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/util/lib/LTKDynamicTimeWarping.h
deleted file mode 100644
index dced46bc..00000000
--- a/src/plugins/lipi-toolkit/3rdparty/lipi-toolkit/src/util/lib/LTKDynamicTimeWarping.h
+++ /dev/null
@@ -1,566 +0,0 @@
-/*****************************************************************************************
-* Copyright (c) 2006 Hewlett-Packard Development Company, L.P.
-* Permission is hereby granted, free of charge, to any person obtaining a copy of
-* this software and associated documentation files (the "Software"), to deal in
-* the Software without restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-* Software, and to permit persons to whom the Software is furnished to do so,
-* subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*****************************************************************************************/
-
-/************************************************************************
- * SVN MACROS
- *
- * $LastChangedDate: 2008-01-11 14:11:25 +0530 (Fri, 11 Jan 2008) $
- * $Revision: 359 $
- * $Author: sundarn $
- *
- ************************************************************************/
-#ifndef __DYNAMICTIMEWARPING_H
-#define __DYNAMICTIMEWARPING_H
-
-#include <iostream>
-#include <cstdlib>
-#include <string>
-#include <vector>
-#ifndef _WIN32
-//#include <values.h>
-#endif
-#include <limits>
-#include <algorithm>
-#include <cmath>
-#include <deque>
-
-
-using namespace std;
-
-template <typename TimeSeriesElementType, typename DistanceType>
-//TimeSeriesElementType - pointer of type feature (LTKShapeFeature * etc.)
-//DistanceType - type of distance (float, int etc.)
-
-
-
-/**
- * @class DTWShapeRecognizer
- */
-class DynamicTimeWarping
-{
- private:
-
- vector<vector <DistanceType> > m_cumulativeDistance; // Cumulative distance matrix
-
- vector<vector<int> > m_phi; // phi matrix required for path computation
-
- //function pointer type of the function that defines local distance function
- typedef void (*FN_PTR_DISTANCE)(const TimeSeriesElementType&, const TimeSeriesElementType&, DistanceType&) ;
-
-
- DistanceType m_maxVal;
- // Max val (like FLT_MAX etc),
- // this max value that can be returned
- // local distance
-
-
- /**
- * This function back tracks and calculates the DTW warping path from the DTW distance matrix
- * @param1 lastPointYIndex is the x index of the point from which back tracking has to start
- * @param1 lastPointXIndex is the y index of the point from which back tracking has to start
- */
- void populatePath(int lastPointYIndex, int lastPointXIndex, deque<vector<int> >& warpingPath)
- {
-
- int yIndex = lastPointYIndex;
- int xIndex = lastPointXIndex;
- vector<int > indices(2);
- int tb; // req for warping path
- int k,p; // loop variables
-
- //Path Computation
-
- indices[0] = yIndex;
- indices[1] = xIndex;
- warpingPath.push_front(indices);
-
- while((yIndex > 0) && (xIndex > 0))
- {
- tb = m_phi[yIndex][xIndex];
- if (tb == 2)
- {
- yIndex--;
- xIndex--;
- indices[0] = yIndex;
- indices[1] = xIndex;
- }
- else if(tb == 0)
- {
- yIndex--;
- indices[0] = yIndex;
- indices[1] = xIndex;
- }
- else if (tb == 1)
- {
- xIndex--;
- indices[0] = yIndex;
- indices[1] = xIndex;
- }
-
- warpingPath.push_front(indices);
-
- }
-
- if((yIndex > 0) && (xIndex == 0))
- {
- --yIndex;
- for(k = yIndex; k >= 0; --k)
- {
- indices[0] = (k);
- indices[1] = (0);
- warpingPath.push_front(indices);
- }
- }
- else if(( yIndex == 0) && (xIndex > 0))
- {
- --xIndex;
- for(p = xIndex; p >= 0; --p)
- {
- indices[0] = (0);
- indices[1] = (p);
- warpingPath.push_front(indices);
- }
- }
-
- }
-
- public:
-
-
-
- /** @name Constructors and Destructor */
- //@{
-
- /**
- * This Constructor takes the size of the input train character,
- * size of input test character, Max Value (ie FLT_MAX, INT_MAX etc)
- * Local distance function, reduce by half function, and banding value
- */
-
- DynamicTimeWarping()
- {
-
-
- }
-
-
- /**
- * Destructor
- */
-
- ~DynamicTimeWarping(){};
-
- /**
- * @name Methods
- */
-
- //@{
-
-
- /**
- * This function computes the DTW distance between the two vectors.
- * @param train This is an input parameter and corresponds to the first vector
- * @param test This is an input parameter and corresponds to the second vector
- * @param local This is the function pointer to the local distance function
- * @param distanceDTW This is the output parameter which gives the DTW distance between the two vectors.
- * @param warpingPath This is the output parameter which gives DTW warping path
- * @param banding This is the banding value for the DTW Matrix
- * @param bestSoFar This is an imput parameter as stoping criteria based on Best So Far
- * @param maxVal This is used to pass the maximum possible value for the DTW distance
- */
-/*
- int computeDTW(const vector <TimeSeriesElementType>& train,
- const vector <TimeSeriesElementType>& test,
- FN_PTR_DISTANCE localDistPtr,
- DistanceType& distanceDTW,
- deque<vector<int> >& warpingPath,
- int banding=0, DistanceType bestSoFar=numeric_limits<DistanceType>::infinity(),
- DistanceType maxVal=numeric_limits<DistanceType>::infinity())
- */
- int computeDTW(const vector <TimeSeriesElementType>& train,
- const vector <TimeSeriesElementType>& test,
- FN_PTR_DISTANCE localDistPtr,
- DistanceType& distanceDTW,
- deque<vector<int> >& warpingPath,
- float banding=0, DistanceType bestSoFar=numeric_limits<DistanceType>::infinity(),
- DistanceType maxVal=numeric_limits<DistanceType>::infinity())
-
- {
- m_maxVal = maxVal;
- if(localDistPtr == NULL)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< ENULL_POINTER <<":"<< getErrorMessage(ENULL_POINTER)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
-
- LTKReturnError(ENULL_POINTER);
- }
- int trainSize = train.size(); //Temporary variables to store the size of the train and test vectors.
- if(trainSize == 0)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< EEMPTY_VECTOR <<":"<< getErrorMessage(EEMPTY_VECTOR)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
- LTKReturnError(EEMPTY_VECTOR);
- }
- int testSize = test.size(); //Temporary variables to store the size of the train and test vectors.
- if(testSize == 0)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< EEMPTY_VECTOR <<":"<< getErrorMessage(EEMPTY_VECTOR)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
- LTKReturnError(EEMPTY_VECTOR);
- }
-
- float testBanding = floor(testSize*(1-banding));
- float trainBanding = floor(trainSize*(1-banding));
- banding = (trainBanding < testBanding)?trainBanding:testBanding;
-
- int banded = 0;
-
- if(banding < 0 || banding >= trainSize || banding >= testSize)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< ENEGATIVE_NUM <<":"<< getErrorMessage(ENEGATIVE_NUM)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
-
- LTKReturnError(ECONFIG_FILE_RANGE);
- }
- else
- {
- banded = banding; // is the variable used for fixing the band in the computation of the distance matrix.
- // this is the number of elements from the matrix
- // boundary for which computation will be skipped
- }
-
- int trunkI = banded; //Temporary variables used to keep track of the band in the distance matrix.
-
- int trunkJ = 0; //Temporary variables used to keep track of the band in the distance matrix.
-
- int i,j,l; //index variables
-
- if(m_cumulativeDistance.size() == 0)
- {
- vector <DistanceType> dVec(testSize,m_maxVal);
- vector <int> phiVec(testSize,0);
-
- for(i = 0; i < trainSize; ++i)
- {
- m_cumulativeDistance.push_back(dVec);
- m_phi.push_back(phiVec);
- }
- }
- else if(trainSize > m_cumulativeDistance.size() || testSize > m_cumulativeDistance[0].size())
- {
- m_cumulativeDistance.clear();
- m_phi.clear();
- vector <DistanceType> dVec(testSize,m_maxVal);
- vector <int> phiVec(testSize,0);
-
- for(i = 0; i < trainSize; ++i)
- {
- m_cumulativeDistance.push_back(dVec);
- m_phi.push_back(phiVec);
- }
-
- }
- else
- {
- for(i=0; i<m_cumulativeDistance.size(); i++)
- {
- for(j=0; j<m_cumulativeDistance[0].size();j++)
- {
- m_cumulativeDistance[i][j] = m_maxVal;
- m_phi[i][j] = 0;
- }
- }
- }
-
- DistanceType rowMin; //Temporary variable which contains the minimum value of the distance of a row.
-
- DistanceType tempDist[2]; //Temporary variable to store the distance
-
- DistanceType tempMinDist; //Temporary variable to store the minimum distance
-
- DistanceType tempVal;
-
- int tempIndex;
-
- typename vector <vector<DistanceType> > ::iterator cumDistIter1; //iterator for cumDist i
- typename vector<DistanceType> ::iterator cumDistIter2; //iterator for cumDist j
- typename vector<DistanceType> ::iterator cumDistIter3; //iterator for cumDist j
-
-
- (localDistPtr)(train[0],test[0],m_cumulativeDistance[0][0]);
-
- m_phi[0][0]=2;
-
- /**
- Computing the first row of the distance matrix.
- */
-
- cumDistIter2 = m_cumulativeDistance[0].begin();
- for(i = 1; i < testSize; ++i)
- {
- DistanceType tempVal;
-
- (localDistPtr)(train[0],test[i],tempVal);
-
- *(cumDistIter2 + i) = *(cumDistIter2 + i-1) + tempVal;
- m_phi[0][i]=1;
- }
- if(trunkI > 0)
- {
- --trunkI;
- }
- /**
- Computing the first column of the distance matrix.
- */
-
- for(j = 1; j < trainSize; ++j)
- {
-
-
- (localDistPtr)(train[j],test[0],tempVal);
-
- m_cumulativeDistance[j][0] = m_cumulativeDistance[j-1][0]+tempVal;
- m_phi[j][0]=0;
- }
-
-
- /**
- Computing the values of the rest of the cells in the distance matrix.
- */
- cumDistIter1 = m_cumulativeDistance.begin();
- for(i = 1; i < trainSize; ++i)
- {
- rowMin = m_maxVal;
- cumDistIter2 = (*(cumDistIter1+i-1)).begin();
- cumDistIter3 = (*(cumDistIter1+i)).begin();
-
- for(j = 1+trunkJ; j < testSize-trunkI; ++j)
- {
- tempDist[0] = *(cumDistIter2+j-1);
- tempIndex = 2;
-
- tempMinDist = tempDist[0];
- tempDist[0] = *(cumDistIter2+j);
- tempDist[1] = *(cumDistIter3+j-1);
-
- for(l = 0; l < 2; ++l)
- {
- if(tempMinDist>=tempDist[l])
- {
- tempMinDist=tempDist[l];
- tempIndex = l;
- }
- }
-
- m_phi[i][j] = tempIndex;
- localDistPtr(train[i],test[j],tempVal);
- tempMinDist= tempMinDist+tempVal;
- m_cumulativeDistance[i][j]=tempMinDist;
-
- if(rowMin > tempMinDist)
- rowMin = tempMinDist;
-
- }
- if(trunkI > 0)
- --trunkI;
- if(i > (trainSize-banded-1))
- ++trunkJ;
-
- if(rowMin > bestSoFar)
- {
- distanceDTW = m_maxVal;
- return SUCCESS;
- }
- }
-
- distanceDTW = tempMinDist;
-
- distanceDTW = distanceDTW/(trainSize + testSize);
-
- populatePath(trainSize-1,testSize-1,warpingPath);
-
- return SUCCESS;
-
- }
-
-
- /**
- * This function computes the DTW distance between the two vectors.
- * @param train This is an input parameter and corresponds to the first vector
- * @param test This is an input parameter and corresponds to the second vector
- * @param local This is the function pointer to the local distance function
- * @param distanceDTW This is the output parameter which gives the DTW distance between the two vectors.
- * @param banding This is the banding value for the DTW Matrix
- * @param bestSoFar This is an imput parameter as stoping criteria based on Best So Far
- * @param maxVal This is used to pass the maximum possible value for the DTW distance
- */
-/*
- int computeDTW(const vector <TimeSeriesElementType>& train,
- const vector <TimeSeriesElementType>& test,
- FN_PTR_DISTANCE localDistPtr, DistanceType& distanceDTW,
- int banding=0, DistanceType bestSoFar=(numeric_limits<DistanceType>::infinity()),
- DistanceType maxVal=(numeric_limits<DistanceType>::infinity()))
- */
- int computeDTW(const vector <TimeSeriesElementType>& train,
- const vector <TimeSeriesElementType>& test,
- FN_PTR_DISTANCE localDistPtr, DistanceType& distanceDTW,
- float banding=0, DistanceType bestSoFar=(numeric_limits<DistanceType>::infinity()),
- DistanceType maxVal=(numeric_limits<DistanceType>::infinity()))
- {
-
- m_maxVal = maxVal;
- if(localDistPtr == NULL)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< ENULL_POINTER <<":"<< getErrorMessage(ENULL_POINTER)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
-
- LTKReturnError(ENULL_POINTER);
- }
- int trainSize = train.size(); //Temporary variables to store the size of the train and test vectors.
- if(trainSize == 0)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< EEMPTY_VECTOR <<":"<< getErrorMessage(EEMPTY_VECTOR)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
- LTKReturnError(EEMPTY_VECTOR);
- }
- int testSize = test.size(); //Temporary variables to store the size of the train and test vectors.
- if(testSize == 0)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< EEMPTY_VECTOR <<":"<< getErrorMessage(EEMPTY_VECTOR)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
- LTKReturnError(EEMPTY_VECTOR);
- }
-
- float testBanding = floor(testSize*(1-banding));
- float trainBanding = floor(trainSize*(1-banding));
- banding = (trainBanding < testBanding)?trainBanding:testBanding;
-
-
- int banded = 0;
- if(banding < 0 || banding >= trainSize || banding >= testSize)
- {
- /*LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error : "<< ENEGATIVE_NUM <<":"<< getErrorMessage(ENEGATIVE_NUM)
- <<" DynamicTimeWarping::computeDTW()" <<endl;*/
- LTKReturnError(ECONFIG_FILE_RANGE);
- }
- else
- {
- banded = banding; // is the variable used for fixing the band in the computation of the distance matrix.
- // this is the number of elements from the matrix
- // boundary for which computation will be skipped
- }
-
- int trunkI = banded; //Temporary variables used to keep track of the band in the distance matrix.
-
- int trunkJ = 0; //Temporary variables used to keep track of the band in the distance matrix.
-
- int i,j,k; //index variables
- vector<DistanceType> currentRow(testSize,m_maxVal);
- vector<DistanceType> previousRow(testSize,m_maxVal);
-
- DistanceType rowMin; //Temporary variable which contains the minimum value of the distance of a row.
-
- DistanceType tempDist[3]; //Temporary variable to store the distance
-
- DistanceType tempMinDist; //Temporary variable to store the minimum distance
-
- DistanceType tempVal;
-
-
- (localDistPtr)(train[0],test[0],previousRow[0]);
-
- /**
- Computing the first row of the distance matrix.
- */
-
- for(i = 1; i < testSize; ++i)
- {
-
- (localDistPtr)(train[0],test[i],tempVal);
- previousRow[i] = previousRow[i-1] + tempVal;
- }
- if(trunkI > 0)
- {
- --trunkI;
- }
-
-
- for(i = 1; i < trainSize; ++i)
- {
- rowMin = m_maxVal;
-
-
- localDistPtr(train[i],test[trunkJ],tempVal);
- currentRow[trunkJ]=tempVal+previousRow[trunkJ];
-
- for(j = 1+trunkJ; j < testSize-trunkI; ++j)
- {
-
- tempDist[0] = currentRow[j-1];
- tempDist[1] = previousRow[j];
- tempDist[2] = previousRow[j-1];
-
- tempMinDist = tempDist[0];
-
- for(k = 0; k < 3; k++)
- {
- if(tempMinDist>=tempDist[k])
- {
- tempMinDist=tempDist[k];
- }
- }
-
- localDistPtr(train[i],test[j],tempVal);
- tempMinDist= tempMinDist+tempVal;
- currentRow[j]=tempMinDist;
- if(rowMin > tempMinDist)
- rowMin = tempMinDist;
-
- }
- if(rowMin > bestSoFar)
- {
- distanceDTW = m_maxVal;
- return SUCCESS;
- }
-
- if(i > (trainSize-banded-1))
- ++trunkJ;
- if(trunkI > 0)
- --trunkI;
- copy(currentRow.begin()+trunkJ, currentRow.end()-trunkI, previousRow.begin()+trunkJ);
- }
-
- distanceDTW = tempMinDist;
- distanceDTW = distanceDTW/(trainSize + testSize);
-
- return SUCCESS;
-
- }
-
-};
-
-#endif