From d69df8471df3900fe1feb37c9b49a8d7bd4f152f Mon Sep 17 00:00:00 2001 From: Alexander Hellwig Date: Sat, 2 Mar 2019 17:57:54 +0100 Subject: [PATCH] Added and used guaranteedConnectedAdjacencyMatrix --- .../clustering/AutomaticClusteringHelper.java | 50 +++++++++++++++++++ .../AffinityPropagationAlgorithm.java | 2 +- .../algorithms/DBSCANClusteringAlgorithm.java | 2 +- .../algorithms/MarkovClusteringAlgorithm.java | 2 +- .../SpectralClusteringAlgorithm.java | 2 +- 5 files changed, 54 insertions(+), 4 deletions(-) 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 e7bf265..baed776 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 c6cfc13..6398d22 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 4ea541e..77c3ed2 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 d112e44..180d598 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 2ff282f..a49f23b 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); -- 2.22.0