diff --git a/CHANGELOG.md b/CHANGELOG.md index 454440b8f8..0454a71a86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,9 +16,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * You now require at least a JDK 11 to build AutomataLib. * We use modules to better structure the aggregated JavaDoc. Since there exist breaking changes between Java 8 and Java 9 regarding documentation (see package-list vs. element-list), you can no longer link against the AutomataLib documentation on JDK 8 builds. * Split packages had to be refactored. This mainly concerns code from the `automata-core` artifact whose packages have been extended by a `.impl` suffix. This somewhat reverts the refactorings of the previous release (sorry for the back and forth) but since it only affects import statements, it should be fairly easy to address with IDE automation. -* The `net:automatalib.tooling:automata-build-tools` module has been renamed to `net.automatalib:automata-build-config`. -* The `Alphabets#toGrowingAlphabetOrThrowException` method has been moved to `Alphabet#asGrowingAlphabetOrThrowException` so that one does not require an `automata-core` dependency for a simple cast. -* The `Visualization` factory has been moved from the `automata-core` artifact to the `automata-api` artifact. Furthermore, the previous `DummyVP` has been replaced with a `NoopVP` that does not show a swing window anymore when no proper VisualizationProvider is configured but instead logs an error message. This allows us to drop the `java.desktop` (module) dependency for headless setups and only require it in actual visualizers (DOT, JUNG, etc.). +* Some other refactorings include: + * The `AWUtil` class has been moved from `net.automatalib.common.util.array` to `net.automatalib.common.smartcollection` (in the `automata-commons-smartcollections` artifact). + * The `{Resizing,}ArrayStorage` and `ArrayUtil` classes have been moved from `net.automatalib.common.smartcollection` to `net.automatalib.common.util.array` (in the `automata-commons-util` artifact). + * `CollectionsUtil#allTuples` has been moved to `IterableUtil#allTuples`. + * `CollectionsUtil#cartesianProduct` has been moved to `IterableUtil#cartesianProduct`. + * `CollectionsUtil` has been renamed to `CollectionUtil`. + * The `net:automatalib.tooling:automata-build-tools` module has been renamed to `net.automatalib:automata-build-config`. + * The `Alphabets#toGrowingAlphabetOrThrowException` method has been moved to `Alphabet#asGrowingAlphabetOrThrowException` so that one does not require an `automata-core` dependency for a simple cast. + * The `Visualization` factory has been moved from the `automata-core` artifact to the `automata-api` artifact. Furthermore, the previous `DummyVP` has been replaced with a `NoopVP` that does not show a swing window anymore when no proper VisualizationProvider is configured but instead logs an error message. This allows us to drop the `java.desktop` (module) dependency for headless setups and only require it in actual visualizers (DOT, JUNG, etc.). ### Removed diff --git a/api/pom.xml b/api/pom.xml index 723ee3e4ee..3e215951fc 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -48,10 +48,6 @@ limitations under the License. - - com.google.guava - guava - org.slf4j slf4j-api diff --git a/api/src/main/java/module-info.java b/api/src/main/java/module-info.java index 88d5410211..eedb7baa4a 100644 --- a/api/src/main/java/module-info.java +++ b/api/src/main/java/module-info.java @@ -36,7 +36,6 @@ */ open module net.automatalib.api { - requires com.google.common; requires net.automatalib.common.smartcollection; requires net.automatalib.common.util; requires org.checkerframework.checker.qual; diff --git a/api/src/main/java/net/automatalib/automaton/fsa/FiniteStateAcceptor.java b/api/src/main/java/net/automatalib/automaton/fsa/FiniteStateAcceptor.java index acd9ebce21..778ed81c7c 100644 --- a/api/src/main/java/net/automatalib/automaton/fsa/FiniteStateAcceptor.java +++ b/api/src/main/java/net/automatalib/automaton/fsa/FiniteStateAcceptor.java @@ -20,13 +20,13 @@ import java.util.Collections; import java.util.List; -import com.google.common.collect.Iterables; import net.automatalib.automaton.UniversalAutomaton; import net.automatalib.automaton.concept.OutputAutomaton; import net.automatalib.automaton.concept.SuffixOutput; import net.automatalib.automaton.graph.TransitionEdge; import net.automatalib.automaton.graph.UniversalAutomatonGraphView; import net.automatalib.automaton.visualization.FSAVisualizationHelper; +import net.automatalib.common.util.collection.IterableUtil; import net.automatalib.graph.UniversalGraph; import net.automatalib.ts.acceptor.AcceptorTS; import net.automatalib.visualization.VisualizationHelper; @@ -44,7 +44,7 @@ public interface FiniteStateAcceptor extends AcceptorTS, @Override default Boolean computeSuffixOutput(Iterable prefix, Iterable suffix) { - Iterable input = Iterables.concat(prefix, suffix); + Iterable input = IterableUtil.concat(prefix, suffix); return computeOutput(input); } diff --git a/api/src/main/java/net/automatalib/automaton/helper/SimpleStateIDs.java b/api/src/main/java/net/automatalib/automaton/helper/SimpleStateIDs.java index b2ce2a9cab..2c46602b88 100644 --- a/api/src/main/java/net/automatalib/automaton/helper/SimpleStateIDs.java +++ b/api/src/main/java/net/automatalib/automaton/helper/SimpleStateIDs.java @@ -16,12 +16,13 @@ package net.automatalib.automaton.helper; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; -import com.google.common.collect.Maps; import net.automatalib.automaton.concept.StateIDs; import net.automatalib.automaton.simple.SimpleAutomaton; +import net.automatalib.common.util.HashUtil; public class SimpleStateIDs implements StateIDs { @@ -31,7 +32,7 @@ public class SimpleStateIDs implements StateIDs { public SimpleStateIDs(SimpleAutomaton automaton) { this.states = new ArrayList<>(automaton.getStates()); int numStates = this.states.size(); - this.stateIds = Maps.newHashMapWithExpectedSize(numStates); + this.stateIds = new HashMap<>(HashUtil.capacity(numStates)); for (int i = 0; i < numStates; i++) { S state = this.states.get(i); diff --git a/api/src/main/java/net/automatalib/automaton/helper/StateIDGrowingMapping.java b/api/src/main/java/net/automatalib/automaton/helper/StateIDGrowingMapping.java index a082e8f998..61bae4b6db 100644 --- a/api/src/main/java/net/automatalib/automaton/helper/StateIDGrowingMapping.java +++ b/api/src/main/java/net/automatalib/automaton/helper/StateIDGrowingMapping.java @@ -16,7 +16,7 @@ package net.automatalib.automaton.helper; import net.automatalib.automaton.concept.StateIDs; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.common.util.mapping.MutableMapping; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/api/src/main/java/net/automatalib/automaton/visualization/ProceduralVisualizationHelper.java b/api/src/main/java/net/automatalib/automaton/visualization/ProceduralVisualizationHelper.java index 3bfa870fd4..dc85d60702 100644 --- a/api/src/main/java/net/automatalib/automaton/visualization/ProceduralVisualizationHelper.java +++ b/api/src/main/java/net/automatalib/automaton/visualization/ProceduralVisualizationHelper.java @@ -17,14 +17,15 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.automaton.concept.StateIDs; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.common.util.Triple; import net.automatalib.visualization.DefaultVisualizationHelper; @@ -51,7 +52,7 @@ public ProceduralVisualizationHelper(Alphabet internalAlphabet, Map> subModels) { this.internalAlphabet = internalAlphabet; this.subModels = (Map>) subModels; - this.stateIDs = Maps.newHashMapWithExpectedSize(subModels.size()); + this.stateIDs = new HashMap<>(HashUtil.capacity(subModels.size())); for (Entry> e : subModels.entrySet()) { this.stateIDs.put(e.getKey(), (StateIDs) e.getValue().stateIDs()); diff --git a/api/src/main/java/net/automatalib/automaton/vpa/SEVPA.java b/api/src/main/java/net/automatalib/automaton/vpa/SEVPA.java index 3f9f9533cf..5ea790c4f8 100644 --- a/api/src/main/java/net/automatalib/automaton/vpa/SEVPA.java +++ b/api/src/main/java/net/automatalib/automaton/vpa/SEVPA.java @@ -17,12 +17,12 @@ import java.util.List; -import com.google.common.collect.Iterables; import net.automatalib.alphabet.VPAlphabet; import net.automatalib.automaton.concept.FiniteRepresentation; import net.automatalib.automaton.concept.InputAlphabetHolder; import net.automatalib.automaton.concept.SuffixOutput; import net.automatalib.automaton.vpa.SEVPAGraphView.SevpaViewEdge; +import net.automatalib.common.util.collection.IterableUtil; import net.automatalib.graph.Graph; import net.automatalib.graph.concept.GraphViewable; import net.automatalib.ts.acceptor.DeterministicAcceptorTS; @@ -73,7 +73,7 @@ default Boolean computeOutput(Iterable input) { @Override default Boolean computeSuffixOutput(Iterable prefix, Iterable suffix) { - return this.accepts(Iterables.concat(prefix, suffix)); + return this.accepts(IterableUtil.concat(prefix, suffix)); } @Override diff --git a/api/src/main/java/net/automatalib/graph/Graph.java b/api/src/main/java/net/automatalib/graph/Graph.java index 89393ea815..db55c9fa23 100644 --- a/api/src/main/java/net/automatalib/graph/Graph.java +++ b/api/src/main/java/net/automatalib/graph/Graph.java @@ -18,9 +18,8 @@ import java.util.Collection; import java.util.Iterator; -import com.google.common.collect.Collections2; -import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; +import net.automatalib.common.util.collection.CollectionUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.visualization.DefaultVisualizationHelper; import net.automatalib.visualization.VisualizationHelper; @@ -54,7 +53,7 @@ public interface Graph extends IndefiniteGraph, SimpleGraph { * @return a collection containing the outgoing edges */ default Collection getAdjacentNodes(N node) { - return Collections2.transform(getOutgoingEdges(node), this::getTarget); + return CollectionUtil.map(getOutgoingEdges(node), this::getTarget); } @Override @@ -99,7 +98,7 @@ default Iterator getOutgoingEdgesIterator(int node) { * (Finite) int-abstracted version of {@link #getEdgesBetween(Object, Object)}. */ default Collection getEdgesBetween(int from, int to) { - return Lists.newArrayList(Iterators.filter(getOutgoingEdgesIterator(from), e -> getIntTarget(e) == to)); + return IteratorUtil.list(IteratorUtil.filter(getOutgoingEdgesIterator(from), e -> getIntTarget(e) == to)); } /** @@ -107,7 +106,7 @@ default Collection getEdgesBetween(int from, int to) { */ @Override default boolean isConnected(int source, int target) { - return Iterators.any(getOutgoingEdgesIterator(source), e -> getIntTarget(e) == target); + return IteratorUtil.any(getOutgoingEdgesIterator(source), e -> getIntTarget(e) == target); } } } diff --git a/api/src/main/java/net/automatalib/graph/IndefiniteGraph.java b/api/src/main/java/net/automatalib/graph/IndefiniteGraph.java index 3202ff0bc2..8027dae595 100644 --- a/api/src/main/java/net/automatalib/graph/IndefiniteGraph.java +++ b/api/src/main/java/net/automatalib/graph/IndefiniteGraph.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.Objects; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; /** * Interface for an (indefinite) graph structure. A graph consists of nodes, each of which has outgoing edges connecting @@ -62,12 +62,12 @@ public interface IndefiniteGraph extends IndefiniteSimpleGraph { * @return an iterator over the edges between the two nodes */ default Iterator getEdgesBetween(N from, N to) { - return Iterators.filter(getOutgoingEdgesIterator(from), e -> Objects.equals(getTarget(e), to)); + return IteratorUtil.filter(getOutgoingEdgesIterator(from), e -> Objects.equals(getTarget(e), to)); } @Override default Iterator getAdjacentNodesIterator(N node) { - return Iterators.transform(getOutgoingEdgesIterator(node), this::getTarget); + return IteratorUtil.map(getOutgoingEdgesIterator(node), this::getTarget); } } diff --git a/api/src/main/java/net/automatalib/graph/IndefiniteSimpleGraph.java b/api/src/main/java/net/automatalib/graph/IndefiniteSimpleGraph.java index 018b763326..cf6af250ed 100644 --- a/api/src/main/java/net/automatalib/graph/IndefiniteSimpleGraph.java +++ b/api/src/main/java/net/automatalib/graph/IndefiniteSimpleGraph.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.Objects; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.MapMapping; import net.automatalib.common.util.mapping.MutableMapping; import org.checkerframework.checker.nullness.qual.Nullable; @@ -53,7 +53,7 @@ public interface IndefiniteSimpleGraph extends Iterable { * @return {@code true} if the nodes are connect, {@code false} otherwise */ default boolean isConnected(N source, N target) { - return Iterators.any(getAdjacentNodesIterator(source), n -> Objects.equals(n, target)); + return IteratorUtil.any(getAdjacentNodesIterator(source), n -> Objects.equals(n, target)); } /** diff --git a/api/src/main/java/net/automatalib/graph/SimpleGraph.java b/api/src/main/java/net/automatalib/graph/SimpleGraph.java index 48a972896e..dbb522d40e 100644 --- a/api/src/main/java/net/automatalib/graph/SimpleGraph.java +++ b/api/src/main/java/net/automatalib/graph/SimpleGraph.java @@ -18,7 +18,6 @@ import java.util.Collection; import java.util.Iterator; -import com.google.common.collect.Iterators; import net.automatalib.automaton.concept.FiniteRepresentation; import net.automatalib.graph.concept.NodeIDs; import net.automatalib.graph.helper.SimpleNodeIDs; @@ -55,7 +54,7 @@ default NodeIDs nodeIDs() { @Override default Iterator iterator() { - return Iterators.unmodifiableIterator(getNodes().iterator()); + return getNodes().iterator(); } /** diff --git a/api/src/main/java/net/automatalib/graph/helper/SimpleNodeIDs.java b/api/src/main/java/net/automatalib/graph/helper/SimpleNodeIDs.java index 40a5ca8fdc..4c52e03b06 100644 --- a/api/src/main/java/net/automatalib/graph/helper/SimpleNodeIDs.java +++ b/api/src/main/java/net/automatalib/graph/helper/SimpleNodeIDs.java @@ -16,10 +16,11 @@ package net.automatalib.graph.helper; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.graph.SimpleGraph; import net.automatalib.graph.concept.NodeIDs; @@ -31,7 +32,7 @@ public class SimpleNodeIDs implements NodeIDs { public SimpleNodeIDs(SimpleGraph graph) { this.nodes = new ArrayList<>(graph.getNodes()); int numNodes = this.nodes.size(); - this.nodeIds = Maps.newHashMapWithExpectedSize(numNodes); + this.nodeIds = new HashMap<>(HashUtil.capacity(numNodes)); for (int i = 0; i < numNodes; i++) { N node = this.nodes.get(i); diff --git a/api/src/main/java/net/automatalib/graph/visualization/CFMPSVisualizationHelper.java b/api/src/main/java/net/automatalib/graph/visualization/CFMPSVisualizationHelper.java index 6e8174f3e1..de985d3939 100644 --- a/api/src/main/java/net/automatalib/graph/visualization/CFMPSVisualizationHelper.java +++ b/api/src/main/java/net/automatalib/graph/visualization/CFMPSVisualizationHelper.java @@ -17,11 +17,12 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.graph.ProceduralModalProcessGraph; import net.automatalib.visualization.DefaultVisualizationHelper; @@ -36,7 +37,7 @@ public class CFMPSVisualizationHelper extends DefaultVisualizationHelpe @SuppressWarnings("unchecked") public CFMPSVisualizationHelper(Map> pmpgs) { - this.visualizers = Maps.newHashMapWithExpectedSize(pmpgs.size()); + this.visualizers = new HashMap<>(HashUtil.capacity(pmpgs.size())); this.initialNodes = new ArrayList<>(pmpgs.size()); for (Entry> e : pmpgs.entrySet()) { diff --git a/api/src/main/java/net/automatalib/ts/acceptor/DeterministicAcceptorTS.java b/api/src/main/java/net/automatalib/ts/acceptor/DeterministicAcceptorTS.java index 457f8c0c3a..fdcfc0fcf9 100644 --- a/api/src/main/java/net/automatalib/ts/acceptor/DeterministicAcceptorTS.java +++ b/api/src/main/java/net/automatalib/ts/acceptor/DeterministicAcceptorTS.java @@ -18,8 +18,8 @@ import java.util.Collection; import java.util.Iterator; -import com.google.common.collect.Iterables; import net.automatalib.automaton.concept.SuffixOutput; +import net.automatalib.common.util.collection.IterableUtil; import net.automatalib.ts.DeterministicTransitionSystem; import net.automatalib.ts.UniversalDTS; @@ -39,7 +39,7 @@ default Boolean computeOutput(Iterable input) { @Override default Boolean computeSuffixOutput(Iterable prefix, Iterable suffix) { - return computeOutput(Iterables.concat(prefix, suffix)); + return computeOutput(IterableUtil.concat(prefix, suffix)); } @Override diff --git a/api/src/main/java/net/automatalib/word/Word.java b/api/src/main/java/net/automatalib/word/Word.java index bc8fa879e5..8375e3cb03 100644 --- a/api/src/main/java/net/automatalib/word/Word.java +++ b/api/src/main/java/net/automatalib/word/Word.java @@ -35,9 +35,9 @@ import net.automatalib.AutomataLibProperty; import net.automatalib.AutomataLibSettings; import net.automatalib.alphabet.Alphabet; +import net.automatalib.common.smartcollection.AWUtil; import net.automatalib.common.smartcollection.ArrayWritable; import net.automatalib.common.smartcollection.IntSeq; -import net.automatalib.common.util.array.AWUtil; import net.automatalib.common.util.string.AbstractPrintable; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/api/src/main/java/net/automatalib/word/WordBuilder.java b/api/src/main/java/net/automatalib/word/WordBuilder.java index 95291aeb93..ac5b993635 100644 --- a/api/src/main/java/net/automatalib/word/WordBuilder.java +++ b/api/src/main/java/net/automatalib/word/WordBuilder.java @@ -19,8 +19,8 @@ import java.util.Arrays; import java.util.List; -import net.automatalib.common.smartcollection.ArrayUtil; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ArrayUtil; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** diff --git a/build-config/src/main/resources/automatalib-spotbugs-exclusions.xml b/build-config/src/main/resources/automatalib-spotbugs-exclusions.xml index 3921b617fe..caf128448b 100644 --- a/build-config/src/main/resources/automatalib-spotbugs-exclusions.xml +++ b/build-config/src/main/resources/automatalib-spotbugs-exclusions.xml @@ -78,7 +78,7 @@ limitations under the License. - + diff --git a/build-parent/pom.xml b/build-parent/pom.xml index bd0d35a92b..5781664d0b 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -250,10 +250,7 @@ limitations under the License. ^net.automatalib.modelchecker.ltsmin.(Internal.*|Token.*|SimpleCharStream)|\ ^net.automatalib.modelchecker.m3c.formula.parser.(Internal.*|Token.*|SimpleCharStream)|\ - -AskipUses=^com.google.*|\ - ^java.(awt.*|util.Arrays|io.StreamTokenizer)|\ - ^javax.swing.*|\ - + -AskipUses=^java.(awt.*|util.Arrays|io.StreamTokenizer)|^javax.swing.* -AsuppressWarnings=uninitialized -AassumeAssertionsAreEnabled -Astubs=jdk8.astub:collection-object-parameters-may-be-null.astub diff --git a/commons/smartcollections/pom.xml b/commons/smartcollections/pom.xml index 87d8729954..92bb5c5022 100644 --- a/commons/smartcollections/pom.xml +++ b/commons/smartcollections/pom.xml @@ -37,10 +37,10 @@ limitations under the License. - + - com.google.guava - guava + net.automatalib + automata-commons-util diff --git a/commons/smartcollections/src/main/java/module-info.java b/commons/smartcollections/src/main/java/module-info.java index da430ef43a..ce5f04ef25 100644 --- a/commons/smartcollections/src/main/java/module-info.java +++ b/commons/smartcollections/src/main/java/module-info.java @@ -30,7 +30,7 @@ */ open module net.automatalib.common.smartcollection { - requires com.google.common; + requires net.automatalib.common.util; requires org.checkerframework.checker.qual; exports net.automatalib.common.smartcollection; diff --git a/commons/util/src/main/java/net/automatalib/common/util/array/AWUtil.java b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AWUtil.java similarity index 97% rename from commons/util/src/main/java/net/automatalib/common/util/array/AWUtil.java rename to commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AWUtil.java index 9335521b4e..82aeed5938 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/array/AWUtil.java +++ b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AWUtil.java @@ -13,12 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.automatalib.common.util.array; +package net.automatalib.common.smartcollection; import java.util.Arrays; -import net.automatalib.common.smartcollection.ArrayWritable; - /** * Utility class for writing containers to arrays. *

diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AbstractSmartCollection.java b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AbstractSmartCollection.java index a891dc5875..43f571eb34 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AbstractSmartCollection.java +++ b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/AbstractSmartCollection.java @@ -20,7 +20,7 @@ import java.util.Iterator; import java.util.Objects; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; import org.checkerframework.checker.nullness.qual.Nullable; /** @@ -90,7 +90,7 @@ public void deepClear() { @Override public Iterator iterator() { - return Iterators.transform(referenceIterator(), this::get); + return IteratorUtil.map(referenceIterator(), this::get); } @Override diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueue.java b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueue.java index eb42a6abe9..507a579e68 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueue.java +++ b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueue.java @@ -21,7 +21,7 @@ import java.util.Objects; import java.util.function.Supplier; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; import org.checkerframework.checker.nullness.qual.Nullable; /** @@ -116,7 +116,7 @@ public void deepClear() { @SuppressWarnings("nullness") // function is only called on elements of the iterator for which we know non-nullness @Override public Iterator iterator() { - return Iterators.transform(backingQueue.iterator(), e -> e.element); + return IteratorUtil.map(backingQueue.iterator(), e -> e.element); } @Override diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BinaryHeap.java b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BinaryHeap.java index ff1c31c630..376523f115 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BinaryHeap.java +++ b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/BinaryHeap.java @@ -22,6 +22,7 @@ import java.util.PriorityQueue; import java.util.Queue; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.initialization.qual.UnknownInitialization; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/UnorderedCollection.java b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/UnorderedCollection.java index f5b32fb83a..42b3e08f54 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/UnorderedCollection.java +++ b/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/UnorderedCollection.java @@ -19,6 +19,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.initialization.qual.UnknownInitialization; /** diff --git a/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueueTest.java b/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueueTest.java index 58de07143a..1ec4cf8587 100644 --- a/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueueTest.java +++ b/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/BackedGeneralPriorityQueueTest.java @@ -15,12 +15,12 @@ */ package net.automatalib.common.smartcollection; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; -import com.google.common.collect.Lists; -import com.google.common.primitives.Ints; +import net.automatalib.common.util.collection.CollectionUtil; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -31,8 +31,8 @@ public class BackedGeneralPriorityQueueTest { @BeforeClass public void setUp() { - final List values = Lists.charactersOf("abcdefghij"); - final List keys = Ints.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + final List values = CollectionUtil.charRange('a', 'k'); + final List keys = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Collections.reverse(keys); this.queue = new BackedGeneralPriorityQueue<>(values, keys); diff --git a/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/IntSeqTest.java b/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/IntSeqTest.java index 85ccadbf0c..adebc1d86d 100644 --- a/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/IntSeqTest.java +++ b/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/IntSeqTest.java @@ -15,7 +15,10 @@ */ package net.automatalib.common.smartcollection; -import com.google.common.primitives.Ints; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + import org.testng.Assert; import org.testng.annotations.Test; @@ -24,15 +27,18 @@ public class IntSeqTest { private final int[] arr1 = {1, 2, 3, 4, 5, 6}; private final int[] arr2 = {31, 43, 45, 1, 3445, 56}; + private final List asList1 = IntStream.of(arr1).boxed().collect(Collectors.toList()); + private final List asList2 = IntStream.of(arr2).boxed().collect(Collectors.toList()); + @Test public void testArrays() { - Assert.assertEquals(IntSeq.of(arr1), Ints.asList(arr1)); - Assert.assertEquals(IntSeq.of(arr2), Ints.asList(arr2)); + Assert.assertEquals(IntSeq.of(arr1), asList1); + Assert.assertEquals(IntSeq.of(arr2), asList2); } @Test public void testLists() { - Assert.assertEquals(IntSeq.of(Ints.asList(arr1)), Ints.asList(arr1)); - Assert.assertEquals(IntSeq.of(Ints.asList(arr2)), Ints.asList(arr2)); + Assert.assertEquals(IntSeq.of(asList1), asList1); + Assert.assertEquals(IntSeq.of(asList2), asList2); } } diff --git a/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/ReflexiveMapViewTest.java b/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/ReflexiveMapViewTest.java index b77b332f03..5d792bda50 100644 --- a/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/ReflexiveMapViewTest.java +++ b/commons/smartcollections/src/test/java/net/automatalib/common/smartcollection/ReflexiveMapViewTest.java @@ -15,18 +15,18 @@ */ package net.automatalib.common.smartcollection; +import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import com.google.common.collect.Sets; import org.testng.Assert; import org.testng.annotations.Test; public class ReflexiveMapViewTest { - private final Set elements = Sets.newHashSet(1, 2, 3, 4, 5); + private final Set elements = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5)); private final Map map = new ReflexiveMapView<>(elements); @Test diff --git a/commons/util/pom.xml b/commons/util/pom.xml index 0ee206a5c0..053594c4e0 100644 --- a/commons/util/pom.xml +++ b/commons/util/pom.xml @@ -34,17 +34,7 @@ limitations under the License. - - - net.automatalib - automata-commons-smartcollections - - - - com.google.guava - guava - org.slf4j slf4j-api diff --git a/commons/util/src/main/java/module-info.java b/commons/util/src/main/java/module-info.java index e360a7d27d..79d3fb5847 100644 --- a/commons/util/src/main/java/module-info.java +++ b/commons/util/src/main/java/module-info.java @@ -31,9 +31,6 @@ open module net.automatalib.common.util { requires java.management; - - requires com.google.common; - requires net.automatalib.common.smartcollection; requires org.checkerframework.checker.qual; requires org.slf4j; @@ -42,6 +39,7 @@ exports net.automatalib.common.util.collection; exports net.automatalib.common.util.comparison; exports net.automatalib.common.util.concurrent; + exports net.automatalib.common.util.exception; exports net.automatalib.common.util.fixpoint; exports net.automatalib.common.util.function; exports net.automatalib.common.util.io; diff --git a/commons/util/src/main/java/net/automatalib/common/util/HashUtil.java b/commons/util/src/main/java/net/automatalib/common/util/HashUtil.java new file mode 100644 index 0000000000..37dcc7a8fd --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/HashUtil.java @@ -0,0 +1,58 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util; + +/** + * Utility class for hash-based datastructures. + */ +public final class HashUtil { + + private static final double DEFAULT_LOADFACTOR = 0.75f; + + private HashUtil() { + // prevent instantiation + } + + /** + * Computes the capacity of a hash structure for given number of expected elements. This methods calls + * {@link #capacity(int, double)} using {@code 0.75f} as default load factor. + * + * @param expectedSize + * the number of expected elements + * + * @return the required capacity of the data structure. + */ + public static int capacity(int expectedSize) { + return capacity(expectedSize, DEFAULT_LOADFACTOR); + } + + /** + * Computes the capacity of a hash structure for given number of expected elements. This methods essentially + * backports the calculateHashMapCapacity(int) + * call from newer JDKs. + * + * @param expectedSize + * the number of expected elements + * @param loadFactor + * the load factor of the hash structure + * + * @return the required capacity of the data structure. + */ + public static int capacity(int expectedSize, double loadFactor) { + return (int) Math.ceil(expectedSize / loadFactor); + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/IOUtil.java b/commons/util/src/main/java/net/automatalib/common/util/IOUtil.java index 4d7808abd9..36b7877254 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/IOUtil.java +++ b/commons/util/src/main/java/net/automatalib/common/util/IOUtil.java @@ -26,12 +26,12 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; +import java.io.StringWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.zip.GZIPInputStream; -import com.google.common.base.Preconditions; import net.automatalib.common.util.io.NonClosingInputStream; import net.automatalib.common.util.io.NonClosingOutputStream; @@ -40,6 +40,8 @@ */ public final class IOUtil { + public static final int DEFAULT_BUFFER_SIZE = 4096; + private IOUtil() { // prevent instantiation } @@ -64,7 +66,9 @@ private IOUtil() { * if the stream does not support {@link InputStream#markSupported() marking} */ public static InputStream asUncompressedInputStream(InputStream is) throws IOException { - Preconditions.checkArgument(is.markSupported(), "input stream must support marking"); + if (!is.markSupported()) { + throw new IllegalArgumentException("input stream must support marking"); + } is.mark(2); byte[] buf = new byte[2]; @@ -334,4 +338,40 @@ private static boolean isBufferedInputStream(InputStream is) { private static boolean isBufferedOutputStream(OutputStream os) { return os instanceof BufferedOutputStream || os instanceof ByteArrayOutputStream; } + + /** + * Copies the contents of the given reader into the given writer. + * + * @param in + * the reader to read data from + * @param out + * the writer to write data to + * + * @throws IOException + * if reading from or writing to the respective reader / writer throws this exception + */ + public static void copy(Reader in, Writer out) throws IOException { + final char[] buf = new char[DEFAULT_BUFFER_SIZE]; + int read; + while ((read = in.read(buf)) >= 0) { + out.write(buf, 0, read); + } + } + + /** + * Reads the data from the given reader and returns its contents as a string. + * + * @param r + * the reader to read data from + * + * @return the contents of the reader as a string + * + * @throws IOException + * if reading from the reader throws this exception + */ + public static String toString(Reader r) throws IOException { + final StringWriter w = new StringWriter(); + copy(r, w); + return w.toString(); + } } diff --git a/commons/util/src/main/java/net/automatalib/common/util/ReflectUtil.java b/commons/util/src/main/java/net/automatalib/common/util/ReflectUtil.java index 64c0f9192e..5737986f31 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/ReflectUtil.java +++ b/commons/util/src/main/java/net/automatalib/common/util/ReflectUtil.java @@ -17,8 +17,10 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; -import com.google.common.primitives.Primitives; import org.checkerframework.checker.nullness.qual.Nullable; /** @@ -26,6 +28,21 @@ */ public final class ReflectUtil { + private static final Map, Class> CLASS_TO_PRIMITIVE; + + static { + CLASS_TO_PRIMITIVE = new HashMap<>(); + CLASS_TO_PRIMITIVE.put(Boolean.class, boolean.class); + CLASS_TO_PRIMITIVE.put(Byte.class, byte.class); + CLASS_TO_PRIMITIVE.put(Character.class, char.class); + CLASS_TO_PRIMITIVE.put(Double.class, double.class); + CLASS_TO_PRIMITIVE.put(Float.class, float.class); + CLASS_TO_PRIMITIVE.put(Integer.class, int.class); + CLASS_TO_PRIMITIVE.put(Long.class, long.class); + CLASS_TO_PRIMITIVE.put(Short.class, short.class); + CLASS_TO_PRIMITIVE.put(Void.class, void.class); + } + private ReflectUtil() {} /** @@ -177,9 +194,9 @@ private static boolean w2pEquals(Class[] a, Class... b) { } private static boolean w2pEquals(Class a, Class b) { - final Class wrappedA = Primitives.unwrap(a); - final Class wrappedB = Primitives.unwrap(b); - return wrappedA.equals(wrappedB); + final Class primA = CLASS_TO_PRIMITIVE.getOrDefault(a, a); + final Class primB = CLASS_TO_PRIMITIVE.getOrDefault(b, b); + return Objects.equals(primA, primB); } private static boolean isMatch(Class[] paramTypes, @Nullable Object... args) { @@ -195,7 +212,7 @@ private static boolean isMatch(Class[] paramTypes, @Nullable Object... args) return false; } Class argType = arg.getClass(); - if (paramType != Primitives.unwrap(argType)) { + if (paramType != CLASS_TO_PRIMITIVE.get(argType)) { return false; } } else { diff --git a/commons/util/src/main/java/net/automatalib/common/util/array/ArrayIterator.java b/commons/util/src/main/java/net/automatalib/common/util/array/ArrayIterator.java new file mode 100644 index 0000000000..da905c296e --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/array/ArrayIterator.java @@ -0,0 +1,44 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.array; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +class ArrayIterator implements Iterator { + + private final T[] delegate; + private int idx; + + ArrayIterator(T[] delegate) { + this.delegate = delegate; + this.idx = 0; + } + + @Override + public boolean hasNext() { + return idx < delegate.length; + } + + @Override + public T next() { + if (hasNext()) { + return delegate[idx++]; + } + + throw new NoSuchElementException(); + } +} diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ArrayStorage.java b/commons/util/src/main/java/net/automatalib/common/util/array/ArrayStorage.java similarity index 98% rename from commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ArrayStorage.java rename to commons/util/src/main/java/net/automatalib/common/util/array/ArrayStorage.java index 5cda96036e..4c1e2717e6 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ArrayStorage.java +++ b/commons/util/src/main/java/net/automatalib/common/util/array/ArrayStorage.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.automatalib.common.smartcollection; +package net.automatalib.common.util.array; import java.util.AbstractList; import java.util.Arrays; diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ArrayUtil.java b/commons/util/src/main/java/net/automatalib/common/util/array/ArrayUtil.java similarity index 84% rename from commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ArrayUtil.java rename to commons/util/src/main/java/net/automatalib/common/util/array/ArrayUtil.java index 7e71bd3e68..dc66721379 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ArrayUtil.java +++ b/commons/util/src/main/java/net/automatalib/common/util/array/ArrayUtil.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.automatalib.common.smartcollection; +package net.automatalib.common.util.array; + +import java.util.Iterator; /** * Utility methods for arrays. @@ -73,4 +75,18 @@ public static int computeNewCapacity(int length, int requiredCapacity, int nextC return newCapacity; } + + /** + * Returns an immutable iterator that iterates over the contents of the given array. + * + * @param array + * the array over whose contents should be iterated + * @param + * element type + * + * @return an iterator for the contents of the array + */ + public static Iterator iterator(E[] array) { + return new ArrayIterator<>(array); + } } diff --git a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ResizingArrayStorage.java b/commons/util/src/main/java/net/automatalib/common/util/array/ResizingArrayStorage.java similarity index 93% rename from commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ResizingArrayStorage.java rename to commons/util/src/main/java/net/automatalib/common/util/array/ResizingArrayStorage.java index f19803b5d9..9aaf0d6fcc 100644 --- a/commons/smartcollections/src/main/java/net/automatalib/common/smartcollection/ResizingArrayStorage.java +++ b/commons/util/src/main/java/net/automatalib/common/util/array/ResizingArrayStorage.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.automatalib.common.smartcollection; +package net.automatalib.common.util.array; import java.lang.reflect.Array; import java.util.Arrays; @@ -24,7 +24,7 @@ * @param * element class. */ -public final class ResizingArrayStorage implements CapacityManagement { +public final class ResizingArrayStorage { /** * The default initial capacity of the array storage. @@ -69,7 +69,6 @@ public ResizingArrayStorage(ResizingArrayStorage other) { this.nextCapacityHint = other.nextCapacityHint; } - @Override public boolean ensureCapacity(int minCapacity) { if (minCapacity <= array.length) { return false; @@ -82,12 +81,6 @@ public boolean ensureCapacity(int minCapacity) { return true; } - @Override - public boolean ensureAdditionalCapacity(int additionalCapacity) { - return ensureCapacity(array.length + additionalCapacity); - } - - @Override public void hintNextCapacity(int nextCapacityHint) { this.nextCapacityHint = nextCapacityHint; } diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/AbstractSimplifiedIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/AbstractSimplifiedIterator.java new file mode 100644 index 0000000000..07a85579a9 --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/AbstractSimplifiedIterator.java @@ -0,0 +1,77 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * A simplified immutable iterator that only requires to implement the calculation of the next element. + * + * @param + * element type + */ +public abstract class AbstractSimplifiedIterator implements Iterator { + + protected E nextValue; + private State state = State.AWAIT_NEXT; + + private enum State { + AWAIT_NEXT, + HAS_NEXT, + FINISHED + } + + /** + * The method to calculate the next element. This method must set the {@link #nextValue} reference to + * indicate the next object and return {@code true} to signal that the next element is valid. + * + * @return {@code true} if the next element is valid, {@code false} if no more elements can be computed + */ + protected abstract boolean calculateNext(); + + private boolean advance() { + boolean ret = calculateNext(); + if (!ret) { + state = State.FINISHED; + } else { + state = State.HAS_NEXT; + } + return ret; + } + + @Override + public boolean hasNext() { + switch (state) { + case AWAIT_NEXT: + return advance(); + case HAS_NEXT: + return true; + default: // case FINISHED: + return false; + } + } + + @Override + public E next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + state = State.AWAIT_NEXT; + return nextValue; + } + +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/BatchingIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/BatchingIterator.java new file mode 100644 index 0000000000..e264fa4dd4 --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/BatchingIterator.java @@ -0,0 +1,54 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +class BatchingIterator implements Iterator> { + + private final int batchSize; + private final Iterator source; + private final List batch; + + BatchingIterator(Iterator source, int batchSize) { + this.batchSize = batchSize; + this.source = source; + this.batch = new ArrayList<>(batchSize); + } + + @Override + public boolean hasNext() { + return source.hasNext(); + } + + @Override + public List next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + + this.batch.clear(); + + while (batch.size() < batchSize && source.hasNext()) { + batch.add(source.next()); + } + + return batch; + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/CharRange.java b/commons/util/src/main/java/net/automatalib/common/util/collection/CharRange.java index 9d6a4822f1..41ba208d2f 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/collection/CharRange.java +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/CharRange.java @@ -18,10 +18,9 @@ import java.util.AbstractList; import java.util.RandomAccess; -import net.automatalib.common.smartcollection.ArrayWritable; import org.checkerframework.checker.nullness.qual.Nullable; -public class CharRange extends AbstractList implements ArrayWritable, RandomAccess { +public class CharRange extends AbstractList implements RandomAccess { private final IntRange delegate; @@ -87,13 +86,4 @@ public CharRangeIterator listIterator(int index) { public int size() { return delegate.size(); } - - @Override - public void writeToArray(int offset, @Nullable Object[] array, int tgtOfs, int num) { - int si = offset; - int ti = tgtOfs; - for (int i = 0; i < num; i++) { - array[ti++] = charGet(si++); - } - } } diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/CharStringRange.java b/commons/util/src/main/java/net/automatalib/common/util/collection/CharStringRange.java index 97d3bce52f..37e0369deb 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/collection/CharStringRange.java +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/CharStringRange.java @@ -18,10 +18,9 @@ import java.util.AbstractList; import java.util.RandomAccess; -import net.automatalib.common.smartcollection.ArrayWritable; import org.checkerframework.checker.nullness.qual.Nullable; -public class CharStringRange extends AbstractList implements ArrayWritable, RandomAccess { +public class CharStringRange extends AbstractList implements RandomAccess { private final IntRange delegate; @@ -90,13 +89,4 @@ public CharStringRangeIterator listIterator(int index) { public int size() { return delegate.size(); } - - @Override - public void writeToArray(int offset, @Nullable Object[] array, int tgtOfs, int num) { - int si = offset; - int ti = tgtOfs; - for (int i = 0; i < num; i++) { - array[ti++] = get(si++); - } - } } diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/CollectionUtil.java b/commons/util/src/main/java/net/automatalib/common/util/collection/CollectionUtil.java new file mode 100644 index 0000000000..de4179aacf --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/CollectionUtil.java @@ -0,0 +1,115 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.RandomAccess; +import java.util.function.Function; + +/** + * Various methods for operating on {@link Collection}s. + */ +public final class CollectionUtil { + + private CollectionUtil() { + // prevent instantiation. + } + + public static List intRange(int start, int end) { + return new IntRange(start, end); + } + + public static List intRange(int start, int end, int step) { + return new IntRange(start, end, step); + } + + public static List charRange(char start, char end) { + return new CharRange(start, end); + } + + public static List charStringRange(char start, char end) { + return new CharStringRange(start, end); + } + + public static List randomAccessList(Collection coll) { + if (coll instanceof List && coll instanceof RandomAccess) { + return (List) coll; + } + return new ArrayList<>(coll); + } + + /** + * Returns a (mutable) view on the given collection that transforms its elements as specified by the given mapping. + * + * @param collection + * the source collection + * @param mapping + * the transformation function + * @param + * mapping domain type + * @param + * mapping range type + * + * @return the mapped view on the given collection + */ + public static Collection map(Collection collection, Function mapping) { + return new MappingCollection<>(collection, mapping); + } + + /** + * Constructs a list from the given elements. + * + * @param first + * the first (mandatory) element + * @param rest + * the remaining (optional) elements + * @param + * element type + * + * @return a list containing the specified elements + */ + @SafeVarargs + public static List list(T first, T... rest) { + final List result = new ArrayList<>(rest.length + 1); + result.add(first); + Collections.addAll(result, rest); + return result; + } + + /** + * Adds all elements of the given iterator to the given collection. + * + * @param collection + * the collection to add elements to + * @param iterator + * the iterator to provide the elements to add + * @param + * element type + * + * @return {@code true} of the collection has {@link Collection#add(Object) changed}, {@code false} otherwise. + */ + public static boolean add(Collection collection, Iterator iterator) { + boolean changed = false; + while (iterator.hasNext()) { + changed |= collection.add(iterator.next()); + } + return changed; + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/ConcatIterable.java b/commons/util/src/main/java/net/automatalib/common/util/collection/ConcatIterable.java new file mode 100644 index 0000000000..ec914232ba --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/ConcatIterable.java @@ -0,0 +1,40 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.Iterator; + +import net.automatalib.common.util.array.ArrayUtil; + +class ConcatIterable extends AbstractTwoLevelIterator, T, T> { + + @SafeVarargs + ConcatIterable(Iterable... delegates) { + super(ArrayUtil.iterator(delegates)); + } + + @SuppressWarnings("unchecked") + @Override + protected Iterator l2Iterator(Iterable l1Object) { + return (Iterator) l1Object.iterator(); + } + + @Override + protected T combine(Iterable l1Object, T l2Object) { + return l2Object; + } + +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/ConcatIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/ConcatIterator.java new file mode 100644 index 0000000000..28e15ae38a --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/ConcatIterator.java @@ -0,0 +1,40 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.Iterator; + +import net.automatalib.common.util.array.ArrayUtil; + +class ConcatIterator extends AbstractTwoLevelIterator, T, T> { + + @SafeVarargs + ConcatIterator(Iterator... delegates) { + super(ArrayUtil.iterator(delegates)); + } + + @SuppressWarnings("unchecked") + @Override + protected Iterator l2Iterator(Iterator l1Object) { + return (Iterator) l1Object; + } + + @Override + protected T combine(Iterator l1Object, T l2Object) { + return l2Object; + } + +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/FilteringIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/FilteringIterator.java new file mode 100644 index 0000000000..ea4626ab92 --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/FilteringIterator.java @@ -0,0 +1,42 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.Iterator; +import java.util.function.Predicate; + +class FilteringIterator extends AbstractSimplifiedIterator { + + private final Iterator delegate; + private final Predicate predicate; + + FilteringIterator(Iterator delegate, Predicate predicate) { + this.delegate = delegate; + this.predicate = predicate; + } + + @Override + protected boolean calculateNext() { + while (delegate.hasNext()) { + final T n = delegate.next(); + if (predicate.test(n)) { + super.nextValue = n; + return true; + } + } + return false; + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/IntRange.java b/commons/util/src/main/java/net/automatalib/common/util/collection/IntRange.java index c63d6f706e..4474d8035b 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/collection/IntRange.java +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/IntRange.java @@ -18,10 +18,9 @@ import java.util.AbstractList; import java.util.RandomAccess; -import net.automatalib.common.smartcollection.ArrayWritable; import org.checkerframework.checker.nullness.qual.Nullable; -public final class IntRange extends AbstractList implements ArrayWritable, RandomAccess { +public final class IntRange extends AbstractList implements RandomAccess { private final int start; private final int step; @@ -103,15 +102,4 @@ public IntRangeIterator listIterator(int index) { public int size() { return size; } - - @Override - public void writeToArray(int offset, @Nullable Object[] array, int tgtOfs, int num) { - int x = start + offset * step; - int ti = tgtOfs; - for (int i = 0; i < num; i++) { - array[ti++] = x; - x += step; - } - } - } diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/CollectionsUtil.java b/commons/util/src/main/java/net/automatalib/common/util/collection/IterableUtil.java similarity index 63% rename from commons/util/src/main/java/net/automatalib/common/util/collection/CollectionsUtil.java rename to commons/util/src/main/java/net/automatalib/common/util/collection/IterableUtil.java index 442ca5d77f..6764a6100c 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/collection/CollectionsUtil.java +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/IterableUtil.java @@ -15,43 +15,20 @@ */ package net.automatalib.common.util.collection; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.RandomAccess; +import java.util.function.Function; +import java.util.stream.Stream; /** - * Various methods for operating on collections. + * Utility methods for {@link Iterable}s. */ -public final class CollectionsUtil { +public final class IterableUtil { - private CollectionsUtil() { - // prevent instantiation. - } - - public static List intRange(int start, int end) { - return new IntRange(start, end); - } - - public static List intRange(int start, int end, int step) { - return new IntRange(start, end, step); - } - - public static List charRange(char start, char end) { - return new CharRange(start, end); - } - - public static List charStringRange(char start, char end) { - return new CharStringRange(start, end); - } - - public static List randomAccessList(Collection coll) { - if (coll instanceof List && coll instanceof RandomAccess) { - return (List) coll; - } - return new ArrayList<>(coll); + private IterableUtil() { + // prevent instantiation } public static Iterable> allTuples(Iterable domain, int length) { @@ -116,4 +93,68 @@ public static Iterable> cartesianProduct(Iterable... iterables) { return () -> new AllCombinationsIterator<>(iterables); } + /** + * Returns an iterable that iterates over all elements of the given source iterables. + * + * @param iterables + * the source iterables + * @param + * element type + * + * @return the concatenated iterable + */ + @SafeVarargs + public static Iterable concat(Iterable... iterables) { + return () -> new ConcatIterable<>(iterables); + } + + /** + * Returns a view on the given iterable that transforms its elements as specified by the given mapping. + * + * @param iterable + * the source iterable + * @param mapping + * the transformation function + * @param + * mapping domain type + * @param + * mapping range type + * + * @return the mapped view on the given iterable + */ + public static Iterable map(Iterable iterable, Function mapping) { + return () -> new MappingIterator<>(iterable.iterator(), mapping); + } + + /** + * Returns the number of elements of the given iterable. + * + * @param iterable + * the iterable whose elements should be counted + * @param + * element type + * + * @return the number of elements of the iterable + */ + public static int size(Iterable iterable) { + if (iterable instanceof Collection) { + return ((Collection) iterable).size(); + } + + return IteratorUtil.size(iterable.iterator()); + } + + /** + * Transforms the given iterable into a stream. + * + * @param iterable + * the source iterable + * @param + * element type + * + * @return the stream-based view on the iterable + */ + public static Stream stream(Iterable iterable) { + return IteratorUtil.stream(iterable.iterator()); + } } diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/IteratorUtil.java b/commons/util/src/main/java/net/automatalib/common/util/collection/IteratorUtil.java new file mode 100644 index 0000000000..95bd344381 --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/IteratorUtil.java @@ -0,0 +1,273 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Set; +import java.util.Spliterators; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import net.automatalib.common.util.HashUtil; + +/** + * Utility methods for {@link Iterator}s. + */ +public final class IteratorUtil { + + private IteratorUtil() { + // prevent instantiation + } + + /** + * Checks whether any element provided by the given iterator satisfies the given predicate. Note that the iterator + * is consumed in this process. + * + * @param iterator + * the iterator to provide the elements + * @param predicate + * the predicate to test + * @param + * element type + * + * @return {@code true} if at least one element satisfies the predicate, {@code false} otherwise + */ + public static boolean any(Iterator iterator, Predicate predicate) { + while (iterator.hasNext()) { + if (predicate.test(iterator.next())) { + return true; + } + } + + return false; + } + + /** + * Returns an iterator that aggregates elements of a given source iterator in batches of a given size. While + * elements are collected eagerly within a batch, the overall batches are computed lazily. The source iterator is + * consumed in this process. + *

+ * Note that subsequent calls to the returned iterator's {@link Iterator#next()} method return a reference to the + * same batch object, and only update its contents. If you plan to reuse intermediate results, you'll need to + * explicitly copy them. + *

+ * If the batch size is not a divisor of the number of elements that the iterator provides, the last constructed + * batch may not be filled completely. + * + * @param iterator + * the iterator to read the original elements from + * @param batchSize + * the size of batches that should be constructed + * @param + * element type + * + * @return an iterator that provides the original elements in batches of the given size + */ + public static Iterator> batch(Iterator iterator, int batchSize) { + return new BatchingIterator<>(iterator, batchSize); + } + + /** + * Returns an iterator that iterates over all elements of the given source iterators. + * + * @param iterators + * the source iterators + * @param + * element type + * + * @return the concatenated iterator + */ + @SafeVarargs + public static Iterator concat(Iterator... iterators) { + return new ConcatIterator<>(iterators); + } + + /** + * A filtered view on the given iterator that only returns elements that satisfy the given predicate. + * + * @param iterator + * the iterator to provide the elements + * @param predicate + * the size hint for constructing the list + * @param + * element type + * + * @return an iterator that only returns elements that satisfy the given predicate + */ + public static Iterator filter(Iterator iterator, Predicate predicate) { + return new FilteringIterator<>(iterator, predicate); + } + + /** + * Collects the elements of the given iterator into a list. Note that the iterator is consumed in this process. + * + * @param iterator + * the iterator to provide the elements + * @param + * element type + * + * @return a list containing the elements of the iterator + */ + public static List list(Iterator iterator) { + return collection(new ArrayList<>(), iterator); + } + + /** + * Collects the elements of the given iterator into a list that is initialized with the given size hint. Note that + * the iterator is consumed in this process. + * + * @param iterator + * the iterator to provide the elements + * @param expectedSize + * the size hint for constructing the list + * @param + * element type + * + * @return a list containing the elements of the iterator + */ + public static List list(Iterator iterator, int expectedSize) { + return collection(new ArrayList<>(expectedSize), iterator); + } + + /** + * Returns a (mutable) view on the given iterator that transforms its elements as specified by the given mapping. + * + * @param iterator + * the source iterator + * @param mapping + * the transformation function + * @param + * mapping domain type + * @param + * mapping range type + * + * @return the mapped view on the given iterator + */ + public static Iterator map(Iterator iterator, Function mapping) { + return new MappingIterator<>(iterator, mapping); + } + + /** + * Collects the elements of the given iterator into a set. Note that the iterator is consumed in this process. + * + * @param iterator + * the iterator to provide the elements + * @param + * element type + * + * @return a set containing the elements of the iterator + */ + public static Set set(Iterator iterator) { + return collection(new HashSet<>(), iterator); + } + + /** + * Collects the elements of the given iterator into a set that is initialized with the given size hint. Note that + * the iterator is consumed in this process. + * + * @param iterator + * the iterator to provide the elements + * @param expectedSize + * the size hint for constructing the list + * @param + * element type + * + * @return a set containing the elements of the iterator + */ + public static Set set(Iterator iterator, int expectedSize) { + return collection(new HashSet<>(HashUtil.capacity(expectedSize)), iterator); + } + + /** + * Returns an iterator that only iterates over the given element. + * + * @param element + * the element to iterate over + * @param + * element type + * + * @return the iterator + */ + public static Iterator singleton(T element) { + return new Iterator() { + + private boolean hasNext = true; + + @Override + public boolean hasNext() { + return hasNext; + } + + @Override + public T next() { + if (hasNext) { + hasNext = false; + return element; + } + + throw new NoSuchElementException(); + } + }; + } + + /** + * Returns the number of elements returned by the iterator. Note that this consumes the iterator in the process. + * + * @param iterator + * the iterator whose elements should be counted + * @param + * element type + * + * @return the number of elements returned by the iterator + */ + public static int size(Iterator iterator) { + int size = 0; + while (iterator.hasNext()) { + size++; + iterator.next(); + } + + return size; + } + + /** + * Transforms the given iterator into a stream. + * + * @param iterator + * the source iterator + * @param + * element type + * + * @return the stream-based view on the iterator + */ + public static Stream stream(Iterator iterator) { + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false); + } + + private static , T> C collection(C collection, Iterator iterator) { + while (iterator.hasNext()) { + collection.add(iterator.next()); + } + return collection; + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/MappingCollection.java b/commons/util/src/main/java/net/automatalib/common/util/collection/MappingCollection.java new file mode 100644 index 0000000000..9d7a459e4c --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/MappingCollection.java @@ -0,0 +1,42 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.AbstractCollection; +import java.util.Collection; +import java.util.Iterator; +import java.util.function.Function; + +class MappingCollection extends AbstractCollection { + + private final Collection delegate; + private final Function mapping; + + MappingCollection(Collection delegate, Function mapping) { + this.delegate = delegate; + this.mapping = mapping; + } + + @Override + public Iterator iterator() { + return IteratorUtil.map(this.delegate.iterator(), this.mapping); + } + + @Override + public int size() { + return this.delegate.size(); + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/MappingIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/MappingIterator.java new file mode 100644 index 0000000000..138faf2233 --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/MappingIterator.java @@ -0,0 +1,45 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.Iterator; +import java.util.function.Function; + +class MappingIterator implements Iterator { + + private final Iterator delegate; + private final Function mapping; + + MappingIterator(Iterator delegate, Function mapping) { + this.delegate = delegate; + this.mapping = mapping; + } + + @Override + public boolean hasNext() { + return this.delegate.hasNext(); + } + + @Override + public R next() { + return this.mapping.apply(this.delegate.next()); + } + + @Override + public void remove() { + this.delegate.remove(); + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/ReusableIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/ReusableIterator.java index 4332e0d561..57e6cdc6b2 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/collection/ReusableIterator.java +++ b/commons/util/src/main/java/net/automatalib/common/util/collection/ReusableIterator.java @@ -19,8 +19,6 @@ import java.util.Iterator; import java.util.List; -import com.google.common.collect.AbstractIterator; - /** * A utility class that allows to reuse an {@link Iterator}. *

@@ -66,7 +64,7 @@ public Iterator iterator() { return new CopyOnReadIterator(this.iterator); } - private class CopyOnReadIterator extends AbstractIterator { + private class CopyOnReadIterator implements Iterator { private final Iterator source; private int pos; @@ -76,16 +74,17 @@ private class CopyOnReadIterator extends AbstractIterator { } @Override - protected T computeNext() { + public boolean hasNext() { + return pos < frontier || source.hasNext(); + } + + @Override + public T next() { if (pos < frontier) { return cache.get(pos++); } - if (!source.hasNext()) { - return endOfData(); - } - - T next = source.next(); + final T next = source.next(); cache.add(next); pos++; frontier++; diff --git a/commons/util/src/main/java/net/automatalib/common/util/collection/UnmodifiableListIterator.java b/commons/util/src/main/java/net/automatalib/common/util/collection/UnmodifiableListIterator.java deleted file mode 100644 index 428831f259..0000000000 --- a/commons/util/src/main/java/net/automatalib/common/util/collection/UnmodifiableListIterator.java +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2013-2024 TU Dortmund University - * This file is part of AutomataLib, http://www.automatalib.net/. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.automatalib.common.util.collection; - -import java.util.ListIterator; - -import com.google.common.collect.ForwardingListIterator; - -/** - * Wraps a given {@link ListIterator} so that any mutating operations throw an {@link UnsupportedOperationException}. - * - * @param - * type of elements in the given iterator - */ -public class UnmodifiableListIterator extends ForwardingListIterator { - - private final ListIterator delegate; - - public UnmodifiableListIterator(ListIterator delegate) { - this.delegate = delegate; - } - - @Override - @SuppressWarnings("unchecked") - protected ListIterator delegate() { - return (ListIterator) this.delegate; - } - - @Override - public final void remove() { - throw new UnsupportedOperationException(); - } - - @Override - public final void set(T t) { - throw new UnsupportedOperationException(); - } - - @Override - public final void add(T t) { - throw new UnsupportedOperationException(); - } -} diff --git a/commons/util/src/main/java/net/automatalib/common/util/exception/ExceptionUtil.java b/commons/util/src/main/java/net/automatalib/common/util/exception/ExceptionUtil.java new file mode 100644 index 0000000000..31cb5e78a0 --- /dev/null +++ b/commons/util/src/main/java/net/automatalib/common/util/exception/ExceptionUtil.java @@ -0,0 +1,41 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.exception; + +/** + * Utility methods for {@link Exception}s. + */ +public final class ExceptionUtil { + + private ExceptionUtil() { + // prevent instantiation + } + + /** + * Throws the given throwable if it is an unchecked exception. + * + * @param throwable + * the throwable to analyse + */ + public static void throwIfUnchecked(Throwable throwable) { + if (throwable instanceof RuntimeException) { + throw (RuntimeException) throwable; + } + if (throwable instanceof Error) { + throw (Error) throwable; + } + } +} diff --git a/commons/util/src/main/java/net/automatalib/common/util/fixpoint/Worksets.java b/commons/util/src/main/java/net/automatalib/common/util/fixpoint/Worksets.java index a7b3655ed1..dbc7ced2d0 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/fixpoint/Worksets.java +++ b/commons/util/src/main/java/net/automatalib/common/util/fixpoint/Worksets.java @@ -18,11 +18,12 @@ import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; public final class Worksets { @@ -35,7 +36,7 @@ public static R process(WorksetAlgorithm algorithm) { final int expectedElementCount = algorithm.expectedElementCount(); final Deque queue = new ArrayDeque<>(expectedElementCount); - final Set tracking = Sets.newHashSetWithExpectedSize(expectedElementCount); + final Set tracking = new HashSet<>(HashUtil.capacity(expectedElementCount)); final Collection initialElements = algorithm.initialize(); queue.addAll(initialElements); @@ -62,8 +63,8 @@ public static R process(WorksetAlgorithm algorithm) { public static Pair, R> map(WorksetMappingAlgorithm algorithm) { final Deque queue = new ArrayDeque<>(algorithm.expectedElementCount()); - final Set tracking = Sets.newHashSetWithExpectedSize(algorithm.expectedElementCount()); - final Map mapping = Maps.newHashMapWithExpectedSize(algorithm.expectedElementCount()); + final Set tracking = new HashSet<>(HashUtil.capacity(algorithm.expectedElementCount())); + final Map mapping = new HashMap<>(HashUtil.capacity(algorithm.expectedElementCount())); final Collection initialElements = algorithm.initialize(mapping); queue.addAll(initialElements); diff --git a/commons/util/src/main/java/net/automatalib/common/util/mapping/ArrayMapping.java b/commons/util/src/main/java/net/automatalib/common/util/mapping/ArrayMapping.java index 40bd59fc32..52b9432b74 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/mapping/ArrayMapping.java +++ b/commons/util/src/main/java/net/automatalib/common/util/mapping/ArrayMapping.java @@ -15,7 +15,7 @@ */ package net.automatalib.common.util.mapping; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.common.util.nid.IDChangeListener; import net.automatalib.common.util.nid.NumericID; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/commons/util/src/main/java/net/automatalib/common/util/mapping/Mappings.java b/commons/util/src/main/java/net/automatalib/common/util/mapping/Mappings.java index 6858e03cb8..b92517164f 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/mapping/Mappings.java +++ b/commons/util/src/main/java/net/automatalib/common/util/mapping/Mappings.java @@ -17,13 +17,11 @@ import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.Map; -import com.google.common.collect.Collections2; -import com.google.common.collect.Iterables; -import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; +import net.automatalib.common.util.collection.CollectionUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.Nullable; @@ -132,7 +130,7 @@ public static Mapping compose(Mapping first, Map * @return the mapped collection. */ public static Collection apply(Mapping mapping, Collection coll) { - return Collections2.transform(coll, mapping::get); + return CollectionUtil.map(coll, mapping::get); } /** @@ -151,22 +149,7 @@ public static Collection apply(Mapping mapping, Collecti * @return the mapped iterator. */ public static Iterator apply(Mapping mapping, Iterator baseIt) { - return Iterators.transform(baseIt, mapping::get); - } - - /** - * Applies a mapping to a list, resulting in a list containing the result of applying the specified mapping to each - * element in the list. - * - * @param mapping - * the mapping to apply. - * @param list - * the list. - * - * @return the mapped list. - */ - public static List apply(Mapping mapping, List list) { - return Lists.transform(list, mapping::get); + return IteratorUtil.map(baseIt, mapping::get); } /** @@ -185,7 +168,7 @@ public static List apply(Mapping mapping, List Iterable apply(Mapping mapping, Iterable it) { - return Iterables.transform(it, mapping::get); + return IterableUtil.map(it, mapping::get); } public static D idGet(Mapping mapping, D key) { diff --git a/commons/util/src/main/java/net/automatalib/common/util/nid/DynamicList.java b/commons/util/src/main/java/net/automatalib/common/util/nid/DynamicList.java index f99b56e9cf..af16f52e30 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/nid/DynamicList.java +++ b/commons/util/src/main/java/net/automatalib/common/util/nid/DynamicList.java @@ -19,11 +19,10 @@ import java.util.Iterator; import java.util.List; -import net.automatalib.common.smartcollection.ArrayWritable; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; -public class DynamicList extends AbstractList implements ArrayWritable { +public class DynamicList extends AbstractList { private final ResizingArrayStorage storage; private int size; @@ -179,10 +178,4 @@ public void swap(int a, int b) { storage.array[a].setId(a); storage.array[b].setId(b); } - - @Override - public void writeToArray(int offset, @Nullable Object[] array, int tgtOfs, int num) { - System.arraycopy(storage.array, offset, array, tgtOfs, num); - } - } diff --git a/commons/util/src/main/java/net/automatalib/common/util/process/InputStreamConsumer.java b/commons/util/src/main/java/net/automatalib/common/util/process/InputStreamConsumer.java index a86e18b974..e866d2178d 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/process/InputStreamConsumer.java +++ b/commons/util/src/main/java/net/automatalib/common/util/process/InputStreamConsumer.java @@ -20,7 +20,6 @@ import java.io.InputStream; import java.util.function.Consumer; -import com.google.common.io.ByteStreams; import net.automatalib.common.util.IOUtil; /** @@ -37,7 +36,10 @@ class NOPConsumer implements InputStreamConsumer { @Override public void consume(InputStream inputStream) throws IOException { - ByteStreams.exhaust(inputStream); + final byte[] buf = new byte[IOUtil.DEFAULT_BUFFER_SIZE]; + while (inputStream.read(buf) >= 0) { + // do nothing + } } } diff --git a/commons/util/src/main/java/net/automatalib/common/util/process/ProcessUtil.java b/commons/util/src/main/java/net/automatalib/common/util/process/ProcessUtil.java index 21eced23a7..8075e53eed 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/process/ProcessUtil.java +++ b/commons/util/src/main/java/net/automatalib/common/util/process/ProcessUtil.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.function.Consumer; -import com.google.common.io.CharStreams; import net.automatalib.common.util.IOUtil; import net.automatalib.common.util.process.InputStreamConsumer.DelegatingConsumer; import net.automatalib.common.util.process.InputStreamConsumer.NOPConsumer; @@ -286,7 +285,7 @@ private static void writeProcessInput(Process process, @Nullable Reader input) t if (input != null) { try (OutputStream processInput = process.getOutputStream(); Writer writer = IOUtil.asBufferedUTF8Writer(processInput)) { - CharStreams.copy(input, writer); + IOUtil.copy(input, writer); } } } diff --git a/commons/util/src/main/java/net/automatalib/common/util/setting/SettingsSource.java b/commons/util/src/main/java/net/automatalib/common/util/setting/SettingsSource.java index c0eb16f826..7ec3bef4fa 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/setting/SettingsSource.java +++ b/commons/util/src/main/java/net/automatalib/common/util/setting/SettingsSource.java @@ -15,13 +15,12 @@ */ package net.automatalib.common.util.setting; -import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Properties; import java.util.ServiceLoader; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; public interface SettingsSource { @@ -33,8 +32,7 @@ static Properties readSettings(Class clazz) { static void readSettings(Class clazz, Properties p) { ServiceLoader loader = ServiceLoader.load(clazz); - List sources = new ArrayList<>(); - Iterators.addAll(sources, loader.iterator()); + List sources = IteratorUtil.list(loader.iterator()); sources.sort(Comparator.comparingInt(SettingsSource::getPriority)); for (S source : sources) { diff --git a/commons/util/src/main/java/net/automatalib/common/util/string/StringUtil.java b/commons/util/src/main/java/net/automatalib/common/util/string/StringUtil.java index 5d38477b14..dbae711d53 100644 --- a/commons/util/src/main/java/net/automatalib/common/util/string/StringUtil.java +++ b/commons/util/src/main/java/net/automatalib/common/util/string/StringUtil.java @@ -16,9 +16,9 @@ package net.automatalib.common.util.string; import java.io.IOException; +import java.util.Arrays; import java.util.regex.Pattern; -import com.google.common.collect.Iterators; import org.checkerframework.checker.nullness.qual.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -192,11 +192,11 @@ public static void escapeQuotes(String s, Appendable a) throws IOException { } public static void appendArray(Appendable a, Object[] array, String sepString) throws IOException { - appendIterable(a, () -> Iterators.forArray(array), sepString); + appendIterable(a, Arrays.asList(array), sepString); } public static void appendArrayEnquoted(Appendable a, Object[] array, String sepString) throws IOException { - appendIterableEnquoted(a, () -> Iterators.forArray(array), sepString); + appendIterableEnquoted(a, Arrays.asList(array), sepString); } public static void appendIterable(Appendable a, Iterable it, String sepString) throws IOException { diff --git a/commons/util/src/test/java/net/automatalib/common/util/collection/AbstractRangeTest.java b/commons/util/src/test/java/net/automatalib/common/util/collection/AbstractRangeTest.java index 411e9fcad7..f7d168fee4 100644 --- a/commons/util/src/test/java/net/automatalib/common/util/collection/AbstractRangeTest.java +++ b/commons/util/src/test/java/net/automatalib/common/util/collection/AbstractRangeTest.java @@ -22,11 +22,10 @@ import java.util.ListIterator; import java.util.NoSuchElementException; -import net.automatalib.common.smartcollection.ArrayWritable; import org.testng.Assert; import org.testng.annotations.Test; -public abstract class AbstractRangeTest & ArrayWritable> { +public abstract class AbstractRangeTest> { protected final R range; private final List reference; @@ -101,35 +100,4 @@ public void testImmutability() { Assert.assertThrows(UnsupportedOperationException.class, () -> listIterator.add(null)); Assert.assertThrows(UnsupportedOperationException.class, () -> listIterator.set(null)); } - - @Test - public void testArrayWritable() { - final int size = this.range.size(); - final Object[] target = new Object[size]; - - // write all - this.range.writeToArray(0, target, 0, size); - Assert.assertEquals(target, this.reference.toArray()); - - // write first range half into second array half - final int offset = size / 2; - this.range.writeToArray(0, target, offset, size - offset); - - for (int i = 0; i < offset; i++) { - Assert.assertEquals(target[i], this.range.get(i)); - } - for (int i = offset; i < size; i++) { - Assert.assertEquals(target[i], this.range.get(i - offset)); - } - - // write second range half into first array half - this.range.writeToArray(size - offset, target, 0, offset); - - for (int i = 0; i < offset; i++) { - Assert.assertEquals(target[i], this.range.get(size - offset + i)); - } - for (int i = offset; i < size; i++) { - Assert.assertEquals(target[i], this.range.get(i - offset)); - } - } } diff --git a/commons/util/src/test/java/net/automatalib/common/util/collection/AllCombinationsTest.java b/commons/util/src/test/java/net/automatalib/common/util/collection/AllCombinationsTest.java index 15ebf5a5b4..a7fc87fef1 100644 --- a/commons/util/src/test/java/net/automatalib/common/util/collection/AllCombinationsTest.java +++ b/commons/util/src/test/java/net/automatalib/common/util/collection/AllCombinationsTest.java @@ -23,8 +23,6 @@ import java.util.Set; import java.util.stream.Collectors; -import com.google.common.collect.Iterables; -import com.google.common.collect.Streams; import org.testng.Assert; import org.testng.annotations.Test; @@ -38,9 +36,9 @@ public class AllCombinationsTest { public void testNormalDomain() { final Set> combinations = - Streams.stream(CollectionsUtil.cartesianProduct(DOMAIN1, DOMAIN2, DOMAIN3)) - .map(ArrayList::new) - .collect(Collectors.toSet()); + IterableUtil.stream(IterableUtil.cartesianProduct(DOMAIN1, DOMAIN2, DOMAIN3)) + .map(ArrayList::new) + .collect(Collectors.toSet()); Assert.assertTrue(combinations.remove(Arrays.asList(1, 3, 4))); Assert.assertTrue(combinations.remove(Arrays.asList(1, 3, 5))); @@ -53,17 +51,17 @@ public void testNormalDomain() { @Test public void testEmptyDomain() { final Iterable> iter = - CollectionsUtil.cartesianProduct(DOMAIN1, Collections.emptyList(), DOMAIN3); + IterableUtil.cartesianProduct(DOMAIN1, Collections.emptyList(), DOMAIN3); - Assert.assertTrue(Iterables.isEmpty(iter)); + Assert.assertEquals(IterableUtil.size(iter), 0); Assert.assertThrows(NoSuchElementException.class, () -> iter.iterator().next()); } @Test public void testEmptyDimension() { - final Iterable> iter = CollectionsUtil.cartesianProduct(); + final Iterable> iter = IterableUtil.cartesianProduct(); - Assert.assertEquals(Iterables.size(iter), 1); - Assert.assertTrue(Iterables.all(iter, List::isEmpty)); + Assert.assertEquals(IterableUtil.size(iter), 1); + Assert.assertTrue(IterableUtil.stream(iter).allMatch(List::isEmpty)); } } diff --git a/commons/util/src/test/java/net/automatalib/common/util/collection/AllTuplesTest.java b/commons/util/src/test/java/net/automatalib/common/util/collection/AllTuplesTest.java index bcace2c5b6..2c09c03f7f 100644 --- a/commons/util/src/test/java/net/automatalib/common/util/collection/AllTuplesTest.java +++ b/commons/util/src/test/java/net/automatalib/common/util/collection/AllTuplesTest.java @@ -33,13 +33,13 @@ public class AllTuplesTest { @Test public void testEmptyDomain() { - int count = count(CollectionsUtil.allTuples(Collections.emptySet(), 1), null); + int count = count(IterableUtil.allTuples(Collections.emptySet(), 1), null); Assert.assertEquals(count, 0); - count = count(CollectionsUtil.allTuples(Collections.emptySet(), 0), null); + count = count(IterableUtil.allTuples(Collections.emptySet(), 0), null); Assert.assertEquals(count, 1); - count = count(CollectionsUtil.allTuples(Collections.emptySet(), 0, 5), null); + count = count(IterableUtil.allTuples(Collections.emptySet(), 0, 5), null); Assert.assertEquals(count, 1); } @@ -61,23 +61,23 @@ private int count(Iterable> iterable, @Nullable Set di @Test public void testAllTuples() { - int count = count(CollectionsUtil.allTuples(DOMAIN, 0), null); + int count = count(IterableUtil.allTuples(DOMAIN, 0), null); Assert.assertEquals(count, 1); Set set = new HashSet<>(); - count = count(CollectionsUtil.allTuples(DOMAIN, 1), set); + count = count(IterableUtil.allTuples(DOMAIN, 1), set); Assert.assertEquals(count, DOMAIN.size()); Assert.assertEquals(set.size(), count); - count = count(CollectionsUtil.allTuples(DOMAIN, 0, 1), set); + count = count(IterableUtil.allTuples(DOMAIN, 0, 1), set); Assert.assertEquals(count, DOMAIN.size() + 1); Assert.assertEquals(set.size(), count); - count = count(CollectionsUtil.allTuples(DOMAIN, 3), set); + count = count(IterableUtil.allTuples(DOMAIN, 3), set); Assert.assertEquals(count, (int) Math.pow(DOMAIN.size(), 3)); Assert.assertEquals(set.size(), count); - for (List lst : CollectionsUtil.allTuples(DOMAIN, 3)) { + for (List lst : IterableUtil.allTuples(DOMAIN, 3)) { Assert.assertEquals(lst.size(), 3); } } diff --git a/commons/util/src/test/java/net/automatalib/common/util/mapping/MappingsTest.java b/commons/util/src/test/java/net/automatalib/common/util/collection/CollectionUtilTest.java similarity index 54% rename from commons/util/src/test/java/net/automatalib/common/util/mapping/MappingsTest.java rename to commons/util/src/test/java/net/automatalib/common/util/collection/CollectionUtilTest.java index 867478d43d..90dc0b88ab 100644 --- a/commons/util/src/test/java/net/automatalib/common/util/mapping/MappingsTest.java +++ b/commons/util/src/test/java/net/automatalib/common/util/collection/CollectionUtilTest.java @@ -13,26 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package net.automatalib.common.util.mapping; +package net.automatalib.common.util.collection; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import org.testng.Assert; import org.testng.annotations.Test; -import org.testng.collections.Lists; -public class MappingsTest { +public class CollectionUtilTest { @Test - public void testIndexStringMapping() { - List indices = Lists.newArrayList(0L, 1L, 25L, 26L, 17575L); - List strings = Lists.newArrayList("a", "b", "z", "ab", "zzz"); + public void testAdd() { + final Set set = new HashSet<>(); + final Set elements = Set.of(2, 3, 4); - List actualStrings = Mappings.apply(Mappings.indexToString(), indices); - Assert.assertEquals(actualStrings, strings); - - // and backwards - List actualIndices = Mappings.apply(Mappings.stringToIndex(), actualStrings); - Assert.assertEquals(actualIndices, indices); + Assert.assertTrue(CollectionUtil.add(set, elements.iterator())); + Assert.assertEquals(set, elements); + Assert.assertFalse(CollectionUtil.add(set, elements.iterator())); + Assert.assertEquals(set, elements); } } diff --git a/commons/util/src/test/java/net/automatalib/common/util/collection/IteratorUtilTest.java b/commons/util/src/test/java/net/automatalib/common/util/collection/IteratorUtilTest.java new file mode 100644 index 0000000000..2cf265f964 --- /dev/null +++ b/commons/util/src/test/java/net/automatalib/common/util/collection/IteratorUtilTest.java @@ -0,0 +1,65 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.collection; + +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Stream; + +import org.testng.Assert; +import org.testng.annotations.Test; + +public class IteratorUtilTest { + + @Test + public void testBatch() { + final Iterator iterator = Stream.iterate(0, (i) -> i+1).limit(50).iterator(); + final Iterator> batchIterator = IteratorUtil.batch(iterator, 20); + + Assert.assertTrue(batchIterator.hasNext()); + Assert.assertEquals(batchIterator.next(), CollectionUtil.intRange(0, 20)); + Assert.assertTrue(batchIterator.hasNext()); + Assert.assertEquals(batchIterator.next(), CollectionUtil.intRange(20, 40)); + Assert.assertTrue(batchIterator.hasNext()); + Assert.assertEquals(batchIterator.next(), CollectionUtil.intRange(40, 50)); + Assert.assertFalse(batchIterator.hasNext()); + Assert.assertThrows(NoSuchElementException.class, batchIterator::next); + + final Iterator iterator2 = Stream.iterate(0, (i) -> i+1).limit(60).iterator(); + final Iterator> batchIterator2 = IteratorUtil.batch(iterator2, 20); + + Assert.assertTrue(batchIterator2.hasNext()); + Assert.assertEquals(batchIterator2.next(), CollectionUtil.intRange(0, 20)); + Assert.assertTrue(batchIterator2.hasNext()); + Assert.assertEquals(batchIterator2.next(), CollectionUtil.intRange(20, 40)); + Assert.assertTrue(batchIterator2.hasNext()); + Assert.assertEquals(batchIterator2.next(), CollectionUtil.intRange(40, 60)); + Assert.assertFalse(batchIterator2.hasNext()); + Assert.assertThrows(NoSuchElementException.class, batchIterator2::next); + } + + @Test + public void testSingleton() { + final Iterator iterator = IteratorUtil.singleton(42); + + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next(), 42); + Assert.assertThrows(UnsupportedOperationException.class, iterator::remove); + Assert.assertFalse(iterator.hasNext()); + Assert.assertThrows(NoSuchElementException.class, iterator::next); + } +} diff --git a/commons/util/src/test/java/net/automatalib/common/util/exception/ExceptionUtilTest.java b/commons/util/src/test/java/net/automatalib/common/util/exception/ExceptionUtilTest.java new file mode 100644 index 0000000000..38bf611c29 --- /dev/null +++ b/commons/util/src/test/java/net/automatalib/common/util/exception/ExceptionUtilTest.java @@ -0,0 +1,35 @@ +/* Copyright (C) 2013-2024 TU Dortmund University + * This file is part of AutomataLib, http://www.automatalib.net/. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.automatalib.common.util.exception; + +import java.io.IOException; + +import org.testng.Assert; +import org.testng.annotations.Test; + +public class ExceptionUtilTest { + + @Test + public void testThrows() { + Assert.assertThrows(RuntimeException.class, () -> ExceptionUtil.throwIfUnchecked(new RuntimeException())); + Assert.assertThrows(IllegalArgumentException.class, + () -> ExceptionUtil.throwIfUnchecked(new IllegalArgumentException())); + Assert.assertThrows(Error.class, () -> ExceptionUtil.throwIfUnchecked(new Error())); + + // assert not throwing + ExceptionUtil.throwIfUnchecked(new IOException()); + } +} diff --git a/commons/util/src/test/java/net/automatalib/common/util/random/RandomUtilTest.java b/commons/util/src/test/java/net/automatalib/common/util/random/RandomUtilTest.java index 47ebda7f48..756956a6a6 100644 --- a/commons/util/src/test/java/net/automatalib/common/util/random/RandomUtilTest.java +++ b/commons/util/src/test/java/net/automatalib/common/util/random/RandomUtilTest.java @@ -22,7 +22,7 @@ import java.util.Random; import java.util.stream.IntStream; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -38,7 +38,7 @@ public class RandomUtilTest { @BeforeClass public void setUp() { this.random = new Random(42); - this.list = CollectionsUtil.intRange(0, HIGH, 1); + this.list = CollectionUtil.intRange(0, HIGH, 1); this.array = IntStream.range(0, HIGH).boxed().toArray(Integer[]::new); } diff --git a/core/pom.xml b/core/pom.xml index 3ba7846111..685061a699 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -42,21 +42,11 @@ limitations under the License. net.automatalib automata-api - - net.automatalib - automata-commons-smartcollections - net.automatalib automata-commons-util - - - com.google.guava - guava - - org.checkerframework diff --git a/core/src/main/java/module-info.java b/core/src/main/java/module-info.java index 72babb40ac..cc8a41e6ca 100644 --- a/core/src/main/java/module-info.java +++ b/core/src/main/java/module-info.java @@ -30,7 +30,6 @@ */ open module net.automatalib.core { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.smartcollection; requires net.automatalib.common.util; diff --git a/core/src/main/java/net/automatalib/alphabet/impl/Alphabets.java b/core/src/main/java/net/automatalib/alphabet/impl/Alphabets.java index 594abd568f..985610735a 100644 --- a/core/src/main/java/net/automatalib/alphabet/impl/Alphabets.java +++ b/core/src/main/java/net/automatalib/alphabet/impl/Alphabets.java @@ -22,7 +22,7 @@ import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.GrowingAlphabet; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; /** * Utility methods concerning alphabets. @@ -47,7 +47,7 @@ public static > Alphabet fromEnum(Class enumClazz, boole } public static Alphabet integers(int startInclusive, int endInclusive) { - List lst = CollectionsUtil.intRange(startInclusive, endInclusive + 1); + List lst = CollectionUtil.intRange(startInclusive, endInclusive + 1); return fromList(lst); } @@ -56,12 +56,12 @@ public static Alphabet fromList(List list) { } public static Alphabet characters(char startInclusive, char endInclusive) { - List lst = CollectionsUtil.charRange(startInclusive, (char) (endInclusive + 1)); + List lst = CollectionUtil.charRange(startInclusive, (char) (endInclusive + 1)); return fromList(lst); } public static Alphabet closedCharStringRange(char startInclusive, char endInclusive) { - List lst = CollectionsUtil.charStringRange(startInclusive, (char) (endInclusive + 1)); + List lst = CollectionUtil.charStringRange(startInclusive, (char) (endInclusive + 1)); return fromList(lst); } diff --git a/core/src/main/java/net/automatalib/alphabet/impl/ListAlphabet.java b/core/src/main/java/net/automatalib/alphabet/impl/ListAlphabet.java index 111ea8b225..ad0a0ca677 100644 --- a/core/src/main/java/net/automatalib/alphabet/impl/ListAlphabet.java +++ b/core/src/main/java/net/automatalib/alphabet/impl/ListAlphabet.java @@ -15,19 +15,17 @@ */ package net.automatalib.alphabet.impl; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; -import com.google.common.collect.Iterators; -import net.automatalib.common.util.collection.UnmodifiableListIterator; - public class ListAlphabet extends AbstractAlphabet { - private final List list; + private final List list; public ListAlphabet(List list) { - this.list = list; + this.list = Collections.unmodifiableList(list); } @Override @@ -60,11 +58,11 @@ public int size() { @Override public Iterator iterator() { - return Iterators.unmodifiableIterator(list.iterator()); + return list.iterator(); } @Override public ListIterator listIterator(int index) { - return new UnmodifiableListIterator<>(list.listIterator(index)); + return list.listIterator(); } } diff --git a/core/src/main/java/net/automatalib/alphabet/impl/MapAlphabet.java b/core/src/main/java/net/automatalib/alphabet/impl/MapAlphabet.java index 37520a2f10..20d36e016e 100644 --- a/core/src/main/java/net/automatalib/alphabet/impl/MapAlphabet.java +++ b/core/src/main/java/net/automatalib/alphabet/impl/MapAlphabet.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Map; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; /** * A map-based alphabet implementation, that does not impose any restriction on the input symbol class. This @@ -40,7 +40,8 @@ public class MapAlphabet extends AbstractAlphabet { public MapAlphabet(Collection symbols) { this.symbols = new ArrayList<>(symbols); - this.indexMap = Maps.newHashMapWithExpectedSize(symbols.size()); // TODO: replace by primitive specialization + // TODO: replace by primitive specialization + this.indexMap = new HashMap<>(HashUtil.capacity(symbols.size())); int i = 0; for (I sym : this.symbols) { indexMap.put(sym, i++); diff --git a/core/src/main/java/net/automatalib/automaton/base/AbstractCompact.java b/core/src/main/java/net/automatalib/automaton/base/AbstractCompact.java index 518711984b..1e4d07168c 100644 --- a/core/src/main/java/net/automatalib/automaton/base/AbstractCompact.java +++ b/core/src/main/java/net/automatalib/automaton/base/AbstractCompact.java @@ -28,7 +28,7 @@ import net.automatalib.automaton.UniversalFiniteAlphabetAutomaton; import net.automatalib.automaton.concept.StateIDs; import net.automatalib.automaton.concept.StateLocalInput; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import org.checkerframework.checker.initialization.qual.UnknownInitialization; import org.checkerframework.checker.nullness.qual.Nullable; @@ -79,7 +79,7 @@ public AbstractCompact(Alphabet alphabet, int stateCapacity, float resizeFact @Override public Collection getStates() { - return CollectionsUtil.intRange(0, numStates); + return CollectionUtil.intRange(0, numStates); } @Override diff --git a/core/src/main/java/net/automatalib/automaton/base/AbstractFastState.java b/core/src/main/java/net/automatalib/automaton/base/AbstractFastState.java index 483628dd92..99dadeedd9 100644 --- a/core/src/main/java/net/automatalib/automaton/base/AbstractFastState.java +++ b/core/src/main/java/net/automatalib/automaton/base/AbstractFastState.java @@ -15,7 +15,7 @@ */ package net.automatalib.automaton.base; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.common.util.nid.AbstractMutableNumericID; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/core/src/main/java/net/automatalib/automaton/procedural/impl/EmptySPMM.java b/core/src/main/java/net/automatalib/automaton/procedural/impl/EmptySPMM.java index b2f73ce8d7..775bd37ffb 100644 --- a/core/src/main/java/net/automatalib/automaton/procedural/impl/EmptySPMM.java +++ b/core/src/main/java/net/automatalib/automaton/procedural/impl/EmptySPMM.java @@ -18,10 +18,10 @@ import java.util.Collections; import java.util.Map; -import com.google.common.collect.Iterables; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.procedural.SPMM; import net.automatalib.automaton.transducer.MealyMachine; +import net.automatalib.common.util.collection.IterableUtil; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; @@ -66,7 +66,7 @@ public O getErrorOutput() { @Override public Word computeSuffixOutput(Iterable prefix, Iterable suffix) { - final int length = Iterables.size(suffix); + final int length = IterableUtil.size(suffix); return Word.fromList(Collections.nCopies(length, errorOutput)); } diff --git a/core/src/main/java/net/automatalib/automaton/vpa/impl/DefaultNSEVPA.java b/core/src/main/java/net/automatalib/automaton/vpa/impl/DefaultNSEVPA.java index 735a596c5c..fc8230a5ef 100644 --- a/core/src/main/java/net/automatalib/automaton/vpa/impl/DefaultNSEVPA.java +++ b/core/src/main/java/net/automatalib/automaton/vpa/impl/DefaultNSEVPA.java @@ -18,7 +18,7 @@ import java.util.Objects; import net.automatalib.alphabet.VPAlphabet; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; /** * Default implementation for n-SEVPAs. diff --git a/core/src/main/java/net/automatalib/automaton/vpa/impl/Location.java b/core/src/main/java/net/automatalib/automaton/vpa/impl/Location.java index ba46f9ca5b..a221f7752b 100644 --- a/core/src/main/java/net/automatalib/automaton/vpa/impl/Location.java +++ b/core/src/main/java/net/automatalib/automaton/vpa/impl/Location.java @@ -20,7 +20,7 @@ import java.util.List; import net.automatalib.alphabet.VPAlphabet; -import net.automatalib.common.smartcollection.ArrayStorage; +import net.automatalib.common.util.array.ArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** diff --git a/core/src/main/java/net/automatalib/graph/base/AbstractCompactBidiGraph.java b/core/src/main/java/net/automatalib/graph/base/AbstractCompactBidiGraph.java index a91ec5247e..beed24b615 100644 --- a/core/src/main/java/net/automatalib/graph/base/AbstractCompactBidiGraph.java +++ b/core/src/main/java/net/automatalib/graph/base/AbstractCompactBidiGraph.java @@ -20,7 +20,7 @@ import java.util.Collections; import java.util.List; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.graph.BidirectionalGraph; import net.automatalib.graph.MutableUniversalBidirectionalGraph; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/core/src/main/java/net/automatalib/graph/base/AbstractCompactGraph.java b/core/src/main/java/net/automatalib/graph/base/AbstractCompactGraph.java index 03e659f0f5..38c5165a66 100644 --- a/core/src/main/java/net/automatalib/graph/base/AbstractCompactGraph.java +++ b/core/src/main/java/net/automatalib/graph/base/AbstractCompactGraph.java @@ -20,8 +20,8 @@ import java.util.Collections; import java.util.List; -import net.automatalib.common.smartcollection.ResizingArrayStorage; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.array.ResizingArrayStorage; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.graph.MutableGraph; import net.automatalib.graph.MutableGraph.IntAbstraction; import net.automatalib.graph.concept.NodeIDs; @@ -48,7 +48,7 @@ public int size() { @Override public Collection getNodes() { - return CollectionsUtil.intRange(0, size); + return CollectionUtil.intRange(0, size); } @Override diff --git a/core/src/main/java/net/automatalib/graph/impl/CompactBidiGraph.java b/core/src/main/java/net/automatalib/graph/impl/CompactBidiGraph.java index d6b273298f..19a90bab22 100644 --- a/core/src/main/java/net/automatalib/graph/impl/CompactBidiGraph.java +++ b/core/src/main/java/net/automatalib/graph/impl/CompactBidiGraph.java @@ -15,7 +15,7 @@ */ package net.automatalib.graph.impl; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.graph.base.AbstractCompactBidiGraph; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/core/src/main/java/net/automatalib/graph/impl/CompactGraph.java b/core/src/main/java/net/automatalib/graph/impl/CompactGraph.java index eafde4c94b..1ed8a1c4b8 100644 --- a/core/src/main/java/net/automatalib/graph/impl/CompactGraph.java +++ b/core/src/main/java/net/automatalib/graph/impl/CompactGraph.java @@ -15,7 +15,7 @@ */ package net.automatalib.graph.impl; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.graph.base.AbstractCompactGraph; import net.automatalib.graph.base.CompactEdge; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/core/src/main/java/net/automatalib/graph/impl/CompactPMPG.java b/core/src/main/java/net/automatalib/graph/impl/CompactPMPG.java index 9c6a6d05cd..04e4f2defe 100644 --- a/core/src/main/java/net/automatalib/graph/impl/CompactPMPG.java +++ b/core/src/main/java/net/automatalib/graph/impl/CompactPMPG.java @@ -18,7 +18,7 @@ import java.util.Collections; import java.util.Set; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.graph.MutableProceduralModalProcessGraph; import net.automatalib.graph.base.AbstractCompactGraph; import net.automatalib.ts.modal.transition.ModalEdgeProperty.ModalType; diff --git a/core/src/main/java/net/automatalib/graph/impl/DefaultCFMPS.java b/core/src/main/java/net/automatalib/graph/impl/DefaultCFMPS.java index d80b2cb256..4b4b4206ce 100644 --- a/core/src/main/java/net/automatalib/graph/impl/DefaultCFMPS.java +++ b/core/src/main/java/net/automatalib/graph/impl/DefaultCFMPS.java @@ -18,7 +18,6 @@ import java.util.Collections; import java.util.Map; -import com.google.common.base.Preconditions; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.graph.ProceduralModalProcessGraph; import org.checkerframework.checker.nullness.qual.Nullable; @@ -29,8 +28,9 @@ public class DefaultCFMPS implements ContextFreeModalProcessSystem private final L mainProcess; public DefaultCFMPS(L mainProcess, Map> pmpgs) { - Preconditions.checkArgument(pmpgs.containsKey(mainProcess), - "There exists no process graph for the main process"); + if (!pmpgs.containsKey(mainProcess)) { + throw new IllegalArgumentException("There exists no process graph for the main process"); + } this.pmpgs = Collections.unmodifiableMap(pmpgs); this.mainProcess = mainProcess; diff --git a/core/src/main/java/net/automatalib/graph/impl/SimpleMapGraph.java b/core/src/main/java/net/automatalib/graph/impl/SimpleMapGraph.java index 42a2ddad42..195a0c1226 100644 --- a/core/src/main/java/net/automatalib/graph/impl/SimpleMapGraph.java +++ b/core/src/main/java/net/automatalib/graph/impl/SimpleMapGraph.java @@ -25,7 +25,6 @@ import java.util.Set; import java.util.function.Supplier; -import com.google.common.collect.Iterators; import net.automatalib.graph.MutableGraph; import net.automatalib.graph.ShrinkableGraph; import org.checkerframework.checker.nullness.qual.Nullable; @@ -116,7 +115,7 @@ public Set getNodes() { @Override public Iterator iterator() { - return Iterators.unmodifiableIterator(structureMap.keySet().iterator()); + return getNodes().iterator(); } @Override diff --git a/core/src/main/java/net/automatalib/modelchecking/impl/AbstractLasso.java b/core/src/main/java/net/automatalib/modelchecking/impl/AbstractLasso.java index 44209e1dca..d6a9ee04b0 100644 --- a/core/src/main/java/net/automatalib/modelchecking/impl/AbstractLasso.java +++ b/core/src/main/java/net/automatalib/modelchecking/impl/AbstractLasso.java @@ -25,7 +25,7 @@ import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.concept.DetOutputAutomaton; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.modelchecking.Lasso; import net.automatalib.ts.simple.SimpleDTS; import net.automatalib.word.Word; @@ -214,7 +214,7 @@ public Integer getInitialState() { @Override public Collection getStates() { - return CollectionsUtil.intRange(0, word.length()); + return CollectionUtil.intRange(0, word.length()); } /** diff --git a/core/src/test/java/net/automatalib/alphabet/impl/procedural/AbstractProceduralInputAlphabetTest.java b/core/src/test/java/net/automatalib/alphabet/impl/procedural/AbstractProceduralInputAlphabetTest.java index 385af36fb3..01055113bb 100644 --- a/core/src/test/java/net/automatalib/alphabet/impl/procedural/AbstractProceduralInputAlphabetTest.java +++ b/core/src/test/java/net/automatalib/alphabet/impl/procedural/AbstractProceduralInputAlphabetTest.java @@ -18,8 +18,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -110,7 +110,7 @@ public void testFindReturnIndex() { public void testExpand() { final M alphabet = getAlphabet(); final Mapping> ts = - ImmutableMap.of('S', Word.fromLetter('x'), 'T', Word.fromLetter('y'))::get; + Map.of('S', Word.fromLetter('x'), 'T', Word.fromLetter('y'))::get; Assert.assertEquals(alphabet.expand(Word.epsilon(), ts), Word.epsilon()); Assert.assertEquals(alphabet.expand(Word.fromString("aSa"), ts), Word.fromString("aSxRa")); diff --git a/core/src/test/java/net/automatalib/alphabet/impl/util/DefaultVPAlphabetTestUtil.java b/core/src/test/java/net/automatalib/alphabet/impl/util/DefaultVPAlphabetTestUtil.java index 6d84194b0e..cf1138d644 100644 --- a/core/src/test/java/net/automatalib/alphabet/impl/util/DefaultVPAlphabetTestUtil.java +++ b/core/src/test/java/net/automatalib/alphabet/impl/util/DefaultVPAlphabetTestUtil.java @@ -20,16 +20,16 @@ import java.util.List; import net.automatalib.alphabet.impl.DefaultVPAlphabet; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; /** * Utility class, aggregating definitions used for testing {@link DefaultVPAlphabet}s. */ public final class DefaultVPAlphabetTestUtil { - public static final List INTERNAL_SYMBOLS = CollectionsUtil.charRange('1', '3'); - public static final List CALL_SYMBOLS = CollectionsUtil.charRange('a', 'c'); - public static final List RETURN_SYMBOLS = CollectionsUtil.charRange('r', 't'); + public static final List INTERNAL_SYMBOLS = CollectionUtil.charRange('1', '3'); + public static final List CALL_SYMBOLS = CollectionUtil.charRange('a', 'c'); + public static final List RETURN_SYMBOLS = CollectionUtil.charRange('r', 't'); public static final List NON_CONTAINED_SYMBOLS = Arrays.asList('x', '8', ' '); public static final List JOINED_SYMBOLS; diff --git a/core/src/test/java/net/automatalib/automaton/impl/StateLocalInputTest.java b/core/src/test/java/net/automatalib/automaton/impl/StateLocalInputTest.java index b2aca5ccc9..8af3227f6d 100644 --- a/core/src/test/java/net/automatalib/automaton/impl/StateLocalInputTest.java +++ b/core/src/test/java/net/automatalib/automaton/impl/StateLocalInputTest.java @@ -16,8 +16,8 @@ package net.automatalib.automaton.impl; import java.util.HashSet; +import java.util.Set; -import com.google.common.collect.Sets; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.MutableAutomaton; @@ -109,10 +109,10 @@ private & StateLocalInput(automaton.getLocalInputs(s1)), Sets.newHashSet(1, 4)); - Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s2)), Sets.newHashSet(1, 2)); - Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s3)), Sets.newHashSet(2, 3)); - Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s4)), Sets.newHashSet(3, 4)); + Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s1)), Set.of(1, 4)); + Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s2)), Set.of(1, 2)); + Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s3)), Set.of(2, 3)); + Assert.assertEquals(new HashSet<>(automaton.getLocalInputs(s4)), Set.of(3, 4)); } diff --git a/core/src/test/java/net/automatalib/automaton/procedural/impl/SBATest.java b/core/src/test/java/net/automatalib/automaton/procedural/impl/SBATest.java index 03fd296e3d..fde54cc8a4 100644 --- a/core/src/test/java/net/automatalib/automaton/procedural/impl/SBATest.java +++ b/core/src/test/java/net/automatalib/automaton/procedural/impl/SBATest.java @@ -17,7 +17,6 @@ import java.util.Map; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -44,7 +43,7 @@ public class SBATest { new DefaultProceduralInputAlphabet<>(Alphabets.characters('a', 'c'), smallCallAlphabet, 'R'); ALPHABET = new DefaultProceduralInputAlphabet<>(Alphabets.characters('a', 'c'), bigCallAlphabet, 'R'); - SUB_MODELS = ImmutableMap.of('S', buildSProcedure(smallAlphabet), 'T', buildTProcedure(smallAlphabet)); + SUB_MODELS = Map.of('S', buildSProcedure(smallAlphabet), 'T', buildTProcedure(smallAlphabet)); } private static DFA buildSProcedure(ProceduralInputAlphabet alphabet) { diff --git a/core/src/test/java/net/automatalib/automaton/procedural/impl/SPATest.java b/core/src/test/java/net/automatalib/automaton/procedural/impl/SPATest.java index 7d1e918a8d..5f439c68e6 100644 --- a/core/src/test/java/net/automatalib/automaton/procedural/impl/SPATest.java +++ b/core/src/test/java/net/automatalib/automaton/procedural/impl/SPATest.java @@ -17,7 +17,6 @@ import java.util.Map; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -45,7 +44,7 @@ public class SPATest { smallAlphabet = new DefaultProceduralInputAlphabet<>(internalAlphabet, smallCallAlphabet, 'R'); ALPHABET = new DefaultProceduralInputAlphabet<>(internalAlphabet, bigCallAlphabet, 'R'); - SUB_MODELS = ImmutableMap.of('S', buildSProcedure(smallAlphabet), 'T', buildTProcedure(smallAlphabet)); + SUB_MODELS = Map.of('S', buildSProcedure(smallAlphabet), 'T', buildTProcedure(smallAlphabet)); } @Test diff --git a/core/src/test/java/net/automatalib/automaton/procedural/impl/SPMMTest.java b/core/src/test/java/net/automatalib/automaton/procedural/impl/SPMMTest.java index 52185e7dce..a6685e84ec 100644 --- a/core/src/test/java/net/automatalib/automaton/procedural/impl/SPMMTest.java +++ b/core/src/test/java/net/automatalib/automaton/procedural/impl/SPMMTest.java @@ -17,7 +17,6 @@ import java.util.Map; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -47,7 +46,7 @@ public SPMMTest() { final Character errorOutput = '-'; final Map> mealies = - ImmutableMap.of('S', buildSProcedure(smallAlphabet), 'T', buildTProcedure(smallAlphabet)); + Map.of('S', buildSProcedure(smallAlphabet), 'T', buildTProcedure(smallAlphabet)); spmm = new StackSPMM<>(bigAlphabet, 'S', '✓', errorOutput, mealies); emptySpmm = new EmptySPMM<>(bigAlphabet, errorOutput); diff --git a/core/src/test/java/net/automatalib/graph/impl/IntAbstractionTest.java b/core/src/test/java/net/automatalib/graph/impl/IntAbstractionTest.java index 7b7ed1a97c..800dea42cd 100644 --- a/core/src/test/java/net/automatalib/graph/impl/IntAbstractionTest.java +++ b/core/src/test/java/net/automatalib/graph/impl/IntAbstractionTest.java @@ -21,9 +21,8 @@ import java.util.Set; import java.util.stream.Collectors; -import com.google.common.collect.Lists; -import com.google.common.collect.Streams; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.random.RandomUtil; import net.automatalib.graph.BidirectionalGraph; import net.automatalib.graph.MutableGraph; @@ -34,8 +33,8 @@ public class IntAbstractionTest { private static final int SIZE = 25; - private static final List NPS = CollectionsUtil.charRange('A', 'F'); - private static final List EPS = CollectionsUtil.charRange('0', '9'); + private static final List NPS = CollectionUtil.charRange('A', 'F'); + private static final List EPS = CollectionUtil.charRange('0', '9'); @Test public void testCompactGraphs() { @@ -116,19 +115,19 @@ private void checkGraphs(MutableGraph graph, .collect(Collectors.toSet()); Assert.assertEquals(gSuccs, aSuccs); - final Set gProps = Streams.stream(graph.getOutgoingEdgesIterator(n)) - .map(graph::getEdgeProperty) - .collect(Collectors.toSet()); - final Set aProps = Streams.stream(abstraction.getOutgoingEdgesIterator(id)) - .map(abstraction::getEdgeProperty) - .collect(Collectors.toSet()); + final Set gProps = IteratorUtil.stream(graph.getOutgoingEdgesIterator(n)) + .map(graph::getEdgeProperty) + .collect(Collectors.toSet()); + final Set aProps = IteratorUtil.stream(abstraction.getOutgoingEdgesIterator(id)) + .map(abstraction::getEdgeProperty) + .collect(Collectors.toSet()); Assert.assertEquals(gProps, aProps); for (N n1 : graph) { final int id1 = nodeIDs.getNodeId(n1); Assert.assertEquals(graph.isConnected(n, n1), abstraction.isConnected(id, id1)); - final Collection gEdgesInBtwn = Lists.newArrayList(graph.getEdgesBetween(n, n1)); + final Collection gEdgesInBtwn = IteratorUtil.list(graph.getEdgesBetween(n, n1)); final Collection aEdgesInBtwn = abstraction.getEdgesBetween(id, id1); Assert.assertEquals(gEdgesInBtwn.size(), aEdgesInBtwn.size()); } diff --git a/core/src/test/java/net/automatalib/modelchecking/impl/lasso/DFALassoTest.java b/core/src/test/java/net/automatalib/modelchecking/impl/lasso/DFALassoTest.java index d40db81bf7..1fbaea5e76 100644 --- a/core/src/test/java/net/automatalib/modelchecking/impl/lasso/DFALassoTest.java +++ b/core/src/test/java/net/automatalib/modelchecking/impl/lasso/DFALassoTest.java @@ -18,7 +18,7 @@ import java.util.Collection; import net.automatalib.automaton.fsa.DFA; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.modelchecking.impl.DFALassoImpl; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; @@ -50,7 +50,7 @@ private static class DFAMock implements DFA { @Override public Collection getStates() { - return CollectionsUtil.intRange(0, word.length()); + return CollectionUtil.intRange(0, word.length()); } @Override diff --git a/core/src/test/java/net/automatalib/modelchecking/impl/lasso/MealyLassoTest.java b/core/src/test/java/net/automatalib/modelchecking/impl/lasso/MealyLassoTest.java index 70ba662f7c..afe5a46748 100644 --- a/core/src/test/java/net/automatalib/modelchecking/impl/lasso/MealyLassoTest.java +++ b/core/src/test/java/net/automatalib/modelchecking/impl/lasso/MealyLassoTest.java @@ -19,7 +19,7 @@ import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.automaton.transducer.impl.MealyTransition; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.modelchecking.impl.MealyLassoImpl; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; @@ -59,7 +59,7 @@ public String getTransitionOutput(MealyTransition transition) { @Override public Collection getStates() { - return CollectionsUtil.intRange(0, word.length()); + return CollectionUtil.intRange(0, word.length()); } @Override diff --git a/incremental/pom.xml b/incremental/pom.xml index 340ffc0906..8cef3c09d7 100644 --- a/incremental/pom.xml +++ b/incremental/pom.xml @@ -40,10 +40,6 @@ limitations under the License. net.automatalib automata-api - - net.automatalib - automata-commons-smartcollections - net.automatalib automata-commons-util @@ -53,12 +49,6 @@ limitations under the License. automata-util - - - com.google.guava - guava - - org.checkerframework diff --git a/incremental/src/main/java/module-info.java b/incremental/src/main/java/module-info.java index 59a6a53d70..0a1f0228b0 100644 --- a/incremental/src/main/java/module-info.java +++ b/incremental/src/main/java/module-info.java @@ -34,10 +34,8 @@ */ open module net.automatalib.incremental { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; - requires net.automatalib.common.smartcollection; requires net.automatalib.util; requires org.checkerframework.checker.qual; diff --git a/incremental/src/main/java/net/automatalib/incremental/dfa/dag/State.java b/incremental/src/main/java/net/automatalib/incremental/dfa/dag/State.java index 7b0ab8026c..aee0b8c6d1 100644 --- a/incremental/src/main/java/net/automatalib/incremental/dfa/dag/State.java +++ b/incremental/src/main/java/net/automatalib/incremental/dfa/dag/State.java @@ -15,7 +15,7 @@ */ package net.automatalib.incremental.dfa.dag; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.incremental.dfa.Acceptance; /** diff --git a/incremental/src/main/java/net/automatalib/incremental/dfa/dag/StateSignature.java b/incremental/src/main/java/net/automatalib/incremental/dfa/dag/StateSignature.java index 60c0d03c47..b48ce7fbdf 100644 --- a/incremental/src/main/java/net/automatalib/incremental/dfa/dag/StateSignature.java +++ b/incremental/src/main/java/net/automatalib/incremental/dfa/dag/StateSignature.java @@ -17,7 +17,7 @@ import java.util.Arrays; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.incremental.dfa.Acceptance; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/incremental/src/main/java/net/automatalib/incremental/dfa/tree/IncrementalDFATreeBuilder.java b/incremental/src/main/java/net/automatalib/incremental/dfa/tree/IncrementalDFATreeBuilder.java index 436bec114d..ae85e09e15 100644 --- a/incremental/src/main/java/net/automatalib/incremental/dfa/tree/IncrementalDFATreeBuilder.java +++ b/incremental/src/main/java/net/automatalib/incremental/dfa/tree/IncrementalDFATreeBuilder.java @@ -16,18 +16,16 @@ package net.automatalib.incremental.dfa.tree; import java.util.ArrayDeque; -import java.util.ArrayList; import java.util.Collection; import java.util.Deque; import java.util.Iterator; -import java.util.List; -import com.google.common.collect.Iterators; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.UniversalAutomaton; import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.graph.TransitionEdge; import net.automatalib.automaton.graph.UniversalAutomatonGraphView; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.MapMapping; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.graph.Graph; @@ -259,9 +257,7 @@ public Void getTransitionProperty(Node transition) { @Override public Collection getStates() { - List result = new ArrayList<>(); - Iterators.addAll(result, TSTraversal.breadthFirstIterator(this, inputAlphabet)); - return result; + return IteratorUtil.list(TSTraversal.breadthFirstIterator(this, inputAlphabet)); } /* diff --git a/incremental/src/main/java/net/automatalib/incremental/dfa/tree/Node.java b/incremental/src/main/java/net/automatalib/incremental/dfa/tree/Node.java index 12e2c8ea05..385f90f9bf 100644 --- a/incremental/src/main/java/net/automatalib/incremental/dfa/tree/Node.java +++ b/incremental/src/main/java/net/automatalib/incremental/dfa/tree/Node.java @@ -15,7 +15,7 @@ */ package net.automatalib.incremental.dfa.tree; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import net.automatalib.incremental.dfa.Acceptance; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/incremental/src/main/java/net/automatalib/incremental/mealy/dag/State.java b/incremental/src/main/java/net/automatalib/incremental/mealy/dag/State.java index 4c17515aae..e4ecdd8a40 100644 --- a/incremental/src/main/java/net/automatalib/incremental/mealy/dag/State.java +++ b/incremental/src/main/java/net/automatalib/incremental/mealy/dag/State.java @@ -15,7 +15,7 @@ */ package net.automatalib.incremental.mealy.dag; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; /** * A state in the DAG internally used by {@link IncrementalMealyDAGBuilder}. diff --git a/incremental/src/main/java/net/automatalib/incremental/mealy/dag/StateSignature.java b/incremental/src/main/java/net/automatalib/incremental/mealy/dag/StateSignature.java index 6e5f412187..234a1c5996 100644 --- a/incremental/src/main/java/net/automatalib/incremental/mealy/dag/StateSignature.java +++ b/incremental/src/main/java/net/automatalib/incremental/mealy/dag/StateSignature.java @@ -17,7 +17,7 @@ import java.util.Arrays; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** diff --git a/incremental/src/main/java/net/automatalib/incremental/mealy/tree/AbstractAlphabetBasedMealyTreeBuilder.java b/incremental/src/main/java/net/automatalib/incremental/mealy/tree/AbstractAlphabetBasedMealyTreeBuilder.java index bd6564e4bb..b7d94d0f62 100644 --- a/incremental/src/main/java/net/automatalib/incremental/mealy/tree/AbstractAlphabetBasedMealyTreeBuilder.java +++ b/incremental/src/main/java/net/automatalib/incremental/mealy/tree/AbstractAlphabetBasedMealyTreeBuilder.java @@ -15,16 +15,14 @@ */ package net.automatalib.incremental.mealy.tree; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; -import com.google.common.collect.Iterators; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.concept.InputAlphabetHolder; import net.automatalib.automaton.graph.TransitionEdge; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.automaton.transducer.MealyMachine.MealyGraphView; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.MapMapping; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.graph.Graph; @@ -107,9 +105,7 @@ private class MealyMachineView extends TransitionSystemView @Override public Collection> getStates() { - List> result = new ArrayList<>(); - Iterators.addAll(result, TSTraversal.breadthFirstIterator(this, inputAlphabet)); - return result; + return IteratorUtil.list(TSTraversal.breadthFirstIterator(this, inputAlphabet)); } /* diff --git a/incremental/src/main/java/net/automatalib/incremental/mealy/tree/DynamicIncrementalMealyTreeBuilder.java b/incremental/src/main/java/net/automatalib/incremental/mealy/tree/DynamicIncrementalMealyTreeBuilder.java index 02fefd6eb6..05da57b94f 100644 --- a/incremental/src/main/java/net/automatalib/incremental/mealy/tree/DynamicIncrementalMealyTreeBuilder.java +++ b/incremental/src/main/java/net/automatalib/incremental/mealy/tree/DynamicIncrementalMealyTreeBuilder.java @@ -15,15 +15,13 @@ */ package net.automatalib.incremental.mealy.tree; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.graph.Graph; import net.automatalib.incremental.ConflictException; import net.automatalib.incremental.mealy.IncrementalMealyBuilder; @@ -114,9 +112,7 @@ public DynamicNode getTarget(Entry, O>> edge) { @Override public Collection> getNodes() { - List> result = new ArrayList<>(); - Iterators.addAll(result, GraphTraversal.breadthFirstIterator(this, Collections.singleton(root))); - return result; + return IteratorUtil.list(GraphTraversal.breadthFirstIterator(this, Collections.singleton(root))); } @Override diff --git a/incremental/src/main/java/net/automatalib/incremental/mealy/tree/Node.java b/incremental/src/main/java/net/automatalib/incremental/mealy/tree/Node.java index 41022d9754..7d8020e426 100644 --- a/incremental/src/main/java/net/automatalib/incremental/mealy/tree/Node.java +++ b/incremental/src/main/java/net/automatalib/incremental/mealy/tree/Node.java @@ -15,7 +15,7 @@ */ package net.automatalib.incremental.mealy.tree; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** diff --git a/incremental/src/main/java/net/automatalib/incremental/moore/dag/State.java b/incremental/src/main/java/net/automatalib/incremental/moore/dag/State.java index 1e0d6e004b..577daada21 100644 --- a/incremental/src/main/java/net/automatalib/incremental/moore/dag/State.java +++ b/incremental/src/main/java/net/automatalib/incremental/moore/dag/State.java @@ -15,7 +15,7 @@ */ package net.automatalib.incremental.moore.dag; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; /** * A state in the DAG internally used by {@link IncrementalMooreDAGBuilder}. diff --git a/incremental/src/main/java/net/automatalib/incremental/moore/dag/StateSignature.java b/incremental/src/main/java/net/automatalib/incremental/moore/dag/StateSignature.java index dcd71a5811..ebdffbf1e9 100644 --- a/incremental/src/main/java/net/automatalib/incremental/moore/dag/StateSignature.java +++ b/incremental/src/main/java/net/automatalib/incremental/moore/dag/StateSignature.java @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Objects; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** diff --git a/incremental/src/main/java/net/automatalib/incremental/moore/tree/IncrementalMooreTreeBuilder.java b/incremental/src/main/java/net/automatalib/incremental/moore/tree/IncrementalMooreTreeBuilder.java index cb469e3e44..67d0b8e037 100644 --- a/incremental/src/main/java/net/automatalib/incremental/moore/tree/IncrementalMooreTreeBuilder.java +++ b/incremental/src/main/java/net/automatalib/incremental/moore/tree/IncrementalMooreTreeBuilder.java @@ -16,7 +16,6 @@ package net.automatalib.incremental.moore.tree; import java.util.ArrayDeque; -import java.util.ArrayList; import java.util.Collection; import java.util.Deque; import java.util.Iterator; @@ -24,12 +23,12 @@ import java.util.Map; import java.util.Objects; -import com.google.common.collect.Iterators; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.graph.TransitionEdge; import net.automatalib.automaton.transducer.MooreMachine; import net.automatalib.automaton.transducer.MooreMachine.MooreGraphView; import net.automatalib.automaton.visualization.MooreVisualizationHelper; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.MapMapping; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.graph.Graph; @@ -264,9 +263,7 @@ public Node getSuccessor(Node transition) { @Override public Collection> getStates() { - List> result = new ArrayList<>(); - Iterators.addAll(result, TSTraversal.breadthFirstIterator(this, alphabet)); - return result; + return IteratorUtil.list(TSTraversal.breadthFirstIterator(this, alphabet)); } /* diff --git a/incremental/src/main/java/net/automatalib/incremental/moore/tree/Node.java b/incremental/src/main/java/net/automatalib/incremental/moore/tree/Node.java index 84bfc3d442..aaa16d1bf9 100644 --- a/incremental/src/main/java/net/automatalib/incremental/moore/tree/Node.java +++ b/incremental/src/main/java/net/automatalib/incremental/moore/tree/Node.java @@ -15,7 +15,7 @@ */ package net.automatalib.incremental.moore.tree; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** diff --git a/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalDFABuilderTest.java b/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalDFABuilderTest.java index 3223a450ae..14a8cb2cc7 100644 --- a/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalDFABuilderTest.java +++ b/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalDFABuilderTest.java @@ -19,7 +19,6 @@ import java.io.Reader; import java.io.StringWriter; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.GrowingAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -177,7 +176,7 @@ public void testVisualization() throws IOException { getDOTResource()))) { GraphDOT.write(incDfa.asGraph(), dotWriter); - CharStreams.copy(reader, expectedWriter); + IOUtil.copy(reader, expectedWriter); Assert.assertEquals(dotWriter.toString(), expectedWriter.toString()); } diff --git a/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalPCDFABuilderTest.java b/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalPCDFABuilderTest.java index d27e11aba7..31380b2b51 100644 --- a/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalPCDFABuilderTest.java +++ b/incremental/src/test/java/net/automatalib/incremental/dfa/AbstractIncrementalPCDFABuilderTest.java @@ -19,7 +19,6 @@ import java.io.Reader; import java.io.StringWriter; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.GrowingAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -175,7 +174,7 @@ public void testVisualization() throws IOException { getDOTResource()))) { GraphDOT.write(incPcDfa.asGraph(), dotWriter); - CharStreams.copy(reader, expectedWriter); + IOUtil.copy(reader, expectedWriter); Assert.assertEquals(dotWriter.toString(), expectedWriter.toString()); } diff --git a/incremental/src/test/java/net/automatalib/incremental/mealy/AbstractIncrementalMealyBuilderTest.java b/incremental/src/test/java/net/automatalib/incremental/mealy/AbstractIncrementalMealyBuilderTest.java index a2dd198382..3b36d65007 100644 --- a/incremental/src/test/java/net/automatalib/incremental/mealy/AbstractIncrementalMealyBuilderTest.java +++ b/incremental/src/test/java/net/automatalib/incremental/mealy/AbstractIncrementalMealyBuilderTest.java @@ -20,7 +20,6 @@ import java.io.StringWriter; import java.util.ArrayList; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.GrowingAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -194,7 +193,7 @@ public void testVisualization() throws IOException { getDOTResource()))) { GraphDOT.write(incMealy.asGraph(), dotWriter); - CharStreams.copy(reader, expectedWriter); + IOUtil.copy(reader, expectedWriter); Assert.assertEquals(dotWriter.toString(), expectedWriter.toString()); } diff --git a/incremental/src/test/java/net/automatalib/incremental/moore/AbstractIncrementalMooreBuilderTest.java b/incremental/src/test/java/net/automatalib/incremental/moore/AbstractIncrementalMooreBuilderTest.java index 6958ce0c0c..3163955027 100644 --- a/incremental/src/test/java/net/automatalib/incremental/moore/AbstractIncrementalMooreBuilderTest.java +++ b/incremental/src/test/java/net/automatalib/incremental/moore/AbstractIncrementalMooreBuilderTest.java @@ -20,7 +20,6 @@ import java.io.StringWriter; import java.util.ArrayList; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.GrowingAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -194,7 +193,7 @@ public void testVisualization() throws IOException { getDOTResource()))) { GraphDOT.write(incMoore.asGraph(), dotWriter); - CharStreams.copy(reader, expectedWriter); + IOUtil.copy(reader, expectedWriter); Assert.assertEquals(dotWriter.toString(), expectedWriter.toString()); } diff --git a/modelchecking/ltsmin/pom.xml b/modelchecking/ltsmin/pom.xml index d2f7a6d0f0..f931986a67 100644 --- a/modelchecking/ltsmin/pom.xml +++ b/modelchecking/ltsmin/pom.xml @@ -65,10 +65,6 @@ limitations under the License. - - com.google.guava - guava - org.slf4j slf4j-api diff --git a/modelchecking/ltsmin/src/main/java/module-info.java b/modelchecking/ltsmin/src/main/java/module-info.java index ad3b2dd654..eb9f34cdaa 100644 --- a/modelchecking/ltsmin/src/main/java/module-info.java +++ b/modelchecking/ltsmin/src/main/java/module-info.java @@ -33,7 +33,6 @@ */ open module net.automatalib.modelchecker.ltsmin { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.core; diff --git a/modelchecking/ltsmin/src/main/java/net/automatalib/modelchecker/ltsmin/AbstractLTSmin.java b/modelchecking/ltsmin/src/main/java/net/automatalib/modelchecker/ltsmin/AbstractLTSmin.java index cef833c520..772a871000 100644 --- a/modelchecking/ltsmin/src/main/java/net/automatalib/modelchecker/ltsmin/AbstractLTSmin.java +++ b/modelchecking/ltsmin/src/main/java/net/automatalib/modelchecker/ltsmin/AbstractLTSmin.java @@ -22,9 +22,9 @@ import java.util.List; import java.util.function.Function; -import com.google.common.collect.Lists; import net.automatalib.AutomataLibSettings; import net.automatalib.common.util.IOUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.common.util.process.ProcessUtil; import net.automatalib.exception.ModelCheckingException; import net.automatalib.modelchecking.ModelChecker; @@ -209,20 +209,20 @@ public Function getString2Input() { } // the command lines for the ProcessBuilder - final List ltsminCommandLine = Lists.newArrayList(// add the etf2lts-mc binary - LTSminUtil.ETF2LTS_MC, - // add the ETF file that contains the hypothesis - etf.getAbsolutePath(), - // add the LTL formula - "--ltl=" + ltlFile, - // write the trace to this file - "--trace=" + gcf.getAbsolutePath(), - // use only one thread (hypotheses are always small) - "--threads=1", - // use LTSmin LTL semantics - "--ltl-semantics=ltsmin", - // do not abort on partial LTSs - "--allow-undefined-edges"); + final List ltsminCommandLine = CollectionUtil.list(// add the etf2lts-mc binary + LTSminUtil.ETF2LTS_MC, + // add the ETF file that contains the hypothesis + etf.getAbsolutePath(), + // add the LTL formula + "--ltl=" + ltlFile, + // write the trace to this file + "--trace=" + gcf.getAbsolutePath(), + // use only one thread (hypotheses are always small) + "--threads=1", + // use LTSmin LTL semantics + "--ltl-semantics=ltsmin", + // do not abort on partial LTSs + "--allow-undefined-edges"); if (LTSminUtil.isVerbose()) { ltsminCommandLine.add("-v"); @@ -247,14 +247,14 @@ public Function getString2Input() { throw new ModelCheckingException(ioe); } - final List convertCommandLine = Lists.newArrayList(// add the ltsmin-convert binary - LTSminUtil.LTSMIN_CONVERT, - // use the GCF as input - gcf.getAbsolutePath(), - // use the FSM as output - fsm.getAbsolutePath(), - // required option - "--rdwr"); + final List convertCommandLine = CollectionUtil.list(// add the ltsmin-convert binary + LTSminUtil.LTSMIN_CONVERT, + // use the GCF as input + gcf.getAbsolutePath(), + // use the FSM as output + fsm.getAbsolutePath(), + // required option + "--rdwr"); if (LTSminUtil.isVerbose()) { convertCommandLine.add("-v"); diff --git a/modelchecking/m3c/pom.xml b/modelchecking/m3c/pom.xml index 5bd849395a..9083780082 100644 --- a/modelchecking/m3c/pom.xml +++ b/modelchecking/m3c/pom.xml @@ -54,10 +54,6 @@ limitations under the License. - - com.google.guava - guava - info.scce addlib-core diff --git a/modelchecking/m3c/src/main/java/module-info.java b/modelchecking/m3c/src/main/java/module-info.java index 573479334c..31ec567c0c 100644 --- a/modelchecking/m3c/src/main/java/module-info.java +++ b/modelchecking/m3c/src/main/java/module-info.java @@ -38,7 +38,6 @@ requires java.xml; requires addlib.core; - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.core; diff --git a/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/AbstractDDSolver.java b/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/AbstractDDSolver.java index 746e0cb507..138dc47e18 100644 --- a/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/AbstractDDSolver.java +++ b/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/AbstractDDSolver.java @@ -28,8 +28,7 @@ import java.util.Objects; import java.util.Set; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.graph.ContextFreeModalProcessSystem; @@ -85,7 +84,7 @@ abstract class AbstractDDSolver, AbstractDDSolver(ContextFreeModalProcessSystem cfmps) { final Map> pmpgs = cfmps.getPMPGs(); - this.workUnits = Maps.newHashMapWithExpectedSize(pmpgs.size()); + this.workUnits = new HashMap<>(HashUtil.capacity(pmpgs.size())); for (Map.Entry> e : pmpgs.entrySet()) { final L label = e.getKey(); final ProceduralModalProcessGraph pmpg = e.getValue(); @@ -115,12 +114,17 @@ private void checkPMPG(@UnderInitialization AbstractDDSolver this, throw new IllegalArgumentException("PMPG '" + label + "' has no final node"); } - Preconditions.checkArgument(isGuarded(pmpg, initialNode), - "PMPG '%s' is not guarded. All initial transitions must be labelled with atomic actions.", - label); - Preconditions.checkArgument(isTerminating(pmpg, finalNode), - "PMPG '%s' is not terminating. The final node is not allowed to have outgoing transitions.", - label); + if (!isGuarded(pmpg, initialNode)) { + throw new IllegalArgumentException(String.format( + "PMPG '%s' is not guarded. All initial transitions must be labelled with atomic actions.", + label)); + } + + if (!isTerminating(pmpg, finalNode)) { + throw new IllegalArgumentException(String.format( + "PMPG '%s' is not terminating. The final node is not allowed to have outgoing transitions.", + label)); + } } private boolean isGuarded(@UnderInitialization AbstractDDSolver this, @@ -216,7 +220,7 @@ public SolverHistory solveAndRecordHistory(FormulaNode formula) initialize(ast); try { - final Map> data = Maps.newHashMapWithExpectedSize(this.workUnits.size()); + final Map> data = new HashMap<>(HashUtil.capacity(this.workUnits.size())); for (Entry> e : this.workUnits.entrySet()) { data.put(e.getKey(), createProcessData(e.getValue())); } @@ -238,7 +242,7 @@ private SolverData createProcessData(WorkUnit unit) { } private Map> serializePropertyTransformerMap(Map transformers) { - final Map> serializedTransformers = Maps.newHashMapWithExpectedSize(transformers.size()); + final Map> serializedTransformers = new HashMap<>(HashUtil.capacity(transformers.size())); for (Map.Entry entry : transformers.entrySet()) { serializedTransformers.put(entry.getKey(), serializer.serialize(entry.getValue())); } @@ -295,7 +299,7 @@ private List updateNodeAndGetCompositions(WorkUnit unit, N node) { } private Map> copyWorkSet() { - final Map> copy = Maps.newHashMapWithExpectedSize(workUnits.size()); + final Map> copy = new HashMap<>(HashUtil.capacity(workUnits.size())); for (Map.Entry> e : workUnits.entrySet()) { copy.put(e.getKey(), copyWorkSet(e.getValue())); } diff --git a/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverData.java b/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverData.java index 92b57122c4..4f968f9fa6 100644 --- a/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverData.java +++ b/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverData.java @@ -15,10 +15,11 @@ */ package net.automatalib.modelchecker.m3c.solver; +import java.util.HashMap; import java.util.List; import java.util.Map; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.common.util.mapping.Mappings; import net.automatalib.graph.ProceduralModalProcessGraph; @@ -85,7 +86,7 @@ public NodeIDs getNodeIDs() { * @return a {@link Mapping} which maps nodes to their initial property transformer */ public Mapping getInitialPropertyTransformers(TransformerSerializer serializer) { - final Map result = Maps.newHashMapWithExpectedSize(this.pmpg.size()); + final Map result = new HashMap<>(HashUtil.capacity(this.pmpg.size())); for (N n : this.pmpg) { result.put(n, serializer.deserialize(this.initialPropertyTransformers.get(n))); diff --git a/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverHistory.java b/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverHistory.java index efbc9a5103..63a062cbbf 100644 --- a/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverHistory.java +++ b/modelchecking/m3c/src/main/java/net/automatalib/modelchecker/m3c/solver/SolverHistory.java @@ -15,11 +15,12 @@ */ package net.automatalib.modelchecker.m3c.solver; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.modelchecker.m3c.formula.FormulaNode; import net.automatalib.modelchecker.m3c.transformer.AbstractPropertyTransformer; import net.automatalib.modelchecker.m3c.transformer.TransformerSerializer; @@ -113,7 +114,7 @@ public boolean isSat() { } private Map transform(Map> input, TransformerSerializer serializer) { - final Map result = Maps.newHashMapWithExpectedSize(input.size()); + final Map result = new HashMap<>(HashUtil.capacity(input.size())); for (Entry> e : input.entrySet()) { result.put(e.getKey(), serializer.deserialize(e.getValue())); diff --git a/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/ExternalSystemDeserializer.java b/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/ExternalSystemDeserializer.java index 39f57d07d4..a142c6ce7d 100644 --- a/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/ExternalSystemDeserializer.java +++ b/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/ExternalSystemDeserializer.java @@ -19,13 +19,14 @@ import java.io.InputStream; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.graph.MutableProceduralModalProcessGraph; import net.automatalib.graph.impl.CompactPMPG; @@ -51,7 +52,7 @@ static ContextFreeModalProcessSystem parse(InputStream is) final Element root = getRoot(is); final NodeList procedures = root.getElementsByTagName("pmpg"); final Map> pmpgs = - Maps.newLinkedHashMapWithExpectedSize(procedures.getLength()); + new LinkedHashMap<>(HashUtil.capacity(procedures.getLength())); for (int i = 0; i < procedures.getLength(); i++) { final Element procedure = (Element) procedures.item(i); diff --git a/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/WitnessExtractorTest.java b/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/WitnessExtractorTest.java index b8e55bf067..af1ec14eeb 100644 --- a/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/WitnessExtractorTest.java +++ b/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/solver/WitnessExtractorTest.java @@ -23,7 +23,6 @@ import javax.xml.parsers.ParserConfigurationException; -import com.google.common.io.CharStreams; import net.automatalib.common.util.IOUtil; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.modelchecker.m3c.formula.FormulaNode; @@ -146,7 +145,7 @@ private ContextFreeModalProcessSystem parseCFMPS(String name) private String parseDOT(String name) throws IOException { try (InputStream is = WitnessExtractorTest.class.getResourceAsStream("/dot/witness/" + name); Reader r = IOUtil.asBufferedUTF8Reader(is)) { - return CharStreams.toString(r); + return IOUtil.toString(r); } } diff --git a/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/util/Examples.java b/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/util/Examples.java index 890cbf4700..c581356d9d 100644 --- a/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/util/Examples.java +++ b/modelchecking/m3c/src/test/java/net/automatalib/modelchecker/m3c/util/Examples.java @@ -16,9 +16,9 @@ package net.automatalib.modelchecker.m3c.util; import java.util.Collections; +import java.util.Map; import java.util.Set; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -81,8 +81,7 @@ public static ContextFreeModalProcessSystem getSBASystem() { MutableDFAs.complete(p3, alphabet, true); // explicit type variable declaration to make checker-framework happy - final StackSBA sba = - new StackSBA<>(alphabet, "P1", ImmutableMap.of("P1", p1, "P2", p2, "P3", p3, "P4", p4)); + final StackSBA sba = new StackSBA<>(alphabet, "P1", Map.of("P1", p1, "P2", p2, "P3", p3, "P4", p4)); return SBAs.toCFMPS(sba); } diff --git a/pom.xml b/pom.xml index 39e6fb64c3..8a35d6bb1e 100644 --- a/pom.xml +++ b/pom.xml @@ -188,6 +188,9 @@ limitations under the License. 1.8 1.8 8 + 11 + 11 + 11 @@ -228,7 +231,7 @@ limitations under the License. 3.40.0 9.3 1.7.0 - 32.1.3-jre + 33.0.0-jre 0.0.1 2.3.1 2.1.1 @@ -242,7 +245,6 @@ limitations under the License. http://scce.gitlab.io/add-lib/${addlib.version}/apidocs/ http://www.brics.dk/automaton/doc http://checkerframework.org/releases/${checkerframework.version}/api/ - http://google.github.io/guava/releases/${guava.version}/api/docs/ http://docs.oracle.com/javase/8/docs/api/ http://jung.sourceforge.net/doc/api/ @@ -707,7 +709,6 @@ limitations under the License. ${addlib.apidocs} ${brics-automaton.apidocs} ${checkerframework.apidocs} - ${guava.apidocs} ${jung.apidocs} diff --git a/serialization/aut/pom.xml b/serialization/aut/pom.xml index 6389835db9..290c0cc169 100644 --- a/serialization/aut/pom.xml +++ b/serialization/aut/pom.xml @@ -46,12 +46,6 @@ limitations under the License. automata-core - - - com.google.guava - guava - - net.automatalib diff --git a/serialization/aut/src/main/java/module-info.java b/serialization/aut/src/main/java/module-info.java index 0554b5823e..56818869c4 100644 --- a/serialization/aut/src/main/java/module-info.java +++ b/serialization/aut/src/main/java/module-info.java @@ -28,7 +28,6 @@ */ open module net.automatalib.serialization.aut { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.core; diff --git a/serialization/aut/src/main/java/net/automatalib/serialization/aut/InternalAUTParser.java b/serialization/aut/src/main/java/net/automatalib/serialization/aut/InternalAUTParser.java index 20f6fc5d50..071d8836a4 100644 --- a/serialization/aut/src/main/java/net/automatalib/serialization/aut/InternalAUTParser.java +++ b/serialization/aut/src/main/java/net/automatalib/serialization/aut/InternalAUTParser.java @@ -24,11 +24,11 @@ import java.util.Set; import java.util.function.Function; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.impl.CompactNFA; import net.automatalib.automaton.simple.SimpleAutomaton; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.IOUtil; import net.automatalib.serialization.InputModelData; @@ -58,7 +58,10 @@ public InputModelData> parse(Function inputMap = Maps.asMap(alphabetSymbols, inputTransformer::apply); + final Map inputMap = new HashMap<>(HashUtil.capacity(this.alphabetSymbols.size())); + for (String s : this.alphabetSymbols) { + inputMap.put(s, inputTransformer.apply(s)); + } final Alphabet alphabet = Alphabets.fromCollection(inputMap.values()); final CompactNFA result = new CompactNFA<>(alphabet, numStates); diff --git a/serialization/aut/src/test/java/net/automatalib/serialization/aut/AUTSerializationTest.java b/serialization/aut/src/test/java/net/automatalib/serialization/aut/AUTSerializationTest.java index 22262db861..df612d88c6 100644 --- a/serialization/aut/src/test/java/net/automatalib/serialization/aut/AUTSerializationTest.java +++ b/serialization/aut/src/test/java/net/automatalib/serialization/aut/AUTSerializationTest.java @@ -19,13 +19,13 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.Arrays; import java.util.Collections; import java.util.Objects; import java.util.Random; import java.util.Set; -import com.google.common.io.ByteStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.DFA; @@ -125,7 +125,7 @@ public void doNotCloseOutputStreamTest() throws IOException { final CompactDFA automaton = RandomAutomata.randomDFA(new Random(0), 10, Alphabets.integers(0, 2)); AUTSerializationProvider.getInstance() - .writeModel(new UnclosableOutputStream(ByteStreams.nullOutputStream()), + .writeModel(new UnclosableOutputStream(OutputStream.nullOutputStream()), automaton, automaton.getInputAlphabet(), Objects::toString); diff --git a/serialization/dot/pom.xml b/serialization/dot/pom.xml index b02569bef9..6125c8bf81 100644 --- a/serialization/dot/pom.xml +++ b/serialization/dot/pom.xml @@ -46,12 +46,6 @@ limitations under the License. automata-commons-util - - - com.google.guava - guava - - org.checkerframework diff --git a/serialization/dot/src/main/java/module-info.java b/serialization/dot/src/main/java/module-info.java index 7fee788996..52a4ea2980 100644 --- a/serialization/dot/src/main/java/module-info.java +++ b/serialization/dot/src/main/java/module-info.java @@ -28,7 +28,6 @@ */ open module net.automatalib.serialization.dot { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.core; diff --git a/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTGraphParser.java b/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTGraphParser.java index ad81991c0b..fdbc255104 100644 --- a/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTGraphParser.java +++ b/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTGraphParser.java @@ -19,11 +19,12 @@ import java.io.InputStream; import java.io.Reader; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; -import com.google.common.collect.Maps; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.IOUtil; import net.automatalib.graph.Graph; import net.automatalib.graph.MutableGraph; @@ -82,7 +83,7 @@ private void parseNodesAndEdges(InternalDOTParser parser, MutableGraph nodes = parser.getNodes(); final Collection edges = parser.getEdges(); - final Map stateMap = Maps.newHashMapWithExpectedSize(nodes.size()); + final Map stateMap = new HashMap<>(HashUtil.capacity(nodes.size())); for (Node node : nodes) { final N n = graph.addNode(nodeParser.apply(node.attributes)); diff --git a/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTMutableAutomatonParser.java b/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTMutableAutomatonParser.java index 963fe9b417..026a38dc2b 100644 --- a/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTMutableAutomatonParser.java +++ b/serialization/dot/src/main/java/net/automatalib/serialization/dot/DOTMutableAutomatonParser.java @@ -19,17 +19,18 @@ import java.io.InputStream; import java.io.Reader; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.AutomatonCreator; import net.automatalib.automaton.MutableAutomaton; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.IOUtil; import net.automatalib.common.util.Pair; import net.automatalib.common.util.mapping.Mapping; @@ -119,7 +120,7 @@ public DOTInputModelData readModel(InputStream is) throws IOException { private Mapping parseNodesAndEdges(InternalDOTParser parser, MutableAutomaton automaton) { final List nodes = parser.getNodes(); - final Map stateMap = Maps.newHashMapWithExpectedSize(nodes.size()); + final Map stateMap = new HashMap<>(HashUtil.capacity(nodes.size())); final MutableMapping mapping = automaton.createDynamicStateMapping(); for (Node node : nodes) { diff --git a/serialization/dot/src/main/javacc/DOT.jj b/serialization/dot/src/main/javacc/DOT.jj index 0fe9efc7bf..d08aa45f66 100644 --- a/serialization/dot/src/main/javacc/DOT.jj +++ b/serialization/dot/src/main/javacc/DOT.jj @@ -31,7 +31,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import com.google.common.base.Preconditions; import net.automatalib.common.util.string.StringUtil; import net.automatalib.exception.FormatException; @@ -55,22 +54,30 @@ class InternalDOTParser { private List transformedEdges; public List getNodes() { - Preconditions.checkArgument(this.parsed, "parse() needs to be called first"); + if (!this.parsed) { + throw new IllegalStateException("parse() needs to be called first"); + } return this.transformedNodes; } public List getEdges() { - Preconditions.checkArgument(this.parsed, "parse() needs to be called first"); + if (!this.parsed) { + throw new IllegalStateException("parse() needs to be called first"); + } return this.transformedEdges; } public boolean isStrict() { - Preconditions.checkArgument(this.parsed, "parse() needs to be called first"); + if (!this.parsed) { + throw new IllegalStateException("parse() needs to be called first"); + } return this.strict; } public boolean isDirected() { - Preconditions.checkArgument(this.parsed, "parse() needs to be called first"); + if (!this.parsed) { + throw new IllegalStateException("parse() needs to be called first"); + } return this.directed; } diff --git a/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationTest.java b/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationTest.java index fd3c144ea9..7b0afc2d4b 100644 --- a/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationTest.java +++ b/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationTest.java @@ -16,6 +16,7 @@ package net.automatalib.serialization.dot; import java.io.IOException; +import java.io.OutputStream; import java.io.Reader; import java.io.StringWriter; import java.io.Writer; @@ -25,8 +26,6 @@ import java.util.Objects; import java.util.function.Function; -import com.google.common.io.ByteStreams; -import com.google.common.io.CharStreams; import net.automatalib.automaton.fsa.impl.CompactDFA; import net.automatalib.automaton.fsa.impl.CompactNFA; import net.automatalib.automaton.graph.TransitionEdge; @@ -229,7 +228,7 @@ public void testNullVisualizationHelper() throws IOException { @Test public void doNotCloseOutputStreamTest() throws IOException { DOTSerializationProvider.>getInstance() - .writeModel(new UnclosableOutputStream(ByteStreams.nullOutputStream()), + .writeModel(new UnclosableOutputStream(OutputStream.nullOutputStream()), DOTSerializationUtil.GRAPH); } @@ -240,7 +239,7 @@ private void checkDOTOutput(ThrowingWriter writer, String resource) throws IOExc try (Reader reader = IOUtil.asBufferedUTF8Reader(DOTSerializationUtil.class.getResourceAsStream(resource))) { - CharStreams.copy(reader, expectedWriter); + IOUtil.copy(reader, expectedWriter); writer.write(dotWriter); Assert.assertEquals(dotWriter.toString(), expectedWriter.toString()); diff --git a/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationUtil.java b/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationUtil.java index 8db182f0ff..7f634e5757 100644 --- a/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationUtil.java +++ b/serialization/dot/src/test/java/net/automatalib/serialization/dot/DOTSerializationUtil.java @@ -16,16 +16,17 @@ package net.automatalib.serialization.dot; import java.net.URL; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.Map; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.alphabet.impl.DefaultProceduralInputAlphabet; +import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.fsa.impl.CompactDFA; import net.automatalib.automaton.fsa.impl.CompactNFA; import net.automatalib.automaton.fsa.impl.FastDFA; @@ -36,6 +37,7 @@ import net.automatalib.automaton.procedural.impl.StackSBA; import net.automatalib.automaton.procedural.impl.StackSPA; import net.automatalib.automaton.procedural.impl.StackSPMM; +import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.automaton.transducer.impl.CompactMealy; import net.automatalib.automaton.transducer.impl.CompactMoore; import net.automatalib.automaton.transducer.impl.CompactSST; @@ -254,7 +256,8 @@ private static DefaultCFMPS buildCFMPS() { final CompactPMPG s = new CompactPMPG<>('?'); final int s0 = s.addIntNode(); - final int s1 = s.addIntNode(Sets.newHashSet('a', 'b')); + // Set.of doesn't have a deterministic (hash-based) iteration order, so use this workaround instead + final int s1 = s.addIntNode(new HashSet<>(Arrays.asList('a', 'b'))); final int s2 = s.addIntNode(Collections.singleton('c')); final CompactPMPGEdge e1 = s.connect(s0, s1, p1); @@ -278,7 +281,8 @@ private static DefaultCFMPS buildCFMPS() { t.connect(t1, t0, p4); t.setFinalNode(t1); - final Map> pmpgs = Maps.newHashMapWithExpectedSize(2); + // Map.of doesn't have a deterministic (hash-based) iteration order, so use this workaround instead + final Map> pmpgs = new HashMap<>(3); pmpgs.put('s', s); pmpgs.put('t', t); @@ -321,7 +325,11 @@ private static StackSPA buildSPA() { pG.setTransition(g1, 'G', g2); pG.setTransition(g2, 'c', g3); - return new StackSPA<>(alphabet, 'F', ImmutableMap.of('F', pF, 'G', pG)); + // Map.of doesn't have a deterministic (hash-based) iteration order, so use this workaround instead + final Map> procedures = new HashMap<>(3); + procedures.put('F', pF); + procedures.put('G', pG); + return new StackSPA<>(alphabet, 'F', procedures); } private static StackSBA buildSBA() { @@ -368,7 +376,11 @@ private static StackSBA buildSBA() { pG.setTransition(g2, 'c', g3); pG.setTransition(g3, 'R', g4); - return new StackSBA<>(alphabet, 'F', ImmutableMap.of('F', pF, 'G', pG)); + // Map.of doesn't have a deterministic (hash-based) iteration order, so use this workaround instead + final Map> procedures = new HashMap<>(3); + procedures.put('F', pF); + procedures.put('G', pG); + return new StackSBA<>(alphabet, 'F', procedures); } private static StackSPMM buildSPMM() { @@ -415,6 +427,10 @@ private static StackSBA buildSBA() { pG.setTransition(g2, 'c', g3, 'z'); pG.setTransition(g3, 'R', g4, '-'); - return new StackSPMM<>(alphabet, 'F', '+', '-', ImmutableMap.of('F', pF, 'G', pG)); + // Map.of doesn't have a deterministic (hash-based) iteration order, so use this workaround instead + final Map> procedures = new HashMap<>(3); + procedures.put('F', pF); + procedures.put('G', pG); + return new StackSPMM<>(alphabet, 'F', '+', '-', procedures); } } diff --git a/serialization/etf/pom.xml b/serialization/etf/pom.xml index ec2cb2ccb9..256bb833bc 100644 --- a/serialization/etf/pom.xml +++ b/serialization/etf/pom.xml @@ -42,12 +42,6 @@ limitations under the License. automata-commons-util - - - com.google.guava - guava - - net.automatalib diff --git a/serialization/etf/src/main/java/module-info.java b/serialization/etf/src/main/java/module-info.java index d4cb9cb14d..0baedd8b0f 100644 --- a/serialization/etf/src/main/java/module-info.java +++ b/serialization/etf/src/main/java/module-info.java @@ -28,7 +28,6 @@ */ open module net.automatalib.serialization.etf { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; diff --git a/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternating.java b/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternating.java index afe3291c45..2a2968b36f 100644 --- a/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternating.java +++ b/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternating.java @@ -17,11 +17,11 @@ import java.io.OutputStream; import java.io.PrintWriter; +import java.util.LinkedHashMap; import java.util.Map; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; import net.automatalib.alphabet.Alphabet; +import net.automatalib.automaton.concept.StateIDs; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.common.util.IOUtil; import net.automatalib.common.util.Pair; @@ -76,20 +76,18 @@ protected void writeETF(PrintWriter pw, MealyMachine mealy, Alphabet private void writeETFInternal(PrintWriter pw, MealyMachine mealy, Alphabet inputs) { - // create a bi-mapping from states to integers - final BiMap oldStates = HashBiMap.create(); - mealy.getStates().forEach(s -> oldStates.put(s, oldStates.size())); + final StateIDs oldStateIDs = mealy.stateIDs(); // write the initial state, using the bi-map pw.println("begin init"); - pw.printf("%d%n", oldStates.get(mealy.getInitialState())); + pw.printf("%d%n", oldStateIDs.getStateId(mealy.getInitialState())); pw.println("end init"); - // create a bi-map for transitions containing output - final BiMap, Integer> outputTransitions = HashBiMap.create(); + // create a (insertion stable) map for transitions containing output + final Map, Integer> outputTransitions = new LinkedHashMap<>(); - // create a bi-map that maps output to integers - final BiMap outputIndices = HashBiMap.create(); + // create a (insertion stable) map that maps output to integers + final Map outputIndices = new LinkedHashMap<>(); /* Write the transitions (here is where the horror begins). @@ -121,15 +119,15 @@ Write the transitions (here is where the horror begins). Write the output transition. Note that this will only be done if the output transition was not written before. */ - final Integer res = oldStates.size() + outputTransitions.size(); - pw.printf("%d/%d %d%n", res, oldStates.get(n), outputIndex); + final Integer res = mealy.size() + outputTransitions.size(); + pw.printf("%d/%d %d%n", res, oldStateIDs.getStateId(n), outputIndex); return res; }); // always write the input transition to the output transition pw.printf( "%d/%d %d%n", - oldStates.get(s), + oldStateIDs.getStateId(s), intermediateState, inputs.getSymbolIndex(i)); } @@ -139,14 +137,11 @@ Write the transitions (here is where the horror begins). // write all state ids, including the newly created intermediate states pw.println("begin sort id"); - for (int i = 0; i < oldStates.size(); i++) { - pw.printf("\"%s\"%n", oldStates.inverse().get(i)); + for (int i = 0; i < mealy.size(); i++) { + pw.printf("\"%s\"%n", oldStateIDs.getState(i)); } - final Map> inverseTransitions = outputTransitions.inverse(); - for (int i = 0; i < outputTransitions.size(); i++) { - final Pair t = inverseTransitions.get(oldStates.size() + i); - assert t != null; + for (Pair t : outputTransitions.keySet()) { pw.printf("\"(%s,%s)\"%n", t.getFirst(), t.getSecond()); } pw.println("end sort"); @@ -154,8 +149,8 @@ Write the transitions (here is where the horror begins). // write all the letters in the new alphabet pw.println("begin sort letter"); inputs.forEach(i -> pw.printf("\"%s\"%n", i)); - for (int i = 0; i < outputIndices.size(); i++) { - pw.printf("\"%s\"%n", outputIndices.inverse().get(inputs.size() + i)); + for (O o : outputIndices.keySet()) { + pw.printf("\"%s\"%n", o); } pw.println("end sort"); } diff --git a/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIO.java b/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIO.java index cddfbc0628..d1013d39fd 100644 --- a/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIO.java +++ b/serialization/etf/src/main/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIO.java @@ -17,9 +17,9 @@ import java.io.OutputStream; import java.io.PrintWriter; +import java.util.LinkedHashMap; +import java.util.Map; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.concept.StateIDs; import net.automatalib.automaton.transducer.MealyMachine; @@ -83,8 +83,8 @@ private void writeETFInternal(PrintWriter pw, MealyMachine me mealy.getStates().forEach(s -> pw.printf("\"%s\"%n", s)); pw.println("end sort"); - // create a new bi-map that contains indices for the output alphabet - final BiMap outputIndices = HashBiMap.create(); + // create a new (insertion stable) map that contains indices for the output alphabet + final Map outputIndices = new LinkedHashMap<>(); // write the transitions pw.println("begin trans"); @@ -112,8 +112,8 @@ private void writeETFInternal(PrintWriter pw, MealyMachine me // write the letters in the output alphabet pw.println("begin sort output"); - for (int i = 0; i < outputIndices.size(); i++) { - pw.printf("\"%s\"%n", outputIndices.inverse().get(i)); + for (O o : outputIndices.keySet()) { + pw.printf("\"%s\"%n", o); } pw.println("end sort"); } diff --git a/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/DFA2ETFWriterTest.java b/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/DFA2ETFWriterTest.java index 919b0cdfe5..a1e9265ac9 100644 --- a/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/DFA2ETFWriterTest.java +++ b/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/DFA2ETFWriterTest.java @@ -16,12 +16,11 @@ package net.automatalib.serialization.etf.writer; import java.io.ByteArrayOutputStream; +import java.io.OutputStream; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.Random; -import com.google.common.io.ByteStreams; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.DFA; @@ -49,9 +48,9 @@ public void testWrite() throws Exception { DFA2ETFWriter.getInstance().writeModel(baos, automaton, alphabet); - final String expected = CharStreams.toString(r); + final String expected = IOUtil.toString(r); - Assert.assertEquals(baos.toString(StandardCharsets.UTF_8.toString()), expected); + Assert.assertEquals(baos.toString(StandardCharsets.UTF_8), expected); } } @@ -66,9 +65,9 @@ public void testEmptyLanguage() throws Exception { DFA2ETFWriter.getInstance().writeModel(baos, emptyLanguage, alphabet); - final String expected = CharStreams.toString(r); + final String expected = IOUtil.toString(r); - Assert.assertEquals(baos.toString(StandardCharsets.UTF_8.toString()), expected); + Assert.assertEquals(baos.toString(StandardCharsets.UTF_8), expected); } } @@ -77,7 +76,7 @@ public void doNotCloseOutputStreamTest() { final Alphabet alphabet = Alphabets.characters('a', 'c'); final DFA automaton = RandomAutomata.randomDFA(new Random(0), 10, alphabet); - DFA2ETFWriter.getInstance().writeModel(new UnclosableOutputStream(ByteStreams.nullOutputStream()), + DFA2ETFWriter.getInstance().writeModel(new UnclosableOutputStream(OutputStream.nullOutputStream()), automaton, alphabet); } diff --git a/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternatingTest.java b/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternatingTest.java index 86b7c77ea5..37ac4c3286 100644 --- a/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternatingTest.java +++ b/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterAlternatingTest.java @@ -16,12 +16,11 @@ package net.automatalib.serialization.etf.writer; import java.io.ByteArrayOutputStream; +import java.io.OutputStream; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.Random; -import com.google.common.io.ByteStreams; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.transducer.MealyMachine; @@ -49,9 +48,9 @@ public void testWrite() throws Exception { Mealy2ETFWriterAlternating.getInstance().writeModel(baos, automaton, alphabet); - final String expected = CharStreams.toString(r); + final String expected = IOUtil.toString(r); - Assert.assertEquals(baos.toString(StandardCharsets.UTF_8.toString()), expected); + Assert.assertEquals(baos.toString(StandardCharsets.UTF_8), expected); } } @@ -61,9 +60,9 @@ public void doNotCloseOutputStreamTest() { final MealyMachine automaton = RandomAutomata.randomMealy(new Random(0), 10, alphabet, alphabet); - Mealy2ETFWriterAlternating.getInstance().writeModel(new UnclosableOutputStream(ByteStreams - .nullOutputStream()), - automaton, - alphabet); + Mealy2ETFWriterAlternating.getInstance() + .writeModel(new UnclosableOutputStream(OutputStream.nullOutputStream()), + automaton, + alphabet); } } diff --git a/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIOTest.java b/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIOTest.java index f3effc6458..0c93990942 100644 --- a/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIOTest.java +++ b/serialization/etf/src/test/java/net/automatalib/serialization/etf/writer/Mealy2ETFWriterIOTest.java @@ -16,12 +16,11 @@ package net.automatalib.serialization.etf.writer; import java.io.ByteArrayOutputStream; +import java.io.OutputStream; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.Random; -import com.google.common.io.ByteStreams; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.transducer.MealyMachine; @@ -49,9 +48,9 @@ public void testWrite() throws Exception { Mealy2ETFWriterIO.getInstance().writeModel(baos, automaton, alphabet); - final String expected = CharStreams.toString(r); + final String expected = IOUtil.toString(r); - Assert.assertEquals(baos.toString(StandardCharsets.UTF_8.toString()), expected); + Assert.assertEquals(baos.toString(StandardCharsets.UTF_8), expected); } } @@ -61,8 +60,7 @@ public void doNotCloseOutputStreamTest() { final MealyMachine automaton = RandomAutomata.randomMealy(new Random(0), 10, alphabet, alphabet); - Mealy2ETFWriterIO.getInstance().writeModel(new UnclosableOutputStream(ByteStreams.nullOutputStream()), - automaton, - alphabet); + Mealy2ETFWriterIO.getInstance() + .writeModel(new UnclosableOutputStream(OutputStream.nullOutputStream()), automaton, alphabet); } } diff --git a/serialization/fsm/pom.xml b/serialization/fsm/pom.xml index cd47bc0d79..c08e0c3c70 100644 --- a/serialization/fsm/pom.xml +++ b/serialization/fsm/pom.xml @@ -46,12 +46,6 @@ limitations under the License. automata-core - - - com.google.guava - guava - - org.checkerframework diff --git a/serialization/fsm/src/main/java/net/automatalib/serialization/fsm/parser/FSM2MealyParserAlternating.java b/serialization/fsm/src/main/java/net/automatalib/serialization/fsm/parser/FSM2MealyParserAlternating.java index 2e37529a46..9b871a2478 100644 --- a/serialization/fsm/src/main/java/net/automatalib/serialization/fsm/parser/FSM2MealyParserAlternating.java +++ b/serialization/fsm/src/main/java/net/automatalib/serialization/fsm/parser/FSM2MealyParserAlternating.java @@ -17,14 +17,16 @@ import java.io.IOException; import java.io.StreamTokenizer; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.function.Function; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; import net.automatalib.automaton.concept.Output; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.common.util.Pair; @@ -61,7 +63,7 @@ public final class FSM2MealyParserAlternating extends AbstractFSM2MealyPar /** * A multimap containing all outgoing transitions from a state in the FSM source. */ - private final Multimap> transitionsFSM = ArrayListMultimap.create(); + private final Map>> transitionsFSM; /** * @see FSM2MealyParserAlternating @@ -74,6 +76,7 @@ private FSM2MealyParserAlternating(@Nullable Collection targetInput Function outputParser) { super(targetInputs, inputParser, outputParser); this.output = output; + this.transitionsFSM = new HashMap<>(); } /** @@ -122,7 +125,8 @@ protected void parseTransition(StreamTokenizer streamTokenizer) throws IOExcepti final String letter = streamTokenizer.sval; // create a transition - final boolean isNew = transitionsFSM.put(from, Pair.of(letter, to)); + final boolean isNew = + transitionsFSM.computeIfAbsent(from, (k) -> new ArrayList<>()).add(Pair.of(letter, to)); // test for non-determinism if (!isNew) { @@ -163,7 +167,8 @@ private void makeTransitions(Integer currentState, @Nullable Pair in newStates.remove(currentState); // collect all outgoing transitions from currentState - final Collection> targets = transitionsFSM.get(currentState); + final Collection> targets = + transitionsFSM.getOrDefault(currentState, Collections.emptyList()); // check if we need to compute an undefined output. if (inputTrans != null && targets.isEmpty()) { @@ -180,7 +185,8 @@ private void makeTransitions(Integer currentState, @Nullable Pair in throw new FSMFormatException(String.format(NON_DETERMINISM_DETECTED, prev), streamTokenizer); } } else { - throw new FSMFormatException(String.format(INPUT_HAS_NO_OUTPUT, inputTrans.getSecond(), + throw new FSMFormatException(String.format(INPUT_HAS_NO_OUTPUT, + inputTrans.getSecond(), inputTrans.getFirst()), streamTokenizer); } } diff --git a/serialization/learnlibv2/src/main/java/module-info.java b/serialization/learnlibv2/src/main/java/module-info.java index 48826ddaf6..d9f2651642 100644 --- a/serialization/learnlibv2/src/main/java/module-info.java +++ b/serialization/learnlibv2/src/main/java/module-info.java @@ -28,7 +28,6 @@ */ open module net.automatalib.serialization.learnlibv2 { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.core; diff --git a/serialization/taf/pom.xml b/serialization/taf/pom.xml index 81b8355a36..9ffd28342b 100644 --- a/serialization/taf/pom.xml +++ b/serialization/taf/pom.xml @@ -52,12 +52,6 @@ limitations under the License. checker-qual - - - com.google.guava - guava - - net.automatalib diff --git a/serialization/taf/src/main/java/module-info.java b/serialization/taf/src/main/java/module-info.java index b10be1adbc..d1f7925277 100644 --- a/serialization/taf/src/main/java/module-info.java +++ b/serialization/taf/src/main/java/module-info.java @@ -28,10 +28,10 @@ */ open module net.automatalib.serialization.taf { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.core; + requires org.checkerframework.checker.qual; exports net.automatalib.serialization.taf; exports net.automatalib.serialization.taf.parser; diff --git a/serialization/taf/src/main/java/net/automatalib/serialization/taf/writer/TAFWriter.java b/serialization/taf/src/main/java/net/automatalib/serialization/taf/writer/TAFWriter.java index 892de6d78b..2543c9703c 100644 --- a/serialization/taf/src/main/java/net/automatalib/serialization/taf/writer/TAFWriter.java +++ b/serialization/taf/src/main/java/net/automatalib/serialization/taf/writer/TAFWriter.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -29,13 +30,13 @@ import java.util.function.Function; import java.util.regex.Pattern; -import com.google.common.collect.Maps; import net.automatalib.automaton.Automaton; import net.automatalib.automaton.FiniteAlphabetAutomaton; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.automaton.concept.StateIDs; import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.transducer.MealyMachine; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.IOUtil; import net.automatalib.common.util.Pair; import net.automatalib.common.util.string.StringUtil; @@ -115,7 +116,7 @@ private void doWriteAutomaton(UniversalDeterministicAutomaton, List> groupedTransitions = Maps.newHashMapWithExpectedSize(inputs.size()); + final Map, List> groupedTransitions = new HashMap<>(HashUtil.capacity(inputs.size())); for (I i : inputs) { final T t = automaton.getTransition(state, i); diff --git a/util/pom.xml b/util/pom.xml index 68e1fc6484..9c7c291db6 100644 --- a/util/pom.xml +++ b/util/pom.xml @@ -53,12 +53,6 @@ limitations under the License. automata-core - - - com.google.guava - guava - - de.learnlib.tooling diff --git a/util/src/main/java/module-info.java b/util/src/main/java/module-info.java index 5d85608720..1fb1e80bbf 100644 --- a/util/src/main/java/module-info.java +++ b/util/src/main/java/module-info.java @@ -29,7 +29,6 @@ */ open module net.automatalib.util { - requires com.google.common; requires net.automatalib.api; requires net.automatalib.common.util; requires net.automatalib.common.smartcollection; diff --git a/util/src/main/java/net/automatalib/util/automaton/Automata.java b/util/src/main/java/net/automatalib/util/automaton/Automata.java index f17d2c2fdf..fd2ffe35b3 100644 --- a/util/src/main/java/net/automatalib/util/automaton/Automata.java +++ b/util/src/main/java/net/automatalib/util/automaton/Automata.java @@ -25,7 +25,7 @@ import net.automatalib.automaton.MutableDeterministic; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.automaton.graph.TransitionEdge; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.graph.Graph; import net.automatalib.graph.UniversalGraph; import net.automatalib.util.automaton.cover.Covers; @@ -101,7 +101,7 @@ public static Graph> asGraph(Automaton> A invasiveMinimize(A automaton, Collection inputs) { - final List inputList = CollectionsUtil.randomAccessList(inputs); + final List inputList = CollectionUtil.randomAccessList(inputs); int numInputs = inputs.size(); diff --git a/util/src/main/java/net/automatalib/util/automaton/ads/ADSUtil.java b/util/src/main/java/net/automatalib/util/automaton/ads/ADSUtil.java index c47ed40474..9a0bb777a5 100644 --- a/util/src/main/java/net/automatalib/util/automaton/ads/ADSUtil.java +++ b/util/src/main/java/net/automatalib/util/automaton/ads/ADSUtil.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.Set; -import com.google.common.math.LongMath; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.common.util.Pair; import net.automatalib.graph.ads.ADSNode; @@ -150,7 +149,25 @@ public static long computeMaximumSplittingWordLength(int n, int i, int m) { return n; } - return LongMath.binomial(n, i) - LongMath.binomial(m - 1, i - 1) - 1; + return binomial(n, i) - binomial(m - 1, i - 1) + 1; + } + + private static long binomial(int n, int k) { + + // abuse symmetry + final int effectiveK = Math.min(k, n - k); + long result = 1; + + try { + for (int i = 1; i <= effectiveK; i++) { + result = Math.multiplyExact(result, n + 1 - i); + result /= i; + } + + return result; + } catch (ArithmeticException ae) { + return Long.MAX_VALUE; + } } } diff --git a/util/src/main/java/net/automatalib/util/automaton/ads/BacktrackingSearch.java b/util/src/main/java/net/automatalib/util/automaton/ads/BacktrackingSearch.java index b1540b260a..29e3c3d4eb 100644 --- a/util/src/main/java/net/automatalib/util/automaton/ads/BacktrackingSearch.java +++ b/util/src/main/java/net/automatalib/util/automaton/ads/BacktrackingSearch.java @@ -28,11 +28,11 @@ import java.util.function.Function; import java.util.stream.Collectors; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.concept.StateIDs; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.common.smartcollection.ReflexiveMapView; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.graph.ads.ADSNode; import net.automatalib.graph.ads.impl.ADSLeafNode; @@ -326,7 +326,7 @@ private static Optional> exploreSearchSpace(Me if (successors.size() > 1) { - successorsForInputSymbol = Maps.newHashMapWithExpectedSize(successors.size()); + successorsForInputSymbol = new HashMap<>(HashUtil.capacity(successors.size())); int partitionCosts = 0; for (Map.Entry> entry : successors.entrySet()) { diff --git a/util/src/main/java/net/automatalib/util/automaton/ads/LeeYannakakis.java b/util/src/main/java/net/automatalib/util/automaton/ads/LeeYannakakis.java index fd2e83e196..bd1fc46e27 100644 --- a/util/src/main/java/net/automatalib/util/automaton/ads/LeeYannakakis.java +++ b/util/src/main/java/net/automatalib/util/automaton/ads/LeeYannakakis.java @@ -25,13 +25,10 @@ import java.util.function.Function; import java.util.stream.Collectors; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.common.smartcollection.ReflexiveMapView; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.graph.ads.ADSNode; import net.automatalib.graph.ads.impl.ADSLeafNode; @@ -87,7 +84,7 @@ private static SplitTreeResult computeSplitTree(MealyMachine< Alphabet input) { final SplitTree st = new SplitTree<>(new HashSet<>(automaton.getStates())); - final Set> leaves = Sets.newHashSetWithExpectedSize(automaton.size()); + final Set> leaves = new HashSet<>(HashUtil.capacity(automaton.size())); leaves.add(st); while (leaves.stream().anyMatch(LeeYannakakis::needsRefinement)) { @@ -291,7 +288,7 @@ private static Map, SplitTree>>> c final Map, SplitTree>>> result = new EnumMap<>(Validity.class); final Map stateToPartitionMap = new HashMap<>(); - final BiMap> partitionToNodeMap = HashBiMap.create(); + final Map, Integer> nodeToPartitionMap = new HashMap<>(HashUtil.capacity(pi.size())); int counter = 0; for (SplitTree partition : pi) { @@ -299,8 +296,7 @@ private static Map, SplitTree>>> c final Integer previousValue = stateToPartitionMap.put(s, counter); assert previousValue == null : "Not a true partition"; } - partitionToNodeMap.put(counter, partition); - counter++; + nodeToPartitionMap.put(partition, counter++); } for (Validity v : Validity.values()) { @@ -310,9 +306,9 @@ private static Map, SplitTree>>> c final Set> pendingCs = new HashSet<>(); final Map partitionToClassificationMap = new HashMap<>(); - final CompactSimpleGraph implicationGraph = new CompactSimpleGraph<>(partitionToNodeMap.size()); + final CompactSimpleGraph implicationGraph = new CompactSimpleGraph<>(nodeToPartitionMap.size()); - for (int i = 0; i < partitionToNodeMap.size(); i++) { + for (int i = 0; i < nodeToPartitionMap.size(); i++) { implicationGraph.addIntNode(); } @@ -320,7 +316,7 @@ private static Map, SplitTree>>> c for (SplitTree b : r) { // general validity - final Map validInputMap = Maps.newHashMapWithExpectedSize(inputs.size()); + final Map validInputMap = new HashMap<>(HashUtil.capacity(inputs.size())); for (I i : inputs) { validInputMap.put(i, isValidInput(automaton, i, b.getPartition())); } @@ -395,7 +391,7 @@ private static Map, SplitTree>>> c pendingCLoop: for (SplitTree pendingC : pendingCs) { - final Integer pendingPartition = partitionToNodeMap.inverse().get(pendingC); + final Integer pendingPartition = nodeToPartitionMap.get(pendingC); final Iterator iter = GraphTraversal.breadthFirstIterator(implicationGraph, Collections.singleton(pendingPartition)); diff --git a/util/src/main/java/net/automatalib/util/automaton/conformance/ProceduralWMethodTestsIterator.java b/util/src/main/java/net/automatalib/util/automaton/conformance/ProceduralWMethodTestsIterator.java index 007a7c6201..875336e51f 100644 --- a/util/src/main/java/net/automatalib/util/automaton/conformance/ProceduralWMethodTestsIterator.java +++ b/util/src/main/java/net/automatalib/util/automaton/conformance/ProceduralWMethodTestsIterator.java @@ -22,12 +22,12 @@ import java.util.List; import java.util.Map; -import com.google.common.collect.Iterators; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.common.util.collection.AbstractThreeLevelIterator; import net.automatalib.common.util.collection.AbstractTwoLevelIterator; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.collection.ReusableIterator; import net.automatalib.util.automaton.cover.Covers; import net.automatalib.util.automaton.equivalence.CharacterizingSets; @@ -123,7 +123,7 @@ private Iterator> proceduralTestWords(M automaton) { // we need sCov in both iterators but cSet only in the continuable one. // therefore, start with the non-continuable one in hopes of saving unnecessary computations - return Iterators.concat(nonContinuableIter, continuableIter); + return IteratorUtil.concat(nonContinuableIter, continuableIter); } private class ContinuableIterator extends AbstractThreeLevelIterator, List>, List, Word> { @@ -139,12 +139,12 @@ private class ContinuableIterator extends AbstractThreeLevelIterator, Li @Override protected Iterator>> l2Iterator(Word cSet) { final Iterator>> epsilon = ((List>>) (List) EPSILON).iterator(); - return Iterators.concat(epsilon, CollectionsUtil.cartesianProduct(sCov, continuableWords).iterator()); + return IteratorUtil.concat(epsilon, IterableUtil.cartesianProduct(sCov, continuableWords).iterator()); } @Override protected Iterator> l3Iterator(Word cSet, List> tCov) { - return CollectionsUtil.allTuples(continuableSymbols, 0, maxDepth).iterator(); + return IterableUtil.allTuples(continuableSymbols, 0, maxDepth).iterator(); } @Override diff --git a/util/src/main/java/net/automatalib/util/automaton/conformance/StrictPriorityQueue.java b/util/src/main/java/net/automatalib/util/automaton/conformance/StrictPriorityQueue.java index ff5a8a85a1..efae3e6f12 100644 --- a/util/src/main/java/net/automatalib/util/automaton/conformance/StrictPriorityQueue.java +++ b/util/src/main/java/net/automatalib/util/automaton/conformance/StrictPriorityQueue.java @@ -19,8 +19,8 @@ import java.util.Comparator; import java.util.Iterator; -import com.google.common.collect.Iterators; -import net.automatalib.common.smartcollection.ResizingArrayStorage; +import net.automatalib.common.util.array.ArrayUtil; +import net.automatalib.common.util.array.ResizingArrayStorage; import org.checkerframework.checker.nullness.qual.Nullable; /** @@ -165,7 +165,7 @@ private void downHeap() { @Override public Iterator iterator() { - return Iterators.forArray(storage.array); + return ArrayUtil.iterator(storage.array); } @Override diff --git a/util/src/main/java/net/automatalib/util/automaton/conformance/WMethodTestsIterator.java b/util/src/main/java/net/automatalib/util/automaton/conformance/WMethodTestsIterator.java index 81024522c4..9092fa5e9f 100644 --- a/util/src/main/java/net/automatalib/util/automaton/conformance/WMethodTestsIterator.java +++ b/util/src/main/java/net/automatalib/util/automaton/conformance/WMethodTestsIterator.java @@ -20,10 +20,10 @@ import java.util.Iterator; import java.util.List; -import com.google.common.collect.Iterators; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.common.util.collection.AbstractThreeLevelIterator; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.collection.ReusableIterator; import net.automatalib.util.automaton.cover.Covers; import net.automatalib.util.automaton.equivalence.CharacterizingSets; @@ -72,8 +72,8 @@ public WMethodTestsIterator(UniversalDeterministicAutomaton autom public WMethodTestsIterator(UniversalDeterministicAutomaton automaton, Collection inputs, int maxDepth) { - super(Iterators.concat(Iterators.singletonIterator(Word.epsilon()), - Covers.transitionCoverIterator(automaton, inputs))); + super(IteratorUtil.concat(IteratorUtil.singleton(Word.epsilon()), + Covers.transitionCoverIterator(automaton, inputs))); this.inputs = inputs; this.maxDepth = maxDepth; @@ -91,7 +91,7 @@ public WMethodTestsIterator(UniversalDeterministicAutomaton autom @Override protected Iterator> l2Iterator(Word l1Object) { - return CollectionsUtil.allTuples(inputs, 0, maxDepth).iterator(); + return IterableUtil.allTuples(inputs, 0, maxDepth).iterator(); } @Override diff --git a/util/src/main/java/net/automatalib/util/automaton/conformance/WpMethodTestsIterator.java b/util/src/main/java/net/automatalib/util/automaton/conformance/WpMethodTestsIterator.java index 8b5bdf281f..df9341b56c 100644 --- a/util/src/main/java/net/automatalib/util/automaton/conformance/WpMethodTestsIterator.java +++ b/util/src/main/java/net/automatalib/util/automaton/conformance/WpMethodTestsIterator.java @@ -17,16 +17,16 @@ import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; -import com.google.common.collect.ForwardingIterator; -import com.google.common.collect.Iterators; -import com.google.common.collect.Sets; import net.automatalib.automaton.UniversalDeterministicAutomaton; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.collection.AbstractThreeLevelIterator; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.cover.Covers; @@ -44,7 +44,7 @@ * @param * input symbol type */ -public class WpMethodTestsIterator extends ForwardingIterator> { +public class WpMethodTestsIterator implements Iterator> { private final Iterator> wpIterator; @@ -76,8 +76,8 @@ public WpMethodTestsIterator(UniversalDeterministicAutomaton auto Collection inputs, int maxDepth) { - final Set> stateCover = Sets.newHashSetWithExpectedSize(automaton.size()); - final Set> transitionCover = Sets.newHashSetWithExpectedSize(automaton.size() * inputs.size()); + final Set> stateCover = new HashSet<>(HashUtil.capacity(automaton.size())); + final Set> transitionCover = new HashSet<>(HashUtil.capacity(automaton.size() * inputs.size())); Covers.cover(automaton, inputs, stateCover, transitionCover); @@ -86,12 +86,12 @@ public WpMethodTestsIterator(UniversalDeterministicAutomaton auto // Special case: List of characterizing suffixes may be empty, // but in this case we still need to iterate over the prefixes! if (!characterizingIter.hasNext()) { - characterizingIter = Iterators.singletonIterator(Word.epsilon()); + characterizingIter = IteratorUtil.singleton(Word.epsilon()); } // Phase 1: state cover * middle part * global suffixes final Iterator> firstIterator = new FirstPhaseIterator<>(stateCover, - CollectionsUtil.allTuples(inputs, 0, maxDepth), + IterableUtil.allTuples(inputs, 0, maxDepth), characterizingIter); // Phase 2: transitions (not in state cover) * middle part * local suffixes @@ -99,16 +99,21 @@ public WpMethodTestsIterator(UniversalDeterministicAutomaton auto final Iterator> secondIterator = new SecondPhaseIterator<>(automaton, inputs, transitionCover, - CollectionsUtil.allTuples(inputs, - 0, - maxDepth)); + IterableUtil.allTuples(inputs, + 0, + maxDepth)); - wpIterator = Iterators.concat(firstIterator, secondIterator); + wpIterator = IteratorUtil.concat(firstIterator, secondIterator); } @Override - protected Iterator> delegate() { - return wpIterator; + public boolean hasNext() { + return this.wpIterator.hasNext(); + } + + @Override + public Word next() { + return this.wpIterator.next(); } private static class FirstPhaseIterator extends AbstractThreeLevelIterator, List, Word, Word> { diff --git a/util/src/main/java/net/automatalib/util/automaton/cover/Covers.java b/util/src/main/java/net/automatalib/util/automaton/cover/Covers.java index 578b6e5b05..5102206e63 100644 --- a/util/src/main/java/net/automatalib/util/automaton/cover/Covers.java +++ b/util/src/main/java/net/automatalib/util/automaton/cover/Covers.java @@ -18,13 +18,14 @@ import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.Queue; import java.util.function.BiFunction; import java.util.function.Consumer; -import com.google.common.collect.Sets; import net.automatalib.automaton.DeterministicAutomaton; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; @@ -445,7 +446,7 @@ private static void incrementalCover(DeterministicAutomaton auto // We enforce that the initial state *always* is covered by the empty word, // regardless of whether other sequence in oldCover cover it - Record initRec = new Record<>(init, Word.epsilon(), Sets.newHashSetWithExpectedSize(inputs.size())); + Record initRec = new Record<>(init, Word.epsilon(), new HashSet<>(HashUtil.capacity(inputs.size()))); bfsQueue.add(initRec); reach.put(init, initRec); @@ -457,7 +458,7 @@ private static void incrementalCover(DeterministicAutomaton auto oldStateCover, (s, as) -> new Record<>(s, as, - Sets.newHashSetWithExpectedSize(inputs.size()))); + new HashSet<>(HashUtil.capacity(inputs.size())))); // Add transition cover information from *state covers* for (Word oldStateAs : oldStateCover) { @@ -488,7 +489,7 @@ private static void incrementalCover(DeterministicAutomaton auto bfsQueue, automaton, oldTransCover, - (s, as) -> new Record<>(s, as, Sets.newHashSetWithExpectedSize(inputs.size())), + (s, as) -> new Record<>(s, as, new HashSet<>(HashUtil.capacity(inputs.size()))), newStateCover); Record curr; @@ -504,7 +505,7 @@ private static void incrementalCover(DeterministicAutomaton auto if (succRec == null) { // new state! - succRec = new Record<>(succ, newAs, Sets.newHashSetWithExpectedSize(inputs.size())); + succRec = new Record<>(succ, newAs, new HashSet<>(HashUtil.capacity(inputs.size()))); bfsQueue.add(succRec); reach.put(succ, succRec); diff --git a/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalStateCoverIterator.java b/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalStateCoverIterator.java index 2dee91f21e..f430ab69c5 100644 --- a/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalStateCoverIterator.java +++ b/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalStateCoverIterator.java @@ -20,8 +20,8 @@ import java.util.Iterator; import java.util.Queue; -import com.google.common.collect.AbstractIterator; import net.automatalib.automaton.DeterministicAutomaton; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; @@ -40,7 +40,7 @@ * * @see Covers#stateCover(DeterministicAutomaton, Collection, Collection) */ -class IncrementalStateCoverIterator extends AbstractIterator> { +class IncrementalStateCoverIterator extends AbstractSimplifiedIterator> { private final DeterministicAutomaton automaton; private final Collection inputs; @@ -63,16 +63,23 @@ class IncrementalStateCoverIterator extends AbstractIterator> { } @Override - protected Word computeNext() { + protected boolean calculateNext() { // first invocation if (inputIterator == null) { - boolean hasEpsilon = initialize(); + final S init = automaton.getInitialState(); + + if (init == null) { + return false; + } + + boolean hasEpsilon = initialize(init); curr = bfsQueue.poll(); inputIterator = inputs.iterator(); if (!hasEpsilon) { - return Word.epsilon(); + super.nextValue = Word.epsilon(); + return true; } } @@ -93,7 +100,8 @@ protected Word computeNext() { Record succRec = new Record<>(succ, succAs); reach.put(succ, succRec); bfsQueue.add(succRec); - return succAs; + super.nextValue = succAs; + return true; } } @@ -101,18 +109,10 @@ protected Word computeNext() { inputIterator = inputs.iterator(); } - return endOfData(); + return false; } - private boolean initialize() { - - final S init = automaton.getInitialState(); - - if (init == null) { - // abuse the fact that endOfData() mutates our state, so we effectively construct the empty iterator here. - endOfData(); - return false; - } + private boolean initialize(S init) { Covers.buildReachFromStateCover(reach, bfsQueue, automaton, oldCover, Record::new); diff --git a/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalTransitionCoverIterator.java b/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalTransitionCoverIterator.java index 3d1a8066cb..ed106e57be 100644 --- a/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalTransitionCoverIterator.java +++ b/util/src/main/java/net/automatalib/util/automaton/cover/IncrementalTransitionCoverIterator.java @@ -17,19 +17,20 @@ import java.util.ArrayDeque; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.Queue; -import com.google.common.collect.AbstractIterator; -import com.google.common.collect.Sets; import net.automatalib.automaton.DeterministicAutomaton; +import net.automatalib.common.util.HashUtil; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; /** - * An iterator for the transition cover of an automaton. Words are computed lazily (i.e., only when request by {@link - * #next()}). + * An iterator for the transition cover of an automaton. Words are computed lazily (i.e., only when request by + * {@link #next()}). *

* Supports incremental computation, i.e. given a set of cover traces, only sequences for transitions not covered by * these traces are returned. @@ -41,7 +42,7 @@ * * @see Covers#transitionCover(DeterministicAutomaton, Collection, Collection) */ -class IncrementalTransitionCoverIterator extends AbstractIterator> { +class IncrementalTransitionCoverIterator extends AbstractSimplifiedIterator> { private final DeterministicAutomaton automaton; private final Collection inputs; @@ -64,13 +65,13 @@ class IncrementalTransitionCoverIterator extends AbstractIterator> } @Override - protected Word computeNext() { + protected boolean calculateNext() { // first invocation if (inputIterator == null) { final S init = automaton.getInitialState(); if (init == null) { - return endOfData(); + return false; } initialize(init); @@ -91,12 +92,13 @@ protected Word computeNext() { if (reach.get(succ) == null) { final Record succRec = - new Record<>(succ, succAs, Sets.newHashSetWithExpectedSize(inputs.size())); + new Record<>(succ, succAs, new HashSet<>(HashUtil.capacity(inputs.size()))); reach.put(succ, succRec); bfsQueue.add(succRec); } - return succAs; + super.nextValue = succAs; + return true; } } } @@ -105,11 +107,12 @@ protected Word computeNext() { inputIterator = inputs.iterator(); } - return endOfData(); + return false; } private void initialize(S init) { - final Record initRec = new Record<>(init, Word.epsilon(), Sets.newHashSetWithExpectedSize(inputs.size())); + final Record initRec = + new Record<>(init, Word.epsilon(), new HashSet<>(HashUtil.capacity(inputs.size()))); reach.put(init, initRec); bfsQueue.add(initRec); @@ -119,7 +122,7 @@ private void initialize(S init) { oldCover, (s, as) -> new Record<>(s, as, - Sets.newHashSetWithExpectedSize(inputs.size())), + new HashSet<>(HashUtil.capacity(inputs.size()))), (w) -> {}); } } diff --git a/util/src/main/java/net/automatalib/util/automaton/equivalence/Bisimulation.java b/util/src/main/java/net/automatalib/util/automaton/equivalence/Bisimulation.java index 6aadaf845e..21a43aaf1b 100644 --- a/util/src/main/java/net/automatalib/util/automaton/equivalence/Bisimulation.java +++ b/util/src/main/java/net/automatalib/util/automaton/equivalence/Bisimulation.java @@ -16,11 +16,12 @@ package net.automatalib.util.automaton.equivalence; import java.util.Collection; +import java.util.HashSet; import java.util.Objects; import java.util.Set; -import com.google.common.collect.Sets; import net.automatalib.automaton.Automaton; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; public final class Bisimulation { @@ -34,8 +35,8 @@ public static , BS, BT, B extends Auto B b, Collection inputs) { - Set> bisim = Sets.newHashSetWithExpectedSize(a.size() * b.size()); - Set> change = Sets.newHashSetWithExpectedSize(a.size() * b.size()); + Set> bisim = new HashSet<>(HashUtil.capacity(a.size() * b.size())); + Set> change = new HashSet<>(HashUtil.capacity(a.size() * b.size())); boolean empty; diff --git a/util/src/main/java/net/automatalib/util/automaton/equivalence/CharacterizingSets.java b/util/src/main/java/net/automatalib/util/automaton/equivalence/CharacterizingSets.java index f22f54a6f8..04d5c1cd76 100644 --- a/util/src/main/java/net/automatalib/util/automaton/equivalence/CharacterizingSets.java +++ b/util/src/main/java/net/automatalib/util/automaton/equivalence/CharacterizingSets.java @@ -26,10 +26,10 @@ import java.util.Objects; import java.util.Queue; -import com.google.common.collect.AbstractIterator; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.automaton.fsa.FiniteStateAcceptor; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.util.automaton.Automata; import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.NonNull; @@ -218,7 +218,7 @@ public static boolean findIncrementalCharacterizingSet(UniversalDetermini boolean refined = false; // We need a list to ensure a stable iteration order - List> oldSuffixList = CollectionsUtil.randomAccessList(oldSuffixes); + List> oldSuffixList = CollectionUtil.randomAccessList(oldSuffixes); Queue> blocks = buildInitialBlocks(automaton, oldSuffixList); @@ -377,7 +377,7 @@ private static void cluster(UniversalDeterministicAutomaton extends AbstractIterator> { + private static class IncrementalCharacterizingSetIterator extends AbstractSimplifiedIterator> { private final UniversalDeterministicAutomaton automaton; private final Collection inputs; @@ -389,27 +389,27 @@ private static class IncrementalCharacterizingSetIterator extends Abstract Collection> oldSuffixes) { this.automaton = automaton; this.inputs = inputs; - this.oldSuffixes = CollectionsUtil.randomAccessList(oldSuffixes); + this.oldSuffixes = CollectionUtil.randomAccessList(oldSuffixes); } @Override - protected Word computeNext() { - + protected boolean calculateNext() { // first call if (blocks == null) { blocks = buildInitialBlocks(automaton, oldSuffixes); if (!oldSuffixes.contains(Word.epsilon()) && epsilonRefine(automaton, blocks)) { - return Word.epsilon(); + super.nextValue = Word.epsilon(); + return true; } } final Word suffix = refine(automaton, inputs, blocks); if (suffix != null) { - return suffix; + super.nextValue = suffix; + return true; } - - return endOfData(); + return false; } } } diff --git a/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSBA.java b/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSBA.java index fb550d1b94..ce0047398c 100644 --- a/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSBA.java +++ b/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSBA.java @@ -18,15 +18,16 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import com.google.common.collect.Maps; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.procedural.SBA; +import net.automatalib.common.util.HashUtil; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.graph.ProceduralModalProcessGraph; import net.automatalib.ts.modal.transition.ProceduralModalEdgeProperty; @@ -49,7 +50,7 @@ class CFMPSViewSBA implements ContextFreeModalProcessSystem { this.sba = sba; final Map> procedures = sba.getProcedures(); - this.pmpgs = Maps.newHashMapWithExpectedSize(procedures.size()); + this.pmpgs = new HashMap<>(HashUtil.capacity(procedures.size())); for (Entry> e : procedures.entrySet()) { this.pmpgs.put(e.getKey(), new MPGView<>(sba, e.getKey(), e.getValue())); diff --git a/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSPA.java b/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSPA.java index d7909688ea..b90459fa17 100644 --- a/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSPA.java +++ b/util/src/main/java/net/automatalib/util/automaton/procedural/CFMPSViewSPA.java @@ -18,15 +18,16 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import com.google.common.collect.Maps; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.procedural.SPA; +import net.automatalib.common.util.HashUtil; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.graph.ProceduralModalProcessGraph; import net.automatalib.ts.modal.transition.ProceduralModalEdgeProperty; @@ -49,7 +50,7 @@ class CFMPSViewSPA implements ContextFreeModalProcessSystem { this.spa = spa; final Map> procedures = spa.getProcedures(); - this.pmpgs = Maps.newHashMapWithExpectedSize(procedures.size()); + this.pmpgs = new HashMap<>(HashUtil.capacity(procedures.size())); for (Entry> e : procedures.entrySet()) { this.pmpgs.put(e.getKey(), new MPGView<>(spa, e.getKey(), e.getValue())); diff --git a/util/src/main/java/net/automatalib/util/automaton/procedural/NSEVPAConverter.java b/util/src/main/java/net/automatalib/util/automaton/procedural/NSEVPAConverter.java index a706ee4270..54bfe68027 100644 --- a/util/src/main/java/net/automatalib/util/automaton/procedural/NSEVPAConverter.java +++ b/util/src/main/java/net/automatalib/util/automaton/procedural/NSEVPAConverter.java @@ -25,7 +25,6 @@ import java.util.Map.Entry; import java.util.Objects; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.fsa.DFA; @@ -34,6 +33,7 @@ import net.automatalib.automaton.vpa.SEVPA; import net.automatalib.automaton.vpa.impl.DefaultNSEVPA; import net.automatalib.automaton.vpa.impl.Location; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.copy.AutomatonCopyMethod; @@ -57,7 +57,7 @@ public static SEVPA convert(SPA spa) { final ATRSequences atrSequences = SPAs.computeATRSequences(spa); final ProceduralInputAlphabet inputAlphabet = spa.getInputAlphabet(); final Map<@Nullable I, List, Word>>> contextPairs = - Maps.newHashMapWithExpectedSize(inputAlphabet.getNumCalls() + 1); + new HashMap<>(HashUtil.capacity(inputAlphabet.getNumCalls() + 1)); contextPairs.put(null, Collections.singletonList(Pair.of(Word.epsilon(), Word.epsilon()))); diff --git a/util/src/main/java/net/automatalib/util/automaton/procedural/ProceduralUtil.java b/util/src/main/java/net/automatalib/util/automaton/procedural/ProceduralUtil.java index 3471a00da1..dfb1b5d4f7 100644 --- a/util/src/main/java/net/automatalib/util/automaton/procedural/ProceduralUtil.java +++ b/util/src/main/java/net/automatalib/util/automaton/procedural/ProceduralUtil.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Deque; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -27,10 +28,9 @@ import java.util.Set; import java.util.function.BiPredicate; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.UniversalDeterministicAutomaton; +import net.automatalib.common.util.HashUtil; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.cover.Covers; import net.automatalib.word.Word; @@ -47,7 +47,7 @@ private ProceduralUtil() { ProceduralInputAlphabet alphabet, BiPredicate> tracePredicate) { - final Map> terminatingSequences = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); + final Map> terminatingSequences = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); // initial internal sequences for (I procedure : alphabet.getCallAlphabet()) { @@ -120,8 +120,8 @@ private ProceduralUtil() { return Collections.emptyMap(); } - final Map> accessSequences = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); - final Set finishedProcedures = Sets.newHashSetWithExpectedSize(alphabet.getNumCalls()); + final Map> accessSequences = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); + final Set finishedProcedures = new HashSet<>(HashUtil.capacity(alphabet.getNumCalls())); // initial value accessSequences.put(initialProcedure, Word.fromLetter(initialProcedure)); diff --git a/util/src/main/java/net/automatalib/util/automaton/procedural/SBAs.java b/util/src/main/java/net/automatalib/util/automaton/procedural/SBAs.java index 0f47f349e3..752773f88e 100644 --- a/util/src/main/java/net/automatalib/util/automaton/procedural/SBAs.java +++ b/util/src/main/java/net/automatalib/util/automaton/procedural/SBAs.java @@ -16,6 +16,7 @@ package net.automatalib.util.automaton.procedural; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; @@ -23,7 +24,6 @@ import java.util.Set; import java.util.function.Function; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.fsa.DFA; @@ -33,6 +33,7 @@ import net.automatalib.automaton.procedural.SPA; import net.automatalib.automaton.procedural.SPMM; import net.automatalib.automaton.procedural.impl.StackSPA; +import net.automatalib.common.util.HashUtil; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.ts.TransitionPredicate; import net.automatalib.util.automaton.copy.AutomatonCopyMethod; @@ -342,7 +343,7 @@ public static SPA reduce(SBA sba) { */ public static SPA reduce(SBA sba, ProceduralInputAlphabet alphabet) { final Map> procedures = sba.getProcedures(); - final Map> spaProcedures = Maps.newHashMapWithExpectedSize(procedures.size()); + final Map> spaProcedures = new HashMap<>(HashUtil.capacity(procedures.size())); final Collection proceduralInputs = sba.getProceduralInputs(alphabet); proceduralInputs.remove(alphabet.getReturnSymbol()); diff --git a/util/src/main/java/net/automatalib/util/automaton/procedural/SPAs.java b/util/src/main/java/net/automatalib/util/automaton/procedural/SPAs.java index 025547ded6..b0e8060df6 100644 --- a/util/src/main/java/net/automatalib/util/automaton/procedural/SPAs.java +++ b/util/src/main/java/net/automatalib/util/automaton/procedural/SPAs.java @@ -20,14 +20,13 @@ import java.util.Collection; import java.util.Collections; import java.util.Deque; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Predicate; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.automaton.fsa.DFA; @@ -35,6 +34,7 @@ import net.automatalib.automaton.procedural.SPA; import net.automatalib.automaton.vpa.OneSEVPA; import net.automatalib.automaton.vpa.SEVPA; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.graph.ContextFreeModalProcessSystem; @@ -161,9 +161,9 @@ public static Pair>, Map>> computeAccessAndReturnS final Map> submodels = spa.getProcedures(); final Collection proceduralInputs = spa.getProceduralInputs(alphabet); - final Map> accessSequences = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); - final Map> returnSequences = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); - final Set finishedProcedures = Sets.newHashSetWithExpectedSize(alphabet.getNumCalls()); + final Map> accessSequences = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); + final Map> returnSequences = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); + final Set finishedProcedures = new HashSet<>(HashUtil.capacity(alphabet.getNumCalls())); // initial value accessSequences.put(initialProcedure, Word.fromLetter(initialProcedure)); diff --git a/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomata.java b/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomata.java index 393ff29e58..ac42e94295 100644 --- a/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomata.java +++ b/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomata.java @@ -18,13 +18,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.ProceduralOutputAlphabet; @@ -44,6 +44,7 @@ import net.automatalib.automaton.transducer.impl.CompactMoore; import net.automatalib.automaton.vpa.impl.DefaultOneSEVPA; import net.automatalib.automaton.vpa.impl.Location; +import net.automatalib.common.util.HashUtil; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.fsa.DFAs; import net.automatalib.util.automaton.procedural.SPAs; @@ -182,7 +183,7 @@ public static SPA randomSPA(Random random, SPA result; do { - final Map> dfas = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); + final Map> dfas = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); final Alphabet proceduralAlphabet = alphabet.getProceduralAlphabet(); for (I procedure : alphabet.getCallAlphabet()) { @@ -221,7 +222,7 @@ public static SBA randomSBA(Random random, } } - final Map> dfas = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); + final Map> dfas = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); for (I procedure : alphabet.getCallAlphabet()) { final CompactDFA dfa = new CompactDFA<>(alphabet); @@ -291,7 +292,7 @@ public static SBA randomSBA(Random random, } } - final Map> mealies = Maps.newHashMapWithExpectedSize(inputAlphabet.getNumCalls()); + final Map> mealies = new HashMap<>(HashUtil.capacity(inputAlphabet.getNumCalls())); for (I procedure : inputAlphabet.getCallAlphabet()) { final CompactMealy mealy = new CompactMealy<>(inputAlphabet); diff --git a/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomatonGenerator.java b/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomatonGenerator.java index cb03977d6f..fa145f792d 100644 --- a/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomatonGenerator.java +++ b/util/src/main/java/net/automatalib/util/automaton/random/RandomAutomatonGenerator.java @@ -21,7 +21,7 @@ import java.util.Random; import net.automatalib.automaton.MutableAutomaton; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.common.util.random.RandomUtil; import org.checkerframework.checker.nullness.qual.Nullable; @@ -42,10 +42,10 @@ public RandomAutomatonGenerator(Random random, A automaton) { this.random = random; - this.spList = CollectionsUtil.randomAccessList(stateProps); - this.tpList = CollectionsUtil.randomAccessList(transProps); + this.spList = CollectionUtil.randomAccessList(stateProps); + this.tpList = CollectionUtil.randomAccessList(transProps); - this.inputs = CollectionsUtil.randomAccessList(inputs); + this.inputs = CollectionUtil.randomAccessList(inputs); this.states = new ArrayList<>(); this.automaton = automaton; } diff --git a/util/src/main/java/net/automatalib/util/automaton/random/RandomICAutomatonGenerator.java b/util/src/main/java/net/automatalib/util/automaton/random/RandomICAutomatonGenerator.java index 14b99bc56f..a3612dcd25 100644 --- a/util/src/main/java/net/automatalib/util/automaton/random/RandomICAutomatonGenerator.java +++ b/util/src/main/java/net/automatalib/util/automaton/random/RandomICAutomatonGenerator.java @@ -27,7 +27,7 @@ import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.AutomatonCreator; import net.automatalib.automaton.MutableDeterministic; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.CollectionUtil; import net.automatalib.common.util.random.RandomUtil; import org.checkerframework.checker.nullness.qual.Nullable; @@ -255,7 +255,7 @@ public RandomICAutomatonGenerator withTransitionProperties(Collection resultAbs = result.stateIntAbstraction(); - List inputsList = CollectionsUtil.randomAccessList(inputs); + List inputsList = CollectionUtil.randomAccessList(inputs); resultAbs.addIntInitialState(spSupplier.apply(r)); for (int i = 1; i < numStates; i++) { diff --git a/util/src/main/java/net/automatalib/util/automaton/vpa/OneSEVPAs.java b/util/src/main/java/net/automatalib/util/automaton/vpa/OneSEVPAs.java index 5cfe5ef6ca..69198931c8 100644 --- a/util/src/main/java/net/automatalib/util/automaton/vpa/OneSEVPAs.java +++ b/util/src/main/java/net/automatalib/util/automaton/vpa/OneSEVPAs.java @@ -19,20 +19,21 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Deque; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Queue; import java.util.Set; import java.util.function.Predicate; -import com.google.common.collect.Sets; import net.automatalib.alphabet.VPAlphabet; import net.automatalib.automaton.vpa.OneSEVPA; import net.automatalib.automaton.vpa.impl.DefaultOneSEVPA; -import net.automatalib.common.smartcollection.ArrayStorage; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.IntDisjointSets; import net.automatalib.common.util.Pair; import net.automatalib.common.util.UnionFindRemSP; +import net.automatalib.common.util.array.ArrayStorage; import net.automatalib.util.automaton.vpa.SPAConverter.ConversionResult; import net.automatalib.util.minimizer.OneSEVPAMinimizer; import net.automatalib.util.ts.acceptor.AcceptanceCombiner; @@ -597,7 +598,7 @@ public static Collection, Word>> findCharacterizingSet(On } } - final Set, Word>> result = Sets.newHashSetWithExpectedSize(sevpa.size()); + final Set, Word>> result = new HashSet<>(HashUtil.capacity(sevpa.size())); result.add(Pair.of(Word.epsilon(), Word.epsilon())); final Queue> blockQueue = new ArrayDeque<>(); diff --git a/util/src/main/java/net/automatalib/util/automaton/vpa/SPAConverter.java b/util/src/main/java/net/automatalib/util/automaton/vpa/SPAConverter.java index 0583c9ad86..3bfe4d79c2 100644 --- a/util/src/main/java/net/automatalib/util/automaton/vpa/SPAConverter.java +++ b/util/src/main/java/net/automatalib/util/automaton/vpa/SPAConverter.java @@ -27,7 +27,6 @@ import java.util.function.Function; import java.util.function.Predicate; -import com.google.common.collect.Maps; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.GrowingAlphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; @@ -39,8 +38,9 @@ import net.automatalib.automaton.procedural.SPA; import net.automatalib.automaton.procedural.impl.StackSPA; import net.automatalib.automaton.vpa.OneSEVPA; -import net.automatalib.common.smartcollection.ArrayStorage; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; +import net.automatalib.common.util.array.ArrayStorage; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.fsa.MutableDFAs; import net.automatalib.util.automaton.procedural.ATRSequences; @@ -64,7 +64,7 @@ public static ConversionResult convert(OneSEVPA sevpa } // build alphabet - final Map> procedureMap = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); + final Map> procedureMap = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); final Map reverseMapping = new HashMap<>(); final GrowingAlphabet callAlphabet = new GrowingMapAlphabet<>(); final GrowingAlphabet intAlphabet = new GrowingMapAlphabet<>(); @@ -72,7 +72,7 @@ public static ConversionResult convert(OneSEVPA sevpa callAlphabet.addSymbol(mainProcedure); for (AI ai : alphabet.getCallAlphabet()) { - final Map locationMap = Maps.newHashMapWithExpectedSize(sevpa.size()); + final Map locationMap = new HashMap<>(HashUtil.capacity(sevpa.size())); for (L l : sevpa.getLocations()) { final CI cc = symbolMapper.mapCallSymbol(ai); locationMap.put(l, cc); @@ -95,8 +95,8 @@ public static ConversionResult convert(OneSEVPA sevpa new DefaultProceduralInputAlphabet<>(intAlphabet, callAlphabet, cRet); // build procedures - final Map> procedures = Maps.newHashMapWithExpectedSize(callAlphabet.size() * sevpa.size()); - final Map l2sMap = Maps.newHashMapWithExpectedSize(sevpa.size()); + final Map> procedures = new HashMap<>(HashUtil.capacity(callAlphabet.size() * sevpa.size())); + final Map l2sMap = new HashMap<>(HashUtil.capacity(sevpa.size())); final CompactDFA template = buildTemplate(sevpa, alphabet, spaAlphabet, symbolMapper, procedureMap, l2sMap); for (L l : sevpa.getLocations()) { @@ -118,7 +118,7 @@ public static ConversionResult convert(OneSEVPA sevpa procedures.put(mainProcedure, mCopy); // prepare DTs - final Map> dts = Maps.newHashMapWithExpectedSize(alphabet.getNumCalls()); + final Map> dts = new HashMap<>(HashUtil.capacity(alphabet.getNumCalls())); final Collection, Word>> cs = OneSEVPAs.findCharacterizingSet(sevpa, alphabet); final ArrayStorage> as = OneSEVPAs.computeAccessSequences(sevpa, alphabet); diff --git a/util/src/main/java/net/automatalib/util/graph/FindShortestPathsIterator.java b/util/src/main/java/net/automatalib/util/graph/FindShortestPathsIterator.java index 541f4f3c2b..31053b0f9b 100644 --- a/util/src/main/java/net/automatalib/util/graph/FindShortestPathsIterator.java +++ b/util/src/main/java/net/automatalib/util/graph/FindShortestPathsIterator.java @@ -24,13 +24,13 @@ import java.util.Queue; import java.util.function.Predicate; -import com.google.common.collect.AbstractIterator; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.graph.IndefiniteGraph; import org.checkerframework.checker.index.qual.NonNegative; @SuppressWarnings("nullness") // dataflow dependent nullness is hard to describe -final class FindShortestPathsIterator extends AbstractIterator> { +final class FindShortestPathsIterator extends AbstractSimplifiedIterator> { private final Queue bfsQueue; private final IndefiniteGraph graph; @@ -56,11 +56,12 @@ final class FindShortestPathsIterator extends AbstractIterator> } @Override - protected Path computeNext() { + protected boolean calculateNext() { while (!bfsQueue.isEmpty()) { N curr = bfsQueue.poll(); if (targetPred.test(curr)) { - return makePath(curr); + super.nextValue = makePath(curr); + return true; } final int currentDepth = preds.get(curr).depth; @@ -77,7 +78,7 @@ protected Path computeNext() { } } - return endOfData(); + return false; } private Path makePath(N target) { diff --git a/util/src/main/java/net/automatalib/util/graph/traversal/DepthFirstIterator.java b/util/src/main/java/net/automatalib/util/graph/traversal/DepthFirstIterator.java index 791c77f2f0..f5490ded18 100644 --- a/util/src/main/java/net/automatalib/util/graph/traversal/DepthFirstIterator.java +++ b/util/src/main/java/net/automatalib/util/graph/traversal/DepthFirstIterator.java @@ -19,13 +19,13 @@ import java.util.Collection; import java.util.Deque; -import com.google.common.collect.AbstractIterator; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.graph.IndefiniteGraph; import net.automatalib.util.traversal.VisitedState; import org.checkerframework.checker.nullness.qual.Nullable; -final class DepthFirstIterator extends AbstractIterator { +final class DepthFirstIterator extends AbstractSimplifiedIterator { private final MutableMapping visited; private final Deque> dfsStack = new ArrayDeque<>(); @@ -40,13 +40,14 @@ final class DepthFirstIterator extends AbstractIterator { } @Override - protected N computeNext() { + protected boolean calculateNext() { SimpleDFRecord rec; while ((rec = dfsStack.peek()) != null) { if (!rec.wasStarted()) { visited.put(rec.node, VisitedState.VISITED); rec.start(graph); - return rec.node; + super.nextValue = rec.node; + return true; } else if (rec.hasNextEdge()) { E edge = rec.nextEdge(); N tgt = graph.getTarget(edge); @@ -57,7 +58,6 @@ protected N computeNext() { dfsStack.pop(); } } - return endOfData(); + return false; } - } diff --git a/util/src/main/java/net/automatalib/util/minimizer/OriginalStateCollection.java b/util/src/main/java/net/automatalib/util/minimizer/OriginalStateCollection.java index c3c02fc58e..25ec2d808b 100644 --- a/util/src/main/java/net/automatalib/util/minimizer/OriginalStateCollection.java +++ b/util/src/main/java/net/automatalib/util/minimizer/OriginalStateCollection.java @@ -19,7 +19,7 @@ import java.util.Collection; import java.util.Iterator; -import com.google.common.collect.Iterators; +import net.automatalib.common.util.collection.IteratorUtil; /** * Class that maps a {@link Collection} of states to a collection of the respective original states. @@ -43,7 +43,7 @@ class OriginalStateCollection extends AbstractCollection { @Override public Iterator iterator() { - return Iterators.transform(stateColl.iterator(), State::getOriginalState); + return IteratorUtil.map(stateColl.iterator(), State::getOriginalState); } @Override diff --git a/util/src/main/java/net/automatalib/util/ts/comp/TSComposition.java b/util/src/main/java/net/automatalib/util/ts/comp/TSComposition.java index 94239015b8..1003d54041 100644 --- a/util/src/main/java/net/automatalib/util/ts/comp/TSComposition.java +++ b/util/src/main/java/net/automatalib/util/ts/comp/TSComposition.java @@ -18,10 +18,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; -import com.google.common.collect.Sets; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.ts.TransitionSystem; @@ -49,7 +50,7 @@ public Set> getInitialStates() { Collection init1 = ts1.getInitialStates(); Collection init2 = ts2.getInitialStates(); - Set> result = Sets.newHashSetWithExpectedSize(init1.size() * init2.size()); + Set> result = new HashSet<>(HashUtil.capacity(init1.size() * init2.size())); for (S1 s1 : init1) { for (S2 s2 : init2) { diff --git a/util/src/main/java/net/automatalib/util/ts/iterator/DefinedInputsIterator.java b/util/src/main/java/net/automatalib/util/ts/iterator/DefinedInputsIterator.java index 4052102de9..08af78abee 100644 --- a/util/src/main/java/net/automatalib/util/ts/iterator/DefinedInputsIterator.java +++ b/util/src/main/java/net/automatalib/util/ts/iterator/DefinedInputsIterator.java @@ -18,10 +18,10 @@ import java.util.Collection; import java.util.Iterator; -import com.google.common.collect.AbstractIterator; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.ts.TransitionSystem; -public final class DefinedInputsIterator extends AbstractIterator { +public final class DefinedInputsIterator extends AbstractSimplifiedIterator { private final TransitionSystem ts; private final Iterator inputsIt; @@ -34,14 +34,15 @@ public DefinedInputsIterator(TransitionSystem ts, S state, Iterator transitions = ts.getTransitions(state, input); if (!transitions.isEmpty()) { - return input; + super.nextValue = input; + return true; } } - return endOfData(); + return false; } } diff --git a/util/src/main/java/net/automatalib/util/ts/iterator/UndefinedInputsIterator.java b/util/src/main/java/net/automatalib/util/ts/iterator/UndefinedInputsIterator.java index 71e646c08e..007a45032a 100644 --- a/util/src/main/java/net/automatalib/util/ts/iterator/UndefinedInputsIterator.java +++ b/util/src/main/java/net/automatalib/util/ts/iterator/UndefinedInputsIterator.java @@ -18,10 +18,10 @@ import java.util.Collection; import java.util.Iterator; -import com.google.common.collect.AbstractIterator; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.ts.TransitionSystem; -public final class UndefinedInputsIterator extends AbstractIterator { +public final class UndefinedInputsIterator extends AbstractSimplifiedIterator { private final TransitionSystem ts; private final Iterator inputsIt; @@ -34,14 +34,15 @@ public UndefinedInputsIterator(TransitionSystem ts, S state, Iterator transitions = ts.getTransitions(state, input); if (transitions.isEmpty()) { - return input; + super.nextValue = input; + return true; } } - return endOfData(); + return false; } } diff --git a/util/src/main/java/net/automatalib/util/ts/modal/ModalRefinement.java b/util/src/main/java/net/automatalib/util/ts/modal/ModalRefinement.java index 6ef16cc4aa..6516a13789 100644 --- a/util/src/main/java/net/automatalib/util/ts/modal/ModalRefinement.java +++ b/util/src/main/java/net/automatalib/util/ts/modal/ModalRefinement.java @@ -18,11 +18,12 @@ import java.util.Collection; import java.util.Collections; import java.util.EnumSet; +import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.function.BiPredicate; -import com.google.common.collect.Sets; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.ts.modal.ModalTransitionSystem; import net.automatalib.ts.modal.transition.ModalEdgeProperty; @@ -39,7 +40,7 @@ private static Set partnerTransit I input, Set acceptableValues) { - Set coTransitions = Sets.newHashSetWithExpectedSize(b.getInputAlphabet().size()); + Set coTransitions = new HashSet<>(HashUtil.capacity(b.getInputAlphabet().size())); for (BT candidateTransition : b.getTransitions(source, input)) { BTP property = b.getTransitionProperty(candidateTransition); @@ -86,7 +87,7 @@ public static Set> refinementRelation(ModalTransitionSy ModalTransitionSystem specification, Collection inputs) { - Set> refinement = Sets.newHashSetWithExpectedSize(implementation.size() * specification.size()); + Set> refinement = new HashSet<>(HashUtil.capacity(implementation.size() * specification.size())); // lower approximation only correct if automaton is finite (image-finite) for (AS p : implementation.getStates()) { diff --git a/util/src/main/java/net/automatalib/util/ts/traversal/DepthFirstIterator.java b/util/src/main/java/net/automatalib/util/ts/traversal/DepthFirstIterator.java index 33748c2670..3d38c6c6ab 100644 --- a/util/src/main/java/net/automatalib/util/ts/traversal/DepthFirstIterator.java +++ b/util/src/main/java/net/automatalib/util/ts/traversal/DepthFirstIterator.java @@ -19,13 +19,13 @@ import java.util.Collection; import java.util.Deque; -import com.google.common.collect.AbstractIterator; +import net.automatalib.common.util.collection.AbstractSimplifiedIterator; import net.automatalib.common.util.mapping.MutableMapping; import net.automatalib.ts.TransitionSystem; import net.automatalib.util.traversal.VisitedState; import org.checkerframework.checker.nullness.qual.Nullable; -final class DepthFirstIterator extends AbstractIterator { +final class DepthFirstIterator extends AbstractSimplifiedIterator { private final MutableMapping visited; private final Deque> dfsStack = new ArrayDeque<>(); @@ -42,13 +42,14 @@ final class DepthFirstIterator extends AbstractIterator { } @Override - protected S computeNext() { + protected boolean calculateNext() { SimpleDFRecord rec; while ((rec = dfsStack.peek()) != null) { if (!rec.wasStarted()) { visited.put(rec.state, VisitedState.VISITED); rec.start(ts); - return rec.state; + super.nextValue = rec.state; + return true; } else if (rec.hasNextTransition(ts)) { T t = rec.transition(); S succ = ts.getSuccessor(t); @@ -59,7 +60,6 @@ protected S computeNext() { dfsStack.pop(); } } - return endOfData(); + return false; } - } diff --git a/util/src/test/java/net/automatalib/util/automaton/ads/AbstractADSTest.java b/util/src/test/java/net/automatalib/util/automaton/ads/AbstractADSTest.java index 687a86116e..5bf8b846c8 100644 --- a/util/src/test/java/net/automatalib/util/automaton/ads/AbstractADSTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/ads/AbstractADSTest.java @@ -16,14 +16,15 @@ package net.automatalib.util.automaton.ads; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import com.google.common.collect.Maps; import net.automatalib.automaton.transducer.impl.CompactMealy; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; import net.automatalib.graph.ads.ADSNode; import net.automatalib.word.Word; @@ -93,7 +94,10 @@ protected void verifySuccess(CompactMealy mealy, Set targe Assert.assertEquals(targets, leaves.stream().map(ADSNode::getHypothesisState).collect(Collectors.toSet())); final Map, Pair, Word>> traces = - Maps.asMap(leaves, ADSUtil::buildTraceForNode); + new HashMap<>(HashUtil.capacity(leaves.size())); + for (ADSNode leaf : leaves) { + traces.put(leaf, ADSUtil.buildTraceForNode(leaf)); + } // check matching outputs for (Map.Entry, Pair, Word>> entry : traces.entrySet()) { diff --git a/util/src/test/java/net/automatalib/util/automaton/conformance/IncrementalWMethodTestsIteratorTest.java b/util/src/test/java/net/automatalib/util/automaton/conformance/IncrementalWMethodTestsIteratorTest.java index e1c1e9fa5b..dad3e36766 100644 --- a/util/src/test/java/net/automatalib/util/automaton/conformance/IncrementalWMethodTestsIteratorTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/conformance/IncrementalWMethodTestsIteratorTest.java @@ -19,13 +19,12 @@ import java.util.Set; import java.util.stream.Collectors; -import com.google.common.collect.Sets; -import com.google.common.collect.Streams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.impl.CompactDFA; import net.automatalib.automaton.transducer.impl.CompactMealy; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.builder.AutomatonBuilders; import net.automatalib.word.Word; @@ -113,7 +112,7 @@ public void testSingleStateAutomaton() { iter.setMaxDepth(MAX_DEPTH); iter.update(dfa); - final Set> tests = Streams.stream(iter).collect(Collectors.toSet()); + final Set> tests = IteratorUtil.stream(iter).collect(Collectors.toSet()); for (Character c : alphabet) { Assert.assertTrue(tests.contains(Word.fromLetter(c))); @@ -123,19 +122,20 @@ public void testSingleStateAutomaton() { private Set> computeWMethodTests() { final List> characterizingSet = Automata.characterizingSet(mealy, alphabet); - final List> allMidTuples = Streams.stream(CollectionsUtil.allTuples(alphabet, 0, MAX_DEPTH)) - .map(Word::fromList) - .collect(Collectors.toList()); + final List> allMidTuples = + IterableUtil.stream(IterableUtil.allTuples(alphabet, 0, MAX_DEPTH)) + .map(Word::fromList) + .collect(Collectors.toList()); final List> transitionCover = Automata.transitionCover(mealy, alphabet); final Iterable>> wMethodIter = - CollectionsUtil.cartesianProduct(transitionCover, allMidTuples, characterizingSet); + IterableUtil.cartesianProduct(transitionCover, allMidTuples, characterizingSet); - return Streams.stream(wMethodIter).map(Word::fromWords).collect(Collectors.toSet()); + return IterableUtil.stream(wMethodIter).map(Word::fromWords).collect(Collectors.toSet()); } private Set> computeIteratorTests() { - return Sets.newHashSet(incIt); + return IteratorUtil.set(incIt); } } diff --git a/util/src/test/java/net/automatalib/util/automaton/conformance/SBAWMethodTestsIteratorTest.java b/util/src/test/java/net/automatalib/util/automaton/conformance/SBAWMethodTestsIteratorTest.java index c12f0e5dad..d2a2e4fbda 100644 --- a/util/src/test/java/net/automatalib/util/automaton/conformance/SBAWMethodTestsIteratorTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/conformance/SBAWMethodTestsIteratorTest.java @@ -24,7 +24,6 @@ import java.util.Objects; import java.util.Random; -import com.google.common.collect.Lists; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -33,6 +32,7 @@ import net.automatalib.automaton.fsa.impl.CompactDFA; import net.automatalib.automaton.procedural.SBA; import net.automatalib.automaton.procedural.impl.StackSBA; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.copy.AutomatonCopyMethod; @@ -84,7 +84,7 @@ public void testNonMinimalSBA() { @Test public void testIterator() { final ProceduralInputAlphabet alphabet = this.sba.getInputAlphabet(); - final List> testWords = Lists.newArrayList(new SBAWMethodTestsIterator<>(sba)); + final List> testWords = IteratorUtil.list(new SBAWMethodTestsIterator<>(sba)); final ATSequences atSequences = SBAs.computeATSequences(this.sba); final List continuableSymbols = new ArrayList<>(alphabet.size() - 1); continuableSymbols.addAll(alphabet.getInternalAlphabet()); diff --git a/util/src/test/java/net/automatalib/util/automaton/conformance/SPATestsIteratorTest.java b/util/src/test/java/net/automatalib/util/automaton/conformance/SPATestsIteratorTest.java index a8cad13cea..cf765dc96f 100644 --- a/util/src/test/java/net/automatalib/util/automaton/conformance/SPATestsIteratorTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/conformance/SPATestsIteratorTest.java @@ -15,7 +15,6 @@ */ package net.automatalib.util.automaton.conformance; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -24,8 +23,6 @@ import java.util.Random; import java.util.function.BiFunction; -import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -33,6 +30,7 @@ import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.procedural.SPA; import net.automatalib.automaton.procedural.impl.StackSPA; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.util.automaton.random.RandomAutomata; import net.automatalib.word.Word; import org.testng.Assert; @@ -84,7 +82,7 @@ public void testWpMethodVariant() { private void testIterator(BiFunction, Collection, Iterator>> conformanceTestProvider) { final List> testTraces = - Lists.newArrayList(new SPATestsIterator<>(this.spa, conformanceTestProvider)); + IteratorUtil.list(new SPATestsIterator<>(this.spa, conformanceTestProvider)); for (Entry> e : this.spa.getProcedures().entrySet()) { verifyProcedure(e.getKey(), e.getValue(), this.spa.getInputAlphabet(), testTraces, conformanceTestProvider); @@ -98,8 +96,7 @@ private void verifyProcedure(I procedure, BiFunction, Collection, Iterator>> conformanceTestProvider) { final Alphabet proceduralAlphabet = alphabet.getProceduralAlphabet(); - final List> localTraces = new ArrayList<>(); - Iterators.addAll(localTraces, conformanceTestProvider.apply(dfa, proceduralAlphabet)); + final List> localTraces = IteratorUtil.list(conformanceTestProvider.apply(dfa, proceduralAlphabet)); for (Word trace : globalTraces) { for (int i = 0; i < trace.length(); i++) { diff --git a/util/src/test/java/net/automatalib/util/automaton/conformance/SPMMWMethodTestsIteratorTest.java b/util/src/test/java/net/automatalib/util/automaton/conformance/SPMMWMethodTestsIteratorTest.java index 6a47dc2f1f..67952823fe 100644 --- a/util/src/test/java/net/automatalib/util/automaton/conformance/SPMMWMethodTestsIteratorTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/conformance/SPMMWMethodTestsIteratorTest.java @@ -24,7 +24,6 @@ import java.util.Objects; import java.util.Random; -import com.google.common.collect.Lists; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.ProceduralOutputAlphabet; @@ -35,6 +34,7 @@ import net.automatalib.automaton.procedural.impl.StackSPMM; import net.automatalib.automaton.transducer.MealyMachine; import net.automatalib.automaton.transducer.impl.CompactMealy; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.copy.AutomatonCopyMethod; @@ -93,7 +93,7 @@ public void testNonMinimalSPMM() { @Test public void testIterator() { - final List> testWords = Lists.newArrayList(new SPMMWMethodTestsIterator<>(this.spmm)); + final List> testWords = IteratorUtil.list(new SPMMWMethodTestsIterator<>(this.spmm)); final ProceduralInputAlphabet inputAlphabet = this.spmm.getInputAlphabet(); final ATSequences atSequences = SPMMs.computeATSequences(this.spmm); diff --git a/util/src/test/java/net/automatalib/util/automaton/conformance/WMethodTestsIteratorTest.java b/util/src/test/java/net/automatalib/util/automaton/conformance/WMethodTestsIteratorTest.java index a3e001e61d..9a84cf5fb5 100644 --- a/util/src/test/java/net/automatalib/util/automaton/conformance/WMethodTestsIteratorTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/conformance/WMethodTestsIteratorTest.java @@ -21,14 +21,11 @@ import java.util.Random; import java.util.stream.Collectors; -import com.google.common.collect.Iterables; -import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; -import com.google.common.collect.Streams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.impl.CompactDFA; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.random.RandomAutomata; import net.automatalib.word.Word; @@ -54,7 +51,7 @@ public void testEpsilonDiscriminator() { dfa2.setInitial(oldInit2, false); dfa2.addInitialState(false); - final List> testWords = Lists.newArrayList(new WMethodTestsIterator<>(dfa1, alphabet, 0)); + final List> testWords = IteratorUtil.list(new WMethodTestsIterator<>(dfa1, alphabet, 0)); for (Word t : testWords) { if (dfa1.accepts(t) != dfa2.accepts(t)) { @@ -73,9 +70,9 @@ public void testVanillaIterator() { final List> characterizingSet = Automata.characterizingSet(dfa, alphabet); final List> expectedWords = - Streams.stream(CollectionsUtil.cartesianProduct(transCover, characterizingSet)) - .map(Word::fromWords) - .collect(Collectors.toList()); + IterableUtil.stream(IterableUtil.cartesianProduct(transCover, characterizingSet)) + .map(Word::fromWords) + .collect(Collectors.toList()); this.verifyIterator(new WMethodTestsIterator<>(dfa, alphabet, 0), expectedWords); } @@ -88,21 +85,20 @@ public void testIteratorWithLookahead2() { Assert.assertFalse(transCover.contains(Word.epsilon())); transCover.add(Word.epsilon()); final Iterable> middleTuples = - Iterables.transform(CollectionsUtil.allTuples(alphabet, 0, lookahead), Word::fromList); + IterableUtil.map(IterableUtil.allTuples(alphabet, 0, lookahead), Word::fromList); final List> characterizingSet = Automata.characterizingSet(dfa, alphabet); final List> expectedWords = - Streams.stream(CollectionsUtil.cartesianProduct(transCover, middleTuples, characterizingSet)) - .map(Word::fromWords) - .collect(Collectors.toList()); + IterableUtil.stream(IterableUtil.cartesianProduct(transCover, middleTuples, characterizingSet)) + .map(Word::fromWords) + .collect(Collectors.toList()); this.verifyIterator(new WMethodTestsIterator<>(dfa, alphabet, lookahead), expectedWords); } private void verifyIterator(WMethodTestsIterator iter, Collection> expectedTests) { final List> expectedWMethodWords = new ArrayList<>(expectedTests); - final List> wMethodWords = new ArrayList<>(expectedTests.size()); - Iterators.addAll(wMethodWords, iter); + final List> wMethodWords = IteratorUtil.list(iter); // Order may be different, but that is ok expectedWMethodWords.sort(Word.canonicalComparator(Integer::compare)); diff --git a/util/src/test/java/net/automatalib/util/automaton/conformance/WpMethodTestsIteratorTest.java b/util/src/test/java/net/automatalib/util/automaton/conformance/WpMethodTestsIteratorTest.java index 8d01891821..764487835e 100644 --- a/util/src/test/java/net/automatalib/util/automaton/conformance/WpMethodTestsIteratorTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/conformance/WpMethodTestsIteratorTest.java @@ -22,13 +22,12 @@ import java.util.Random; import java.util.stream.Collectors; -import com.google.common.collect.Lists; -import com.google.common.collect.Streams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.automaton.fsa.impl.CompactDFA; -import net.automatalib.common.util.collection.CollectionsUtil; +import net.automatalib.common.util.collection.IterableUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.comparison.CmpUtil; import net.automatalib.util.automaton.cover.Covers; import net.automatalib.util.automaton.equivalence.CharacterizingSets; @@ -55,7 +54,7 @@ public void testEpsilonDiscriminator() { dfa2.setInitial(oldInit2, false); dfa2.addInitialState(false); - final List> testWords = Lists.newArrayList(new WpMethodTestsIterator<>(dfa1, alphabet, 0)); + final List> testWords = IteratorUtil.list(new WpMethodTestsIterator<>(dfa1, alphabet, 0)); for (Word t : testWords) { if (dfa1.accepts(t) != dfa2.accepts(t)) { @@ -68,7 +67,7 @@ public void testEpsilonDiscriminator() { @Test public void testIteratorWithoutMiddleParts() { - final List> iteratorWords = Lists.newArrayList(new WpMethodTestsIterator<>(dfa, alphabet, 0)); + final List> iteratorWords = IteratorUtil.list(new WpMethodTestsIterator<>(dfa, alphabet, 0)); final List> wpMethodWords = generateWpMethodTest(dfa, alphabet, Collections.singletonList(Word.epsilon())); @@ -80,14 +79,15 @@ public void testIteratorWithMiddleParts() { final int depth = 3; - final List> iteratorWords = Lists.newArrayList(new WpMethodTestsIterator<>(dfa, alphabet, depth)); + final List> iteratorWords = IteratorUtil.list(new WpMethodTestsIterator<>(dfa, alphabet, depth)); final List> wpMethodWords = generateWpMethodTest(dfa, alphabet, - Streams.stream(CollectionsUtil.allTuples(alphabet, - 0, - depth)) - .map(Word::fromList) - .collect(Collectors.toList())); + IterableUtil.stream(IterableUtil.allTuples( + alphabet, + 0, + depth)) + .map(Word::fromList) + .collect(Collectors.toList())); checkTestWords(iteratorWords, wpMethodWords); } @@ -118,10 +118,13 @@ private List> generateWpMethodTest(UniversalDeterministicAutomato final List> result = new ArrayList<>(); // Phase 1: state cover * middle part * global suffixes - Lists.cartesianProduct(stateCover, middleParts, characterizingSet) - .stream() - .map(Word::fromWords) - .forEach(result::add); + for (Word sc : stateCover) { + for (Word mp : middleParts) { + for (Word cs : characterizingSet) { + result.add(Word.fromWords(sc, mp, cs)); + } + } + } // Phase 2: transitions (not in state cover) * middle part * local suffixes transitionCover.removeAll(stateCover); diff --git a/util/src/test/java/net/automatalib/util/automaton/cover/CoverIteratorsTest.java b/util/src/test/java/net/automatalib/util/automaton/cover/CoverIteratorsTest.java index 09088b235d..b82487db1a 100644 --- a/util/src/test/java/net/automatalib/util/automaton/cover/CoverIteratorsTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/cover/CoverIteratorsTest.java @@ -23,10 +23,10 @@ import java.util.Random; import java.util.function.BiFunction; -import com.google.common.collect.Iterators; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.DFA; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.random.RandomAutomata; import net.automatalib.word.Word; @@ -63,10 +63,7 @@ public static void compareCovers(BiFunction, Collection final List> cover = new ArrayList<>(coverGenerator.apply(dfa, alphabet)); - final List> iteratorCover = new ArrayList<>(dfa.size()); - final Iterator> iter = iteratorGenerator.apply(dfa, alphabet); - - Iterators.addAll(iteratorCover, iter); + final List> iteratorCover = IteratorUtil.list(iteratorGenerator.apply(dfa, alphabet)); Assert.assertEquals(iteratorCover, cover); } @@ -86,10 +83,8 @@ public static void compareIncrementalCovers(QuadConsumer, Collec final List> incrementalCover = new ArrayList<>(fullCover.size() / 2); incrementalCoverGenerator.apply(dfa, alphabet, oldCover, incrementalCover); - final List> iteratorCover = new ArrayList<>(fullCover.size() / 2); - final Iterator> iter = incrementalIteratorGenerator.apply(dfa, alphabet, oldCover); - - Iterators.addAll(iteratorCover, iter); + final List> iteratorCover = + IteratorUtil.list(incrementalIteratorGenerator.apply(dfa, alphabet, oldCover)); Assert.assertEquals(iteratorCover, incrementalCover); } diff --git a/util/src/test/java/net/automatalib/util/automaton/cover/CoversTest.java b/util/src/test/java/net/automatalib/util/automaton/cover/CoversTest.java index a8778724a3..f5cf1d6c4f 100644 --- a/util/src/test/java/net/automatalib/util/automaton/cover/CoversTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/cover/CoversTest.java @@ -22,12 +22,12 @@ import java.util.Random; import java.util.Set; -import com.google.common.collect.Lists; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.UniversalDeterministicAutomaton; import net.automatalib.automaton.fsa.DFA; import net.automatalib.automaton.fsa.impl.CompactDFA; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.util.automaton.Automata; import net.automatalib.util.automaton.random.RandomAutomata; @@ -162,8 +162,8 @@ public void testPartialIterators() { dfa.addState(true); dfa.addState(false); - final List> sCov = Lists.newArrayList(Covers.stateCoverIterator(dfa, alphabet)); - final List> tCov = Lists.newArrayList(Covers.transitionCoverIterator(dfa, alphabet)); + final List> sCov = IteratorUtil.list(Covers.stateCoverIterator(dfa, alphabet)); + final List> tCov = IteratorUtil.list(Covers.transitionCoverIterator(dfa, alphabet)); testStateCover(dfa, alphabet, sCov); testTransitionCover(dfa, alphabet, tCov); diff --git a/util/src/test/java/net/automatalib/util/automaton/procedural/SBAsTest.java b/util/src/test/java/net/automatalib/util/automaton/procedural/SBAsTest.java index 3e42418465..3a8482087d 100644 --- a/util/src/test/java/net/automatalib/util/automaton/procedural/SBAsTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/procedural/SBAsTest.java @@ -20,7 +20,6 @@ import java.util.Map.Entry; import java.util.Random; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -123,7 +122,7 @@ public void testIntricateSeparatingWord() { t1.addTransition(t1t0, 'R', t1t4); - final SBA sba1 = new StackSBA<>(alphabet, 'S', ImmutableMap.of('S', s1, 'T', t1)); + final SBA sba1 = new StackSBA<>(alphabet, 'S', Map.of('S', s1, 'T', t1)); final CompactDFA s2 = new CompactDFA<>(alphabet); final FastDFA t2 = new FastDFA<>(alphabet); @@ -133,7 +132,7 @@ public void testIntricateSeparatingWord() { t2.addTransition(t2t0, 'R', t2t4); - final SBA sba2 = new StackSBA<>(alphabet, 'S', ImmutableMap.of('S', s2, 'T', t2)); + final SBA sba2 = new StackSBA<>(alphabet, 'S', Map.of('S', s2, 'T', t2)); final SBA emptySBA = new EmptySBA<>(alphabet); // no accessible procedures, no separating word should exist. Even with the empty SBAs @@ -196,7 +195,7 @@ public void testIntricateSeparatingWord() { verifySepWord(sba2, sba1, alphabet); // this should also work for partial SBAs - final SBA partial1 = new StackSBA<>(alphabet, 'S', ImmutableMap.of('S', s1)); + final SBA partial1 = new StackSBA<>(alphabet, 'S', Map.of('S', s1)); verifySepWord(sba1, partial1, alphabet); verifySepWord(partial1, sba1, alphabet); @@ -264,8 +263,8 @@ public void testReduction() { MutableDFAs.complete(spaS, alphabet.getProceduralAlphabet()); MutableDFAs.complete(spaT, alphabet.getProceduralAlphabet()); - final StackSBA sba = new StackSBA<>(alphabet, 'S', ImmutableMap.of('S', sbaS, 'T', sbaT)); - final StackSPA spa = new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', spaS, 'T', spaT)); + final StackSBA sba = new StackSBA<>(alphabet, 'S', Map.of('S', sbaS, 'T', sbaT)); + final StackSPA spa = new StackSPA<>(alphabet, 'S', Map.of('S', spaS, 'T', spaT)); final SPA reduced = SBAs.reduce(sba); Assert.assertTrue(SPAs.testEquivalence(spa, reduced, alphabet)); @@ -379,7 +378,7 @@ private static SBA buildSBAWithNonTerminatingProcedures() { MutableDFAs.complete(p3, alphabet, true); - return new StackSBA<>(alphabet, "P1", ImmutableMap.of("P1", p1, "P2", p2, "P3", p3, "P4", p4)); + return new StackSBA<>(alphabet, "P1", Map.of("P1", p1, "P2", p2, "P3", p3, "P4", p4)); } } diff --git a/util/src/test/java/net/automatalib/util/automaton/procedural/SPAsTest.java b/util/src/test/java/net/automatalib/util/automaton/procedural/SPAsTest.java index d6946ff8b7..3c92b09e33 100644 --- a/util/src/test/java/net/automatalib/util/automaton/procedural/SPAsTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/procedural/SPAsTest.java @@ -26,9 +26,6 @@ import java.util.Objects; import java.util.Random; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.io.CharStreams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -44,6 +41,7 @@ import net.automatalib.automaton.vpa.OneSEVPA; import net.automatalib.automaton.vpa.SEVPA; import net.automatalib.common.util.IOUtil; +import net.automatalib.common.util.collection.IteratorUtil; import net.automatalib.graph.ContextFreeModalProcessSystem; import net.automatalib.graph.ProceduralModalProcessGraph; import net.automatalib.serialization.dot.GraphDOT; @@ -109,12 +107,12 @@ public void testIncompleteATRSequences() { new DefaultProceduralInputAlphabet<>(internalAlphabet, Alphabets.singleton('S'), returnSymbol); // With no accepting states, there exist no a/t/r sequences. - final SPA spa = new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', s, 'T', t)); + final SPA spa = new StackSPA<>(alphabet, 'S', Map.of('S', s, 'T', t)); ATRSequences atrSequences = SPAs.computeATRSequences(spa, alphabet); - Assert.assertEquals(atrSequences.accessSequences, ImmutableMap.ofEntries(sAsEntry)); + Assert.assertEquals(atrSequences.accessSequences, Map.ofEntries(sAsEntry)); Assert.assertTrue(atrSequences.terminatingSequences.isEmpty()); - Assert.assertEquals(atrSequences.returnSequences, ImmutableMap.ofEntries(sRsEntry)); + Assert.assertEquals(atrSequences.returnSequences, Map.ofEntries(sRsEntry)); Assert.assertFalse(SPAs.isMinimal(spa)); Assert.assertTrue(SPAs.isMinimal(emptyAlphabet, atrSequences)); @@ -124,9 +122,9 @@ public void testIncompleteATRSequences() { atrSequences = SPAs.computeATRSequences(spa, alphabet); - Assert.assertEquals(atrSequences.accessSequences, ImmutableMap.ofEntries(sAsEntry)); - Assert.assertEquals(atrSequences.terminatingSequences, ImmutableMap.ofEntries(sTsEntry)); - Assert.assertEquals(atrSequences.returnSequences, ImmutableMap.ofEntries(sRsEntry)); + Assert.assertEquals(atrSequences.accessSequences, Map.ofEntries(sAsEntry)); + Assert.assertEquals(atrSequences.terminatingSequences, Map.ofEntries(sTsEntry)); + Assert.assertEquals(atrSequences.returnSequences, Map.ofEntries(sRsEntry)); Assert.assertFalse(SPAs.isMinimal(spa)); Assert.assertTrue(SPAs.isMinimal(halfAlphabet, atrSequences)); Assert.assertTrue(SPAs.isMinimal(emptyAlphabet, atrSequences)); @@ -137,9 +135,9 @@ public void testIncompleteATRSequences() { atrSequences = SPAs.computeATRSequences(spa, alphabet); - Assert.assertEquals(atrSequences.accessSequences, ImmutableMap.ofEntries(sAsEntry, tAsEntry)); - Assert.assertEquals(atrSequences.terminatingSequences, ImmutableMap.ofEntries(sTsEntry)); - Assert.assertEquals(atrSequences.returnSequences, ImmutableMap.ofEntries(sRsEntry, tRsEntry)); + Assert.assertEquals(atrSequences.accessSequences, Map.ofEntries(sAsEntry, tAsEntry)); + Assert.assertEquals(atrSequences.terminatingSequences, Map.ofEntries(sTsEntry)); + Assert.assertEquals(atrSequences.returnSequences, Map.ofEntries(sRsEntry, tRsEntry)); Assert.assertFalse(SPAs.isMinimal(spa)); Assert.assertTrue(SPAs.isMinimal(halfAlphabet, atrSequences)); Assert.assertTrue(SPAs.isMinimal(emptyAlphabet, atrSequences)); @@ -150,9 +148,9 @@ public void testIncompleteATRSequences() { atrSequences = SPAs.computeATRSequences(spa, alphabet); - Assert.assertEquals(atrSequences.accessSequences, ImmutableMap.ofEntries(sAsEntry, tAsEntry)); - Assert.assertEquals(atrSequences.terminatingSequences, ImmutableMap.ofEntries(sTsEntry)); - Assert.assertEquals(atrSequences.returnSequences, ImmutableMap.ofEntries(sRsEntry, tRsEntry)); + Assert.assertEquals(atrSequences.accessSequences, Map.ofEntries(sAsEntry, tAsEntry)); + Assert.assertEquals(atrSequences.terminatingSequences, Map.ofEntries(sTsEntry)); + Assert.assertEquals(atrSequences.returnSequences, Map.ofEntries(sRsEntry, tRsEntry)); Assert.assertFalse(SPAs.isMinimal(spa)); Assert.assertTrue(SPAs.isMinimal(halfAlphabet, atrSequences)); Assert.assertTrue(SPAs.isMinimal(emptyAlphabet, atrSequences)); @@ -163,9 +161,9 @@ public void testIncompleteATRSequences() { atrSequences = SPAs.computeATRSequences(spa, alphabet); - Assert.assertEquals(atrSequences.accessSequences, ImmutableMap.ofEntries(sAsEntry, tAsEntry)); - Assert.assertEquals(atrSequences.terminatingSequences, ImmutableMap.ofEntries(sTsEntry, tTsEntry)); - Assert.assertEquals(atrSequences.returnSequences, ImmutableMap.ofEntries(sRsEntry, tRsEntry)); + Assert.assertEquals(atrSequences.accessSequences, Map.ofEntries(sAsEntry, tAsEntry)); + Assert.assertEquals(atrSequences.terminatingSequences, Map.ofEntries(sTsEntry, tTsEntry)); + Assert.assertEquals(atrSequences.returnSequences, Map.ofEntries(sRsEntry, tRsEntry)); Assert.assertTrue(SPAs.isMinimal(spa)); } @@ -241,7 +239,7 @@ public void testMissingAccessReturnSequenceDueToMissingTerminatingSequence() { t.addInitialState(false); - final SPA spa = new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', s, 'T', t)); + final SPA spa = new StackSPA<>(alphabet, 'S', Map.of('S', s, 'T', t)); final ATRSequences atrSequences = SPAs.computeATRSequences(spa); Assert.assertEquals(atrSequences.accessSequences.keySet(), Collections.singleton('S')); @@ -303,7 +301,7 @@ public void testIntricateSeparatingWord() { t1.addTransition(t1t1, 'T', t1t2); t1.addTransition(t1t2, 'c', t1t3); - final SPA spa1 = new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', s1, 'T', t1)); + final SPA spa1 = new StackSPA<>(alphabet, 'S', Map.of('S', s1, 'T', t1)); final CompactDFA s2 = new CompactDFA<>(alphabet.getProceduralAlphabet()); final FastDFA t2 = new FastDFA<>(alphabet.getProceduralAlphabet()); @@ -332,7 +330,7 @@ public void testIntricateSeparatingWord() { t2.addTransition(t2t1, 'T', t2t2); t2.addTransition(t2t2, 'c', t2t3); - final SPA spa2 = new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', s2, 'T', t2)); + final SPA spa2 = new StackSPA<>(alphabet, 'S', Map.of('S', s2, 'T', t2)); final SPA emptySPA = new EmptySPA<>(alphabet); @@ -377,7 +375,7 @@ public void testIntricateSeparatingWord() { verifySepWord(spa2, spa1, alphabet); // this should also work for partial SPAs - final SPA partial1 = new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', s1)); + final SPA partial1 = new StackSPA<>(alphabet, 'S', Map.of('S', s1)); verifySepWord(spa1, partial1, alphabet); verifySepWord(partial1, spa1, alphabet); @@ -563,7 +561,7 @@ public void testEquivalence() { public void testOneSEVPAConversion(SPA spa) { final OneSEVPA oneSEVPA = SPAs.toOneSEVPA(spa); - final List> tests = Lists.newArrayList(new SPATestsIterator<>(spa, WMethodTestsIterator::new)); + final List> tests = IteratorUtil.list(new SPATestsIterator<>(spa, WMethodTestsIterator::new)); for (Word t : tests) { Assert.assertEquals(spa.accepts(t), oneSEVPA.accepts(t)); @@ -574,7 +572,7 @@ public void testOneSEVPAConversion(SPA spa) { public void testNSEVPAConversion(SPA spa) { final SEVPA sevpa = SPAs.toNSEVPA(spa); - final List> tests = Lists.newArrayList(new SPATestsIterator<>(spa, WMethodTestsIterator::new)); + final List> tests = IteratorUtil.list(new SPATestsIterator<>(spa, WMethodTestsIterator::new)); for (Word t : tests) { Assert.assertEquals(spa.accepts(t), sevpa.accepts(t)); @@ -632,7 +630,7 @@ static void verifyDot(ContextFreeModalProcessSystem cfmps, String expected final StringWriter expectedWriter = new StringWriter(); try (Reader reader = IOUtil.asBufferedUTF8Reader(SPAsTest.class.getResourceAsStream(expected))) { - CharStreams.copy(reader, expectedWriter); + IOUtil.copy(reader, expectedWriter); GraphDOT.write(cfmps, dotWriter); Assert.assertEquals(dotWriter.toString(), expectedWriter.toString()); } @@ -698,7 +696,7 @@ private static SPA buildPalindromeSystem() { MutableDFAs.complete(sProcedure, alphabet.getProceduralAlphabet()); MutableDFAs.complete(tProcedure, alphabet.getProceduralAlphabet()); - return new StackSPA<>(alphabet, 'S', ImmutableMap.of('S', sProcedure, 'T', tProcedure)); + return new StackSPA<>(alphabet, 'S', Map.of('S', sProcedure, 'T', tProcedure)); } private static SPA buildDissSystem() { @@ -735,9 +733,7 @@ private static SPA buildDissSystem() { MutableDFAs.complete(aProcedure, alphabet.getProceduralAlphabet()); MutableDFAs.complete(bProcedure, alphabet.getProceduralAlphabet()); - return new StackSPA<>(alphabet, - "main", - ImmutableMap.of("main", mainProcedure, "c_1", aProcedure, "c_2", bProcedure)); + return new StackSPA<>(alphabet, "main", Map.of("main", mainProcedure, "c_1", aProcedure, "c_2", bProcedure)); } } diff --git a/util/src/test/java/net/automatalib/util/automaton/procedural/SPMMsTest.java b/util/src/test/java/net/automatalib/util/automaton/procedural/SPMMsTest.java index 66c96426bc..7db878dc06 100644 --- a/util/src/test/java/net/automatalib/util/automaton/procedural/SPMMsTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/procedural/SPMMsTest.java @@ -15,10 +15,10 @@ */ package net.automatalib.util.automaton.procedural; +import java.util.Map; import java.util.Map.Entry; import java.util.Random; -import com.google.common.collect.ImmutableMap; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.ProceduralInputAlphabet; import net.automatalib.alphabet.ProceduralOutputAlphabet; @@ -136,7 +136,7 @@ public void testIntricateSeparatingWord() { t1.addTransition(t1t0, 'R', t1t4, '-'); final SPMM spmm1 = - new StackSPMM<>(inputAlphabet, 'S', '✓', errorOutput, ImmutableMap.of('S', s1, 'T', t1)); + new StackSPMM<>(inputAlphabet, 'S', '✓', errorOutput, Map.of('S', s1, 'T', t1)); final CompactMealy s2 = new CompactMealy<>(inputAlphabet); final FastMealy t2 = new FastMealy<>(inputAlphabet); @@ -147,7 +147,7 @@ public void testIntricateSeparatingWord() { t2.addTransition(t2t0, 'R', t2t4, '-'); final SPMM spmm2 = - new StackSPMM<>(inputAlphabet, 'S', '✓', errorOutput, ImmutableMap.of('S', s2, 'T', t2)); + new StackSPMM<>(inputAlphabet, 'S', '✓', errorOutput, Map.of('S', s2, 'T', t2)); final SPMM emptySPMM = new EmptySPMM<>(inputAlphabet, errorOutput); // no accessible procedures, no separating word should exist. Even with the empty SPMMs @@ -211,7 +211,7 @@ public void testIntricateSeparatingWord() { // this should also work for partial SPMMs final SPMM partial1 = - new StackSPMM<>(inputAlphabet, 'S', '✓', errorOutput, ImmutableMap.of('S', s1)); + new StackSPMM<>(inputAlphabet, 'S', '✓', errorOutput, Map.of('S', s1)); verifySepWord(spmm1, partial1, inputAlphabet); verifySepWord(partial1, spmm1, inputAlphabet); diff --git a/util/src/test/java/net/automatalib/util/automaton/vpa/OneSEVPAsTest.java b/util/src/test/java/net/automatalib/util/automaton/vpa/OneSEVPAsTest.java index 9bc1fbbbb0..ddcd6ac528 100644 --- a/util/src/test/java/net/automatalib/util/automaton/vpa/OneSEVPAsTest.java +++ b/util/src/test/java/net/automatalib/util/automaton/vpa/OneSEVPAsTest.java @@ -23,7 +23,6 @@ import java.util.Random; import java.util.Set; -import com.google.common.collect.Sets; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.VPAlphabet; import net.automatalib.alphabet.impl.Alphabets; @@ -32,8 +31,9 @@ import net.automatalib.automaton.vpa.State; import net.automatalib.automaton.vpa.impl.DefaultOneSEVPA; import net.automatalib.automaton.vpa.impl.Location; -import net.automatalib.common.smartcollection.ArrayStorage; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.Pair; +import net.automatalib.common.util.array.ArrayStorage; import net.automatalib.util.automaton.conformance.SPATestsIterator; import net.automatalib.util.automaton.conformance.WpMethodTestsIterator; import net.automatalib.util.automaton.random.RandomAutomata; @@ -69,7 +69,7 @@ public void testAccessSequenceSet(OneSEVPA sevpa) { final VPAlphabet alphabet = sevpa.getInputAlphabet(); final ArrayStorage> accessSequences = OneSEVPAs.computeAccessSequences(sevpa, alphabet); - final Set locations = Sets.newHashSetWithExpectedSize(sevpa.size()); + final Set locations = new HashSet<>(HashUtil.capacity(sevpa.size())); for (Word as : accessSequences) { final State s = sevpa.getState(as); @@ -117,7 +117,7 @@ public void testCharacterizingSet(OneSEVPA sevpa) { final ArrayStorage> accessSequences = OneSEVPAs.computeAccessSequences(sevpa, alphabet); final List, Word>> cSet = new ArrayList<>(OneSEVPAs.findCharacterizingSet(sevpa, alphabet)); - final Set signatures = Sets.newHashSetWithExpectedSize(sevpa.size()); + final Set signatures = new HashSet<>(HashUtil.capacity(sevpa.size())); for (L l : sevpa.getLocations()) { final Word as = accessSequences.get(sevpa.getLocationId(l)); @@ -207,7 +207,7 @@ public void testMinimization() { private static void addRedundantState(DefaultOneSEVPA automaton, VPAlphabet alphabet) { // cache reached states, so we copy the first state reached by two incoming transitions - final Set locationCache = Sets.newHashSetWithExpectedSize(automaton.size()); + final Set locationCache = new HashSet<>(HashUtil.capacity(automaton.size())); Location incomingLoc = null; I incomingInput = null; diff --git a/util/src/test/java/net/automatalib/util/graph/GraphsTest.java b/util/src/test/java/net/automatalib/util/graph/GraphsTest.java index eff79cb2bf..5038ce4116 100644 --- a/util/src/test/java/net/automatalib/util/graph/GraphsTest.java +++ b/util/src/test/java/net/automatalib/util/graph/GraphsTest.java @@ -25,10 +25,10 @@ import java.util.Random; import java.util.Set; -import com.google.common.collect.Sets; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.DFA; +import net.automatalib.common.util.HashUtil; import net.automatalib.common.util.mapping.Mapping; import net.automatalib.common.util.mapping.Mappings; import net.automatalib.graph.MutableGraph; @@ -94,7 +94,7 @@ private void checkIncomingEdges(DFA dfa, final N mappedTgt = nodeMapping.get(tgt); final Set edges = new HashSet<>(incomingEdges.get(mappedTgt)); - final Set checkEdges = Sets.newHashSetWithExpectedSize(edges.size()); + final Set checkEdges = new HashSet<>(HashUtil.capacity(edges.size())); for (S src : incomingStates) { final N mappedSrc = nodeMapping.get(src); diff --git a/util/src/test/java/net/automatalib/util/graph/SCCTest.java b/util/src/test/java/net/automatalib/util/graph/SCCTest.java index ff42946927..a0ff5b196b 100644 --- a/util/src/test/java/net/automatalib/util/graph/SCCTest.java +++ b/util/src/test/java/net/automatalib/util/graph/SCCTest.java @@ -15,11 +15,11 @@ */ package net.automatalib.util.graph; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; -import com.google.common.collect.Sets; import net.automatalib.graph.impl.CompactSimpleGraph; import org.testng.Assert; import org.testng.annotations.Test; @@ -44,8 +44,7 @@ public void testExample1() { graph.connect(n2, n1); graph.connect(n2, n3); - @SuppressWarnings("unchecked") - Set> expectedSCCs = Sets.newHashSet(Sets.newHashSet(0, 1, 2), Sets.newHashSet(3)); + Set> expectedSCCs = Set.of(Set.of(0, 1, 2), Set.of(3)); Set> computedSCCs = computeSCCs(graph); @@ -70,9 +69,7 @@ public void testExample2() { graph.connect(n3, n1); graph.connect(n2, n4); - @SuppressWarnings("unchecked") - Set> expectedSCCs = - Sets.newHashSet(Sets.newHashSet(n0), Sets.newHashSet(n1, n2, n3), Sets.newHashSet(n4)); + Set> expectedSCCs = Set.of(Set.of(n0), Set.of(n1, n2, n3), Set.of(n4)); Set> computedSCCs = computeSCCs(graph); @@ -111,11 +108,7 @@ public void testExample3() { graph.connect(g, f); graph.connect(g, h); - @SuppressWarnings("unchecked") - Set> expectedSCCs = Sets.newHashSet(Sets.newHashSet(a, b, e), - Sets.newHashSet(c, d), - Sets.newHashSet(h), - Sets.newHashSet(f, g)); + Set> expectedSCCs = Set.of(Set.of(a, b, e), Set.of(c, d), Set.of(h), Set.of(f, g)); Set> computedSCCs = computeSCCs(graph); @@ -165,11 +158,7 @@ public void testExample4() { graph.connect(i, h); graph.connect(i, g); - @SuppressWarnings("unchecked") - Set> expectedSCCs = Sets.newHashSet(Sets.newHashSet(a, b, c), - Sets.newHashSet(d, e, f, g, l, k), - Sets.newHashSet(i, h), - Sets.newHashSet(j)); + Set> expectedSCCs = Set.of(Set.of(a, b, c), Set.of(d, e, f, g, l, k), Set.of(i, h), Set.of(j)); Set> computedSCCs = computeSCCs(graph); @@ -214,17 +203,14 @@ public void testExample5() { graph.connect(n1, n0); graph.connect(n2, n0); - @SuppressWarnings("unchecked") - Set> expectedSCCs = - Sets.newHashSet(Sets.newHashSet(n3), Sets.newHashSet(n7), - Sets.newHashSet(n1), Sets.newHashSet(n0, n2, n4, n5, n6, n8, n9)); + Set> expectedSCCs = Set.of(Set.of(n3), Set.of(n7), Set.of(n1), Set.of(n0, n2, n4, n5, n6, n8, n9)); Set> computedSCCs = computeSCCs(graph); /* * An invariant of this algorithm is that every node in the input graph should be maintained in the result set. */ - Set nodeSet = Sets.newHashSet(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9); + Set nodeSet = new HashSet<>(Arrays.asList(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9)); computedSCCs.forEach(nodeSet::removeAll); Assert.assertEquals(nodeSet.size(), 0); @@ -265,9 +251,7 @@ public void testTarjansSCCPaperExample() { graph.connect(n8, n1); graph.connect(n8, n7); - @SuppressWarnings("unchecked") - Set> expectedSCCs = - Sets.newHashSet(Sets.newHashSet(n1, n2, n8), Sets.newHashSet(n6), Sets.newHashSet(n3, n4, n5, n7)); + Set> expectedSCCs = Set.of(Set.of(n1, n2, n8), Set.of(n6), Set.of(n3, n4, n5, n7)); Set> computedSCCs = computeSCCs(graph); diff --git a/util/src/test/java/net/automatalib/util/graph/TraversalTest.java b/util/src/test/java/net/automatalib/util/graph/TraversalTest.java index ff7ccc626c..74d5146f68 100644 --- a/util/src/test/java/net/automatalib/util/graph/TraversalTest.java +++ b/util/src/test/java/net/automatalib/util/graph/TraversalTest.java @@ -26,12 +26,12 @@ import java.util.Set; import java.util.stream.Collectors; -import com.google.common.collect.Streams; import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.automaton.fsa.impl.CompactDFA; import net.automatalib.automaton.graph.TransitionEdge; import net.automatalib.common.util.Holder; +import net.automatalib.common.util.collection.IterableUtil; import net.automatalib.graph.MutableGraph; import net.automatalib.graph.UniversalGraph; import net.automatalib.graph.base.CompactEdge; @@ -229,9 +229,9 @@ public void testDepthFirstAbortState() { } private List> collectPathInputs(Iterable>> paths) { - return Streams.stream(paths) - .map(p -> p.stream().map(TransitionEdge::getInput).collect(Word.collector())) - .collect(Collectors.toList()); + return IterableUtil.stream(paths) + .map(p -> p.stream().map(TransitionEdge::getInput).collect(Word.collector())) + .collect(Collectors.toList()); } private abstract static class AbstractVisitor implements GraphTraversalVisitor { diff --git a/util/src/test/java/net/automatalib/util/ts/modal/ModalRefinementTest.java b/util/src/test/java/net/automatalib/util/ts/modal/ModalRefinementTest.java index 5169906924..2474fb2e52 100644 --- a/util/src/test/java/net/automatalib/util/ts/modal/ModalRefinementTest.java +++ b/util/src/test/java/net/automatalib/util/ts/modal/ModalRefinementTest.java @@ -15,7 +15,8 @@ */ package net.automatalib.util.ts.modal; -import com.google.common.collect.ImmutableSet; +import java.util.Set; + import net.automatalib.alphabet.Alphabet; import net.automatalib.alphabet.impl.Alphabets; import net.automatalib.common.util.Pair; @@ -125,7 +126,7 @@ public void unrollLoopTest() { b.addTransition(bs0, "a", bs0, null); Assert.assertEquals(ModalRefinement.refinementRelation(a, b, alphabet), - ImmutableSet.of(Pair.of(as0, bs0), Pair.of(as1, bs0))); + Set.of(Pair.of(as0, bs0), Pair.of(as1, bs0))); Assert.assertTrue(MTSs.isRefinementOf(a, b, alphabet)); Assert.assertTrue(MTSs.isRefinementOf(b, a, alphabet)); } diff --git a/visualization/dot-visualizer/pom.xml b/visualization/dot-visualizer/pom.xml index 127e505df1..8d787dfa83 100644 --- a/visualization/dot-visualizer/pom.xml +++ b/visualization/dot-visualizer/pom.xml @@ -49,10 +49,6 @@ limitations under the License. - - com.google.guava - guava - org.slf4j slf4j-api diff --git a/visualization/dot-visualizer/src/main/java/net/automatalib/visualization/dot/DOT.java b/visualization/dot-visualizer/src/main/java/net/automatalib/visualization/dot/DOT.java index 0e75f5ad51..a1adee2734 100644 --- a/visualization/dot-visualizer/src/main/java/net/automatalib/visualization/dot/DOT.java +++ b/visualization/dot-visualizer/src/main/java/net/automatalib/visualization/dot/DOT.java @@ -28,7 +28,6 @@ import javax.imageio.ImageIO; -import com.google.common.io.CharStreams; import net.automatalib.AutomataLibProperty; import net.automatalib.AutomataLibSettings; import net.automatalib.common.util.IOUtil; @@ -236,7 +235,7 @@ public static void renderDOT(File dotFile, boolean modal) throws IOException { * if reading from the reader or the call to the DOT utility fails. */ public static void renderDOT(Reader r, boolean modal) throws IOException { - renderDOT(CharStreams.toString(r), modal); + renderDOT(IOUtil.toString(r), modal); } /** @@ -262,7 +261,7 @@ public static void renderDOT(String dotText, boolean modal) throws IOException { * if reading from the files or the calls to the DOT utility fail. */ public static void renderDOTFiles(List> files, boolean modal) throws IOException { - renderDOTInternal(files, modal, f -> CharStreams.toString(IOUtil.asBufferedUTF8Reader(f))); + renderDOTInternal(files, modal, f -> IOUtil.toString(IOUtil.asBufferedUTF8Reader(f))); } /** @@ -273,7 +272,7 @@ public static void renderDOTFiles(List> files, boolean modal) * if reading from the readers or the calls to the DOT utility fail. */ public static void renderDOTReaders(List> readers, boolean modal) throws IOException { - renderDOTInternal(readers, modal, CharStreams::toString); + renderDOTInternal(readers, modal, IOUtil::toString); } /** diff --git a/visualization/dot-visualizer/src/test/java/net/automatalib/visualization/dot/DOTDialogTest.java b/visualization/dot-visualizer/src/test/java/net/automatalib/visualization/dot/DOTDialogTest.java index cc66165886..7a2aa5a275 100644 --- a/visualization/dot-visualizer/src/test/java/net/automatalib/visualization/dot/DOTDialogTest.java +++ b/visualization/dot-visualizer/src/test/java/net/automatalib/visualization/dot/DOTDialogTest.java @@ -24,7 +24,6 @@ import javax.swing.JMenuItem; import javax.swing.JScrollPane; -import com.google.common.io.CharStreams; import net.automatalib.common.util.IOUtil; import org.assertj.swing.awt.AWT; import org.assertj.swing.core.ComponentDragAndDrop; @@ -47,8 +46,7 @@ public class DOTDialogTest extends AssertJSwingTestngTestCase { private DialogFixture window; public DOTDialogTest() throws IOException { - this.dot = - CharStreams.toString(IOUtil.asBufferedUTF8Reader(DOTDialogTest.class.getResourceAsStream("/dfa.dot"))); + this.dot = IOUtil.toString(IOUtil.asBufferedUTF8Reader(DOTDialogTest.class.getResourceAsStream("/dfa.dot"))); } @Override @@ -108,7 +106,7 @@ public void testSaveDOT() throws IOException { fileChooser = JFileChooserFinder.findFileChooser().using(robot()); fileChooser.selectFile(tmpFile).approve(); - Assert.assertEquals(CharStreams.toString(IOUtil.asBufferedUTF8Reader(tmpFile)), dot); + Assert.assertEquals(IOUtil.toString(IOUtil.asBufferedUTF8Reader(tmpFile)), dot); } @Test