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; /** * Created with IntelliJ IDEA. * User: masoud * Date: 10/26/13 * Time: 4:20 PM * ------------------------------------------------------------------------------------------------------------<br/> * <pre> * Old \ New |Poor |Rich |Middle * Change |>=0 |< 0 |>=0 |< 0 |>=0 |< 0 * Poor |A+=mc/A |A+=c |R=c/2 |R=max(A,c) -|A=c/2,R=c/2 |A=R=max(A,c) * Rich |A=max(R,c) |A=c/2 |R+=c |R+=mc/A |A=max(R,c)=R |A=c/2,R=c/2 * Middle |A=max(R,c) |A+=c |R+=c |R=max(A,c) |- |- * c can be summed over delayed ones * </pre> */ public class AIMDStepUpdater extends RichPoorStepUpdater { @Override protected void finishForTask(DreamTaskRecord taskRecord) { } @Override protected void MiddleGavePoor(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(taskRecord.getAdditionStep() + change); } @Override protected void MiddleGotMiddle(DreamTaskRecord taskRecord, int change) { // taskRecord.setAdditionStep(taskRecord.getAdditionStep() + change / 2); // taskRecord.setReductionStep(taskRecord.getReductionStep() + change); } @Override protected void MiddleGotRich(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(taskRecord.getReductionStep() + change); } @Override protected void MiddleGaveRich(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(Math.max(taskRecord.getAdditionStep(), change)); } @Override protected void MiddleGaveMiddle(DreamTaskRecord taskRecord, int change) { // taskRecord.setAdditionStep(taskRecord.getAdditionStep() + change); // taskRecord.setReductionStep(taskRecord.getReductionStep() + change / 2); } @Override protected void MiddleGotPoor(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(Math.max(taskRecord.getReductionStep(), change)); } @Override protected void RichGotMiddle(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(Math.max(taskRecord.getReductionStep(), change)); taskRecord.setReductionStep(Math.max(taskRecord.getReductionStep(), change)); // taskRecord.setReductionStep(change); } @Override protected void PoorGaveMiddle(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(Math.max(taskRecord.getAdditionStep(), change)); taskRecord.setAdditionStep(Math.max(taskRecord.getAdditionStep(), change)); // taskRecord.setAdditionStep(change); } @Override protected void PrepareForTask(AllocationTaskView task) { } @Override protected void prepare() { } @Override protected void finishing() { } private int getInitReductionStep(DreamTaskRecord taskRecord) { int init = 10 * algorithm.getMinResource(); int maxResource = algorithm.getMaxResource(); int num = algorithm.getTasks().size(); return Math.min(init, Math.max(0, taskRecord.getTask().getResourceShare() - maxResource / num)); } private int getInitAdditionStep(DreamTaskRecord taskRecord) { int init = 10 * algorithm.getMinResource(); int maxResource = algorithm.getMaxResource(); int num = algorithm.getTasks().size(); return Math.min(init, Math.max(0, maxResource / num - taskRecord.getTask().getResourceShare())); } @Override protected void RichGaveMiddle(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(change / 2); taskRecord.setReductionStep(change / 2); } @Override protected void PoorGotMiddle(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(change / 2); taskRecord.setReductionStep(change / 2); } @Override protected void RichGavePoor(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(change / 2); } @Override protected void RichGotPoor(DreamTaskRecord taskRecord, int change) { //this is for new tasks : With 0 outcome they usually have precision 100 then they find out it is 0 if (taskRecord.getTask().getResourceShare() <= algorithm.getMinResource()) { taskRecord.setAdditionStep(getInitAdditionStep(taskRecord)); } else { taskRecord.setAdditionStep(Math.max(taskRecord.getReductionStep(), change));//conservative } } @Override protected void PoorGavePoor(DreamTaskRecord taskRecord, int change) { taskRecord.setAdditionStep(taskRecord.getAdditionStep() + change); } @Override protected void PoorGotPoor(DreamTaskRecord taskRecord, int change) { // if (taskRecord.notUsingAll()) { // taskRecord.setAdditionStep(Math.max(taskRecord.getAdditionStep(), change)); // } else { taskRecord.setAdditionStep(taskRecord.getAdditionStep() + probAdd * change / taskRecord.getAdditionStep()); // } } @Override protected void PoorGaveRich(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(Math.max(taskRecord.getAdditionStep(), change)); // taskRecord.setReductionStep(getInitReductionStep(taskRecord)); } @Override protected void PoorGotRich(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(change / 2); } @Override protected void RichGotRich(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(taskRecord.getReductionStep() + change); } @Override protected void RichGaveRich(DreamTaskRecord taskRecord, int change) { taskRecord.setReductionStep(taskRecord.getReductionStep() + probAdd * change / taskRecord.getReductionStep()); } }