00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HXX
00018 # define VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HXX
00019
00020 # include <vaucanson/algebra/concept/series_base.hh>
00021 # include <vaucanson/misc/usual_macros.hh>
00022
00023 namespace vcsn {
00024
00025 namespace algebra {
00026
00027
00028
00029
00030
00031 template<class Self>
00032 const typename SeriesBase<Self>::monoid_t&
00033 SeriesBase<Self>::monoid() const
00034 {
00035 return this->self().monoid();
00036 }
00037
00038 template<class Self>
00039 const typename SeriesBase<Self>::semiring_t&
00040 SeriesBase<Self>::semiring() const
00041 {
00042 return this->self().semiring();
00043 }
00044
00045 template<class Self>
00046 typename SeriesBase<Self>::monoid_t&
00047 SeriesBase<Self>::monoid()
00048 {
00049 return this->self().monoid();
00050 }
00051
00052 template<class Self>
00053 typename SeriesBase<Self>::semiring_t&
00054 SeriesBase<Self>::semiring()
00055 {
00056 return this->self().semiring();
00057 }
00058
00059 template<class Self>
00060 SeriesBase<Self>::SeriesBase()
00061 {}
00062
00063 template<class Self>
00064 SeriesBase<Self>::SeriesBase(const SeriesBase& other) :
00065 SemiringBase<Self>(other)
00066 {}
00067
00068 }
00069
00070
00071
00072
00073
00074
00075 template<typename Self, typename T>
00076 typename MetaElement<algebra::SeriesBase<Self>, T>::semiring_elt_value_t
00077 MetaElement<algebra::SeriesBase<Self>, T>::get(const monoid_elt_value_t& m) const
00078 {
00079
00080 return op_series_get(this->structure(), this->value(), m);
00081 }
00082
00083 template<typename Self, typename T>
00084 typename MetaElement<algebra::SeriesBase<Self>, T>::semiring_elt_t
00085 MetaElement<algebra::SeriesBase<Self>, T>::get(const monoid_elt_t& m) const
00086 {
00087 return semiring_elt_t(this->structure().semiring(), get(m.value()));
00088 }
00089
00090 template<typename Self, typename T>
00091 void
00092 MetaElement<algebra::SeriesBase<Self>, T>::assoc(const monoid_elt_value_t& m,
00093 const semiring_elt_value_t& w)
00094 {
00095
00096
00097 return op_series_set(this->structure(), this->value(), m, w);
00098 }
00099
00100 template<typename Self, typename T>
00101 void
00102 MetaElement<algebra::SeriesBase<Self>, T>::assoc(const monoid_elt_t& m,
00103 const semiring_elt_t& w)
00104 {
00105 assoc(m.value(), w.value());
00106 }
00107
00108 template<typename Self, typename T>
00109 bool
00110 MetaElement<algebra::SeriesBase<Self>, T>::is_finite_app() const
00111 {
00112 return op_is_finite_app(this->structure(), this->value());
00113 }
00114
00115 template <typename Self, typename T>
00116 typename MetaElement<algebra::SeriesBase<Self>, T>::monoid_elt_t
00117 MetaElement<algebra::SeriesBase<Self>, T>::choose_from_supp() const
00118 {
00119 return
00120 typename MetaElement<algebra::SeriesBase<Self>, T>::monoid_elt_t
00121 (this->structure().monoid(),
00122 op_choose_from_supp(this->structure(), this->value()));
00123 }
00124
00125 template <typename Self, typename T>
00126 void
00127 MetaElement<algebra::SeriesBase<Self>, T>::transpose()
00128 {
00129 op_in_transpose(this->structure(), this->value());
00130 }
00131
00132 template <typename Self, typename T>
00133 typename MetaElement<algebra::SeriesBase<Self>, T>::support_t
00134 MetaElement<algebra::SeriesBase<Self>, T>::supp() const
00135 {
00136 return op_support(this->structure(), this->value());
00137 }
00138
00139 template <typename Self, typename T>
00140 typename MetaElement<algebra::SeriesBase<Self>, T>::series_set_t
00141 MetaElement<algebra::SeriesBase<Self>, T>::series() const
00142 {
00143 return this->structure();
00144 }
00145
00146 template<typename Self, typename T>
00147 MetaElement<algebra::SeriesBase<Self>, T>::MetaElement()
00148 {}
00149
00150 template<typename Self, typename T>
00151 MetaElement<algebra::SeriesBase<Self>, T>::MetaElement(const MetaElement& other) :
00152 MetaElement<algebra::SemiringBase<Self>, T>(other)
00153 {}
00154
00155
00156 namespace algebra {
00157
00158
00159
00160
00161
00162 template<typename S, typename T>
00163 bool op_is_finite_app(const algebra::SeriesBase<S>& s, const T& t)
00164 {
00165 return false;
00166 }
00167
00168 template<typename S, typename T, typename M, typename W>
00169 void op_series_structure(const algebra::SeriesBase<S>& s, const T& t, const W& w)
00170 {
00171 pure_service_call ("default implementation of op_series_structure()");
00172 }
00173
00174 template <class S, class T>
00175 Element<S, T>
00176 op_series_choose(const algebra::SeriesBase<S>& s, SELECTOR(T))
00177 {
00178 pure_service_call ("default implementation of op_series_choose()");
00179 return Element<S, T>();
00180 }
00181
00182 template <class S, class T>
00183 typename algebra::series_traits<T>::support_t
00184 op_support(const algebra::SeriesBase<S>&, const T& v)
00185 {
00186 return v;
00187 }
00188
00189 }
00190
00191 template <class S, class T>
00192 Element<S, T>
00193 transpose(const algebra::SeriesBase<S>& s, const T& t)
00194 {
00195 T new_t(t);
00196 new_t.transpose();
00197 return new_t;
00198 }
00199
00200 template <class S, class T>
00201 bool
00202 is_support_in_alphabet(const Element<S, T>& s)
00203 {
00204 typedef typename algebra::series_traits<T>::support_t support_t;
00205 support_t supp = s.supp();
00206 for_all_const_(support_t, e, supp)
00207 if (op_size(s.structure().monoid(), *e) != 1)
00208 return false;
00209 return true;
00210 }
00211
00212 template <typename S1, typename S2, typename T1, typename T2>
00213 void
00214 extract_support(Element<S1, T1>& s1, Element<S2, T2>& s2)
00215 {
00216 typedef typename algebra::series_traits<T2>::support_t support_t;
00217 typedef typename algebra::series_traits<T1>::semiring_elt_value_t
00218 semiring_elt_value_t;
00219 for_all_const_(support_t, e, s2.supp())
00220 s1.assoc(*e,
00221 algebra::identity_as<semiring_elt_value_t>::
00222 of(s1.structure().semiring()));
00223 }
00224
00225 template <class S, class T>
00226 Element<S, T>
00227 hadamard(const Element<S, T>& lhs, const Element<S, T>& rhs)
00228 {
00229 typedef Element<S, T> series_set_elt_t;
00230 typedef typename Element<S, T>::monoid_elt_t monoid_elt_t;
00231 typedef typename Element<S, T>::semiring_elt_t semiring_elt_t;
00232 typedef typename Element<S, T>::support_t support_t;
00233 Element<S, T> output;
00234 support_t support = lhs.supp();
00235 for (typename support_t::iterator supp = support.begin();
00236 supp != support.end();
00237 ++supp)
00238 {
00239 output += lhs.get(*supp) *
00240 rhs.get(*supp) * series_set_elt_t(lhs.structure(), monoid_elt_t(*supp));
00241 }
00242 return output;
00243 }
00244
00245 namespace algebra {
00246
00247 template <class S, class M>
00248 S
00249 op_convert(const algebra::SeriesBase<S>&,
00250 const algebra::FreeMonoidBase<M>& monoid)
00251 {
00252
00253 enum { compatible = misc::static_eq<typename S::monoid_t, M>::value };
00254 static_assertion_(compatible, invalid_conversion_from_monoid_to_series);
00255
00256 typename S::semiring_t semiring;
00257 return S (semiring, monoid.self());
00258 }
00259
00260 template <class S, class T>
00261 T
00262 op_convert(const algebra::SeriesBase<S>&, SELECTOR(T), const T& src_)
00263 {
00264 return src_;
00265 }
00266
00267 template <class S, class T, class U>
00268 T
00269 op_convert(const algebra::SeriesBase<S>& s, SELECTOR(T), const U& src_)
00270 {
00271 typedef typename algebra::series_traits<U>::support_t support_t;
00272 typedef typename Element<S, T>::monoid_elt_t monoid_elt_t;
00273 S ts = s.self();
00274 Element<S, U> src(ts, src_);
00275 Element<S, T> dst(ts);
00276 support_t support = src.supp();
00277 for_all_const_(support_t, ss, support)
00278 dst += src.get(monoid_elt_t(s.monoid(), *ss)) *
00279 Element<S, T>(s.self(), monoid_elt_t(s.monoid(), *ss));
00280 return dst.value();
00281 }
00282
00284 template<typename S, typename St, typename T>
00285 St& op_rout(const algebra::SeriesBase<S>& s, St& st, const T& se)
00286 {
00287 return op_rout(s.self(), st, se);
00288 }
00289 }
00290
00291 }
00292
00293 #endif // ! VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HXX