Vaucanson 1.4
listg_graph_impl.hh
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