package iamrescue.communication.scenario.scenarios;
import iamrescue.communication.IMessagingSchedule;
import iamrescue.communication.messages.MessageChannel;
public class SharedBandwidthSchedule implements IMessagingSchedule {
private static double DEFAULT_RELIABILITY = 1;
private static int DEFAULT_MAX_REPETITIONS = 2;
private static double BW_INFLATION = 1.25;
private MessageChannel channel;
// private int agents;
private double reliability = DEFAULT_RELIABILITY;
private int maxMessages = Integer.MAX_VALUE;
private int maxRepetitions = DEFAULT_MAX_REPETITIONS;
private int numRepetitions;
private int allocation;
// private int myProportion;
public SharedBandwidthSchedule(MessageChannel channel, int agents) {
this(channel, agents, 1);
computeNumMessages();
}
public SharedBandwidthSchedule(MessageChannel channel, int agents,
int myProportion) {
this.channel = channel;
// this.agents = agents;
this.allocation = (myProportion * channel.getBandwidth()) / agents;
// this.myProportion = myProportion;
this.allocation = (int)(BW_INFLATION * allocation);
computeNumMessages();
}
private void computeNumMessages() {
double failureProbability = channel.getOverallFailureProbability();
if (reliability == 0) {
numRepetitions = 0;
} else if (reliability == 1) {
numRepetitions = maxRepetitions;
} else if (failureProbability == 0) {
numRepetitions = 0;
} else {
int required = (int) Math.ceil(Math.log(1 - reliability)
/ Math.log(failureProbability));
if (required - 1 > maxRepetitions) {
numRepetitions = maxRepetitions;
} else {
numRepetitions = required - 1;
}
}
// numMessages = 5;
}
public void setReliability(double reliability) {
if (reliability < 0 || reliability > 1) {
throw new IllegalArgumentException(
"Reliability must be between 0 and 1");
}
this.reliability = reliability;
computeNumMessages();
}
public void setMaxMessages(int maxMessages) {
this.maxMessages = maxMessages;
computeNumMessages();
}
@Override
public int getAllocatedMessagesSize(MessageChannel channel, int time) {
if (channel.getChannelNumber() == this.channel.getChannelNumber()) {
return allocation;
} else {
return 0;
}
}
@Override
public int getAllocatedMessagesCount(MessageChannel channel, int timestep) {
if (channel.getChannelNumber() == this.channel.getChannelNumber()) {
return maxMessages;
} else {
return 0;
}
}
@Override
public int getAllocatedTotalBandwidth(MessageChannel channel, int time) {
return getAllocatedMessagesSize(channel, time);
}
@Override
public int getMaximumRepetitions(MessageChannel channel, int time) {
if (channel.getChannelNumber() == this.channel.getChannelNumber()) {
return numRepetitions;
} else {
return 0;
}
}
}