// MeasureOfSimilarity.h

#ifndef __MEASUREOFSIMILARITY_H__
#define __MEASUREOFSIMILARITY_H__

using namespace std;
typedef unsigned int uint;

#include<vector>
#include<map>


class MeasureOfSimilarity
{
public:
	MeasureOfSimilarity();
	~MeasureOfSimilarity();

	uint PartialEuclidean(vector<uint> v1, vector<uint> v2);
	double EuclideanDistance(vector<uint> v1, vector<uint> v2);

	bool XORGray(bool a, bool b);
	vector<bool> XORGray(vector<bool> v1, vector<bool> v2);
	vector<bool> XORBase2(vector<bool> v1, vector<bool> v2);

	map<vector<bool>, vector<uint>> XORGray(vector<bool> vGray, map<vector<bool>, vector<uint>> mGray);
	map<vector<bool>, vector<uint>> XORBase2(vector<bool> vBase2, map<vector<bool>, vector<uint>> mBase2);

	uint FlipCount(map<vector<bool>, vector<uint>> m);
	uint FlipCount(uint nClassPosition, map<vector<bool>, vector<uint>> m);

	vector<uint> EuclideanNearestNeighbor(uint& nMinSim, vector<uint>& vIndexes, vector<uint>& vClasses, uint nIndexPosition, uint nClassPosition, vector<uint> vBase10, map<vector<uint>, vector<uint>> mTrainBase10);
	vector<uint> EuclideanNearestNeighbor(uint nIndexPosition, uint nClassPosition, map<vector<uint>, vector<uint>>& mTest, map<vector<uint>, vector<uint>> mTrain);

	vector<bool> XORNearestNeighbor(uint& nMinSim, vector<uint>& vIndexes, vector<uint>& vClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vTestGray, map<vector<bool>, vector<uint>> mTrainGray);
	vector<uint>  XORNearestNeighbor(uint nIndexPosition, uint nClassPosition, map<vector<bool>, vector<uint>>& mTestGray, map<vector<bool>, vector<uint>> mTrainGray);

	uint XORSumGray(vector<bool> v1, vector<bool> v2);
	uint XORSumBase2(vector<bool> v1, vector<bool> v2);

	bool UpDateVectors(uint nTotalClasses, uint nMinSum, vector<uint> vTempIndexes, vector<uint> vTempClasses, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses);
	uint XORPointClassification(uint nIndexPosition, uint nClassPosition, vector<uint>& vIndexes, vector<uint>& vClasses, vector<bool> vGray, map<vector<bool>, vector<uint>> mGray);
	bool XORPointClassificationAndUpDateVectors(uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses, vector<bool> vGray, map<vector<bool>, vector<uint>> mGray);

	
	vector<uint> XORBase2PointClassification(bool& bOK, bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses, vector<bool> vBase2, map<vector<bool>, vector<uint>>& mGray);
	vector<uint> XORGrayPointClassification(bool& bOK, bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses, vector<bool> vGray, map<vector<bool>, vector<uint>>& mGray);

	vector<uint> XORPointClassification(uint& nMinSum, uint nIndexPosition, uint nClassPosition, vector<bool> vBase2, map<vector<bool>, vector<uint>> mBase2);
	vector<uint> ExtractClassesFromIndexClasses(vector<uint> vIndexClasses);
	vector<uint> ExtractIndexesAndClassesFromIndexClasses(uint nSize, uint nClassDefault, uint nMinSum, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint> vClasses, vector<uint> vIndexClasses);

	vector<uint> InsertClasses(vector<uint> vNext, vector<uint> vClasses);
	vector<uint> InsertClasses(uint nDefault, vector<uint> vNext, vector<uint> vClasses);

	void UpDateLastClass(vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);

	vector<bool> NearestToAllXORBase2(uint& nBestMin, vector<uint>& vBestIndexClass, map<vector<bool>, vector<uint> > m);

private:
};

#endif // __MEASUREOFSIMILARITY_H__



