//random schedule red
bool randomScheduleRed(PM* pPM, Job* pJob, float t){
//transmission of shuffle data
	float inc;
	int dataSize;
	std::vector<PM*> blockPMs;
	RedTask* tempRed = pJob->getUnassignedRed();
	std::vector<MapTask*> maps = pJob -> getMapTasks();
	std::vector<MapTask*>::iterator itMap = maps.begin();
	while(itMap != maps.end()){
		blockPMs.push_back((*itMap)->getPM());
		++itMap;
	}
	std::vector<PM*>::iterator itBlockPM = blockPMs.begin();
	while (itBlockPM != blockPMs.end()){
		dataSize = (*itBlockPM)->getData(pJob->getID());  
		Link* pLink = (*itBlockPM)->getLink();
		//inc = static_cast<float>(dataSize) * base_tx_time/static_cast<float>((defaultBlockSize * pJob->getTotalRedNum()));
		pLink->addTrans(dataSize/pJob->getTotalRedNum());
		//pLink->incrBusyTime(inc);
		++itBlockPM;
	}

	//float incTime = base_tx_time * static_cast<float>(pJob->getShuffleBytes())/static_cast<float>(pJob->getTotalRedNum()*defaultBlockSize);
	pPM->getLink()->addTrans(dataSize/pJob->getTotalRedNum());
	//pPM->getLink()->incrBusyTime(incTime);


	//get the delay
	float delay = 0;
	float maxDelay = 0;
	itBlockPM = blockPMs.begin();
	while(itBlockPM != blockPMs.end()){
		delay = getTxTime(*itBlockPM, pPM);
		if ( delay > maxDelay){
			maxDelay = delay; 
		}
		++itBlockPM;
	}


	redVM* tempVM = pPM->assignRed(tempRed, t);
	float tt = t + redMap[getUniqueID(pJob->getID(),(tempRed)->getID())];
	tt += maxDelay;
	redTimeMap[tt] = tempVM;
	return true;
}
//schedule a reduce job
//To do: Should make the sum of probability of assign of all reduce tasks to be 1;
bool scheduleRed(PM* pPM, Job* pJob, float t){
//	if (pPM->getNumAvailRedSlot() >0 ){
	vector<RedTask*> reds = pJob->getRedTasks();
	vector<RedTask*>::iterator itRed = reds.begin();
	float tempProb;
	float maxProb = 0;
	RedTask* tempRed = 0;
	while(itRed != reds.end()){
		if(!(*itRed)->ifAssigned()){
			tempProb = getProbOfAssign(*itRed, pPM);
			if (tempProb > maxProb){
				tempRed = *itRed;
				maxProb = tempProb;
			}
		}
		++itRed;
	}
		
	float prob = static_cast<float>(rand())/static_cast<float>(RAND_MAX);
	if (maxProb > prob) {
		//if (getUniqueID(pJob->getID(), tempRed->getID()) == 65001){
		//	cout <<"1"<<endl;
		//}
		cout<<"Scheduling red task "<<tempRed->getID()<<" of Job: "<<pJob->getID()<<" on PM: "<<pPM->getID()<<endl;

		//transmission of shuffle data
		float inc;
		int dataSize;
		std::vector<PM*> blockPMs;
		Job* pJob = tempRed->getParentJob();
		std::vector<MapTask*> maps = pJob -> getMapTasks();
		std::vector<MapTask*>::iterator itMap = maps.begin();
		while(itMap != maps.end()){
			blockPMs.push_back((*itMap)->getPM());
			++itMap;
		}
		std::vector<PM*>::iterator itBlockPM = blockPMs.begin();
		while (itBlockPM != blockPMs.end()){
			dataSize = (*itBlockPM)->getData(pJob->getID());  
			Link* pLink = (*itBlockPM)->getLink();
			//inc = static_cast<float>(dataSize) * base_tx_time/static_cast<float>((defaultBlockSize * pJob->getTotalRedNum()));
//				inc = static_cast<float>(dataSize)/defaultBlockSize * base_tx_time/pJob->getNumRedTasks();
			//pLink->incrBusyTime(inc);
			pLink->addTrans(dataSize/pJob->getTotalRedNum());
			++itBlockPM;
		}

//			float incTime = static_cast<float>(pJob->getShuffleBytes())/(pJob->getNumRedTasks()*defaultBlockSize) * base_tx_time;
		//float incTime = base_tx_time * static_cast<float>(pJob->getShuffleBytes())/static_cast<float>(pJob->getTotalRedNum()*defaultBlockSize);
		//pPM->getLink()->incrBusyTime(incTime);
		pPM->getLink()->addTrans(dataSize/pJob->getTotalRedNum());

		//get the delay
		float delay = 0;
		float maxDelay = 0;
		itBlockPM = blockPMs.begin();
		while(itBlockPM != blockPMs.end()){
			delay = getTxTime(*itBlockPM, pPM);
			if ( delay > maxDelay){
				maxDelay = delay; 
			}
			++itBlockPM;
		}


		redVM* tempVM = pPM->assignRed(tempRed, t);
		float tt = t + redMap[getUniqueID(pJob->getID(),(tempRed)->getID())];
		tt += maxDelay;
		redTimeMap[tt] = tempVM;
		return true;
	}
//	}
	return false;
}