#ifndef METHODS_H
#define METHODS_H

#include"models.h"

/*
 * 	Optimization Methods
 */

class OptimizationMethod{
	public:
		//Virtual Constructor & Destructor for any optimization method
		OptimizationMethod(){};
		OptimizationMethod(Model* A):ToAdjust(A){};
		virtual ~OptimizationMethod(){};
		//Virtual initialisation, execution, finalisation for any optimization method
		virtual void initialise(){};		//Initialise attributes using values stored in the method header file
		virtual void execute(){};		//Execute the optimization of the model
		virtual void finalise() const = 0;	//Export the model parameters and display the optimized model
	protected:
		Model* ToAdjust;
};

//	Simulated Annealing

class SimulatedAnnealing : public OptimizationMethod{
	public:
		//Constructor & Destructor specific to this method
		SimulatedAnnealing();
		SimulatedAnnealing(Model*);
		SimulatedAnnealing(Model*,double,double,double,double,int,int);
		~SimulatedAnnealing(){};
		//Initialisation, execution and finalisation for this method
		void initialise();
		void execute();
		void finalise() const ;
	private:
		double ampl;		//Variation amplitude to get Neighbor
		double temp;		//Current temperature of the system
		double t_end;		//Freezing temperature
		double cooling;		//Cooling ratio
		int length;		//Number of iteration for the same value of temperature
		int max_f;		//Max number of unsuccessful iterations
		int current_f;		//Current number of unsuccessful iteration combo
};

#endif
