All notable changes to this project will be documented in this file. The format is based on Keep a Changelog.
- Added modal transition systems (MTSs), modal contracts (MCs) and Membership-MCs (MMCs).
- Added
SubsequentialTransducer
interface and implementations/utilities. - Added support for systems of procedural automata (SPAs) as well as related concepts (equivalence, etc.).
- Refactored
net.automatalib.automata.transducers.impl.compact.CompactMealyTransition
->net.automatalib.automata.base.compact.CompactTransition
net.automatalib.commons.util.BitSetIterator
->net.automatalib.commons.util.collections.BitSetIterator
net.automatalib.graphs.FiniteKTS
->net.automatalib.ts.FiniteKTS
andFiniteKTS
no longer extends theGraph
interface but theAutomaton
interface and has its type variables re-ordered.net.automatalib.graphs.FiniteLTS
->net.automatalib.graphs.FiniteLabeledGraph
- AutomataLib classes no longer implement
Serializable
. We never fully supported the semantics of the interface and never intended to do so. In fact, the old approach failed miserably if any class was involved where we missed an "implements Serializable" statement. In order to prevent confusion by promising false contracts, implementing this markup interface has been removed. Serialization should now be done in user-land via one of the many external (and more optimizable) serialization frameworks such as FST, XStream, etc. Minimizer
no longer provides agetInstance()
method but can be instantiated directly.AbstractOneSEVPA
no longer implements theGraph
interface, butOneSEVPA
s are nowGraphViewable
.
- Fixed a cache consistency bug in various DAG-based incremental builders.
- Removed the (package-private) classes
net.automatalib.util.automata.predicates.{AcceptanceStatePredicate,OutputSatisfies,TransitionPropertySatisfies}
. - Removed
net.automatalib.graphs.IndefiniteLTS.java
. By naming, this class should denote aTransitionSystem
and not aGraph
structure. However, sinceTransitionSystem
s are inherently labeled, this class serves no more real purpose. To re-establish the previous functionality, simply implementGraph
andEdgeLabels
. - Removed (unused)
SuffixTrie
class without replacement. Similar functionality can be achieved with AutomataLib's incremental module.
0.10.0 - 2020-10-11
- All de-serializers now can also parse GZIP'ed contents from either
InputStream
s,File
s,URL
s orbyte[]
s.
- We overhauled the handling of input and output streams for all (de-)serializers. Input and output streams are no longer closed automatically. This is to prevent asymmetric code where we would close a stream that we haven't opened. This is problematic in cases where e.g.
System.out
is passed as an output stream to simply print a serialized automaton and theSystem.out
stream would be closed afterwards. Since input and output streams are usually opened in client-code, they should be closed in client-code as well. We suggest to simply wrap calls to the serializers in a try-with-resource block. - Due to the DOT parsers rewrite (see Fixed), the attribute parsers now receive a
Map<String, String>
instead of aMap<String, Object>
. - The
State
class (used by theOneSEVPA
automaton) not longer supports the notion of a sink state. TheAbstractOneSEVPA
class now conforms with the default semantics of aDeterministicTransitionSystem
that undefined transitions simply returnnull
.
- Removed
IOUtil#copy
,IOUtil#skip
,NullOutputStream
. Use the Guava equivalents fromByteStreams
andCharStreams
.
- Correctly enquote outputs containing whitespaces in
TAFWriter
(#37, thanks to Alexander Schieweck). - Fixed a bug in the
Graph
representation ofAbstractOneSEVPA
s (#39, thanks to DonatoClun). - Fixed wrong default values in the overloaded methods of the
Minimizer
class (#41). - Replaced the 3rd-party DOT parser with our own implementation to fix the issue that multi-edges between nodes were not properly handled.
0.9.0 - 2020-02-05
- A new alphabet implementation
MapAlphabet
that is based on the oldSimpleAlphabet
but without implementing theGrowingAlphabet
interface. IntRangeIterator
now implementsPrimitiveIterator.OfInt
.- A parser for
dot
files has been added and is available in theautomata-serialization-dot
module via theDOTParsers
factory. - A new
PaigeTarjanMinimization
factory that offers convenience methods for PaigeTarjan-based automata minimization (with support for e.g. partial automata) has been added. - Performance improvements for some alphabet implementations (
DefaultVPDAlphabet
,ListAlphabet
,{Int,Char}Range
, ...). - An
LTSminLTLParser
to verify if LTL properties match the expected syntax of LTSmin. - A
WordCollector
for collecting words from symbolStream
s.
- Refactored the following packages/classes:
net.automatalib.words.impl.SimpleAlphabet
->net.automatalib.words.impl.GrowingMapAlphabet
net.automatalib.serialization.AutomatonSerializationException
->net.automatalib.serialization.FormatException
net.automatalib.serialization.fsm.parser.FSMParseException
->net.automatalib.serialization.fsm.parser.FSMFormatException
net.automatalib.serialization.taf.parser.TAFParseException
->net.automatalib.serialization.taf.parser.TAFFormatException
net.automatalib.automata.transducers.impl.map.SimpleMapGraph
->net.automatalib.graphs.map.SimpleMapGraph
- The
BackedGeneralPriorityQueue(Class<T> c)
constructor was replaced with a more idiomaticBackedGeneralPriorityQueue(Supplier<T> s)
constructor. - The TAF serialization code now forwards (i.e.
throws
)IOException
s that occur when reading from the various data sources. - JSR305 annotations have been replaced with checker-framework annotations.
- AutomataLib now follows checker-framework's convention that (non-annotated) types are usually considered non-null unless explicitly annotated with
@Nullable
. - AutomataLib no longer has a (runtime-) dependency on JSR305 (and other
javax.*
) annotations or includes them in the distribution artifact. This now makes AutomataLib compliant with Oracle's binary code license and allows AutomataLib artifacts as-is to be bundled in binary distributions with Oracle's JDKs/JREs.
- AutomataLib now follows checker-framework's convention that (non-annotated) types are usually considered non-null unless explicitly annotated with
StringIndexGenerator
has been removed. Its (streamlined) functionality is now available asMapping
viaMappings#stringToIndex
andMappings#indexToString
.DelegatingIterator
: If you used this class, switch to Guavas equivalentForwardingIterator
.ParameterMismatchException
: Was unused and never thrown.StateIDDynamicMapping
: Equivalent functionality is provided byArrayMapping
.ResizingIntArray
: Internal data structure was unused.- The
VPDAlphabet
interface no longer specifies theget{Internal,Call,Return}Symbols()
methods, as theget{Internal,Call,Return}Alphabet()
methods supersede their functionality. PaigeTarjan{Initializers,Extractors}
methods for nonIntAbstraction
s have been removed. You may use the new convenience methods provided byPaigeTarjanMinimization
.- Further
@Deprecated
methods have been removed. - Removed
ProbMealyTransition
and replaced it with the genericMealyTransition
directly carrying theProbabilisticOutput
. It is no longer allowed to passnull
as transition property. - Removed
OutputAndLocalInputs
,StateLocalInputIncrementalMealyTreeBuilder
andStateLocalInputMealyUtil
. The (LearnLib) code related to inferring partial Mealy machines no longer requires these transformed automata. Whoever used this code for transforming a partial Mealy machine to a complete one, may useMealyMachines#complete
instead.
- Fixed a bug, where the PaigeTarjan-based minimization would return a wrong automaton when pruning was enabled and the initial automaton was partial.
- Fixed a bug in our Tarjan SCC implementation (#35, thanks to Malte Mues)
- Fixed a bug in the computation of characterizing sets (#36).
- Several (null-related) bugs detected by our ongoing efforts to write tests.
0.8.0 - 2019-02-07
- Added support for model checking automata using the LTSmin model checker (thanks to Jeroen Meijer).
- Added a
CompactMoore
implementation. - Added an
AutomatonBuilder
for Moore Machines. - Added support for adding input symbols to incremental constructions (tree caches, DAG caches).
- Support for Java 11. Note: AutomataLib still targets Java 8, and thus needs classes provided by this environment (specifically: annotations from
javax.annotation
). If you plan to use AutomataLib in a Java 11+ environment, make sure to provide these classes. They are not shipped with AutomataLib.
- Refactored the following packages/classes:
net.automatalib.automata.transout
->net.automatalib.automata.transducers
net.automatalib.ts.transout
->net.automatalib.ts.output
net.automatalib.util.automata.transout
->net.automatalib.util.automata.transducers
net.automatalib.automata.GrowableAlphabetAutomaton
->net.automatalib.SupportsGrowingAlphabet
- Some runtime properties for dynamically configuring AutomataLib have been renamed. There now exists the
AutomataLibProperty
enum as a single reference point for all available properties. - Several of the
AbstractCompact*
automata classes have been refactored to share common functionality. While this shouldn't affect its implementations (such asCompactDFA
orCompactMealy
) user-land code using the abstract classes may break. - The
BricsDFA
wrapper previously allowed (via a boolean flag) to trigger determinization of the BRICS automaton. This determinization is now performed automatically if necessary. Instead, the boolean flag now triggers a totalization of the transition function, which allows to properly useBricsDFA
s in structural equivalence tests (as BRICS automata do not allow to limit their input alphabet to certain characters). - Adding new symbols to automata (via the
SupportsGrowingAlphabet
interface) now requires the automaton to be initialized with aGrowingAlphabet
instance. This is to make sure that the user has full control over which alphabet instance should be used instead of AutomataLib making decisions on behalf of the user.
- The mutable
Pair
class has been removed. The previously immutable pair classIPair
has been renamed toPair
. - Some utility classes and functions (especially from the
automata-common-util
package) have been removed without replacement, since equivalent functionality is provided by the Google Guava library we depend on. If you used any of this code, switch to the Guava equivalent. RichArray
has been removed. At least regarding storage,ArrayStorage
can be used as a replacement.SymbolHidingAlphabet
has been removed without replacement. Changes to the logic of adding new input symbols should no longer make this class necessary.
- Serializers now use platform dependent newlines. This shouldn't affect deserialization code.
- Several bugs detected either by our ongoing efforts to write tests.
0.7.1 - 2018-05-11
- Added
SymbolHidingAlphabet
, which is required for a bugfix release of LearnLib.
- Fixed an issue where initial states were not copied in copy-constructor of NFAs.
- Fixed an NPE when traversing partially defined NFAs.
- Fixed an issue, where input alphabets were unnecessarily wrapped in
SimpleAlphabet
s in compact automata implementations. - Fixed an out-of-bounds error in incremental automata builders.
- Fixed an error in Paige/Tarjan algorithm for partially defined automata.
- Fixed wrong computation of strongly connected components (see #21).
- General consolidations (typos, wrong documentation, etc.).
0.7.0 - 2018-02-07
- Added algorithms for computing adaptive distinguishing sequences for Mealy machines.
- Added support for adding alphabet symbols after initial automaton construction.
- Added support for Visibly Push-Down Automata (VPDA) in form of 1-SEVPAs.
- Added (de-)serializers for the AUT format (see #14).
- Added lazy (iterator based) methods for computing state- and transition covers, W-Method and Wp-Method tests.
- Added a serializer for the SAF format.
-
Refactored the Maven artifact and Java package structure. Have a look at the List of AutomataLib Artifacts for an updated overview of available artifacts. In general, no functionality should have been removed (except of code marked with
@Deprecated
). The easiest way to migrate your code to the new version is probably by using the Auto-Import feature of your IDE of choice.The non-trivial refactorings include:
- API methods no longer use wildcards in generic return parameters. This allows your code to not having to deal with them.
- The visualization facade has been generified. Any
getGraphDOTHelper()
related code has been renamed to the more generalgetVisualizationHelper()
terminology. TheVisualization
class now works by providing either theautomata-dot-visualizer
orautomata-jung-visualizer
JAR at runtime. This allows for potentially more visualizers in the future.
-
Replaced
System.out
logging, with calls to an SLF4j facade. -
Code improvements due to employment of several static code-analysis plugins (findbugs, checkstyle, PMD, etc.) as well as setting up continuous integration at Travis CI.
- Several classes and methods annotated with
@Deprecated
.
- Several bugs detected either by our newly employed static code-analysis toolchain or by our ongoing efforts to write tests.