package basiclearner; import de.learnlib.api.EquivalenceOracle; import de.learnlib.api.SUL; import de.learnlib.oracles.DefaultQuery; import net.automatalib.automata.transout.MealyMachine; import net.automatalib.words.Word; import java.util.*; /** * Created by ramon on 12-12-16. */ public class UserEQOracle implements EquivalenceOracle, String, Word> { private final SUL sul; public UserEQOracle(SUL sul) { this.sul = sul; } @Override public DefaultQuery> findCounterExample(MealyMachine hypothesis, Collection allowedInputs) { System.out.println("Enter space-separated input sequence to try as a counter-example, or 'stop' to stop learning"); Scanner userInputScanner = new Scanner(System.in); do { String userInput = userInputScanner.nextLine(); if (userInput.equals("stop")) { return null; } else { String[] sutInputs = userInput.split("\\s"); if (sutInputs.length != 0) { Word input = Word.fromArray(sutInputs, 0, sutInputs.length); Word hypOutput = hypothesis.computeOutput(input); Word sulOutput = sulOutput(input); System.out.println("SUL output: " + sulOutput); if (!hypOutput.equals(sulOutput)) { System.out.println(); return new DefaultQuery>(Word.fromList(Collections.emptyList()), input, sulOutput); } else { System.out.println("Query '" + userInput + "' not a counterexample"); } } } } while (true); } private Word sulOutput(Word inputs) { sul.pre(); List output = new ArrayList<>(); for (String input: inputs) { output.add(sul.step(input)); } sul.post(); return Word.fromList(output); } }