17 #ifndef VCSN_ALGORITHMS_NORMALIZED_COMPOSITION_HXX
18 # define VCSN_ALGORITHMS_NORMALIZED_COMPOSITION_HXX
37 # include <vaucanson/algebra/concept/freemonoid_product.hh>
38 # include <vaucanson/algebra/implementation/series/series.hh>
39 # include <vaucanson/automata/concept/automata.hh>
44 template <
typename S,
typename M1,
typename M2,
typename lhs_t,
45 typename rhs_t,
typename res_t>
48 AUTOMATON_TYPES(res_t);
49 AUTOMATON_TYPES_(lhs_t, lhs_);
50 AUTOMATON_TYPES_(rhs_t, rhs_);
52 #define SPECIFIC_TYPES(Auto) \
53 typedef std::list<typename Auto##_t::htransition_t> Auto##_delta_ret_t; \
60 typedef std::pair<lhs_hstate_t, rhs_hstate_t> pair_hstate_t;
61 typedef std::map<pair_hstate_t, hstate_t> visited_t;
62 typedef std::map<hstate_t, pair_hstate_t> map_of_states_t;
63 typedef std::queue<pair_hstate_t> to_process_t;
65 typedef std::list<htransition_t> delta_ret_t;
66 typedef typename series_set_elt_t::support_t support_t;
67 typedef typename lhs_series_set_elt_t::support_t lhs_support_t;
68 typedef typename rhs_series_set_elt_t::support_t rhs_support_t;
70 typedef typename lhs_monoid_t::first_monoid_t
72 typedef typename lhs_monoid_elt_value_t::first_type
73 lhs_first_monoid_elt_value_t;
74 typedef Element<lhs_first_monoid_t, lhs_first_monoid_elt_value_t>
75 lhs_first_monoid_elt_t;
77 typedef typename rhs_monoid_t::first_monoid_t
79 typedef typename rhs_monoid_elt_value_t::first_type
80 rhs_first_monoid_elt_value_t;
81 typedef Element<rhs_first_monoid_t, rhs_first_monoid_elt_value_t>
82 rhs_first_monoid_elt_t;
84 typedef typename lhs_monoid_t::second_monoid_t
86 typedef typename lhs_monoid_elt_value_t::second_type
87 lhs_second_monoid_elt_value_t;
88 typedef Element<lhs_second_monoid_t, lhs_second_monoid_elt_value_t>
89 lhs_second_monoid_elt_t;
91 typedef typename rhs_monoid_t::second_monoid_t
93 typedef typename rhs_monoid_elt_value_t::second_type
94 rhs_second_monoid_elt_value_t;
95 typedef Element<rhs_second_monoid_t, rhs_second_monoid_elt_value_t>
96 rhs_second_monoid_elt_t;
99 to_process_t to_process;
105 std::set<typename lhs_t::hstate_t>& lhs_black_states;
106 std::set<typename rhs_t::hstate_t>& rhs_black_states;
108 const series_set_t& series;
109 const monoid_t& monoid;
111 const lhs_series_set_t& lhs_series;
112 const lhs_monoid_t& lhs_monoid;
114 const rhs_series_set_t& rhs_series;
115 const rhs_monoid_t& rhs_monoid;
117 lhs_first_monoid_elt_t lhs_first_identity;
118 rhs_first_monoid_elt_t rhs_first_identity;
119 lhs_second_monoid_elt_t lhs_second_identity;
120 rhs_second_monoid_elt_t rhs_second_identity;
122 composer (
const AutomataBase<S>&,
123 const algebra::FreeMonoidProduct<M1, M2>&,
127 std::set<typename lhs_t::hstate_t>& aLhs_states,
128 std::set<typename rhs_t::hstate_t>& aRhs_states)
132 lhs_black_states (aLhs_states),
133 rhs_black_states (aRhs_states),
135 series (output.structure().series()),
136 monoid (series.monoid()),
138 lhs_series (lhs.structure().series()),
139 lhs_monoid (lhs_series.monoid()),
141 rhs_series (rhs.structure().series()),
142 rhs_monoid (rhs_series.monoid()),
144 lhs_first_identity (algebra::identity_as<lhs_first_monoid_elt_value_t>::
145 of(lhs_monoid.first_monoid())),
146 rhs_first_identity (algebra::identity_as<rhs_first_monoid_elt_value_t>::
147 of(rhs_monoid.first_monoid())),
148 lhs_second_identity (algebra::identity_as<lhs_second_monoid_elt_value_t>::
149 of(lhs_monoid.second_monoid())),
150 rhs_second_identity (algebra::identity_as<rhs_second_monoid_elt_value_t>::
151 of(rhs_monoid.second_monoid()))
160 add_transition(
const hstate_t current_state,
163 typename res_t::series_set_elt_t& prod_series)
165 if (lhs_black_states.find(from) == lhs_black_states.end()
166 or rhs_black_states.find(to) == rhs_black_states.end())
168 const pair_hstate_t new_pair (from, to);
170 typename visited_t::const_iterator found =
171 visited.find(new_pair);
173 if (found == visited.end())
175 dst = output.add_state();
176 visited[new_pair] = dst;
178 to_process.push(new_pair);
182 output.add_series_transition(current_state, dst, prod_series);
186 typename res_t::series_set_elt_t
187 series_product (
typename monoid_elt_value_t::first_type l1,
188 typename monoid_elt_value_t::second_type l2,
191 typename res_t::series_set_elt_t res (series);
192 const monoid_elt_value_t word (l1, l2);
193 res.assoc(word, w.value());
200 typename res_t::series_set_elt_t
201 state_series (lhs_series_set_elt_t l,
202 rhs_series_set_elt_t r)
204 series_set_elt_t res(series);
205 res.assoc(monoid_elt_t(monoid,
206 algebra::identity_as<monoid_elt_value_t>::
208 l.get(*l.supp().begin()) * r.get(*r.supp().begin()));
212 void process_one_pair (
const hstate_t current_state,
213 const typename lhs_t::hstate_t lhs_s,
214 const hstate_t rhs_s)
217 if (lhs.is_initial(lhs_s) and rhs.is_initial(rhs_s))
218 output.set_initial(current_state,
219 state_series (lhs.get_initial(lhs_s),
220 rhs.get_initial(rhs_s)));
222 if (lhs.is_final(lhs_s) and rhs.is_final(rhs_s))
223 output.set_final(current_state,
224 state_series (lhs.get_final(lhs_s),
225 rhs.get_final(rhs_s)));
227 for (delta_iterator l(lhs.value(), lhs_s); ! l.done(); l.next())
229 const lhs_series_set_elt_t left_series = lhs.series_of(*l);
230 for_all_const_(lhs_support_t, left_supp_value,left_series.supp())
232 const lhs_monoid_elt_t left_supp_elt (lhs_monoid, *left_supp_value);
235 if (left_supp_elt.value().second == lhs_second_identity.value())
238 series_product (left_supp_elt.value().first,
239 rhs_second_identity.value(),
240 left_series.get(left_supp_elt));
241 add_transition (current_state,
242 lhs.dst_of(*l), rhs_s, s);
247 for (delta_iterator r(rhs.value(), rhs_s); ! r.done(); r.next())
249 const rhs_series_set_elt_t right_series =
251 for_all_const_(rhs_support_t, right_supp_value, right_series.supp())
253 const rhs_monoid_elt_t right_supp_elt
254 (rhs_monoid, *right_supp_value);
257 if (right_supp_elt.value().first !=
258 rhs_first_identity.value())
261 if (left_supp_elt.value().second ==
262 right_supp_elt.value().first)
265 series_product (left_supp_elt.value().first,
266 right_supp_elt.value().second,
267 left_series.get(left_supp_elt)
268 * right_series.get(right_supp_elt));
271 lhs.dst_of(*l), rhs.dst_of(*r),
280 for (delta_iterator r(rhs.value(), rhs_s); ! r.done(); r.next())
282 const rhs_series_set_elt_t right_series = rhs.series_of(*r);
283 for_all_const_(rhs_support_t, right_supp_value, right_series.supp())
285 const rhs_monoid_elt_t right_supp_elt (rhs_monoid,
289 if (right_supp_elt.value().first == rhs_first_identity.value())
292 series_product (lhs_first_identity.value(),
293 right_supp_elt.value().second,
294 right_series.get(right_supp_elt));
295 add_transition (current_state,
296 lhs_s, rhs.dst_of(*r), s);
310 for_all_const_initial_states(lhs_s, lhs)
311 for_all_const_initial_states(rhs_s, rhs)
313 if (lhs_black_states.find(*lhs_s) == lhs_black_states.end() or
314 rhs_black_states.find(*rhs_s) == rhs_black_states.end())
316 const hstate_t new_state = output.add_state();
317 const pair_hstate_t new_pair (*lhs_s, *rhs_s);
319 m[new_state] = new_pair;
320 visited[new_pair] = new_state;
321 to_process.push(new_pair);
328 while (not to_process.empty())
330 const pair_hstate_t p = to_process.front();
332 process_one_pair (visited[p], p.first, p.second);
341 template <
typename S,
typename M1,
typename M2,
typename lhs_t,
342 typename rhs_t,
typename res_t>
350 AUTOMATON_TYPES(res_t);
352 std::set<typename lhs_t::hstate_t> lhs_states;
353 std::set<typename rhs_t::hstate_t> rhs_states;
355 composer<S, M1, M2, lhs_t, rhs_t, res_t>
356 compose (ret.structure(), ret.structure().series().monoid(),
357 lhs, rhs, ret, lhs_states, rhs_states);
364 template <
typename S,
typename M1,
typename M2,
typename lhs_t,
365 typename rhs_t,
typename res_t>
373 AUTOMATON_TYPES(res_t);
375 std::set<typename lhs_t::hstate_t> lhs_states;
376 std::set<typename rhs_t::hstate_t> rhs_states;
378 lhs_t lhs_cov = splitting::outsplitting(lhs, lhs_states);
379 rhs_t rhs_cov = splitting::insplitting(rhs, rhs_states);
381 composer<S, M1, M2, lhs_t, rhs_t, res_t>
382 compose (ret.structure(), ret.structure().series().monoid(),
383 lhs_cov, rhs_cov, ret, lhs_states, rhs_states);
393 template <
typename S,
typename M1,
typename M2,
typename lhs_t,
394 typename rhs_t,
typename res_t>
396 do_compose_dispatcher(
const AutomataBase<S>&,
397 const algebra::FreeMonoidProduct<M1, M2>&,
404 ret.structure().series().monoid(),
409 template <
typename S,
typename M1,
typename M2,
typename lhs_t,
410 typename rhs_t,
typename res_t,
typename weight_t>
412 do_compose_dispatcher(
const AutomataBase<S>&,
413 const algebra::FreeMonoidProduct<M1, M2>&,
420 ret.structure().series().monoid(),
426 template <
typename S,
typename T>
433 AUTOMATON_TYPES(auto_t);
435 for_all_states (s, ret)
440 SELECT(semiring_elt_value_t),
446 template <
typename S,
typename T>
452 AUTOMATON_TYPES(auto_t);
455 typename auto_t::series_set_t::monoid_t::first_monoid_t,
456 typename auto_t::series_set_t::monoid_t::second_monoid_t> res_monoid_t;
462 res_monoid_t monoid(lhs.
structure().series().monoid().first_monoid(),
463 rhs.
structure().series().monoid().second_monoid());
466 res_series_set_t series(lhs.
structure().series().semiring(), monoid);
473 SELECT(semiring_elt_value_t),
480 template <
typename S,
typename T>
487 AUTOMATON_TYPES(auto_t);
489 for_all_states (s, ret)
497 template <
typename S,
typename T>
503 AUTOMATON_TYPES(auto_t);
506 typename auto_t::series_set_t::monoid_t::first_monoid_t,
507 typename auto_t::series_set_t::monoid_t::second_monoid_t> res_monoid_t;
513 res_monoid_t monoid(lhs.
structure().series().monoid().first_monoid(),
514 rhs.
structure().series().monoid().second_monoid());
517 res_series_set_t series(lhs.
structure().series().semiring(), monoid);
530 #endif // ! VCSN_ALGORITHMS_NORMALIZED_COMPOSITION_HXX