00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SEMIRING_TROPICAL_SEMIRING_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SEMIRING_TROPICAL_SEMIRING_HXX
00019 # include <vaucanson/config/system.hh>
00020 # include <vaucanson/algebra/implementation/semiring/tropical_semiring.hh>
00021 # include <vaucanson/misc/random.hh>
00022 # include <vaucanson/misc/limits.hh>
00023 
00024 namespace vcsn {
00025 
00026   namespace algebra {
00027 
00028     
00029 
00030 
00031     template<class TropicalKind, typename T>
00032     T identity_value(SELECTOR(algebra::TropicalSemiring<TropicalKind>), SELECTOR(T))
00033     {
00034       return T(0);
00035     }
00036 
00037     template<class TropicalKind, typename T>
00038     bool show_identity_value(SELECTOR(algebra::TropicalSemiring<TropicalKind>),
00039                              SELECTOR(T))
00040     {
00041       
00042       
00043       return true;
00044     }
00045 
00046     template<typename T>
00047     T zero_value(SELECTOR(algebra::TropicalSemiring<algebra::TropicalMax>), SELECTOR(T))
00048     {
00049       return misc::limits<T>::min();
00050     }
00051 
00052     template<>
00053     inline
00054     float zero_value(SELECTOR(algebra::TropicalSemiring<algebra::TropicalMax>), SELECTOR(float))
00055     {
00056       return -misc::limits<float>::infinity();
00057     }
00058 
00059     template<>
00060     inline
00061     double zero_value(SELECTOR(algebra::TropicalSemiring<algebra::TropicalMax>), SELECTOR(double))
00062     {
00063       return -misc::limits<double>::infinity();
00064     }
00065 
00066     template<typename T>
00067     T zero_value(SELECTOR(algebra::TropicalSemiring<algebra::TropicalMin>), SELECTOR(T))
00068     {
00069       return misc::limits<T>::max();
00070     }
00071 
00072     template<>
00073     inline
00074     float zero_value(SELECTOR(algebra::TropicalSemiring<algebra::TropicalMin>), SELECTOR(float))
00075     {
00076       return misc::limits<float>::infinity();
00077     }
00078 
00079     template<>
00080     inline
00081     double zero_value(SELECTOR(algebra::TropicalSemiring<algebra::TropicalMin>), SELECTOR(double))
00082     {
00083       return misc::limits<double>::infinity();
00084     }
00085 
00086     
00087 
00088 
00089     template<class TropicalKind, typename T>
00090     bool op_contains(const algebra::TropicalSemiring<TropicalKind>&, T c)
00091     {
00092       return true;
00093     }
00094 
00095     
00096 
00097 
00098     template<class TropicalKind, typename T, typename U>
00099     void op_in_mul(const algebra::TropicalSemiring<TropicalKind>&,
00100                    T& dst, U arg)
00101     {
00102       if ((dst == zero_value(SELECT(algebra::TropicalSemiring<TropicalKind>),
00103                              SELECT(T))) ||
00104           (arg == zero_value(SELECT(algebra::TropicalSemiring<TropicalKind>),
00105                              SELECT(U))))
00106         dst = zero_value(SELECT(algebra::TropicalSemiring<TropicalKind>), SELECT(T));
00107       else
00108         dst += arg;
00109     }
00110 
00111     template<class TropicalKind, typename T, typename U>
00112     T op_mul(const algebra::TropicalSemiring<TropicalKind>&, T a, U b)
00113     {
00114       if ((a == zero_value(SELECT(algebra::TropicalSemiring<TropicalKind>),
00115                            SELECT(T))) ||
00116           (b == zero_value(SELECT(algebra::TropicalSemiring<TropicalKind>),
00117                            SELECT(U))))
00118         return zero_value(SELECT(algebra::TropicalSemiring<TropicalKind>), SELECT(T));
00119       return a + b;
00120     }
00121 
00122     
00123 
00124 
00125     template<typename T, typename U>
00126     void op_in_add(const algebra::TropicalSemiring<algebra::TropicalMax>&,
00127                    T& dst, U arg)
00128     {
00129       dst = std::max(dst, arg);
00130     }
00131 
00132     template<typename T, typename U>
00133     void op_in_add(const algebra::TropicalSemiring<algebra::TropicalMin>&,
00134                    T& dst, U arg)
00135     {
00136       dst = std::min(dst, arg);
00137     }
00138 
00139     template<typename T, typename U>
00140     T op_add(const algebra::TropicalSemiring<algebra::TropicalMax>&, T a, U b)
00141     {
00142       return std::max(a, b);
00143     }
00144 
00145     template<typename T, typename U>
00146     T op_add(const algebra::TropicalSemiring<algebra::TropicalMin>&, T a, U b)
00147     {
00148       return std::min(a, b);
00149     }
00150 
00151     
00152 
00153 
00154     template <typename T>
00155     bool
00156     op_starable(const algebra::TropicalSemiring<algebra::TropicalMin>&, T b)
00157     {
00158       if (b < T(0))
00159         return false;
00160       return true;
00161     }
00162 
00163     template <class T>
00164     void
00165     op_in_star(const algebra::TropicalSemiring<algebra::TropicalMin>&, T& b)
00166     {
00167       if (b >= T(0))
00168         {
00169           b = T(0);
00170           return;
00171         }
00172       assertion(! "star not defined.");
00173     }
00174 
00175     
00176     template <>
00177     inline bool
00178     op_starable(const algebra::TropicalSemiring<algebra::TropicalMin>&, bool)
00179     {
00180       return true;
00181     }
00182 
00183     template <>
00184     inline void
00185     op_in_star(const algebra::TropicalSemiring<algebra::TropicalMin>&, bool& b)
00186     {
00187       b = 0;
00188     }
00189 
00190 
00191     template <typename T>
00192     bool
00193     op_starable(const algebra::TropicalSemiring<algebra::TropicalMax>&, T b)
00194     {
00195       if (b > T(0))
00196         return false;
00197       return true;
00198     }
00199 
00200     template <class T>
00201     void
00202     op_in_star(const algebra::TropicalSemiring<algebra::TropicalMax>&, T& b)
00203     {
00204       if (b <= T(0))
00205         {
00206           b = T(0);
00207           return;
00208         }
00209       assertion(! "star not defined.");
00210     }
00211 
00212     template <class TropicalKind, class T>
00213     Element<algebra::TropicalSemiring<TropicalKind>, T>
00214     op_choose(const algebra::TropicalSemiring<TropicalKind>& set, SELECTOR(T))
00215     {
00216       return Element<algebra::TropicalSemiring<TropicalKind>, T>
00217         (set, misc::random::generate<T>());
00218     }
00219 
00220     template <class TropicalKind, typename T>
00221     bool
00222     op_can_choose_non_starable(const algebra::TropicalSemiring<TropicalKind>&,
00223                                SELECTOR(T))
00224     {
00225       return true;
00226     }
00227 
00228     template <class TropicalKind, class T>
00229     Element<algebra::TropicalSemiring<TropicalKind>, T>
00230     op_choose_starable(const algebra::TropicalSemiring<TropicalKind>& set,
00231                        SELECTOR(T))
00232     {
00233       T r;
00234       do
00235         r = op_choose(set, SELECT(T));
00236       while (!op_starable(set, r));
00237       return r;
00238     }
00239 
00240     template <class TropicalKind, class T>
00241     Element<algebra::TropicalSemiring<TropicalKind>, T>
00242     op_choose_non_starable(const algebra::TropicalSemiring<TropicalKind>& set,
00243                            SELECTOR(T))
00244     {
00245       T r;
00246       do
00247         r = op_choose(set, SELECT(T));
00248       while (!op_starable(set, r));
00249       return r;
00250     }
00251 
00252     
00253 
00254 
00255     template<typename St, typename T>
00256     St& op_rout(const algebra::TropicalSemiring<algebra::TropicalMax>&, St& st, const T& v)
00257     {
00258       if (v == zero_value(SELECT(algebra::TropicalSemiring<algebra::TropicalMax>), SELECT(T)))
00259         st << "-oo";
00260       else
00261         st << v;
00262       return st;
00263     }
00264 
00265     template<typename St, typename T>
00266     St& op_rout(const algebra::TropicalSemiring<algebra::TropicalMin>&, St& st, const T& v)
00267     {
00268       if (v == zero_value(SELECT(algebra::TropicalSemiring<algebra::TropicalMin>), SELECT(T)))
00269         st << "+oo";
00270       else
00271         st << v;
00272       return st;
00273     }
00274 
00275   } 
00276 
00277 } 
00278 
00279 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SEMIRING_TROPICAL_SEMIRING_HXX