package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.drop;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.aggregator.AccuracyAggregator;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.aggregator.EWMAAccuracyAggregatorImpl;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.PriorityDropPolicy;
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 java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/24/13
* Time: 7:53 PM
*/
public class NotSatisfiedPoorDropAll2 extends NotSatisfiedPoor {
private AccuracyAggregator averageToDropAgg;
public NotSatisfiedPoorDropAll2(ThresholdGuaranteeAlgorithm2 algorithm1, PriorityDropPolicy dropPolicy1) {
super(algorithm1, dropPolicy1);
averageToDropAgg = new EWMAAccuracyAggregatorImpl(1.0 / dropPolicy1.getDropEpochs());
}
@Override
public List<DreamTaskRecord> checkDrop(Collection<DreamTaskRecord>
poorTaskRecords, Collection<DreamTaskRecord> richTaskRecords, DummyTaskRecord dummyTaskRecord) {
ArrayList<DreamTaskRecord> output = new ArrayList<>();
int sumGive = dummyTaskRecord.getTask().getResourceShare();
int sumGet = 0;
for (DreamTaskRecord richTaskRecord : richTaskRecords) {
sumGive += richTaskRecord.getReductionStep2();
}
for (DreamTaskRecord poorTaskRecord : poorTaskRecords) {
sumGet += poorTaskRecord.getAdditionStep2();
}
Collection<? extends TaskRecord2> tasks = new ArrayList<>(algorithm.getTasks());
//averageToDropAgg.update(sumGet - sumGive);
TaskRecord2 dropped = dropPolicy.checkForDrop(sumGet > 2 * sumGive, tasks);
if (dropped != null) {
double averageToDrop = (sumGet - 2 * sumGive);
//averageToDropAgg.getAccuracy();
while (averageToDrop > 0) {
dropped = dropPolicy.getDropCandidate(tasks);
tasks.remove(dropped);
DreamTaskRecord dropped1 = (DreamTaskRecord) dropped;
output.add(dropped1);
if (poorTaskRecords.contains(dropped1)) {
averageToDrop -= dropped1.getAdditionStep2();
averageToDrop -= dropped1.getTask().getResourceShare();
} else if (richTaskRecords.contains(dropped1)) {
averageToDrop += dropped1.getReductionStep2();
averageToDrop -= dropped1.getTask().getResourceShare();
} else {
averageToDrop -= dropped1.getTask().getResourceShare();
}
}
}
return output;
}
}