00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_AUTOMATA_IMPLEMENTATION_BMIG_GRAPH_IMPL_HH_
00019 # define VCSN_AUTOMATA_IMPLEMENTATION_BMIG_GRAPH_IMPL_HH_
00020 # include <boost/dynamic_bitset.hpp>
00021 # include <boost/shared_ptr.hpp>
00022
00023 # include <vaucanson/algebra/implementation/series/rat/exp.hh>
00024 # include <vaucanson/automata/implementation/bmig/vgraph_container.hh>
00025 # include <vaucanson/automata/implementation/bmig/bmig_handlers.hh>
00026 # include <vaucanson/automata/implementation/bmig/iterator.hh>
00027 # include <vaucanson/automata/concept/automata_base.hh>
00028 # include <vaucanson/automata/concept/automata.hh>
00029 # include <vaucanson/automata/concept/automata_kind.hh>
00030 # include <vaucanson/automata/implementation/bmig/bmig_support.hh>
00031 # include <vaucanson/automata/concept/transducer_base.hh>
00032 # include <vaucanson/automata/concept/smart_label.hh>
00033 # include <vaucanson/automata/implementation/kind_adapter.hh>
00034 # include <vaucanson/automata/implementation/geometry.hh>
00035 # include <vaucanson/automata/concept/tags.hh>
00036 # include <vaucanson/misc/hash.hh>
00037 # include <vaucanson/automata/implementation/bmig/initial_value.hh>
00038 # include <vaucanson/automata/implementation/bmig/graphcontainer.hh>
00039 # include <vaucanson/automata/implementation/bmig/edge_value.hh>
00040 # include <vaucanson/automata/implementation/bmig/bmig_functors.hh>
00041 # include <vaucanson/automata/implementation/bmig/initial_container.hh>
00042
00043 namespace vcsn
00044 {
00045 namespace bmig
00046 {
00047
00048
00049 template <typename Kind, typename WordValue, typename WeightValue,
00050 typename SeriesValue, typename Letter, typename Tag, typename GeometryCoords>
00051 class Graph
00052 {
00053 public:
00054
00055
00056
00057
00058
00059 typedef Graph<Kind, WordValue, WeightValue,
00060 SeriesValue, Letter, Tag, GeometryCoords>
00061 self_t;
00062
00063 typedef WeightValue semiring_elt_value_t;
00064 typedef WordValue monoid_elt_value_t;
00065 typedef WordValue word_value_t;
00066 typedef SeriesValue series_set_elt_value_t;
00067 typedef Letter letter_t;
00068 typedef Tag tag_t;
00069
00070 typedef typename LabelOf<Kind, WordValue, WeightValue,
00071 SeriesValue, Letter>::ret label_t;
00072
00073
00074 typedef label_t
00075 hlabel_t;
00076
00077 typedef boost::shared_ptr<std::size_t> state_t;
00078
00079
00080 typedef handler<state_h, state_t> hstate_t;
00081
00082 typedef EdgeValue<state_t, label_t> edge_data_t;
00083
00084
00085 typedef GraphContainer<state_t, label_t, edge_data_t> graph_data_t;
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 typedef typename graph_data_t::iterator
00099 edges_iterator;
00100 typedef handler<transition_h, edges_iterator> htransition_t;
00101 typedef htransition_t hedge_t;
00102
00103
00104 typedef VGraphContainer<edges_iterator, graph_data_t, htransition_t> edges_t;
00105 typedef std::vector<state_t> states_data_t;
00106 typedef misc::Support<states_data_t> states_t;
00107
00108
00109
00110 typedef InitialValue<state_t, series_set_elt_value_t>
00111 initial_value_t;
00112 typedef initial_value_t final_value_t;
00113 typedef InitialContainer<initial_value_t, state_t>
00114 initial_container_t;
00115
00116 typedef typename initial_container_t::Type initial_t;
00117 typedef initial_t final_t;
00118
00119 typedef misc::Support<initial_container_t> initial_support_t;
00120 typedef misc::Support<initial_container_t> final_support_t;
00121
00122 typedef GeometryCoords geometry_coords_t;
00123
00124 typedef vcsn::geometry<hstate_t, htransition_t, GeometryCoords>
00125 geometry_t;
00126
00127
00128 typedef typename graph_data_t::iterator iterator;
00129 typedef typename graph_data_t::const_iterator const_iterator;
00130 typedef iterator transition_iterator;
00131
00132 typedef typename index_iterator<graph_data_t, src>::type
00133 src_iterator;
00134 typedef src_iterator src_const_iterator;
00135 typedef typename index_iterator<graph_data_t, dst>::type
00136 dst_iterator;
00137 typedef dst_iterator dst_const_iterator;
00138 typedef std::pair<src_iterator, src_iterator> src_range;
00139 typedef std::pair<dst_iterator, dst_iterator> dst_range;
00140
00141 typedef typename index_iterator<graph_data_t, succ>::type
00142 succ_iterator;
00143 typedef succ_iterator succ_const_iterator;
00144 typedef std::pair<succ_iterator, succ_iterator> succ_range;
00145
00146 typedef ::vcsn::bmig::DeltaConstIterator<self_t, src_iterator>
00147 delta_iterator;
00148 typedef ::vcsn::bmig::DeltaConstIterator<self_t, dst_iterator>
00149 rdelta_iterator;
00150
00151 Graph ();
00152 Graph (unsigned int reserve_number_of_state,
00153 unsigned int reserve_number_edge);
00154 Graph (const self_t&);
00155 ~Graph ();
00156
00157 self_t& operator= (const self_t&);
00158
00159
00160
00161 states_t states () const;
00162 edges_t edges () const;
00163 initial_support_t initial () const;
00164 final_support_t final () const;
00165
00166
00167 bool has_state (const hstate_t& h) const;
00168 hstate_t add_state ();
00169 hstate_t get_state (unsigned h) const;
00170 void del_state (const hstate_t& h);
00171
00172 void set_initial(const hstate_t& s,
00173 const series_set_elt_value_t& v,
00174 const series_set_elt_value_t& z);
00175 const series_set_elt_value_t&
00176 get_initial(const hstate_t&,
00177 const series_set_elt_value_t&) const;
00178 bool is_initial(const hstate_t& s,
00179 const series_set_elt_value_t&) const;
00180 void clear_initial();
00181
00182 void set_final(const hstate_t&,
00183 const series_set_elt_value_t&,
00184 const series_set_elt_value_t&);
00185 const series_set_elt_value_t&
00186 get_final(const hstate_t&,
00187 const series_set_elt_value_t&) const;
00188 bool is_final(const hstate_t& s,
00189 const series_set_elt_value_t&) const;
00190 void clear_final();
00191
00192
00193
00194 bool has_edge (const hedge_t& h) const;
00195 hedge_t add_edge (const hstate_t& from,
00196 const hstate_t& to,
00197 const label_t& l);
00198 void del_edge (const hedge_t& h);
00199
00200 hstate_t src_of (const hedge_t& h) const;
00201 hstate_t dst_of (const hedge_t& h) const;
00202
00203 const label_t& label_of (const hedge_t& h) const;
00204 void update(const hedge_t& h, const label_t& l);
00205
00206
00207 template <class S>
00208 bool exists (const AutomataBase<S>& s) const;
00209
00210 self_t& clone () const;
00211
00212 tag_t& tag ();
00213 const tag_t& tag () const;
00214 geometry_t& geometry ();
00215 const geometry_t& geometry () const;
00216
00217
00218
00219
00220
00221 template <typename I>
00222 htransition_t get_htransition(const I& i) const;
00223
00224
00225
00226 # define DECLARE_DELTAI_FUNCTION(DeltaKind) \
00227 std::pair<DeltaKind##_iterator, DeltaKind##_iterator> \
00228 deltai(const hstate_t& s, DeltaKind##_iterator) const
00229 DECLARE_DELTAI_FUNCTION(src);
00230 DECLARE_DELTAI_FUNCTION(dst);
00231 # undef DECLARE_DELTAI_FUNCTION
00232
00233 private:
00234 typename graph_data_t::const_iterator
00235 find_edge(const state_t&,
00236 const state_t&,
00237 const hlabel_t&) const;
00238
00239 geometry_t geometry_;
00240 graph_data_t graph_;
00241 tag_t tag_;
00242 final_t final_;
00243 initial_t initial_;
00244
00245
00246 boost::dynamic_bitset<> initial_bitset_;
00247 boost::dynamic_bitset<> final_bitset_;
00248 unsigned number_of_epsilon_;
00249
00250
00251 unsigned number_of_state_;
00252 states_data_t states_;
00253
00254 SmartLabelContainer<label_t>
00255 label_container_;
00256
00257 };
00258
00259
00260
00261 # define BMIGRAPH_TPARAM \
00262 template <class S, class WordValue, class WeightValue, class SeriesValue, \
00263 class Letter, class Tag, class GeometryCoords>
00264
00265 # define BMIGRAPH_SERIES \
00266 Graph<labels_are_series, WordValue, WeightValue, SeriesValue, \
00267 Letter, Tag, GeometryCoords>
00268
00269 BMIGRAPH_TPARAM
00270 ADAPT_ADD_LETTER_TRANSITION_TO_SERIES_LABEL(BMIGRAPH_SERIES);
00271
00272 BMIGRAPH_TPARAM
00273 ADAPT_LETTER_OF_TO_SERIES_LABEL(BMIGRAPH_SERIES);
00274
00275 BMIGRAPH_TPARAM
00276 ADAPT_WORD_OF_TO_SERIES_LABEL(BMIGRAPH_SERIES);
00277
00278 # undef BMIGRAPH_SERIES
00279 # define BMIGRAPH_LETTERS \
00280 Graph<labels_are_letters, WordValue, WeightValue, SeriesValue,\
00281 Letter, Tag, GeometryCoords>
00282
00283 BMIGRAPH_TPARAM
00284 ADAPT_WORD_OF_TO_LETTERS_LABEL(BMIGRAPH_LETTERS);
00285
00286 BMIGRAPH_TPARAM
00287 ADAPT_SERIE_OF_TO_LETTERS_LABEL(BMIGRAPH_LETTERS);
00288
00289 BMIGRAPH_TPARAM
00290 ADAPT_ADD_SERIE_TRANSITION_TO_LETTERS_LABEL(BMIGRAPH_LETTERS);
00291
00292 # undef BMIGRAPH_LETTERS
00293
00294 # define BMIGRAPH \
00295 Graph<Kind, WordValue, WeightValue, SerieValue, \
00296 Letter, Tag, GeometryCoords>
00297
00298 template <class Kind, class WordValue, class WeightValue, class SerieValue,
00299 class Letter, class Tag, class GeometryCoords, class I>
00300 Tag& op_tag(const AutomataBase<I>&, BMIGRAPH&);
00301
00302 template <class Kind, class WordValue, class WeightValue, class SerieValue,
00303 class Letter, class Tag, class GeometryCoords, class I>
00304 const Tag& op_tag(const AutomataBase<I>&, BMIGRAPH&);
00305
00306 template <class Kind, class WordValue, class WeightValue, class SerieValue,
00307 class Letter, class Tag, class GeometryCoords, class I>
00308 typename BMIGRAPH::geometry_t&
00309 op_geometry(const AutomataBase<I>&, BMIGRAPH&);
00310
00311 template <class Kind, class WordValue, class WeightValue, class SerieValue,
00312 class Letter, class Tag, class GeometryCoords, class I>
00313 const typename BMIGRAPH::geometry_t&
00314 op_geometry(const AutomataBase<I>&, const BMIGRAPH&);
00315
00316 # undef BMIGRAPH
00317 # undef BMIGRAPH_TPARAM
00318
00319 }
00320
00321
00322 VCSN_MAKE_AUTOMATON_TRAITS(bmig::Graph);
00323 VCSN_MAKE_GENERALIZED_AUTOMATON_TRAITS(bmig::Graph);
00324 VCSN_MAKE_MUTE_GRAPH_IMPL_TRAITS(bmig::Graph);
00325 VCSN_MAKE_MUTE_GRAPH_IMPL_MONOID_TRAITS(bmig::Graph);
00326
00327
00328 template <class Kind,
00329 class WordValue,
00330 class WeightValue,
00331 class SeriesValue,
00332 class Letter,
00333 class Tag,
00334 class GeometryCoords>
00335 struct transducer_traits<bmig::Graph<Kind,
00336 WordValue,
00337 WeightValue,
00338 SeriesValue,
00339 Letter,
00340 Tag,
00341 GeometryCoords> >
00342 {
00343 typedef WordValue input_monoid_elt_value_t;
00344 typedef typename algebra::series_traits<WeightValue>::monoid_elt_value_t
00345 output_monoid_elt_value_t;
00346 typedef typename algebra::series_traits<WeightValue>::semiring_elt_value_t
00347 output_semiring_elt_value_t;
00348 };
00349
00350
00351 template <class Kind,
00352 class WordValue,
00353 class WeightValue,
00354 class SeriesValue,
00355 class Letter,
00356 class Tag,
00357 class GeometryCoords>
00358 struct input_projection_traits<bmig::Graph<Kind,
00359 WordValue,
00360 WeightValue,
00361 SeriesValue,
00362 Letter,
00363 Tag,
00364 GeometryCoords> >
00365 {
00366 typedef bmig::Graph<Kind, WordValue, WeightValue, SeriesValue,
00367 Letter, Tag, GeometryCoords>
00368 self_t;
00369 typedef typename transducer_traits<self_t>::output_semiring_elt_value_t
00370 semiring_elt_value_t;
00371 typedef typename transducer_traits<self_t>::input_monoid_elt_value_t
00372 monoid_elt_value_t;
00373 typedef typename algebra::mute_series_impl<SeriesValue,
00374 semiring_elt_value_t,
00375 monoid_elt_value_t>::ret
00376 series_set_elt_value_t;
00377
00378 typedef
00379 bmig::Graph<Kind,
00380 monoid_elt_value_t,
00381 semiring_elt_value_t,
00382 series_set_elt_value_t,
00383 Letter,
00384 Tag,
00385 GeometryCoords>
00386 ret;
00387 };
00388
00389
00390 template <class Kind,
00391 class WordValue,
00392 class WeightValue,
00393 class SeriesValue,
00394 class Letter,
00395 class Tag,
00396 class GeometryCoords>
00397 struct fmp_input_projection_traits<bmig::Graph<Kind,
00398 WordValue,
00399 WeightValue,
00400 SeriesValue,
00401 Letter,
00402 Tag,
00403 GeometryCoords> >
00404 {
00405 typedef bmig::Graph<Kind, WordValue, WeightValue, SeriesValue,
00406 Letter, Tag, GeometryCoords>
00407 self_t;
00408
00409 typedef typename automaton_traits<self_t>::semiring_elt_value_t
00410 semiring_elt_value_t;
00411
00412 typedef typename WordValue::first_type monoid_elt_value_t;
00413 typedef typename monoid_elt_value_t::value_type letter_t;
00414
00415 typedef typename algebra::mute_series_impl<SeriesValue,
00416 semiring_elt_value_t,
00417 monoid_elt_value_t>::ret
00418 series_set_elt_value_t;
00419
00420 typedef
00421 bmig::Graph<Kind,
00422 monoid_elt_value_t,
00423 semiring_elt_value_t,
00424 series_set_elt_value_t,
00425 letter_t,
00426 Tag,
00427 GeometryCoords>
00428 ret;
00429 };
00430
00431 template <class Kind,
00432 class WordValue,
00433 class WeightValue,
00434 class SeriesValue,
00435 class Letter,
00436 class Tag,
00437 class GeometryCoords>
00438 struct output_projection_traits<bmig::Graph<Kind,
00439 WordValue,
00440 WeightValue,
00441 SeriesValue,
00442 Letter,
00443 Tag,
00444 GeometryCoords> >
00445 {
00446 typedef bmig::Graph<Kind, WordValue, WeightValue, SeriesValue,
00447 Letter, Tag, GeometryCoords>
00448 self_t;
00449
00450 typedef typename automaton_traits<self_t>::semiring_elt_value_t
00451 series_set_elt_value_t;
00452
00453 typedef typename
00454 algebra::series_traits<series_set_elt_value_t>::monoid_elt_value_t
00455 monoid_elt_value_t;
00456
00457 typedef typename
00458 algebra::series_traits<series_set_elt_value_t>::semiring_elt_value_t
00459 semiring_elt_value_t;
00460
00461 typedef
00462 bmig::Graph<Kind,
00463 monoid_elt_value_t,
00464 semiring_elt_value_t,
00465 series_set_elt_value_t,
00466 Letter,
00467 Tag,
00468 GeometryCoords>
00469 ret;
00470 };
00471
00472
00473 template <class Kind,
00474 class WordValue,
00475 class WeightValue,
00476 class SeriesValue,
00477 class Letter,
00478 class Tag,
00479 class GeometryCoords>
00480 struct fmp_output_projection_traits<bmig::Graph<Kind,
00481 WordValue,
00482 WeightValue,
00483 SeriesValue,
00484 Letter,
00485 Tag,
00486 GeometryCoords> >
00487 {
00488 typedef bmig::Graph<Kind, WordValue, WeightValue, SeriesValue,
00489 Letter, Tag, GeometryCoords>
00490 self_t;
00491
00492 typedef typename WordValue::second_type monoid_elt_value_t;
00493 typedef typename monoid_elt_value_t::value_type letter_t;
00494
00495 typedef typename automaton_traits<self_t>::semiring_elt_value_t
00496 semiring_elt_value_t;
00497
00498 typedef typename algebra::mute_series_impl<SeriesValue,
00499 semiring_elt_value_t,
00500 monoid_elt_value_t>::ret series_set_elt_value_t;
00501
00502 typedef
00503 bmig::Graph<Kind,
00504 monoid_elt_value_t,
00505 semiring_elt_value_t,
00506 series_set_elt_value_t,
00507 letter_t,
00508 Tag,
00509 GeometryCoords>
00510 ret;
00511 };
00512
00513
00514 template <class Kind,
00515 class WordValue,
00516 class WeightValue,
00517 class SeriesValue,
00518 class Letter,
00519 class Tag,
00520 class GeometryCoords>
00521 struct extension_traits<bmig::Graph<Kind,
00522 WordValue,
00523 WeightValue,
00524 SeriesValue,
00525 Letter,
00526 Tag,
00527 GeometryCoords> >
00528 {
00529 typedef bmig::Graph<Kind, WordValue, WeightValue,
00530 SeriesValue, Letter, Tag, GeometryCoords>
00531 self_t;
00532 typedef typename automaton_traits<self_t>::monoid_elt_value_t
00533 monoid_elt_value_t;
00534 typedef typename algebra::mute_series_impl<SeriesValue,
00535 SeriesValue,
00536 monoid_elt_value_t>::ret
00537 series_set_elt_value_t;
00538
00539 typedef
00540 bmig::Graph<Kind,
00541 monoid_elt_value_t,
00542 SeriesValue,
00543 series_set_elt_value_t,
00544 Letter,
00545 Tag,
00546 GeometryCoords>
00547 ret;
00548 };
00549 }
00550
00551 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00552 # include <vaucanson/automata/implementation/bmig_graph_impl.hxx>
00553 # endif // !VCSN_USE_INTERFACE_ONLY || VCSN_USE_LIB
00554
00555
00556
00557
00558 #endif // !VCSN_AUTOMATA_IMPLEMENTATION_BMIG_GRAPH_IMPL_HH_ //
00559