// ramzor3Doc.cpp : implementation of the CRamzor3Doc class
//

#include "stdafx.h"
#include <math.h>
#include "ramzor3.h"
#include "general.h"

#include "SimulationParams.h"
#include "Simulation.h"
#include "StateAction.h"
#include "policy.h"
#include "ramzor3Doc.h"
#include "ramzor3View.h"






#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRamzor3Doc

IMPLEMENT_DYNCREATE(CRamzor3Doc, CDocument)
//IMPLEMENT_SERIAL( CRamzor3Doc, CDocument, 1 )


BEGIN_MESSAGE_MAP(CRamzor3Doc, CDocument)
	//{{AFX_MSG_MAP(CRamzor3Doc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRamzor3Doc construction/destruction

CRamzor3Doc::CRamzor3Doc():
#ifdef PROPORTION	
	m_Policy(m_StateTable, m_SimulationParams),
#else
	m_Policy(m_StateTable),
#endif	
	m_SimulationManager(m_SimulationParams, m_Policy)
	
{
	srand(/*(UINT)time(NULL)*/1);
}

CRamzor3Doc::~CRamzor3Doc()
{}

BOOL CRamzor3Doc::OnNewDocument()
{
	if(!CDocument::OnNewDocument())
		return FALSE;

	m_StateTable.InitHashTable((int)(pow(NUM_OF_CONFIGURATIONS, 2) *
							     pow((MAX_JUNCTION_TRAFFIC), 4) *
							     1.2));

								

	return TRUE;
}
void CRamzor3Doc::UpdateRewardParams()
{
	m_Policy.m_numOfCarsPow = m_SimulationParams.m_NumOfCarsPow;
	m_Policy.m_WaitTimePow  = m_SimulationParams.m_WaitTimePow;
}

void CRamzor3Doc::ResetSimulation()
{
	m_StateTable.RemoveAll();
	m_SimulationManager.ResetSimulation();
}
/////////////////////////////////////////////////////////////////////////////
// CRamzor3Doc serialization

void CRamzor3Doc::Serialize(CArchive& ar)
{
	POSITION pos = GetFirstViewPosition();
	CRamzor3View* pView = (CRamzor3View *)GetNextView(pos);
	
	pView->UpdateSimParams();
	
	if (ar.IsStoring())
	{
		m_StateTable.Serialize(ar);
		m_SimulationParams.Serialize(ar);
	}
	else
	{

		m_StateTable.Serialize(ar);
		m_SimulationParams.Serialize(ar);
		UpdateViewOnSer();
	}

}

void CRamzor3Doc::UpdateViewOnSer()
{
	POSITION pos = GetFirstViewPosition();
	CRamzor3View* pView = (CRamzor3View *)GetNextView(pos);

	for(int i = 0;i < NUM_OF_LANES;i++)
	{
		pView->setArrivalArrAt(i,m_SimulationParams.GetArrivalArray(i));
		pView->setDepartureArrAt(i,m_SimulationParams.GetDepartureArray(i));

	}
	


}
/////////////////////////////////////////////////////////////////////////////
// CRamzor3Doc diagnostics

#ifdef _DEBUG
void CRamzor3Doc::AssertValid() const
{
	CDocument::AssertValid();
}

void CRamzor3Doc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CRamzor3Doc commands
////////////////////////////////////////////////////////////
//global functions
template<> UINT AFXAPI HashKey<CStateAction&>(CStateAction& stateAction)
{
	UINT ans = 0;
	ans += stateAction.m_nJunctionConfig;
	ans += 10 * stateAction.m_nNumOfCarsNorth;
	ans += 100 * stateAction.m_nNumOfCarsEast;
	ans += 1000 * stateAction.m_nNumOfCarsSouth;
	ans += 10000 * stateAction.m_nNumOfCarsWest;
	ans += 100000 * stateAction.m_nNextConfig;
	//ans += 1000000 * stateAction.m_nHour;
	
	return ans;
}

