From 493580a910a35b462f1c875a3de3391beaa2821c Mon Sep 17 00:00:00 2001 From: Jakob Gahde <jgahde@uni-bremen.de> Date: Sun, 30 May 2021 14:44:27 +0200 Subject: [PATCH 1/5] Fix GraphSplitterSolver --- .../custom/BasicProblemInstance.java | 5 +++++ .../Main.java | 2 +- .../common/implementation/GraphSplitter.java | 12 +++++++++--- .../graphsplitter/GraphSplitterSolver.java | 17 ++++++++++------- .../implementation/GraphSplitterTest.java | 3 ++- pom.xml | 6 +++++- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Custom-Graph-Library/src/main/java/de/uni/bremen/cluster/editing/custom/graph/library/model/implementation/custom/BasicProblemInstance.java b/Custom-Graph-Library/src/main/java/de/uni/bremen/cluster/editing/custom/graph/library/model/implementation/custom/BasicProblemInstance.java index 3ab4d8b..ecdbf89 100644 --- a/Custom-Graph-Library/src/main/java/de/uni/bremen/cluster/editing/custom/graph/library/model/implementation/custom/BasicProblemInstance.java +++ b/Custom-Graph-Library/src/main/java/de/uni/bremen/cluster/editing/custom/graph/library/model/implementation/custom/BasicProblemInstance.java @@ -30,6 +30,11 @@ public class BasicProblemInstance extends BasicUndirectedGraph implements Proble t = new HashMap<>(); } + public BasicProblemInstance(final Map<UndirectedEdge, Status> t) { + super(); + this.t = new HashMap<>(t); + } + public BasicProblemInstance(final BasicProblemInstance parent) { super(parent); this.k = parent.k; diff --git a/Pace-FM-Solver/src/main/java/de.uni.bremen.cluster.editing.pace.fm.solver/Main.java b/Pace-FM-Solver/src/main/java/de.uni.bremen.cluster.editing.pace.fm.solver/Main.java index db7588d..da1b291 100644 --- a/Pace-FM-Solver/src/main/java/de.uni.bremen.cluster.editing.pace.fm.solver/Main.java +++ b/Pace-FM-Solver/src/main/java/de.uni.bremen.cluster.editing.pace.fm.solver/Main.java @@ -29,7 +29,7 @@ public class Main { GraphSplitter splitter = new GraphSplitter(null, createdGraph); splitter.calculateComponents(); - for (BasicUndirectedGraph graph : splitter.getComponents()) { + for (Graph graph : splitter.getComponents()) { if (!stopFM) { checkComponent(graph); } else { diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitter.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitter.java index 9a34240..7e92085 100644 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitter.java +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitter.java @@ -2,8 +2,10 @@ package de.uni.bremen.cluster.editing.utilities.common.implementation; import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Edge; import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Graph; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.ProblemInstance; import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Vertex; import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.BasicUndirectedGraph; +import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.custom.BasicProblemInstance; import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Algorithm; import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.AlgorithmStep; import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Solver; @@ -20,7 +22,7 @@ public class GraphSplitter extends AlgorithmStep { private final Graph graph; private final Set<Integer> visited = new HashSet<>(); @Getter - private final List<BasicUndirectedGraph> components = new ArrayList<>(25); + private final List<Graph> components = new ArrayList<>(25); private final Map<Integer, Integer> vertexToComponents = new HashMap<>(); @Getter private int componentsSize = 0; @@ -40,14 +42,18 @@ public class GraphSplitter extends AlgorithmStep { private void calculateGraphs() { for (int i = 0; i < componentsSize; i++) { - components.add(new BasicUndirectedGraph()); + if (graph instanceof ProblemInstance) { + components.add(new BasicProblemInstance(((ProblemInstance) graph).getTMap())); + } else { + components.add(new BasicUndirectedGraph()); + } } for (Edge edge : graph.getEdges()) { int start = edge.getStartId(); int end = edge.getEndId(); - BasicUndirectedGraph graph = components.get(vertexToComponents.get(start)); + Graph graph = components.get(vertexToComponents.get(start)); if (!graph.vertexExits(start)) { graph.addVertex(new Vertex(start)); diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java index 49c1115..6f43868 100644 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java @@ -6,6 +6,7 @@ package de.uni.bremen.cluster.editing.utilities.solver.graphsplitter; import de.uni.bremen.cluster.editing.custom.graph.library.helper.ConsoleHelper; import de.uni.bremen.cluster.editing.custom.graph.library.model.api.EdgeModification; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Graph; import de.uni.bremen.cluster.editing.custom.graph.library.model.api.ProblemInstance; import de.uni.bremen.cluster.editing.custom.graph.library.model.api.UndirectedEdge; import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.BasicUndirectedGraph; @@ -50,26 +51,28 @@ public class GraphSplitterSolver extends Solver { GraphSplitter splitter = new GraphSplitter(this, input); splitter.calculateComponents(); ConsoleHelper.print("found " + splitter.getComponentsSize() + " components"); - for (BasicUndirectedGraph graph : splitter.getComponents()) { - if (graph.getVertices().size() == 0) { + for (Graph graph : splitter.getComponents()) { + ProblemInstance instance = (ProblemInstance) graph; + if (instance.getVertices().size() == 0) { ConsoleHelper.print("0 Vertices (must be clique)"); continue; } - if (graph.getEdges().size() == 0) { + if (instance.getEdges().size() == 0) { ConsoleHelper.print("0 Edges (must be clique)"); continue; } - if (graph.getVertices().size() <= 2) { + if (instance.getVertices().size() <= 2) { ConsoleHelper.print("less than 2 Vertices (must be clique)"); continue; } ConsoleHelper - .print("Starting to solve Component: <" + graph.getVertices().size() + ":" + graph.getEdges().size() + ">"); - BasicProblemInstance problemInstance = new BasicProblemInstance(graph); - Solver solver = new FruchtemanLpOrIlpSolver(problemInstance); + .print("Starting to solve Component: <" + instance.getVertices().size() + ":" + instance.getEdges().size() + + ">"); + Solver solver = new FruchtemanLpOrIlpSolver(instance); solver.setChildTo(this); solver.solve(); + ConsoleHelper.print("Component done: k = " + solver.getResultK()); changes.combine(solver.getChanges()); } setResultK(changes.getSize()); diff --git a/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitterTest.java b/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitterTest.java index 2975434..485920e 100644 --- a/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitterTest.java +++ b/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/common/implementation/GraphSplitterTest.java @@ -2,6 +2,7 @@ package de.uni.bremen.cluster.editing.utilities.common.implementation; import de.uni.bremen.cluster.editing.custom.graph.library.gui.GraphVisualizer; import de.uni.bremen.cluster.editing.custom.graph.library.io.implementation.BasicUndirectedGraphImporterExporter; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Graph; import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.BasicUndirectedGraph; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -38,7 +39,7 @@ class GraphSplitterTest { void printSolution() { GraphSplitter graphSplitter = new GraphSplitter(null, graph); graphSplitter.calculateComponents(); - for (BasicUndirectedGraph graph : graphSplitter.getComponents()) { + for (Graph graph : graphSplitter.getComponents()) { new GraphVisualizer(graph); } } diff --git a/pom.xml b/pom.xml index 68c15c5..5ec3d91 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,10 @@ <name>Max</name> <email>maxsonne@uni-bremen.de</email> </developer> + <developer> + <name>Jakob</name> + <email>jgahde@uni-bremen.de</email> + </developer> </developers> <modules> @@ -119,4 +123,4 @@ </plugin> </plugins> </build> -</project> \ No newline at end of file +</project> -- GitLab From fe2efc835677bac87796f5c9c6794fb686f1358b Mon Sep 17 00:00:00 2001 From: Jakob Gahde <jgahde@uni-bremen.de> Date: Sun, 30 May 2021 11:34:04 +0200 Subject: [PATCH 2/5] Add single paths kernel (draft) --- .../utilities/kernel/PreProcessingKernel.java | 185 ++++++++++++++++++ .../solver/common/PreProcessingKernel.java | 72 ------- .../graphsplitter/GraphSplitterSolver.java | 2 +- 3 files changed, 186 insertions(+), 73 deletions(-) create mode 100644 Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java delete mode 100644 Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/common/PreProcessingKernel.java diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java new file mode 100644 index 0000000..90e241a --- /dev/null +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java @@ -0,0 +1,185 @@ +package de.uni.bremen.cluster.editing.utilities.kernel; + +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.EdgeModification; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.ProblemInstance; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.UndirectedEdge; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Vertex; +import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.BasicUndirectedEdge; +import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.gramm.Status; +import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Algorithm; +import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.AlgorithmStep; +import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.ChangeTracker; +import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Solver; +import de.uni.bremen.cluster.editing.utilities.common.implementation.AlgorithmHelper; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker<UndirectedEdge> { + private EdgeModification<UndirectedEdge> changes = new EdgeModification<>(); + private ProblemInstance problemInstance; + private Set<Vertex> ignoredVertices; + + public PreProcessingKernel(Solver solver) { + super(solver); + } + + public void run(ProblemInstance problemInstance) { + this.start(); + changes.clear(); + this.problemInstance = problemInstance; + this.ignoredVertices = new HashSet<>(); + + doVertexPairs(); + doSinglePaths(); + + this.finish(); + } + + private void doVertexPairs() { + for (Vertex i : problemInstance.getVertices()) { + for (Vertex j : problemInstance.getVertices()) { + if (i.getId() >= j.getId()) { + continue; + } + doTwin(i, j); + } + } + } + + private void doSinglePaths() { + long edgeCount; + do { + // cut off all paths starting/ending in leaves + edgeCount = countAllowedEdges(); + problemInstance.getVertices().stream() + .filter(v -> degreeWithoutForbiddenEdgesOf(v) == 1) + .forEach(this::cutOffPath); + } while (edgeCount != countAllowedEdges()); + + // delete isolated paths + // Thanks to the previous step, all paths starting/ending in leaves are isolated + List<Vertex> p; + while ((p = findIsolatedPath()) != null) { + destroyAndDeletePath(p); + } + } + + private void doTwin(Vertex i, Vertex j) { + if (isTwin(i, j)) { + problemInstance.setT(i.getId(), j.getId(), Status.PERMANENT); + AlgorithmHelper + .TransitiveClosure + .doTransitiveClosure(problemInstance, new BasicUndirectedEdge(i, j), changes); + } + } + + private boolean isTwin(Vertex i, Vertex j) { + var neighborsI = problemInstance.getNeighbors(i); + var neighborsJ = problemInstance.getNeighbors(j); + + if (neighborsI.size() != neighborsJ.size()) { + return false; + } + var shadowCopyNeighboursI = new HashSet<>(neighborsI); + shadowCopyNeighboursI.removeAll(neighborsJ); + shadowCopyNeighboursI.remove(j); + return shadowCopyNeighboursI.size() == 0 && problemInstance.edgeExists(i, j); + } + + // Walk along an unambiguous path (that is, one with inner vertices of degree 2) + // until it ends or is no longer unambiguous + private void walkUnambiguousPath(final Vertex startVertex, final BiConsumer<Vertex, Vertex> c) { + var u = startVertex; + assert (degreeWithoutForbiddenEdgesOf(u) == 1); + @SuppressWarnings("OptionalGetWithoutIsPresent") // since degree is 1 + var v = getAllowedNeighbors(u).stream().findAny().get(); + + c.accept(u, v); + + boolean cont = degreeWithoutForbiddenEdgesOf(v) == 2; + while (cont) { + final var finalU = u; + u = v; + // since v has degree 2 + // noinspection OptionalGetWithoutIsPresent + v = getAllowedNeighbors(v).stream().filter(w -> w != finalU).findAny().get(); + cont = degreeWithoutForbiddenEdgesOf(v) == 2; // This way, any actions taken in c will not affect the loop + c.accept(u, v); + } + } + + // cuts off the path starting in the given leaf by marking the final edge leading to a degree > 2 vertex as forbidden + private void cutOffPath(final Vertex vertex) { + walkUnambiguousPath(vertex, (u, v) -> { + if (degreeWithoutForbiddenEdgesOf(v) > 2) { + changes.addRemovedEdge(new BasicUndirectedEdge(u, v)); + problemInstance.removeEdge(u, v); + problemInstance.setT(u.getId(), v.getId(), Status.FORBIDDEN); + } + }); + } + + private List<Vertex> findIsolatedPath() { + return problemInstance.getVertices().stream() + .filter(v -> !ignoredVertices.contains(v) && degreeWithoutForbiddenEdgesOf(v) == 1) + .findFirst() + .map(u -> { + var path = new ArrayList<Vertex>(); + path.add(u); + walkUnambiguousPath(u, (v, w) -> path.add(w)); + return path; + }) + .orElse(null); + } + + private void destroyAndDeletePath(final List<Vertex> path) { + var tmp = path; + while (tmp.size() > 2) { + ignoredVertices.add(tmp.get(0)); + ignoredVertices.add(tmp.get(1)); + changes.addRemovedEdge(new BasicUndirectedEdge(tmp.get(1), tmp.get(2))); + problemInstance.removeEdge(tmp.get(1), tmp.get(2)); + problemInstance.setT(tmp.get(1).getId(), tmp.get(2).getId(), Status.FORBIDDEN); + tmp = tmp.subList(2, tmp.size()); + } + if (tmp.size() > 0) { + ignoredVertices.add(tmp.get(0)); + if (tmp.size() > 1) { + ignoredVertices.add(tmp.get(1)); + } + } + } + + private Set<Vertex> getAllowedNeighbors(Vertex u) { + return problemInstance.getNeighbors(u).stream().filter( + v -> problemInstance.getT(u.getId(), v.getId()) != Status.FORBIDDEN + ).collect(Collectors.toSet()); + } + + private long degreeWithoutForbiddenEdgesOf(Vertex u) { + return problemInstance.getNeighbors(u).stream().filter( + v -> problemInstance.getT(u.getId(), v.getId()) != Status.FORBIDDEN + ).count(); + } + + private long countAllowedEdges() { + return problemInstance.getEdges().stream().filter( + e -> problemInstance.getT(e.getStartId(), e.getEndId()) != Status.FORBIDDEN + ).count(); + } + + @Override + public Algorithm getAlgorithm() { + return Algorithm.PREPROCESSING_KERNEL; + } + + @Override + public EdgeModification<UndirectedEdge> getEdgeModification() { + return changes; + } +} diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/common/PreProcessingKernel.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/common/PreProcessingKernel.java deleted file mode 100644 index 0928e7a..0000000 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/common/PreProcessingKernel.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.uni.bremen.cluster.editing.utilities.solver.common; - -import de.uni.bremen.cluster.editing.custom.graph.library.model.api.EdgeModification; -import de.uni.bremen.cluster.editing.custom.graph.library.model.api.ProblemInstance; -import de.uni.bremen.cluster.editing.custom.graph.library.model.api.UndirectedEdge; -import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Vertex; -import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.BasicUndirectedEdge; -import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.gramm.Status; -import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Algorithm; -import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.AlgorithmStep; -import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.ChangeTracker; -import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Solver; -import de.uni.bremen.cluster.editing.utilities.common.implementation.AlgorithmHelper; - -import java.util.HashSet; - -public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker<UndirectedEdge> { - private EdgeModification<UndirectedEdge> changes = new EdgeModification<>(); - private ProblemInstance problemInstance; - - public PreProcessingKernel(Solver solver) { - super(solver); - } - - public void run(ProblemInstance problemInstance) { - this.start(); - changes.clear(); - this.problemInstance = problemInstance; - for (Vertex i : problemInstance.getVertices()) { - for (Vertex j : problemInstance.getVertices()) { - if (i.getId() >= j.getId()) { - continue; - } - doTwin(i, j); - } - } - - this.finish(); - } - - private void doTwin(Vertex i, Vertex j) { - if (isTwin(i, j)) { - problemInstance.setT(i.getId(), j.getId(), Status.PERMANENT); - AlgorithmHelper - .TransitiveClosure - .doTransitiveClosure(problemInstance, new BasicUndirectedEdge(i, j), changes); - } - } - - private boolean isTwin(Vertex i, Vertex j) { - var neighborsI = problemInstance.getNeighbors(i); - var neighborsJ = problemInstance.getNeighbors(j); - - if (neighborsI.size() != neighborsJ.size()) { - return false; - } - var shadowCopyNeighboursI = new HashSet<>(neighborsI); - shadowCopyNeighboursI.removeAll(neighborsJ); - shadowCopyNeighboursI.remove(j); - return shadowCopyNeighboursI.size() == 0 && problemInstance.edgeExists(i, j); - } - - @Override - public Algorithm getAlgorithm() { - return Algorithm.PREPROCESSING_KERNEL; - } - - @Override - public EdgeModification<UndirectedEdge> getEdgeModification() { - return changes; - } -} diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java index 6f43868..0b3d2c1 100644 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/solver/graphsplitter/GraphSplitterSolver.java @@ -16,7 +16,7 @@ import de.uni.bremen.cluster.editing.utilities.common.api.algorithm.Solver; import de.uni.bremen.cluster.editing.utilities.common.implementation.BasicUndirectedGraphLoader; import de.uni.bremen.cluster.editing.utilities.common.implementation.GraphSplitter; import de.uni.bremen.cluster.editing.utilities.solver.common.FruchtemanLpOrIlpSolver; -import de.uni.bremen.cluster.editing.utilities.solver.common.PreProcessingKernel; +import de.uni.bremen.cluster.editing.utilities.kernel.PreProcessingKernel; import lombok.SneakyThrows; public class GraphSplitterSolver extends Solver { -- GitLab From a185a99de6a487a74935580959295d0cb96d3c01 Mon Sep 17 00:00:00 2001 From: dirks2 <dirks2@uni-bremen.de> Date: Sun, 30 May 2021 15:32:07 +0200 Subject: [PATCH 3/5] fixed a bug --- .../utilities/kernel/PreProcessingKernel.java | 6 +- .../kernel/PreProcessingKernelTest.java | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernelTest.java diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java index 90e241a..e3beec0 100644 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java @@ -29,6 +29,7 @@ public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker< } public void run(ProblemInstance problemInstance) { + System.out.println("stated Kernel"); this.start(); changes.clear(); this.problemInstance = problemInstance; @@ -36,6 +37,7 @@ public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker< doVertexPairs(); doSinglePaths(); + System.out.println("Kernel changes: " + changes); this.finish(); } @@ -99,9 +101,9 @@ public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker< @SuppressWarnings("OptionalGetWithoutIsPresent") // since degree is 1 var v = getAllowedNeighbors(u).stream().findAny().get(); - c.accept(u, v); - + //TODO: hier __war__ ein Fehler boolean cont = degreeWithoutForbiddenEdgesOf(v) == 2; + c.accept(u, v); while (cont) { final var finalU = u; u = v; diff --git a/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernelTest.java b/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernelTest.java new file mode 100644 index 0000000..63bccf1 --- /dev/null +++ b/Utilities/src/test/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernelTest.java @@ -0,0 +1,58 @@ +package de.uni.bremen.cluster.editing.utilities.kernel; + +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.ProblemInstance; +import de.uni.bremen.cluster.editing.custom.graph.library.model.api.Vertex; +import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.BasicUndirectedGraph; +import de.uni.bremen.cluster.editing.custom.graph.library.model.implementation.custom.BasicProblemInstance; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PreProcessingKernelTest { + + @Test + public void testsinglepath(){ + BasicUndirectedGraph graph = new BasicUndirectedGraph(); + graph.addVertex(new Vertex(0)); + graph.addVertex(new Vertex(1)); + graph.addVertex(new Vertex(2)); + graph.addVertex(new Vertex(3)); + graph.addVertex(new Vertex(4)); + + graph.addVertex(new Vertex(5)); + graph.addVertex(new Vertex(6)); + graph.addVertex(new Vertex(7)); + + graph.addEdge(0, 1); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(3, 4); + + graph.addEdge(4, 5); + graph.addEdge(4, 6); + graph.addEdge(6, 7); + graph.addEdge(5, 7); + + new PreProcessingKernel(null).run(new BasicProblemInstance(graph)); + } + + @Test + public void testsingCircleWithLeaf(){ + BasicUndirectedGraph graph = new BasicUndirectedGraph(); + graph.addVertex(new Vertex(0)); + graph.addVertex(new Vertex(1)); + graph.addVertex(new Vertex(2)); + graph.addVertex(new Vertex(3)); + graph.addVertex(new Vertex(4)); + + graph.addEdge(0, 1); + graph.addEdge(1, 2); + graph.addEdge(2, 3); + graph.addEdge(3, 0); + + graph.addEdge(0, 4); + + new PreProcessingKernel(null).run(new BasicProblemInstance(graph)); + } + +} \ No newline at end of file -- GitLab From e430907f2c0c4039bd3c39c28e1cbee5d273dad5 Mon Sep 17 00:00:00 2001 From: dirks2 <dirks2@uni-bremen.de> Date: Sun, 30 May 2021 17:13:40 +0200 Subject: [PATCH 4/5] fixed kernel according to Leon --- LP/pom.xml | 7 +++++++ .../editing/utilities/kernel/PreProcessingKernel.java | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/LP/pom.xml b/LP/pom.xml index 70d9874..323620a 100644 --- a/LP/pom.xml +++ b/LP/pom.xml @@ -24,6 +24,13 @@ <artifactId>ortools-linux-x86-64</artifactId> <version>8.2.9025</version> </dependency> + <!-- mac !--> + <dependency> + <groupId>com.google.ortools</groupId> + <artifactId>ortools-darwin</artifactId> + <version>8.2.9004</version> + </dependency> + <dependency> <groupId>com.google.ortools</groupId> diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java index e3beec0..dd4fb8b 100644 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java @@ -118,7 +118,7 @@ public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker< // cuts off the path starting in the given leaf by marking the final edge leading to a degree > 2 vertex as forbidden private void cutOffPath(final Vertex vertex) { walkUnambiguousPath(vertex, (u, v) -> { - if (degreeWithoutForbiddenEdgesOf(v) > 2) { + if (degreeWithoutForbiddenEdgesOf(v) > 2 && degreeWithoutForbiddenEdgesOf(u) > 1) { changes.addRemovedEdge(new BasicUndirectedEdge(u, v)); problemInstance.removeEdge(u, v); problemInstance.setT(u.getId(), v.getId(), Status.FORBIDDEN); -- GitLab From 20b7628dbe6a3bda546727783104580a1cc47958 Mon Sep 17 00:00:00 2001 From: Yannik <dieschlafmuetze@gmail.com> Date: Sun, 30 May 2021 22:39:19 +0200 Subject: [PATCH 5/5] fixed Pr Comments --- LP/pom.xml | 1 - .../cluster/editing/utilities/kernel/PreProcessingKernel.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/LP/pom.xml b/LP/pom.xml index 323620a..a6dcfdf 100644 --- a/LP/pom.xml +++ b/LP/pom.xml @@ -31,7 +31,6 @@ <version>8.2.9004</version> </dependency> - <dependency> <groupId>com.google.ortools</groupId> <artifactId>ortools-java</artifactId> diff --git a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java index dd4fb8b..1ff5699 100644 --- a/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java +++ b/Utilities/src/main/java/de/uni/bremen/cluster/editing/utilities/kernel/PreProcessingKernel.java @@ -29,7 +29,6 @@ public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker< } public void run(ProblemInstance problemInstance) { - System.out.println("stated Kernel"); this.start(); changes.clear(); this.problemInstance = problemInstance; @@ -37,7 +36,6 @@ public class PreProcessingKernel extends AlgorithmStep implements ChangeTracker< doVertexPairs(); doSinglePaths(); - System.out.println("Kernel changes: " + changes); this.finish(); } -- GitLab