// Intervals.h

#ifndef __INTERVALS_H__
#define __INTERVALS_H__

using namespace std;
typedef unsigned int uint;

#include <iostream>
#include<vector>
#include<map>

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

	vector<bool> EqualLeft(vector<bool> v1, vector<bool> v2);
	vector<bool> Base2EqualLeftGray(vector<bool> vLowerBound, vector<bool> vUpperBound);
	vector<bool> InsertLeft(vector<bool> vLeft, vector<bool> v);
	vector<bool> InsertLeftGrayReturnBool(vector<bool> vLeftGray, vector<bool> vBase2);
	
	vector<bool> BoundedGraySum(bool& bOK, uint nSumLower, uint nSumUpper, vector<bool> vGray);
	vector<bool> BoundedBase2(bool& bOK, vector<bool> vLowerBound, vector<bool> vUpperBound, vector<bool> vBase2);			//  Same as PlaceInInterval ???
	vector<bool> BoundedBase2AndGray(bool& bOK, vector<bool> vBase2Lower, vector<bool> vBase2Upper, vector<uint> vGrayStart, vector<uint> vGraySize, vector<uint> vSumLower, vector<uint> vSumUpper, vector<bool> vBase2);
	vector<bool> BoundedBase2AndGrayII(bool& bOK, vector<bool> vBase2Lower, vector<bool> vBase2Upper, vector<uint> vGrayStart, vector<uint> vGraySize, vector<uint> vSumLower, vector<uint> vSumUpper, vector<bool> vBase2);
	vector<bool> Base2GreaterThanOrEqualToLowerLessThanUpper(bool& bOK, vector<bool> vLowerBound, vector<bool> vUpperBound, vector<bool> vBase2);			//  Same as PlaceInInterval ???

	bool AbleToIterate(vector<bool> vBase2);
	map<vector<bool>, vector<uint>> IteratePoint(bool& bOK, vector<bool> v);

	map<vector<bool>, vector<uint> > IterateOrigin(uint nBits);
	map<vector<bool>, vector<uint> > IterateOrigin(uint nIterations, uint nBits);

	map<vector<bool>, vector<uint>> IterateToPoint(bool& bOK, vector<bool> vBase2);
	map<vector<bool>, vector<uint>> IterateToPointBounded(bool& bOK, vector<bool> vLowerBound, vector<bool> vUpperBound, vector<bool> vBase2);
	map<vector<bool>, vector<uint>> IterateToPoint(bool& bOK, map<vector<bool>, vector<uint>> mOrigin, vector<bool> vBase2);
	map<vector<bool>, vector<uint>> IterateToSum(bool& bOK, uint nSum, vector<bool> vBase2);

	uint CalculateIntervalClassesAllSums(bool bMinClassification, uint nClassDefault, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vLowerBoundBase2, vector<bool> vUpperBoundBase2, map<vector<bool>, vector<uint>> mTrainGray);
	uint CalculateIntervalClassesSameSums(bool bMinClassification, vector<uint> vTargetSumsLower, vector<uint> vTargetSumsUpper, vector<uint> vGrayStart, vector<uint> vGraySize, uint nClassDefault, vector<uint>& vMinSums, vector<uint>& vIndexes, vector<uint>& vClasses, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vLowerBoundBase2, vector<bool> vUpperBoundBase2, map<vector<bool>, vector<uint>> mTrainGray);

	uint CalculateMapClassesAllSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool>& vFirst, vector<bool>& vLast, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	uint CalculateMapClassesSameSumsSizeOne(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, vector<uint> vGraySumLower, vector<uint> vGraySumUpper, vector<uint> vGrayStart, vector<uint> vGraySize, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool>& vFirst, vector<bool>& vLast, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	uint CalculateMapClassesSameSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, vector<uint> vGraySumLower, vector<uint> vGraySumUpper, vector<uint> vGrayStart, vector<uint> vGraySize, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool>& vFirst, vector<bool>& vLast, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);

	bool UpDatePrevMapClassesAllSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vFirst, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	bool UpDateLastMapClassesAllSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vFirst, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	bool UpDatePrevAndLastMapClassesAllSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vFirst, vector<bool> vLast, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	
	bool UpDatePrevMapClassesSameSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, vector<uint> vGraySumLower, vector<uint> vGraySumUpper, vector<uint> vGrayStart, vector<uint> vGraySize, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vFirst, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	bool UpDateLastMapClassesSameSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, vector<uint> vGraySumLower, vector<uint> vGraySumUpper, vector<uint> vGrayStart, vector<uint> vGraySize, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vLast, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);
	bool UpDatePrevAndLastMapClassesSameSums(bool bPrintSumsAndIndexes, bool bMinClassification, uint nMinSumDefault, uint nIndexDefault, uint nClassDefault, vector<uint> vGraySumLower, vector<uint> vGraySumUpper, vector<uint> vGrayStart, vector<uint> vGraySize, uint nTotalClasses, uint nIndexPosition, uint nClassPosition, vector<bool> vFirst, vector<bool> vLast, map<vector<bool>, vector<uint>>& m, map<vector<bool>, vector<uint>> mTrainGray);


private:
};

#endif // __INTERVALS_H__
