diff --git a/src/main/java/fr/irit/smac/clumate/amas/ClusterAgent.java b/src/main/java/fr/irit/smac/clumate/amas/ClusterAgent.java index 63eb488a59f7173f87ebd316525e1d21598b44e3..ba508deea88759d1bd11f04623008449e7d13889 100644 --- a/src/main/java/fr/irit/smac/clumate/amas/ClusterAgent.java +++ b/src/main/java/fr/irit/smac/clumate/amas/ClusterAgent.java @@ -1,7 +1,6 @@ package fr.irit.smac.clumate.amas; import fr.irit.smac.amak.Agent; -import fr.irit.smac.amak.messaging.Mailbox; import fr.irit.smac.clumate.amas.messages.EvaluatedScoreMessage; import fr.irit.smac.clumate.amas.messages.RequestSimilarityMessage; import fr.irit.smac.clumate.cluster.Cluster; @@ -20,11 +19,6 @@ public class ClusterAgent<T extends DataPoint> extends Agent<ClusterAMAS<T>, Clu private State state = State.INIT; private State nextState = state; - //region Mail boxes - private final Mailbox<RequestSimilarityMessage> requestSimilarityMessageMailBox = new Mailbox<>(); - private final Mailbox<EvaluatedScoreMessage> evaluatedScoreMessageMailbox = new Mailbox<>(); - //endregion - //region Perception variables private Cluster<T> receivedClusterForRequestSimilarity; private ClusterAgent<T> receivedRequestSimilarityRequester; @@ -81,14 +75,14 @@ public class ClusterAgent<T extends DataPoint> extends Agent<ClusterAMAS<T>, Clu } public boolean readyToStop() { - return state == State.DORMANT && requestSimilarityMessageMailBox.isEmpty(); + return state == State.DORMANT && !mailbox.hasMessageOfType(RequestSimilarityMessage.class); } @Override protected void onPerceive() { switch (state) { case DORMANT -> { - var receivedRequestSimilarityMessage = this.requestSimilarityMessageMailBox.retrieve(); + var receivedRequestSimilarityMessage = this.mailbox.read(RequestSimilarityMessage.class); if (receivedRequestSimilarityMessage.isPresent()) { receivedClusterForRequestSimilarity = receivedRequestSimilarityMessage.get().getCluster(); receivedRequestSimilarityRequester = (ClusterAgent) receivedRequestSimilarityMessage.get().getSender(); @@ -98,8 +92,8 @@ public class ClusterAgent<T extends DataPoint> extends Agent<ClusterAMAS<T>, Clu } } case WAITING_FOR_REPLY -> { - while (!evaluatedScoreMessageMailbox.isEmpty()) { - var evaluatedScoreMessage = this.evaluatedScoreMessageMailbox.retrieve(); + while (mailbox.hasMessageOfType(EvaluatedScoreMessage.class)) { + var evaluatedScoreMessage = this.mailbox.read(EvaluatedScoreMessage.class); if (evaluatedScoreMessage.isPresent()) { similarityScoresReceived.put((ClusterAgent) evaluatedScoreMessage.get().getSender(), evaluatedScoreMessage.get().getSimilarityScore()); } @@ -177,7 +171,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<ClusterAMAS<T>, Clu for (var agent : clusterAgentsRoughlySimilarOnReady) { if (logger.isLoggable(Level.INFO)) logger.info(this + " sends RequestSimilarityMessage to " + agent); - agent.requestSimilarityMessageMailBox.send(new RequestSimilarityMessage(this, cluster)); + agent.mailbox.receive(new RequestSimilarityMessage(this, cluster)); requestSimilarityMessageSentAgents.add(agent); } @@ -191,7 +185,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<ClusterAMAS<T>, Clu var message = new EvaluatedScoreMessage(this, computedSimilarityScoreDuringThisCycle); if (logger.isLoggable(Level.INFO)) logger.info(this + " --> " + receivedRequestSimilarityRequester + " " + message); - receivedRequestSimilarityRequester.evaluatedScoreMessageMailbox.send(message); + receivedRequestSimilarityRequester.mailbox.receive(message); receivedRequestSimilarityRequester = null; if (computedSimilarityScoreDuringThisCycle >= getAmas().getMasSettings().fusionThreshold()) { diff --git a/src/main/java/fr/irit/smac/clumate/amas/ClusterEnvironment.java b/src/main/java/fr/irit/smac/clumate/amas/ClusterEnvironment.java index 914f8245d2b482fd8394662e3411a71a680628c0..06b07263967983d48583951217494518d322f464 100644 --- a/src/main/java/fr/irit/smac/clumate/amas/ClusterEnvironment.java +++ b/src/main/java/fr/irit/smac/clumate/amas/ClusterEnvironment.java @@ -17,11 +17,6 @@ public class ClusterEnvironment<T extends DataPoint> extends Environment { @Getter private T lastPolledPendingDataPoint = null; - @Override - public void onInitialEntitiesCreation() { - super.onInitialEntitiesCreation(); - } - public boolean hasRemainingPendingAdditionDataPoints() { return !pendingAdditionDataPoints.isEmpty(); } diff --git a/src/test/groovy/fr/irit/smac/clumate/amas/ClusterAgentTest.groovy b/src/test/groovy/fr/irit/smac/clumate/amas/ClusterAgentTest.groovy new file mode 100644 index 0000000000000000000000000000000000000000..b20a247ffec261780c8f52b1d2022a636a6ba65b --- /dev/null +++ b/src/test/groovy/fr/irit/smac/clumate/amas/ClusterAgentTest.groovy @@ -0,0 +1,27 @@ +package fr.irit.smac.clumate.amas + +import fr.irit.smac.amak.Agent +import fr.irit.smac.amak.Amas +import fr.irit.smac.clumate.amas.messages.RequestSimilarityMessage +import fr.irit.smac.clumate.cluster.Cluster +import fr.irit.smac.clumate.cluster.DataPoint +import fr.irit.smac.clumate.cluster.DataPointFuser +import fr.irit.smac.clumate.cluster.SimilarityScoreMethod +import spock.lang.Specification + +class ClusterAgentTest extends Specification { + def "When an agent in DORMANT receives a RequestSimilarityMessage, it should reply with a similarity score"() { + given: + def amas = new ClusterAMAS(new ClusterEnvironment<DataPoint>(), new MASSettings<DataPoint>(Mock(SimilarityScoreMethod), 0.5, EnumSet.noneOf(AMASOption),Mock(DataPointFuser))) + def agent = new ClusterAgent(amas, Mock(DataPoint)) + agent.state = ClusterAgent.State.DORMANT + def mock = Mock(ClusterAgent) + + when: + agent.mailbox.receive(new RequestSimilarityMessage(mock, Mock(Cluster))) + agent.cycle() + + then: + agent.state == ClusterAgent.State.ACTIVE + } +}