Hi Alex,
if you have a fixed set of traces you want to check your hypothesis against, you can use the SampleSetEQOracle. After construction, you simply add the test words and their expected output.
I wrote a few lines that should give you the basic idea [0]. Note that visualizing the hypothesis may take quite some time (especially with DOT) because the model has quite a lot of transitions.
Kind regards,
Markus
[0] -
https://gist.github.com/mtf90/0a4b9435f46b61ab90db12de962840f8
> --
> You received this message because you are subscribed to the Google Groups "LearnLib Q&A" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to
learnlib-qa...@googlegroups.com.
> To view this discussion on the web visit
https://groups.google.com/d/msgid/learnlib-qa/de3df124-c938-458c-8ba1-e955303eb89dn%40googlegroups.com.
> import de.learnlib.api.oracle.SingleQueryOracle;
> import net.automatalib.words.Word;
> import java.util.Collection;
> import java.util.Collection;
>
> public class MBOracle<I> implements SingleQueryOracle<I,Boolean> {
> private Collection<Word<I>> positive;
> private Collection<Word<I>> negative;
>
> public MBOracle(Collection<Word<I>> positive, Collection<Word<I>> negative){
> // TODO: Check disjointness of positive and negative
> super();
> this.positive = positive;
> this.negative = negative;
> }
>
> @Override
> public Boolean answerQuery(Word<I> prefix, Word<I> suffix) {
> Word<I> input = prefix.concat(suffix);
> return (!negative.contains(input));
> }
> }
>
> import java.io.IOException;
> import java.util.*;
> import de.learnlib.algorithms.lstar.dfa.ClassicLStarDFA;
> import de.learnlib.algorithms.lstar.dfa.ClassicLStarDFABuilder;
> import de.learnlib.algorithms.nlstar.NLStarLearner;
> import de.learnlib.algorithms.nlstar.NLStarLearnerBuilder;
> import de.learnlib.api.oracle.MembershipOracle.DFAMembershipOracle;
> import de.learnlib.datastructure.observationtable.OTUtils;
> import de.learnlib.datastructure.observationtable.writer.ObservationTableASCIIWriter;
> import de.learnlib.filter.statistic.oracle.CounterOracle;
> import de.learnlib.oracle.equivalence.DFAWMethodEQOracle;
> import de.learnlib.oracle.equivalence.IncrementalWMethodEQOracle;
> import de.learnlib.oracle.equivalence.WMethodEQOracle.*;
> import de.learnlib.oracle.membership.SimulatorOracle.DFASimulatorOracle;
> import de.learnlib.util.Experiment.DFAExperiment;
> import de.learnlib.util.statistics.SimpleProfiler;
> import net.automatalib.automata.fsa.DFA;
> import net.automatalib.automata.fsa.impl.compact.CompactDFA;
> import net.automatalib.serialization.dot.GraphDOT;
> import net.automatalib.util.automata.builders.AutomatonBuilders;
> import net.automatalib.visualization.Visualization;
> import net.automatalib.words.Alphabet;
> import net.automatalib.words.Word;
> import net.automatalib.words.impl.ListAlphabet;
> import net.automatalib.words.impl.Alphabets;
>
> public class Active_Learning {
> private static final int EXPLORATION_DEPTH = 3;
>
> private static List<Character> getActions() {
> List<Character> actions = new LinkedList<>();
> for (int i = 0; i < 7; i++)
> actions.add((char) (97 + i));
> return actions;
> }
> public static void main(String[] args) throws IOException {
> System.out.println("Starting...");
>
> Alphabet<Character> alphabet = new ListAlphabet<>(getActions()); //f not used
>
> Collection<Word<Character>> positive = getPositiveExamples(); //ok
>
> Collection<Word<Character>> negative = getNegativeExamples(); //ok
>
> MBOracle<Character> test = new MBOracle<>(positive,negative);
>
> CounterOracle<Character,Boolean> mqOracle = new CounterOracle<>(test, "membership queries");
>
> NLStarLearner<Character> nlstar =
> new NLStarLearnerBuilder<Character>().withAlphabet(alphabet) // input alphabet
> .withOracle(mqOracle) // membership oracle
> .create();
> }
>
> private static Collection<Word<Character>> getPositiveExamples() { //20 samples
> return Arrays.asList(
> Word.fromCharSequence("acab"),
> Word.fromCharSequence("acaba"),
> Word.fromCharSequence("acabc"),
> Word.fromCharSequence("acabab"),
> Word.fromCharSequence("acabac"),
> Word.fromCharSequence("acabed"),
> Word.fromCharSequence("acabe"),
>
> Word.fromCharSequence("abc"),
> Word.fromCharSequence("abca"),
> Word.fromCharSequence("abce"),
> Word.fromCharSequence("abac"),
> Word.fromCharSequence("abcab"),
> Word.fromCharSequence("abaced"),
> Word.fromCharSequence("abcabed"),
>
>
> Word.fromCharSequence("abababc"),
> Word.fromCharSequence("ababcab"),
>
> Word.fromCharSequence("eabcdc"),
> Word.fromCharSequence("eabdc"),
> Word.fromCharSequence("eabababccd"));
> }
>
> private static Collection<Word<Character>> getNegativeExamples() { //25 samples
> return Arrays.asList(
> Word.fromCharSequence("a"),
> Word.fromCharSequence("b"),
> Word.fromCharSequence("c"),
>
> Word.fromCharSequence("ab"),
> Word.fromCharSequence("ac"),
>
> Word.fromCharSequence("cb"),
> Word.fromCharSequence("ca"),
> Word.fromCharSequence("cabac"),
> Word.fromCharSequence("cde"),
>
> Word.fromCharSequence("ba"),
> Word.fromCharSequence("bc"),
> Word.fromCharSequence("be"),
> Word.fromCharSequence("bg"), //g
> Word.fromCharSequence("bac"),
>
> Word.fromCharSequence("abcabacb"),
> Word.fromCharSequence("abcbccbea"),
> Word.fromCharSequence("abacde"),
> Word.fromCharSequence("abcaaaccddee"),
> Word.fromCharSequence("abacg"), //g
>
> Word.fromCharSequence("deabc"),
> Word.fromCharSequence("de"),
> Word.fromCharSequence("decabg"),
>
> Word.fromCharSequence("edabcb"),
> Word.fromCharSequence("ed"),
>
> Word.fromCharSequence("gabced"));
> }
> }