synaps/usolve/SturmBezier.h

00001 
00002 #ifndef _SYNAPS_SOLVE_STURMBZ_H_
00003 #define _SYNAPS_SOLVE_STURMBZ_H_
00004 
00005 
00006 #include <synaps/init.h>
00007 #include <synaps/arithm/RealOf.h>
00008 #include <synaps/usolve/solver_base.h>
00009 #include <synaps/usolve.h>
00010 #include <synaps/usolve/sturm/solve_sturm_bezier.h>
00011 #include <synaps/usolve/sturm/common.h>
00012 
00013 
00014 __BEGIN_NAMESPACE_SYNAPS
00015 
00016 template < typename NT >
00017 struct SturmBz : public solver_base
00018 {
00019   
00020   typedef NumberTraits<NT>             NTR;
00021   
00022   typedef typename NTR::RT             RT;
00023   typedef typename NTR::FT             FT;
00024   typedef typename NTR::XT             XT;
00025   typedef RR                           RL;
00026   
00027   typedef typename NTR::FIT            FIT;
00028   typedef typename NTR::XIT            XIT;
00029   typedef typename NTR::XIT            RIT;
00030   //  typedef typename NTR::RIT            RIT;
00031   
00032 
00033   typedef UPolDse<RT>    Poly;
00034   typedef UPolDse<RT>    RT_Poly;
00035   typedef UPolDse<FT>    FT_Poly;
00036 
00037   typedef UPolDse<XT>    FT_Poly;
00038   typedef UPolDse<RL>    RL_Poly;
00039 
00040   typedef ALGEBRAIC::root_of<RT, Poly>   RO_t;
00041   typedef ALGEBRAIC::root_of<RT, Poly>   solution_type;
00042 
00043   typedef SturmBz    self_t;
00044 
00045 };
00046 
00047 
00048 template < typename NT >
00049 Seq
00050 < 
00051   typename SturmBz<NT>::RO_t
00052 > 
00053 solve( const typename SturmBz<NT>::Poly& f,
00054        SturmBz<NT> )
00055 {
00056   typedef SturmBz<NT>    K;
00057   typedef typename K::RO_t          RO_t;
00058 
00059   Seq<RO_t> sol;
00060   ALGEBRAIC::solve_sturm_bezier(f, std::back_inserter(sol.rep()), K());
00061   
00062   std::stable_sort( sol.begin(), sol.end(), ALGEBRAIC::Refine_compare());
00063     
00064   return sol;
00065 }
00066 
00067 __END_NAMESPACE_SYNAPS
00068 
00069 #endif // _SYNAPS_SOLVE_STURMBZ_H_
00070 
00071     

SYNAPS DOCUMENTATION
logo