package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.distributor;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.TaskRecord2;
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.ControlledBufferWriter;
import edu.usc.enl.dynamicmeasurement.util.IntegerWrapper;
import java.util.*;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/24/13
* Time: 9:13 PM
*/
public class WeightedResourceDistributorNoDummy extends WeightedResourceDistributor {
public WeightedResourceDistributorNoDummy(ThresholdGuaranteeAlgorithm2 algorithm) {
super(algorithm);
}
public static void giveToAll(IntegerWrapper dummyGive, ThresholdGuaranteeAlgorithm2 algorithm) {
Collection<? extends TaskRecord2> tasks = algorithm.getTasks();
int originalDummyGive = dummyGive.getValue();
//flush among all equally
List<DreamTaskRecord> wantEqualShare = new ArrayList<>();
for (TaskRecord2 task1 : tasks) {
DreamTaskRecord task = (DreamTaskRecord) task1;
wantEqualShare.add(task);
}
Collections.sort(wantEqualShare, Collections.reverseOrder());
if (wantEqualShare.size() > 0) {
ControlledBufferWriter logWriter = algorithm.getLogWriter();
int toGive = 1;
while (toGive > 0) {
toGive = (dummyGive.getValue() / wantEqualShare.size());
for (TaskRecord2 taskRecord : wantEqualShare) {
taskRecord.getTask().setResourceShare(taskRecord.getTask().getResourceShare() + toGive);
dummyGive.add(-toGive);
logWriter.println(dummyGive + "-d>" + toGive + "-d>" + taskRecord);
}
}
if (toGive == 0 && dummyGive.getValue() > 0) {
for (DreamTaskRecord taskRecord : wantEqualShare) {
taskRecord.getTask().setResourceShare(taskRecord.getTask().getResourceShare() + 1);
dummyGive.add(-1);
logWriter.println(dummyGive + "-d>" + 1 + "-d>" + taskRecord);
if (dummyGive.getValue() <= 0) {
break;
}
}
}
algorithm.getDummyTaskRecord().getTask().setResourceShare(algorithm.getDummyTaskRecord().getTask().getResourceShare()
- originalDummyGive);
}
}
public void distribute(List<DreamTaskRecord> richTasks, List<DreamTaskRecord> poorTasks) {
//I want to take resources from those that can give more
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());
}
DummyTaskRecord dummyTaskRecord = algorithm.getDummyTaskRecord();
if (dummyTaskRecord.isRich()) {
LinkedList<DreamTaskRecord> richTasks1 = new LinkedList<>();
richTasks1.add(dummyTaskRecord);
IntegerWrapper dummyGive = new IntegerWrapper(dummyTaskRecord.getTempToGiveGet());
if (poorTasks.size() > 0) {
distribute(richTasks1, poorTasks, dummyGive, sumGet);
}
if (dummyGive.getValue() > 0) {
if (sumGet.getValue() > 0) {
richTasks1.clear();
richTasks1.add(dummyTaskRecord);
flush(poorTasks, sumGet, richTasks1);
} else {
giveToAll(dummyGive, algorithm);
}
}
}
if (richTasks.size() > 0 && poorTasks.size() > 0 && sumGet.getValue() > 0) {
distribute(richTasks, poorTasks, sumGive, sumGet);
if (sumGet.getValue() > 0 && sumGive.getValue() > 0) {
flush(poorTasks, sumGet, richTasks);
}
}
// if (dummyTaskRecord.getTask().getResourceShare() > 0 && algorithm.getTasks().size() > 0) {
// System.out.println();
// }
}
}