diff --git a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/AutomaticClusteringHelper.java b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/AutomaticClusteringHelper.java index e7bf2657d4de8f6465e8e60f3e87df26a459b1b9..baed776317e781708800b8e9e1ee25efa69cde12 100644 --- a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/AutomaticClusteringHelper.java +++ b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/AutomaticClusteringHelper.java @@ -12,6 +12,10 @@ import de.monticore.lang.monticar.ts.MCTypeSymbol; import de.monticore.lang.monticar.ts.references.MCASTTypeSymbolReference; import de.monticore.lang.monticar.ts.references.MCTypeReference; import de.monticore.symboltable.CommonSymbol; +import org.jgrapht.Graph; +import org.jgrapht.alg.ConnectivityInspector; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.SimpleGraph; import java.util.Collection; import java.util.List; @@ -43,6 +47,52 @@ public class AutomaticClusteringHelper { return res; } + public static double[][] guaranteedConnectedAdjacencyMatrix(List subcomps, Collection connectors, Map subcompLabels){ + + + double[][] res = createAdjacencyMatrix(subcomps, connectors, subcompLabels); + List> connectedSubcomponentSets = getConnectedSubcomponentSets(subcomps, connectors); + + double max = 0; + for (double[] doubles : res) { + for (double adj : doubles) { + if(adj > max){ + max = adj; + } + } + } + + double unconnectedCost = Math.max(1000 * max, 1000); + + List representativeLabels = connectedSubcomponentSets.stream() + .map(s -> subcompLabels.get(s.iterator().next().getFullName())) + .collect(Collectors.toList()); + + for (Integer a : representativeLabels) { + for (Integer b : representativeLabels) { + if(!a.equals(b)){ + res[a][b] = unconnectedCost; + } + } + } + + return res; + } + + + public static List> getConnectedSubcomponentSets(List subcomps, Collection connectors){ + Graph graph = new SimpleGraph<>(DefaultEdge.class); + + subcomps.forEach(graph::addVertex); + connectors.stream() + .filter(c -> subcomps.contains(c.getSourcePort().getComponentInstance())) + .filter(c -> subcomps.contains(c.getTargetPort().getComponentInstance())) + .forEach(c -> graph.addEdge(c.getSourcePort().getComponentInstance(), c.getTargetPort().getComponentInstance())); + + ConnectivityInspector connectivityInspector = new ConnectivityInspector<>(graph); + return connectivityInspector.connectedSets(); + } + public static double[][] adjacencyMatrix2transitionMatrix(double[][] adjacencyMatrix) { double[][] transitionMatrix= adjacencyMatrix; diff --git a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/AffinityPropagationAlgorithm.java b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/AffinityPropagationAlgorithm.java index c6cfc133d7f76fd1de9fcee1d9bd9747da41dbd9..6398d22e8aaa73b4a6b4306796d95b6d72a1c1a6 100644 --- a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/AffinityPropagationAlgorithm.java +++ b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/AffinityPropagationAlgorithm.java @@ -29,7 +29,7 @@ public class AffinityPropagationAlgorithm implements ClusteringAlgorithm { List subcompsOrderedByName = ComponentHelper.getSubcompsOrderedByName(component); Map labelsForSubcomps = ComponentHelper.getLabelsForSubcomps(subcompsOrderedByName); - double[][] adjMatrix = AutomaticClusteringHelper.createAdjacencyMatrix(subcompsOrderedByName, + double[][] adjMatrix = AutomaticClusteringHelper.guaranteedConnectedAdjacencyMatrix(subcompsOrderedByName, ComponentHelper.getInnerConnectors(component), labelsForSubcomps); diff --git a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/DBSCANClusteringAlgorithm.java b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/DBSCANClusteringAlgorithm.java index 4ea541e83fc4185c91bd1fbf34ef09555ca30b95..77c3ed2d5d03ee42c3ed71bb0a695418a987d8c6 100644 --- a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/DBSCANClusteringAlgorithm.java +++ b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/DBSCANClusteringAlgorithm.java @@ -82,7 +82,7 @@ public class DBSCANClusteringAlgorithm implements ClusteringAlgorithm { } else { List subcompsOrderedByName = ComponentHelper.getSubcompsOrderedByName(component); Map labelsForSubcomps = ComponentHelper.getLabelsForSubcomps(subcompsOrderedByName); - double[][] adjMatrix = AutomaticClusteringHelper.createAdjacencyMatrix(subcompsOrderedByName, + double[][] adjMatrix = AutomaticClusteringHelper.guaranteedConnectedAdjacencyMatrix(subcompsOrderedByName, ComponentHelper.getInnerConnectors(component), labelsForSubcomps); diff --git a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/MarkovClusteringAlgorithm.java b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/MarkovClusteringAlgorithm.java index d112e444fc5a8365cecaa3ef443d493b1e018ecc..180d5986ec94248705f04ecc0287352f4e13bd4e 100644 --- a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/MarkovClusteringAlgorithm.java +++ b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/MarkovClusteringAlgorithm.java @@ -149,7 +149,7 @@ public class MarkovClusteringAlgorithm implements ClusteringAlgorithm { } else { List subcompsOrderedByName = ComponentHelper.getSubcompsOrderedByName(component); Map labelsForSubcomps = ComponentHelper.getLabelsForSubcomps(subcompsOrderedByName); - double[][] adjMatrix = AutomaticClusteringHelper.createAdjacencyMatrix(subcompsOrderedByName, + double[][] adjMatrix = AutomaticClusteringHelper.guaranteedConnectedAdjacencyMatrix(subcompsOrderedByName, ComponentHelper.getInnerConnectors(component), labelsForSubcomps); diff --git a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/SpectralClusteringAlgorithm.java b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/SpectralClusteringAlgorithm.java index 2ff282f6fa07e39499e1d955bea2effd09de2b8f..a49f23ba8d8d7513ac8e9f02471974c488dfadc3 100644 --- a/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/SpectralClusteringAlgorithm.java +++ b/src/main/java/de/monticore/lang/monticar/generator/middleware/clustering/algorithms/SpectralClusteringAlgorithm.java @@ -88,7 +88,7 @@ public class SpectralClusteringAlgorithm implements ClusteringAlgorithm { } else { List subcompsOrderedByName = ComponentHelper.getSubcompsOrderedByName(component); Map labelsForSubcomps = ComponentHelper.getLabelsForSubcomps(subcompsOrderedByName); - double[][] adjMatrix = AutomaticClusteringHelper.createAdjacencyMatrix(subcompsOrderedByName, + double[][] adjMatrix = AutomaticClusteringHelper.guaranteedConnectedAdjacencyMatrix(subcompsOrderedByName, ComponentHelper.getInnerConnectors(component), labelsForSubcomps);