Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
e2c174e
Made RowImpl public to enable access in custom observation table impl…
tupaul Oct 8, 2025
4807bc3
Made several methods of RowImpl public, to enable external access fro…
tupaul Oct 8, 2025
b029c9c
Started with integration of MMLT.
tupaul Oct 9, 2025
de73202
Extended EquivalenceOracle.java with LocalTimerMealyEquivalenceOracle.
tupaul Oct 9, 2025
17ee816
Created module for symbol filters; added tests for counterexample han…
tupaul Oct 9, 2025
2bd8339
Functions for printing stats as JSON/YAML.
tupaul Oct 9, 2025
4d49690
Renamed statsContainer; exporting mmlt caches.
tupaul Oct 9, 2025
d1e6389
Included symbol-filters module in dependency management.
tupaul Oct 9, 2025
f04b72f
Renamed fast cache to cache for MMLTs; added integration tests for MM…
tupaul Oct 9, 2025
3bff48d
Added more test models for the MMLT learner.
tupaul Oct 9, 2025
283b026
Added more test models for the MMLT learner.
tupaul Oct 9, 2025
0ae2318
Added cache consistency test for MMLT learning.
tupaul Oct 9, 2025
0efb484
Removed location type parameter from LocalTimerMealyEquivalenceOracle.
tupaul Oct 10, 2025
6aeeb9d
Cache for MMLTs now inherits LearningCache
tupaul Oct 10, 2025
11aab34
Multiple EQ tests for MMLTs can now respect the provided list of inpu…
tupaul Oct 10, 2025
2cc45ba
Added tests for the cache; cleaned-up some files.
tupaul Oct 10, 2025
93cc1b1
Added tests for the MMLT cache consistency test.
tupaul Oct 10, 2025
86432b5
Made the MMLT SUL an interface with default methods.
tupaul Oct 10, 2025
f60e7f2
Made symbol filters more independent from MMLTs
tupaul Oct 13, 2025
e76e954
StatisticsSymbolFilter has stats container as constructor parameter.
tupaul Oct 13, 2025
61e9b19
Moved several MMLT examples to test-support.
tupaul Oct 13, 2025
be3dac3
Added an example for learning MMLTs; added module info for symbol fil…
tupaul Oct 13, 2025
20e4db1
Added an example for learning MMLTs; added module info for symbol fil…
tupaul Oct 13, 2025
4cf0a0a
Added more descriptions for included MMLT models
tupaul Oct 15, 2025
29c276f
More info on model params
tupaul Oct 15, 2025
2acd44a
Updated reset search oracle to check if it can return a counterexampl…
tupaul Oct 16, 2025
de21bb0
adjust to AutomataLib refactorings
mtf90 Nov 10, 2025
5beb6fb
adjust to AutomataLib refactorings
mtf90 Nov 10, 2025
015bfc3
adjust to AutomataLib refactorings
mtf90 Nov 10, 2025
379502a
Using correct function to render MMLT in example.
tupaul Nov 11, 2025
fce5471
Replaced getUntimedAlphabet with getInputAlphabet
tupaul Nov 11, 2025
929b07e
MMLT-Learner now explicitly takes untimed inputs in constructor.
tupaul Nov 11, 2025
903cdf7
initial refactorings / cleanups
mtf90 Nov 11, 2025
e76ec6a
cleanup/generalize (integration-) tests
mtf90 Nov 18, 2025
1926d93
replace explicit StatsContainer with ServiceLoader-based approach
mtf90 Nov 19, 2025
910274d
experimental: replace old statistics collection with new approach
mtf90 Nov 19, 2025
5f1fb46
add missing stats reset
mtf90 Nov 20, 2025
e9a1975
make MapStatsContainer thread-safe and fix tests
mtf90 Nov 20, 2025
3adca96
refactor symbol filters
mtf90 Nov 21, 2025
7d0af4f
adjust to AutomataLib refactorings
mtf90 Nov 22, 2025
0db864f
fix code-analysis remarks up until L* module
mtf90 Nov 23, 2025
fe3979f
cleanups
mtf90 Nov 23, 2025
7d8babb
Removed sorting of prefixes from location cover, to reflect automataL…
tupaul Nov 24, 2025
811b883
Updated MMLT examples.
tupaul Nov 24, 2025
2e0210f
Added more info about MMLTs.
tupaul Nov 24, 2025
7e4269c
Re-enabled visualization in MMLT examples.
tupaul Nov 24, 2025
07aeef6
Updated to AutomataLib changes: timers in MMLTs now support multiple …
tupaul Nov 24, 2025
b37eefd
Added example for loading setting up a custom MMLT model.
tupaul Nov 25, 2025
bb860e5
Wording
tupaul Nov 25, 2025
c47d0e9
Fixed bug that prevented duplicate timer outputs during timer inference.
tupaul Nov 25, 2025
5b86f63
fix issues flagged by code-analysis
mtf90 Nov 25, 2025
1500902
cleanups + tests
mtf90 Nov 28, 2025
d0749ae
cleanups, parallel timed oracles, test cases
mtf90 Dec 1, 2025
160b7b8
more rigorous testing
mtf90 Dec 2, 2025
56b4781
make learner + OT batch queries to better support parallel oracles
mtf90 Dec 2, 2025
679a800
cleanups
mtf90 Dec 7, 2025
866d448
statistics overhaul
mtf90 Dec 13, 2025
43b485d
updated changelog
mtf90 Dec 13, 2025
64cf495
mmlt: add test for some corner cases
mtf90 Dec 13, 2025
002f77c
drop toString() of internal record
mtf90 Dec 13, 2025
645c52a
Merge branch 'develop' into local_timer_mealy
mtf90 Dec 13, 2025
c39e7db
filters: try to address some of the flaky tests on windows
mtf90 Dec 13, 2025
ea33c38
filters: try to work around some platform issues
mtf90 Dec 13, 2025
6a71fc9
build: ignore generated MMLT class
mtf90 Dec 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### Added

* Added a new (L*-based) learning algorithm for *Mealy machines with local timers* (MMLTs), including support for parallel queries, caching, and conformance testing (thanks to [Paul Kogel](https://github.com/pdev55)).
* Added an `EarlyExitEQOracle` which for a given `AdaptiveMembershipOracle` and `TestWordGenerator` stops the evaluation of (potentially long) Mealy-based equivalence tests as soon as a mismatch with the hypothesis is detected, potentially improving the symbol performance of the given equivalence oracle.

### Changed

* LearnLib now requires Java 17 at runtime.
* Statistics collection has received a major rework. Previously, classes would implement the `StatisticCollector` interface and return a `StatisticData` object which 1) only allows for describing a very limited amount of data, and 2) requires you to keep track of all the objects that collect data. This approach has been *replaced* by a new `StatisticsService`. Instances of this service can be obtained similar to a logger via `Statistics.getService()` and require you to provide an implementation of this service on the classpath (a default one is provided by the `learnlib-statistics` module). The new service allows arbitrary components to collect various data which can be conveniently extracted based on the new `StatisticsKey`s used by the components. For more details on advanced scenarios (such as multi-threaded benchmarking), see the documentation of the respective classes. While this may require you to adjust the way you are collecting statistics, all functionality from beforehand should still be available.
* `SimpleProfiler` has been replaced by the new clock-based statistics.
* The `generateTestWords` method of `AbstractTestWordEQOracle` now needs to be public.

### Fixed
Expand Down
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,19 @@ While certain features have been stripped for improved modularity, development h
Currently, the following learning algorithms with respective target models are supported:


| Algorithm (active) | Target models | | Algorithm (passive) | Models |
|---------------------|-----------------------------|-----|-----------------------|-----------------------|
| AAAR | `DFA` `Mealy` `Moore` | | OSTIA | `SST` |
| ADT | `Mealy` | | RPNI (incl. variants) | `DFA` `Mealy` `Moore` |
| DHC | `Mealy` | | | |
| Kearns & Vazirani | `DFA` `Mealy` | | | |
| Lambda | `DFA` `Mealy` | | | |
| L# | `Mealy` | | | |
| L* (incl. variants) | `DFA` `Mealy` `Moore` | | | |
| NL* | `NFA` | | | |
| Observation Pack | `DFA` `Mealy` `Moore` `VPA` | | | |
| Procedural | `SPA` `SBA` `SPMM` | | | |
| TTT | `DFA` `Mealy` `Moore` `VPA` | | | |
| Algorithm (active) | Target models | | Algorithm (passive) | Models |
|---------------------|------------------------------|-----|-----------------------|-----------------------|
| AAAR | `DFA` `Mealy` `Moore` | | OSTIA | `SST` |
| ADT | `Mealy` | | RPNI (incl. variants) | `DFA` `Mealy` `Moore` |
| DHC | `Mealy` | | | |
| Kearns & Vazirani | `DFA` `Mealy` | | | |
| Lambda | `DFA` `Mealy` | | | |
| L# | `Mealy` | | | |
| L* (incl. variants) | `DFA` `Mealy` `Moore` `MMLT` | | | |
| NL* | `NFA` | | | |
| Observation Pack | `DFA` `Mealy` `Moore` `VPA` | | | |
| Procedural | `SPA` `SBA` `SPMM` | | | |
| TTT | `DFA` `Mealy` `Moore` `VPA` | | | |

Additionally, LearnLib offers a variety of tools to ease the practical application of automata learning on real-world systems.
This includes drivers and mappers for interfacing software systems with the LearnLib API as well as caches and parallelization for improving the overall performance of the learning setup.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import de.learnlib.oracle.equivalence.MealySimulatorEQOracle;
import de.learnlib.oracle.membership.MealySimulatorOracle;
import de.learnlib.oracle.membership.SULAdaptiveOracle;
import de.learnlib.statistic.Statistics;
import de.learnlib.sul.SUL;
import de.learnlib.testsupport.MQ2AQWrapper;
import de.learnlib.testsupport.it.learner.AbstractMealyLearnerIT;
Expand Down Expand Up @@ -130,6 +131,7 @@ public void testIssue137() throws IOException, FormatException {
for (int seed = 0; seed < 50; seed++) {
long last = 0;
for (int iter = 0; iter < 5; iter++) {
Statistics.getService().clear();
final CounterAdaptiveQueryOracle<String, String> counter =
new CounterAdaptiveQueryOracle<>(aqo);
final ADTLearner<String, String> learner = new ADTLearner<>(alphabet,
Expand All @@ -151,7 +153,8 @@ public void testIssue137() throws IOException, FormatException {

exp.run();

final long count = counter.getResetCounter().getCount();
final long count =
Statistics.getService().getCount(CounterAdaptiveQueryOracle.KEY_RESET).orElse(0L);

if (iter == 0) {
last = count;
Expand Down
29 changes: 29 additions & 0 deletions algorithms/active/lstar/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ limitations under the License.
<groupId>de.learnlib</groupId>
<artifactId>learnlib-counterexamples</artifactId>
</dependency>
<dependency>
<groupId>de.learnlib</groupId>
<artifactId>learnlib-symbol-filters</artifactId>
</dependency>
<dependency>
<groupId>de.learnlib</groupId>
<artifactId>learnlib-util</artifactId>
Expand Down Expand Up @@ -124,6 +128,21 @@ limitations under the License.
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</dependency>
<dependency>
<groupId>net.automatalib</groupId>
<artifactId>automata-serialization-dot</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.learnlib</groupId>
<artifactId>learnlib-cache</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.learnlib</groupId>
<artifactId>learnlib-statistics</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand All @@ -134,6 +153,16 @@ limitations under the License.
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- append to existing argLine to nicely work together with jacoco plugin -->
<!-- allow tests access to util and statistics -->
<argLine>@{argLine} --add-reads=de.learnlib.algorithm.lstar=net.automatalib.util</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<!-- append to existing argLine to nicely work together with jacoco plugin -->
<!-- allow tests access to util and statistics -->
<argLine>@{argLine} --add-reads=de.learnlib.algorithm.lstar=net.automatalib.util</argLine>
</configuration>
</plugin>
Expand Down
Loading