package codeine.command_peer; public class ExponentialProgressiveRateClaculator implements ProgressiveRateClaculator { private int howMuchToRun = 1; private int iteration = 0; private long timeToSleep = 0; public ExponentialProgressiveRateClaculator(int totalNumOfNodes, long durationMilli) { int timeSlices = (int) (Math.ceil(Math.log(totalNumOfNodes)) + 1); if (timeSlices == 0) { throw new IllegalArgumentException("will divide by zero: " + totalNumOfNodes + " " + durationMilli); } if (totalNumOfNodes > 0) { this.timeToSleep = durationMilli / timeSlices; } //else it should not sleep } @Override public void iterationStart(double minutesLeft, int nodesLeft) { howMuchToRun = Math.min((int) Math.pow(2, iteration), nodesLeft); iteration++; } @Override public int numOfNodesToExecute() { return howMuchToRun; } @Override public long getTimeToSleep(long iterationTime) { long actualSleepTime = timeToSleep - iterationTime; return actualSleepTime >= 0 ? actualSleepTime : 0; } }