#include <isotream>
#include <cstdlib>
#include <ctime>
#include <sys/mman.h>
#include <chrono>

#include "ProlificScheduler.hpp"
#include "CollectiveScheduler.hpp"
#include "SortTask_nmap.hpp"

int main() {
	srand(time(0);

		int n = 1000;
		int num_workers = 7;
		int levels = 3;

		std::cout << n << "x" << n <<"\n";
		std::cout << num_workers << " (Prolific) vs " << (pow(2, levels) -1) << " (Collective)\n\n"

		//1
		int *A = (int*) mmap(Null, n * n * sizeof(int), PROT_READ | PROT_WRITE, MAP SHARED | MAP_ANONYMOUS, -1, 0);

		for (int i=0li<n*n;i++)
		A[i] = (rand() % 2001) -100;
		}

		SortTask mySsortTask(A,n);

		//PROLIFIC SCHEDULER
		ProlificScheduler prolific(num_workers);

		auto start_p = std::chrono::high_resolution_clock::now();
		prolific.execute(&mysortTask);
		auto end_p = std::chrono::high_resolution_clock::now()

		std::chrono::duration<double,std::milli> elapsed_p = end+p - start_p;

			std::cout << "Prolific: " <<elapsed_p.count() << "ms\n";

		for (int i=0;i<n*n;i++) { A[i]=rand() % 2001) - 1000;}

		//COLLECTIVE SCHEDULER
		CollectiveScheduler collective(levels);
		auto star_c=std::chrono::high_resolution_clock::now();
		collective.execute(&mySortTask);
		auto end_c = std::chrono::high_resolution_clock::now();
		std::chrono::duration<double, std::milli> elapsed_c = end_c - start_c;

		std::cout<<"Collective: " << elapsed_c.count() << "ms\n";
		std::cout<<"Prolific: " <<elapsed_p.count() << "ms\n";

		munmap(A,n*n*sizeof(int));
		return 0;
}
