def _test_search2(self): re = "/a+b*c+d/\n/abc/" delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) aut = b_dfa() parser = pcre_parser() parser.set_text(re) aut.create_by_parser(parser) aut.compute() self.assertEqual(delay_dfa.search("abcd"), aut.search("abcd")) self.assertEqual(delay_dfa.search("abcd abc"), aut.search("abcd abc")) self.assertEqual(delay_dfa.search("abc"), aut.search("abc")) self.assertEqual(delay_dfa.search("acd"), aut.search("acd")) self.assertEqual(delay_dfa.search("abd"), aut.search("abd"))
def _test_compute1(self): delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text("/^abcd/") delay_dfa.create_by_parser(parser) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) dfa = b_dfa() dfa.create_by_parser(parser) dfa.compute() a = delay_dfa.get_automaton() b = dfa.get_automaton() l = len(b.alphabet.keys()) b.add_symbols(DEF_SYMBOLS("default", l)) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def _test_compute2(self): delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text("/^(a|b)+/") delay_dfa.create_by_parser(parser) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() b = nfa_data() b.add_symbols(b_Sym_char("a", "a", 0)) b.add_symbols(b_Sym_char("b", "b", 1)) b.add_symbols(DEF_SYMBOLS("default", 2)) b.add_states(b_State(0, set())) b.add_states(b_State(1, set([0]))) b.start = 0 b.final = set([1]) b.add_transitions((0, 0, 1)) b.add_transitions((0, 1, 1)) b.add_transitions((1, 2, 0)) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def _test_compute3(self): # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" delay_dfa = DELAY_DFA() nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa.create_from_nfa_data(nfaData) delay_dfa.determinise() delay_dfa.compute(False) self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() b = nfa_data() b.add_symbols(b_Sym_char("a", "a", 0)) b.add_symbols(b_Sym_char("b", "b", 1)) b.add_symbols(b_Sym_char("c", "c", 2)) b.add_symbols(b_Sym_char("d", "d", 3)) b.add_symbols(DEF_SYMBOLS("default", 4)) b.add_states(b_State(0, set())) b.add_states(b_State(1, set([0]))) b.add_states(b_State(2, set())) b.add_states(b_State(3, set([0]))) b.add_states(b_State(4, set([0]))) b.start = 0 b.final = set([1, 3, 4]) b.add_transitions((0, 2, 0)) b.add_transitions((0, 0, 1)) b.add_transitions((0, 1, 2)) b.add_transitions((0, 3, 3)) b.add_transitions((1, 4, 0)) b.add_transitions((2, 2, 4)) b.add_transitions((2, 4, 0)) b.add_transitions((3, 4, 0)) b.add_transitions((4, 4, 0)) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def _test_compute2(self): delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text("/^(a|b)+/") delay_dfa.create_by_parser(parser) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() b = nfa_data() b.add_symbols(b_Sym_char("a","a",0)) b.add_symbols(b_Sym_char("b","b",1)) b.add_symbols(DEF_SYMBOLS("default", 2)) b.add_states(b_State(0,set())) b.add_states(b_State(1,set([0]))) b.start = 0 b.final = set([1]) b.add_transitions( (0,0,1) ) b.add_transitions( (0,1,1) ) b.add_transitions( (1,2,0) ) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def get_ddfa(ruleset): """ Generate number of states, transitions and consumed memory for DDFA. """ # Create parser - use default parser po = parser.parser() # Parse input file po.load_file(ruleset) # Create Delay DFA object DelayDfa = DELAY_DFA() # Make automaton from RE which was in input file DelayDfa.create_by_parser(po) # Make Delay DFA # Resolve alphabet DelayDfa.resolve_alphabet() # Create Delay DFA DelayDfa.compute() # Return experimental results return ["Delay DFA", DelayDfa.get_state_num(), DelayDfa.get_trans_num(), DelayDfa.report_memory_optimal(), DelayDfa.report_memory_naive()]
def _test_compute3(self): # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" delay_dfa = DELAY_DFA() nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa.create_from_nfa_data(nfaData) delay_dfa.determinise() delay_dfa.compute(False) self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() b = nfa_data() b.add_symbols(b_Sym_char("a","a",0)) b.add_symbols(b_Sym_char("b","b",1)) b.add_symbols(b_Sym_char("c","c",2)) b.add_symbols(b_Sym_char("d","d",3)) b.add_symbols(DEF_SYMBOLS("default", 4)) b.add_states(b_State(0,set())) b.add_states(b_State(1,set([0]))) b.add_states(b_State(2,set())) b.add_states(b_State(3,set([0]))) b.add_states(b_State(4,set([0]))) b.start = 0 b.final = set([1,3,4]) b.add_transitions( (0,2,0) ) b.add_transitions( (0,0,1) ) b.add_transitions( (0,1,2) ) b.add_transitions( (0,3,3) ) b.add_transitions( (1,4,0) ) b.add_transitions( (2,2,4) ) b.add_transitions( (2,4,0) ) b.add_transitions( (3,4,0) ) b.add_transitions( (4,4,0) ) self.assertEqual(a.states.keys(), b.states.keys()) self.assertEqual(a.start, b.start) self.assertEqual(a.final, b.final) self.assertEqual(a.alphabet, b.alphabet) self.assertEqual(a.transitions, b.transitions) self.assertTrue(a.Flags["Delay DFA"])
def _test_search1(self): re = "/a+b*c.*a|bc+/" delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) aut = b_dfa() parser = pcre_parser() parser.set_text(re) aut.create_by_parser(parser) self.assertEqual(delay_dfa.search("ac123ac"), aut.search("ac123ac")) self.assertEqual(delay_dfa.search("aacac"), aut.search("aacac")) self.assertEqual(delay_dfa.search("abbb"), aut.search("abbb"))
def get_ddfa(ruleset): """ Generate number of states, transitions and consumed memory for DDFA. """ # Create parser - use default parser po = parser.parser() # Parse input file po.load_file(ruleset) # Create Delay DFA object DelayDfa = DELAY_DFA() # Make automaton from RE which was in input file DelayDfa.create_by_parser(po) # Make Delay DFA # Resolve alphabet DelayDfa.resolve_alphabet() # Create Delay DFA DelayDfa.compute() # Return experimental results return [ "Delay DFA", DelayDfa.get_state_num(), DelayDfa.get_trans_num(), DelayDfa.report_memory_optimal(), DelayDfa.report_memory_naive() ]
def test_get_default_trans_num(self): """get_default_trans_num""" #Tests with regular expressions from test_compute delay_dfa1 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^abcd/") delay_dfa1.create_by_parser(parser) delay_dfa1.compute() self.assertTrue(delay_dfa1.get_compute()) delay_dfa2 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^(a|b)+/") delay_dfa2.create_by_parser(parser) delay_dfa2.compute() self.assertTrue(delay_dfa2.get_compute()) delay_dfa3 = DELAY_DFA() # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa3.create_from_nfa_data(nfaData) delay_dfa3.determinise() delay_dfa3.compute(False) self.assertTrue(delay_dfa3.get_compute()) self.assertEqual(delay_dfa1.get_default_trans_num(),0) self.assertEqual(delay_dfa2.get_default_trans_num(),1) self.assertEqual(delay_dfa3.get_default_trans_num(),4)
def test_set_bound(self): """set_bound()""" #Tests manual control of the number of consecutive default #transitions in larger automaton re = "/a+b*c+/\n/b+c*d+/\n/c+d*e/" delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.set_bound(0) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() lenght1 = self._get_length_default_path(a) delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.set_bound(1) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() lenght2 = self._get_length_default_path(a) delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.set_bound(2) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() lenght3 = self._get_length_default_path(a) delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.set_bound(3) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) a = delay_dfa.get_automaton() lenght4 = self._get_length_default_path(a) self.assertEqual(lenght1, 3) self.assertEqual(lenght2, 1) self.assertEqual(lenght3, 2) self.assertEqual(lenght4, 3)
def _test_search3(self): re = "/a+b*c+/\n/b+c*d+/\n/c+d*e/" delay_dfa = DELAY_DFA() parser = pcre_parser() parser.set_text(re) delay_dfa.create_by_parser(parser) delay_dfa.compute() self.assertTrue(delay_dfa.get_compute()) aut = b_dfa() parser = pcre_parser() parser.set_text(re) aut.create_by_parser(parser) aut.compute() self.assertEqual(delay_dfa.search("abcd"), aut.search("abcd")) self.assertEqual(delay_dfa.search("abcd abc"), aut.search("abcd abc")) self.assertEqual(delay_dfa.search("gabc"), aut.search("gabc")) self.assertEqual(delay_dfa.search("ac bd ce"), aut.search("ac bd ce")) self.assertEqual(delay_dfa.search("ab123a bcd cde"), aut.search("ab123a bcd cde")) self.assertEqual(delay_dfa.search("bce"), aut.search("bce")) self.assertEqual(delay_dfa.search("abe"), aut.search("abe"))
def test_get_default_trans_num(self): """get_default_trans_num""" #Tests with regular expressions from test_compute delay_dfa1 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^abcd/") delay_dfa1.create_by_parser(parser) delay_dfa1.compute() self.assertTrue(delay_dfa1.get_compute()) delay_dfa2 = DELAY_DFA() parser = pcre_parser() parser.set_text("/^(a|b)+/") delay_dfa2.create_by_parser(parser) delay_dfa2.compute() self.assertTrue(delay_dfa2.get_compute()) delay_dfa3 = DELAY_DFA() # Get test directory tdir = aux_func.getPatternMatchDir() + "/algorithms/delay_dfa/" nfaData = nfa_data().load_from_file(tdir + "test_data/text_ddfa.nfa_data") delay_dfa3.create_from_nfa_data(nfaData) delay_dfa3.determinise() delay_dfa3.compute(False) self.assertTrue(delay_dfa3.get_compute()) self.assertEqual(delay_dfa1.get_default_trans_num(), 0) self.assertEqual(delay_dfa2.get_default_trans_num(), 1) self.assertEqual(delay_dfa3.get_default_trans_num(), 4)