CUBA
fsa.hh
1 
8 #ifndef DS_FSA_HH_
9 #define DS_FSA_HH_
10 
11 #include "pda.hh"
12 
13 namespace ruba {
14 using fsa_state = pda_state;
16 using fsa_state_set = set<fsa_state>;
17 
18 using fsa_alpha = pda_alpha;
20 using fsa_alphabet = set<fsa_alpha>;
21 
26 public:
28  fsa_transition(const fsa_state& src, const fsa_state& dst,
29  const fsa_alpha& label);
31 
32  fsa_state get_src() const {
33  return src;
34  }
35 
36  fsa_state get_dst() const {
37  return dst;
38  }
39 
40  fsa_alpha get_label() const {
41  return label;
42  }
43 
44  void set_dst(fsa_state dst) {
45  this->dst = dst;
46  }
47 
48  void set_label(const fsa_alpha label) {
49  this->label = label;
50  }
51 
52  void set_src(const fsa_state src) {
53  this->src = src;
54  }
55 
56 private:
57  fsa_state src;
58  fsa_state dst;
59  fsa_alpha label;
60 };
61 
68 inline ostream& operator<<(ostream& os, const fsa_transition& r) {
69  os << "(" << r.get_src() << ",";
70  if (r.get_label() == alphabet::EPSILON)
71  os << alphabet::OPT_EPSILON;
72  else
73  os << r.get_label();
74  os << "," << r.get_dst() << ")";
75  return os;
76 }
77 
84 inline bool operator<(const fsa_transition& r1, const fsa_transition& r2) {
85  if (r1.get_src() == r2.get_src()) {
86  if (r1.get_dst() == r2.get_dst())
87  return r1.get_label() < r2.get_label();
88  return r1.get_dst() < r2.get_dst();
89  }
90  return r1.get_src() < r2.get_src();
91 }
92 
99 inline bool operator>(const fsa_transition& r1, const fsa_transition& r2) {
100  return r2 < r1;
101 }
102 
109 inline bool operator==(const fsa_transition& r1, const fsa_transition& r2) {
110  return (r1.get_src() == r2.get_src()) && (r1.get_dst() == r2.get_dst())
111  && (r1.get_label() == r2.get_label());
112 }
113 
120 inline bool operator!=(const fsa_transition& r1, const fsa_transition& r2) {
121  return !(r1 == r2);
122 }
123 
125 using fsa_delta = unordered_map<fsa_state, set<fsa_transition>>;
126 
131 public:
132  finite_automaton(const fsa_state_set& states, const fsa_alphabet& alphabet,
133  const fsa_delta& transitions, const fsa_state_set& start,
134  const fsa_state& accept);
135 
136  finite_automaton(const fsa_state_set& states, const fsa_alphabet& alphabet,
137  const fsa_state_set& start, const fsa_state& accept);
138 
139  virtual ~finite_automaton();
140 
141  const fsa_state_set& get_states() const {
142  return states;
143  }
144 
145  const fsa_alphabet& get_alphas() const {
146  return alphas;
147  }
148 
149  const fsa_delta& get_transitions() const {
150  return transitions;
151  }
152 
153  fsa_state_set get_start() const {
154  return start;
155  }
156 
157  void set_initials(const fsa_state_set& initials) {
158  this->start = initials;
159  }
160 
161  fsa_state get_accept() const {
162  return accept;
163  }
164 
165  bool empty() const {
166  return states.size() == 0 || transitions.size() == 0;
167  }
168 
169 private:
170  fsa_state_set states;
171  fsa_alphabet alphas;
172  fsa_delta transitions;
173  fsa_state_set start;
175  fsa_state accept;
177 };
178 
185 inline ostream& operator<<(ostream& os, const finite_automaton& fsa) {
186  if (fsa.get_states().size() == 0)
187  return os;
188 
189  /*
191  vector<vector<string>> matrix(
192  fsa.get_states().size() + fsa.get_initials().size(),
193  vector<string>(fsa.get_states().size(), ""));
194  for (const auto& p : fsa.get_transitions()) {
195  for (const auto& r : p.second) {
196  const int& i = r.get_src();
197  const int& j = r.get_dst() - fsa.get_initials().size();
198  if (matrix[i][j].length() > 0)
199  matrix[i][j].push_back(',');
200  if (r.get_label() == -1)
201  matrix[i][j] += "e";
202  else
203  matrix[i][j] += std::to_string(r.get_label());
204  }
205  }
206 
207  auto m = matrix.size();
208  auto n = std::to_string(m).length() + 1;
209  os << algs::widthify("", n + 2);
210  for (int i = fsa.get_initials().size(); i < m; ++i) {
211  os << algs::widthify("q" + std::to_string(i), n, alignment::LEFTJUST);
212  os << " | ";
213  }
214  os << "\n";
215  for (int i = 0; i < m; ++i) {
216  os << algs::widthify("q" + std::to_string(i), n, alignment::LEFTJUST);
217  os << "|";
218  for (int j = 0; j < matrix[0].size(); ++j)
219  os << algs::widthify(matrix[i][j], n + 2, alignment::CENTERED)
220  << " ";
221  os << "\n";
222  }
223  */
224  os << "S = { ";
225  for (auto q : fsa.get_start())
226  os << q << " ";
227  for (auto s : fsa.get_states())
228  os << s << " ";
229  os << "}\n";
230  os << "F = { " << fsa.get_accept() << "}\n";
231  os << "D = {\n";
232  for (auto p : fsa.get_transitions()) {
233  for (auto r : p.second)
234  os << string(4, ' ') << r << "\n";
235  }
236  os << "}";
237  return os;
238 }
239 
240 } /* namespace ruba */
241 
242 #endif /* DS_FSA_HH_ */
uint pda_alpha
define the stack symbol of PDSs
Definition: pda.hh:19
Definition: cpda.cc:10
virtual ~finite_automaton()
Definition: fsa.cc:77
unordered_map< fsa_state, set< fsa_transition > > fsa_delta
the data structure of FSA transitions
Definition: fsa.hh:125
bool operator>(const visible_state &s1, const visible_state &s2)
Definition: cpda.hh:108
bool operator==(const visible_state &s1, const visible_state &s2)
Definition: cpda.hh:118
bool operator!=(const visible_state &s1, const visible_state &s2)
Definition: cpda.hh:131
fsa_transition()
Definition: fsa.cc:15
set< fsa_alpha > fsa_alphabet
a set of fsa_alpha
Definition: fsa.hh:20
ostream & operator<<(ostream &os, const visible_state &s)
Definition: cpda.hh:70
~fsa_transition()
Definition: fsa.cc:37
uint pda_state
define the control state of PDSs
Definition: pda.hh:17
Definition: fsa.hh:130
bool operator<(const visible_state &s1, const visible_state &s2)
Definition: cpda.hh:95
Definition: fsa.hh:25
Definition: pda.hh:29
set< fsa_state > fsa_state_set
a set of fsa_state
Definition: fsa.hh:16
finite_automaton(const fsa_state_set &states, const fsa_alphabet &alphabet, const fsa_delta &transitions, const fsa_state_set &start, const fsa_state &accept)
Definition: fsa.cc:50