Vaucanson 1.4
|
00001 // automata_base.hh: this file is part of the Vaucanson project. 00002 // 00003 // Vaucanson, a generic library for finite state machines. 00004 // 00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The Vaucanson 00006 // Group. 00007 // 00008 // This program is free software; you can redistribute it and/or 00009 // modify it under the terms of the GNU General Public License 00010 // as published by the Free Software Foundation; either version 2 00011 // of the License, or (at your option) any later version. 00012 // 00013 // The complete GNU General Public Licence Notice can be found as the 00014 // `COPYING' file in the root directory. 00015 // 00016 // The Vaucanson Group consists of people listed in the `AUTHORS' file. 00017 // 00018 #ifndef VCSN_AUTOMATA_CONCEPT_AUTOMATA_BASE_HH 00019 # define VCSN_AUTOMATA_CONCEPT_AUTOMATA_BASE_HH 00020 00021 # include <iterator> 00022 # include <vaucanson/design_pattern/design_pattern.hh> 00023 # include <vaucanson/automata/concept/handlers.hh> 00024 # include <vaucanson/automata/concept/delta_kind.hh> 00025 # include <vaucanson/algebra/concept/series_base.hh> 00026 00027 namespace vcsn { 00028 00032 /*-------------------. 00033 | AutomataBase<Self> | 00034 `-------------------*/ 00036 00040 template <typename Self> 00041 struct AutomataBase 00042 : Structure<Self> 00043 { 00044 public: 00046 typedef typename virtual_types<Self>::series_set_t series_set_t; 00048 typedef typename virtual_types<Self>::kind_t kind_t; 00049 00050 protected: 00052 AutomataBase(); 00053 00055 AutomataBase(const AutomataBase& other); 00056 00057 public: 00059 const series_set_t& series() const; 00060 }; 00061 00062 // FIXME: it must be renamed to automaton_impl_traits 00063 // traits for automaton implementation. 00064 template <typename T> 00065 struct automaton_traits 00066 { 00067 typedef undefined_type label_t; 00068 typedef undefined_type series_set_elt_value_t; 00069 typedef undefined_type word_value_t; 00070 typedef undefined_type semiring_elt_value_t; 00071 typedef undefined_type letter_t; 00072 typedef undefined_type tag_t; 00073 typedef undefined_type states_t; 00074 typedef undefined_type state_iterator; 00075 typedef undefined_type transitions_t; 00076 typedef undefined_type transition_iterator; 00077 typedef undefined_type initial_iterator; 00078 typedef undefined_type initial_t; 00079 typedef undefined_type initial_support_t; 00080 typedef undefined_type final_iterator; 00081 typedef undefined_type final_t; 00082 typedef undefined_type final_support_t; 00083 typedef undefined_type geometry_t; 00084 typedef undefined_type hstate_t; 00085 typedef undefined_type htransition_t; 00086 typedef undefined_type delta_iterator; 00087 typedef undefined_type rdelta_iterator; 00088 }; 00089 00090 # define VCSN_MAKE_AUTOMATON_TRAITS(Type) \ 00091 template <typename Kind, \ 00092 typename WordValue, \ 00093 typename WeightValue, \ 00094 typename SeriesValue, \ 00095 typename Letter, \ 00096 typename Tag, \ 00097 typename GeometryCoords> \ 00098 struct automaton_traits<Type<Kind, WordValue, WeightValue, SeriesValue, \ 00099 Letter, Tag, GeometryCoords> > \ 00100 { \ 00101 typedef Type<Kind, WordValue, WeightValue, SeriesValue, \ 00102 Letter, Tag, GeometryCoords> graph_t; \ 00103 typedef typename graph_t::semiring_elt_value_t semiring_elt_value_t; \ 00104 typedef typename graph_t::monoid_elt_value_t monoid_elt_value_t; \ 00105 typedef typename graph_t::word_value_t word_value_t; \ 00106 typedef typename graph_t::series_set_elt_value_t series_set_elt_value_t; \ 00107 typedef typename graph_t::letter_t letter_t; \ 00108 typedef typename graph_t::tag_t tag_t; \ 00109 typedef typename graph_t::geometry_t geometry_t; \ 00110 typedef typename graph_t::label_t label_t; \ 00111 typedef typename graph_t::states_t states_t; \ 00112 typedef typename states_t::iterator state_iterator; \ 00113 typedef typename graph_t::hstate_t hstate_t; \ 00114 typedef typename graph_t::edges_t transitions_t; \ 00115 typedef typename transitions_t::iterator transition_iterator; \ 00116 typedef typename graph_t::htransition_t htransition_t; \ 00117 typedef typename graph_t::initial_t initial_t; \ 00118 typedef typename graph_t::initial_support_t initial_support_t; \ 00119 typedef typename initial_support_t::iterator initial_iterator; \ 00120 typedef typename graph_t::final_t final_t; \ 00121 typedef typename graph_t::final_support_t final_support_t; \ 00122 typedef typename final_support_t::iterator final_iterator; \ 00123 typedef typename graph_t::delta_iterator delta_iterator; \ 00124 typedef typename graph_t::rdelta_iterator rdelta_iterator; \ 00125 } 00126 00127 // traits for generalized automaton implementation. 00128 template <typename Auto> 00129 struct generalized_traits 00130 { 00131 typedef undefined_type automaton_t; 00132 }; 00133 00134 # define VCSN_MAKE_GENERALIZED_AUTOMATON_TRAITS(Type) \ 00135 template <typename Struct, \ 00136 typename Kind, \ 00137 typename WordValue, \ 00138 typename WeightValue, \ 00139 typename SeriesValue, \ 00140 typename Letter, \ 00141 typename Tag, \ 00142 typename GeometryCoords> \ 00143 struct generalized_traits<Element<Struct, Type<Kind, WordValue, \ 00144 WeightValue, SeriesValue, Letter, \ 00145 Tag, GeometryCoords> > > \ 00146 { \ 00147 typedef Element<Struct, Type<Kind, WordValue, WeightValue, SeriesValue, \ 00148 Letter, Tag, GeometryCoords> > Auto_; \ 00149 typedef typename Auto_::series_set_t series_set_t; \ 00150 typedef typename Auto_::kind_t kind_t; \ 00151 typedef typename series_set_t::monoid_t monoid_t; \ 00152 typedef typename Auto_::series_set_elt_t series_set_elt_t; \ 00153 typedef typename series_set_elt_t::monoid_elt_t monoid_elt_t; \ 00154 typedef typename monoid_elt_t::value_t monoid_elt_value_t; \ 00155 typedef typename series_set_elt_t::semiring_elt_t semiring_elt_t; \ 00156 typedef typename semiring_elt_t::value_t semiring_elt_value_t; \ 00157 typedef typename Auto_::value_t::geometry_t geometry_t; \ 00158 typedef vcsn::Element<vcsn::Automata<series_set_t, Kind>, \ 00159 Type<labels_are_series, \ 00160 monoid_elt_value_t, \ 00161 semiring_elt_value_t, \ 00162 rat::exp<monoid_elt_value_t, semiring_elt_value_t>, \ 00163 typename monoid_t::letter_t, \ 00164 NoTag, \ 00165 typename geometry_t::coords_t> \ 00166 > automaton_t; \ 00167 typedef typename automaton_t::hstate_t hstate_t; \ 00168 typedef typename automaton_t::htransition_t htransition_t; \ 00169 } 00170 00171 // traits to construct an automaton type from a rational expression type, 00172 // with a given structural type. 00173 // (the automaton type must be able to hold the value returned by 00174 // standard_of) 00175 // FIXME: there is no rat exp concept, so we put the code here. (maybe it 00176 // should be put here anyway) 00177 template <typename Struct, typename Ratexp> 00178 struct standard_of_traits 00179 { 00180 typedef undefined_type automaton_t; 00181 }; 00182 00183 # define VCSN_MAKE_STANDARD_OF_TRAITS(Type) \ 00184 template <typename W, \ 00185 typename M, \ 00186 typename Tm, \ 00187 typename Tw> \ 00188 struct standard_of_traits<algebra::Series<W, M>, rat::exp<Tm, Tw> > \ 00189 { \ 00190 typedef typename algebra::Series<W, M> series_set_t; \ 00191 typedef typename algebra::polynom<Tm, Tw> \ 00192 series_set_elt_value_t; \ 00193 typedef typename M::letter_t letter_t; \ 00194 typedef typename Type<labels_are_series, Tm, Tw, \ 00195 series_set_elt_value_t, letter_t, \ 00196 NoTag, std::pair<double, double> > \ 00197 automaton_impl_t; \ 00198 typedef Element<Automata<series_set_t, labels_are_series>, automaton_impl_t> \ 00199 automaton_t; \ 00200 } 00201 00202 // Traits to construct misc projections from a structural type and 00203 // an implementation. 00204 template <typename S, typename T> 00205 struct projection_traits 00206 { 00208 typedef undefined_type first_projection_t; 00209 00211 typedef undefined_type second_projection_t; 00212 }; 00213 00214 // Traits to mute an existing graph implementation into a projection 00215 // implementation with TT. 00216 // FIXME: rename to mute_graph_impl_projection_traits 00217 template <typename T, typename TT> 00218 struct mute_graph_impl_traits 00219 { 00221 typedef undefined_type first_projection_t; 00222 00224 typedef undefined_type second_projection_t; 00225 }; 00226 00227 # define VCSN_MAKE_MUTE_GRAPH_IMPL_TRAITS(Type) \ 00228 template <typename Kind, \ 00229 typename WordValue, \ 00230 typename WeightValue, \ 00231 typename SeriesValue, \ 00232 typename Letter, \ 00233 typename Tag, \ 00234 typename GeometryCoords, \ 00235 typename TT> \ 00236 struct mute_graph_impl_traits<Type<Kind, \ 00237 WordValue, \ 00238 WeightValue, \ 00239 SeriesValue, \ 00240 Letter, \ 00241 Tag, \ 00242 GeometryCoords>, TT> \ 00243 { \ 00244 typedef Type<Kind, WordValue, WeightValue, SeriesValue, \ 00245 Letter, Tag, GeometryCoords> graph_t; \ 00246 typedef typename algebra::letter_traits<Letter>:: \ 00247 first_projection_t first_letter_t; \ 00248 typedef typename algebra::letter_traits<Letter>:: \ 00249 second_projection_t second_letter_t; \ 00250 typedef typename TT::first_projection_t::value_t \ 00251 first_monoid_elt_value_t; \ 00252 typedef typename TT::second_projection_t::value_t \ 00253 second_monoid_elt_value_t; \ 00254 typedef typename algebra::mute_series_impl<SeriesValue, WeightValue, \ 00255 first_monoid_elt_value_t>::ret \ 00256 first_series_impl_t; \ 00257 typedef typename algebra::mute_series_impl<SeriesValue, WeightValue, \ 00258 second_monoid_elt_value_t>::ret \ 00259 second_series_impl_t; \ 00260 typedef Type<Kind, first_monoid_elt_value_t, \ 00261 WeightValue, first_series_impl_t, \ 00262 first_letter_t, Tag, GeometryCoords> first_projection_t; \ 00263 typedef Type<Kind, second_monoid_elt_value_t, \ 00264 WeightValue, second_series_impl_t, \ 00265 second_letter_t, Tag, GeometryCoords> second_projection_t; \ 00266 } 00267 00268 // Traits to mute an existing graph implementation into another 00269 // graph implementation with a different word implementation and letter 00270 // implementation. 00271 template <typename G, typename W, typename L> 00272 struct mute_graph_impl_monoid_traits 00273 { 00275 typedef undefined_type ret; 00276 }; 00277 00278 # define VCSN_MAKE_MUTE_GRAPH_IMPL_MONOID_TRAITS(Type) \ 00279 template <typename Kind, \ 00280 typename WordValue, \ 00281 typename WeightValue, \ 00282 typename SeriesValue, \ 00283 typename Letter, \ 00284 typename Tag, \ 00285 typename GeometryCoords, \ 00286 typename W, \ 00287 typename L> \ 00288 struct mute_graph_impl_monoid_traits<Type<Kind, \ 00289 WordValue, \ 00290 WeightValue, \ 00291 SeriesValue, \ 00292 Letter, \ 00293 Tag, \ 00294 GeometryCoords>, W, L> \ 00295 { \ 00296 typedef Type<Kind, WordValue, WeightValue, SeriesValue, \ 00297 Letter, Tag, GeometryCoords> graph_t; \ 00298 typedef typename algebra::mute_series_impl<SeriesValue, WeightValue, \ 00299 W>::ret \ 00300 series_impl_t; \ 00301 typedef Type<Kind, W, \ 00302 WeightValue, series_impl_t, \ 00303 L, Tag, GeometryCoords> ret; \ 00304 } 00305 00306 /*-----------------------------------. 00307 | virtual_types<AutomataBase<Self> > | 00308 `-----------------------------------*/ 00309 00310 template <class S> 00311 struct virtual_types<AutomataBase<S> > 00312 : virtual_types<Structure<S> > 00313 { }; 00314 00315 /*------------------------------------. 00316 | dynamic_traits<AutomataBase<Self> > | 00317 `------------------------------------*/ 00318 template <class S> 00319 struct dynamic_traits<AutomataBase<S> > 00320 : dynamic_traits<Structure<S> > 00321 { }; 00322 00323 /*-----------------------------------. 00324 | MetaElement<AutomataBase<Self>, T> | 00325 `-----------------------------------*/ 00327 00340 // FIXME: Use some of the TYPEDEF_IMPORT macros. 00341 template <typename Self, typename T> 00342 struct MetaElement<AutomataBase<Self>, T> 00343 : MetaElement<Structure<Self>, T> 00344 { 00346 typedef MetaElement<AutomataBase<Self>, T> self_t; 00347 00349 typedef typename AutomataBase<Self>::series_set_t series_set_t; 00350 00352 typedef typename AutomataBase<Self>::kind_t kind_t; 00353 00355 typedef typename automaton_traits<T>::series_set_elt_value_t 00356 series_set_elt_value_t; 00357 00359 typedef Element<series_set_t, series_set_elt_value_t> series_set_elt_t; 00360 00362 typedef typename series_set_t::monoid_t monoid_t; 00363 00365 typedef typename series_set_elt_t::monoid_elt_t monoid_elt_t; 00366 00368 typedef typename monoid_elt_t::value_t monoid_elt_value_t; 00369 00371 typedef typename monoid_t::letter_t letter_t; 00372 00374 typedef typename series_set_t::semiring_t semiring_t; 00375 00377 typedef typename series_set_elt_t::semiring_elt_t semiring_elt_t; 00378 00380 typedef typename series_set_elt_t::semiring_elt_value_t 00381 semiring_elt_value_t; 00382 00384 typedef typename automaton_traits<T>::tag_t tag_t; 00385 00387 typedef typename automaton_traits<T>::label_t label_t; 00388 00390 typedef typename automaton_traits<T>::states_t states_t; 00391 00393 typedef typename automaton_traits<T>::state_iterator state_iterator; 00394 00396 typedef typename automaton_traits<T>::transitions_t transitions_t; 00397 00399 typedef typename automaton_traits<T>::transition_iterator transition_iterator; 00400 00402 typedef typename automaton_traits<T>::initial_support_t initial_support_t; 00403 00405 typedef typename automaton_traits<T>::initial_iterator initial_iterator; 00406 00408 typedef typename automaton_traits<T>::final_support_t final_support_t; 00409 00411 typedef typename automaton_traits<T>::final_iterator final_iterator; 00412 00414 typedef typename automaton_traits<T>::geometry_t geometry_t; 00415 00417 typedef typename automaton_traits<T>::geometry_t::coords_t geometry_coords_t; 00418 00420 typedef typename automaton_traits<T>::hstate_t hstate_t; 00421 typedef typename automaton_traits<T>::htransition_t htransition_t; 00422 00424 typedef typename automaton_traits<T>::delta_iterator delta_iterator; 00425 typedef typename automaton_traits<T>::rdelta_iterator rdelta_iterator; 00426 00428 const series_set_t& series() const; 00429 00431 tag_t& tag(); 00432 00434 const tag_t& tag() const; 00435 00437 geometry_t& geometry(); 00438 00440 const geometry_t& geometry() const; 00441 00443 bool exists() const; 00444 00447 00449 states_t states() const; 00450 00452 transitions_t transitions() const; 00453 00455 initial_support_t initial() const; 00456 00458 final_support_t final() const; 00459 00461 bool is_initial(const hstate_t& state) const; 00462 bool is_initial(unsigned state) const; 00463 00465 bool is_final(const hstate_t& state) const; 00466 bool is_final(unsigned state) const; 00467 00469 void set_initial(const hstate_t& state); 00470 void set_initial(unsigned state); 00471 00473 void set_initial(const hstate_t& state, const series_set_elt_t& m); 00474 void set_initial(unsigned state, const series_set_elt_t& m); 00475 00477 void set_final(const hstate_t& state); 00478 void set_final(unsigned state); 00479 00481 void set_final(const hstate_t& state, const series_set_elt_t& m); 00482 void set_final(unsigned state, const series_set_elt_t& m); 00483 00485 void unset_initial(const hstate_t& state); 00486 void unset_initial(unsigned state); 00487 00489 void unset_final(const hstate_t& state); 00490 void unset_final(unsigned state); 00491 00493 void clear_initial(); 00494 00496 void clear_final(); 00497 00499 Element<series_set_t, series_set_elt_value_t> 00500 get_initial(const hstate_t& state) const; 00501 Element<series_set_t, series_set_elt_value_t> 00502 get_initial(unsigned state) const; 00503 00505 Element<series_set_t, series_set_elt_value_t> 00506 get_final(const hstate_t& state) const; 00507 Element<series_set_t, series_set_elt_value_t> 00508 get_final(unsigned state) const; 00509 00511 hstate_t add_state(); 00512 00514 hstate_t get_state(unsigned state) const; 00515 00518 hstate_t choose_state() const; 00519 00521 htransition_t add_transition(const hstate_t& src, const hstate_t& dst, 00522 const label_t& label); 00523 htransition_t add_transition(unsigned src, unsigned dst, 00524 const label_t& label); 00525 00528 htransition_t add_weighted_transition(const hstate_t& src, const hstate_t& dst, 00529 const semiring_elt_t& w, 00530 const monoid_elt_value_t& m); 00531 htransition_t add_weighted_transition(unsigned src, unsigned dst, 00532 const semiring_elt_t& w, 00533 const monoid_elt_value_t& m); 00534 00536 00539 htransition_t add_series_transition(const hstate_t& src, const hstate_t& dst, 00540 const series_set_elt_t& e); 00541 htransition_t add_series_transition(unsigned src, unsigned dst, 00542 const series_set_elt_t& e); 00543 00545 htransition_t add_spontaneous(const hstate_t& src, const hstate_t& dst, 00546 const semiring_elt_t& w); 00547 00548 htransition_t add_spontaneous(const hstate_t& src, const hstate_t& dst); 00549 00550 htransition_t add_spontaneous(unsigned src, unsigned dst, 00551 const semiring_elt_t& w); 00552 00553 htransition_t add_spontaneous(unsigned src, unsigned dst); 00554 00556 htransition_t add_letter_transition(const hstate_t& src, const hstate_t& dst, 00557 const letter_t& l); 00558 htransition_t add_letter_transition(unsigned src, unsigned dst, 00559 const letter_t& l); 00560 00563 htransition_t add_letter_transition(const hstate_t& src, const hstate_t& dst, 00564 const std::string& l); 00565 htransition_t add_letter_transition(unsigned src, unsigned dst, 00566 const std::string& l); 00567 00569 void update(const htransition_t& e, const label_t& l); 00570 00572 void del_state(const hstate_t& state); 00573 void del_state(unsigned state); 00574 00576 void del_transition(const htransition_t& e); 00577 00579 bool has_state(const hstate_t& state) const; 00580 bool has_state(unsigned state) const; 00581 00583 bool has_transition(const htransition_t& e) const; 00584 00586 hstate_t src_of(const htransition_t& e) const; 00587 00589 hstate_t dst_of(const htransition_t& e) const; 00590 00592 typename automaton_traits<T>::label_t label_of(const htransition_t& e) const; 00593 00595 series_set_elt_t series_of(const htransition_t& e) const; 00596 00598 series_set_elt_value_t series_value_of(const htransition_t& e) const; 00599 00601 bool is_spontaneous(const htransition_t& e) const; 00602 00604 monoid_elt_t word_of(const htransition_t& e) const; 00605 00607 semiring_elt_t weight_of(const htransition_t& e) const; 00608 00610 monoid_elt_value_t word_value_of(const htransition_t& e) const; 00611 00613 00616 letter_t letter_of(const htransition_t& e) const; 00617 00618 00619 protected: 00620 MetaElement(); 00621 MetaElement(const MetaElement& other); 00622 }; 00623 00626 00627 template <typename S, typename St, typename T> 00628 St& op_rout(const AutomataBase<S>& s, St& st, const T& r); 00629 00630 template <typename Auto_> 00631 typename generalized_traits<Auto_>::automaton_t 00632 generalized(const Auto_& from); 00633 } // vcsn 00634 00635 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB 00636 # include <vaucanson/automata/concept/automata_base.hxx> 00637 # endif // VCSN_USE_INTERFACE_ONLY 00638 00639 #endif // ! VCSN_AUTOMATA_CONCEPT_AUTOMATA_BASE_HH