- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

# transducer_maker.thxx

    00001 //                                                      -*- C++ -*-
    00002 // transducer_maker.thxx: this file is part of the Vaucanson project.
    00003 //
    00004 // Vaucanson, a generic library for finite state machines.
    00005 //
    00006 // Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 The Vaucanson 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
    00019 /*
    00020  * CPP guard should not be inserted here as
    00021  * VCSN_CONTEXT_NAMESPACE could be changed.
    00022  */
    00023
    00024 #include <vaucanson/algorithms/evaluation_rw.hh>
    00025 #include <vaucanson/algorithms/minimization_hopcroft.hh>
    00026 #include <vaucanson/algorithms/trim.hh>
    00027 #include <vaucanson/algorithms/aut_to_exp.hh>
    00028 #include <vaucanson/algorithms/realtime.hh>
    00029
    00030 namespace vcsn
    00031 {
    00032
    00033   namespace VCSN_GRAPH_IMPL
    00034   {
    00035
    00036     VCSN_CONTEXT_NAMESPACE
    00037     {
    00038
    00039       /*-----------------.
    00040       | make_automaton() |
    00041       `-----------------*/
    00042
    00043       template <class InputIterator>
    00044       automata_set_t
    00045       make_automata_set(InputIterator input_alphabet_begin,
    00046                         InputIterator input_alphabet_end,
    00047                         InputIterator output_alphabet_begin,
    00048                         InputIterator output_alphabet_end)
    00049       {
    00050         alphabet_t              input_alpha;
    00051         alphabet_t              output_alpha;
    00052
    00053         for (InputIterator e = input_alphabet_begin;
    00054             e != input_alphabet_end; ++e)
    00055           input_alpha.insert(*e);
    00056
    00057         for (InputIterator e = output_alphabet_begin;
    00058             e != output_alphabet_end; ++e)
    00059           output_alpha.insert(*e);
    00060
    00061         monoid_t                output_freemonoid (output_alpha);
    00062         typename output_series_set_t::semiring_t        semiring;
    00063         output_series_set_t     output_series (semiring, output_freemonoid);
    00064         monoid_t                freemonoid (input_alpha);
    00065         series_set_t            series (output_series, freemonoid);
    00066         automata_set_t          automata_set (series);
    00067
    00068         return automata_set;
    00069       }
    00070
    00071
    00072       template <class InputIterator>
    00073       automaton_t
    00074       make_automaton(InputIterator input_alphabet_begin,
    00075                      InputIterator input_alphabet_end,
    00076                      InputIterator output_alphabet_begin,
    00077                      InputIterator output_alphabet_end)
    00078       {
    00079         return automaton_t(make_automata_set(input_alphabet_begin,
    00080                                              input_alphabet_end,
    00081                                              output_alphabet_begin,
    00082                                              output_alphabet_end));
    00083       }
    00084
    00085
    00086       template <class T>
    00087       automaton_t make_automaton(const T& input_alphabet,
    00088                                  const T& output_alphabet)
    00089       {
    00090         return make_automaton(input_alphabet.begin(),
    00091                               input_alphabet.end(),
    00092                               output_alphabet.begin(),
    00093                               output_alphabet.end());
    00094       }
    00095
    00096       template <typename TransStruct,
    00097                 typename TransImpl,
    00098                 typename MonoidStruct,
    00099                 typename MonoidImpl>
    00100       output_series_set_elt_t
    00101       do_evaluation(const vcsn::TransducerBase<TransStruct>&,
    00102                     const TransImpl&,
    00103                     const vcsn::algebra::FreeMonoidBase<MonoidStruct>&,
    00104                     const MonoidImpl& input,
    00105                     const Element<TransStruct, TransImpl>& t,
    00106                     const Element<MonoidStruct, MonoidImpl>&)
    00107       {
    00108         return eval(t, input);
    00109       }
    00110
    00111       template <typename TransStruct,
    00112               typename TransImpl,
    00113               typename SeriesStruct,
    00114               typename SeriesImpl,
    00115               typename S,
    00116               typename T>
    00117     output_series_set_elt_t
    00118     do_evaluation(const vcsn::TransducerBase<TransStruct>&,
    00119                   const TransImpl&,
    00120                   const SeriesStruct&,
    00121                   const vcsn::rat::exp<S, T>& input,
    00122                   const Element<TransStruct, TransImpl>& t,
    00123                   const Element<SeriesStruct, SeriesImpl>&)
    00124     {
    00125       AUTOMATON_CONTEXT::automaton_t w =
    00126         AUTOMATON_CONTEXT::make_automaton(t.structure().series()
    00127                                            .monoid().alphabet());
    00128       typename output_projection_helper<TransStruct, TransImpl>::ret::set_t
    00129         ret_set(t.structure().series().semiring());
    00130       AUTOMATON_CONTEXT::gen_automaton_t result (ret_set);
    00131       standard_of(w, input);
    00132       evaluation_rw(quotient(w), t, result);
    00133       return aut_to_exp(quotient(realtime(trim(result))), DMChooser());
    00134     }
    00135
    00136       template <typename TransStruct,
    00137                 typename TransImpl,
    00138                 typename ArgStruct,
    00139                 typename ArgImpl>
    00140       output_series_set_elt_t
    00141       evaluation(const Element<TransStruct, TransImpl>& t,
    00142                  const Element<ArgStruct, ArgImpl>& input)
    00143       {
    00144         return do_evaluation(t.structure(), t.value(),
    00145                              input.structure(), input.value(),
    00146                              t, input);
    00147       }
    00148
    00149     } // End of VCSN_CONTEXT_NAMESPACE.
    00150   }// End of VCSN_GRAPH_IMPL.
    00151 } // End of namespace vcsn.
    00152