def __init__(self, epsilon_nfa: EpsilonNFA): edges = [] dfa = epsilon_nfa.to_deterministic() state_to_idx = dict([(state, index) for index, state in enumerate(dfa.states)]) for state_from, transitions in epsilon_nfa.to_deterministic().to_dict( ).items(): for label, state_to in transitions.items(): edges.append( Edge(node_from=state_to_idx[state_from], node_to=state_to_idx[state_to], label=label)) self.dfa = dfa self.dfa_state_to_idx = state_to_idx start_states = [ self.dfa_state_to_idx[state] for state in self.dfa.start_states ] final_states = [ self.dfa_state_to_idx[state] for state in self.dfa.final_states ] super().__init__(edges, set(start_states), set(final_states))
def graph_to_dfa(g: Graph): nfa = EpsilonNFA() state_count = 0 for tup in g: sub, pred, obj = map(str, tup) # nfa.add_transition(State(sub), Symbol(pred), State(obj)) nfa.add_start_state(State(sub)) nfa.add_start_state(State(obj)) nfa.add_final_state(State(sub)) nfa.add_final_state(State(obj)) nfa.add_transition(State(sub), Epsilon(), State(state_count)) for c in pred: nfa.add_transition(State(state_count), Symbol(c), State(state_count+1)) state_count += 1 nfa.add_transition(State(state_count), Epsilon(), State(obj)) return nfa.to_deterministic()