//---------------------------------------------------------------------------
#include <hybrid.h>
#ifndef HybridCoverH
#define HybridCoverH
//---------------------------------------------------------------------------



/** Decorator class for hybrid algorithm for SCP*/
class HybridCover {
	private:
		/** Matrix of SCP*/
		const CovMatrix *CM;	
		/** Number of rows*/
		unsigned int rownum;
		/** Number of columns*/	
		unsigned int colnum;	
		/** Hybrid algorithm*/
		Hybrid* hybrid;			
		/** Hybrid algorithm friendly representation of SCP*/
		SCProblem* problem;		
		/** Temporary column mask used to store the solution*/
		unsigned char* solution;
                                  
		
	public:
		/**Constructor
        \param _matrix Matrix of SCP
		*/
		HybridCover( const CovMatrix *_matrix );
		/**Simple destructor*/
		~HybridCover(void);
		/**Entry point returning the solution in form of list of columns*/
		list<unsigned int> Run(void);
		/**Set parameters
        \param nbgaMaxIterations Maximum iterations of NBGA - default value is 1000
        \param nbgaMutationProbability Probability of mutation of each gene - default value is 0.1
        \param nbgaPopulationSize Number of individuals in the population - default is 100 individuals
        \param initialLGHType Type of initial Lagrangean heuristic 1,2,3,4 or 5 - default is 1
		\param LCEUseLGH Indicates whether to use Lagrangean heuristic to accelerate L-class enumeration. 0 or 1
		\param LCELGHType Type of Lagrangean heuristic used to accelerate L-class enumeration 1,2,3,4 or 5 - default is 1
		\param saPerform Indicates whether simulated annealing (SA) is used instead of NBGA
        \param saTemp Initial temperature for SA
        \param saCool SA Cooling constant
		\param saFrozen Final temperature for SA
        \param saIterations Number of iterations at one temperature
         */
		void HybridCover::SetParameters(int nbgaMaxIterations,double nbgaMutationProbability,int nbgaPopulationSize,int initialLGHType,int LCEUseLGH,int LCELGHType,int saPerform,double saTemp,double saCool,double saFrozen,int saIterations);

};

#endif