00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_AUTOMATA_CONCEPT_AUTOMATA_OPS_HXX
00018 # define VCSN_AUTOMATA_CONCEPT_AUTOMATA_OPS_HXX
00019
00020 # include <iterator>
00021 # include <set>
00022 # include <vaucanson/misc/random.hh>
00023 # include <vaucanson/misc/contract.hh>
00024 # include <vaucanson/algebra/concept/series_base.hh>
00025
00026 namespace vcsn {
00027
00028 #define AutoType(Type) \
00029 typename Element<S, T>::Type
00030
00031 template<typename S, typename T, typename U>
00032 void
00033 op_assign(const AutomataBase<S>& concept, T& dst, const U& src)
00034 {
00035 dst = op_convert(concept, dst, src);
00036 }
00037
00038 template<typename S, typename T>
00039 void
00040 op_assign(const AutomataBase<S>&, T& dst, const T& src)
00041 {
00042 dst = src;
00043 }
00044
00045 template<typename S, typename T>
00046 const T& op_convert(const AutomataBase<S>&,
00047 SELECTOR(T), const T& from_data)
00048 {
00049 return from_data;
00050 }
00051
00052 template<typename S, typename R, typename T>
00053 R op_convert(const AutomataBase<S>& concept,
00054 SELECTOR(R), const T& src)
00055 {
00056 typedef typename automaton_traits<R>::hstate_t dst_hstate_t;
00057 typedef typename automaton_traits<T>::hstate_t src_hstate_t;
00058 typedef typename automaton_traits<T>::transition_iterator transition_iterator;
00059 typedef typename automaton_traits<T>::final_iterator final_iterator;
00060 typedef typename automaton_traits<T>::initial_iterator initial_iterator;
00061 typedef typename automaton_traits<T>::state_iterator state_iterator;
00062
00063 R dst;
00064 std::map<src_hstate_t, dst_hstate_t> states_map;
00065
00066
00067 for (state_iterator s = op_states(concept, src).begin(),
00068 s_end = op_states(concept, src).end(); s != s_end; ++s)
00069 states_map[*s] = op_add_state(concept, dst);
00070
00071
00072 for (transition_iterator t = op_transitions(concept, src).begin(),
00073 t_end = op_transitions(concept, src).end(); t != t_end; ++t)
00074 op_add_series_transition(concept,
00075 dst,
00076 states_map[op_src_of(concept, src, *t)],
00077 states_map[op_dst_of(concept, src, *t)],
00078 op_label_of(concept, src, *t));
00079
00080
00081 for (initial_iterator i = op_initial(concept, src).begin(),
00082 i_end = op_initial(concept, src).end(); i != i_end; ++i)
00083 op_set_initial(concept,
00084 dst,
00085 states_map[*i],
00086 op_get_initial(concept, src, *i));
00087
00088
00089 for (final_iterator f = op_final(concept, src).begin(),
00090 f_end = op_final(concept, src).end(); f != f_end; ++f)
00091 op_set_final(concept,
00092 dst,
00093 states_map[*f],
00094 op_get_final(concept, src, *f));
00095
00096
00097
00098 return dst;
00099 }
00100
00101
00102 template <class S, class T>
00103 const typename automaton_traits<T>::tag_t&
00104 op_get_tag(const AutomataBase<S>&, const T& v)
00105 {
00106 return v.tag();
00107 }
00108
00109 template <class S, class T>
00110 typename automaton_traits<T>::tag_t&
00111 op_get_tag(const AutomataBase<S>&, T& v)
00112 {
00113 return v.tag();
00114 }
00115
00116 template <class S, class T>
00117 const typename automaton_traits<T>::geometry_t&
00118 op_get_geometry(const AutomataBase<S>&, const T& v)
00119 {
00120 return v.geometry();
00121 }
00122
00123 template <class S, class T>
00124 typename automaton_traits<T>::geometry_t&
00125 op_get_geometry(const AutomataBase<S>&, T& v)
00126 {
00127 return v.geometry();
00128 }
00129
00130 template <class S, class T>
00131 bool
00132 op_exists(const AutomataBase<S>& s, const T& v)
00133 {
00134 return v.exists(s);
00135 }
00136
00137 template <class S, class T>
00138 typename automaton_traits<T>::states_t
00139 op_states(const AutomataBase<S>&, const T& v)
00140 {
00141 return v.states();
00142 }
00143
00144 template <class S, class T>
00145 typename automaton_traits<T>::hstate_t
00146 op_get_state(const AutomataBase<S>&, const T& v, int state)
00147 {
00148 return v.get_state(state);
00149 }
00150
00151 template <class S, class T>
00152 typename automaton_traits<T>::transitions_t
00153 op_transitions(const AutomataBase<S>&, const T& v)
00154 {
00155 return v.edges();
00156 }
00157
00158 template <class S, class T>
00159 typename automaton_traits<T>::initial_support_t
00160 op_initial(const AutomataBase<S>&, const T& v)
00161 {
00162 return v.initial();
00163 }
00164
00165 template <class S, class T>
00166 typename automaton_traits<T>::final_support_t
00167 op_final(const AutomataBase<S>&, const T& v)
00168 {
00169 return v.final();
00170 }
00171
00172 template <class S, class T>
00173 void
00174 op_set_initial(const AutomataBase<S>& ss, T& v,
00175 const typename automaton_traits<T>::hstate_t& state,
00176 const AutoType(series_set_elt_t)& s)
00177 {
00178 typedef
00179 typename Element<S, T>::series_set_elt_value_t series_set_elt_value_t;
00180 v.set_initial(state,
00181 s.value(),
00182 zero_value(ss.series(),
00183 SELECT(series_set_elt_value_t)));
00184 }
00185
00186 template <class S, class T>
00187 typename Element<S, T>::series_set_elt_t
00188 op_get_initial(const AutomataBase<S>& s,
00189 const T& v,
00190 const typename automaton_traits<T>::hstate_t& state)
00191 {
00192 return typename Element<S, T>::series_set_elt_t
00193 (s.series(),
00194 v.get_initial(state,
00195 zero_value(s.series(),
00196 SELECT(AutoType(series_set_elt_value_t)))));
00197 }
00198
00199 template <class S, class T>
00200 bool
00201 op_is_initial(const AutomataBase<S>& s,
00202 const T& v,
00203 const typename automaton_traits<T>::hstate_t& state)
00204 {
00205 return v.is_initial(state, zero_value(s.series(),
00206 SELECT(AutoType(series_set_elt_value_t))));
00207 }
00208
00209 template <class S, class T>
00210 void
00211 op_set_final(const AutomataBase<S>& ss, T& v,
00212 const typename automaton_traits<T>::hstate_t& state,
00213 const typename Element<S, T>::series_set_elt_t& s)
00214 {
00215 v.set_final(state,
00216 s.value(),
00217 zero_value(ss.series(),
00218 SELECT(AutoType(series_set_elt_value_t))));
00219 }
00220
00221 template <class S, class T>
00222 void
00223 op_set_initial(const AutomataBase<S>& ss, T& v,
00224 int state,
00225 const AutoType(series_set_elt_t)& s)
00226 {
00227 op_set_initial(ss, v, op_get_state(ss, v, state), s);
00228 }
00229
00230 template <class S, class T>
00231 typename Element<S, T>::series_set_elt_t
00232 op_get_initial(const AutomataBase<S>& s,
00233 const T& v,
00234 int state)
00235 {
00236 return op_get_initial(s, v, op_get_state(s, v, state));
00237 }
00238
00239 template <class S, class T>
00240 bool
00241 op_is_initial(const AutomataBase<S>& s,
00242 const T& v,
00243 int state)
00244 {
00245 return op_is_initial(s, v, op_get_state(s, v, state));
00246 }
00247
00248 template <class S, class T>
00249 void
00250 op_set_final(const AutomataBase<S>& ss, T& v,
00251 int state,
00252 const typename Element<S, T>::series_set_elt_t& s)
00253 {
00254 op_set_final(ss, v, op_get_state(ss, v, state), s);
00255 }
00256
00257 template <class S, class T>
00258 typename Element<S, T>::series_set_elt_t
00259 op_get_final(const AutomataBase<S>& s,
00260 const T& v,
00261 const typename automaton_traits<T>::hstate_t& state)
00262 {
00263 return typename Element<S, T>::series_set_elt_t
00264 (s.series(),
00265 v.get_final(state,
00266 zero_value(s.series(),
00267 SELECT(AutoType(series_set_elt_value_t)))));
00268 }
00269
00270 template <class S, class T>
00271 typename Element<S, T>::series_set_elt_t
00272 op_get_final(const AutomataBase<S>& s,
00273 const T& v,
00274 int state)
00275 {
00276 return op_get_final(s, v, op_get_state(s, v, state));
00277 }
00278
00279 template <class S, class T>
00280 bool
00281 op_is_final(const AutomataBase<S>& s,
00282 const T& v,
00283 const typename automaton_traits<T>::hstate_t& state)
00284 {
00285 return v.is_final(state, zero_value(s.series(),
00286 SELECT(AutoType(series_set_elt_value_t))));
00287 }
00288
00289 template <class S, class T>
00290 bool
00291 op_is_final(const AutomataBase<S>& s,
00292 const T& v,
00293 int state)
00294 {
00295 return op_is_final(s, v, op_get_state(s, v, state));
00296 }
00297
00298 template <class S, class T>
00299 void
00300 op_clear_initial(const AutomataBase<S>&, T& v)
00301 {
00302 return v.clear_initial();
00303 }
00304
00305 template <class S, class T>
00306 void
00307 op_clear_final(const AutomataBase<S>&, T& v)
00308 {
00309 return v.clear_final();
00310 }
00311
00312 template <class S, class T>
00313 typename automaton_traits<T>::hstate_t
00314 op_add_state(const AutomataBase<S>&, T& v)
00315 {
00316 return v.add_state();
00317 }
00318
00319 template <class S, class T>
00320 typename automaton_traits<T>::hstate_t
00321 op_choose_state(const AutomataBase<S>& s, const T& v)
00322 {
00323 typedef typename automaton_traits<T>::states_t states_t;
00324 typedef typename states_t::const_iterator state_iterator;
00325 const states_t& st = op_states(s, v);
00326 assertion(st.size() > 0);
00327 int n = misc::random::generate(0, int(st.size() - 1));
00328 state_iterator ss = st.begin();
00329 for (; n > 0; --n)
00330 ++ss;
00331 return *ss;
00332 }
00333
00334 template <class S, class T>
00335 typename automaton_traits<T>::htransition_t
00336 op_add_transition(const AutomataBase<S>&, T& v,
00337 const typename automaton_traits<T>::hstate_t& from,
00338 const typename automaton_traits<T>::hstate_t& to,
00339 const typename Element<S, T>::label_t& label)
00340 {
00341 return v.add_edge(from, to, label);
00342 }
00343
00344 template <class S, class T>
00345 typename automaton_traits<T>::htransition_t
00346 op_add_transition(const AutomataBase<S>& s, T& v,
00347 int from,
00348 int to,
00349 const typename Element<S, T>::label_t& label)
00350 {
00351 return op_add_transition(s, v, op_get_state(s, v, from),
00352 op_get_state(s, v, to), label);
00353 }
00354
00355 template<class S, class T>
00356 typename automaton_traits<T>::htransition_t
00357 op_add_weighted_transition(const AutomataBase<S>& s, T& v,
00358 const typename automaton_traits<T>::hstate_t& from,
00359 const typename automaton_traits<T>::hstate_t& to,
00360 const typename Element<S, T>::semiring_elt_t& w,
00361 const typename Element<S, T>::monoid_elt_value_t& m)
00362 {
00363 typename Element<S, T>::series_set_elt_t series (s.series());
00364 series.assoc(m, w.value());
00365 return op_add_series_transition(s, v, from, to, series);
00366 }
00367
00368 template<class S, class T>
00369 typename automaton_traits<T>::htransition_t
00370 op_add_weighted_transition(const AutomataBase<S>& s, T& v,
00371 int from,
00372 int to,
00373 const typename Element<S, T>::semiring_elt_t& w,
00374 const typename Element<S, T>::monoid_elt_value_t& m)
00375 {
00376 return op_add_weighted_transition(s, v, op_get_state(s, v, from),
00377 op_get_state(s, v, to), w, m);
00378 }
00379
00380 template <class S, class T>
00381 typename automaton_traits<T>::htransition_t
00382 op_add_series_transition(const AutomataBase<S>& s, T& v,
00383 const typename automaton_traits<T>::hstate_t& from,
00384 const typename automaton_traits<T>::hstate_t& to,
00385 const typename Element<S, T>::series_set_elt_t& l)
00386 {
00387 return op_add_transition(s, v, from, to, l.value());
00388 }
00389
00390 template <class S, class T>
00391 typename automaton_traits<T>::htransition_t
00392 op_add_series_transition(const AutomataBase<S>& s, T& v,
00393 int from,
00394 int to,
00395 const typename Element<S, T>::series_set_elt_t& l)
00396 {
00397 return op_add_series_transition(s, v, op_get_state(s, v, from),
00398 op_get_state(s, v, to), l);
00399 }
00400
00401 template <class S, class T>
00402 typename automaton_traits<T>::htransition_t
00403 op_add_spontaneous(const AutomataBase<S>& s, T& v,
00404 const typename automaton_traits<T>::hstate_t& from,
00405 const typename automaton_traits<T>::hstate_t& to,
00406 const typename Element<S, T>::semiring_elt_t& w)
00407 {
00408 AutoType(series_set_elt_t) ss(s.series());
00409 ss.assoc(algebra::identity_as<AutoType(monoid_elt_value_t)>::
00410 of(s.series().monoid()), w);
00411 return op_add_series_transition(s, v, from, to, ss);
00412 }
00413
00414 template <class S, class T>
00415 typename automaton_traits<T>::htransition_t
00416 op_add_spontaneous(const AutomataBase<S>& s, T& v,
00417 int from,
00418 int to,
00419 const typename Element<S, T>::semiring_elt_t& w)
00420 {
00421 return op_add_spontaneous(s, v, op_get_state(s, v, from),
00422 op_get_state(s, v, to), w);
00423 }
00424
00425 template <class S, class T>
00426 typename automaton_traits<T>::htransition_t
00427 op_add_letter_transition(const AutomataBase<S>& s, T& v,
00428 const typename automaton_traits<T>::hstate_t& from,
00429 const typename automaton_traits<T>::hstate_t& to,
00430 const typename Element<S, T>::letter_t& l)
00431 {
00432 return op_add_transition(s, v, from, to, l);
00433 }
00434
00435 template <class S, class T>
00436 typename automaton_traits<T>::htransition_t
00437 op_add_letter_transition(const AutomataBase<S>& s, T& v,
00438 int from,
00439 int to,
00440 const typename Element<S, T>::letter_t& l)
00441 {
00442 return op_add_letter_transition(s, v, op_get_state(s, v, from),
00443 op_get_state(s, v, to), l);
00444 }
00445
00446 template <class S, class T>
00447 void
00448 op_update(const AutomataBase<S>&, T& v,
00449 const typename automaton_traits<T>::htransition_t& e,
00450 const AutoType(label_t)& l)
00451 {
00452
00453 v.update(e, l);
00454 }
00455
00456 template <class S, class T>
00457 void
00458 op_del_state(const AutomataBase<S>&, T& v,
00459 const typename automaton_traits<T>::hstate_t& s)
00460 {
00461 v.del_state(s);
00462 }
00463
00464 template <class S, class T>
00465 void
00466 op_del_state(const AutomataBase<S>& s, T& v,
00467 int state)
00468 {
00469 op_del_state(s, v, op_get_state(s, v, state));
00470 }
00471
00472 template <class S, class T>
00473 void
00474 op_del_transition(const AutomataBase<S>&, T& v,
00475 const typename automaton_traits<T>::htransition_t& e)
00476 {
00477 v.del_edge(e);
00478 }
00479
00480 template <class S, class T>
00481 bool
00482 op_has_state(const AutomataBase<S>&, const T& v,
00483 const typename automaton_traits<T>::hstate_t& s)
00484 {
00485 return v.has_state(s);
00486 }
00487
00488 template <class S, class T>
00489 bool
00490 op_has_state(const AutomataBase<S>& s, const T& v,
00491 int state)
00492 {
00493 return op_has_state(s, v, op_get_state(s, v, state));
00494 }
00495
00496 template <class S, class T>
00497 bool
00498 op_has_transition(const AutomataBase<S>&, const T& v,
00499 const typename automaton_traits<T>::htransition_t& e)
00500 {
00501 return v.has_edge(e);
00502 }
00503
00504 template <class S, class T>
00505 typename automaton_traits<T>::hstate_t
00506 op_src_of(const AutomataBase<S>&, const T& v,
00507 const typename automaton_traits<T>::htransition_t& e)
00508 {
00509 return v.src_of(e);
00510 }
00511
00512 template <class S, class T>
00513 typename automaton_traits<T>::hstate_t
00514 op_dst_of(const AutomataBase<S>&, const T& v,
00515 const typename automaton_traits<T>::htransition_t& e)
00516 {
00517 return v.dst_of(e);
00518 }
00519
00520 template <class S, class T>
00521 typename Element<S, T>::label_t
00522 op_label_of(const AutomataBase<S>&, const T& v,
00523 const typename automaton_traits<T>::htransition_t& e)
00524 {
00525 return v.label_of(e);
00526 }
00527
00528 template <class S, class T>
00529 const typename Element<S, T>::series_set_elt_t
00530 op_series_of(const AutomataBase<S>& s, const T& v,
00531 const typename automaton_traits<T>::htransition_t& e)
00532 {
00533 return typename Element<S, T>::series_set_elt_t
00534 (s.series(),
00535 v.label_of(e));
00536 }
00537
00538 template <class S, class T>
00539 typename Element<S, T>::series_set_elt_value_t
00540 op_series_value_of(const AutomataBase<S>& s, const T& v,
00541 const typename automaton_traits<T>::htransition_t& e)
00542 {
00543 return op_series_of(s, v, e).value();
00544 }
00545
00546 template <class S, class T>
00547 typename Element<S, T>::monoid_elt_t
00548 op_word_of(const AutomataBase<S>& s, const T& v,
00549 const typename automaton_traits<T>::htransition_t& e)
00550 {
00551 return typename Element<S, T>::monoid_elt_t
00552 (s.series().monoid(),
00553 v.label_of(e));
00554 }
00555
00556 template <class S, class T>
00557 typename Element<S, T>::semiring_elt_t
00558 op_weight_of(const AutomataBase<S>& s, const T& v,
00559 const typename automaton_traits<T>::htransition_t& e)
00560 {
00561 return op_series_of(s, v, e).get(op_word_of(s, v, e));
00562 }
00563
00564 template <class S, class T>
00565 typename Element<S, T>::monoid_elt_value_t
00566 op_word_value_of(const AutomataBase<S>& s, const T& v,
00567 const typename automaton_traits<T>::htransition_t& e)
00568 {
00569 return op_word_of(s, v, e).value();
00570 }
00571
00572 template <class S, class T>
00573 typename Element<S, T>::letter_t
00574 op_letter_of(const AutomataBase<S>&, const T& v,
00575 const typename automaton_traits<T>::htransition_t& e)
00576 {
00577 return v.label_of(e);
00578 }
00579
00580 template <class S, class T>
00581 bool
00582 op_is_spontaneous(const AutomataBase<S>& s, const T& v,
00583 const typename automaton_traits<T>::htransition_t& e)
00584 {
00585 return (op_series_of(s, v, e) ==
00586 algebra::identity_as<AutoType(series_set_elt_value_t)>::of(s.series()));
00587 }
00588
00589 }
00590
00591 # undef AutoType
00592
00593 #endif // ! VCSN_AUTOMATA_CONCEPT_AUTOMATA_OPS_HXX