aboutsummaryrefslogtreecommitdiffstats
path: root/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/npen/NPenShapeFeatureExtractor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/npen/NPenShapeFeatureExtractor.cpp')
-rw-r--r--src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/npen/NPenShapeFeatureExtractor.cpp722
1 files changed, 0 insertions, 722 deletions
diff --git a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/npen/NPenShapeFeatureExtractor.cpp b/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/npen/NPenShapeFeatureExtractor.cpp
deleted file mode 100644
index e20b63dc..00000000
--- a/src/virtualkeyboard/3rdparty/lipi-toolkit/src/reco/shaperec/featureextractor/npen/NPenShapeFeatureExtractor.cpp
+++ /dev/null
@@ -1,722 +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 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-02-20 10:03:51 +0530 (Wed, 20 Feb 2008) $
- * $Revision: 423 $
- * $Author: sharmnid $
- *
- ************************************************************************/
-/************************************************************************
- * FILE DESCR: Implementation of RunShaperec tool
- *
- * CONTENTS:
- * extractFeatures
- * getShapeFeatureInstance
- * clearFeatureVector
- *
- * AUTHOR: Bharath A
- *
- * DATE: June 11, 2008
- * CHANGE HISTORY:
- * Author Date Description of change
- ************************************************************************/
-
-
-#include "NPenShapeFeatureExtractor.h"
-#include "NPenShapeFeature.h"
-#include "LTKTraceGroup.h"
-#include "LTKTrace.h"
-#include "LTKChannel.h"
-#include "LTKTraceFormat.h"
-#include "LTKConfigFileReader.h"
-#include "LTKMacros.h"
-#include "LTKException.h"
-#include "LTKErrors.h"
-#include "LTKLoggerUtil.h"
-#include "LTKPreprocDefaults.h"
-
-/******************************************************************************
-* AUTHOR : Dinesh M
-* DATE : 1-Oct-2007
-* NAME : NPenShapeFeatureExtractor
-* DESCRIPTION : parameterized constructor
-* ARGUMENTS :
-* RETURNS :
-* NOTES :
-* CHANGE HISTROY
-* Author Date
-*******************************************************************************/
-NPenShapeFeatureExtractor::NPenShapeFeatureExtractor(const LTKControlInfo& controlInfo):
-m_windowSize(FEATEXTR_NPEN_DEF_WINDOW_SIZE)
-{
- string cfgFilePath = "";
-
- // Config file
- if ( ! ((controlInfo.lipiRoot).empty()) &&
- ! ((controlInfo.projectName).empty()) &&
- ! ((controlInfo.profileName).empty()) &&
- ! ((controlInfo.cfgFileName).empty()))
- {
- // construct the cfg path using project and profile name
- cfgFilePath = (controlInfo.lipiRoot) + PROJECTS_PATH_STRING +
- (controlInfo.projectName) + PROFILE_PATH_STRING +
- (controlInfo.profileName) + SEPARATOR +
- (controlInfo.cfgFileName) + CONFIGFILEEXT;
- }
- else if ( ! ((controlInfo.cfgFilePath).empty() ))
- {
- cfgFilePath = controlInfo.cfgFilePath;
- }
- else
- {
- throw LTKException(EINVALID_PROJECT_NAME);
- }
-
-
- int returnVal = readConfig(cfgFilePath);
-
- if (returnVal != SUCCESS)
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR) <<
- "Error: NPenShapeFeatureExtractor::NPenShapeFeatureExtractor()" <<endl;
-
- throw LTKException(returnVal);
- }
-
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " <<
- "NPenShapeFeatureExtractor::NPenShapeFeatureExtractor()" << endl;
-
-}
-
-/**********************************************************************************
-* AUTHOR : Dinesh M
-* DATE : 1-Oct-2007
-* NAME : readConfig
-* DESCRIPTION : read the config values from cfg file and set member variables
-* ARGUMENTS :
-* RETURNS :
-* NOTES :
-* CHANGE HISTROY
-* Author Date
-*************************************************************************************/
-
-int NPenShapeFeatureExtractor::readConfig(const string& cfgFilePath)
-{
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Entering " <<
- "NPenShapeFeatureExtractor::readConfig()" << endl;
-
- LTKConfigFileReader* configurableProperties = NULL;
- string tempStringVar = "";
-
- try
- {
- configurableProperties = new LTKConfigFileReader(cfgFilePath);
-
- int errorCode = configurableProperties->getConfigValue(NPEN_WINDOW_SIZE, tempStringVar);
-
- if( errorCode == SUCCESS)
- {
- if (setWindowSize(atoi((tempStringVar).c_str())) != SUCCESS)
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR) << "Error: " <<
- ECONFIG_FILE_RANGE << " : " <<
- getErrorMessage(ECONFIG_FILE_RANGE) <<
- " NPenShapeFeatureExtractor::readConfig" <<endl;
-
- LTKReturnError(ECONFIG_FILE_RANGE);
- }
- }
- }
-
- catch(LTKException e)
- {
- delete configurableProperties;
-
- int eCode = e.getErrorCode();
-
- LOG(LTKLogger::LTK_LOGLEVEL_ERR) << "Error: " << eCode <<
- " : " << getErrorMessage(eCode) <<
- " NPenShapeFeatureExtractor::readConfig" <<endl;
-
- LTKReturnError(eCode);
- }
- delete configurableProperties;
-
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " <<
- "NPenShapeFeatureExtractor::readConfig()" << endl;
-
- return SUCCESS;
-
-}
-
-/**********************************************************************************
-* AUTHOR : Dinesh M
-* DATE : 1-Oct-2007
-* NAME : setRadius
-* DESCRIPTION : set the radius(the size of window) to compute NPen features
-* ARGUMENTS :
-* RETURNS :
-* NOTES :
-* CHANGE HISTROY
-* Author Date
-*************************************************************************************/
-int NPenShapeFeatureExtractor::setWindowSize(int windowSize)
-{
- int returnVal = FAILURE;
-
- if ( windowSize > 0 && (windowSize%2 == 1))
- {
- m_windowSize = windowSize;
- returnVal = SUCCESS;
- }
-
- return returnVal;
-}
-
-/**********************************************************************************
-* AUTHOR : Nidhi Sharma
-* DATE : 15-Feb-2008
-* NAME : getRadius
-* DESCRIPTION :
-* ARGUMENTS :
-* RETURNS :
-* NOTES :
-* CHANGE HISTROY
-* Author Date
-*************************************************************************************/
-int NPenShapeFeatureExtractor::getWindowSize()
-{
- return m_windowSize;
-}
-
-
-/**********************************************************************************
-* AUTHOR : Bharath A
-* DATE : 12-Jun-2008
-* NAME : extractFeatures
-* DESCRIPTION : Extracts NPen features from a trace group
-* ARGUMENTS : The trace group from which features have to be extracted
-* RETURNS : vector of NPenShapeFeature objects
-* NOTES :
-* CHANGE HISTROY
-* Author Date Description of change
-*************************************************************************************/
-int NPenShapeFeatureExtractor::extractFeatures(const LTKTraceGroup& inTraceGroup,
- vector<LTKShapeFeaturePtr>& outFeatureVec)
-{
-
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Entering " <<
- "NPenShapeFeatureExtractor::extractFeatures()" << endl;
-
- NPenShapeFeature* featurePtr = NULL;
-
- vector<vector<float> > floatFeatureValues;
-
-
-
- int errorCode;
-
- if(inTraceGroup.getNumTraces() == 0)
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error: FeatureExtractor::findAllFeatures"<<endl;
-
- LTKReturnError(EEMPTY_TRACE_GROUP);
- }
-
-
- vector<vector<float> > concatenatedCoord;
- int currPenUpPointIndex = -1;
- vector<int> penUpPointsIndices;
-
-
- int halfWindowSize = m_windowSize/2;
-
- if(halfWindowSize==0)
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error: FeatureExtractor::findAllFeatures"<<endl;
-
- LTKReturnError(EINVALID_NUM_OF_POINTS);
- }
-
-
- for(int t=0;t<inTraceGroup.getNumTraces();++t)
- {
-
- LTKTrace eachTrace;
- inTraceGroup.getTraceAt(t,eachTrace);
-
- if(eachTrace.isEmpty())
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error: FeatureExtractor::findAllFeatures"<<endl;
-
- LTKReturnError(EEMPTY_TRACE);
-
- }
-
- vector<float> xVec;
- vector<float> yVec;
-
- eachTrace.getChannelValues(X_CHANNEL_NAME,xVec);
- eachTrace.getChannelValues(Y_CHANNEL_NAME,yVec);
-
- if(t==0)
- {
- vector<float> firstPoint;
- firstPoint.push_back(xVec[0]);
- firstPoint.push_back(yVec[0]);
-
- concatenatedCoord.insert(concatenatedCoord.begin(),halfWindowSize,firstPoint);
- }
-
- for(int p=0;p<xVec.size();++p)
- {
- vector<float> point;
- point.push_back(xVec[p]);
- point.push_back(yVec[p]);
-
- concatenatedCoord.push_back(point);
-
- }
-
- currPenUpPointIndex += xVec.size();
-
- penUpPointsIndices.push_back(currPenUpPointIndex);
-
- if(t==(inTraceGroup.getNumTraces()-1))
- {
- vector<float> lastPoint;
- lastPoint.push_back(xVec[xVec.size()-1]);
- lastPoint.push_back(yVec[yVec.size()-1]);
-
- concatenatedCoord.insert(concatenatedCoord.end(),halfWindowSize,lastPoint);
- }
-
- }
-
-
-
- /* 0 - normalized x
- 1 - normalized y
- 2 - cos alpha
- 3 - sin alpha
- 4 - cos beta
- 5 - sin beta
- 6 - aspect
- 7 - curliness
- 8 - linearity
- 9 - slope
- 10 - pen-up / pen-down stroke (0 for pen-down and 1 for pen-up)*/
-
- float deltaX=0;
- float deltaY=0;
- float hypotenuse=0;
-
-
- float cosalpha=0;
- float sinalpha=0;
- float cosbeta=0;
- float sinbeta=0;
- float ispenup=0;
- float aspect=0;
- float curliness=0;
- float linearity=0;
- float slope=0;
-
-
- float xMin,yMin,xMax,yMax; //for vicnity bounding box;
- float bbWidth,bbHeight;
- float maxOfWidthHeight;
-
-
-
- currPenUpPointIndex = 0;
-
-
- for(int f=halfWindowSize;f<(concatenatedCoord.size()-halfWindowSize);++f)
- {
-
- vector<float> eachPointFeature;
-
- eachPointFeature.push_back(concatenatedCoord[f][0]); //x
- eachPointFeature.push_back(concatenatedCoord[f][1]); //y
-
- deltaX = concatenatedCoord[f-1][0] - concatenatedCoord[f+1][0];
- deltaY = concatenatedCoord[f-1][1] - concatenatedCoord[f+1][1];
-
- hypotenuse = sqrt((deltaX*deltaX)+(deltaY*deltaY));
-
- if(hypotenuse < EPS)
- {
- cosalpha = 1;
- sinalpha = 0;
- }
- else
- {
- cosalpha = deltaX / hypotenuse;
- sinalpha = deltaY / hypotenuse;
- }
-
- eachPointFeature.push_back(cosalpha);
- eachPointFeature.push_back(sinalpha);
-
- eachPointFeature.push_back(cosbeta); //creating empty spaces for cosine and sine betas for future assignment
- eachPointFeature.push_back(sinbeta);
-
- vector<vector<float> > vicinity;
-
- float vicinityTrajLen = 0.0f;
-
- for(int v=f-halfWindowSize;v<=f+halfWindowSize;++v)
- {
- vicinity.push_back(concatenatedCoord[v]);
-
- if(v<(f+halfWindowSize))
- {
- vicinityTrajLen += (sqrt(((concatenatedCoord[v+1][1]-concatenatedCoord[v][1])*(concatenatedCoord[v+1][1]-concatenatedCoord[v][1]))+((concatenatedCoord[v+1][0]-concatenatedCoord[v][0])*(concatenatedCoord[v+1][0]-concatenatedCoord[v][0]))));
- }
- }
-
- findVicinityBoundingBox(vicinity,xMin,yMin,xMax,yMax);
-
- bbWidth = xMax - xMin;
-
- bbHeight = yMax - yMin;
-
- if(fabs(bbHeight+bbWidth)<EPS)
- {
- aspect = 0.0;
- }
- else
- {
- aspect = (bbHeight-bbWidth)/(bbHeight+bbWidth);
- }
-
-
- eachPointFeature.push_back(aspect);
-
-
- maxOfWidthHeight = ( bbWidth > bbHeight) ? bbWidth : bbHeight;
-
- if(fabs(maxOfWidthHeight) < EPS)
- {
- curliness = 0.0f;
- }
- else
- {
- curliness = (vicinityTrajLen / maxOfWidthHeight) - 2;
- }
-
- eachPointFeature.push_back(curliness);
-
- computeLinearityAndSlope(vicinity,linearity,slope);
-
- eachPointFeature.push_back(linearity);
- eachPointFeature.push_back(slope);
-
- if(penUpPointsIndices[currPenUpPointIndex] == (f-halfWindowSize))
- {
- ispenup = 1;
- ++currPenUpPointIndex;
- }
- else
- {
- ispenup = 0;
- }
- eachPointFeature.push_back(ispenup); //currently assuming pen-up strokes are not resampled
-
- floatFeatureValues.push_back(eachPointFeature);
-
- }
-
-
- //duplicating first and last features
- vector<float> firstFeaturePoint = floatFeatureValues[0];
-
- floatFeatureValues.insert(floatFeatureValues.begin(),1,firstFeaturePoint);
-
- vector<float> lastFeaturePoint = floatFeatureValues[floatFeatureValues.size()-1];
-
- floatFeatureValues.insert(floatFeatureValues.end(),1,lastFeaturePoint);
-
-
- for(int ff=1;ff<(floatFeatureValues.size()-1);++ff)
- {
-
- floatFeatureValues[ff][4] = (floatFeatureValues[ff-1][2]*floatFeatureValues[ff+1][2]) + (floatFeatureValues[ff-1][3]*floatFeatureValues[ff+1][3]);
- floatFeatureValues[ff][5] = (floatFeatureValues[ff-1][2]*floatFeatureValues[ff+1][3]) - (floatFeatureValues[ff-1][3]*floatFeatureValues[ff+1][2]);
-
- }
-
- //removing the extraneous feature points at the beginning and end
- floatFeatureValues.erase(floatFeatureValues.begin(),floatFeatureValues.begin()+1);
- floatFeatureValues.pop_back();
-
-
- for(int a=0;a<floatFeatureValues.size();++a)
- {
- NPenShapeFeature* ptrFeature = new NPenShapeFeature();
- ptrFeature->setX(floatFeatureValues[a][0]);
- ptrFeature->setY(floatFeatureValues[a][1]);
- ptrFeature->setCosAlpha((1+floatFeatureValues[a][2])*((float)PREPROC_DEF_NORMALIZEDSIZE/2.0));
- ptrFeature->setSinAlpha((1+floatFeatureValues[a][3])*((float)PREPROC_DEF_NORMALIZEDSIZE/2.0));
- ptrFeature->setCosBeta((1+floatFeatureValues[a][4])*((float)PREPROC_DEF_NORMALIZEDSIZE/2.0));
- ptrFeature->setSinBeta((1+floatFeatureValues[a][5])*((float)PREPROC_DEF_NORMALIZEDSIZE/2.0));
- ptrFeature->setAspect(floatFeatureValues[a][6]);
- ptrFeature->setCurliness(floatFeatureValues[a][7]);
- ptrFeature->setLinearity(floatFeatureValues[a][8]);
- ptrFeature->setSlope((1+floatFeatureValues[a][9])*((float)PREPROC_DEF_NORMALIZEDSIZE/2.0));
-
- if(fabs(floatFeatureValues[a][10]-1.0f) < EPS)
- {
- ptrFeature->setPenUp(true);
- }
- else
- {
- ptrFeature->setPenUp(false);
- }
-
- outFeatureVec.push_back(LTKShapeFeaturePtr(ptrFeature));
-
- ptrFeature = NULL;
-
- }
-
-
-
-
-
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " <<
- "NPenShapeFeatureExtractor::extractFeatures()" << endl;
-
- return SUCCESS;
-}
-
-/**********************************************************************************
-* AUTHOR : Bharath A
-* DATE : 12-Jun-2008
-* NAME : getShapeFeatureInstance
-* DESCRIPTION : Returns an NPenShapeFeature instance
-* ARGUMENTS :
-* RETURNS : An NPenShapeFeature instance
-* NOTES :
-* CHANGE HISTROY
-* Author Date Description of change
-*************************************************************************************/
-LTKShapeFeaturePtr NPenShapeFeatureExtractor::getShapeFeatureInstance()
-{
- LTKShapeFeaturePtr tempPtr(new NPenShapeFeature);
- return tempPtr;
-}
-
-
-/******************************************************************************
-* AUTHOR : Bharath A
-* DATE : 12-Jun-2008
-* NAME : convertFeatVecToTraceGroup
-* DESCRIPTION :
-* ARGUMENTS :
-* RETURNS :
-* NOTES :
-* CHANGE HISTROY
-* Author Date Description
-******************************************************************************/
-int NPenShapeFeatureExtractor::convertFeatVecToTraceGroup(
- const vector<LTKShapeFeaturePtr>& shapeFeature,
- LTKTraceGroup& outTraceGroup)
-{
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Entering " <<
- "NPenShapeFeatureExtractor::convertFeatVecToTraceGroup()" << endl;
-
- vector<LTKChannel> channels; // channels of a trace
-
- LTKChannel xChannel("X", DT_FLOAT, true); // x-coordinate channel of the trace
- LTKChannel yChannel("Y", DT_FLOAT, true); // y-coordinate channel of the trace
-
- //initializing the channels of the trace
- channels.push_back(xChannel);
- channels.push_back(yChannel);
-
- // composing the trace format object
- LTKTraceFormat traceFormat(channels);
-
- vector<float> point; // a point of a trace
-
- LTKTrace trace(traceFormat);
-
- for(int count=0;count<(int)shapeFeature.size();count++)
- {
- float Xpoint, Ypoint;
- bool penUp;
-
- NPenShapeFeature* ptr = (NPenShapeFeature*)(shapeFeature[count].operator ->());
- Xpoint = ptr->getX();
- Ypoint = ptr->getY();
- penUp = ptr->isPenUp();
-
-
-
- point.push_back(Xpoint);
- point.push_back(Ypoint);
-
- trace.addPoint(point);
- point.clear();
-
-
- if(penUp == true) // end of a trace, clearing the trace now
- {
- outTraceGroup.addTrace(trace);
- trace.emptyTrace();
- LTKTrace tempTrace(traceFormat);
- trace = tempTrace;
- }
- }
-
- LOG(LTKLogger::LTK_LOGLEVEL_DEBUG) << "Exiting " <<
- "NPenShapeFeatureExtractor::convertFeatVecToTraceGroup()" << endl;
- return SUCCESS;
-
-}
-
-
-void NPenShapeFeatureExtractor::findVicinityBoundingBox(vector<vector<float> >& inputXYCoords, float& xMin, float& yMin, float& xMax, float& yMax)
- {
- xMin = FLT_MAX;
- yMin = FLT_MAX;
-
- xMax = -FLT_MAX;
- yMax = -FLT_MAX;
-
- for(int i=0;i<inputXYCoords.size();++i)
- {
- if(inputXYCoords[i][0] < xMin)
- {
- xMin = inputXYCoords[i][0];
- }
-
- if(inputXYCoords[i][0] > xMax)
- {
- xMax = inputXYCoords[i][0];
- }
-
- if(inputXYCoords[i][1] < yMin)
- {
- yMin = inputXYCoords[i][1];
- }
-
- if(inputXYCoords[i][1] > yMax)
- {
- yMax = inputXYCoords[i][1];
- }
- }
-
- }
-
-
-
-int NPenShapeFeatureExtractor::computeLinearityAndSlope(const vector<vector<float> >& vicinity,float& linearity,float& slope)
- {
- if(vicinity.size()<3)
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error: FeatureExtractor::computeLinearity"<<endl;
-
- LTKReturnError(FAILURE);
- }
-
- float x1 = vicinity[0][0];
- float y1 = vicinity[0][1];
-
- float x2 = vicinity[vicinity.size()-1][0];
- float y2 = vicinity[vicinity.size()-1][1];
-
- float avgX = 0.0f;
- float avgY = 0.0f;
-
- float denominator = sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1)));
-
- /*if(denominator < EPS)
- {
- linearity = 0.0f;
- slope = 1.0f;
-
- return SUCCESS;
- }*/
-
- if(denominator < EPS)
- {
- slope = 1.0f;
-
-
- //considering the case of loop where the end points are the same
- avgX = (x1+x2)/2.0f;
- avgY = (y1+y2)/2.0f;
- }
- else if(fabs(x2-x1) < EPS)
- {
- slope = 0.0f;
- }
- else
- {
- slope = cos(atan((y2-y1)/(x2-x1)));
- }
-
-
- float x0 = 0.0f;
- float y0 = 0.0f;
-
- float distance = 0.0f;
-
-
- linearity = 0.0f;
-
- for(int v=1; v<(vicinity.size()-1); ++v)
- {
-
- if(vicinity[v].size() < 2)
- {
- LOG(LTKLogger::LTK_LOGLEVEL_ERR)
- <<"Error: FeatureExtractor::computeLinearity"<<endl;
-
- LTKReturnError(FAILURE);
- }
-
- x0 = vicinity[v][0];
- y0 = vicinity[v][1];
-
- if(denominator < EPS)
- {
- distance = sqrt(((avgX-x0)*(avgX-x0))+((avgY-y0)*(avgY-y0)));
- }
- else
- {
- distance = fabs(((x2-x1)*(y1-y0))-((x1-x0)*(y2-y1))) / denominator;
- }
-
- linearity += (distance*distance);
-
- }
-
- linearity /= (vicinity.size()-2); // 2 to exclude the end points of vicinity while computing average squared distance
-
- return SUCCESS;
- }