package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.resourceallocation.dream.step;
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.ThresholdGuaranteeAlgorithm2;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 12/6/13
* Time: 7:31 PM
*/
public class LinearStepUpdater extends RichPoorStepUpdater {
private int minResourceChange;
@Override
public void init(int probAdd, int probDiv, ThresholdGuaranteeAlgorithm2 algorithm) {
super.init(probAdd, probDiv, algorithm);
minResourceChange = 2 * algorithm.getMinResource();
}
@Override
protected void finishForTask(DreamTaskRecord taskRecord) {
}
@Override
protected void MiddleGavePoor(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setAdditionStep(computeLinearChange(taskRecord, -change));
} catch (IndecisiveResultException e) {
taskRecord.setAdditionStep(minResourceChange);
}
}
@Override
protected void MiddleGotMiddle(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(0);
taskRecord.setAdditionStep(0);
}
@Override
protected void MiddleGotRich(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, change));
} catch (IndecisiveResultException e) {
taskRecord.setReductionStep(minResourceChange);
}
}
@Override
protected void MiddleGaveRich(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, -change));
} catch (IndecisiveResultException e) {
taskRecord.setReductionStep(minResourceChange);
}
}
@Override
protected void MiddleGaveMiddle(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(0);
taskRecord.setAdditionStep(0);
}
@Override
protected void MiddleGotPoor(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setAdditionStep(computeLinearChange(taskRecord, change));
} catch (IndecisiveResultException e) {
taskRecord.setAdditionStep(minResourceChange);
}
}
@Override
protected void RichGotMiddle(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(0);
taskRecord.setAdditionStep(0);
}
@Override
protected void PoorGaveMiddle(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(0);
taskRecord.setAdditionStep(0);
}
@Override
protected void PrepareForTask(AllocationTaskView task) {
}
@Override
protected void prepare() {
}
@Override
protected void finishing() {
}
@Override
protected void RichGaveMiddle(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(0);
taskRecord.setAdditionStep(0);
}
@Override
protected void PoorGotMiddle(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(0);
taskRecord.setAdditionStep(0);
}
@Override
protected void RichGavePoor(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, -change));
} catch (IndecisiveResultException e) {
taskRecord.setAdditionStep(minResourceChange);
}
}
@Override
protected void RichGotPoor(DreamTaskRecord taskRecord, int change) {
taskRecord.setAdditionStep(minResourceChange);
}
@Override
protected void PoorGavePoor(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, -change));
} catch (IndecisiveResultException e) {
taskRecord.setAdditionStep(minResourceChange);
}
}
@Override
protected void PoorGotPoor(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setAdditionStep(computeLinearChange(taskRecord, change));
} catch (IndecisiveResultException e) {
taskRecord.setAdditionStep(minResourceChange);
}
}
private int computeLinearChange(DreamTaskRecord taskRecord, int change) throws IndecisiveResultException {
double x2 = taskRecord.getTask().getResourceShare();
double y2 = taskRecord.getTask().getAggregatedAccuracy();
double x1 = x2 - change;
double y1 = taskRecord.getLastAccuracy();
if (change == 0 || y1 == y2) {
throw new IndecisiveResultException();
}
double targetY = algorithm.getLowThreshold();
return (int) ((targetY - y2) * (x1 - x2) / (y1 - y2));
}
@Override
protected void PoorGaveRich(DreamTaskRecord taskRecord, int change) {
taskRecord.setReductionStep(minResourceChange);
}
@Override
protected void PoorGotRich(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, change));
} catch (IndecisiveResultException e) {
taskRecord.setReductionStep(minResourceChange);
}
}
@Override
protected void RichGotRich(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, change));
} catch (IndecisiveResultException e) {
taskRecord.setReductionStep(minResourceChange);
}
}
@Override
protected void RichGaveRich(DreamTaskRecord taskRecord, int change) {
try {
taskRecord.setReductionStep(computeLinearChange(taskRecord, -change));
} catch (IndecisiveResultException e) {
taskRecord.setReductionStep(minResourceChange);
}
}
private class IndecisiveResultException extends Throwable {
}
}