Releases: LearnLib/learnlib
learnlib-0.18.0
Added
- LearnLib now supports JPMS modules. All artifacts now provide a
module-infodescriptor except of the distribution artifacts (for Maven-less environments) which only provide anAutomatic-Module-Namedue to non-modular dependencies. Note that while this is a Java 9+ feature, LearnLib still supports Java 8 byte code for the remaining class files. - Added the L# active learning algorithm (thanks to @tiferrei).
- The
ADTLearnerhas been refactored to no longer use the (now-removed)SymbolQueryOraclebut a newAdaptiveMembershipOracleinstead which supports answering queries in parallel (thanks to @leonthalee). - The
ADTLearnercan now be parameterized in its counterexample analysis method (thanks to @mtf90). - Added an
InterningMembershipOracle(including refinements) to thelearnlib-cacheartifact that interns query responses to reduce memory consumption of large data structures. This exports the internal concepts of the DHC learner (which no longer interns query responses automatically, (thanks to @mtf90). StaticParallelOracleBuildernow supports custom executor services (thanks to @mtf90).
Changed
- The JPMS support introduces several changes:
- You now require at least a JDK 11 to build LearnLib.
- 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 LearnLib documentation on JDK 8 builds.
- Split packages had to be refactored.
- The
de.learnlib.oracle.parallelisminterfaces in thelearnlib-apiartifact have been moved to thede.learnlib.oraclepackage. - The
ThreadSafecaches have been moved from thelearnlib-parallelismartifact to thelearnlib-cacheartifact. - The
GrowingAlphabetandResumabletests from thelearnlib-learner-it-supportartifact been moved to thelearnlib-test-supportartifact. - The
OTUtilsclass no longer provides thedisplayHTMLInBrowsermethods in order to not depend onjava.desktop. If you relied on this functionality, use thewriteHTMLToFilemethods instead and callDesktop.getDesktop().open(file.toURI())yourself. - The classes in the
learnlib-learning-examplesartifact have their package renamed tode.learnlib.testsupport.example.
- The
- The
AbstractVisualizationTesthas been refactored into theVisualizationUtilsfactory. - Various counters (especially
*Counter*SULs) have been streamlined. In most cases there now exists a single counter that tracks multiple properties. - The
ReuseOracleBuilderandReuseTreeBuilderclasses are now auto-generated and therefore reside in the respective packages of their previously enclosing classes. - The
TTTLearnerMealy#createTransitionmethod no longer queries for its transition output directly, but instead requires a call toinitTransitionsnow. - With the removal of the
learnlib-annotation-processorartifact (see below), thelearnlib-build-configartifact is now part of thede.learnlibgroup again. - The
learnlib-datastructure-ot,learnlib-datastructure-dt,learnlib-datastructure-list, andlearnlib-datastructure-ptaartifacts have been merged into a newlearnlib-datastructuresartifact. - The
learnlib-omlartifact (including its packages and class names) has been renamed tolearnlib-lambda. - Switched to AutomataLib 0.12.0.
Removed
- The
de.learnlib.tooling:learnlib-annotation-processorartifact has been dropped. The functionality has been moved to a standalone project. - The
de.learnlib:learnlib-rpni-edsmandde.learnlib:learnlib-rpni-mdlartifacts have been dropped. The code has been merged with thede.learnlib:learnlib-rpniartifact. MQUtilhas been stripped of unused methods. Especially thequerymethod can be simulated by the respective oracles themselves.PropertyOracles can no longer set a property. This value is now immutable and must be provided during instantiation. Previously, the internal state wasn't updated accordingly if a property was overridden.SymbolQueryOracles (and related code such as the respective caches, counters, etc.) have been removed without replacement. Equivalent functionality on the basis of the newAdaptiveMembershipOracles is available instead.
Fixed
- Improved query batching of
TTTlearner (both the regular and visibly push-down version).
New Contributors
- @leonthalee made their first contribution in #132
- @tiferrei made their first contribution in #141
learnlib-0.17.0
Added
- Migrated the AAAR algorithm from the old closed-source LearnLib (thanks to @mtf90).
- Added Moore versions of the
OP,TTT, andLStarlearners (thanks to @mohbayram). - Added the OML (optimal-MAT-learner) active learning algorithm (thanks to @fhowar).
- Added the OSTIA passive learning algorithm (thanks to @aleksander-mendoza).
- The
RPNIlearner now supportsMooreMachines (thanks to @mtf90). - Added new learning algorithms for procedural systems such as SPAs, SBAs, and SPMMs (thanks to @mtf90).
Changed
- Refactorings
-
Many LearnLib packages have been refactored from plural-based keywords to singular-based keywords. Some examples are
- renamed all learning algorithm packages from
de.learnlib.algorithms.*tode.learnlib.algorithm.*. - renamed
de.learnlib.counterexamples.*tode.learnlib.counterexample.*. - renamed
de.learnlib.drivers.*tode.learnlib.driver.*. - renamed
de.learnlib.util.statistics.*tode.learnlib.util.statistic.*. - etc.
While this may cause some refactoring, it should only affect import statements as the names of most classes remain identical.
- renamed all learning algorithm packages from
-
Some actual re-namings concern
- All code concerning visibly push-down automata now uses the "vpa" acronym (previously "vpda"). This includes package names, class names and (Maven) module names.
- The "discrimination-tree" learner has been renamed to "observation-pack". This includes classes (
DTLearnerDFA->OPLearnerDFA, etc.), package names, and Maven modules. The same refactoring happened for the VPA-based version of the learner. - The
learnlib-acexMaven module has been merged with thelearnlib-counterexamplesmodule. - Classes in the
learnlib-apihave been moved fromde.learnlib.apitode.learnlib. - Refactored the package
de.learnlib.datastructure.pta.pta.*tode.learnlib.datastructure.pta.*. - Refactored the package
de.learnlib.driver.util.*tode.learnlib.driver.simulator.*. - Moved classes from the package
de.learnlib.mapper.api.*tode.learnlib.sul.*. - Renamed
PassiveLearnerVariantTICasetoPassiveLearnerVariantITCase.
-
AbstractTTTHypothesishas received an additional type parameter for its state type.AutomatonOracle#acceptsno longer has alengthparameter. Provide a correctly sizedinputiterable instead.- Classes revolving around the
ContextExecutableInputSULhave been moved from thelearnlib-mappermodule to thelearnlib-drivers-basicmodule. - The
CounterOracleandJointCounterOraclehave been merged. Now there only exists a singleCounterOraclethat counts both the number of queries and the number of symbols therein. - The
{DFA,Mealy}CacheOracles and theSULCacheare no longer thread-safe because the intended pipeline of a parallel setup (as suggested by the LearnLib factory methods) consists of a single-threaded cache that delegates to parallel (non-cached) oracles. Here, the synchronization logic only adds unnecessary overhead. In case you want a shared, thread-safe cache (which was currently not possible to set up conveniently) thelearnlib-parallelismmodule now contains theThreadSafe{DFA,Mealy,SUL}Cachesfactories which allow one to construct parallel oracles (whose parameters and return types are tailored towards using ourParallelOracleBuildersfactory) with a shared cache. See the in-treeParallelismExample2for reference. PTAs now read their sample inputs asIntSeqs.PassiveLearningAlgorithm#computeModeldid not specify whether repeated calls to the method should yield identical models. It is now explicitly left open to the respective implementation to support this behavior.BlueFringeRPNI{DFA,Mealy,Moore}explicitly does not support this behavior, as the internal prefix-tree acceptor is now constructed on-the-fly as samples are added via theaddSamplemethods. This allows to drop the previously redundant caching of samples and reduce memory pressure.BlueFringeEDSMDFAandBlueFringeMDLDFAstill have to cache the samples internally and therefore still support repeated model construction.- The
Resumablesemantics have changed: the returned state object no longer implementsSerializable. 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. See the in-treeResumableExamplefor reference. - The
ADTclass is no longer initialized with aleafSplitterbut theextendLeafandsplitLeafmethods take an additional argument. This allows for a more customizable behavior. - The automaton-specific
SimulatorOracles are now generated automatically and therefore reside in the packagede.learnlib.oracle.membershiprather that being an inner-class of theSimulatorOracle. SymbolQueryCachenow needs to be created via theMealyCachesfactory.SimplePOJOTestDriverno longer uses a mapper to suppressSULExceptions but instead operates directly on the POJO with simplified inputs/outputs and propagates any exceptions thrown. To complement this change, the oldSimplePOJODataMapperhas been renamed toSimplePOJOExceptionMapperand only deals with mapping exceptions now. The old behavior can be restored by combining the two classes manually viaSULMappers#apply.- Switched to AutomataLib 0.11.0.
Removed
- Removed (unused)
de.learnlib.datastructure.pta.pta.PropertyConflictException,de.learnlib.datastructure.observationtable.InvalidRowException. - Removed the (protected)
exposeInternalHypothesismethod onAbstractAutomatonLStar. Subclasses should directly implement thegetHypothesisModelmethod. - Removed the
EquivalenceQueriesfactory. All provided equivalence checkers are available via public constructors which allow for more flexible parameterization. - Removed the
Filterinterface andFilterChainclass. Instantiating the filters that are required for constructing a filter chain already requires setting the delegate oracles. Therefore, the only effect of this interface is that the attributes of the filters cannot be final. - Removed
LearnLogger. All code was migrated to use the native SLF4j facade and now uses the markers provided in theCategoryclass to accentuate the different log messages and provide client code with a means to handle the different log messages (similar to the previous purpose-specific log methods).
Fixed
- Fixed a bug when adding new alphabet symbols to LStar-based learners which use a counterexample handler that requires consistency checks.
New Contributors
- @aleksander-mendoza made their first contribution in #74
- @mohbayram made their first contribution in #87
learnlib-0.16.0
Added
- A
StateLocalInputSULSymbolQueryOracleto wrap aStateLocalInputSULin aSymbolQueryOracle(e.g. to learn partial systems with the ADT learner). - Added an example for parallel setups (
ParallelismExample1).
Changed
- The
SULSymbolQueryOraclenow better handles thepreandpostcycles of aSUL(e.g. calls to theresetmethod now allow to close the embeddedSULfrom outside). - Reworked parallel oracles
- Several
SULOraclevariants are no longer thread-safe. This reduces overhead for scenarios where no parallelism is required. - The
ParallelOracleBuildersfactory now offers builder methods forSULs,ObservableSULs,StateLocalInputSULs,MembershipOracless andOmegaMembershipOracles to allow an easy (and correct) construction of parallel setups given one of the mentioned implementations.
- Several
- Refactored the following packages/classes:
de.learnlib.oracle.parallelism.ParallelOracleInterruptedException->de.learnlib.api.oracle.parallelism.BatchInterruptedException
- The
initialPrefixesandinitialSuffixesmethods ofAbstractExtensibleAutomatonLStarare nowfinalsince these values can be provided via the constructor of the class. This allows one to simplify sub-classes. - Updated to AutomataLib 0.10.0
Removed
- Removed the
learnlib.queries.parallel.thresholdproperty. Learning setups that want to use parallelism now need to explicitly setup parallel oracles. - Removed
MQUtil#answerQueries{Auto,Parallel}andMQUtil#answerOmegaQueries{Auto,Parallel}) LassoOracle#isOmegaCounterExample(boolean)has been removed. This decision can be directly integrated into the#findCounterExamplemethod which has more information available.
Fixed
learnlib-0.15.0
Changed
- The
{DFA,Mealy,}W{p,}MethodEQOracle(MembershipOracle, int, int)constructor no longer interprets its secondintparameter as the batch size, but as an estimate for the expected SUL size. In order to explicitly set the batch size of the oracle, use the{DFA,Mealy,}W{p,}MethodEQOracle(MembershipOracle, int, int, int)constructor. Now, the two parameterslookaheadandexpectedSizewill determine the length of the middle part viaMath.max(lookahead, expectedSize - hypothesis.size()). This allows to dynamically adjust the length of the middle part throughout the learning process. See LearnLib/automatalib#32. - Several DFA/Mealy specific (oracle) subclasses are now automatically generated. As a result they are no longer an inner class but an independent top-level class. This requires to update the import statements.
- JSR305 annotations have been replaced with checker-framework annotations.
- LearnLib (incl. AutomataLib) now follows checker-framework's convention that (non-annotated) types are usually considered non-null unless explicitly annotated with
@Nullable. - LearnLib (incl. AutomataLib) no longer has a (runtime-) dependency on JSR305 (and other
javax.*) annotations or includes them in the distribution artifact. This now makes LearnLib (incl. AutomataLib) compliant with Oracle's binary code license and allows LearnLib (incl. AutomataLib) artifacts as-is to be bundled in binary distributions with Oracle's JDKs/JREs.
- LearnLib (incl. AutomataLib) now follows checker-framework's convention that (non-annotated) types are usually considered non-null unless explicitly annotated with
- A lot of code for inferring partial Mealy machines (esp.
PartialLStarMealyandPartialObservationTable) has been removed/refactored. The concept of state local inputs is now implemented as a SUL filter and introduces a specialStateLocalInputSULOraclewhich early-answers queries that would traverse unavailable inputs with a previously specified symbol. This way, queries that would traverse undefined input symbols still won't be executed on the SUL but the SUL appears as a 'total' Mealy system to the learner, allowing one to use every currently existing Mealy learner as-is. See the in-tree examples for more information. SULCacheno longer implementsMembershipOracle.- Updated to AutomataLib 0.9.0
Removed
- As a remainder of its initial implementation, the
TTTEventListener(and the corresponding event feature in the TTT algorithm) has been removed due to the lack of usage.
learnlib-0.14.0
Added
- Added support for black-box-checking (thanks to Jeroen Meijer).
- Added support for learning partial Mealy Machines with state-local inputs via L* (thanks to Maren Geske).
- Added support for resumable caches.
DynamicParallelOracles can now be constructed from a collection of independent oracles.- Support for Java 11. Note: LearnLib/AutomataLib still targets Java 8, and thus needs classes provided by this environment (specifically: annotations from
javax.annotation). If you plan to use LearnLib/AutomataLib in a Java 11+ environment, make sure to provide these classes. They are not shipped with LearnLib/AutomataLib.
Changed
- Refactored the following packages/classes:
de.learnlib.api.algorithm.feature.SupportsGrowingAlphabet->net.automatalib.SupportsGrowingAlphabetde.learnlib.api.algorithm.feature.ResumableLearner->de.learnlib.api.Resumable
- Some runtime properties for dynamically configuring LearnLib have been renamed. There now exists the
LearnLibPropertyenum as a single reference point for all available properties. - The node iterators for discrimination trees are now hidden behind the
DiscriminationTreeIteratorsfactory. - Parallel Oracles:
- The
withDefault*methods have been removed from the{Dynamic,Static}PrallelOracleBuilders. If needed, use the regularwith*methods and supply the public default values from{Dynamic,Static}PrallelOracle. - The
new*ParallelOraclemethods from theParallelOracleBuildersfactory no longer interpret a single membership oracle parameter as a supplier to a shared oracle, but rather as a single oracle (and thus return a builder for a parallel oracle with fixed pool size).
- The
- Adding new symbols to learning algorithms (via the
SupportsGrowingAlphabetinterface) now requires the learner 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 LearnLib making decisions on behalf of the user. - Discrimination-Tree based Learners (DT, KV, TTT) now batch queries whenever possible, thus allowing to fully utilize parallel oracles.
- Also, see the changes in AutomataLib
Fixed
- Several bugs detected by our ongoing efforts to write tests.
learnlib-0.13.1
Fixed
- Fixed an out-of-bounds error in a cache implementation
- Fixed visibility issues with exportable classes used for the
ResumableLearnerinterface - Fixed an issue when adding a new symbol to a learner and the initial alphabet was already an instance of
GrowableAlphabet - General consolidations (typos, wrong documentation, etc.)
learnlib-0.13.0
Added
- Added randomized version of W(p)-Method based equivalence oracles (see #40)
- Added the ADT (adaptive distinguishing tree) active learning algorithm
- Added two active learning algorithms for visibly pushdown languages.
- Added the RPNI (regular positive-negative inference) passive learning algorithm, including EDSM (evidence-driven state merging) and MDL (minimum description length) variants.
- Many active learning algorithms now support adding additional alphabet symbols after initial instantiation/starting of the learning process.
- Added support for suspending the learning process to a savable / serializable state. The learning process may be resumed from this state at a later point in time.
- Added the
AbstractTestWordEQOracleclass, which allows to implement custom equivalence oracles solely based on lazy (stream-based) test-word generation. Existing equivalence oracles (as far as possible) have been reworked to extend this class and thus profit from its built-in laziness and batch (parallelization) support.
Changed
-
Refactored the Maven artifact and Java package structure. Have a look at the List of LearnLib 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.
- Changes to AutomataLib.
-
Replaced
System.outand JUL logging, with calls to a 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.
Fixed
- Several bugs detected either by our newly employed static code-analysis toolchain or by our ongoing efforts to write tests.