Skip to content

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);
                    }
                }
            }
        });
    }
}