00001 #ifndef SYNAPS_MPOLDSE_VIEW_H
00002 #define SYNAPS_MPOLDSE_VIEW_H
00003
00004 #include <synaps/init.h>
00005 #include <synaps/base/shared_object.h>
00006 #include <synaps/arithm/traits.h>
00007 #include <synaps/arithm/texp.h>
00008 #include <synaps/mpol/MPol.h>
00009 #include <synaps/mpol/mpoldse/monomial.h>
00010 #include <synaps/mpol/mpoldse/bernstein.h>
00011
00012 __BEGIN_NAMESPACE_SYNAPS
00018 template< class C, class R = mpoldse::monomial<C> >
00019 struct MPolDse
00020 {
00021 typedef C value_type;
00022 typedef C coeff_t;
00023 typedef typename R::size_type size_type;
00024 typedef R rep_type;
00025 typedef typename R::iterator iterator;
00026 typedef typename R::const_iterator const_iterator;
00027 typedef MPolDse<C,R> self_t;
00028 shared_object<R> data;
00029 R & rep() { return (*data);}
00030 const R & rep() const { return (*data);}
00031 MPolDse( int nvr, const int * szs, const int * vrs );
00032 MPolDse( const C& x = 0 );
00033 template<class O, class E>
00034 MPolDse( const MPol<C,O,E>& mpol );
00035 MPolDse( const char * s ) ;
00036 template<class X>
00037 MPolDse( const X& x );
00038
00039 iterator begin() {return rep().begin();}
00040 const_iterator begin() const {return rep().begin();}
00041 iterator end() {return rep().end();}
00042 const_iterator end() const {return rep().end();}
00043
00044 bool operator==( const C& c ) const;
00045 bool operator==( const MPolDse& mp ) const;
00046
00047 MPolDse & operator=( const char * name);
00048 template<class X>
00049 MPolDse & operator= ( const X & x );
00050
00051 template<class O, class E>
00052 MPolDse& operator = ( const MPol<C,O,E>& mpol );
00053 template<class X>
00054 MPolDse& operator+= ( const X & x )
00055 {
00056 *this = *this + x; return *this;
00057 } ;
00058
00059 MPolDse& operator+= ( const MPolDse& );
00060 MPolDse& operator+= ( const C& );
00061 template<class X>
00062 MPolDse& operator-= ( const X & x ) { *this = *this - x; return *this; };
00063 MPolDse& operator-= ( const MPolDse& );
00064 MPolDse& operator-= ( const C& );
00065 template<class X>
00066 MPolDse& operator*= ( const X & x ) { *this = *this * x; return *this; };
00067 MPolDse& operator*= ( const C& );
00068 MPolDse& operator*= ( const MPolDse& );
00069 const int * vrs() const { return rep().env.vrs(); };
00070 const int * szs() const { return rep().env.szs(); };
00071 int nvars() const;
00072 int nvr() const { return nvars(); };
00073 int varid( int i ) const;
00074 const C& operator[]( int i ) const;
00075 C& operator[]( int i ) ;
00076
00077
00078 };
00079
00080 template<class C, class R>
00081 int nbvar( const MPolDse<C,R>& mp ) { return mp.nvr(); };
00082 template<class C, class R>
00083 std::ostream& operator<<( std::ostream& o, const MPolDse<C,R>& mp );
00084 template<class C, class R>
00085 bool operator==( const C& c, const MPolDse<C,R>& mp );
00086 template<class C, class R>
00087 MPolDse<C,R> operator^( const MPolDse<C,R>& a, unsigned n );
00088
00089
00090
00091
00092
00098 template<class Coeff, class Rep>
00099 void diff( MPolDse<Coeff,Rep>& derivative, const MPolDse<Coeff,Rep>& polynom, int v );
00100
00107 template<class Result, class Coeff, class Rep, class Parameters>
00108 void eval( Result& result, const MPolDse<Coeff,Rep>& polynom, const Parameters& parameters ) ;
00109
00110 template<class It>
00111 void MPolDseSystem( It b, It e )
00112 {
00113 mpoldse::eenv tmp(b->rep().env);
00114 It i = b;
00115 i++;
00116 for ( ; i != e; i ++ )
00117 tmp = mpoldse::eenv::mrgvrs(tmp,i->rep().env);
00118 for ( i = b; i != e; i ++ )
00119 i->rep().env = mpoldse::eenv::rewrite(tmp,i->rep().env);
00120 };
00121
00122 template<class C, class R>
00123 void subs0( MPolDse<C,R>& a, const MPolDse<C,R>& b, const C& v )
00124 {
00125
00126 };
00127
00128 __END_NAMESPACE_SYNAPS
00129
00130 #include "mpoldse/MPolDse.C"
00131
00132 #endif