synaps/mpol/dynamicexp.h

00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS kernel.        *
00003 *   Author(s): B. Mourrain, GALAAD, INRIA                            *
00004 **********************************************************************
00005 $Id: dynamicexp.h,v 1.1 2005/07/11 11:17:56 mourrain Exp $
00006 **********************************************************************/
00007 #ifndef synaps_mpol_dynamicexp_h_
00008 #define synaps_mpol_dynamicexp_h_
00009 
00010 #include <stdlib.h>
00011 #include <iostream>
00012 #include <string>
00013 #include <iterator>
00014 #include <cassert>
00015 #include <synaps/init.h>
00016 #include <synaps/arithm/REF.h>
00017 #include <synaps/base/COUNT.h>
00018 #include <synaps/linalg/VECTOR.m>
00019 
00020 
00021 __BEGIN_NAMESPACE_SYNAPS
00022 
00024 template<class E=unsigned>
00025 struct dynamicexp {
00026 
00027   typedef E            value_type;
00028   typedef unsigned int size_type;
00029   typedef E*           iterator;
00030   typedef iterator     const_iterator;
00031   typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
00032   typedef std::reverse_iterator<iterator>        reverse_iterator;
00033 
00034   typedef E   exponent_t;
00035   typedef int degree_t;
00036   typedef dynamicexp<E> self_t;
00037 
00038   // constructors
00039   dynamicexp():_size(0),_tab(NULL){}
00040   dynamicexp(const dynamicexp<E> & d):_size(d._size){
00041         //    cout <<"Copy "<<d<<" ";
00042         if (_size) {
00043           _tab = dynamicexp<E>::alloc(_size);
00044           memcpy(_tab,d._tab,sizeof(E)*_size);
00045         }
00046         else
00047           _tab = NULL;
00048         //    cout <<*this<<endl;
00049   }
00050 
00051   dynamicexp(int s): _size(s){
00052         //    cout <<"C "<<s<<endl;
00053         _tab = dynamicexp<E>::alloc(s);
00054         for(int i=0;i<s;i++) _tab[i]=(exponent_t)0;
00055         //    cout <<*this<<endl;
00056   }
00057 
00058   dynamicexp(int s, E *t): _size(s){
00059         assert(s <= sizeof(t)/sizeof(E));
00060         _tab = dynamicexp<E>::alloc(_size);
00061         for(int i=0;i<s;i++) _tab[i]=t[i];
00062   }
00063 
00064   template<class S>
00065         self_t & operator =(const VAL<S> & M)
00066         {
00067           if (this == &(M.rep())) { return *this; }
00068           assign(*this,M.rep());
00069           return *this;
00070         }
00071 
00072   // destructor
00073   ~dynamicexp(){if (_tab) delete [] _tab;}
00074 
00075   size_type size() const {return _size;}
00076 
00077   iterator        begin()       {return iterator(_tab); }
00078   const_iterator  begin() const {return const_iterator(_tab); }
00079   iterator        end()         {return iterator(_tab+_size); }
00080   const_iterator  end()   const {return const_iterator(_tab+_size); }
00081 
00082   reverse_iterator       rbegin()       {return reverse_iterator(_tab+_size); }
00083   const_reverse_iterator rbegin() const {return reverse_iterator(_tab+_size); }
00084   reverse_iterator       rend()         {return reverse_iterator(_tab); }
00085   const_reverse_iterator rend()   const {return reverse_iterator(_tab); }
00086 
00087   E   operator[] ( size_type i) const {
00088         //    if(i<0) cout <<"("<<*this<<"["<<i<<"])";
00089     return (i<_size?_tab[i]:0); 
00090   }
00091   E & operator[] (size_type i) { assert(i<_size);return _tab[i];}
00092 
00093   // affectation operator
00094   self_t& operator = (const self_t & A) {
00095         if (&A == this) { return *this; }
00096         if (_tab != NULL) {
00097           // cout << "sz = " << sizeof( _tab) << " " << _size << endl;
00098           // for (int kk = 0; kk < _size; ++kk) {
00099           //   cout << _tab[kk] << " ";
00100           // } cout << endl;
00101           delete [] _tab;
00102         }
00103         _size = A._size;
00104         if (_size) {
00105           _tab = dynamicexp<E>::alloc(_size);
00106           memcpy(_tab,A._tab,sizeof(E)*_size);
00107         }
00108         else
00109           _tab = NULL;
00110         return *this;
00111   }
00112 
00113   //  self_t & operator+= (const self_t & B);
00114 
00115   void reserve(size_type s)
00116   {
00117         if (!s) {
00118           if (_size) { delete [] _tab; }
00119           _size = 0;
00120           _tab = NULL;
00121         }
00122         else if(_tab==NULL) {
00123           _size = s;_tab = dynamicexp<E>::alloc(s);
00124           //for(size_type i=0;i<s;i++) _tab[i]=(exponent_t)0;
00125         }
00126         else {
00127           delete [] _tab;
00128           _tab = dynamicexp<E>::alloc(s);
00129           _size=s;
00130         }
00131   }
00132   void resize(size_type s)
00133   {
00134         if(s<=_size)
00135           _size = s;
00136         else{
00137           E* _tmp =_tab;
00138           _tab = dynamicexp<E>::alloc(s);
00139           for(size_type i =0;i<_size;i++) _tab[i]=_tmp[i];
00140           for(size_type i =_size;i<s;i++) _tab[i]=0;
00141           delete [] _tmp;
00142           _size=s;
00143         }
00144   }
00145 
00146 
00147   void init(int s)
00148   {
00149         if (_size) { delete [] _tab; }
00150         _size= s;
00151         _tab = dynamicexp<E>::alloc(s);
00152   }
00153 
00154   self_t& setExponent(size_type i, value_type d);
00155 
00156   friend bool operator == (const dynamicexp & A, const dynamicexp & B) {
00157         int i,minsize=std::min(A._size,B._size);
00158         for(i=0;i<minsize;i++)
00159           if(A._tab[i]!=B._tab[i]) return 0;
00160         if(A._size>B._size)
00161         {
00162           for(;i<(int)A._size;i++)
00163                 if(A._tab[i]) return 0;
00164         }
00165         else
00166         {
00167           for(;i<(int)B._size;i++)
00168                 if(B._tab[i]) return 0;
00169 
00170         }
00171         //        if (A._size == B._size)
00172         //     return memcmp(A._tab,B._tab,sizeof(E)*A._size) == 0;
00173         return 1;
00174   }
00175   friend bool operator != (const dynamicexp & A, const dynamicexp & B) {
00176         return !(A==B);
00177   }
00178   // Data
00179   size_type _size;
00180   E*        _tab;
00181 
00182   static E* alloc(unsigned int N)
00183   {return (new E[N]);}
00184   //{return (E *)malloc(sizeof(E)*N);}
00185   void clear() {delete[] _tab;}
00186   //{free(_tab); }
00187 
00188 };
00189 //----------------------------------------------------------------------
00190   template<class E> inline
00191 typename dynamicexp<E>::degree_t degree(const dynamicexp<E> & t)
00192 {
00193   typename dynamicexp<E>::degree_t d(0);
00194   for (typename dynamicexp<E>::size_type i = 0; i < t._size; ++i) d+=t[i];
00195   return(d);
00196 }
00197 //----------------------------------------------------------------------
00198 template<class E>
00199 std::ostream & operator << (std::ostream & os, const dynamicexp<E> & t) {
00200   bool first=true;
00201   if(t._size)
00202         for (typename dynamicexp<E>::size_type i = 0; i < t._size; ++i)
00203         {
00204           if (t[i] == 1){
00205                 if(first) first=false; else os <<"*";
00206                 os <<'X'<< i;
00207           }else if (t[i] == 0);
00208           else {
00209                 if(first) first=false; else os <<"*";
00210                 os <<"X"<< i << '^' <<(int)(t[i]);
00211           }
00212         }
00213   return os;
00214 }
00215 //----------------------------------------------------------------------
00216   template<class E>
00217 dynamicexp<E>& dynamicexp<E>::setExponent(size_type i, value_type d)
00218 {
00219   assert(i<_size);
00220   (*this)[i]=d;
00221 
00222   //  while(_tab[_size-1]==0 && _size>0) _size--;
00223 
00224   //    if (i < 0);
00225   //    else if (i+1 < _size)
00226   //            _tab[i] = d;
00227   //    else if (i >= _size && d) {
00228   //            E* aux = dynamicexp<E>::alloc(i+1);
00229   //            memset(aux,0,sizeof(E)*(i+1));
00230   //            memcpy(aux,_tab,sizeof(E)*_size);
00231   //            //memset(aux+size,0,i-size);
00232   //            aux[i] = d;
00233   //            delete [] _tab;
00234   //            _tab = aux;
00235   //            //realloc(_tab,sizeof(E)*(i+1));
00236   //            //memset(_tab+size,0,i-size);
00237   //            //_tab[i] = d;
00238   //            _size = i+1;
00239   //    }
00240   //    else if (i >= _size && !d);
00241   //    else if (d)
00242   //            _tab[i] = d;
00243   //    else {
00244   //            int j = i - 1;
00245   //            while (j >= 0 && !_tab[j]) --j;
00246   //            _size = j+1;
00247   //            if (j < 0) {
00248   //                    clear();
00249   //                    _tab = NULL;
00250   //            }
00251   //            else {
00252   //                    E * aux = dynamicexp<E>::alloc(j+1);
00253   //                    memcpy(aux,_tab,sizeof(E)*(j+1));
00254   //                    clear();
00255   //                    _tab = aux;
00256   //            }
00257   //    }
00258   return *this;
00259 }
00260 //----------------------------------------------------------------------
00261 template<class E>
00262 int lvar (const dynamicexp<E> & A) {
00263   int r=A._size-1;
00264   while(r>=0 && (A[r]==0)) r--;
00265   return r;
00266 }
00267 //----------------------------------------------------------------------
00268 template<class E>
00269 void erase (dynamicexp<E> & A) {
00270   A.clear();
00271   A._tab = NULL;
00272   A._size = 0;
00273 }
00274 //----------------------------------------------------------------------//
00275 template <class E>
00276   inline VAL<OP<'+',dynamicexp<E>,dynamicexp<E> > >
00277 operator+(const dynamicexp<E> & a, const dynamicexp<E> & b)
00278 {
00279   return VAL<OP<'+',dynamicexp<E>,dynamicexp<E> > >
00280         (OP<'+',dynamicexp<E>,dynamicexp<E> >(a,b));
00281 }
00282 //----------------------------------------------------------------------//
00283 template <class E> inline
00284 void assign(dynamicexp<E> & a,
00285         const OP<'+',dynamicexp<E>,dynamicexp<E> > & M)
00286 {
00287   add(a,M.op1,M.op2);
00288 }
00289 //----------------------------------------------------------------------//
00290 template<class E>
00291 void add (dynamicexp<E> & r,
00292         const dynamicexp<E> & A, const dynamicexp<E> & B);
00293 //----------------------------------------------------------------------//
00294 template<class E>
00295 void add (dynamicexp<E> & r, 
00296           const dynamicexp<E> & A, 
00297           const dynamicexp<E> & B)
00298 {
00299   r.init(std::max(A.size(),B.size()) );
00300   VECTOR::add(r,A,B);
00301 }
00302 //----------------------------------------------------------------------//
00303 __END_NAMESPACE_SYNAPS
00304 //----------------------------------------------------------------------//
00305 #endif // synaps_mpol_dynamicexp_h_
00306 

SYNAPS DOCUMENTATION
logo