From 02733629fb2b7e0d4dd8736a2cd83a116bf7a905 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 15 Oct 2023 15:09:08 +0200 Subject: refactor(interpreter): generify RepresentativeElectionAlgorithm Let representative election be used in places where IncSCCAlg was used with generic arguments other than Object. --- .../RepresentativeElectionAlgorithm.java | 50 +++++++++++----------- .../alg/representative/RepresentativeObserver.java | 4 +- .../StronglyConnectedComponentAlgorithm.java | 10 ++--- .../WeaklyConnectedComponentAlgorithm.java | 16 +++---- .../rete/single/RepresentativeElectionNode.java | 4 +- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeElectionAlgorithm.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeElectionAlgorithm.java index 4d3ad759..ac5e2082 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeElectionAlgorithm.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeElectionAlgorithm.java @@ -14,13 +14,13 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -public abstract class RepresentativeElectionAlgorithm implements IGraphObserver { - protected final Graph graph; - protected final Map representatives = new HashMap<>(); - protected final Map> components = new HashMap<>(); - private RepresentativeObserver observer; +public abstract class RepresentativeElectionAlgorithm implements IGraphObserver { + protected final Graph graph; + protected final Map representatives = new HashMap<>(); + protected final Map> components = new HashMap<>(); + private RepresentativeObserver observer; - protected RepresentativeElectionAlgorithm(Graph graph) { + protected RepresentativeElectionAlgorithm(Graph graph) { this.graph = graph; initializeComponents(); graph.attachObserver(this); @@ -28,7 +28,7 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< protected abstract void initializeComponents(); - protected void initializeSet(Set set) { + protected void initializeSet(Set set) { var iterator = set.iterator(); if (!iterator.hasNext()) { // Set is empty. @@ -45,13 +45,13 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< components.put(representative, set); } - protected void merge(Set toMerge) { + protected void merge(Set toMerge) { if (toMerge.isEmpty()) { return; } - var representativesToMerge = new HashSet<>(); - Object bestRepresentative = null; - Set bestSet = null; + var representativesToMerge = new HashSet(); + T bestRepresentative = null; + Set bestSet = null; for (var object : toMerge) { var representative = getRepresentative(object); if (representativesToMerge.add(representative)) { @@ -79,7 +79,7 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< } } - protected void merge(Object leftRepresentative, Object rightRepresentative) { + protected void merge(T leftRepresentative, T rightRepresentative) { if (leftRepresentative.equals(rightRepresentative)) { return; } @@ -92,8 +92,7 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< } } - private void merge(Object preservedRepresentative, Set preservedSet, Object removedRepresentative, - Set removedSet) { + private void merge(T preservedRepresentative, Set preservedSet, T removedRepresentative, Set removedSet) { components.remove(removedRepresentative); for (var node : removedSet) { representatives.put(node, preservedRepresentative); @@ -102,7 +101,7 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< } } - protected void assignNewRepresentative(Object oldRepresentative, Set set) { + protected void assignNewRepresentative(T oldRepresentative, Set set) { var iterator = set.iterator(); if (!iterator.hasNext()) { return; @@ -119,19 +118,19 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< } } - public void setObserver(RepresentativeObserver observer) { + public void setObserver(RepresentativeObserver observer) { this.observer = observer; } - public Map> getComponents() { + public Map> getComponents() { return components; } - public Object getRepresentative(Object node) { + public T getRepresentative(T node) { return representatives.get(node); } - public Set getComponent(Object representative) { + public Set getComponent(T representative) { return components.get(representative); } @@ -140,15 +139,15 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< } @Override - public void nodeInserted(Object n) { - var component = new HashSet<>(1); + public void nodeInserted(T n) { + var component = new HashSet(1); component.add(n); initializeSet(component); notifyToObservers(n, n, Direction.INSERT); } @Override - public void nodeDeleted(Object n) { + public void nodeDeleted(T n) { var representative = representatives.remove(n); if (!representative.equals(n)) { throw new IllegalStateException("Trying to delete node with dangling edges"); @@ -157,18 +156,19 @@ public abstract class RepresentativeElectionAlgorithm implements IGraphObserver< notifyToObservers(n, representative, Direction.DELETE); } - protected void notifyToObservers(Object node, Object oldRepresentative, Object newRepresentative) { + protected void notifyToObservers(T node, T oldRepresentative, T newRepresentative) { notifyToObservers(node, oldRepresentative, Direction.DELETE); notifyToObservers(node, newRepresentative, Direction.INSERT); } - protected void notifyToObservers(Object node, Object representative, Direction direction) { + protected void notifyToObservers(T node, T representative, Direction direction) { if (observer != null) { observer.tupleChanged(node, representative, direction); } } + @FunctionalInterface public interface Factory { - RepresentativeElectionAlgorithm create(Graph graph); + RepresentativeElectionAlgorithm create(Graph graph); } } diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeObserver.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeObserver.java index 7844f1c7..2a4f7102 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeObserver.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/RepresentativeObserver.java @@ -7,6 +7,6 @@ package tools.refinery.interpreter.rete.itc.alg.representative; import tools.refinery.interpreter.matchers.util.Direction; -public interface RepresentativeObserver { - void tupleChanged(Object node, Object representative, Direction direction); +public interface RepresentativeObserver { + void tupleChanged(T node, T representative, Direction direction); } diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/StronglyConnectedComponentAlgorithm.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/StronglyConnectedComponentAlgorithm.java index 44afd73e..d2e524f7 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/StronglyConnectedComponentAlgorithm.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/StronglyConnectedComponentAlgorithm.java @@ -13,8 +13,8 @@ import tools.refinery.interpreter.rete.itc.alg.misc.scc.SCC; import java.util.Collection; import java.util.Set; -public class StronglyConnectedComponentAlgorithm extends RepresentativeElectionAlgorithm { - public StronglyConnectedComponentAlgorithm(Graph graph) { +public class StronglyConnectedComponentAlgorithm extends RepresentativeElectionAlgorithm { + public StronglyConnectedComponentAlgorithm(Graph graph) { super(graph); } @@ -27,7 +27,7 @@ public class StronglyConnectedComponentAlgorithm extends RepresentativeElectionA } @Override - public void edgeInserted(Object source, Object target) { + public void edgeInserted(T source, T target) { var sourceRoot = getRepresentative(source); var targetRoot = getRepresentative(target); if (sourceRoot.equals(targetRoot)) { @@ -43,7 +43,7 @@ public class StronglyConnectedComponentAlgorithm extends RepresentativeElectionA } @Override - public void edgeDeleted(Object source, Object target) { + public void edgeDeleted(T source, T target) { var sourceRoot = getRepresentative(source); var targetRoot = getRepresentative(target); if (!sourceRoot.equals(targetRoot)) { @@ -57,7 +57,7 @@ public class StronglyConnectedComponentAlgorithm extends RepresentativeElectionA } } - private void split(Object preservedRepresentative, Collection> sets) { + private void split(T preservedRepresentative, Collection> sets) { for (var set : sets) { if (set.contains(preservedRepresentative)) { components.put(preservedRepresentative, set); diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/WeaklyConnectedComponentAlgorithm.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/WeaklyConnectedComponentAlgorithm.java index 58227c44..6b6c19ed 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/WeaklyConnectedComponentAlgorithm.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/itc/alg/representative/WeaklyConnectedComponentAlgorithm.java @@ -11,8 +11,8 @@ import java.util.ArrayDeque; import java.util.HashSet; import java.util.Set; -public class WeaklyConnectedComponentAlgorithm extends RepresentativeElectionAlgorithm { - public WeaklyConnectedComponentAlgorithm(Graph graph) { +public class WeaklyConnectedComponentAlgorithm extends RepresentativeElectionAlgorithm { + public WeaklyConnectedComponentAlgorithm(Graph graph) { super(graph); } @@ -28,14 +28,14 @@ public class WeaklyConnectedComponentAlgorithm extends RepresentativeElectionAlg } @Override - public void edgeInserted(Object source, Object target) { + public void edgeInserted(T source, T target) { var sourceRoot = getRepresentative(source); var targetRoot = getRepresentative(target); merge(sourceRoot, targetRoot); } @Override - public void edgeDeleted(Object source, Object target) { + public void edgeDeleted(T source, T target) { var sourceRoot = getRepresentative(source); var targetRoot = getRepresentative(target); if (!sourceRoot.equals(targetRoot)) { @@ -47,7 +47,7 @@ public class WeaklyConnectedComponentAlgorithm extends RepresentativeElectionAlg } } - private void split(Object sourceRepresentative, Set targetReachable) { + private void split(T sourceRepresentative, Set targetReachable) { var sourceComponent = getComponent(sourceRepresentative); sourceComponent.removeAll(targetReachable); if (targetReachable.contains(sourceRepresentative)) { @@ -58,10 +58,10 @@ public class WeaklyConnectedComponentAlgorithm extends RepresentativeElectionAlg } } - private Set getReachableNodes(Object source) { - var retSet = new HashSet<>(); + private Set getReachableNodes(T source) { + var retSet = new HashSet(); retSet.add(source); - var nodeQueue = new ArrayDeque<>(); + var nodeQueue = new ArrayDeque(); nodeQueue.addLast(source); while (!nodeQueue.isEmpty()) { diff --git a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/single/RepresentativeElectionNode.java b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/single/RepresentativeElectionNode.java index 75aa32ef..eb5ce363 100644 --- a/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/single/RepresentativeElectionNode.java +++ b/subprojects/interpreter-rete/src/main/java/tools/refinery/interpreter/rete/single/RepresentativeElectionNode.java @@ -23,11 +23,11 @@ import tools.refinery.interpreter.matchers.util.timeline.Timeline; import java.util.Collection; import java.util.Map; -public class RepresentativeElectionNode extends SingleInputNode implements Clearable, RepresentativeObserver, +public class RepresentativeElectionNode extends SingleInputNode implements Clearable, RepresentativeObserver, ReinitializedNode { private final RepresentativeElectionAlgorithm.Factory algorithmFactory; private Graph graph; - private RepresentativeElectionAlgorithm algorithm; + private RepresentativeElectionAlgorithm algorithm; public RepresentativeElectionNode(ReteContainer reteContainer, RepresentativeElectionAlgorithm.Factory algorithmFactory) { -- cgit v1.2.3-54-g00ecf