diff --git a/learnlib/DumpRFSAEQOracle.java b/learnlib/DumpRFSAEQOracle.java index 0d32d48895c478008a546f9bc2e9af6e86c119c6..b2163ac04e9713edff740a30506651430a45711d 100644 --- a/learnlib/DumpRFSAEQOracle.java +++ b/learnlib/DumpRFSAEQOracle.java @@ -3,17 +3,20 @@ import de.learnlib.api.query.DefaultQuery; import de.learnlib.oracle.equivalence.RandomWordsEQOracle; import net.automatalib.automata.fsa.FiniteStateAcceptor; import net.automatalib.automata.fsa.impl.compact.CompactNFA; +import net.automatalib.commons.util.collections.CollectionsUtil; import net.automatalib.words.Word; +import net.automatalib.words.WordBuilder; import javax.annotation.Nullable; -import java.util.Collection; -import java.util.Objects; -import java.util.Random; -import java.util.Set; +import java.util.*; import java.util.stream.Stream; public class DumpRFSAEQOracle<A extends FiniteStateAcceptor<Integer, I>, I> extends RandomWordsEQOracle<A, I, Boolean> { CompactNFA<I> target; + final int maxLength; + final Random random; + final int maxTests; + public DumpRFSAEQOracle(CompactNFA<I> target, MembershipOracle<I, Boolean> mqOracle, int minLength, int maxLength, int maxTests) { this(target, mqOracle, minLength, maxLength, maxTests, new Random(), 1); @@ -26,7 +29,10 @@ public class DumpRFSAEQOracle<A extends FiniteStateAcceptor<Integer, I>, I> exte public DumpRFSAEQOracle(CompactNFA<I> target, MembershipOracle<I, Boolean> mqOracle, int minLength, int maxLength, int maxTests, Random random, int batchSize) { super(mqOracle, minLength, maxLength, maxTests, random, batchSize); + this.maxLength = maxLength; + this.random = random; this.target = target; + this.maxTests = maxTests; } /** @@ -80,4 +86,25 @@ public class DumpRFSAEQOracle<A extends FiniteStateAcceptor<Integer, I>, I> exte } else return null; } + + Word<I> generateTestWord(List<? extends I> symbolList, int numSyms) { + final WordBuilder<I> result = new WordBuilder<>(maxLength); + + for (int j = 0; j < maxLength; ++j) { + int symidx = random.nextInt(numSyms); + I sym = symbolList.get(symidx); + result.append(sym); + } + + return result.toWord(); + } + + @Override + protected Stream<Word<I>> generateTestWords(A hypothesis, Collection<? extends I> inputs) { + + final List<? extends I> symbolList = CollectionsUtil.randomAccessList(inputs); + + return Stream.generate(() -> generateTestWord(symbolList, symbolList.size())).limit(maxTests); + } + }