Skip to content
Snippets Groups Projects
Commit ab1e77b1 authored by Alexandre's avatar Alexandre
Browse files

Improve behaviour of agents, Merge with the closest, then cluster agent tries...

Improve behaviour of agents, Merge with the closest, then cluster agent tries to merge with the others
parent b5bcd41a
No related branches found
No related tags found
No related merge requests found
package fr.irit.smac.amas4dc.amas;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amas4dc.cluster.DataPoint;
public record ClusterSimilarityScore<T extends DataPoint>(Cluster<T> cluster, float score) {
}
......@@ -2,11 +2,13 @@ package fr.irit.smac.amas4dc.amas.agent;
import fr.irit.smac.amak.Agent;
import fr.irit.smac.amas4dc.amas.AMASOption;
import fr.irit.smac.amas4dc.amas.ClusterSimilarityScore;
import fr.irit.smac.amas4dc.amas.DynamicClusteringAMAS;
import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment;
import fr.irit.smac.amas4dc.amas.messages.EvaluatedScoreMessage;
import fr.irit.smac.amas4dc.amas.messages.InformCandidateSimilarClusterAgentsMessage;
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityMessage;
import fr.irit.smac.amas4dc.amas.messages.InformMostSimilarMessage;
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityForFusionMessage;
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityToBeAbsorbedMessage;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amas4dc.cluster.DataPoint;
import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
......@@ -21,37 +23,34 @@ import java.util.logging.Logger;
public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAMAS<T>, DynamicClusteringEnvironment<T>> {
@Getter
private Cluster<T> cluster;
private State state = State.DORMANT;
private State nextState = state;
//region Perception variables
private T receivedDataPointForRequestSimilarity;
private DataPointAgent<T> receivedRequestSimilarityRequester;
//endregion
//region Decision variables
private boolean decideToDie;
private float computedSimilarityScoreDuringThisCycle;
//endregion
private final Map<ClusterAgent<T>, ClusterSimilarityScore<T>> similarityScoresReceived = new HashMap<>();
//region Action variables
//endregion
private final Random random = new Random();
private static final Logger logger = Logger.getLogger(ClusterAgent.class.getName());
private int amountOfCyclesWithTheSameState;
private final List<Cluster<T>> receivedCandidateSimilarClusters = new ArrayList<>();
private Optional<RequestSimilarityForFusionMessage> receivedRequestSimilarityForFusionMessage = Optional.empty();
private Optional<RequestSimilarityToBeAbsorbedMessage> receivedRequestSimilarityToBeAbsorbedMessage = Optional.empty();
private Optional<InformMostSimilarMessage> receivedInformMostSimilarClusterAgentsMessage = Optional.empty();
private List<ClusterAgent<T>> requestSimilarityMessageSentAgents = new ArrayList<>();
protected ClusterAgent(DynamicClusteringAMAS amas, T dataPoint) {
super(amas);
logger.info(this+" created");
if (logger.isLoggable(Level.INFO))
logger.info(this + " created");
if (amas.getMasSettings().amasOptions().contains(AMASOption.KeepAllDataPoints))
this.setCluster(new ExtendedCluster<T>(dataPoint));
else
this.setCluster(new Cluster<T>(dataPoint));
}
public enum State {DORMANT, DECIDING, DEAD, ACTIVE}
public enum State {DORMANT, WAITING_FOR_SIMILARITY, ACTIVE_FUSION_WITH_ANOTHER_CLUSTER_AGENT, DEAD, ACTIVE_ABSORB_A_DATA_POINT}
public State getState() {
return state;
......@@ -72,95 +71,117 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
@Override
protected void onPerceive() {
receivedInformMostSimilarClusterAgentsMessage = Optional.empty();
receivedRequestSimilarityForFusionMessage = Optional.empty();
receivedRequestSimilarityToBeAbsorbedMessage = Optional.empty();
switch (state) {
case DORMANT -> {
var receivedInformCandidateSimilarClusterAgentsMessage = this.getMailbox().read(InformCandidateSimilarClusterAgentsMessage.class);
if (receivedInformCandidateSimilarClusterAgentsMessage.isPresent()) {
logger.info(this+ " received a list of candidates similar cluster agents");
receivedCandidateSimilarClusters.addAll(receivedInformCandidateSimilarClusterAgentsMessage.get().getCandidateSimilarCluster());
this.receivedInformMostSimilarClusterAgentsMessage = this.getMailbox().read(InformMostSimilarMessage.class);
if (receivedInformMostSimilarClusterAgentsMessage.isPresent()) {
if (logger.isLoggable(Level.INFO))
logger.info(this + " received a list of candidates similar cluster agents");
return;
}
var receivedRequestSimilarityMessage = this.getMailbox().read(RequestSimilarityMessage.class);
if (receivedRequestSimilarityMessage.isPresent()) {
logger.info(this+ " received a request for similarity");
RequestSimilarityMessage<T> message = receivedRequestSimilarityMessage.get();
receivedDataPointForRequestSimilarity = message.getDataPoint();
receivedRequestSimilarityRequester = message.getSender();
this.receivedRequestSimilarityForFusionMessage = this.getMailbox().read(RequestSimilarityForFusionMessage.class);
if (receivedRequestSimilarityForFusionMessage.isPresent()) {
if (logger.isLoggable(Level.INFO))
logger.info(this + " received a request for similarity for fusion");
return;
}
this.receivedRequestSimilarityToBeAbsorbedMessage = this.getMailbox().read(RequestSimilarityToBeAbsorbedMessage.class);
if (receivedRequestSimilarityToBeAbsorbedMessage.isPresent()) {
if (logger.isLoggable(Level.INFO))
logger.info(this + " received a request for similarity to be absorbed");
return;
} else {
receivedDataPointForRequestSimilarity = null;
receivedRequestSimilarityRequester = null;
}
}
case WAITING_FOR_SIMILARITY -> {
while (mailbox.hasMessageOfType(EvaluatedScoreMessage.class)) {
var evaluatedScoreMessage = this.getMailbox().read(EvaluatedScoreMessage.class);
if (evaluatedScoreMessage.isPresent()) {
similarityScoresReceived.put((ClusterAgent<T>) evaluatedScoreMessage.get().getSender(), new ClusterSimilarityScore<T>(evaluatedScoreMessage.get().getCluster(), evaluatedScoreMessage.get().getSimilarityScore()));
}
}
clearDeadAgentsFromThoseWeExpectAnAnswerFrom();
}
}
}
@Override
protected void onDecide() {
switch (state) {
case DORMANT -> {
decideToDie = false;
if (receivedDataPointForRequestSimilarity == null && amas.getMasSettings().amasOptions().contains(AMASOption.Forget)) {
// TODO decide to die logic
}
}
case ACTIVE -> {
if (receivedRequestSimilarityRequester != null) {
computedSimilarityScoreDuringThisCycle = computeSimilarityScore(receivedDataPointForRequestSimilarity);
if (logger.isLoggable(Level.INFO))
logger.info(this + " computed a similarity of " + computedSimilarityScoreDuringThisCycle + " with " + receivedRequestSimilarityRequester);
}
}
private void clearDeadAgentsFromThoseWeExpectAnAnswerFrom() {
requestSimilarityMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !similarityScoresReceived.keySet().contains(a));
for (var key :
similarityScoresReceived.keySet()) {
if (!requestSimilarityMessageSentAgents.contains(key))
similarityScoresReceived.remove(key);
}
}
@Override
protected void onAct() {
protected void onDecideAndAct() {
switch (state) {
case DORMANT -> {
if (receivedDataPointForRequestSimilarity != null)
nextState = State.ACTIVE;
else if (!receivedCandidateSimilarClusters.isEmpty()) {
for (var otherCluster : receivedCandidateSimilarClusters) {
absorb(otherCluster);
if (receivedRequestSimilarityForFusionMessage.isPresent()) {
float similarityScore = computeSimilarityScore((T) receivedRequestSimilarityForFusionMessage.get().getCluster().getRepresentative());
var message = new EvaluatedScoreMessage<T>(this, cluster, similarityScore);
var sender = receivedRequestSimilarityForFusionMessage.get().getSender();
if (logger.isLoggable(Level.INFO)) {
logger.info(this + " --> " + sender + " " + message);
}
receivedCandidateSimilarClusters.clear();
} else if (decideToDie) {
die();
}
}
case ACTIVE -> {
if (receivedRequestSimilarityRequester != null) {
var message = new EvaluatedScoreMessage<T>(this, cluster, computedSimilarityScoreDuringThisCycle);
if (logger.isLoggable(Level.INFO))
logger.info(this + " --> " + receivedRequestSimilarityRequester + " " + message);
receivedRequestSimilarityRequester.getMailbox().receive(message);
receivedRequestSimilarityRequester = null;
sender.getMailbox().receive(message);
if (computedSimilarityScoreDuringThisCycle >= getAmas().getMasSettings().fusionThreshold()) {
die();
if (similarityScore >= getAmas().getMasSettings().fusionThreshold()) {
destroy();
}
} else if (receivedRequestSimilarityToBeAbsorbedMessage.isPresent()) {
float similarityScore = computeSimilarityScore((T) receivedRequestSimilarityToBeAbsorbedMessage.get().getDataPoint());
var message = new EvaluatedScoreMessage<T>(this, cluster, similarityScore);
var sender = receivedRequestSimilarityToBeAbsorbedMessage.get().getSender();
if (logger.isLoggable(Level.INFO)) {
logger.info(this + " --> " + sender + " " + message);
}
sender.getMailbox().receive(message);
} else if (receivedInformMostSimilarClusterAgentsMessage.isPresent()) {
absorb((T) receivedInformMostSimilarClusterAgentsMessage.get().getDataPoint());
List<ClusterAgent<T>> otherSimilarClusterAgents = ((InformMostSimilarMessage<T>) receivedInformMostSimilarClusterAgentsMessage.get()).getOtherSimilarClusterAgents();
for (var otherClusterAgent : otherSimilarClusterAgents) {
otherClusterAgent.getMailbox().receive(new RequestSimilarityForFusionMessage(this, cluster));
}
if (!otherSimilarClusterAgents.isEmpty()) {
this.requestSimilarityMessageSentAgents.clear();
this.requestSimilarityMessageSentAgents.addAll(otherSimilarClusterAgents);
nextState = State.WAITING_FOR_SIMILARITY;
} else {
nextState = State.DORMANT;
}
} else if (amas.getMasSettings().amasOptions().contains(AMASOption.Forget)) {
// TODO decide to die logic
/*
if (dieCondition()) {
destroy();
}
*/
}
}
case WAITING_FOR_SIMILARITY -> {
if (requestSimilarityMessageSentAgents.size() == similarityScoresReceived.size()) {
for (var ssr :
similarityScoresReceived.entrySet()) {
if (ssr.getValue().score()>=getAmas().getMasSettings().fusionThreshold())
absorb(ssr.getValue().cluster());
}
nextState = State.DORMANT;
}
}
}
applyNextState();
}
private void die() {
nextState = State.DEAD;
destroy();
}
private void applyNextState() {
if (state == nextState) {
amountOfCyclesWithTheSameState++;
if (amountOfCyclesWithTheSameState > 10 && state == State.ACTIVE)
if (amountOfCyclesWithTheSameState > 10 && state == State.ACTIVE_FUSION_WITH_ANOTHER_CLUSTER_AGENT)
throw new RuntimeException(this + " is in the state " + state + " for too long");
} else {
amountOfCyclesWithTheSameState = 0;
......@@ -181,6 +202,19 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
setCluster(newCluster);
}
private void absorb(T otherDataPoint) {
if (logger.isLoggable(Level.INFO))
logger.info(this + " absorbs " + otherDataPoint);
T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint);
Cluster<T> newCluster;
if (getAmas().getMasSettings().amasOptions().contains(AMASOption.KeepAllDataPoints))
newCluster = new ExtendedCluster<>(newRepresentative, otherDataPoint, cluster);
else
newCluster = new Cluster<T>(newRepresentative, otherDataPoint, cluster);
setCluster(newCluster);
}
private void setCluster(Cluster<T> newCluster) {
if (cluster != null) {
getAmas().getEnvironment().removeFromBucket(cluster.getRepresentative().getBucketId(), this);
......@@ -199,10 +233,10 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
if (cluster != null)
if (getAmas().getMasSettings().eventStore() != null)
getAmas().getMasSettings().eventStore().add(new RemoveClusterEvent(cluster));
nextState = State.DEAD;
}
private float computeSimilarityScore(T other) {
return getAmas().getMasSettings().similarityScoreMethod().apply(this.cluster.getRepresentative(), other);
}
......
package fr.irit.smac.amas4dc.amas.agent;
import fr.irit.smac.amak.Agent;
import fr.irit.smac.amas4dc.amas.ClusterSimilarityScore;
import fr.irit.smac.amas4dc.amas.DynamicClusteringAMAS;
import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment;
import fr.irit.smac.amas4dc.amas.messages.EvaluatedScoreMessage;
import fr.irit.smac.amas4dc.amas.messages.InformCandidateSimilarClusterAgentsMessage;
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityMessage;
import fr.irit.smac.amas4dc.amas.messages.InformMostSimilarMessage;
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityToBeAbsorbedMessage;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amas4dc.cluster.DataPoint;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
......@@ -27,7 +25,8 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
public DataPointAgent(DynamicClusteringAMAS<T> amas, T dataPoint) {
super(amas);
logger.info(this + " created");
if (logger.isLoggable(Level.INFO))
logger.info(this + " created");
this.dataPoint = dataPoint;
}
......@@ -47,8 +46,8 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
}
for (var agent : clusterAgentsRoughlySimilarOnReady) {
if (logger.isLoggable(Level.INFO))
logger.info(this + " sends RequestSimilarityMessage to " + agent);
agent.getMailbox().receive(new RequestSimilarityMessage<T>(this, dataPoint));
logger.info(this + " sends RequestSimilarityToBeAbsorbedMessage to " + agent);
agent.getMailbox().receive(new RequestSimilarityToBeAbsorbedMessage<T>(this, dataPoint));
requestSimilarityMessageSentAgents.add(agent);
}
}
......@@ -65,18 +64,40 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
}
@Override
protected void onDecide() {
protected void onDecideAndAct() {
decideToFuse = false;
decideToCreateANewCluster = false;
var othersSimilarClusterAgents = new ArrayList<ClusterAgent<T>>();
Optional<ClusterAgent<T>> mostSimilarClusterAgent = Optional.empty();
if (requestSimilarityMessageSentAgents.size() == similarityScoresReceived.size()) {
if (logger.isLoggable(Level.INFO)) {
for (var e : similarityScoresReceived.entrySet()) {
logger.info(this + " received similarity score " + e.getValue() + " from " + e.getKey());
}
}
if (similarityScoresReceived.values().stream().anyMatch(v -> v.score >= getAmas().getMasSettings().fusionThreshold()))
float mostSimilarClusterAgentScore = -1;
var allSimilarClusterAgents = new HashMap<ClusterAgent<T>, Double>();
for (var ssr : similarityScoresReceived.entrySet()) {
if (ssr.getValue().score() >= getAmas().getMasSettings().fusionThreshold()) {
if (mostSimilarClusterAgentScore == -1 || ssr.getValue().score() > mostSimilarClusterAgentScore) {
mostSimilarClusterAgent = Optional.of(ssr.getKey());
mostSimilarClusterAgentScore = ssr.getValue().score();
}
allSimilarClusterAgents.put(ssr.getKey(), (double) ssr.getValue().score());
}
}
if (mostSimilarClusterAgent.isPresent()) {
for (var ca :
allSimilarClusterAgents.keySet()) {
if (ca != mostSimilarClusterAgent.get())
othersSimilarClusterAgents.add(ca);
}
decideToFuse = true;
else
} else
decideToCreateANewCluster = true;
if (logger.isLoggable(Level.INFO)) {
......@@ -88,21 +109,14 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
logger.info(this + " decides NOT to fuse not with one of them");
}
}
}
@Override
protected void onAct() {
if (decideToFuse) {
if (logger.isLoggable(Level.INFO))
logger.info(this + " decides to fuse");
var requestedAgentsWithHighestSimilarityScore = getReceivedClustersWithSimilarityScoreAboveFusionThreshold(similarityScoresReceived);
if (!requestedAgentsWithHighestSimilarityScore.isEmpty()) {
var newClusterAgent = new ClusterAgent<T>(amas, dataPoint);
newClusterAgent.getMailbox().receive(new InformCandidateSimilarClusterAgentsMessage<T>(this, requestedAgentsWithHighestSimilarityScore));
destroy();
} else {
throw new RuntimeException("Wanted to fuse with an agent but no agents are available");
}
logger.info(this + " decides to bo absorbed");
mostSimilarClusterAgent.get().getMailbox().receive(new InformMostSimilarMessage<T>(this,
dataPoint,
othersSimilarClusterAgents));
destroy();
} else if (decideToCreateANewCluster) {
new ClusterAgent<T>(amas, dataPoint);
destroy();
......@@ -111,16 +125,17 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
@Override
protected void onDestroy() {
logger.info(MessageFormat.format("{0} dies", this));
if (logger.isLoggable(Level.INFO))
logger.info(MessageFormat.format("{0} dies", this));
}
private List<Cluster<T>> getReceivedClustersWithSimilarityScoreAboveFusionThreshold(Map<ClusterAgent<T>, ClusterSimilarityScore<T>> similarityScoresReceived) {
float highestScore = Float.MIN_VALUE;
List<Cluster<T>> clustersWithHighestScore = new ArrayList<>();
for (var e : similarityScoresReceived.entrySet()) {
float clusterScore = e.getValue().score;
float clusterScore = e.getValue().score();
if (clusterScore >= getAmas().getMasSettings().fusionThreshold()) {
Cluster<T> cluster = e.getValue().cluster;
Cluster<T> cluster = e.getValue().cluster();
if (Math.abs(clusterScore - highestScore) < FLOAT_COMPARISON_EPSILON) {
clustersWithHighestScore.add(cluster);
} else if (clusterScore > highestScore) {
......@@ -146,8 +161,4 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
return false;
}
private record ClusterSimilarityScore<T extends DataPoint>(Cluster<T> cluster, float score) {
}
}
package fr.irit.smac.amas4dc.amas.messages;
import fr.irit.smac.amak.messaging.Message;
import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amas4dc.cluster.DataPoint;
import lombok.Getter;
import java.util.List;
public class InformMostSimilarMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
@Getter
private final T dataPoint;
@Getter
private final List<ClusterAgent<T>> otherSimilarClusterAgents;
public InformMostSimilarMessage(DataPointAgent<T> sender, T dataPoint, List<ClusterAgent<T>> otherSimilarClusterAgents) {
super(sender);
this.dataPoint = dataPoint;
this.otherSimilarClusterAgents = otherSimilarClusterAgents;
}
}
package fr.irit.smac.amas4dc.amas.messages;
import fr.irit.smac.amak.messaging.Message;
import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amas4dc.cluster.DataPoint;
import lombok.Getter;
import java.util.List;
public class InformCandidateSimilarClusterAgentsMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
public class RequestSimilarityForFusionMessage<T extends DataPoint> extends Message<ClusterAgent<T>> {
@Getter
private final List<Cluster<T>> candidateSimilarCluster;
public InformCandidateSimilarClusterAgentsMessage(DataPointAgent<T> sender, List<Cluster<T>> candidateSimilarCluster) {
private final Cluster<T> cluster;
public RequestSimilarityForFusionMessage(ClusterAgent<T> sender, Cluster<T> cluster) {
super(sender);
this.candidateSimilarCluster = candidateSimilarCluster;
this.cluster = cluster;
}
}
package fr.irit.smac.amas4dc.amas.messages;
import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amak.Agent;
import fr.irit.smac.amak.messaging.Message;
import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
import fr.irit.smac.amas4dc.cluster.Cluster;
import fr.irit.smac.amas4dc.cluster.DataPoint;
import lombok.Getter;
public class RequestSimilarityMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
public class RequestSimilarityToBeAbsorbedMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
@Getter
private final T dataPoint;
public RequestSimilarityMessage(DataPointAgent<T> sender, T dataPoint) {
public RequestSimilarityToBeAbsorbedMessage(DataPointAgent<T> sender, T dataPoint) {
super(sender);
this.dataPoint = dataPoint;
}
......
......@@ -2,10 +2,13 @@ package fr.irit.smac.amas4dc.amas
import fr.irit.smac.amak.messaging.Mailbox
import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment
import fr.irit.smac.amas4dc.amas.MASSettings
import fr.irit.smac.amas4dc.amas.agent.ClusterAgent
import fr.irit.smac.amas4dc.amas.agent.DataPointAgent
import fr.irit.smac.amas4dc.amas.messages.EvaluatedScoreMessage
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityMessage
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityForFusionMessage
import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityToBeAbsorbedMessage
import fr.irit.smac.amas4dc.cluster.Cluster
import fr.irit.smac.amas4dc.cluster.DataPoint
import fr.irit.smac.amas4dc.cluster.DataPointFuser
......@@ -14,7 +17,38 @@ import spock.lang.Specification
import spock.util.concurrent.BlockingVariable
class ClusterAgentTest extends Specification {
def "When an agent in DORMANT receives a RequestSimilarityMessage, it should reply with a similarity score"() {
def "When an agent in DORMANT receives a RequestSimilarityForFusionMessage, it should reply with a similarity score"() {
given:
def messageReceivedByRequester = new BlockingVariable()
def similarityScoreMethodMock = Mock(SimilarityScoreMethod)
similarityScoreMethodMock.apply(_, _) >> 0.3
def amasMock = Mock(DynamicClusteringAMAS<DataPoint>)
amasMock.getMasSettings() >> new MASSettings(similarityScoreMethodMock, 0.5f, EnumSet.noneOf(AMASOption), Mock(DataPointFuser))
amasMock.getEnvironment() >> Mock(DynamicClusteringEnvironment)
def agent = new ClusterAgent(amasMock, Mock(DataPoint))
agent.state = ClusterAgent.State.DORMANT
def requesterMailboxMock = Mock(Mailbox)
requesterMailboxMock.receive(_) >> { msg ->
messageReceivedByRequester.set(msg)
}
def requesterAgentMock = Mock(ClusterAgent)
requesterAgentMock.getMailbox() >> requesterMailboxMock
when:
agent.mailbox.receive(new RequestSimilarityForFusionMessage(requesterAgentMock, Mock(Cluster)))
agent.cycle()
agent.cycle()
then:
messageReceivedByRequester.get()[0] instanceof EvaluatedScoreMessage
((EvaluatedScoreMessage) (messageReceivedByRequester.get()[0])).similarityScore == 0.3f
}
def "When an agent in DORMANT receives a RequestSimilarityToBeAbsorbedMessage, it should reply with a similarity score"() {
given:
def messageReceivedByRequester = new BlockingVariable()
......@@ -36,7 +70,7 @@ class ClusterAgentTest extends Specification {
requesterAgentMock.getMailbox() >> requesterMailboxMock
when:
agent.mailbox.receive(new RequestSimilarityMessage(requesterAgentMock, Mock(DataPoint)))
agent.mailbox.receive(new RequestSimilarityToBeAbsorbedMessage(requesterAgentMock, Mock(DataPoint)))
agent.cycle()
agent.cycle()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment