#include "Global.h"
#include "Cluster.h"

using namespace std;
using namespace global;

	/**a refaire avec les bonnes structures/fonctions*/
cluster::View & RandInit::operator()( cluster::View & view ) const
{
	View::iterator first = view.begin();
	for (View::iterator iter = ++(view.begin()); iter != view.end(); ++iter)
	{
		for (Cluster::iterator jter = iter->begin(); jter != iter->end(); ++jter)
		{
				first->add(jter);
				iter->remove(jter);
		}
	}

	unsigned N = first->size();
	for ( unsigned i = 0; i< N; ++i)
	{
			Cluster::iterator jter = first->begin();
			while(!jter.ptr()) {++jter;}
			View::iterator iter = view.randCluster();
			iter->add(jter);
			first->remove(jter);
	}
	cout << view << endl;
	return view;
}

Global::Global( const database::DataBase & _dataBase,
        unsigned _K,
        unsigned index,
        unsigned history)
:
	dataBase(&_dataBase),
	engine(new database::DataEngine(*dataBase,index,_K,history)),
	view(new cluster::View(*engine)),
	K(_K)
{
	cout << "Construction:"<< endl;
	clusters = new Cluster[K];
	for(unsigned id=0;id<K;++id)
	{
		clusters[id].id = id;
		view->add(clusters[id]);
	}
	cout << "K=" << K << endl << view->size() << endl;

	View::iterator cluster = view->begin();
	cout << "Dimension de la database: " << dataBase->getSize() << endl;
	for(unsigned id=0;id<dataBase->getSize(); ++id)
	{
		cluster->add(new Observation(id));
	}
}


double Global::init( const Initialisation & initialisation )
{
	initialisation(*view);
	cout << "initialised" << endl;
	view->computeRegressionModel();
	cout << "RegressionModel Ready" << endl;
	return view->computeGlobalError();
}

double Global::run( const Algorithmus & vns)
{
	return vns(*view).computeGlobalError();
}

