From 015683cd873ca7339d34ba3bb0f0ccdf6c2cd221 Mon Sep 17 00:00:00 2001
From: Alexandre <alexandre.perles@gmail.com>
Date: Thu, 14 Sep 2023 16:48:35 +0200
Subject: [PATCH] Allow chaining on fusion

---
 .../smac/amas4dc/amas/agent/ClusterAgent.java | 114 ++++++++++--------
 .../amas4dc/amas/agent/DataPointAgent.java    |  44 ++-----
 .../messages/InformMostSimilarMessage.java    |  14 ++-
 ...ClusterSimilarityToBeAbsorbedMessage.java} |   5 +-
 ...taPointSimilarityToBeAbsorbedMessage.java} |   6 +-
 .../smac/amas4dc/amas/ClusterAgentTest.groovy |  20 ++-
 6 files changed, 106 insertions(+), 97 deletions(-)
 rename src/main/java/fr/irit/smac/amas4dc/amas/messages/{RequestSimilarityForFusionMessage.java => RequestClusterSimilarityToBeAbsorbedMessage.java} (65%)
 rename src/main/java/fr/irit/smac/amas4dc/amas/messages/{RequestSimilarityToBeAbsorbedMessage.java => RequestDataPointSimilarityToBeAbsorbedMessage.java} (56%)

diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java b/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java
index 6b1044a..884ac32 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java
@@ -7,8 +7,8 @@ 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.InformMostSimilarMessage;
-import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityForFusionMessage;
-import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityToBeAbsorbedMessage;
+import fr.irit.smac.amas4dc.amas.messages.RequestDataPointSimilarityToBeAbsorbedMessage;
+import fr.irit.smac.amas4dc.amas.messages.RequestClusterSimilarityToBeAbsorbedMessage;
 import fr.irit.smac.amas4dc.cluster.Cluster;
 import fr.irit.smac.amas4dc.cluster.DataPoint;
 import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
@@ -35,8 +35,8 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 	private final Random random = new Random();
 	private static final Logger logger = Logger.getLogger(ClusterAgent.class.getName());
 	private int amountOfCyclesWithTheSameState;
-	private Optional<RequestSimilarityForFusionMessage> receivedRequestSimilarityForFusionMessage = Optional.empty();
-	private Optional<RequestSimilarityToBeAbsorbedMessage> receivedRequestSimilarityToBeAbsorbedMessage = Optional.empty();
+	private Optional<RequestDataPointSimilarityToBeAbsorbedMessage> receivedRequestDataPointSimilarityToBeAbsorbedMessage = Optional.empty();
+	private Optional<RequestClusterSimilarityToBeAbsorbedMessage> receivedRequestClusterSimilarityToBeAbsorbedMessage = Optional.empty();
 	private Optional<InformMostSimilarMessage> receivedInformMostSimilarClusterAgentsMessage = Optional.empty();
 	private List<ClusterAgent<T>> requestSimilarityMessageSentAgents =  new ArrayList<>();
 
@@ -50,7 +50,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 			this.setCluster(new Cluster<T>(dataPoint));
 	}
 
-	public enum State {DORMANT, WAITING_FOR_SIMILARITY, ACTIVE_FUSION_WITH_ANOTHER_CLUSTER_AGENT, DEAD, ACTIVE_ABSORB_A_DATA_POINT}
+	public enum State {DORMANT, WAITING_FOR_SIMILARITY, DEAD}
 
 	public State getState() {
 		return state;
@@ -72,8 +72,8 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 	@Override
 	protected void onPerceive() {
 		receivedInformMostSimilarClusterAgentsMessage = Optional.empty();
-		receivedRequestSimilarityForFusionMessage = Optional.empty();
-		receivedRequestSimilarityToBeAbsorbedMessage = Optional.empty();
+		receivedRequestDataPointSimilarityToBeAbsorbedMessage = Optional.empty();
+		receivedRequestClusterSimilarityToBeAbsorbedMessage = Optional.empty();
 		switch (state) {
 			case DORMANT -> {
 				this.receivedInformMostSimilarClusterAgentsMessage = this.getMailbox().read(InformMostSimilarMessage.class);
@@ -82,14 +82,14 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 						logger.info(this + " received a list of candidates similar cluster agents");
 					return;
 				}
-				this.receivedRequestSimilarityForFusionMessage = this.getMailbox().read(RequestSimilarityForFusionMessage.class);
-				if (receivedRequestSimilarityForFusionMessage.isPresent()) {
+				this.receivedRequestDataPointSimilarityToBeAbsorbedMessage = this.getMailbox().read(RequestDataPointSimilarityToBeAbsorbedMessage.class);
+				if (receivedRequestDataPointSimilarityToBeAbsorbedMessage.isPresent()) {
 					if (logger.isLoggable(Level.INFO))
-						logger.info(this + " received a request for similarity for fusion");
+						logger.info(this + " received a request for similarity to be absorbed");
 					return;
 				}
-				this.receivedRequestSimilarityToBeAbsorbedMessage = this.getMailbox().read(RequestSimilarityToBeAbsorbedMessage.class);
-				if (receivedRequestSimilarityToBeAbsorbedMessage.isPresent()) {
+				this.receivedRequestClusterSimilarityToBeAbsorbedMessage = this.getMailbox().read(RequestClusterSimilarityToBeAbsorbedMessage.class);
+				if (receivedRequestClusterSimilarityToBeAbsorbedMessage.isPresent()) {
 					if (logger.isLoggable(Level.INFO))
 						logger.info(this + " received a request for similarity to be absorbed");
 					return;
@@ -121,31 +121,31 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 	protected void onDecideAndAct() {
 		switch (state) {
 			case DORMANT -> {
-				if (receivedRequestSimilarityForFusionMessage.isPresent()) {
-					float similarityScore = computeSimilarityScore((T) receivedRequestSimilarityForFusionMessage.get().getCluster().getRepresentative());
+				if (receivedRequestDataPointSimilarityToBeAbsorbedMessage.isPresent()) {
+					float similarityScore = computeSimilarityScore((T) receivedRequestDataPointSimilarityToBeAbsorbedMessage.get().getDataPoint());
 					var message = new EvaluatedScoreMessage<T>(this, cluster, similarityScore);
-					var sender = receivedRequestSimilarityForFusionMessage.get().getSender();
+					var sender = receivedRequestDataPointSimilarityToBeAbsorbedMessage.get().getSender();
 					if (logger.isLoggable(Level.INFO)) {
 						logger.info(this + " --> " + sender + " " + message);
 					}
 					sender.getMailbox().receive(message);
-
-					if (similarityScore >= getAmas().getMasSettings().fusionThreshold()) {
-						destroy();
-					}
-				} else if (receivedRequestSimilarityToBeAbsorbedMessage.isPresent()) {
-					float similarityScore = computeSimilarityScore((T) receivedRequestSimilarityToBeAbsorbedMessage.get().getDataPoint());
+				} else if (receivedRequestClusterSimilarityToBeAbsorbedMessage.isPresent()) {
+					float similarityScore = computeSimilarityScore((Cluster<T>) receivedRequestClusterSimilarityToBeAbsorbedMessage.get().getCluster());
 					var message = new EvaluatedScoreMessage<T>(this, cluster, similarityScore);
-					var sender = receivedRequestSimilarityToBeAbsorbedMessage.get().getSender();
+					var sender = receivedRequestClusterSimilarityToBeAbsorbedMessage.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();
+					var informMostSimilarMessage = receivedInformMostSimilarClusterAgentsMessage.get();
+					if (informMostSimilarMessage.getDataPoint() != null)
+						absorbDataPoint((T) informMostSimilarMessage.getDataPoint());
+					else if (informMostSimilarMessage.getCluster() != null)
+						absorbCluster(informMostSimilarMessage.getCluster());
+					List<ClusterAgent<T>> otherSimilarClusterAgents = ((InformMostSimilarMessage<T>) informMostSimilarMessage).getOtherSimilarClusterAgents();
 					for (var otherClusterAgent : otherSimilarClusterAgents) {
-						otherClusterAgent.getMailbox().receive(new RequestSimilarityForFusionMessage(this, cluster));
+						otherClusterAgent.getMailbox().receive(new RequestClusterSimilarityToBeAbsorbedMessage(this, cluster));
 					}
 					if (!otherSimilarClusterAgents.isEmpty()) {
 						this.requestSimilarityMessageSentAgents.clear();
@@ -165,12 +165,35 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 			}
 			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());
+
+					float mostSimilarClusterAgentScore = -1;
+					var allSimilarClusterAgents = new HashMap<ClusterAgent<T>, Double>();
+					Optional<ClusterAgent<T>> mostSimilarClusterAgent = Optional.empty();
+					var othersSimilarClusterAgents = new ArrayList<ClusterAgent<T>>();
+					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());
+						}
+					}
+					for (var ca : allSimilarClusterAgents.keySet()) {
+						if (ca != mostSimilarClusterAgent.get())
+							othersSimilarClusterAgents.add(ca);
+					}
+					if (mostSimilarClusterAgent.isPresent()) {
+
+						if (logger.isLoggable(Level.INFO))
+							logger.info(this + " decides to be absorbed");
+						mostSimilarClusterAgent.get().getMailbox().receive(new InformMostSimilarMessage<T>(this,
+						                                                                                   getCluster(),
+						                                                                                   othersSimilarClusterAgents));
+						destroy();
+					}else{
+						nextState = State.DORMANT;
 					}
-					nextState = State.DORMANT;
 				}
 			}
 		}
@@ -179,39 +202,31 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 
 
 	private void applyNextState() {
-		if (state == nextState) {
-			amountOfCyclesWithTheSameState++;
-			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;
-		}
 		state = nextState;
 	}
 
-	private void absorb(Cluster<T> other) {
+	private void absorbDataPoint(T otherDataPoint) {
 		if (logger.isLoggable(Level.INFO))
-			logger.info(this + " absorbs " + other);
+			logger.info(this + " absorbs the data point " + otherDataPoint);
 
-		T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), other.getRepresentative());
+		T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint);
 		Cluster<T> newCluster;
 		if (getAmas().getMasSettings().amasOptions().contains(AMASOption.KeepAllDataPoints))
-			newCluster = new ExtendedCluster<>(newRepresentative, cluster, other);
+			newCluster = new ExtendedCluster<>(newRepresentative, otherDataPoint, cluster);
 		else
-			newCluster = new Cluster<T>(newRepresentative, cluster, other);
+			newCluster = new Cluster<T>(newRepresentative, otherDataPoint, cluster);
 		setCluster(newCluster);
 	}
-
-	private void absorb(T otherDataPoint) {
+	private void absorbCluster(Cluster<T> otherCluster) {
 		if (logger.isLoggable(Level.INFO))
-			logger.info(this + " absorbs " + otherDataPoint);
+			logger.info(this + " absorbs the cluster " + otherCluster);
 
-		T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint);
+		T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherCluster.getRepresentative());
 		Cluster<T> newCluster;
 		if (getAmas().getMasSettings().amasOptions().contains(AMASOption.KeepAllDataPoints))
-			newCluster = new ExtendedCluster<>(newRepresentative, otherDataPoint, cluster);
+			newCluster = new ExtendedCluster<>(newRepresentative, otherCluster, cluster);
 		else
-			newCluster = new Cluster<T>(newRepresentative, otherDataPoint, cluster);
+			newCluster = new Cluster<T>(newRepresentative, otherCluster, cluster);
 		setCluster(newCluster);
 	}
 
@@ -240,4 +255,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 	private float computeSimilarityScore(T other) {
 		return getAmas().getMasSettings().similarityScoreMethod().apply(this.cluster.getRepresentative(), other);
 	}
+	private float computeSimilarityScore(Cluster<T> other) {
+		return getAmas().getMasSettings().similarityScoreMethod().apply(this.cluster.getRepresentative(), other.getRepresentative());
+	}
 }
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java b/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java
index b302b8f..44f713e 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java
@@ -6,7 +6,8 @@ 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.InformMostSimilarMessage;
-import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityToBeAbsorbedMessage;
+import fr.irit.smac.amas4dc.amas.messages.RequestClusterSimilarityToBeAbsorbedMessage;
+import fr.irit.smac.amas4dc.amas.messages.RequestDataPointSimilarityToBeAbsorbedMessage;
 import fr.irit.smac.amas4dc.cluster.Cluster;
 import fr.irit.smac.amas4dc.cluster.DataPoint;
 
@@ -21,7 +22,6 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
 	private final List<ClusterAgent<T>> requestSimilarityMessageSentAgents = new ArrayList<>();
 	private final Map<ClusterAgent<T>, ClusterSimilarityScore<T>> similarityScoresReceived = new HashMap<>();
 	private static final Logger logger = Logger.getLogger(DataPointAgent.class.getName());
-	private boolean decideToFuse, decideToCreateANewCluster;
 
 	public DataPointAgent(DynamicClusteringAMAS<T> amas, T dataPoint) {
 		super(amas);
@@ -47,7 +47,7 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
 		for (var agent : clusterAgentsRoughlySimilarOnReady) {
 			if (logger.isLoggable(Level.INFO))
 				logger.info(this + " sends RequestSimilarityToBeAbsorbedMessage to " + agent);
-			agent.getMailbox().receive(new RequestSimilarityToBeAbsorbedMessage<T>(this, dataPoint));
+			agent.getMailbox().receive(new RequestDataPointSimilarityToBeAbsorbedMessage<T>(this, dataPoint));
 			requestSimilarityMessageSentAgents.add(agent);
 		}
 	}
@@ -65,9 +65,6 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
 
 	@Override
 	protected void onDecideAndAct() {
-		decideToFuse = false;
-		decideToCreateANewCluster = false;
-
 		var othersSimilarClusterAgents = new ArrayList<ClusterAgent<T>>();
 		Optional<ClusterAgent<T>> mostSimilarClusterAgent = Optional.empty();
 
@@ -90,37 +87,22 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
 				}
 			}
 			if (mostSimilarClusterAgent.isPresent()) {
-				for (var ca :
-						allSimilarClusterAgents.keySet()) {
+				for (var ca : allSimilarClusterAgents.keySet()) {
 					if (ca != mostSimilarClusterAgent.get())
 						othersSimilarClusterAgents.add(ca);
 				}
 
-				decideToFuse = true;
-			} else
-				decideToCreateANewCluster = true;
-
-			if (logger.isLoggable(Level.INFO)) {
-				if (decideToFuse)
-					logger.info(this + " decides to fuse with one of them");
-				else if (decideToCreateANewCluster)
-					logger.info(this + " decides to create a new cluster");
-				else
-					logger.info(this + " decides NOT to fuse not with one of them");
+				if (logger.isLoggable(Level.INFO))
+					logger.info(this + " decides to bo absorbed");
+				mostSimilarClusterAgent.get().getMailbox().receive(new InformMostSimilarMessage<T>(this,
+				                                                                                   dataPoint,
+				                                                                                   othersSimilarClusterAgents));
+				destroy();
+			} else {
+				new ClusterAgent<T>(amas, dataPoint);
+				destroy();
 			}
 		}
-
-		if (decideToFuse) {
-			if (logger.isLoggable(Level.INFO))
-				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();
-		}
 	}
 
 	@Override
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java
index 694daee..5cf0d9b 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java
@@ -1,5 +1,6 @@
 package fr.irit.smac.amas4dc.amas.messages;
 
+import fr.irit.smac.amak.Agent;
 import fr.irit.smac.amak.messaging.Message;
 import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
 import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
@@ -9,15 +10,24 @@ import lombok.Getter;
 
 import java.util.List;
 
-public class InformMostSimilarMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
+public class InformMostSimilarMessage<T extends DataPoint> extends Message {
 	@Getter
 	private final T dataPoint;
 	@Getter
 	private final List<ClusterAgent<T>> otherSimilarClusterAgents;
+	@Getter
+	private final Cluster<T> cluster;
 
-	public InformMostSimilarMessage(DataPointAgent<T> sender, T dataPoint, List<ClusterAgent<T>> otherSimilarClusterAgents) {
+	public InformMostSimilarMessage(Agent sender, T dataPoint, List<ClusterAgent<T>> otherSimilarClusterAgents) {
 		super(sender);
 		this.dataPoint = dataPoint;
+		this.cluster = null;
+		this.otherSimilarClusterAgents = otherSimilarClusterAgents;
+	}
+	public InformMostSimilarMessage(Agent sender, Cluster<T> cluster, List<ClusterAgent<T>> otherSimilarClusterAgents) {
+		super(sender);
+		this.cluster = cluster;
+		this.dataPoint = null;
 		this.otherSimilarClusterAgents = otherSimilarClusterAgents;
 	}
 }
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestSimilarityForFusionMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterSimilarityToBeAbsorbedMessage.java
similarity index 65%
rename from src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestSimilarityForFusionMessage.java
rename to src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterSimilarityToBeAbsorbedMessage.java
index fef3346..acf0b90 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestSimilarityForFusionMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterSimilarityToBeAbsorbedMessage.java
@@ -7,10 +7,11 @@ import fr.irit.smac.amas4dc.cluster.Cluster;
 import fr.irit.smac.amas4dc.cluster.DataPoint;
 import lombok.Getter;
 
-public class RequestSimilarityForFusionMessage<T extends DataPoint> extends Message<ClusterAgent<T>> {
+public class RequestClusterSimilarityToBeAbsorbedMessage<T extends DataPoint> extends Message<ClusterAgent<T>> {
 	@Getter
 	private final Cluster<T> cluster;
-	public RequestSimilarityForFusionMessage(ClusterAgent<T> sender, Cluster<T> cluster) {
+
+	public RequestClusterSimilarityToBeAbsorbedMessage(ClusterAgent<T> sender, Cluster<T> cluster) {
 		super(sender);
 		this.cluster = cluster;
 	}
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestSimilarityToBeAbsorbedMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointSimilarityToBeAbsorbedMessage.java
similarity index 56%
rename from src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestSimilarityToBeAbsorbedMessage.java
rename to src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointSimilarityToBeAbsorbedMessage.java
index 79c4b35..3001370 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestSimilarityToBeAbsorbedMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointSimilarityToBeAbsorbedMessage.java
@@ -1,17 +1,17 @@
 package fr.irit.smac.amas4dc.amas.messages;
 
-import fr.irit.smac.amak.Agent;
 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;
 
-public class RequestSimilarityToBeAbsorbedMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
+public class RequestDataPointSimilarityToBeAbsorbedMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
 	@Getter
 	private final T dataPoint;
 
-	public RequestSimilarityToBeAbsorbedMessage(DataPointAgent<T> sender, T dataPoint) {
+	public RequestDataPointSimilarityToBeAbsorbedMessage(DataPointAgent<T> sender, T dataPoint) {
 		super(sender);
 		this.dataPoint = dataPoint;
 	}
diff --git a/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy b/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy
index 04250dd..9f91ccb 100644
--- a/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy
+++ b/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy
@@ -2,13 +2,11 @@ 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.RequestSimilarityForFusionMessage
-import fr.irit.smac.amas4dc.amas.messages.RequestSimilarityToBeAbsorbedMessage
+import fr.irit.smac.amas4dc.amas.messages.RequestClusterSimilarityToBeAbsorbedMessage
+import fr.irit.smac.amas4dc.amas.messages.RequestDataPointSimilarityToBeAbsorbedMessage
 import fr.irit.smac.amas4dc.cluster.Cluster
 import fr.irit.smac.amas4dc.cluster.DataPoint
 import fr.irit.smac.amas4dc.cluster.DataPointFuser
@@ -17,7 +15,8 @@ import spock.lang.Specification
 import spock.util.concurrent.BlockingVariable
 
 class ClusterAgentTest extends Specification {
-	def "When an agent in DORMANT receives a RequestSimilarityForFusionMessage, it should reply with a similarity score"() {
+
+	def "When an agent in DORMANT receives a RequestDataPointSimilarityToBeAbsorbedMessage, it should reply with a similarity score"() {
 		given:
 		def messageReceivedByRequester = new BlockingVariable()
 
@@ -35,11 +34,11 @@ class ClusterAgentTest extends Specification {
 		requesterMailboxMock.receive(_) >> { msg ->
 			messageReceivedByRequester.set(msg)
 		}
-		def requesterAgentMock = Mock(ClusterAgent)
+		def requesterAgentMock = Mock(DataPointAgent)
 		requesterAgentMock.getMailbox() >> requesterMailboxMock
 
 		when:
-		agent.mailbox.receive(new RequestSimilarityForFusionMessage(requesterAgentMock, Mock(Cluster)))
+		agent.mailbox.receive(new RequestDataPointSimilarityToBeAbsorbedMessage(requesterAgentMock, Mock(DataPoint)))
 		agent.cycle()
 		agent.cycle()
 
@@ -47,8 +46,7 @@ class ClusterAgentTest extends Specification {
 		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"() {
+	def "When an agent in DORMANT receives a RequestClusterSimilarityToBeAbsorbedMessage, it should reply with a similarity score"() {
 		given:
 		def messageReceivedByRequester = new BlockingVariable()
 
@@ -66,11 +64,11 @@ class ClusterAgentTest extends Specification {
 		requesterMailboxMock.receive(_) >> { msg ->
 			messageReceivedByRequester.set(msg)
 		}
-		def requesterAgentMock = Mock(DataPointAgent)
+		def requesterAgentMock = Mock(ClusterAgent)
 		requesterAgentMock.getMailbox() >> requesterMailboxMock
 
 		when:
-		agent.mailbox.receive(new RequestSimilarityToBeAbsorbedMessage(requesterAgentMock, Mock(DataPoint)))
+		agent.mailbox.receive(new RequestClusterSimilarityToBeAbsorbedMessage(requesterAgentMock, Mock(Cluster)))
 		agent.cycle()
 		agent.cycle()
 
-- 
GitLab