diff --git a/src/experiments/groovy/TemperatureClustering.groovy b/src/experiments/groovy/TemperatureClustering.groovy index 5f804eadd44f5bfd88e524b2921c975e29afee8a..cecc709914b96648ff53ea7d34bd7982d7a27736 100644 --- a/src/experiments/groovy/TemperatureClustering.groovy +++ b/src/experiments/groovy/TemperatureClustering.groovy @@ -2,9 +2,9 @@ import fr.irit.smac.amas4dc.AMAS4DC import fr.irit.smac.amas4dc.amas.AMASOption import fr.irit.smac.amas4dc.amas.MASSettings import fr.irit.smac.amas4dc.cluster.Cluster -import fr.irit.smac.amas4dc.cluster.DataPoint -import fr.irit.smac.amas4dc.cluster.DataPointFuser -import fr.irit.smac.amas4dc.cluster.DistanceMethod +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint +import fr.irit.smac.amas4dc.cluster.datapoint.DataPointFuser +import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod import fr.irit.smac.lxplot.LxPlot import groovy.transform.ToString diff --git a/src/experiments/groovy/TwoDimensionsPointsClustering.groovy b/src/experiments/groovy/TwoDimensionsPointsClustering.groovy index 16ee07a97cd61760075fe34a268b4367ec2f8686..79eb2e4fd4ed793876ead340478e49044820bd36 100644 --- a/src/experiments/groovy/TwoDimensionsPointsClustering.groovy +++ b/src/experiments/groovy/TwoDimensionsPointsClustering.groovy @@ -2,8 +2,8 @@ import fr.irit.smac.amas4dc.AMAS4DC import fr.irit.smac.amas4dc.amas.AMASOption import fr.irit.smac.amas4dc.amas.MASSettings import fr.irit.smac.amas4dc.cluster.Cluster -import fr.irit.smac.amas4dc.cluster.DataPoint -import fr.irit.smac.amas4dc.cluster.DistanceMethod +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint +import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod import fr.irit.smac.lxplot.LxPlot import fr.irit.smac.lxplot.commons.ChartType import groovy.transform.ToString diff --git a/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java b/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java index 6433f9b8cd28d07ba71a595d98729de23195b224..6dd9cfb43b495cb40cb98de2255366ad6635c6a7 100644 --- a/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java +++ b/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java @@ -8,7 +8,7 @@ import fr.irit.smac.amas4dc.amas.controller.query.ExtendedResult; import fr.irit.smac.amas4dc.amas.controller.query.Result; import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersExtendedResultQuery; import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersResultQuery; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import java.util.List; @@ -18,13 +18,16 @@ public class AMAS4DC<T extends DataPoint> { public AMAS4DC(MASSettings<T> masSettings) { this.controller = new AMAS4DCCommandAndQueryHandler<T>(masSettings); } + public void fit(List<T> data) { controller.handle(new NewDataPointCommand<T>(data)); controller.handle(new SolveCommand()); } + public Result<T> retrieveClusters() { return controller.handle(new RetrieveClustersResultQuery()); } + public ExtendedResult<T> retrieveExtendedClusters() { return controller.handle(new RetrieveClustersExtendedResultQuery()); } diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java b/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java index 943fd10e5fabc48e5b5e74fa7a85e4b50fbab300..b9fec55bbca58647d6c9eee90ada3e7dcd06e9f6 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java @@ -1,7 +1,5 @@ package fr.irit.smac.amas4dc.amas; public enum AMASOption { - @Deprecated - Forget, KeepAllDataPoints } diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java index 680929a0bd308a0f4d2023ee7284b99288b1043c..6819af7c641049b4b25ef99654b1bdb565947f05 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java @@ -3,7 +3,7 @@ package fr.irit.smac.amas4dc.amas; import fr.irit.smac.amak.Amas; import fr.irit.smac.amas4dc.amas.agent.ClusterAgent; import fr.irit.smac.amas4dc.amas.agent.DataPointAgent; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java index 83f61c6a46c74dfd5c6c85ffadc7ba654fb8c1de..24dcd28861af56294b50574e78f5667e703e3b5f 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java @@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas; import fr.irit.smac.amak.Environment; import fr.irit.smac.amas4dc.amas.agent.ClusterAgent; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; import java.util.*; @@ -13,7 +13,6 @@ import java.util.logging.Logger; public class DynamicClusteringEnvironment<T extends DataPoint> extends Environment { private final Queue<T> pendingAdditionDataPoints = new ConcurrentLinkedQueue<>(); - private static final Logger logger = Logger.getLogger(DynamicClusteringEnvironment.class.getName()); @Getter private T lastPolledPendingDataPoint = null; private final Map<Integer, List<ClusterAgent<T>>> buckets = new ConcurrentHashMap<>(); diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java b/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java index 916cc216c141789fccdf514edf912f88f7b985c1..fcedf3410aa2f37fdb23bc545f626131c308531f 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java @@ -1,7 +1,9 @@ package fr.irit.smac.amas4dc.amas; -import fr.irit.smac.amak.event.EventStore; -import fr.irit.smac.amas4dc.cluster.*; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPointDatabase; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPointFuser; +import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod; import java.util.EnumSet; 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 96fdc46a33d152b86bc6d5522cb62fc031750388..a1e45e0639e89545a8cb7cf6d3db23d4f516111a 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 @@ -2,7 +2,7 @@ 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.ClusterDistance; +import fr.irit.smac.amas4dc.cluster.distance.ClusterDistance; import fr.irit.smac.amas4dc.amas.DynamicClusteringAMAS; import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment; import fr.irit.smac.amas4dc.amas.messages.EvaluatedDistanceMessage; @@ -10,7 +10,7 @@ import fr.irit.smac.amas4dc.amas.messages.InformMostSimilarMessage; import fr.irit.smac.amas4dc.amas.messages.RequestDataPointDistanceToBeAbsorbedMessage; import fr.irit.smac.amas4dc.amas.messages.RequestClusterDistanceToBeAbsorbedMessage; import fr.irit.smac.amas4dc.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import fr.irit.smac.amas4dc.cluster.ExtendedCluster; import lombok.Getter; @@ -20,22 +20,18 @@ import java.util.logging.Level; import java.util.logging.Logger; public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAMAS<T>, DynamicClusteringEnvironment<T>> { + private static final Logger logger = Logger.getLogger(ClusterAgent.class.getName()); @Getter - private final Cluster<T> cluster; private State state = State.DORMANT; - private State nextState = state; private final Map<ClusterAgent<T>, ClusterDistance<T>> distancesReceived = new HashMap<>(); - //region Action variables - //endregion - private static final Logger logger = Logger.getLogger(ClusterAgent.class.getName()); private Optional<RequestDataPointDistanceToBeAbsorbedMessage> receivedRequestDataPointDistanceToBeAbsorbedMessage = Optional.empty(); private Optional<RequestClusterDistanceToBeAbsorbedMessage> receivedRequestClusterDistanceToBeAbsorbedMessage = Optional.empty(); private Optional<InformMostSimilarMessage> receivedInformMostSimilarClusterAgentsMessage = Optional.empty(); - private List<ClusterAgent<T>> requestDistanceMessageSentAgents = new ArrayList<>(); + private final List<ClusterAgent<T>> requestDistanceMessageSentAgents = new ArrayList<>(); protected ClusterAgent(DynamicClusteringAMAS amas, T dataPoint) { super(amas); @@ -91,7 +87,6 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM if (receivedRequestClusterDistanceToBeAbsorbedMessage.isPresent()) { if (logger.isLoggable(Level.INFO)) logger.info(this + " received a request for distance to be absorbed"); - return; } } case WAITING_FOR_DISTANCE -> { @@ -108,7 +103,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM private void clearDeadAgentsFromThoseWeExpectAnAnswerFrom() { - requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.keySet().contains(a)); + requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.containsKey(a)); for (var key : distancesReceived.keySet()) { if (!requestDistanceMessageSentAgents.contains(key)) @@ -118,6 +113,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM @Override protected void onDecideAndAct() { + State nextState = null; switch (state) { case DORMANT -> { if (receivedRequestDataPointDistanceToBeAbsorbedMessage.isPresent()) { @@ -154,13 +150,6 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM } else { nextState = State.DORMANT; } - } else if (amas.getMasSettings().amasOptions().contains(AMASOption.Forget)) { - // TODO decide to die logic - /* - if (dieCondition()) { - destroy(); - } - */ } } case WAITING_FOR_DISTANCE -> { @@ -197,19 +186,15 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM } } } - applyNextState(); - } - - - private void applyNextState() { - state = nextState; + if (nextState != null) + state = nextState; } private void absorbDataPoint(T otherDataPoint) { if (logger.isLoggable(Level.INFO)) logger.info(this + " absorbs the data point " + otherDataPoint); - T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint); + amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint); cluster.addDataPoint(otherDataPoint); } @@ -218,8 +203,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM logger.info(this + " absorbs the cluster " + otherCluster); amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherCluster.getRepresentative()); - - + if (getAmas().getMasSettings().amasOptions().contains(AMASOption.KeepAllDataPoints)) ((ExtendedCluster<T>) cluster).addClusterContent((ExtendedCluster<T>) otherCluster); else @@ -229,7 +213,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM @Override protected void onDestroy() { - nextState = State.DEAD; + state = State.DEAD; amas.getMasSettings().database().remove(cluster.getRepresentative()); getAmas().getEnvironment().removeFromBucket(cluster.getRepresentative().getBucketId(), this); } 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 87792ba0da418fbbc9c1d9dd57974acef89a58fe..d52586812c17b67bcba8b478e676c46a47a1017e 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 @@ -1,14 +1,13 @@ package fr.irit.smac.amas4dc.amas.agent; import fr.irit.smac.amak.Agent; -import fr.irit.smac.amas4dc.amas.ClusterDistance; +import fr.irit.smac.amas4dc.cluster.distance.ClusterDistance; import fr.irit.smac.amas4dc.amas.DynamicClusteringAMAS; import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment; import fr.irit.smac.amas4dc.amas.messages.EvaluatedDistanceMessage; import fr.irit.smac.amas4dc.amas.messages.InformMostSimilarMessage; import fr.irit.smac.amas4dc.amas.messages.RequestDataPointDistanceToBeAbsorbedMessage; -import fr.irit.smac.amas4dc.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import java.text.MessageFormat; import java.util.*; @@ -16,11 +15,10 @@ import java.util.logging.Level; import java.util.logging.Logger; public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClusteringAMAS<T>, DynamicClusteringEnvironment<T>> { - private static final float FLOAT_COMPARISON_EPSILON = 0.000001f; + private static final Logger logger = Logger.getLogger(DataPointAgent.class.getName()); private final T dataPoint; private final List<ClusterAgent<T>> requestDistanceMessageSentAgents = new ArrayList<>(); private final Map<ClusterAgent<T>, ClusterDistance<T>> distancesReceived = new HashMap<>(); - private static final Logger logger = Logger.getLogger(DataPointAgent.class.getName()); public DataPointAgent(DynamicClusteringAMAS<T> amas, T dataPoint) { super(amas); @@ -115,7 +113,7 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering } private void clearDeadAgentsFromThoseWeExpectAnAnswerFrom() { - requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.keySet().contains(a)); + requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.containsKey(a)); for (var key : distancesReceived.keySet()) { if (!requestDistanceMessageSentAgents.contains(key)) diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java index f984f25546a9bf10c3b78e8e4bb1e1161b95efb0..b33dfb961ee1afd54f88626559f98ed48b600da2 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java @@ -10,9 +10,9 @@ import fr.irit.smac.amas4dc.amas.controller.query.ExtendedResult; import fr.irit.smac.amas4dc.amas.controller.query.Result; import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersExtendedResultQuery; import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersResultQuery; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import fr.irit.smac.amas4dc.cluster.ExtendedCluster; -import fr.irit.smac.amas4dc.cluster.SilhouetteScoreCalculator; +import fr.irit.smac.amas4dc.cluster.evaluation.SilhouetteScoreCalculator; import lombok.Getter; import java.util.concurrent.Executors; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java index 70c99e2b3721342e7429d2ce8351a42048fc0658..105ff848afc78f87c4f353a1a8fbad32543022fb 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java @@ -1,6 +1,6 @@ package fr.irit.smac.amas4dc.amas.controller.command; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import java.util.List; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java index 97ef4f17daefde3d2d5138da2d4838282ac1eba5..5b42601bc65333f7bb07caf38bd9d0d3f0ce75db 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java @@ -1,8 +1,7 @@ package fr.irit.smac.amas4dc.amas.controller.query; import fr.irit.smac.amas4dc.amas.MASSettings; -import fr.irit.smac.amas4dc.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import fr.irit.smac.amas4dc.cluster.ExtendedCluster; import java.util.List; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java index 500d99ec68f3873b87fb5b9bc5098053c1e31e29..2ee3487ab6a976ce9c2fd0632874774de9f5afce 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java @@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas.controller.query; import fr.irit.smac.amas4dc.amas.MASSettings; import fr.irit.smac.amas4dc.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import java.util.List; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java index 18a885c2ae6fa7b83a0a1a27f5aea67c51a0ec29..e813d5ab86a84add2ddc9a888e576ac01c521e0c 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java @@ -3,7 +3,7 @@ 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.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; import lombok.ToString; 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 5cf0d9bf482e761f16ebe8471d7bab834b0f825d..c26863336ae143300d77b993f58ae39cba98fedf 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 @@ -3,9 +3,8 @@ 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 fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; import java.util.List; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java index af4c75a159953430b3afba748110c78822a4d5c3..dddbd42ebc1dcf05899d0f478396814976f420c7 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java @@ -3,7 +3,7 @@ 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.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; public class RequestClusterDistanceToBeAbsorbedMessage<T extends DataPoint> extends Message<ClusterAgent<T>> { diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java index 8610e8823026b04ad1d3a712c3ebce1e9771dd50..273fefcbfe0d48c073c96df2bb3e26ba1fe7cba7 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java +++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java @@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas.messages; import fr.irit.smac.amak.messaging.Message; import fr.irit.smac.amas4dc.amas.agent.DataPointAgent; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; public class RequestDataPointDistanceToBeAbsorbedMessage<T extends DataPoint> extends Message<DataPointAgent<T>> { diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java b/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java index cb7330d2f9a3e7f9102ffdc4be06c5b8f98f16ef..048d423b1c1a268185e230bf50c14e12554a2859 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java @@ -1,15 +1,10 @@ package fr.irit.smac.amas4dc.cluster; -import fr.irit.smac.amas4dc.amas.controller.MissingDataPointsException; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - @ToString public class Cluster<T extends DataPoint> { @Getter diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java b/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java index fc4a7d4b9c90ddf7eab3686e9c3d32e7bd1edbdf..5c5a116236e55c847fe12fa9ca47db036b2362ba 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java @@ -1,9 +1,9 @@ package fr.irit.smac.amas4dc.cluster; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import lombok.Getter; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class ExtendedCluster<T extends DataPoint> extends Cluster<T> { diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPoint.java b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPoint.java similarity index 61% rename from src/main/java/fr/irit/smac/amas4dc/cluster/DataPoint.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPoint.java index ac62dcb46e59f528551a865778050668281af5b4..5199f76ac98d5a21f56baead8cdbf2c940f2e9c8 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPoint.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPoint.java @@ -1,4 +1,4 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.datapoint; public interface DataPoint { default int getBucketId() { diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointDatabase.java b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointDatabase.java similarity index 88% rename from src/main/java/fr/irit/smac/amas4dc/cluster/DataPointDatabase.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointDatabase.java index 0f8cb532b1625892e592f8a7651415f1561496af..cb29e9b2c38119e8615927f274a096939808eb51 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointDatabase.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointDatabase.java @@ -1,4 +1,4 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.datapoint; import java.util.*; import java.util.logging.Level; @@ -6,7 +6,7 @@ import java.util.logging.Logger; public class DataPointDatabase<T extends DataPoint> { private static final Logger logger = Logger.getLogger(DataPointDatabase.class.getName()); - private Set<T> content = new HashSet<>(); + private final Set<T> content = new HashSet<>(); private T lastModifiedDataPoint; public void add(T newDataPoint) { diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointFuser.java b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointFuser.java similarity index 72% rename from src/main/java/fr/irit/smac/amas4dc/cluster/DataPointFuser.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointFuser.java index 9d833f06bc8df0bc087a46e821ac03939c93214e..90788b8c67befe4e4b876079db8e430ece841400 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointFuser.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointFuser.java @@ -1,4 +1,4 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.datapoint; import java.util.function.BiFunction; diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/ClusterDistance.java b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/ClusterDistance.java similarity index 57% rename from src/main/java/fr/irit/smac/amas4dc/amas/ClusterDistance.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/distance/ClusterDistance.java index c454eb4bd9acd3d7a53aeab229d6b4b1d6319a51..8165099008392c0c15b7922359cf7c4b2265ef99 100644 --- a/src/main/java/fr/irit/smac/amas4dc/amas/ClusterDistance.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/ClusterDistance.java @@ -1,8 +1,8 @@ -package fr.irit.smac.amas4dc.amas; +package fr.irit.smac.amas4dc.cluster.distance; import fr.irit.smac.amas4dc.cluster.Cluster; -import fr.irit.smac.amas4dc.cluster.DataPoint; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; public record ClusterDistance<T extends DataPoint>(Cluster<T> cluster, float distance) { diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DistanceMethod.java b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/DistanceMethod.java similarity index 55% rename from src/main/java/fr/irit/smac/amas4dc/cluster/DistanceMethod.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/distance/DistanceMethod.java index 7d1f1bf21e13edfe0251904c285d4a6d309c3dbf..14046eedbaaae6ce3cfc9cafa88ad7579ac1aa6a 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/DistanceMethod.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/DistanceMethod.java @@ -1,6 +1,8 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.distance; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; + public interface DistanceMethod<T extends DataPoint> { float apply(T dp1, T dp2); boolean areRoughlySimilar(T dp1, T dp2); diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/CalinskiHarabazIndex.java b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/CalinskiHarabazIndex.java similarity index 91% rename from src/main/java/fr/irit/smac/amas4dc/cluster/CalinskiHarabazIndex.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/CalinskiHarabazIndex.java index 72bcbf1c4b29bfc93c80dbb0262e051a1384163c..9c95f335fa6ec29ff41bf300b7abeeb9cb8a9518 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/CalinskiHarabazIndex.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/CalinskiHarabazIndex.java @@ -1,6 +1,8 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.evaluation; import fr.irit.smac.amas4dc.amas.MASSettings; +import fr.irit.smac.amas4dc.cluster.ExtendedCluster; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import java.util.List; @@ -11,7 +13,6 @@ public class CalinskiHarabazIndex<T extends DataPoint> { var ssw = computeWithinClusterVariance(clusters, masSettings); if (ssw == 0) { - // Avoid division by zero return Double.POSITIVE_INFINITY; } diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/SilhouetteScoreCalculator.java b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/SilhouetteScoreCalculator.java similarity index 92% rename from src/main/java/fr/irit/smac/amas4dc/cluster/SilhouetteScoreCalculator.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/SilhouetteScoreCalculator.java index f389f58cf36c540fe13f8b5e2cc2e17cf62d064c..065f4d62c582e1977c0fc7b0e9a77018065a49f8 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/SilhouetteScoreCalculator.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/SilhouetteScoreCalculator.java @@ -1,8 +1,10 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.evaluation; import fr.irit.smac.amas4dc.amas.AMASOption; import fr.irit.smac.amas4dc.amas.MASSettings; import fr.irit.smac.amas4dc.amas.controller.MissingDataPointsException; +import fr.irit.smac.amas4dc.cluster.ExtendedCluster; +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedClusterException.java b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/ExtendedClusterException.java similarity index 72% rename from src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedClusterException.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/exception/ExtendedClusterException.java index 2ae326c922ff185acf56cca7d32d05434455b946..e005e93ad1249f1ebd6e54697c9527d4f2b202fd 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedClusterException.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/ExtendedClusterException.java @@ -1,4 +1,4 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.exception; public class ExtendedClusterException extends RuntimeException { public ExtendedClusterException(String s) { diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/FusionException.java b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/FusionException.java similarity index 71% rename from src/main/java/fr/irit/smac/amas4dc/cluster/FusionException.java rename to src/main/java/fr/irit/smac/amas4dc/cluster/exception/FusionException.java index f81880eb92c4185f5552ddce2eac03ee0806b1d0..542709b103311582417f11f08828340f3e13d75a 100644 --- a/src/main/java/fr/irit/smac/amas4dc/cluster/FusionException.java +++ b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/FusionException.java @@ -1,4 +1,4 @@ -package fr.irit.smac.amas4dc.cluster; +package fr.irit.smac.amas4dc.cluster.exception; public class FusionException extends RuntimeException { public FusionException(String message) { diff --git a/src/test/groovy/SimpleClusteringIT.groovy b/src/test/groovy/SimpleClusteringIT.groovy index ba75ddce1e63802216b68aa989e8cb85dc423d9f..fdbd112fef20fa48427e0e71235a12eaf328ff3c 100644 --- a/src/test/groovy/SimpleClusteringIT.groovy +++ b/src/test/groovy/SimpleClusteringIT.groovy @@ -1,9 +1,9 @@ import fr.irit.smac.amas4dc.AMAS4DC import fr.irit.smac.amas4dc.amas.AMASOption import fr.irit.smac.amas4dc.amas.MASSettings -import fr.irit.smac.amas4dc.cluster.DataPoint -import fr.irit.smac.amas4dc.cluster.DataPointDatabase -import fr.irit.smac.amas4dc.cluster.DistanceMethod +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint +import fr.irit.smac.amas4dc.cluster.datapoint.DataPointDatabase +import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod import spock.lang.Specification class SimpleClusteringIT extends Specification { 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 a485f349b0a60f835c96219a5afe01a69a39c487..842141c6611403470b5cfe2b2a1cde44c4e94205 100644 --- a/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy +++ b/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy @@ -8,9 +8,9 @@ import fr.irit.smac.amas4dc.amas.messages.EvaluatedDistanceMessage import fr.irit.smac.amas4dc.amas.messages.RequestClusterDistanceToBeAbsorbedMessage import fr.irit.smac.amas4dc.amas.messages.RequestDataPointDistanceToBeAbsorbedMessage import fr.irit.smac.amas4dc.cluster.Cluster -import fr.irit.smac.amas4dc.cluster.DataPoint -import fr.irit.smac.amas4dc.cluster.DataPointFuser -import fr.irit.smac.amas4dc.cluster.DistanceMethod +import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint +import fr.irit.smac.amas4dc.cluster.datapoint.DataPointFuser +import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod import spock.lang.Specification import spock.util.concurrent.BlockingVariable