18 #ifndef VCSN_ALGORITHMS_RW_COMPOSITION_HXX
19 # define VCSN_ALGORITHMS_RW_COMPOSITION_HXX
27 # include <vaucanson/automata/concept/transducer.hh>
30 # include <vaucanson/automata/implementation/geometry.hh>
35 template <
typename U,
typename Trans_t>
37 do_rw_composition(
const TransducerBase<U>&,
42 BENCH_TASK_SCOPED(
"rw_composition");
48 AUTOMATON_TYPES(Trans_t);
49 typedef series_set_elt_t exp_t;
50 typedef typename series_set_elt_t::semiring_elt_t output_exp_t;
51 typedef std::set<std::pair<hstate_t, output_exp_t> > state_exp_pair_set_t;
52 typedef typename std::map<hstate_t, typename Trans_t::geometry_t::coords_t>::const_iterator geom_iter_t;
53 typedef std::pair<hstate_t, hstate_t> state_pair_t;
54 typedef std::queue<state_pair_t> state_pair_queue_t;
55 typedef std::map<state_pair_t, hstate_t> state_pair_map_t;
56 typedef std::set<htransition_t> set_of_transitions_t;
59 state_pair_queue_t queue;
64 state_exp_pair_set_t sep_set;
69 state_pair_map_t Tstates;
81 monoid_elt_t Ridentity = R.series().monoid().identity(
SELECT(monoid_elt_value_t));
82 monoid_elt_t Sidentity = S.series().monoid().identity(
SELECT(monoid_elt_value_t));
83 monoid_elt_t Tidentity = T.series().monoid().identity(
SELECT(monoid_elt_value_t));
85 for_all_const_initial_states (p, R)
91 output_exp_t E = R.get_initial(*p).get(Ridentity);
93 for_all_const_initial_states (q, S)
97 output_exp_t F = S.get_initial(*q).get(Sidentity);
104 for_all_const_(state_exp_pair_set_t, ig, sep_set)
109 sp.second = (*ig).first;
111 if (Tstates.find(sp) == Tstates.end())
116 hstate_t new_state = T.add_state();
119 iter = R.geometry().states().find(*p);
120 if (iter != R.geometry().states().end())
121 xgeom = (*iter).second.first;
124 iter = S.geometry().states().find(*q);
125 if (iter != S.geometry().states().end())
126 ygeom = (*iter).second.second;
129 T.geometry().states()[new_state] = std::make_pair(xgeom, ygeom);
132 Tstates[sp] = new_state;
135 series_set_elt_t new_series(T.series());
136 new_series.assoc(Tidentity, F * ((*ig).second));
137 T.set_initial(new_state, new_series);
146 series_set_elt_t new_series(T.series());
147 new_series.assoc(Tidentity, T.get_initial(Tstates[sp]).get(Tidentity) + F * ((*ig).second));
148 T.set_initial(Tstates[sp], new_series);
159 while (not queue.empty())
162 const state_pair_t sp = queue.front();
165 const hstate_t p = sp.first;
166 const hstate_t q = sp.second;
169 for (delta_iterator e(R.value(), p); !e.done(); e.next())
171 hstate_t s = R.dst_of(*e);
172 exp_t E = R.series_of(*e);
176 for_all_const_(series_set_elt_t::support_t, y, E.supp())
178 const monoid_elt_t x(E.structure().monoid(), *y);
184 for_all_const_(state_exp_pair_set_t, ig, sep_set)
189 sp1.second = (*ig).first;
191 if (Tstates.find(sp1) == Tstates.end())
196 hstate_t new_state = T.add_state();
199 iter = R.geometry().states().find(sp1.first);
200 if (iter != R.geometry().states().end())
201 xgeom = (*iter).second.first;
204 iter = S.geometry().states().find(sp1.second);
205 if (iter != S.geometry().states().end())
206 ygeom = (*iter).second.second;
209 T.geometry().states()[new_state] = std::make_pair(xgeom, ygeom);
212 Tstates[sp1] = new_state;
218 exp_t Gexp(R.structure().series());
219 Gexp.assoc(x, (*ig).second);
220 T.add_series_transition(Tstates[sp], Tstates[sp1], Gexp);
233 for_all_const_(state_exp_pair_set_t, ig, sep_set)
235 const hstate_t r = (*ig).first;
238 series_set_elt_t new_series(T.series());
240 new_series.assoc(Tidentity, (*ig).second * S.get_final(r).get(Sidentity));
241 T.set_final(Tstates[sp], new_series);
249 template <
typename S,
typename T>
257 AUTOMATON_TYPES(auto_t);
262 precondition(&ret != &lhs);
263 precondition(&ret != &rhs);
266 for_all_states (s, ret)
269 do_rw_composition(lhs.
structure(), lhs, rhs, ret);
274 template <
typename S,
typename T>
281 do_rw_composition(lhs.
structure(), lhs, rhs, ret);
287 #endif // ! VCSN_ALGORITHMS_RW_COMPOSITION_HXX