コード例 #1
0
 def test_add_state(self):
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     s1 = f.add_state()
     self.assertEqual(f.get_states(), [s0, s1])
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {},
             'transitions': {
                 s0: {},
                 s1: {}
             }
         })
     s2 = f.add_state()
     self.assertEqual(f.get_states(), [s0, s1, s2])
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {},
             'transitions': {
                 s0: {},
                 s2: {},
                 s1: {}
             }
         })
コード例 #2
0
 def test_construction(self):
     f = MutableAutomaton()
     self.assertEqual(f.get_letters(), [])
     s0 = f.get_initial_state()
     self.assertEqual(s0, 0)
     self.assertEqual(f.get_states(), [s0])
     self.assertEqual(f.get_final_states(), [])
     self.assertEqual(f.to_dict(), {
         'initial': s0,
         'finals': set(),
         'outputs': {},
         'transitions': {
             s0: {}
         }
     })
コード例 #3
0
 def test_add_transition(self):
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     s1 = f.add_state()
     s2 = f.add_state()
     # s0 a s1
     f.add_transition(s0, 'a', s1)
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {},
             'transitions': {
                 s0: {
                     'a': s1
                 },
                 s1: {},
                 s2: {}
             }
         })
     t = f.get_target(s0, 'a')
     self.assertEqual(t, s1)
     self.assertEqual(f.get_letters(), ['a'])
     # s0 b s2
     f.add_transition(s0, 'b', s2)
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {},
             'transitions': {
                 s0: {
                     'a': s1,
                     'b': s2
                 },
                 s1: {},
                 s2: {}
             }
         })
     t = f.get_target(s0, 'b')
     self.assertEqual(t, s2)
     self.assertEqual(f.get_letters(), ['a', 'b'])
     # s1 a s0
     f.add_transition(s1, 'a', s0)
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {},
             'transitions': {
                 s0: {
                     'a': s1,
                     'b': s2
                 },
                 s1: {
                     'a': s0
                 },
                 s2: {}
             }
         })
     t = f.get_target(s1, 'a')
     self.assertEqual(t, s0)
     # s0 a s2
     f.add_transition(s0, 'a', s2)
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {},
             'transitions': {
                 s0: {
                     'a': s2,
                     'b': s2
                 },
                 s1: {
                     'a': s0
                 },
                 s2: {}
             }
         })
     t = f.get_target(s0, 'a')
     self.assertEqual(t, s2)
コード例 #4
0
 def test_add_transition_with_empty_word(self):
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     self.assertRaises(MutableAutomatonException, f.add_transition, s0, '',
                       s0)
コード例 #5
0
    def test_to_dot(self):
        f = MutableAutomaton()
        # initial state
        s0 = f.get_initial_state()
        expected_dot = """digraph automaton {
rankdir = LR;
label = "";
center = 1;
ranksep = "0.4";
nodesep = "0.25";
0 [label = "0", shape = circle, style = bold, fontsize = 14]
}"""
        self.assertEqual(f.to_dot().split('\n'), expected_dot.split('\n'))
        # add state
        s1 = f.add_state()
        expected_dot = """digraph automaton {
rankdir = LR;
label = "";
center = 1;
ranksep = "0.4";
nodesep = "0.25";
0 [label = "0", shape = circle, style = bold, fontsize = 14]
1 [label = "1", shape = circle, style = bold, fontsize = 14]
}"""
        self.assertEqual(f.to_dot().split('\n'), expected_dot.split('\n'))
        # add transition
        f.add_transition(s0, 'a', s1)
        expected_dot = """digraph automaton {
rankdir = LR;
label = "";
center = 1;
ranksep = "0.4";
nodesep = "0.25";
0 [label = "0", shape = circle, style = bold, fontsize = 14]
	0 -> 1 [label = "a", fontsize = 14];
1 [label = "1", shape = circle, style = bold, fontsize = 14]
}"""
        self.assertEqual(f.to_dot().split('\n'), expected_dot.split('\n'))
        # add final state
        f.set_final_state(s1)
        # check to_dot
        expected_dot = """digraph automaton {
rankdir = LR;
label = "";
center = 1;
ranksep = "0.4";
nodesep = "0.25";
0 [label = "0", shape = circle, style = bold, fontsize = 14]
	0 -> 1 [label = "a", fontsize = 14];
1 [label = "1", shape = doublecircle, style = bold, fontsize = 14]
}"""
        self.assertEqual(f.to_dot().split('\n'), expected_dot.split('\n'))
コード例 #6
0
 def test_get_stats(self):
     # build some fsa
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     s1 = f.add_state()
     s2 = f.add_state()
     s3 = f.add_state()
     s4 = f.add_state()
     s5 = f.add_state()
     s6 = f.add_state()
     s7 = f.add_state()
     f.add_transition(s0, 'a', s1).add_transition(s0, 'b', s3)
     f.add_transition(s1, 'a', s1).add_transition(s1, 'b', s2)
     f.add_transition(s2, 'a', s4).add_transition(s2, 'b', s7)
     f.add_transition(s3, 'a', s4).add_transition(s3, 'b', s7)
     f.add_transition(s4, 'a', s1).add_transition(s4, 'b', s5)
     f.add_transition(s5, 'a', s4).add_transition(s5, 'b', s6)
     f.add_transition(s6, 'a', s4).add_transition(s6, 'b', s7)
     f.add_transition(s7, 'a', s4).add_transition(s7, 'b', s7)
     f.set_final_state(s2).set_final_state(s5).set_final_state(
         s6).set_final_state(s7)
     f.add_output(s2, 'ab').add_output(s5, 'ab').add_output(
         s6, 'bb').add_output(s6, 'babb').add_output(s7, 'bb')
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': {s2, s5, s6, s7},
             'outputs': {
                 s2: ['ab'],
                 s5: ['ab'],
                 s6: ['babb', 'bb'],
                 s7: ['bb']
             },
             'transitions': {
                 s0: {
                     'a': s1,
                     'b': s3
                 },
                 s1: {
                     'a': s1,
                     'b': s2
                 },
                 s2: {
                     'a': s4,
                     'b': s7
                 },
                 s3: {
                     'a': s4,
                     'b': s7
                 },
                 s4: {
                     'a': s1,
                     'b': s5
                 },
                 s5: {
                     'a': s4,
                     'b': s6
                 },
                 s6: {
                     'a': s4,
                     'b': s7
                 },
                 s7: {
                     'a': s4,
                     'b': s7
                 }
             }
         })
     # test get_stats
     self.assertEqual(f.get_stats(), {
         'numStates': 8,
         'numFinalStates': 4,
         'numTransitions': 16
     })
コード例 #7
0
 def test_output_stuff(self):
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     self.assertEqual(f.get_outputs(s0), set())
     self.assertEqual(f.to_dict(), {
         'initial': s0,
         'finals': set(),
         'outputs': {},
         'transitions': {
             s0: {}
         }
     })
     f.add_output(s0, 1)
     self.assertEqual(f.get_outputs(s0), {1})
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {
                 s0: [1]
             },
             'transitions': {
                 s0: {}
             }
         })
     f.add_output(s0, 2)
     self.assertEqual(f.get_outputs(s0), {1, 2})
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {
                 s0: [1, 2]
             },
             'transitions': {
                 s0: {}
             }
         })
     f.add_output(s0, 1)
     self.assertEqual(f.get_outputs(s0), {1, 2})
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': set(),
             'outputs': {
                 s0: [1, 2]
             },
             'transitions': {
                 s0: {}
             }
         })
コード例 #8
0
 def test_det_search_ab_aa(self):
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     s1 = f.add_state()
     s2 = f.add_state()
     s3 = f.add_state()
     f.add_transition(s0, 'a', s1)
     f.add_transition(s1, 'a', s2).add_transition(s1, 'b', s3)
     f.set_final_state(s2).set_final_state(s3)
     f.add_output(s2, 'aa').add_output(s3, 'ab')
     self.assertEqual(f.search('a ab aa'), [])
コード例 #9
0
 def test_det_search_ab_babb_bb(self):
     # build some fsa
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     s1 = f.add_state()
     s2 = f.add_state()
     s3 = f.add_state()
     s4 = f.add_state()
     s5 = f.add_state()
     s6 = f.add_state()
     s7 = f.add_state()
     f.add_transition(s0, 'a', s1).add_transition(s0, 'b', s3)
     f.add_transition(s1, 'a', s1).add_transition(s1, 'b', s2)
     f.add_transition(s2, 'a', s4).add_transition(s2, 'b', s7)
     f.add_transition(s3, 'a', s4).add_transition(s3, 'b', s7)
     f.add_transition(s4, 'a', s1).add_transition(s4, 'b', s5)
     f.add_transition(s5, 'a', s4).add_transition(s5, 'b', s6)
     f.add_transition(s6, 'a', s4).add_transition(s6, 'b', s7)
     f.add_transition(s7, 'a', s4).add_transition(s7, 'b', s7)
     f.set_final_state(s2).set_final_state(s5).set_final_state(
         s6).set_final_state(s7)
     f.add_output(s2, 'ab').add_output(s5, 'ab').add_output(
         s6, 'bb').add_output(s6, 'babb').add_output(s7, 'bb')
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': {s2, s5, s6, s7},
             'outputs': {
                 s2: ['ab'],
                 s5: ['ab'],
                 s6: ['babb', 'bb'],
                 s7: ['bb']
             },
             'transitions': {
                 s0: {
                     'a': s1,
                     'b': s3
                 },
                 s1: {
                     'a': s1,
                     'b': s2
                 },
                 s2: {
                     'a': s4,
                     'b': s7
                 },
                 s3: {
                     'a': s4,
                     'b': s7
                 },
                 s4: {
                     'a': s1,
                     'b': s5
                 },
                 s5: {
                     'a': s4,
                     'b': s6
                 },
                 s6: {
                     'a': s4,
                     'b': s7
                 },
                 s7: {
                     'a': s4,
                     'b': s7
                 }
             }
         })
     self.assertEqual(f.get_letters(), ['a', 'b'])
     # test det_search simulation on babba
     self.assertEqual(f.get_target(s0, 'b'), s3)
     self.assertEqual(f.get_target(s3, 'a'), s4)
     self.assertEqual(f.get_target(s4, 'b'), s5)
     self.assertEqual(f.get_target(s5, 'b'), s6)
     self.assertEqual(f.get_target(s6, 'a'), s4)
     # test det_search
     outputs = f.search('babba')
     # babba
     # 01234
     self.assertEqual(outputs, [('ab', 1, 3), ('babb', 0, 4), ('bb', 2, 4)])
     for o in outputs:
         self.assertEqual('babba'[o[1]:o[2]], o[0])
コード例 #10
0
 def test_accept(self):
     # build some fsa
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     s1 = f.add_state()
     f.add_transition(s0, 'a', s1).add_transition(s1, 'a',
                                                  s0).set_final_state(s1)
     self.assertEqual(
         f.to_dict(), {
             'initial': s0,
             'finals': {s1},
             'outputs': {},
             'transitions': {
                 s0: {
                     'a': s1
                 },
                 s1: {
                     'a': s0
                 }
             }
         })
     # test accept
     # empty word is not accepted
     self.assertFalse(f.accept(''))
     # a is accepted
     self.assertTrue(f.accept('a'))
     # aa is not accepted
     self.assertFalse(f.accept('aa'))
     # aaa is not accepted
     self.assertTrue(f.accept('aaa'))
     # b is not accepted
     self.assertFalse(f.accept('b'))
コード例 #11
0
 def test_is_final_state(self):
     f = MutableAutomaton()
     s0 = f.get_initial_state()
     self.assertFalse(f.is_final_state(s0))
     s1 = f.add_state()
     f.set_final_state(s1)
     self.assertFalse(f.is_final_state(s0))
     self.assertTrue(f.is_final_state(s1))
     f.set_final_state(s0)
     self.assertTrue(f.is_final_state(s0))