Skip to content

Commit c4c9b9c

Browse files
committed
EQ Oracle refactoring / clean ups.
Changed the order of type parameters to always start with an Automata when needed (<I, D, A> -> <A, I, D>). All constructors now have the membership oracle as their first parameter. Added a bunch of DFA and Mealy versions of the oracles for easier (and type correct) use. Added the Random Word and Complete Exploration Oracle to the EquivalenceQueries factory.
1 parent ae17b73 commit c4c9b9c

13 files changed

Lines changed: 376 additions & 88 deletions

File tree

algorithms/active/lstar/src/test/java/de/learnlib/algorithms/lstar/LStarDFATest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ public void testLStar() {
5353
List<EquivalenceOracle<? super DFA<?, Symbol>, Symbol, Boolean>> eqOracles = new ArrayList<>();
5454

5555
eqOracles.add(new SimulatorEQOracle<>(targetDFA));
56-
eqOracles.add(new WMethodEQOracle<>(3, dfaOracle));
57-
eqOracles.add(new WpMethodEQOracle<>(3, dfaOracle));
56+
eqOracles.add(new WMethodEQOracle<>(dfaOracle, 3));
57+
eqOracles.add(new WpMethodEQOracle<>(dfaOracle, 3));
5858

5959
for (ObservationTableCEXHandler<? super Symbol, ? super Boolean> handler : LearningTest.CEX_HANDLERS) {
6060
for (ClosingStrategy<? super Symbol, ? super Boolean> strategy : LearningTest.CLOSING_STRATEGIES) {

examples/src/main/java/de/learnlib/examples/example1/Example.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public static void main(String[] args) throws IOException {
7171
// construct a W-method conformance test
7272
// exploring the system up to depth 4 from
7373
// every state of a hypothesis
74-
DFAWMethodEQOracle<Character> wMethod = new DFAWMethodEQOracle<>(EXPLORATION_DEPTH, mqOracle);
74+
DFAWMethodEQOracle<Character> wMethod = new DFAWMethodEQOracle<>(mqOracle, EXPLORATION_DEPTH);
7575

7676
// construct a learning experiment from
7777
// the learning algorithm and the conformance test.

examples/src/main/java/de/learnlib/examples/example2/Example.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ public static void main(String[] args) throws NoSuchMethodException, IOException
102102

103103
// create random walks equivalence test
104104
MealyEquivalenceOracle<MethodInput, AbstractMethodOutput> randomWalks =
105-
new RandomWalkEQOracle<>(RESET_PROBABILITY, // reset SUL w/ this probability before a step
105+
new RandomWalkEQOracle<>(driver, // system under learning
106+
RESET_PROBABILITY, // reset SUL w/ this probability before a step
106107
MAX_STEPS, // max steps (overall)
107108
false, // reset step count after counterexample
108-
new Random(RANDOM_SEED), // make results reproducible
109-
driver // system under learning
109+
new Random(RANDOM_SEED) // make results reproducible
110110
);
111111

112112
// construct a learning experiment from

oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/CompleteExplorationEQOracle.java

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020

2121
import com.google.common.collect.Streams;
2222
import de.learnlib.api.oracle.MembershipOracle;
23-
import net.automatalib.automata.concepts.DetOutputAutomaton;
23+
import net.automatalib.automata.concepts.Output;
24+
import net.automatalib.automata.fsa.DFA;
25+
import net.automatalib.automata.transout.MealyMachine;
2426
import net.automatalib.commons.util.collections.CollectionsUtil;
2527
import net.automatalib.words.Word;
2628

@@ -35,7 +37,7 @@
3537
*
3638
* @author Malte Isberner
3739
*/
38-
public class CompleteExplorationEQOracle<I, D> extends AbstractTestWordEQOracle<DetOutputAutomaton<?, I, ?, D>, I, D> {
40+
public class CompleteExplorationEQOracle<I, D> extends AbstractTestWordEQOracle<Output<I, D>, I, D> {
3941

4042
private final int minDepth;
4143
private final int maxDepth;
@@ -85,9 +87,81 @@ public CompleteExplorationEQOracle(MembershipOracle<I, D> sulOracle, int minDept
8587
}
8688

8789
@Override
88-
protected Stream<Word<I>> generateTestWords(DetOutputAutomaton<?, I, ?, D> hypothesis,
90+
protected Stream<Word<I>> generateTestWords(Output<I, D> hypothesis,
8991
Collection<? extends I> inputs) {
9092
return Streams.stream(CollectionsUtil.allTuples(inputs, minDepth, maxDepth)).map(Word::fromList);
9193
}
9294

95+
public static class DFACompleteExplorationEQOracle<I>
96+
extends AbstractTestWordEQOracle<DFA<?, I>, I, Boolean>
97+
implements DFAEquivalenceOracle<I> {
98+
99+
private final CompleteExplorationEQOracle<I, Boolean> delegate;
100+
101+
public DFACompleteExplorationEQOracle(MembershipOracle<I, Boolean> mqOracle,
102+
int maxDepth) {
103+
super(mqOracle);
104+
this.delegate = new CompleteExplorationEQOracle<>(mqOracle, maxDepth);
105+
}
106+
107+
public DFACompleteExplorationEQOracle(MembershipOracle<I, Boolean> mqOracle,
108+
int minDepth,
109+
int maxDepth) {
110+
super(mqOracle);
111+
this.delegate = new CompleteExplorationEQOracle<>(mqOracle, minDepth, maxDepth);
112+
}
113+
114+
public DFACompleteExplorationEQOracle(MembershipOracle<I, Boolean> mqOracle,
115+
int minDepth,
116+
int maxDepth,
117+
int batchSize) {
118+
super(mqOracle, batchSize);
119+
this.delegate = new CompleteExplorationEQOracle<>(mqOracle, minDepth, maxDepth, batchSize);
120+
}
121+
122+
@Override
123+
protected Stream<Word<I>> generateTestWords(DFA<?, I> hypothesis,
124+
Collection<? extends I> inputs) {
125+
return delegate.generateTestWords(hypothesis, inputs);
126+
}
127+
128+
}
129+
130+
public static class MealyCompleteExplorationEQOracle<I, O>
131+
extends AbstractTestWordEQOracle<MealyMachine<?, I, ?, O>, I, Word<O>>
132+
implements MealyEquivalenceOracle<I, O> {
133+
134+
private final CompleteExplorationEQOracle<I, Word<O>> delegate;
135+
136+
public MealyCompleteExplorationEQOracle(MembershipOracle<I, Word<O>> mqOracle,
137+
int maxDepth) {
138+
super(mqOracle);
139+
this.delegate = new CompleteExplorationEQOracle<>(mqOracle, maxDepth);
140+
}
141+
142+
public MealyCompleteExplorationEQOracle(MembershipOracle<I, Word<O>> mqOracle,
143+
int minDepth,
144+
int maxDepth) {
145+
super(mqOracle);
146+
this.delegate = new CompleteExplorationEQOracle<>(mqOracle,
147+
minDepth, maxDepth);
148+
}
149+
150+
public MealyCompleteExplorationEQOracle(MembershipOracle<I, Word<O>> mqOracle,
151+
int minDepth,
152+
int maxDepth,
153+
int batchSize) {
154+
super(mqOracle, batchSize);
155+
this.delegate = new CompleteExplorationEQOracle<>(mqOracle, minDepth, maxDepth, batchSize);
156+
}
157+
158+
@Override
159+
protected Stream<Word<I>> generateTestWords(MealyMachine<?, I, ?, O> hypothesis,
160+
Collection<? extends I> inputs) {
161+
return delegate.generateTestWords(hypothesis, inputs);
162+
}
163+
164+
}
165+
166+
93167
}

oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/EquivalenceQueries.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,28 @@ private EquivalenceQueries() {
2525
// prevent instantiation
2626
}
2727

28-
public static <A extends UniversalDeterministicAutomaton<?, I, ?, ?, ?> & Output<I, D>, I, D> WMethodEQOracle<A, I, D> wMethod(
29-
int maxDepth,
30-
MembershipOracle<I, D> sulOracle) {
31-
return new WMethodEQOracle<>(maxDepth, sulOracle);
28+
public static <A extends Output<I, D>, I, D> RandomWordsEQOracle<A, I, D>
29+
randomWords(MembershipOracle<I, D> sulOracle, int minLength, int maxLength, int maxTests) {
30+
return new RandomWordsEQOracle<>(sulOracle, minLength, maxLength, maxTests);
3231
}
3332

34-
public static <A extends UniversalDeterministicAutomaton<?, I, ?, ?, ?> & Output<I, D>, I, D> WpMethodEQOracle<A, I, D> wpMethod(
35-
int maxDepth,
36-
MembershipOracle<I, D> sulOracle) {
37-
return new WpMethodEQOracle<>(maxDepth, sulOracle);
33+
public static <I, D> CompleteExplorationEQOracle<I, D>
34+
complete(MembershipOracle<I, D> sulOracle, int maxDepth) {
35+
return new CompleteExplorationEQOracle<>(sulOracle, maxDepth);
3836
}
3937

40-
public static <A extends UniversalDeterministicAutomaton<?, I, ?, ?, ?> & Output<I, D>, I, D> SimulatorEQOracle<I, D> simulator(
41-
A target) {
38+
public static <A extends UniversalDeterministicAutomaton<?, I, ?, ?, ?> & Output<I, D>, I, D> WMethodEQOracle<A, I, D>
39+
wMethod(MembershipOracle<I, D> sulOracle, int maxDepth) {
40+
return new WMethodEQOracle<>(sulOracle, maxDepth);
41+
}
42+
43+
public static <A extends UniversalDeterministicAutomaton<?, I, ?, ?, ?> & Output<I, D>, I, D> WpMethodEQOracle<A, I, D>
44+
wpMethod(MembershipOracle<I, D> sulOracle, int maxDepth) {
45+
return new WpMethodEQOracle<>(sulOracle, maxDepth);
46+
}
47+
48+
public static <A extends UniversalDeterministicAutomaton<?, I, ?, ?, ?> & Output<I, D>, I, D> SimulatorEQOracle<I, D>
49+
simulator(A target) {
4250
return new SimulatorEQOracle<>(target);
4351
}
4452

oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/IncrementalWMethodEQOracle.java

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,15 @@ public class IncrementalWMethodEQOracle<A extends UniversalDeterministicAutomato
3434
private final IncrementalWMethodTestsIterator<I> incrementalWMethodIt;
3535
private int maxDepth;
3636

37-
public IncrementalWMethodEQOracle(Alphabet<I> alphabet, MembershipOracle<I, D> oracle) {
38-
this(alphabet, oracle, 1);
37+
public IncrementalWMethodEQOracle(MembershipOracle<I, D> oracle, Alphabet<I> alphabet) {
38+
this(oracle, alphabet, 1);
3939
}
4040

41-
public IncrementalWMethodEQOracle(Alphabet<I> alphabet, MembershipOracle<I, D> oracle, int maxDepth) {
42-
this(alphabet, oracle, maxDepth, 1);
41+
public IncrementalWMethodEQOracle(MembershipOracle<I, D> oracle, Alphabet<I> alphabet, int maxDepth) {
42+
this(oracle, alphabet, maxDepth, 1);
4343
}
4444

45-
public IncrementalWMethodEQOracle(Alphabet<I> alphabet,
46-
MembershipOracle<I, D> oracle,
45+
public IncrementalWMethodEQOracle(MembershipOracle<I, D> oracle, Alphabet<I> alphabet,
4746
int maxDepth,
4847
int batchSize) {
4948
super(oracle, batchSize);
@@ -74,41 +73,38 @@ protected Stream<Word<I>> generateTestWords(A hypothesis, Collection<? extends I
7473
public static class DFAIncrementalWMethodEQOracle<I> extends IncrementalWMethodEQOracle<DFA<?, I>, I, Boolean>
7574
implements DFAEquivalenceOracle<I> {
7675

77-
public DFAIncrementalWMethodEQOracle(Alphabet<I> alphabet, MembershipOracle<I, Boolean> oracle) {
78-
super(alphabet, oracle);
76+
public DFAIncrementalWMethodEQOracle(MembershipOracle<I, Boolean> oracle, Alphabet<I> alphabet) {
77+
super(oracle, alphabet);
7978
}
8079

81-
public DFAIncrementalWMethodEQOracle(Alphabet<I> alphabet, MembershipOracle<I, Boolean> oracle, int maxDepth) {
82-
super(alphabet, oracle, maxDepth);
80+
public DFAIncrementalWMethodEQOracle(MembershipOracle<I, Boolean> oracle, Alphabet<I> alphabet, int maxDepth) {
81+
super(oracle, alphabet, maxDepth);
8382
}
8483

85-
public DFAIncrementalWMethodEQOracle(Alphabet<I> alphabet,
86-
MembershipOracle<I, Boolean> oracle,
84+
public DFAIncrementalWMethodEQOracle(MembershipOracle<I, Boolean> oracle, Alphabet<I> alphabet,
8785
int maxDepth,
8886
int batchSize) {
89-
super(alphabet, oracle, maxDepth, batchSize);
87+
super(oracle, alphabet, maxDepth, batchSize);
9088
}
9189
}
9290

9391
public static class MealyIncrementalWMethodEQOracle<I, O>
9492
extends IncrementalWMethodEQOracle<MealyMachine<?, I, ?, O>, I, Word<O>>
9593
implements MealyEquivalenceOracle<I, O> {
9694

97-
public MealyIncrementalWMethodEQOracle(Alphabet<I> alphabet, MembershipOracle<I, Word<O>> oracle) {
98-
super(alphabet, oracle);
95+
public MealyIncrementalWMethodEQOracle(MembershipOracle<I, Word<O>> oracle, Alphabet<I> alphabet) {
96+
super(oracle, alphabet);
9997
}
10098

101-
public MealyIncrementalWMethodEQOracle(Alphabet<I> alphabet,
102-
MembershipOracle<I, Word<O>> oracle,
99+
public MealyIncrementalWMethodEQOracle(MembershipOracle<I, Word<O>> oracle, Alphabet<I> alphabet,
103100
int maxDepth) {
104-
super(alphabet, oracle, maxDepth);
101+
super(oracle, alphabet, maxDepth);
105102
}
106103

107-
public MealyIncrementalWMethodEQOracle(Alphabet<I> alphabet,
108-
MembershipOracle<I, Word<O>> oracle,
104+
public MealyIncrementalWMethodEQOracle(MembershipOracle<I, Word<O>> oracle, Alphabet<I> alphabet,
109105
int maxDepth,
110106
int batchSize) {
111-
super(alphabet, oracle, maxDepth, batchSize);
107+
super(oracle, alphabet, maxDepth, batchSize);
112108
}
113109
}
114110

oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWMethodEQOracle.java

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import de.learnlib.api.oracle.MembershipOracle;
2424
import net.automatalib.automata.UniversalDeterministicAutomaton;
2525
import net.automatalib.automata.concepts.Output;
26+
import net.automatalib.automata.fsa.DFA;
27+
import net.automatalib.automata.transout.MealyMachine;
2628
import net.automatalib.util.automata.Automata;
2729
import net.automatalib.util.automata.cover.Covers;
2830
import net.automatalib.words.Word;
@@ -81,8 +83,33 @@ public RandomWMethodEQOracle(MembershipOracle<I, D> sulOracle, int minimalSize,
8183
* @param bound
8284
* specifies the bound (set to 0 for unbounded).
8385
*/
84-
public RandomWMethodEQOracle(MembershipOracle<I, D> sulOracle, int minimalSize, int rndLength, int bound) {
85-
this(sulOracle, minimalSize, rndLength, bound, 1);
86+
public RandomWMethodEQOracle(MembershipOracle<I, D> sulOracle,
87+
int minimalSize,
88+
int rndLength,
89+
int bound) {
90+
this(sulOracle, minimalSize, rndLength, bound, new Random(), 1);
91+
}
92+
93+
/**
94+
* Constructor for a bounded testing oracle with a specific batch size.
95+
*
96+
* @param sulOracle
97+
* oracle which answers tests.
98+
* @param minimalSize
99+
* minimal size of the random word
100+
* @param rndLength
101+
* expected length (in addition to minimalSize) of random word
102+
* @param bound
103+
* specifies the bound (set to 0 for unbounded).
104+
* @param batchSize
105+
* size of the batches sent to the membership oracle
106+
*/
107+
public RandomWMethodEQOracle(MembershipOracle<I, D> sulOracle,
108+
int minimalSize,
109+
int rndLength,
110+
int bound,
111+
int batchSize) {
112+
this(sulOracle, minimalSize, rndLength, bound, new Random(), batchSize);
86113
}
87114

88115
/**
@@ -96,19 +123,22 @@ public RandomWMethodEQOracle(MembershipOracle<I, D> sulOracle, int minimalSize,
96123
* expected length (in addition to minimalSize) of random word
97124
* @param bound
98125
* specifies the bound (set to 0 for unbounded).
126+
* @param random
127+
* custom Random generator.
99128
* @param batchSize
100129
* size of the batches sent to the membership oracle
101130
*/
102131
public RandomWMethodEQOracle(MembershipOracle<I, D> sulOracle,
103132
int minimalSize,
104133
int rndLength,
105134
int bound,
135+
Random random,
106136
int batchSize) {
107137
super(sulOracle, batchSize);
108138
this.minimalSize = minimalSize;
109139
this.rndLength = rndLength;
110140
this.bound = bound;
111-
this.rand = new Random();
141+
this.rand = random;
112142
}
113143

114144
@Override
@@ -164,4 +194,76 @@ private Word<I> generateSingleTestWord(ArrayList<Word<I>> stateCover,
164194

165195
return wb.toWord();
166196
}
197+
198+
public static class DFARandomWMethodEQOracle<I>
199+
extends RandomWMethodEQOracle<DFA<?, I>, I, Boolean>
200+
implements DFAEquivalenceOracle<I> {
201+
202+
public DFARandomWMethodEQOracle(MembershipOracle<I, Boolean> mqOracle,
203+
int minimalSize,
204+
int rndLength) {
205+
super(mqOracle, minimalSize, rndLength);
206+
}
207+
208+
public DFARandomWMethodEQOracle(MembershipOracle<I, Boolean> mqOracle,
209+
int minimalSize,
210+
int rndLength,
211+
int bound) {
212+
super(mqOracle, minimalSize, rndLength, bound);
213+
}
214+
215+
public DFARandomWMethodEQOracle(MembershipOracle<I, Boolean> mqOracle,
216+
int minimalSize,
217+
int rndLength,
218+
int bound,
219+
int batchSize) {
220+
super(mqOracle, minimalSize, rndLength, bound, batchSize);
221+
}
222+
223+
public DFARandomWMethodEQOracle(MembershipOracle<I, Boolean> mqOracle,
224+
int minimalSize,
225+
int rndLength,
226+
int bound,
227+
Random random,
228+
int batchSize) {
229+
super(mqOracle, minimalSize, rndLength, bound, random, batchSize);
230+
}
231+
232+
}
233+
234+
public static class MealyRandomWMethodEQOracle<I, O>
235+
extends RandomWMethodEQOracle<MealyMachine<?, I, ?, O>, I, Word<O>>
236+
implements MealyEquivalenceOracle<I, O> {
237+
238+
public MealyRandomWMethodEQOracle(MembershipOracle<I, Word<O>> mqOracle,
239+
int minimalSize,
240+
int rndLength) {
241+
super(mqOracle, minimalSize, rndLength);
242+
}
243+
244+
public MealyRandomWMethodEQOracle(MembershipOracle<I, Word<O>> mqOracle,
245+
int minimalSize,
246+
int rndLength,
247+
int bound) {
248+
super(mqOracle, minimalSize, rndLength, bound);
249+
}
250+
251+
public MealyRandomWMethodEQOracle(MembershipOracle<I, Word<O>> mqOracle,
252+
int minimalSize,
253+
int rndLength,
254+
int bound,
255+
int batchSize) {
256+
super(mqOracle, minimalSize, rndLength, bound, batchSize);
257+
}
258+
259+
public MealyRandomWMethodEQOracle(MembershipOracle<I, Word<O>> mqOracle,
260+
int minimalSize,
261+
int rndLength,
262+
int bound,
263+
Random random,
264+
int batchSize) {
265+
super(mqOracle, minimalSize, rndLength, bound, random, batchSize);
266+
}
267+
268+
}
167269
}

0 commit comments

Comments
 (0)