00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HH
00018 # define VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HH
00019
00020 # include <vaucanson/algebra/concept/semiring_base.hh>
00021 # include <vaucanson/algebra/concept/freemonoid_base.hh>
00022
00023 namespace vcsn {
00024
00025 namespace algebra {
00026
00030
00031
00032
00033
00036 template<class Self>
00037 struct SeriesBase
00038 : SemiringBase<Self>
00039 {
00041 typedef typename virtual_types<Self>::monoid_t monoid_t;
00042
00044 typedef typename virtual_types<Self>::semiring_t semiring_t;
00045
00047 const monoid_t& monoid() const;
00048
00050 const semiring_t& semiring() const;
00051
00053 monoid_t& monoid();
00054
00056 semiring_t& semiring();
00057
00058 protected:
00060 SeriesBase();
00061
00063 SeriesBase(const SeriesBase& other);
00064 };
00065
00067 template<typename T>
00068 struct series_traits
00069 {
00070 typedef undefined_type monoid_elt_value_t;
00071 typedef undefined_type semiring_elt_value_t;
00072 };
00073
00074 template <typename T, typename W, typename M>
00075 struct mute_series_impl
00076 {
00077 typedef undefined_type ret;
00078 };
00079
00080 template <typename T, typename W, typename M>
00081 struct mute_series_traits
00082 {
00083 typedef undefined_type ret;
00084 };
00085
00089 }
00090
00094
00095
00096
00097
00098 template<typename Self>
00099 struct dynamic_traits<algebra::SeriesBase<Self> >
00100 : dynamic_traits<algebra::SemiringBase<Self> >
00101 {};
00102
00103 template<typename Self>
00104 struct virtual_types<algebra::SeriesBase<Self> >
00105 : virtual_types<algebra::SemiringBase<Self> >
00106 {
00107 typedef undefined_type monoid_t;
00108 typedef undefined_type semiring_t;
00109 };
00110
00111
00112
00113
00114
00116 template<class Self, typename T>
00117 class MetaElement<algebra::SeriesBase<Self>, T>
00118 : public MetaElement<algebra::SemiringBase<Self>, T>
00119 {
00120 public:
00122 typedef typename algebra::series_traits<T>::semiring_elt_value_t semiring_elt_value_t;
00123
00125 typedef typename algebra::series_traits<T>::monoid_elt_value_t monoid_elt_value_t;
00126
00128 typedef Element<typename Self::semiring_t, semiring_elt_value_t> semiring_elt_t;
00129
00131 typedef Element<typename Self::monoid_t, monoid_elt_value_t> monoid_elt_t;
00132
00134 typedef typename Self::monoid_t monoid_t;
00135
00137 typedef typename Self::semiring_t semiring_t;
00138
00140 typedef Self series_set_t;
00141
00143 typedef Element<Self, T> element_t;
00144
00146 typedef typename algebra::series_traits<T>::support_t support_t;
00147
00149 semiring_elt_value_t get(const monoid_elt_value_t& m) const;
00150
00152 semiring_elt_t get(const monoid_elt_t& m) const;
00153
00157 void assoc(const monoid_elt_value_t& m, const semiring_elt_value_t& w);
00158
00162 void assoc(const monoid_elt_t& m, const semiring_elt_t& w);
00163
00165 bool is_finite_app() const;
00166
00168 monoid_elt_t choose_from_supp() const;
00169
00171 void transpose();
00172
00180 support_t supp() const;
00181
00182 series_set_t series() const;
00183
00184 protected:
00186 MetaElement();
00187
00189 MetaElement(const MetaElement& other);
00190 };
00191
00193 template <typename S, typename T>
00194 Element<S, T>
00195 transpose(const algebra::SeriesBase<S>& s, const T& t);
00196
00198 template <typename S, typename T>
00199 bool
00200 is_support_in_alphabet(const Element<S, T>& s);
00201
00203 template <typename S1, typename S2, typename T1, typename T2>
00204 void
00205 extract_support(Element<S1, T1>&, Element<S2, T2>&);
00206
00208 template <class S, class T>
00209 Element<S, T> hadamard(const Element<S, T>& lhs,
00210 const Element<S, T>& rhs);
00211
00216
00217
00218
00219
00220 namespace algebra {
00221
00222 template <typename S, typename T>
00223 bool
00224 op_is_finite_app(const algebra::SeriesBase<S>& s, const T& t);
00225
00226 template <typename S, typename T>
00227 typename MetaElement<algebra::SeriesBase<S>, T>::monoid_elt_t
00228 op_choose_from_supp(const algebra::SeriesBase<S>& s, const T& t);
00229
00230 template <class S, class T>
00231 Element<S, T>
00232 op_series_choose(const algebra::SeriesBase<S>& s, SELECTOR(T));
00233
00234 template <typename S, typename T, typename M, typename W>
00235 void
00236 op_series_set(const algebra::SeriesBase<S>& s, const T& t, const W& w);
00237
00238 template <class S, class T>
00239 typename algebra::series_traits<T>::support_t
00240 op_support(const algebra::SeriesBase<S>&, const T& v);
00241
00242
00243 template <class S, class M>
00244 S
00245 op_convert(const algebra::SeriesBase<S>&,
00246 const algebra::FreeMonoidBase<M>&);
00247
00248 template <class S, class T>
00249 T
00250 op_convert(const algebra::SeriesBase<S>& s, SELECTOR(T), const T& src_);
00251
00252 template <class S, class T, class U>
00253 T
00254 op_convert(const algebra::SeriesBase<S>&, SELECTOR(T), U& src_);
00255
00257 template<typename S, typename St, typename T>
00258 St& op_rout(const algebra::SeriesBase<S>& s, St& st, const T& se);
00259
00260 }
00261
00262 }
00263
00264 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00265 # include <vaucanson/algebra/concept/series_base.hxx>
00266 # endif // VCSN_USE_INTERFACE_ONLY
00267
00268 #endif // ! VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HH