From f93806753eccf6a8c89471be04a499154ef318b3 Mon Sep 17 00:00:00 2001 From: Paolo Arcaini Date: Wed, 29 May 2019 09:08:57 +0900 Subject: [PATCH] oracle --- mutrex/src/regex/oracle/AutomaticOracle.java | 26 ++++++++ mutrex/src/regex/oracle/CachedOracle.java | 69 ++++++++++++++++++++ mutrex/src/regex/oracle/RegexOracle.java | 11 ++++ mutrex/src/regex/oracle/RgxAcception.java | 5 ++ mutrex/src/regex/oracle/UserOracle.java | 26 ++++++++ 5 files changed, 137 insertions(+) create mode 100644 mutrex/src/regex/oracle/AutomaticOracle.java create mode 100644 mutrex/src/regex/oracle/CachedOracle.java create mode 100644 mutrex/src/regex/oracle/RegexOracle.java create mode 100644 mutrex/src/regex/oracle/RgxAcception.java create mode 100644 mutrex/src/regex/oracle/UserOracle.java diff --git a/mutrex/src/regex/oracle/AutomaticOracle.java b/mutrex/src/regex/oracle/AutomaticOracle.java new file mode 100644 index 0000000..7cc39de --- /dev/null +++ b/mutrex/src/regex/oracle/AutomaticOracle.java @@ -0,0 +1,26 @@ +package regex.oracle; + +import dk.brics.automaton.Automaton; +import dk.brics.automaton.RegExp; +import dk.brics.automaton.RunAutomaton; + +/** it represents an oracle given by a regex */ +public class AutomaticOracle implements RegexOracle { + private Automaton automaton; + private RunAutomaton automatonRunner; + + public AutomaticOracle(String regex) { + this(new RegExp(regex)); + } + + public AutomaticOracle(RegExp regExp) { + assert regExp != null; + automaton = regExp.toAutomaton(); + automatonRunner = new RunAutomaton(automaton); + } + + @Override + public boolean accept(String s) { + return automatonRunner.run(s); + } +} diff --git a/mutrex/src/regex/oracle/CachedOracle.java b/mutrex/src/regex/oracle/CachedOracle.java new file mode 100644 index 0000000..0af9cb3 --- /dev/null +++ b/mutrex/src/regex/oracle/CachedOracle.java @@ -0,0 +1,69 @@ +package regex.oracle; + +import java.util.HashSet; +import java.util.Set; + +/** + * it is an oracle that keeps memory of the string it has been asked + * + * @author garganti + * + */ +public class CachedOracle implements RegexOracle { + private Set acceptedByOracle; + private Set rejectedByOracle; + private RegexOracle oracle; + + // the real oracle to ask in case there is new string to evaluate + public CachedOracle(RegexOracle oracle) { + acceptedByOracle = new HashSet(); + rejectedByOracle = new HashSet(); + this.oracle = oracle; + } + + /** + * it keeps track also of the string previously evaluated to reduce the number + * of evaluations + * + * @param s + * @return + */ + @Override + public final boolean accept(String s) { + // if already evaluated + if (acceptedByOracle.contains(s)) { + return true; + } else if (rejectedByOracle.contains(s)) { + return false; + } else { + // not evaluated yet + boolean isAccepted = oracle.accept(s); + if (isAccepted) { + acceptedByOracle.add(s); + } else { + rejectedByOracle.add(s); + } + return isAccepted; + } + } + + public Set getAcceptedByOracle() { + return acceptedByOracle; + } + + public Set getRejectedByOracle() { + return rejectedByOracle; + } + + public int getNumEvaluatedStrings() { + return acceptedByOracle.size() + rejectedByOracle.size(); + } + + public int getNumAcceptedStrings() { + return acceptedByOracle.size(); + } + + public RegexOracle getOracle() { + return oracle; + } +} diff --git a/mutrex/src/regex/oracle/RegexOracle.java b/mutrex/src/regex/oracle/RegexOracle.java new file mode 100644 index 0000000..60848c1 --- /dev/null +++ b/mutrex/src/regex/oracle/RegexOracle.java @@ -0,0 +1,11 @@ +package regex.oracle; + +// given an example, it is able to accept or reject +// the cached version is in another class +// this one has no memory +public interface RegexOracle { + + /** is string s accepted by the oracle */ + public abstract boolean accept(String s); + +} diff --git a/mutrex/src/regex/oracle/RgxAcception.java b/mutrex/src/regex/oracle/RgxAcception.java new file mode 100644 index 0000000..f2b10ef --- /dev/null +++ b/mutrex/src/regex/oracle/RgxAcception.java @@ -0,0 +1,5 @@ +package regex.oracle; + +public enum RgxAcception { + FULLY_ACCEPTED, FULLY_REJECTED, PARTIALLY_ACCEPTED +} \ No newline at end of file diff --git a/mutrex/src/regex/oracle/UserOracle.java b/mutrex/src/regex/oracle/UserOracle.java new file mode 100644 index 0000000..9bf7cec --- /dev/null +++ b/mutrex/src/regex/oracle/UserOracle.java @@ -0,0 +1,26 @@ +package regex.oracle; + +import java.util.Scanner; + +public class UserOracle implements RegexOracle { + + @Override + public boolean accept(String s) { + return askUser(s, "accept"); + } + + private boolean askUser(String s, String acceptReject) { + Scanner in = new Scanner(System.in); + while (true) { + System.out.println("Do you " + acceptReject + " \"" + s + "\"?" + " Y for yes, N for no"); + String line = in.nextLine(); + if (line.equalsIgnoreCase("Y")) { + return true; + } + if (line.equalsIgnoreCase("N")) { + return false; + } + System.out.println("I did not understand."); + } + } +} \ No newline at end of file