File DeletionProbabilist.java¶
File List > behaviour > replication > DeletionProbabilist.java
Go to the documentation of this file
package skydata.behaviour.replication;
import java.io.Serializable;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.TickerBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.lang.acl.UnreadableException;
import skydata.internal.agents.SKAgent;
import skydata.internal.agents.SKD;
import skydata.internal.behaviours.SKAgentBehaviour;
import skydata.internal.message.SKLMessage;
public class DeletionProbabilist extends SKAgentBehaviour {
public DeletionProbabilist(SKAgent agent) {
super(agent);
}
enum Stat {
OK,
NOTOK,
UND
}
static class Data implements Serializable {
public int nbok = 0;
public int nbnotok = 0;
public int nbund = 0;
public boolean wd = false;
}
@Override
public void action() {
SKD agent = (SKD) this.agent;
int rg = (Integer) (agent.args.get("rg"));
agent.createStorageObject("DELETION_DATA", new Data());
// Check if we want delete
agent.addBehaviour(new TickerBehaviour(agent, 5000) {
@Override
public void onTick() {
Data data = (Data) agent.getStorageObject("DELETION_DATA");
if (agent.getFamilySize() > rg) {
if (data.nbok + data.nbund + data.nbnotok == agent.getFamilySize()) {
data.nbok = data.nbund = data.nbnotok = 0;
}
if (data.nbok + data.nbund + data.nbnotok == 0 && data.wd == false) {
data.wd = true;
SKLMessage message = new SKLMessage("DELETE_ME", "DELETION");
message.setContent(true);
agent.broadcastFamily(message);
agent.print("Je veux me supprimer");
}
} else {
data.nbok = data.nbund = data.nbnotok = 0;
data.wd = false;
}
}
});
// Reception of a deletion request
MessageTemplate tDelMe = MessageTemplate.and(
MessageTemplate.MatchOntology("DELETE_ME"),
MessageTemplate.and(
MessageTemplate.MatchProtocol("DELETION"),
MessageTemplate.MatchPerformative(ACLMessage.INFORM)));
agent.addBehaviour(new CyclicBehaviour(agent) {
@Override
public void action() {
Data data = (Data) agent.getStorageObject("DELETION_DATA");
SKLMessage message = agent.skReceive(tDelMe);
if (message == null) {
block();
return;
}
SKLMessage response = new SKLMessage("DELETE_YOU", "DELETION");
response.addReceiver(response.getSender());
if (data.wd) {
double n = agent.getFamilySize();
double proba = 1 - Math.exp(Math.log(1 - rg / n) / n);
if (Math.random() < proba) {
response.setContent(Stat.NOTOK);
} else {
response.setContent(Stat.UND);
}
} else if (agent.getFamilySize() > rg) {
response.setContent(Stat.OK);
} else {
response.setContent(Stat.NOTOK);
}
agent.skSendReliable(response);
}
});
// Reception of a deletion answer
MessageTemplate tDelYou = MessageTemplate.and(
MessageTemplate.MatchOntology("DELETE_YOU"),
MessageTemplate.and(
MessageTemplate.MatchProtocol("DELETION"),
MessageTemplate.MatchPerformative(ACLMessage.INFORM)));
agent.addBehaviour(new CyclicBehaviour(agent) {
@Override
public void action() {
Data data = (Data) agent.getStorageObject("DELETION_DATA");
SKLMessage message = agent.skReceive(tDelYou);
if (message == null) {
block();
return;
}
Stat val = (Stat) message.getContent();
if (val == Stat.OK) {
if (data.wd) {
data.nbok++;
if (data.nbok + data.nbund >= rg) {
agent.delete();
}
}
} else if (val == Stat.UND) {
if (data.wd) {
data.nbund++;
}
} else if (data.wd == true) {
data.wd = false;
data.nbnotok++;
if (agent.getFamilySize() >= rg) {
SKLMessage response = new SKLMessage("DELETE_YOU", "DELETION");
response.setContent(Stat.OK);
agent.skSendReliable(response);
} else {
SKLMessage response = new SKLMessage("DELETE_YOU", "DELETION");
response.setContent(Stat.NOTOK);
agent.broadcastFamily(response);
}
}
}
});
}
}