//////////////////////////////////////////////////////////////
//class CPolicy interface

class CPolicy
{

protected:
	static int m_CurrConf;
	CStateActionMap& m_StateActionMap;
	
public:
	double m_numOfCarsPow;
	double m_WaitTimePow;
	CPolicy(CStateActionMap& SAMap):  
	  m_StateActionMap(SAMap)
	  {}
	  
	virtual ~CPolicy(){}
	
	virtual int GetNextConfiguration(CStateAction& nextState, int* WaitTimeArray);
	virtual void UpdateStateValues(CStateAction &currState,
		CStateAction &nextState, double immedReward){}
	virtual double ComputeImReward(CStateAction &nextState, int* WaitTimeArray, int* NumOfCarsArr);
};

class CSarsaPolicy : public CPolicy
{
public:
	CSarsaPolicy (CStateActionMap& SAMap): CPolicy(SAMap){}
	virtual ~CSarsaPolicy(){}
	virtual int GetNextConfiguration(CStateAction& nextState, int* WaitTimeArray);
	virtual void UpdateStateValues(CStateAction &currState,
						CStateAction &nextState, double immedReward);

};

class CProportionalPolicy: public CPolicy
{
private:
	double m_NorthLambda;
	double m_EastLambda;
	double m_SouthLambda;
	double m_WestLambda;
	double m_SumLambdas;
	int    m_FirstLightChange;
	int    m_SecondLightChange;
	int    m_ThirdLightChange;
	int    m_FourthLightChange;
	CSimulationParams& m_SimParams;
public:	
	CProportionalPolicy(CStateActionMap& SAMap, CSimulationParams& simParams );
	virtual int GetNextConfiguration(CStateAction& nextState, int* WaitTimeArray);
	void SetLanesTraffic();
}; 