Vaucanson 1.4
|
00001 // listg_graph_impl.hh: this file is part of the Vaucanson project. 00002 // 00003 // Vaucanson, a generic library for finite state machines. 00004 // 00005 // Copyright (C) 2005, 2006, 2007, 2008 The Vaucanson Group. 00006 // 00007 // This program is free software; you can redistribute it and/or 00008 // modify it under the terms of the GNU General Public License 00009 // as published by the Free Software Foundation; either version 2 00010 // of the License, or (at your option) any later version. 00011 // 00012 // The complete GNU General Public Licence Notice can be found as the 00013 // `COPYING' file in the root directory. 00014 // 00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file. 00016 // 00017 #ifndef VCSN_AUTOMATA_IMPLEMENTATION_LISTG_GRAPH_IMPL_HH 00018 # define VCSN_AUTOMATA_IMPLEMENTATION_LISTG_GRAPH_IMPL_HH 00019 00020 # include <set> 00021 # include <map> 00022 # include <vector> 00023 00024 # include <vaucanson/misc/static.hh> 00025 # include <vaucanson/misc/usual_macros.hh> 00026 00027 # include <vaucanson/misc/support.hh> 00028 # include <vaucanson/algebra/implementation/series/rat/exp.hh> 00029 # include <vaucanson/automata/concept/automata_base.hh> 00030 # include <vaucanson/automata/concept/automata.hh> 00031 # include <vaucanson/automata/concept/transducer_base.hh> 00032 # include <vaucanson/automata/concept/automata_kind.hh> 00033 # include <vaucanson/automata/concept/tags.hh> 00034 # include <vaucanson/automata/implementation/kind_adapter.hh> 00035 # include <vaucanson/automata/implementation/geometry.hh> 00036 # include <vaucanson/automata/implementation/listg/iterator.hh> 00037 # include <vaucanson/automata/implementation/listg/listg_handlers.hh> 00038 # include <vaucanson/automata/implementation/listg/listg_sparse_interval.hh> 00039 00040 namespace vcsn 00041 { 00042 namespace listg 00043 { 00045 template <class K, class WordValue, class WeightValue, 00046 class SeriesValue, class Letter, class Tag, class GeometryCoords> 00047 class Graph 00048 { 00050 public: 00051 typedef Graph<K, WordValue, WeightValue, SeriesValue, 00052 Letter, Tag, GeometryCoords> self_t; 00053 00054 typedef WeightValue semiring_elt_value_t; 00055 typedef WordValue monoid_elt_value_t; 00056 typedef WordValue word_value_t; 00057 typedef SeriesValue series_set_elt_value_t; 00058 typedef Letter letter_t; 00059 typedef Tag tag_t; 00060 00062 typedef typename LabelOf<K, WordValue, WeightValue, SeriesValue, Letter> 00063 ::ret label_t; 00064 typedef unsigned hstate_value_t; 00065 typedef unsigned hedge_value_t; 00066 typedef handler<state_h, hstate_value_t> hstate_t; 00067 typedef handler<transition_h, hedge_value_t> htransition_t; 00068 typedef htransition_t hedge_t; 00069 00071 template<typename EdgeLabel> 00072 struct edge_value 00073 { 00074 inline edge_value(const hstate_t& h1, const hstate_t& h2, 00075 const EdgeLabel& l = EdgeLabel()) 00076 : label(l), 00077 from(h1), 00078 to(h2) 00079 {} 00080 00081 inline operator const EdgeLabel& () const 00082 { return label; } 00083 00084 inline operator EdgeLabel& () 00085 { return label; } 00086 00087 EdgeLabel label; 00088 hstate_t from; 00089 hstate_t to; 00090 }; 00091 00093 struct state_value 00094 { 00095 typedef std::set<hedge_t> edges_t; 00096 inline state_value() {} 00097 00098 edges_t output_edges; 00099 edges_t input_edges; 00100 }; 00101 00104 typedef misc::SparseInterval<hstate_t, std::set<hstate_t> > 00105 StateContainer; 00106 typedef misc::SparseInterval<hedge_t, std::set<hedge_t> > 00107 EdgeContainer; 00108 00109 typedef state_value state_value_t; 00110 typedef edge_value<label_t> edge_value_t; 00111 00112 typedef std::vector<state_value_t> state_data_t; 00113 typedef std::vector<edge_value_t> edge_data_t; 00114 00115 typedef StateContainer states_t; 00116 typedef EdgeContainer edges_t; 00117 00118 typedef std::map<hstate_t, series_set_elt_value_t> 00119 initial_t; 00120 typedef std::map<hstate_t, series_set_elt_value_t> 00121 final_t; 00122 00123 typedef misc::Support<initial_t> initial_support_t; 00124 typedef misc::Support<final_t> final_support_t; 00125 00126 typedef ::vcsn::listg::DeltaConstIterator<self_t, ::vcsn::listg::forward_iterator> 00127 delta_iterator; 00128 00129 typedef ::vcsn::listg::DeltaConstIterator<self_t, ::vcsn::listg::backward_iterator> 00130 rdelta_iterator; 00131 // we guarantee that the handlers of state are indexed from 0 to 00132 // initial_number_of_state - 1 when using this constructor. 00133 Graph(); 00134 Graph(unsigned initial_number_of_state, 00135 unsigned number_of_edge_initially_allocated); 00136 00138 states_t states() const; 00139 00141 edges_t edges() const; 00142 00144 initial_support_t initial() const; 00145 final_support_t final() const; 00146 00149 hstate_t get_state(int n) const; 00150 bool has_state(const hstate_t& n) const; 00151 hstate_t add_state(); 00152 00156 void del_state(const hstate_t& n); 00157 00173 void set_initial(const hstate_t& s, 00174 const series_set_elt_value_t& v, 00175 const series_set_elt_value_t& z); 00176 const series_set_elt_value_t& 00177 get_initial(const hstate_t&, 00178 const series_set_elt_value_t&) const; 00179 bool is_initial(const hstate_t& s, 00180 const series_set_elt_value_t&) const; 00181 00182 void clear_initial(); 00183 00190 void set_final(const hstate_t&, 00191 const series_set_elt_value_t&, 00192 const series_set_elt_value_t&); 00193 const series_set_elt_value_t& 00194 get_final(const hstate_t&, 00195 const series_set_elt_value_t&) const; 00196 bool is_final(const hstate_t& s, 00197 const series_set_elt_value_t&) const; 00198 00199 void clear_final(); 00205 bool has_edge(const hedge_t& n) const; 00206 00207 hedge_t add_edge(const hstate_t& h1, 00208 const hstate_t& h2, 00209 const label_t& v); 00210 void del_edge(const hedge_t& e); 00211 00212 hstate_t src_of(const hedge_t& e1) const; 00213 hstate_t dst_of(const hedge_t& e2) const; 00214 00215 const label_t& label_of(const hedge_t& n) const; 00216 void update(const hedge_t&, label_t); 00221 template <class S> 00222 bool exists(const AutomataBase<S>& s) const; 00223 00226 00227 self_t& clone() const; 00228 00231 tag_t& tag(); 00232 const tag_t& tag() const; 00237 typedef vcsn::geometry<hstate_t, hedge_t, GeometryCoords> 00238 geometry_t; 00239 geometry_t& geometry(); 00240 const geometry_t& geometry() const; 00243 geometry_t geometry_; 00244 00245 public: 00246 state_data_t states_; 00247 edge_data_t edges_; 00248 std::set<hstate_t> removed_states_; 00249 std::set<hedge_t> removed_edges_; 00250 tag_t tag_; 00251 final_t final_; 00252 initial_t initial_; 00253 }; 00254 00255 00256 # define TParam \ 00257 template <class S, class WordValue, class WeightValue, class SeriesValue, \ 00258 class Letter, class Tag, class GeometryCoords> 00259 # define GRAPH \ 00260 Graph<Kind, WordValue, WeightValue, SerieValue, \ 00261 Letter, Tag, GeometryCoords> 00262 00263 00264 00265 TParam 00266 ADAPT_ADD_LETTER_TRANSITION_TO_SERIES_LABEL(Graph<labels_are_series, 00267 WordValue, WeightValue, 00268 SeriesValue, Letter, Tag, 00269 GeometryCoords>); 00270 00271 TParam 00272 ADAPT_LETTER_OF_TO_SERIES_LABEL(Graph<labels_are_series, 00273 WordValue, WeightValue, 00274 SeriesValue, Letter, Tag, 00275 GeometryCoords>); 00276 00277 TParam 00278 ADAPT_WORD_OF_TO_SERIES_LABEL(Graph<labels_are_series, 00279 WordValue, WeightValue, 00280 SeriesValue, Letter, Tag, 00281 GeometryCoords>); 00282 00283 TParam 00284 ADAPT_WORD_OF_TO_LETTERS_LABEL(Graph<labels_are_letters, 00285 WordValue, WeightValue, 00286 SeriesValue, Letter, Tag, 00287 GeometryCoords>); 00288 00289 TParam 00290 ADAPT_SERIE_OF_TO_LETTERS_LABEL(Graph<labels_are_letters, 00291 WordValue, WeightValue, 00292 SeriesValue, Letter, Tag, 00293 GeometryCoords>); 00294 00295 TParam 00296 ADAPT_ADD_SERIE_TRANSITION_TO_LETTERS_LABEL(Graph<labels_are_letters, 00297 WordValue, WeightValue, 00298 SeriesValue, Letter, Tag, 00299 GeometryCoords>); 00300 00301 template <class Kind, class WordValue, class WeightValue, class SerieValue, 00302 class Letter, class Tag, class GeometryCoords, class I> 00303 Tag& op_tag(const AutomataBase<I>&, 00304 Graph<Kind, WordValue, WeightValue, 00305 SerieValue, Letter, Tag, 00306 GeometryCoords>&); 00307 00308 template <class Kind, class WordValue, class WeightValue, class SerieValue, 00309 class Letter, class Tag, class GeometryCoords, class I> 00310 const Tag& op_tag(const AutomataBase<I>&, 00311 const Graph<Kind, WordValue, WeightValue, 00312 SerieValue, Letter, Tag, GeometryCoords>&); 00313 00314 template <class Kind, class WordValue, class WeightValue, class SerieValue, 00315 class Letter, class Tag, class GeometryCoords, class I> 00316 typename GRAPH::geometry_t& 00317 op_geometry(const AutomataBase<I>&, 00318 Graph<Kind, WordValue, WeightValue, 00319 SerieValue, Letter, Tag, GeometryCoords>&); 00320 00321 template <class Kind, class WordValue, class WeightValue, class SerieValue, 00322 class Letter, class Tag, class GeometryCoords, class I> 00323 const typename GRAPH::geometry_t& 00324 op_geometry(const AutomataBase<I>&, 00325 const Graph<Kind, WordValue, 00326 WeightValue, SerieValue, Letter, Tag, 00327 GeometryCoords>&); 00328 # undef TParam 00329 # undef GRAPH 00330 00331 } // End of namespace listg 00332 00333 00334 // This implementation can be used as an implementation of automaton. 00335 VCSN_MAKE_AUTOMATON_TRAITS(listg::Graph); 00336 VCSN_MAKE_GENERALIZED_AUTOMATON_TRAITS(listg::Graph); 00337 VCSN_MAKE_MUTE_GRAPH_IMPL_TRAITS(listg::Graph); 00338 VCSN_MAKE_MUTE_GRAPH_IMPL_MONOID_TRAITS(listg::Graph); 00339 00340 // This implementation can be used as a transducer one. 00341 template <class Kind, 00342 class WordValue, 00343 class WeightValue, 00344 class SeriesValue, 00345 class Letter, 00346 class Tag, 00347 class GeometryCoords> 00348 struct transducer_traits<listg::Graph<Kind, 00349 WordValue, 00350 WeightValue, 00351 SeriesValue, 00352 Letter, 00353 Tag, 00354 GeometryCoords> > 00355 { 00356 typedef WordValue input_monoid_elt_value_t; 00357 typedef typename algebra::series_traits<WeightValue>::monoid_elt_value_t 00358 output_monoid_elt_value_t; 00359 typedef typename algebra::series_traits<WeightValue>::semiring_elt_value_t 00360 output_semiring_elt_value_t; 00361 }; 00362 00363 // Explain how to project type of transducer into input automaton type. 00364 template <class Kind, 00365 class WordValue, 00366 class WeightValue, 00367 class SeriesValue, 00368 class Letter, 00369 class Tag, 00370 class GeometryCoords> 00371 struct input_projection_traits<listg::Graph<Kind, 00372 WordValue, 00373 WeightValue, 00374 SeriesValue, 00375 Letter, 00376 Tag, 00377 GeometryCoords> > 00378 { 00379 typedef listg::Graph<Kind, WordValue, WeightValue, SeriesValue, 00380 Letter, Tag, GeometryCoords> 00381 self_t; 00382 typedef typename transducer_traits<self_t>::output_semiring_elt_value_t 00383 semiring_elt_value_t; 00384 typedef typename transducer_traits<self_t>::input_monoid_elt_value_t 00385 monoid_elt_value_t; 00386 typedef typename algebra::mute_series_impl<SeriesValue, 00387 semiring_elt_value_t, 00388 monoid_elt_value_t>::ret 00389 series_set_elt_value_t; 00390 00391 typedef 00392 listg::Graph<Kind, 00393 monoid_elt_value_t, 00394 semiring_elt_value_t, 00395 series_set_elt_value_t, 00396 Letter, 00397 Tag, 00398 GeometryCoords> 00399 ret; 00400 }; 00401 00402 // Input projection for FMP transducers. 00403 template <class Kind, 00404 class WordValue, 00405 class WeightValue, 00406 class SeriesValue, 00407 class Letter, 00408 class Tag, 00409 class GeometryCoords> 00410 struct fmp_input_projection_traits<listg::Graph<Kind, 00411 WordValue, 00412 WeightValue, 00413 SeriesValue, 00414 Letter, 00415 Tag, 00416 GeometryCoords> > 00417 { 00418 typedef listg::Graph<Kind, WordValue, WeightValue, SeriesValue, 00419 Letter, Tag, GeometryCoords> 00420 self_t; 00421 00422 typedef typename automaton_traits<self_t>::semiring_elt_value_t 00423 semiring_elt_value_t; 00424 00425 typedef typename WordValue::first_type monoid_elt_value_t; 00426 typedef typename monoid_elt_value_t::value_type letter_t; 00427 00428 typedef typename algebra::mute_series_impl<SeriesValue, 00429 semiring_elt_value_t, 00430 monoid_elt_value_t>::ret 00431 series_set_elt_value_t; 00432 00433 typedef 00434 listg::Graph<Kind, 00435 monoid_elt_value_t, 00436 semiring_elt_value_t, 00437 series_set_elt_value_t, 00438 letter_t, 00439 Tag, 00440 GeometryCoords> 00441 ret; 00442 }; 00443 00444 template <class Kind, 00445 class WordValue, 00446 class WeightValue, 00447 class SeriesValue, 00448 class Letter, 00449 class Tag, 00450 class GeometryCoords> 00451 struct output_projection_traits<listg::Graph<Kind, 00452 WordValue, 00453 WeightValue, 00454 SeriesValue, 00455 Letter, 00456 Tag, GeometryCoords> > 00457 { 00458 typedef listg::Graph<Kind, WordValue, WeightValue, SeriesValue, 00459 Letter, Tag, GeometryCoords> 00460 self_t; 00461 00462 typedef typename automaton_traits<self_t>::semiring_elt_value_t 00463 series_set_elt_value_t; 00464 00465 typedef typename 00466 algebra::series_traits<series_set_elt_value_t>::monoid_elt_value_t 00467 monoid_elt_value_t; 00468 00469 typedef typename 00470 algebra::series_traits<series_set_elt_value_t>::semiring_elt_value_t 00471 semiring_elt_value_t; 00472 00473 typedef 00474 listg::Graph<Kind, 00475 monoid_elt_value_t, 00476 semiring_elt_value_t, 00477 series_set_elt_value_t, 00478 Letter, 00479 Tag, 00480 GeometryCoords> 00481 ret; 00482 }; 00483 00484 // Output projection for FMP transducers. 00485 template <class Kind, 00486 class WordValue, 00487 class WeightValue, 00488 class SeriesValue, 00489 class Letter, 00490 class Tag, 00491 class GeometryCoords> 00492 struct fmp_output_projection_traits<listg::Graph<Kind, 00493 WordValue, 00494 WeightValue, 00495 SeriesValue, 00496 Letter, 00497 Tag, 00498 GeometryCoords> > 00499 { 00500 typedef listg::Graph<Kind, WordValue, WeightValue, SeriesValue, 00501 Letter, Tag, GeometryCoords> 00502 self_t; 00503 00504 typedef typename WordValue::second_type monoid_elt_value_t; 00505 typedef typename monoid_elt_value_t::value_type letter_t; 00506 00507 typedef typename automaton_traits<self_t>::semiring_elt_value_t 00508 semiring_elt_value_t; 00509 00510 typedef typename algebra::mute_series_impl<SeriesValue, 00511 semiring_elt_value_t, 00512 monoid_elt_value_t>::ret series_set_elt_value_t; 00513 00514 typedef 00515 listg::Graph<Kind, 00516 monoid_elt_value_t, 00517 semiring_elt_value_t, 00518 series_set_elt_value_t, 00519 letter_t, 00520 Tag, 00521 GeometryCoords> 00522 ret; 00523 }; 00524 00525 // Explain how to extend an input automaton into a transducer. 00526 template <class Kind, 00527 class WordValue, 00528 class WeightValue, 00529 class SeriesValue, 00530 class Letter, 00531 class Tag, 00532 class GeometryCoords> 00533 struct extension_traits<listg::Graph<Kind, 00534 WordValue, 00535 WeightValue, 00536 SeriesValue, 00537 Letter, 00538 Tag, 00539 GeometryCoords> > 00540 { 00541 typedef listg::Graph<Kind, WordValue, WeightValue, 00542 SeriesValue, Letter, Tag, GeometryCoords> 00543 self_t; 00544 typedef typename automaton_traits<self_t>::monoid_elt_value_t 00545 monoid_elt_value_t; 00546 typedef typename algebra::mute_series_impl<SeriesValue, 00547 SeriesValue, 00548 monoid_elt_value_t>::ret 00549 series_set_elt_value_t; 00550 00551 typedef 00552 listg::Graph<Kind, 00553 monoid_elt_value_t, 00554 SeriesValue, 00555 series_set_elt_value_t, 00556 Letter, 00557 Tag, 00558 GeometryCoords> 00559 ret; 00560 }; 00561 } // Enf of namespace vcsn 00562 00563 00564 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB 00565 # include <vaucanson/automata/implementation/listg_graph_impl.hxx> 00566 # endif // VCSN_USE_INTERFACE_ONLY 00567 00568 #endif // ! VCSN_AUTOMATA_IMPLEMENTATION_LISTG_GRAPH_IMPL_HH