Releases: LearnLib/automatalib
automatalib-0.12.1
Fixed
automatalib-0.12.0
Added
- AutomataLib now supports JPMS modules. Many of the artifacts now provide a
module-infodescriptor with the exception ofautomata-bricsandautomata-jung-visualizerwhich do not have modular dependencies and only provide anAutomatic-Module-Namein their respectiveMANIFEST.MFs. As a consequence of this, the distribution artifacts (for Maven-less environments) also only provide anAutomatic-Module-Name. Note that while this is a Java 9+ feature, AutomataLib still supports Java 8 byte code for the remaining class files. - Added
TabakovVardiRandomAutomatathat allows for creating Tabakov-Vardi random automata, in particular, NFAs (thanks to @jn1z). - Added (de-) serializers for the BA format supported by tools such as SPOT, RABIT, Walnut, etc. (thanks to @jn1z).
- Added Valmari's algorithm for solving the coarsest relational partition problem in O(m + log n). This includes utility classes such as
ValmariInitializersandValmariExtractorsfor, e.g., convenient quotienting of NFAs via bi-similarity (thanks to @mtf90).
Changed
- The JPMS support introduces several changes:
- 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-coreartifact whose packages have been extended by a.implsuffix. 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
Alphabets#toGrowingAlphabetOrThrowExceptionmethod has been moved toAlphabet#asGrowingAlphabetOrThrowExceptionso that one does not require anautomata-coredependency for a simple cast. - The
AutomatonBuilderImpl#withStatePropertymethod has had its parameter order flipped. - The
AWUtilclass has been moved fromnet.automatalib.common.util.arraytonet.automatalib.common.smartcollection(in theautomata-commons-smartcollectionsartifact). - The
ArrayStorageandArrayUtilclasses have been moved fromnet.automatalib.common.smartcollectiontonet.automatalib.common.util.array(in theautomata-commons-utilartifact). CollectionsUtil#allTupleshas been moved toIterableUtil#allTuples.CollectionsUtil#cartesianProducthas been moved toIterableUtil#cartesianProduct.CollectionsUtilhas been renamed toCollectionUtil.- The
DirectPowersetDTSclass has been renamed toPowersetView. - The
FormatExceptionis now a checked exception because we can reasonably expect clients to recover from this error. Furthermore, all parsing-related code has been aligned to use theFormatExceptioninstead of leaking implementation details (such as theParseExceptions generated by JavaCC). - The
MutableGraphclass has been aligned with itsMutableAutomatoncounterpart in that we no longer force nullable edge properties (see removed section). Furthermore the graph implementations have been renamed accordingly:{,Abstract}Compact{,Bidi}Graphhas been renamed to{,Abstract}CompactUniversal{,Bidi}Graph.CompactGraphnow is a graph with void node properties and edge properties, i.e., it only stores adjacency information.
OneSEVPAMinimizerhas been moved fromnet.automatalib.util.minimizertonet.automatalib.util.automaton.minimizer.- The
PaigeTarjanMinimizationclass (including all supporting classes such asPaigeTarjanInitializers) has been removed because, despite its name, the class never implemented Paige-Tarjan's algorithm for solving the relational coarsest partition problem but the functional one instead. Most of the previous functionality has been migrated to the (now correctly named)HopcroftMinimizerclass. - The serializers have been overhauled to allow for better integration of custom automaton types (especially when parsing). Some of the changes introduce new factory methods which may require some refactoring but the previous functionality is still available. As a part of this streamlining, many parsers no longer automatically un-compress or buffer the input streams to reduce overhead. The need for this can be determined best where the streams are created (in user-land).
- The
RecursiveADSNode#{get,set}HypothesisStatemethods have been renamed toRecursiveADSNode#{get,set}State. Furthermore,getState()andgetSymbol()no longer return null but throw an UnsupportedOperationException in case of an illegal access. - The
ResizingArrayStorageclass has been merged withArrayStorage. - The
SimpleMapGraphclass no longer implementsShrinkableGraphsince it cannot correctly implementcreateDynamicNodeMapping(). - The
Visualizationfactory has been moved from theautomata-coreartifact to theautomata-apiartifact. Furthermore, the previousDummyVPhas been replaced with aNoopVPthat does not show a swing window anymore when no proper VisualizationProvider is configured but instead logs an error message. This allows us to drop thejava.desktop(module) dependency for headless setups and only require it in actual visualizers (DOT, JUNG, etc.). - AutomataLib's settings have been carved out in a separate
automata-commons-settingsmodule. - The
net:automatalib.tooling:automata-build-toolsmodule has been renamed tonet.automatalib:automata-build-config.
Removed
- The
BlockAutomatonhas been removed from Béal-Crochemore's minimization algorithm. The class never was a full automaton (in the AutomataLib sense) and could not become one without access to the original automaton at which point the transformations are the same as already implemented in theAutomataclass. - The method
Covers#incrementalStructuralCoverhas been removed because it is not possible to correctly compute the set without a distinction between state cover and transition cover elements. Users may useCovers#incrementalCoverinstead. - The method
DeterministicEquivalenceTest#findSeparatingWordLargehas been removed. The normalfindSeparatingWordmethod now correctly adapts to various sizes. - The methods
xor,impl,equiv, andcombineofNFAshave been removed since the product automaton constructions do not correspond to the respective language operations. - The method
MutableGraph#connect(N source, N target)has been removed. If you want to explicitly set anullproperty, you may denote your edge property type as@Nullableand useconnect(N source, N target, EP property)accordingly. The same goes forMutableGraph'sIntAbstraction. SimpleTS#getSuccessors(S state, Iterable<? extends I> input)has been removed. In order to traverse a (non-deterministic) transition system, useTransitionSystem#powersetViewinstead.TAFParseDiagnosticListenerhas been removed. Reporting is now done via (slf4j) logging.- The
net.automatalib:automata-serialization-coreartifact has been dropped. Its contents are now part of thenet.automatalib:automata-apiartifact.
Fixed
- Fixed a bug in
SBAs#toCFMPSwhich would allow the returned view to reach a final node on a non-return symbol. - Fixed (another) inconsistency bug in
Incremental*DAGBuilders. - The
AUTParsernow correctly reads non-deterministic automata. - The
TAFParsersnow correctly support wildcard transition definitions for DFAs.
automatalib-0.11.0
Added
- Added the incremental
AdaptiveMealyBuilderthat allows for overriding previous traces (#56, thanks to @tiferrei). - Added modal transition systems (MTSs) including related utilities such as composition, conjunction, refinement (thanks to @mjasper, @Conturing, and @dvs23).
- Added the M3C model-checker for verifying µ-calculus and CTL formulas on context-free modal process systems (thanks to @AlnisM).
- Added the ability to M3C to generate witnesses for negated safety properties (thanks to @Viperish-byte).
- Added support for procedural systems (SPAs, SBA, SPMMs) as well as related concepts such as verification, testing, and transformations thereof (thanks to @mtf90).
- Added
SubsequentialTransducerinterface and implementations/utilities (thanks to @mtf90).
Changed
- Refactorings
-
Many AutomataLib packages have been refactored from plural-based keywords to singular-based keywords. Some examples are
- renamed
net.automatalib.automata.*tonet.automatalib.automaton.*. - renamed
net.automatalib.automata.concepts.*tonet.automatalib.automaton.concept.*. - renamed
net.automatalib.automata.graphs.*tonet.automatalib.automaton.graph.*. - renamed
net.automatalib.automata.helpers.*tonet.automatalib.automaton.helper.*. - renamed
net.automatalib.automata.transducers.*tonet.automatalib.automaton.transducer.*. - renamed
net.automatalib.graphs.*tonet.automatalib.graph.*. - renamed
net.automatalib.graph.concepts.*tonet.automatalib.graph.concept.*. - renamed
net.automatalib.graph.helpers.*tonet.automatalib.graph.helper.*. - renamed
net.automatalib.ts.acceptors.*tonet.automatalib.ts.acceptor.*. - renamed
net.automatalib.settignssources.*tonet.automatalib.settingsource.*. - renamed
net.automatalib.words.*tonet.automatalib.word.*. - renamed
net.automatalib.commons.smartcollections.*tonet.automatalib.common.smartcollection.*. - renamed
net.automatalib.commons.util.*tonet.automatalib.common.util.*. - renamed
net.automatalib.modelcheckers.*tonet.automatalib.modelchecker.*. - renamed
net.automatalib.util.automata.*tonet.automatalib.util.automaton.*. - etc.
While this may cause some refactoring, it should only affect import statements as the names of most classes remain identical.
- renamed
-
Some actual re-namings concern
- all code around visibly push-down automata which now uses the "vpa" acronym (previously "vpda"). This includes package names, class names and (Maven) module names.
- many of the
automata-corepackages have been aligned with their correspondingautomata-apiones which often results in dropping the.implor.compactsub-packages. Alphabet-related code which has been moved from thenet.automatlib.wordpackage to thenet.automatalib.alphabetpackage.net.automatalib.automata.transducers.impl.compact.CompactMealyTransition->net.automatalib.automaton.CompactTransition.net.automatalib.commons.util.BitSetIterator->net.automatalib.common.util.collection.BitSetIterator.net.automatalib.graphs.base.compact.AbstractCompactGraph#getNodeProperties(int)->net.automatalib.graph.base.AbstractCompactGraph#getNodeProperty(int).net.automatalib.graphs.FiniteKTS->net.automatalib.ts.FiniteKTSandFiniteKTSno longer extends theGraphinterface but theAutomatoninterface and has its type variables re-ordered.net.automatalib.graphs.FiniteLTS->net.automatalib.graph.FiniteLabeledGraph.GraphTraversal#dfIterator->GraphTraversal#depthFirstIterator.- moved the
net.automatalib.incremental.mealy.dynamic.*classes tonet.automatalib.incremental.mealy. - moved the
net.automatalib.settingssource.*classes tonet.automatalib. - moved
SupportsGrowingAlphabetclass tonet.automatalib.alphabet. - moved the package
net.automatalib.ts.comptonet.automatalib.util.ts.compin theautomata-utilmodule. - moved
TS#bfs{Order,Iterator}toTSTraversal#breadthFirst{Order,Iterator}.
-
AbstractOneSEVPAno longer implements theGraphinterface, butSEVPAs are nowGraphViewable.- The
automata-dot-visualizermodule has been refactored and many Swing-related classes have been made package-private. TheDOTclass is now the central factory class to access the functionality of the module. The previousDOTFrame(whose functionality is now accessible via, e.g.,DOT#renderDOTStrings) is now based on aJDialogwhich offers blocking modal semantics (e.g., for debugging purposes). - The
{Deterministc,NearLinear}EquivalenceTestclasses have become factories that cannot be instantiated anymore and only offer static methods. Graph'sadjacentTarget{,Iterator}(and related) methods have been renamed togetAdjacentNodes{,Iterator}.- Many classes of the
automata-incrementalartifact have been cleaned up to no longer expose internal classes in public interfaces. - The
Indefinite{,Simple}Graphclasses no longer haveCollection-based getters butIterable-based ones since indefinite structures typically cannot specify sizes. TheCollection-based getters are delegated to theGraphclass. Minimizerno longer provides agetInstance()method but can be instantiated directly.- The
OneSEVPAinterface has been generalized to an arbitrary (k-)SEVPAinterface. The oldOneSEVPAspecialization is still available and unchanged. - The
OneSEVPAUtilsclass has been merged into theOneSEVPAsclass. - The
RandomUtilclass has been made a factory (non-instantiable, only static methods) and its methods now require the random object as first parameter. - 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. ShortestPathsnow offers fewer but less confusing methods. Previously there were methods such asshortestPaththat took an initial node and multiple target nodes which much better fits to the idea of computingshortestPath*s*rather than any shortest path to one of the target nodes. The old behavior can still be replicated with the genericPredicate-based versions.StrictPriorityQueueis now package-private as it is only meant for internal use.Symbolnow has a type-safe user object and id-basedhashcode/equalssemantics.
Removed
- Removed the (package-private) classes
net.automatalib.util.automata.predicates.{AcceptanceStatePredicate,OutputSatisfies,TransitionPropertySatisfies}. - Removed the
IndefiniteSimpleGraph#asNormalGraph()method. Existing code should not need the transformation. - Removed
AbstractCompactNPGraph, useAbstractCompactGraphinstead. - Removed
AbstractCompactSimpleGraph. All functionality is provided inCompactSimpleGraph. - Removed
CmpUtil#safeComparator. UseComparators#nullsFirstorComparators#nullsLastinstead. - Removed
DelegateVisualizationHelperwithout replacement. Instead, directly override/extend theVisualizationHelperyou want to delegate to. - Removed the DFS-specific
DFSTraversalVisitor(and related classes) without replacement. Client-code that relied on this class can re-implement the functionality by providing an own implementation of the more generalGraphTraversalVisitor. See the changes on theDFSExamplefor reference. - Removed (unused)
DisjointSetForestIntclass without replacement. - Removed non-static methods on
RandomAutomatafactory (including thegetInstance()method). - Removed
net.automatalib.graphs.IndefiniteLTS.java. By naming, this class should denote aTransitionSystemand not aGraphstructure. However, sinceTransitionSystems are inherently labeled, this class serves no more real purpose. To re-establish the previous functionality, simply implementGraphandEdgeLabels. - The
Stream-based getters ofIndefinite{,Simple}Graphhave been removed in favor of theIterator-based ones. - Removed (unused)
SuffixTrieclass without replacement. Similar functionality can be achieved with AutomataLib's incremental module. - The
automata-dot-visualizermodule has been refactored and many Swing-related classes have been made package-private. TheDOTclass is now the central factory class to access the functionality of the module. The previousDOTFrame(whose functionality is now accessible via, e.g.,DOT#renderDOTStrings) is now based on aJDialogwhich offers blocking modal semantics (e.g., for debugging purposes).
Fixed
- Fixed a regression in
AbstractLTSminMonitorMealyregarding BBC (#46). - Fixed a bug in
CharacterizingSetswhich ignored the semantics of acceptors, i.e., not all states of an acceptor could be distinguished solely based on acceptance. - Fixed a bug in
Covers#transitionCoverIteratorwhich previously included undefined transitions. - Fixed a cache consistency bug in various DAG-based incremental builders.
New Contributors
- @AlnisM made their first contribution in #47
- @tiferrei made their first contribution in #50
- @ericcccsliu made their first contribution in #52
- @MokonaNico made their first contribution in https://github.com/LearnLib/automatalib/pull...
automatalib-0.10.0
Added
- All de-serializers now can also parse GZIP'ed contents from either
InputStreams,Files,URLs orbyte[]s.
Changed
- 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.outis passed as an output stream to simply print a serialized automaton and theSystem.outstream 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
Stateclass (used by theOneSEVPAautomaton) not longer supports the notion of a sink state. TheAbstractOneSEVPAclass now conforms with the default semantics of aDeterministicTransitionSystemthat undefined transitions simply returnnull.
Removed
- Removed
IOUtil#copy,IOUtil#skip,NullOutputStream. Use the Guava equivalents fromByteStreamsandCharStreams.
Fixed
- Correctly enquote outputs containing whitespaces in
TAFWriter(#37, thanks to @aschieweck) - Fixed a bug in the
Graphrepresentation ofAbstractOneSEVPAs (#39, thanks to @DonatoClun) - Fixed wrong default values in the overloaded methods of the
Minimizerclass (#41). - Replaced the 3rd-party DOT parser with our own implementation to fix the issue that multi-edges between nodes were not properly handled.
automatalib-0.9.0
Added
- A new alphabet implementation
MapAlphabetthat is based on the oldSimpleAlphabetbut without implementing theGrowingAlphabetinterface. IntRangeIteratornow implementsPrimitiveIterator.OfInt.- A parser for
dotfiles has been added and is available in theautomata-serialization-dotmodule via theDOTParsersfactory. - A new
PaigeTarjanMinimizationfactory 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
LTSminLTLParserto verify if LTL properties match the expected syntax of LTSmin. - A
WordCollectorfor collecting words from symbolStreams.
Changed
- Refactored the following packages/classes:
net.automatalib.words.impl.SimpleAlphabet->net.automatalib.words.impl.GrowingMapAlphabetnet.automatalib.serialization.AutomatonSerializationException->net.automatalib.serialization.FormatExceptionnet.automatalib.serialization.fsm.parser.FSMParseException->net.automatalib.serialization.fsm.parser.FSMFormatExceptionnet.automatalib.serialization.taf.parser.TAFParseException->net.automatalib.serialization.taf.parser.TAFFormatExceptionnet.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)IOExceptions 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
Removed
StringIndexGeneratorhas been removed. Its (streamlined) functionality is now available asMappingviaMappings#stringToIndexandMappings#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
VPDAlphabetinterface no longer specifies theget{Internal,Call,Return}Symbols()methods, as theget{Internal,Call,Return}Alphabet()methods supersede their functionality. PaigeTarjan{Initializers,Extractors}methods for nonIntAbstractions have been removed. You may use the new convenience methods provided byPaigeTarjanMinimization.- Further
@Deprecatedmethods have been removed. - Removed
ProbMealyTransitionand replaced it with the genericMealyTransitiondirectly carrying theProbabilisticOutput. It is no longer allowed to passnullas transition property. - Removed
OutputAndLocalInputs,StateLocalInputIncrementalMealyTreeBuilderandStateLocalInputMealyUtil. 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#completeinstead.
Fixed
- 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.
automatalib-0.8.0
Added
- Added support for model checking automata using the LTSmin model checker (thanks to Jeroen Meijer).
- Added a
CompactMooreimplementation. - Added an
AutomatonBuilderfor 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.
Changed
- Refactored the following packages/classes:
net.automatalib.automata.transout->net.automatalib.automata.transducersnet.automatalib.ts.transout->net.automatalib.ts.outputnet.automatalib.util.automata.transout->net.automatalib.util.automata.transducersnet.automatalib.automata.GrowableAlphabetAutomaton->net.automatalib.SupportsGrowingAlphabet
- Some runtime properties for dynamically configuring AutomataLib have been renamed. There now exists the
AutomataLibPropertyenum 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 asCompactDFAorCompactMealy) user-land code using the abstract classes may break. - The
BricsDFAwrapper 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 useBricsDFAs 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
SupportsGrowingAlphabetinterface) now requires the automaton to be initialized with aGrowingAlphabetinstance. 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.
Removed
- The mutable
Pairclass has been removed. The previously immutable pair classIPairhas been renamed toPair. - Some utility classes and functions (especially from the
automata-common-utilpackage) 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. RichArrayhas been removed. At least regarding storage,ArrayStoragecan be used as a replacement.SymbolHidingAlphabethas been removed without replacement. Changes to the logic of adding new input symbols should no longer make this class necessary.
Fixed
- Serializers now use platform dependent newlines. This shouldn't affect deserialization code.
- Several bugs detected by our ongoing efforts to write tests.
automatalib-0.7.1
Added
- Added
SymbolHidingAlphabet, which is required for a bugfix release of LearnLib.
Fixed
- 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
SimpleAlphabets 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.).
automatalib-0.7.0
Added
- 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.
Changed
-
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. TheVisualizationclass now works by providing either theautomata-dot-visualizerorautomata-jung-visualizerJAR at runtime. This allows for potentially more visualizers in the future.
-
Replaced
System.outlogging, 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.
Removed
- Several classes and methods annotated with
@Deprecated.
Fixed
- Several bugs detected either by our newly employed static code-analysis toolchain or by our ongoing efforts to write tests.