package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.distributor;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.AllocationTaskView;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.DreamTaskRecord;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.DummyAllocationTaskView;
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 java.util.List;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 1/26/14
* Time: 8:35 AM
*/
public class AbsolutePriorityResourceDistributorHeadroom extends AbstractResourceDistributor {
private WeightedResourceDistributor weightedResourceDistributor;
private PriorityResourceDistributorOnlyPoor priorityPolicy;
public AbsolutePriorityResourceDistributorHeadroom(ThresholdGuaranteeAlgorithm2 algorithm) {
super(algorithm);
weightedResourceDistributor = new WeightedResourceDistributorNoDummy(algorithm);
priorityPolicy = new PriorityResourceDistributorOnlyPoor(algorithm);
}
@Override
public void distribute(List<DreamTaskRecord> richTasks, List<DreamTaskRecord> poorTasks) {
DummyHeadroomTaskRecord dummyTaskRecord = (DummyHeadroomTaskRecord) algorithm.getDummyTaskRecord();
dummyTaskRecord.setFirstTry(true);
dummyTaskRecord.setTempToGiveGet(dummyTaskRecord.getReductionStep2());
weightedResourceDistributor.distribute(richTasks, poorTasks);
dummyTaskRecord.setFirstTry(false);
dummyTaskRecord.setAmPoor(!dummyTaskRecord.isRich());
dummyTaskRecord.setAmRich(dummyTaskRecord.isRich());
int additionStep = algorithm.getHeadroom() - dummyTaskRecord.getTask().getResourceShare();
dummyTaskRecord.setAdditionStep(additionStep);
if (!dummyTaskRecord.isRich()) {
dummyTaskRecord.setTempToGiveGet(additionStep); //it will be suffering poor or get what it want
poorTasks.add(dummyTaskRecord);
} else {
dummyTaskRecord.setTempToGiveGet(dummyTaskRecord.getReductionStep2());
}
priorityPolicy.distribute(richTasks, poorTasks);
// if dummy>headroom
// first try to satisfy poor with dummy using their step until headroom value
// distribute resource from rich to poor
// if any poor is unsatisfied let it use others resources starting from dummy
}
@Override
public DummyTaskRecord getDummy() {
return new DummyHeadroomTaskRecord(new DummyAllocationTaskView(), algorithm);
}
public static class DummyHeadroomTaskRecord extends DummyTaskRecord {
private boolean firstTry = false;
public DummyHeadroomTaskRecord(AllocationTaskView task, ThresholdGuaranteeAlgorithm2 algorithm) {
super(task, algorithm);
}
public boolean isFirstTry() {
return firstTry;
}
public void setFirstTry(boolean firstTry) {
this.firstTry = firstTry;
}
@Override
public int getTempToGiveGet() {
return tempToGive;
}
@Override
public int getReductionStep2() {
if (firstTry) {
return Math.max(0, task.getResourceShare() - algorithm.getHeadroom());
} else {
return super.getReductionStep2();
}
}
@Override
public boolean isRich() {
return algorithm.getHeadroom() < task.getResourceShare();
}
}
}