17 #ifndef VCSN_ALGORITHMS_REALTIME_HXX
18 # define VCSN_ALGORITHMS_REALTIME_HXX
26 # include <vaucanson/automata/concept/automata_base.hh>
39 void do_realtime_words(Auto& a)
41 AUTOMATON_TYPES(Auto);
43 semiring_elt_t s_ident = algebra::identity_as<semiring_elt_value_t>
44 ::of(a.structure().series().semiring());
46 typedef std::vector<htransition_t> transition_vector_t;
48 transition_vector_t tmp_trans;
49 for_all_(transitions_t, e, transitions)
50 tmp_trans.push_back(*e);
52 for_all(typename transition_vector_t, e, tmp_trans)
54 hstate_t start = a.src_of(*e);
55 hstate_t stop = a.dst_of(*e);
56 series_set_elt_t label = a.series_of(*e);
58 assert(label.supp().begin() != label.supp().end());
60 monoid_elt_t m1(a.structure().series().monoid(), *label.supp().begin());
61 monoid_elt_value_t w1 = m1.value();
62 unsigned int size = m1.length();
66 monoid_elt_t m(a.structure().series().monoid());
68 semiring_elt_t s = label.get(m1);
69 series_set_elt_t in_series(a.structure().series());
70 typename monoid_elt_t::iterator l = m1.begin();
74 in_series.assoc(m, s);
77 a.add_series_transition(start, s1, in_series);
80 for (
typename monoid_elt_t::iterator end = m1.begin() + (size - 1);
86 series_set_elt_t series(a.structure().series());
87 series.assoc(m, s_ident);
88 a.add_series_transition(s0, s1, series);
93 series_set_elt_t out_series(a.structure().series());
94 out_series.assoc(m, s_ident);
96 a.add_series_transition(s1, stop, out_series);
103 template <
class S,
class T>
104 void realtime_words_here(Element<S, T>& res)
106 typedef Element<S, T> auto_t;
107 AUTOMATON_TYPES(auto_t);
108 typedef std::vector<hstate_t> state_vector_t;
109 typedef std::vector<htransition_t> transition_vector_t;
116 tmp.reserve(res.initial().size());
117 for_all_const_initial_states(i, res)
119 for_all(typename state_vector_t, i, tmp)
121 series_set_elt_t l = res.get_initial(*i);
122 assert(l.supp().begin() != l.supp().end());
123 monoid_elt_t m(res.structure().series().monoid(), *l.supp().begin());
126 hstate_t s = res.add_state();
127 res.add_series_transition(s, *i, l);
129 res.unset_initial(*i);
135 tmp.reserve(res.final().size());
136 for_all_const_final_states(f, res)
138 for_all(typename state_vector_t, f, tmp)
140 series_set_elt_t l = res.get_final(*f);
141 assert(l.supp().begin() != l.supp().end());
142 monoid_elt_t m(res.structure().series().monoid(), *l.supp().begin());
145 hstate_t s = res.add_state();
146 res.add_series_transition(*f, s, l);
154 do_realtime_words(res);
162 template <
class A,
typename AI>
164 do_is_realtime(
const AutomataBase<A>&,
const Element<A, AI>& a)
166 BENCH_TASK_SCOPED(
"is_realtime (automaton)");
167 typedef Element<A, AI> automaton_t;
168 AUTOMATON_TYPES(automaton_t);
169 for_all_const_initial_states(e, a)
171 series_set_elt_t l = a.get_initial(*e);
172 if (l.supp().size() > 1)
176 assertion(l.supp().size() == 1);
177 monoid_elt_t m(a.structure().series().monoid(), *l.supp().begin());
181 for_all_const_final_states(e, a)
183 series_set_elt_t l = a.get_final(*e);
184 if (l.supp().size() > 1)
188 assertion(l.supp().size() == 1);
189 monoid_elt_t m(a.structure().series().monoid(), *l.supp().begin());
193 for_all_const_transitions(e, a)
204 template<typename A, typename AI>
206 do_realtime_here(const AutomataBase<A>&,
210 realtime_words_here(a);
215 if (dir == misc::forward)
222 template<
typename A,
typename AI>
234 template<
typename A,
typename AI>
236 do_realtime(
const AutomataBase<A>& b,
237 const Element<A, AI>& a,
240 Element<A, AI> ret(a);
241 do_realtime_here(b, ret, dir);
245 template<
typename A,
typename AI>
249 return do_realtime(a.
structure(), a, dir);
255 #endif // ! VCSN_ALGORITHMS_REALTIME_HXX