Skip to content

Commit 98b9b85

Browse files
committed
refactor PreviousTransitions
1 parent 0362719 commit 98b9b85

File tree

2 files changed

+41
-42
lines changed

2 files changed

+41
-42
lines changed

pyformlang/finite_automaton/deterministic_finite_automaton.py

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,15 @@
22
Representation of a deterministic finite automaton
33
"""
44

5-
from typing import Dict, List, Iterable, AbstractSet, Optional, Hashable, Any
6-
from numpy import empty
5+
from typing import Iterable, AbstractSet, Optional, Hashable, Any
76

87
from .state import State
9-
from .symbol import Symbol
108
from .deterministic_transition_function import DeterministicTransitionFunction
119
from .epsilon_nfa import EpsilonNFA
1210
from .nondeterministic_finite_automaton import NondeterministicFiniteAutomaton
1311
from .hopcroft_processing_list import HopcroftProcessingList
1412
from .partition import Partition
15-
from .utils import to_state, to_symbol, to_single_state
16-
17-
18-
class PreviousTransitions:
19-
"""For internal usage"""
20-
21-
def __init__(self,
22-
states: AbstractSet[State],
23-
symbols: AbstractSet[Symbol]) -> None:
24-
self._to_index_state: Dict[Optional[State], int] = {}
25-
self._to_index_state[None] = 0
26-
for i, state in enumerate(states):
27-
self._to_index_state[state] = i + 1
28-
self._to_index_symbol: Dict[Optional[Symbol], int] = {}
29-
for i, symbol in enumerate(symbols):
30-
self._to_index_symbol[symbol] = i
31-
self._conversion = empty((len(states) + 1, len(symbols)),
32-
dtype=object)
33-
34-
def add(self,
35-
next0: Optional[State],
36-
symbol: Symbol,
37-
state: Optional[State]) -> None:
38-
""" Internal """
39-
i_next0 = self._to_index_state[next0]
40-
i_symbol = self._to_index_symbol[symbol]
41-
if self._conversion[i_next0, i_symbol] is None:
42-
self._conversion[i_next0, i_symbol] = [state]
43-
else:
44-
self._conversion[i_next0, i_symbol].append(state)
45-
46-
def get(self, next0: State, symbol: Symbol) -> List[object]:
47-
""" Internal """
48-
i_next0 = self._to_index_state[next0]
49-
i_symbol = self._to_index_symbol[symbol]
50-
return self._conversion[i_next0, i_symbol] or []
13+
from .utils import to_state, to_symbol, to_single_state, PreviousTransitions
5114

5215

5316
class DeterministicFiniteAutomaton(NondeterministicFiniteAutomaton):
@@ -263,8 +226,6 @@ def _get_previous_transitions(self) -> PreviousTransitions:
263226
for symbol in self._input_symbols:
264227
next0 = self._transition_function.get_next_state(state, symbol)
265228
previous_transitions.add(next0, symbol, state)
266-
for symbol in self._input_symbols:
267-
previous_transitions.add(None, symbol, None)
268229
return previous_transitions
269230

270231
def minimize(self) -> "DeterministicFiniteAutomaton":

pyformlang/finite_automaton/utils.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" Utility for finite automata """
22

3-
from typing import Iterable, Hashable
3+
from typing import Dict, List, AbstractSet, Iterable, Optional, Hashable
4+
from numpy import empty
45

56
from .state import State
67
from .symbol import Symbol
@@ -56,3 +57,40 @@ def to_single_state(l_states: Iterable[State]) -> State:
5657
values.append("TRASH")
5758
values = sorted(values)
5859
return State(";".join(values))
60+
61+
62+
class PreviousTransitions:
63+
"""
64+
Previous transitions for deterministic automata
65+
minimization algorithm.
66+
"""
67+
68+
def __init__(self,
69+
states: AbstractSet[State],
70+
symbols: AbstractSet[Symbol]) -> None:
71+
self._to_index_state: Dict[State, int] = {}
72+
for i, state in enumerate(states):
73+
self._to_index_state[state] = i + 1
74+
self._to_index_symbol: Dict[Symbol, int] = {}
75+
for i, symbol in enumerate(symbols):
76+
self._to_index_symbol[symbol] = i
77+
self._conversion = empty((len(states) + 1, len(symbols)),
78+
dtype=State)
79+
80+
def add(self,
81+
next0: Optional[State],
82+
symbol: Symbol,
83+
state: State) -> None:
84+
""" Internal """
85+
i_next0 = self._to_index_state[next0] if next0 else 0
86+
i_symbol = self._to_index_symbol[symbol]
87+
if self._conversion[i_next0, i_symbol] is None:
88+
self._conversion[i_next0, i_symbol] = [state]
89+
else:
90+
self._conversion[i_next0, i_symbol].append(state)
91+
92+
def get(self, next0: Optional[State], symbol: Symbol) -> List[State]:
93+
""" Internal """
94+
i_next0 = self._to_index_state[next0] if next0 else 0
95+
i_symbol = self._to_index_symbol[symbol]
96+
return self._conversion[i_next0, i_symbol] or []

0 commit comments

Comments
 (0)