Skip to content

Commit 206e5f1

Browse files
committed
Fixed issue with builder for DT learner, and with rendering of hypotheses of DT and TTT learners
1 parent 2a111d6 commit 206e5f1

5 files changed

Lines changed: 76 additions & 42 deletions

File tree

algorithms/discrimination-tree/src/main/java/de/learnlib/algorithms/discriminationtree/dfa/DTLearnerDFA.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import de.learnlib.api.MembershipOracle;
3535
import de.learnlib.api.Query;
3636
import de.learnlib.counterexamples.LocalSuffixFinder;
37+
import de.learnlib.counterexamples.LocalSuffixFinders;
3738
import de.learnlib.discriminationtree.BinaryDTree;
3839
import de.learnlib.oracles.AbstractQuery;
3940

@@ -46,8 +47,14 @@
4647
*/
4748
public class DTLearnerDFA<I> extends AbstractDTLearner<DFA<?,I>, I, Boolean, Boolean, Void> implements DFALearner<I> {
4849

49-
public static class BuilderDefaults extends AbstractDTLearner.BuilderDefaults {
50+
public static class BuilderDefaults {
5051
public static boolean epsilonRoot() { return true; }
52+
public static <I,O> LocalSuffixFinder<? super I,? super O> suffixFinder() {
53+
return LocalSuffixFinders.RIVEST_SCHAPIRE;
54+
}
55+
public static boolean repeatedCounterexampleEvaluation() {
56+
return true;
57+
}
5158
}
5259

5360
private final HypothesisWrapperDFA<I> hypWrapper;

algorithms/discrimination-tree/src/main/java/de/learnlib/algorithms/discriminationtree/mealy/DTLearnerMealy.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616
*/
1717
package de.learnlib.algorithms.discriminationtree.mealy;
1818

19+
import java.util.Map;
20+
21+
import net.automatalib.automata.transout.MealyMachine;
22+
import net.automatalib.graphs.dot.EmptyDOTHelper;
23+
import net.automatalib.graphs.dot.GraphDOTHelper;
24+
import net.automatalib.words.Alphabet;
25+
import net.automatalib.words.Word;
26+
1927
import com.github.misberner.buildergen.annotations.GenerateBuilder;
2028

2129
import de.learnlib.algorithms.discriminationtree.AbstractDTLearner;
@@ -28,10 +36,6 @@
2836
import de.learnlib.discriminationtree.MultiDTree;
2937
import de.learnlib.oracles.AbstractQuery;
3038

31-
import net.automatalib.automata.transout.MealyMachine;
32-
import net.automatalib.words.Alphabet;
33-
import net.automatalib.words.Word;
34-
3539
/**
3640
*
3741
* @author Malte Isberner
@@ -82,4 +86,28 @@ public void answer(Word<O> output) {
8286
}
8387
};
8488
}
89+
90+
@Override
91+
public GraphDOTHelper<HState<I, Word<O>, Void, O>, HTransition<I, Word<O>, Void, O>> getHypothesisDOTHelper() {
92+
return new EmptyDOTHelper<HState<I,Word<O>,Void,O>,HTransition<I,Word<O>,Void,O>>() {
93+
@Override
94+
public boolean getEdgeProperties(HState<I, Word<O>, Void, O> src,
95+
HTransition<I, Word<O>, Void, O> edge,
96+
HState<I, Word<O>, Void, O> tgt,
97+
Map<String, String> properties) {
98+
if (!super.getEdgeProperties(src, edge, tgt, properties)) {
99+
return false;
100+
}
101+
String label = String.valueOf(edge.getSymbol());
102+
label += " / ";
103+
if (edge.getProperty() != null) {
104+
label += edge.getProperty();
105+
}
106+
properties.put(EdgeAttrs.LABEL, label);
107+
108+
return true;
109+
}
110+
111+
};
112+
}
85113
}

algorithms/ttt/src/main/java/de/learnlib/algorithms/ttt/base/BaseTTTLearner.java

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717
package de.learnlib.algorithms.ttt.base;
1818

19-
import java.lang.ref.WeakReference;
2019
import java.util.ArrayDeque;
2120
import java.util.ArrayList;
2221
import java.util.Collection;
@@ -27,7 +26,6 @@
2726
import java.util.Map;
2827
import java.util.Objects;
2928
import java.util.Queue;
30-
import java.util.Set;
3129

3230
import javax.annotation.Nonnull;
3331

@@ -38,10 +36,6 @@
3836
import net.automatalib.graphs.dot.GraphDOTHelper;
3937
import net.automatalib.words.Alphabet;
4038
import net.automatalib.words.Word;
41-
42-
import com.google.common.collect.AbstractIterator;
43-
import com.google.common.collect.Sets;
44-
4539
import de.learnlib.algorithms.ttt.base.TTTHypothesis.TTTEdge;
4640
import de.learnlib.api.AccessSequenceTransformer;
4741
import de.learnlib.api.LearningAlgorithm;
@@ -73,9 +67,9 @@ public static class BuilderDefaults {
7367
protected final DiscriminationTree<I,D> dtree;
7468
// private final SuffixTrie<I> suffixTrie = new SuffixTrie<>();
7569

76-
private final Set<Word<I>> finalDiscriminators = Sets.newHashSet(Word.epsilon());
70+
//private final Set<Word<I>> finalDiscriminators = Sets.newHashSet(Word.epsilon());
7771

78-
private final Collection<WeakReference<TTTEventListener<I, D>>> eventListeners = new UnorderedCollection<>();
72+
private final Collection<TTTEventListener<I, D>> eventListeners = new UnorderedCollection<>();
7973

8074
/**
8175
* Open transitions, i.e., transitions that possibly point to a non-leaf
@@ -429,10 +423,10 @@ private GlobalSplitter<I,D> findSplitterGlobal() {
429423
Iterator<DTNode<I,D>> blocksIt = blockList.iterator();
430424
while(blocksIt.hasNext()) {
431425
DTNode<I,D> blockRoot = blocksIt.next();
432-
if (finalDiscriminators.contains(blockRoot.getDiscriminator().subWord(1))) {
433-
declareFinal(blockRoot);
434-
continue;
435-
}
426+
// if (finalDiscriminators.contains(blockRoot.getDiscriminator().subWord(1))) {
427+
// declareFinal(blockRoot);
428+
// continue;
429+
// }
436430
Splitter<I,D> splitter = findSplitter(blockRoot);
437431
if(splitter != null) {
438432
if(bestSplitter == null || splitter.discriminator.length()
@@ -654,7 +648,7 @@ protected void declareFinal(DTNode<I,D> blockRoot) {
654648
blockRoot.splitData = null;
655649

656650
blockRoot.removeFromBlockList();
657-
finalDiscriminators.add(blockRoot.getDiscriminator());
651+
// finalDiscriminators.add(blockRoot.getDiscriminator());
658652

659653
for (DTNode<I,D> subtree : blockRoot.getChildren()) {
660654
assert subtree.splitData == null;
@@ -1152,31 +1146,11 @@ private void notifyPostSplit(TTTTransition<I, D> transition, Word<I> tempDiscrim
11521146
}
11531147

11541148
private Iterable<TTTEventListener<I, D>> eventListeners() {
1155-
return new Iterable<TTTEventListener<I,D>>() {
1156-
@Override
1157-
public Iterator<TTTEventListener<I, D>> iterator() {
1158-
final Iterator<WeakReference<TTTEventListener<I, D>>> iterator = eventListeners.iterator();
1159-
return new AbstractIterator<TTTEventListener<I,D>>() {
1160-
@Override
1161-
protected TTTEventListener<I, D> computeNext() {
1162-
while (iterator.hasNext()) {
1163-
WeakReference<TTTEventListener<I, D>> ref = iterator.next();
1164-
TTTEventListener<I, D> listener = ref.get();
1165-
if (listener != null) {
1166-
return listener;
1167-
}
1168-
iterator.remove();
1169-
}
1170-
return endOfData();
1171-
}
1172-
1173-
};
1174-
}
1175-
};
1149+
return eventListeners;
11761150
}
11771151

11781152
public void addEventListener(TTTEventListener<I, D> listener) {
1179-
eventListeners.add(new WeakReference<TTTEventListener<I,D>>(listener));
1153+
eventListeners.add(listener);
11801154
}
11811155

11821156
public void removeEventListener(TTTEventListener<I, D> listener) {

algorithms/ttt/src/main/java/de/learnlib/algorithms/ttt/mealy/TTTHypothesisMealy.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,5 @@ protected TTTTransitionMealy<I, O> mapTransition(
4646
public O getTransitionOutput(TTTTransitionMealy<I, O> transition) {
4747
return transition.getOutput();
4848
}
49-
50-
49+
5150
}

algorithms/ttt/src/main/java/de/learnlib/algorithms/ttt/mealy/TTTLearnerMealy.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616
*/
1717
package de.learnlib.algorithms.ttt.mealy;
1818

19+
import java.util.Map;
20+
1921
import net.automatalib.automata.transout.MealyMachine;
22+
import net.automatalib.graphs.dot.EmptyDOTHelper;
23+
import net.automatalib.graphs.dot.GraphDOTHelper;
2024
import net.automatalib.words.Alphabet;
2125
import net.automatalib.words.Word;
2226
import net.automatalib.words.WordBuilder;
@@ -25,6 +29,7 @@
2529

2630
import de.learnlib.algorithms.ttt.base.BaseTTTLearner;
2731
import de.learnlib.algorithms.ttt.base.DTNode;
32+
import de.learnlib.algorithms.ttt.base.TTTHypothesis.TTTEdge;
2833
import de.learnlib.algorithms.ttt.base.TTTState;
2934
import de.learnlib.algorithms.ttt.base.TTTTransition;
3035
import de.learnlib.api.LearningAlgorithm;
@@ -80,4 +85,25 @@ protected Word<O> computeHypothesisOutput(TTTState<I, Word<O>> state,
8085
return wb.toWord();
8186
}
8287

88+
@Override
89+
public GraphDOTHelper<TTTState<I,Word<O>>, TTTEdge<I, Word<O>>> getHypothesisDOTHelper() {
90+
return new EmptyDOTHelper<TTTState<I,Word<O>>,TTTEdge<I,Word<O>>>() {
91+
@Override
92+
public boolean getEdgeProperties(TTTState<I, Word<O>> src,
93+
TTTEdge<I, Word<O>> edge, TTTState<I, Word<O>> tgt,
94+
Map<String, String> properties) {
95+
if (!super.getEdgeProperties(src, edge, tgt, properties)) {
96+
return false;
97+
}
98+
String label = String.valueOf(edge.transition.getInput());
99+
label += " / ";
100+
TTTTransitionMealy<I, O> trans = (TTTTransitionMealy<I,O>) edge.transition;
101+
if (trans.output != null) {
102+
label += trans.output;
103+
}
104+
properties.put(EdgeAttrs.LABEL, label);
105+
return true;
106+
}
107+
};
108+
}
83109
}

0 commit comments

Comments
 (0)