fast_polynom_pair.h

Go to the documentation of this file.
00001 
00002 #pragma once
00003 
00004 #if _MSC_VER > 1000
00005 #pragma once
00006 #endif // _MSC_VER > 1000
00007 
00008 
00009 #include <fstream>
00010 #include <iostream>
00011 #include <assert.h>
00012 
00013 
00024 using namespace std;
00025 
00026 
00028 
00039 template <class defs,class TNum>
00040 class fast_polynomXY_pair  
00041 {
00042 private:
00043         const short maxDegree;
00044         const short maxDegreePlusOne;
00045 
00046 public:
00047         TNum * const koeff; 
00048 
00049 
00052                 fast_polynomXY_pair(short _degree);
00053                 fast_polynomXY_pair(string _name,short _degree);
00054                 virtual ~fast_polynomXY_pair();
00057 //#ifdef CF_TEST
00058                 string name;
00059         //#endif
00060 
00061 
00064                 inline void clear(short _degree);
00065                 inline void clear();
00070                 inline void setCoeff(const short x_exp,const short y_exp, P_or_QPolynom p_or_q,TNum value) ;
00071                 inline void setFirstCoeff(const short x_exp,const short y_exp, TNum value) ;
00072                 inline void setSecondCoeff(const short x_exp,const short y_exp, TNum value) ;
00073                 
00078                 // sollte nicht nur getKoeff liefern, sondern auch  auch getREf, oder?
00079                 inline TNum getCoeff(const short x_exp,const short y_exp, P_or_QPolynom p_or_q) ;
00080                 inline TNum const *     getCoeffConstAddr(const short x_exp,const short y_exp) const;
00081                 inline TNum *           getCoeffAddr(const short x_exp,const short y_exp);
00082                 inline TNum *           getCoeffGroupAddr(const short degree);
00083                 inline TNum const *     getCoeffGroupConstAddr(const short degree);
00088                 void outputMatrix(std::ostream& os) ;
00089                 void outputMatrix()  { outputMatrix(std::cerr); } ;
00090                 #ifdef DEBUG
00091                         void output(std::ostream& os) const;
00092                         void output() const {output(std::cerr);} ;
00093                         
00094                 #endif
00095 
00099                 #ifdef SAFE
00100 
00101                         inline void testbounds(const short x_exp,const short y_exp) const;
00102                 #endif
00103 
00105 };
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 #ifdef SAFE
00120 
00121 template <class defs,class TNum>
00122 inline void fast_polynomXY_pair<defs,TNum>::testbounds(const short x_exp,const short y_exp) const
00123         {       
00124                 assert(x_exp + y_exp<=maxDegree);
00125                 assert(x_exp>=0 && y_exp>=0);
00126         }
00127 
00128 #endif
00129 
00130 template <class defs,class TNum>
00131 inline TNum const * fast_polynomXY_pair<defs,TNum>::getCoeffConstAddr(const short x_exp,const short y_exp) const
00132 {
00133         #ifdef SAFE
00134                 testbounds(x_exp,y_exp);
00135         #endif
00136 
00137         #ifdef COUNT    
00138                 memRef+=1;
00139         #endif
00140 
00141         return &(koeff[defs::getPairIndex(x_exp,y_exp)]);
00142 }
00143 
00144 
00145 template <class defs,class TNum>
00146 inline void  fast_polynomXY_pair<defs,TNum>::setCoeff(const short x_exp,const short y_exp, P_or_QPolynom p_or_q,TNum value) 
00147 {
00148         #ifdef SAFE
00149                 testbounds(x_exp,y_exp);
00150         #endif
00151 
00152         #ifdef COUNT    
00153                 memRef+=1;
00154         #endif
00155         if (p_or_q==PCoefficient)
00156                 setFirstCoeff(x_exp,y_exp,value);
00157         else
00158                 setSecondCoeff(x_exp,y_exp,value);
00159 
00160 }
00161 
00162 template <class defs,class TNum>
00163         inline TNum  fast_polynomXY_pair<defs,TNum>::getCoeff(const short x_exp,const short y_exp, P_or_QPolynom p_or_q) 
00164 {
00165         if (p_or_q==PCoefficient)
00166                 return koeff[defs::getPairIndex(x_exp,y_exp)];
00167         else
00168                 return koeff[defs::getPairIndex(x_exp,y_exp)+1];
00169 }
00170 
00171 
00172 template <class defs,class TNum>
00173 inline void  fast_polynomXY_pair<defs,TNum>::setFirstCoeff(const short x_exp,const short y_exp, TNum value) 
00174 {
00175         #ifdef SAFE
00176                 testbounds(x_exp,y_exp);
00177         #endif
00178 
00179         #ifdef COUNT    
00180                 memRef+=1;
00181         #endif
00182 
00183         (koeff[defs::getPairIndex(x_exp,y_exp)])=value;
00184 }
00185 
00186 template <class defs,class TNum>
00187 inline void  fast_polynomXY_pair<defs,TNum>::setSecondCoeff(const short x_exp,const short y_exp, TNum value) 
00188 {
00189         #ifdef SAFE
00190                 testbounds(x_exp,y_exp);
00191         #endif
00192 
00193         #ifdef COUNT    
00194                 memRef+=1;
00195         #endif
00196         TNum* addr=getCoeffAddr(x_exp,y_exp);
00197         addr++;
00198         *addr=value;
00199 }
00200 
00201 
00202 template <class defs,class TNum>
00203 inline TNum* fast_polynomXY_pair<defs,TNum>::getCoeffAddr(const short x_exp,const short y_exp)
00204 {
00205         #ifdef SAFE
00206                 testbounds(x_exp,y_exp);
00207         #endif
00208 
00209         #ifdef COUNT    
00210                 memRef+=1;
00211         #endif
00212 
00213         return &(koeff[defs::getPairIndex(x_exp,y_exp)]);
00214 }
00215 
00217 template <class defs,class TNum>
00218 inline TNum* fast_polynomXY_pair<defs,TNum>::getCoeffGroupAddr(const short degree)
00219 {
00220         #ifdef SAFE
00221                 //testbounds(x_exp,y_exp);
00222         #endif
00223 
00224         #ifdef COUNT    
00225                 memRef+=1;
00226         #endif
00227 
00228         return &(koeff[defs::getGroupIndex(degree)]);
00229 }
00230 
00231 template <class defs,class TNum>
00232 inline TNum const * fast_polynomXY_pair<defs,TNum>::getCoeffGroupConstAddr(const short degree)
00233 {
00234         #ifdef SAFE
00235                 //testbounds(x_exp,y_exp);
00236         #endif
00237 
00238         #ifdef COUNT    
00239                 memRef+=1;
00240         #endif
00241 
00242         return &(koeff[defs::getGroupIndex(degree)]);
00243 }
00244 
00245 
00246 template <class defs,class TNum>
00247 inline void fast_polynomXY_pair<defs,TNum>::clear(short _degree)
00248 {
00249         for (register short i=0; i<= _degree; ++i)
00250                 for(register short j=0; j<=i; ++j)
00251                 {
00252                         koeff[defs::getPairIndex(i-j,j)]=TNum::Zero;
00253                         koeff[defs::getPairIndex(i-j,j)+1]=TNum::Zero;
00254                         #ifdef COUNT
00255                                 memAccess+=1;
00256                         #endif 
00257                 }
00258 
00259 }
00260 
00261 template <class defs,class TNum>
00262 inline void fast_polynomXY_pair<defs,TNum>::clear()
00263 {
00264 
00265         if ( TNum::memsetClearAllowed() )
00266 
00267                 memset(koeff ,0x00,defs::size_m*sizeof(TNum));
00268         else
00269                 for (int dim=0; dim<defs::size_m ; dim++)
00270                         koeff[dim]=TNum::Zero;
00271 
00272         #ifdef COUNT
00273                 memAccess+=defs::size;
00274         #endif 
00275 }
00276  
00277 
00278 template <class defs,class TNum>
00279 fast_polynomXY_pair< defs, TNum>::fast_polynomXY_pair(short _degree):maxDegree(_degree),maxDegreePlusOne(_degree+1),koeff( new TNum[defs::size_m] )
00280 {
00281         #ifdef CF_TEST
00282                 name="";
00283         #endif
00284         
00285         assert(defs::maxdegree_m>=maxDegree && maxDegree >=0);
00286 
00287         if ( TNum::memsetClearAllowed() )
00288                         memset(koeff ,0x00,defs::size_m*sizeof(TNum));
00289 
00290         else    for (short dim=defs::size_m - 1; dim>=0; dim--)
00291                         koeff[dim]=TNum::Zero;
00292 
00293         #ifdef COUNT
00294                 memAccess+=defs::size_m;
00295         #endif 
00296 }
00297 
00298 
00299 template <class defs,class TNum>
00300 fast_polynomXY_pair< defs, TNum>::fast_polynomXY_pair(string _name,short _degree):maxDegree(_degree),maxDegreePlusOne(_degree+1),koeff( new TNum[defs::size_m] )
00301 {
00302         #ifdef CF_TEST
00303                 name=_name;
00304         #endif
00305                 
00306         assert(defs::maxdegree_m>=maxDegree);
00307 
00308         if ( TNum::memsetClearAllowed() )
00309                 memset(koeff ,0x00,defs::size_m*sizeof(TNum));
00310                                 
00311         else
00312                 for (short dim=defs::size_m-1; dim>=0; dim--)
00313                         koeff[dim]=TNum::Zero;
00314         
00315 
00316         #ifdef COUNT
00317                 memAccess+=defs::size_m;
00318         #endif 
00319 }
00320 
00321 
00322 
00323 template <class defs,class TNum>
00324 fast_polynomXY_pair< defs, TNum>::~fast_polynomXY_pair()
00325 {
00326         delete[] koeff;
00327 }
00328 
00329 
00330 
00331 
00332 #ifdef DEBUG
00333 template <class defs,class TNum>
00334 void fast_polynomXY_pair<defs,TNum>::output(ostream & os) const
00335 {
00336         int i, j;
00337         TNum* addr;
00338         for (i=0; i<=maxDegree; i++)
00339                 for(j=0; j<=i; j++)
00340                 {
00341                         addr=(getCoeffAddr(i-j, j)); 
00342                         TNum z=*addr; 
00343                         if ( z.isNotZero() )
00344                                 os << z << " + " ;
00345                 }
00346 }
00347 
00348 #endif
00349 
00352 template <class defs,class TNum>
00353 void fast_polynomXY_pair<defs,TNum>::outputMatrix(ostream &os) 
00354 {
00355         int i, j;
00356         TNum z;
00357         os << std::endl;
00358 
00359         #ifdef CF_TEST
00360                 //os <<"Name: " << name  ;
00361         #endif
00362 
00363         TNum* addr;
00364         os << "dxa:" << std::endl;
00365         for (i=0; i<=maxDegree; i++)
00366         {
00367                 os << "d:" << i << " ";
00368                 for(j=0; j<=i; j++)
00369                 {
00370                         addr=(getCoeffAddr(i-j, j)); 
00371                         z =*addr; 
00372                         if ( z.isNotZero() )
00373                                 os << z << " + " ;
00374                 }
00375                 os << std::endl;
00376         }
00377 
00378         os << "dya:" << std::endl;
00379         
00380         for (i=0; i<=maxDegree; i++)
00381         {
00382                 os << "d:" << i << " ";
00383                 for(j=0; j<=i; j++)
00384                 {
00385                         addr = (getCoeffAddr(i-j, j)); 
00386                         addr++;
00387                         z=*addr;
00388                         if ( z.isNotZero() )
00389                                 os << z << " + " ;
00390                 }
00391                 os << std::endl;
00392         }
00393 }
00394 
00395 
Generated on Tue Nov 23 13:10:51 2010 for centerfocus by  doxygen 1.6.3