package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.distributor;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.DreamTaskRecord;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.DummyTaskRecord;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.ThresholdGuaranteeAlgorithm2;
import edu.usc.enl.dynamicmeasurement.util.IntegerWrapper;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/24/13
* Time: 9:25 PM
*/
public class PriorityResourceDistributor extends AbstractResourceDistributor {
public PriorityResourceDistributor(ThresholdGuaranteeAlgorithm2 algorithm) {
super(algorithm);
}
@Override
public void distribute(List<DreamTaskRecord> richTasks, List<DreamTaskRecord> poorTasks) {
IntegerWrapper sumGive = new IntegerWrapper(0);
for (DreamTaskRecord richTask : richTasks) {
sumGive.add(richTask.getReductionStep2());
richTask.setTempToGiveGet(richTask.getReductionStep2());
}
IntegerWrapper sumGet = new IntegerWrapper(0);
for (DreamTaskRecord poorTask : poorTasks) {
sumGet.add(poorTask.getAdditionStep2());
poorTask.setTempToGiveGet(poorTask.getAdditionStep2());
}
Collections.sort(richTasks);
Collections.sort(poorTasks, Collections.reverseOrder());
DummyTaskRecord dummyTaskRecord = algorithm.getDummyTaskRecord();
if (dummyTaskRecord.isRich()) {
richTasks.add(0, dummyTaskRecord);
}
Iterator<DreamTaskRecord> richIterator = richTasks.iterator();
for (DreamTaskRecord poorTask : poorTasks) {
int toGet = poorTask.getTempToGiveGet();
DreamTaskRecord rich = null;
while (toGet > 0 && (richIterator.hasNext() || rich != null)) {
if (rich == null) {
rich = richIterator.next();
}
int toGive = rich.getTempToGiveGet();
int transfer = Math.min(toGet, toGive);
toGive -= transfer;
toGet -= transfer;
rich.getTask().setResourceShare(rich.getTask().getResourceShare() - transfer);
rich.setTempToGiveGet(rich.getTempToGiveGet() - transfer);
poorTask.getTask().setResourceShare(poorTask.getTask().getResourceShare() + transfer);
System.out.println(rich.getTask() + "->" + transfer + "->" + poorTask.getTask());
if (toGive == 0) {
rich = null;
}
}
poorTask.setTempToGiveGet(toGet);
}
}
}