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