synaps/usolve/SturmMem.h

00001 #ifndef _synaps_solve_SturmMem_H_
00002 #define _synaps_solve_SturmMem_H_
00003 
00004 #include <synaps/init.h>
00005 #include <synaps/usolve/Algebraic.h>
00006 #include <synaps/usolve/solver_base.h>
00007 #include <synaps/usolve/sturm/common.h>
00008 
00009 __BEGIN_NAMESPACE_SYNAPS
00010 
00011 template < typename NT >
00012 struct SturmMem : public solver_base
00013 {
00014   
00015   typedef NumberTraits<NT>             NTR;
00016   
00017   typedef typename NTR::RT             RT;
00018   typedef typename NTR::FT             FT;
00019   typedef typename NTR::XT             XT;
00020   typedef RR                           RL;
00021   
00022   typedef typename NTR::FIT            FIT;
00023   typedef typename NTR::XIT            XIT;
00024   typedef typename NTR::XIT            RIT;
00025   //  typedef typename NTR::RIT            RIT;
00026   
00027 
00028   typedef UPolDse<RT>    Poly;
00029   typedef UPolDse<RT>    RT_Poly;
00030   typedef UPolDse<FT>    FT_Poly;
00031 
00032   typedef UPolDse<XT>    XT_Poly;
00033   typedef UPolDse<RL>    RL_Poly;
00034 
00035   typedef ALGEBRAIC::root_of<RT, Poly>   RO_t;
00036   typedef ALGEBRAIC::root_of<RT, Poly>   solution_type;
00037 
00038 
00039   typedef SturmMem    self_t;
00040 
00041   //  std::map<Poly,SturmSeq<NT> > mem_;
00042   SturmSeq<NT> mem_;
00043 };
00044 
00045 
00046 template < typename UPOL, typename NT >
00047 Seq
00048 < 
00049   typename SturmMem<NT>::RO_t
00050 > 
00051 solve( const UPOL& F,
00052        SturmMem<NT>& mth,
00053        const typename SturmMem<NT>::FT& a, 
00054        const typename SturmMem<NT>::FT& b
00055      )
00056 {
00057   typedef SturmMem<NT>    K;
00058   typedef typename K::RT    RT;
00059   typedef typename K::FT    FT;
00060   typedef typename K::FIT   FIT;
00061   typedef typename K::RO_t  RO_t;
00062   typedef typename K::Poly  Poly;
00063   typedef typename K::RO_t  RO_t;
00064   typedef typename K::Poly  poly_t;
00065   typedef typename Poly::coeff_t  CF_T;
00066 
00067 
00068   Seq<RO_t> sol;
00069   poly_t f; let::assign(f,F);
00070 
00071   SturmSeq<CF_T>   sth;
00072   if(mth.mem_.size()==0)
00073     {
00074       mth.mem_ = SturmSeq<CF_T>(f,diff(f),HABICHT());
00075       sth=mth.mem_;
00076     }
00077   else
00078     sth=mth.mem_;
00079     
00080   FIT I(a, b);
00081   sturm_rootof( sth, I, 1, std::back_inserter(sol.rep()), K());
00082 
00083 
00084   return sol;
00085 }
00086 
00087 __END_NAMESPACE_SYNAPS
00088 
00089 #endif // _synaps_solve_SturmMem_H_
00090 
00091     

SYNAPS DOCUMENTATION
logo