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
00058 string name;
00059
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
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
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
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
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