Xmipp  v3.23.11-Nereus
Classes | Public Member Functions | Static Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | List of all members
Polynomial Class Reference

#include <Poly.h>

Inheritance diagram for Polynomial:
Inheritance graph
[legend]
Collaboration diagram for Polynomial:
Collaboration graph
[legend]

Classes

struct  PolynomialDataTag
 

Public Member Functions

 Polynomial ()
 
 Polynomial (unsigned Dim, unsigned deg=0, double *data=0)
 
 Polynomial (unsigned Dim, double val)
 
 Polynomial (MultInd &)
 
 Polynomial (char *name)
 
unsigned dim ()
 
unsigned deg ()
 
unsigned sz ()
 
 operator double * () const
 
 ~Polynomial ()
 
 Polynomial (const Polynomial &A)
 
Polynomialoperator= (const Polynomial &A)
 
Polynomial clone ()
 
void copyFrom (Polynomial a)
 
Polynomial operator* (const double)
 
Polynomial operator/ (const double)
 
Polynomial operator+ (Polynomial)
 
Polynomial operator- (Polynomial)
 
Polynomial operator- (void)
 
Polynomial operator+ (void)
 
Polynomial operator+= (Polynomial)
 
Polynomial operator-= (Polynomial)
 
Polynomial operator*= (const double)
 
Polynomial operator/= (const double)
 
double shiftedEval (Vector Point, double minusVal)
 
double operator() (Vector)
 
Polynomial derivate (int i)
 
void gradient (Vector P, Vector G)
 
void gradientHessian (Vector P, Vector G, Matrix H)
 
void translate (Vector translation)
 
int operator== (const Polynomial q)
 
int equals (Polynomial q)
 
void print ()
 
void save (char *name)
 
void setFlag (unsigned int val)
 
void unsetFlag (unsigned int val)
 
unsigned queryFlag (unsigned int val)
 

Static Public Attributes

static const unsigned int NicePrint = 1
 
static const unsigned int Warning = 2
 
static const unsigned int Normalized = 4
 
static unsigned int flags = Polynomial::Warning||Polynomial::NicePrint
 
static Polynomial emptyPolynomial
 

Protected Types

typedef struct Polynomial::PolynomialDataTag PolynomialData
 

Protected Member Functions

void init (int _dim, int _deg, double *data=NULL)
 
void destroyCurrentBuffer ()
 

Protected Attributes

PolynomialDatad
 

Detailed Description

Definition at line 38 of file Poly.h.

Member Typedef Documentation

◆ PolynomialData

Constructor & Destructor Documentation

◆ Polynomial() [1/6]

Polynomial::Polynomial ( )
inline

Definition at line 54 of file Poly.h.

54 { init(0,0); };
void init(int _dim, int _deg, double *data=NULL)
Definition: Poly.cpp:43

◆ Polynomial() [2/6]

Polynomial::Polynomial ( unsigned  Dim,
unsigned  deg = 0,
double *  data = 0 
)

Definition at line 66 of file Poly.cpp.

67 {
68  init(Dim,Deg,data);
69 }
void init(int _dim, int _deg, double *data=NULL)
Definition: Poly.cpp:43

◆ Polynomial() [3/6]

Polynomial::Polynomial ( unsigned  Dim,
double  val 
)

Definition at line 71 of file Poly.cpp.

72 {
73  init(Dim,0,&val);
74 }
void init(int _dim, int _deg, double *data=NULL)
Definition: Poly.cpp:43

◆ Polynomial() [4/6]

Polynomial::Polynomial ( MultInd I)

Definition at line 76 of file Poly.cpp.

77 {
78  init(I.dim,I.len());
79  d->coeff[I.index()] = 1;
80 }
void init(int _dim, int _deg, double *data=NULL)
Definition: Poly.cpp:43
unsigned len()
Definition: MultInd.cpp:96
unsigned index()
Definition: MultInd.h:68
PolynomialData * d
Definition: Poly.h:49
unsigned dim
Definition: MultInd.h:53

◆ Polynomial() [5/6]

Polynomial::Polynomial ( char *  name)

Definition at line 588 of file Poly.cpp.

589 {
590  unsigned _dim,_deg;
591  std::ifstream ifp(name, std::ios::in | std::ios::binary);
592  ifp.read(reinterpret_cast<char*>(&_dim), sizeof(int));
593  ifp.read(reinterpret_cast<char*>(&_deg), sizeof(int));
594  init(_dim,_deg);
595  ifp.read(reinterpret_cast<char*>(d->coeff), d->n*sizeof(double));
596  ifp.close();
597 }
int in
void init(int _dim, int _deg, double *data=NULL)
Definition: Poly.cpp:43
PolynomialData * d
Definition: Poly.h:49

◆ ~Polynomial()

Polynomial::~Polynomial ( )

Definition at line 82 of file Poly.cpp.

83 {
85 }
void destroyCurrentBuffer()
Definition: Poly.cpp:87

◆ Polynomial() [6/6]

Polynomial::Polynomial ( const Polynomial A)

Definition at line 110 of file Poly.cpp.

111 {
112  // shallow copy
113  d=A.d;
114  (d->ref_count)++ ;
115 }
PolynomialData * d
Definition: Poly.h:49

Member Function Documentation

◆ clone()

Polynomial Polynomial::clone ( )

Definition at line 117 of file Poly.cpp.

118 {
119  // a deep copy
120  Polynomial m(d->dim,d->deg);
121  m.copyFrom(*this);
122  return m;
123 }
int m
PolynomialData * d
Definition: Poly.h:49

◆ copyFrom()

void Polynomial::copyFrom ( Polynomial  a)

Definition at line 125 of file Poly.cpp.

126 {
127  if (m.d->dim!=d->dim)
128  {
129  printf("poly: copyFrom: dim do not agree");
130  getchar(); exit(254);
131  }
132 
133  d->deg = mmax(d->deg,m.d->deg); // New degree
134  unsigned N1=sz(), N2=m.sz();
135  if (N1!=N2)
136  {
137  d->coeff=(double*)realloc(d->coeff,N2*sizeof(double));
138  d->n=m.d->n;
139  }
140  memcpy((*this),m,N2*sizeof(double));
141 }
unsigned sz()
Definition: Poly.h:64
int * mmax
int m
PolynomialData * d
Definition: Poly.h:49

◆ deg()

unsigned Polynomial::deg ( )
inline

Definition at line 63 of file Poly.h.

63 { return d->deg; };
PolynomialData * d
Definition: Poly.h:49

◆ derivate()

Polynomial Polynomial::derivate ( int  i)

Definition at line 469 of file Poly.cpp.

470 {
471  unsigned dim=d->dim, deg=d->deg;
472  if (deg<1) return Polynomial(dim,0.0);
473 
474  Polynomial r(dim, deg-1);
475  MultInd I( dim );
476  MultInd J( dim );
477  double *tS=(*this), *tD=r;
478  unsigned j=sz(), k, *cc, sum,
479  *allExpo=(unsigned*)I, *expo=allExpo+i, *firstOfJ=(unsigned*)J;
480 
481  while (j--)
482  {
483  if (*expo)
484  {
485  (*expo)--;
486 
487  sum=0; cc=allExpo; k=dim;
488  while (k--) sum+=*(cc++);
489  if (sum) k=choose( sum-1+dim, dim ); else k=0;
490  J.resetCounter(); *firstOfJ=sum;
491  while (!(J==I)) { k++; J++; }
492 
493  (*expo)++;
494  tD[k]=(*tS) * (double)*expo;
495  }
496  tS++;
497  I++;
498  }
499  return r;
500 }
unsigned sz()
Definition: Poly.h:64
unsigned long choose(unsigned n, unsigned k)
Definition: tools.cpp:38
unsigned dim()
Definition: Poly.h:62
unsigned deg()
Definition: Poly.h:63
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define j
PolynomialData * d
Definition: Poly.h:49
Polynomial()
Definition: Poly.h:54

◆ destroyCurrentBuffer()

void Polynomial::destroyCurrentBuffer ( )
protected

Definition at line 87 of file Poly.cpp.

88 {
89  if (!d) return;
90  (d->ref_count) --;
91  if (d->ref_count==0)
92  {
93  if (d->coeff) free(d->coeff);
94  free(d);
95  }
96 }
free((char *) ob)
PolynomialData * d
Definition: Poly.h:49

◆ dim()

unsigned Polynomial::dim ( )
inline

Definition at line 62 of file Poly.h.

62 { return d->dim; };
PolynomialData * d
Definition: Poly.h:49

◆ equals()

int Polynomial::equals ( Polynomial  q)

Definition at line 305 of file Poly.cpp.

306 {
307  if (d==q.d) return 1;
308  if ( (d->deg != q.d->deg) || (d->dim != q.d->dim) ) return 0;
309 
310  unsigned N = sz();
311  double *tp = (*this),*tq = q;
312 
313  while (N--)
314  if ( *(tp++) != *(tq++) ) return 0;
315 
316  return 1;
317 }
unsigned sz()
Definition: Poly.h:64
PolynomialData * d
Definition: Poly.h:49

◆ gradient()

void Polynomial::gradient ( Vector  P,
Vector  G 
)

Definition at line 502 of file Poly.cpp.

503 {
504  unsigned i=d->dim;
505  G.setSize(i);
506  double *r=G;
508  {
509  memcpy(r,d->coeff+1,i*sizeof(double));
510  return;
511  }
512  while (i--) r[i]=(derivate(i))(P);
513 }
int equals(const Vector Q)
Definition: Vector.cpp:135
#define i
void setSize(int _n)
Definition: Vector.cpp:112
Polynomial derivate(int i)
Definition: Poly.cpp:469
PolynomialData * d
Definition: Poly.h:49
static Vector emptyVector
Definition: Vector.h:119

◆ gradientHessian()

void Polynomial::gradientHessian ( Vector  P,
Vector  G,
Matrix  H 
)

Definition at line 515 of file Poly.cpp.

516 {
517  unsigned dim=d->dim;
518  G.setSize(dim);
519  H.setSize(dim,dim);
520  double *r=G, **h=H;
521  unsigned i,j;
522 
523  if (d->deg==2)
524  {
525  double *c=d->coeff+1;
526  memcpy(r,c,dim*sizeof(double));
527  c+=dim;
528  for (i=0; i<dim; i++)
529  {
530  h[i][i]=2* *(c++);
531  for (j=i+1; j<dim; j++)
532  h[i][j]=h[j][i]=*(c++);
533  }
534  if (P.equals(Vector::emptyVector)) return;
535  G+=H.multiply(P);
536  return;
537  }
538 
539  Polynomial *tmp=new Polynomial[dim], a;
540  i=dim;
541  while (i--)
542  {
543  tmp[i]=derivate(i);
544  r[i]=(tmp[i])(P);
545  }
546 
547  i=dim;
548  while (i--)
549  {
550  j=i+1;
551  while (j--)
552  {
553  a=tmp[i].derivate(j);
554  h[i][j]=h[j][i]=a(P);
555  }
556  }
557 
558 // _CrtCheckMemory();
559 
560  delete []tmp;
561 }
doublereal * c
Matrix multiply(Matrix B)
Definition: Matrix.cpp:633
unsigned dim()
Definition: Poly.h:62
int equals(const Vector Q)
Definition: Vector.cpp:135
void setSize(int _nLine, int _nColumn)
Definition: Matrix.cpp:205
#define i
void setSize(int _n)
Definition: Vector.cpp:112
Polynomial derivate(int i)
Definition: Poly.cpp:469
#define j
PolynomialData * d
Definition: Poly.h:49
static Vector emptyVector
Definition: Vector.h:119
doublereal * a

◆ init()

void Polynomial::init ( int  _dim,
int  _deg,
double *  data = NULL 
)
protected

Definition at line 43 of file Poly.cpp.

44 {
45  int n;
46  d=(PolynomialData*)malloc(sizeof(PolynomialData));
47  if (_dim) n=d->n=choose( _dim+_deg, _dim );
48  else n=d->n=0;
49 
50  d->dim=_dim;
51  d->deg=_deg;
52  d->ref_count=1;
53 
54  if (n==0) { d->coeff=NULL; return; };
55 
56  d->coeff=(double*)malloc(n*sizeof(double));
57  if (d->coeff==NULL) { printf("memory allocation error\n"); getchar(); exit(253); }
58 
59  if (data) memcpy(d->coeff, data, d->n*sizeof(double));
60  else memset(d->coeff, 0, d->n*sizeof(double));
61 }
unsigned long choose(unsigned n, unsigned k)
Definition: tools.cpp:38
PolynomialData * d
Definition: Poly.h:49
struct Polynomial::PolynomialDataTag PolynomialData
int * n

◆ operator double *()

Polynomial::operator double * ( ) const
inline

Definition at line 65 of file Poly.h.

65 { return d->coeff; };
PolynomialData * d
Definition: Poly.h:49

◆ operator()()

double Polynomial::operator() ( Vector  Point)

Definition at line 393 of file Poly.cpp.

394 {
395 // I didn't notice any difference in precision:
396 // return simpleEval(P);
397 
398  unsigned dim=d->dim, deg=d->deg;
399  double r,r0; // no static here because of the 2 threads !
400  double rbuf[100]; // That should suffice // no static here because of the 2 threads !
401  double *rbufp = rbuf;
402  unsigned lsize = 100;
403  double *rptr;
404  int i,j;
405 
406  if (Point==Vector::emptyVector) return *d->coeff;
407  if (deg==0) return *d->coeff;
408 
409  if ( dim != (unsigned)Point.sz() )
410  {
411  printf( "Polynomial::operator()( Vector& ) : Improper size\n");
412  getchar(); exit(-1);
413  }
414 
415  if ( !sz() )
416  {
417  if ( queryFlag( Warning ) )
418  {
419  printf( "Polynomial::operator()( Vector& ) : evaluating void polynomial\n");
420  }
421  return 0;
422  }
423 
424  if ( dim > lsize ) // Someone must be crazy !!!
425  {
426  if ( queryFlag( Warning ) )
427  {
428  printf( "Polynomial::operator()( Vector& ) : Warning -> 100 variables\n");
429  }
430 
431  lsize=dim;
432  rbufp = (double*)malloc(lsize*sizeof(double)); // So be it ...
433 
434  if ( !rbufp )
435  {
436  printf( "Polynomial::operator()( Vector& ) : Cannot allocate <rbufp>\n");
437  getchar(); exit( -1 );
438  }
439  }
440 
441  // Initialize
442  MultInd *mic=cacheMultInd.get( dim, deg );
443  unsigned *nextI=mic->indexesOfCoefInLexOrder(),
444  *lcI=mic->lastChanges();
445  double *cc = (*this), *P=Point;
446  unsigned nxt, lc;
447 
448  // Empty buffer (all registers = 0)
449  memset(rbufp,0,dim*sizeof(double));
450 
451  r0=cc[*(nextI++)];
452  i=sz()-1;
453  while (i--)
454  {
455  nxt= *(nextI++);
456  lc = *(lcI++);
457 
458  r=r0; rptr=rbufp+lc; j=dim-lc;
459  while (j--) { r+=*rptr; *(rptr++)=0; }
460  rbufp[lc]=P[lc]*r;
461  r0=cc[nxt];
462  }
463  r=r0; rptr=rbufp; i=(int)dim;
464  while (i--) r+=*(rptr++);
465 
466  return r;
467 }
static const unsigned int Warning
Definition: Poly.h:118
unsigned sz()
Definition: Poly.h:64
MultIndCache cacheMultInd
Definition: MultInd.cpp:42
unsigned * lastChanges()
Definition: MultInd.cpp:204
unsigned dim()
Definition: Poly.h:62
MultInd * get(unsigned _dim, unsigned _deg)
Definition: MultInd.cpp:242
unsigned deg()
Definition: Poly.h:63
#define i
unsigned sz()
Definition: Vector.h:79
#define j
PolynomialData * d
Definition: Poly.h:49
unsigned * indexesOfCoefInLexOrder()
Definition: MultInd.cpp:214
static Vector emptyVector
Definition: Vector.h:119
unsigned queryFlag(unsigned int val)
Definition: Poly.h:124

◆ operator*()

Polynomial Polynomial::operator* ( const double  t)

Definition at line 143 of file Poly.cpp.

144 {
145  int i=sz();
146  Polynomial q( d->dim, d->deg );
147  double *tq = q.d->coeff, *tp = d->coeff;
148 
149  while (i--) *(tq++) = *(tp++) * t;
150  return q;
151 }
unsigned sz()
Definition: Poly.h:64
#define i
PolynomialData * d
Definition: Poly.h:49

◆ operator*=()

Polynomial Polynomial::operator*= ( const double  t)

Definition at line 280 of file Poly.cpp.

281 {
282  int i=sz();
283  double *tp = (*this);
284 
285  while (i--) *(tp++) *=t;
286  return *this;
287 }
unsigned sz()
Definition: Poly.h:64
#define i

◆ operator+() [1/2]

Polynomial Polynomial::operator+ ( Polynomial  q)

Definition at line 169 of file Poly.cpp.

170 {
171  if (d->dim != q.d->dim)
172  {
173  printf( "Poly::op+ : Different dimension\n");
174  getchar(); exit(-1);
175  }
176 
177  Polynomial r(d->dim,mmax(d->deg,q.d->deg));
178  unsigned N1=sz(), N2=q.sz(), Ni=mmin(N1,N2);
179  double *tr = r, *tp = (*this), *tq = q;
180  while (Ni--) *(tr++) = *(tp++) + *(tq++);
181  if (N1<N2)
182  {
183  memcpy(tr,tq,(N2-N1)*sizeof(double));
184 // N2-=N1; while (N2--) *(tr++)=*(tq++);
185  }
186  return r;
187 }
unsigned sz()
Definition: Poly.h:64
int * mmax
double mmin(const double t1, const double t2)
Definition: tools.h:69
PolynomialData * d
Definition: Poly.h:49

◆ operator+() [2/2]

Polynomial Polynomial::operator+ ( void  )
inline

Definition at line 84 of file Poly.h.

85  { return *this; }

◆ operator+=()

Polynomial Polynomial::operator+= ( Polynomial  p)

Definition at line 223 of file Poly.cpp.

224 {
225  if (d->dim != p.d->dim)
226  {
227  printf("Poly::op+= : Different dimension\n");
228  getchar(); exit(-1);
229  }
230 
231  d->deg = mmax(d->deg,p.d->deg); // New degree
232  unsigned N1=sz(), N2=p.sz(), Ni=mmin(N1,N2);
233  if (N1<N2)
234  {
235  d->coeff=(double*)realloc(d->coeff,N2*sizeof(double));
236  d->n=p.d->n;
237  }
238  double *tt = (*this),*tp = p;
239 
240  while (Ni--) *(tt++) += *(tp++);
241 
242  if (N1<N2)
243  {
244  memcpy(tt,tp,(N2-N1)*sizeof(double));
245 // N2-=N1; while (N2--) *(tt++)=*(tp++);
246  }
247 
248  return *this;
249 }
unsigned sz()
Definition: Poly.h:64
int * mmax
double mmin(const double t1, const double t2)
Definition: tools.h:69
PolynomialData * d
Definition: Poly.h:49

◆ operator-() [1/2]

Polynomial Polynomial::operator- ( Polynomial  q)

Definition at line 190 of file Poly.cpp.

191 {
192  if (d->dim != q.d->dim)
193  {
194  printf("Poly::op- : Different dimension\n");
195  getchar(); exit(-1);
196  }
197 
198  Polynomial r(d->dim,mmax(d->deg,q.d->deg));
199  unsigned N1=sz(), N2=q.sz(), Ni=mmin(N1,N2);
200  double *tr = r, *tp = (*this), *tq = q;
201  while (Ni--) *(tr++) = *(tp++) - *(tq++);
202  if (N1<N2)
203  {
204  N2-=N1; while (N2--) *(tr++)=-(*(tq++));
205  }
206  return r;
207 }
unsigned sz()
Definition: Poly.h:64
int * mmax
double mmin(const double t1, const double t2)
Definition: tools.h:69
PolynomialData * d
Definition: Poly.h:49

◆ operator-() [2/2]

Polynomial Polynomial::operator- ( void  )

Definition at line 209 of file Poly.cpp.

210 {
211  unsigned Ni = sz();
212  double *tp = (*this);
213 
214  if (!Ni || !tp) return *this; // Take it like it is ...
215 
216  Polynomial r(d->dim,d->deg);
217  double *tq = (r);
218  while( Ni-- ) *(tq++) = -(*(tp++));
219  return r;
220 }
unsigned sz()
Definition: Poly.h:64
PolynomialData * d
Definition: Poly.h:49

◆ operator-=()

Polynomial Polynomial::operator-= ( Polynomial  p)

Definition at line 252 of file Poly.cpp.

253 {
254  if (d->dim != p.d->dim)
255  {
256  printf( "Poly::op-= : Different dimension\n");
257  getchar(); exit(-1);
258  }
259 
260  d->deg = mmax(d->deg,p.d->deg); // New degree
261  unsigned N1=sz(), N2=p.sz(), Ni=mmin(N1,N2);
262  if (N1<N2)
263  {
264  d->coeff=(double*)realloc(d->coeff,N2*sizeof(double));
265  d->n=p.d->n;
266  }
267  double *tt = (*this),*tp = p;
268 
269  while (Ni--) *(tt++) -= *(tp++);
270 
271  if (N1<N2)
272  {
273  N2-=N1; while (N2--) *(tt++)=-(*(tp++));
274  }
275 
276  return *this;
277 }
unsigned sz()
Definition: Poly.h:64
int * mmax
double mmin(const double t1, const double t2)
Definition: tools.h:69
PolynomialData * d
Definition: Poly.h:49

◆ operator/()

Polynomial Polynomial::operator/ ( const double  t)

Definition at line 154 of file Poly.cpp.

155 {
156  if (t == 0)
157  {
158  printf( "op/(Poly,double): Division by zero\n");
159  getchar(); exit(-1);
160  }
161  int i=sz();
162  Polynomial q( d->dim, d->deg );
163  double *tq = q.d->coeff, *tp = d->coeff;
164 
165  while (i--) *(tq++) = *(tp++) / t;
166  return q;
167 }
unsigned sz()
Definition: Poly.h:64
#define i
PolynomialData * d
Definition: Poly.h:49

◆ operator/=()

Polynomial Polynomial::operator/= ( const double  t)

Definition at line 290 of file Poly.cpp.

291 {
292  if (t == 0)
293  {
294  printf( "Poly::op/= : Division by zero\n");
295  getchar(); exit(-1);
296  }
297 
298  int i=sz();
299  double *tp = (*this);
300 
301  while (i--) *(tp++) /=t;
302  return *this;
303 }
unsigned sz()
Definition: Poly.h:64
#define i

◆ operator=()

Polynomial & Polynomial::operator= ( const Polynomial A)

Definition at line 98 of file Poly.cpp.

99 {
100  // shallow copy
101  if (this != &A)
102  {
104  d=A.d;
105  (d->ref_count) ++ ;
106  }
107  return *this;
108 }
PolynomialData * d
Definition: Poly.h:49
void destroyCurrentBuffer()
Definition: Poly.cpp:87

◆ operator==()

int Polynomial::operator== ( const Polynomial  q)
inline

Definition at line 106 of file Poly.h.

106 { return d==q.d; };
PolynomialData * d
Definition: Poly.h:49

◆ print()

void Polynomial::print ( )

Definition at line 320 of file Poly.cpp.

321 {
322  MultInd I( d->dim );
323  double *tt = (*this);
324  unsigned N = sz();
325  bool IsFirst=true;
326 
327  if ( !N || !tt ) { printf("[Void polynomial]\n"); return; }
328 
329  if (*tt) { IsFirst=false; printf("%f", *tt); }
330  tt++; ++I;
331 
332  for (unsigned i = 1; i < N; i++,tt++,++I)
333  {
334  if (*tt != 0)
335  {
336  if (IsFirst)
337  {
338  if (queryFlag( NicePrint ))
339  {
340  if (*tt<0) printf("-");
341  printf("%f x^",condorAbs(*tt)); I.print();
342  }
343  else
344  {
345  printf("+%f x^",*tt); I.print();
346  }
347  IsFirst = false;
348  continue;
349  }
350  if (queryFlag( NicePrint ))
351  {
352  if (*tt<0) printf("-"); else printf("+");
353  printf("%f x^",condorAbs(*tt)); I.print();
354  }
355  else
356  {
357  printf("+%f x^",*tt); I.print();
358  }
359 
360  }
361  }
362 }
unsigned sz()
Definition: Poly.h:64
#define i
static const unsigned int NicePrint
Definition: Poly.h:117
double condorAbs(const double t1)
Definition: tools.h:47
PolynomialData * d
Definition: Poly.h:49
unsigned queryFlag(unsigned int val)
Definition: Poly.h:124

◆ queryFlag()

unsigned Polynomial::queryFlag ( unsigned int  val)
inline

Definition at line 124 of file Poly.h.

124 { return flags & val; }
static unsigned int flags
Definition: Poly.h:121

◆ save()

void Polynomial::save ( char *  name)

Definition at line 579 of file Poly.cpp.

580 {
581  std::ofstream ofp(name, std::ios::out | std::ios::binary);
582  ofp.write(reinterpret_cast<const char*>(&d->dim), sizeof(int));
583  ofp.write(reinterpret_cast<const char*>(&d->deg), sizeof(int));
584  ofp.write(reinterpret_cast<const char*>(d->coeff), d->n*sizeof(double));
585  ofp.close();
586 }
PolynomialData * d
Definition: Poly.h:49

◆ setFlag()

void Polynomial::setFlag ( unsigned int  val)
inline

Definition at line 122 of file Poly.h.

122 { flags |= val; }
static unsigned int flags
Definition: Poly.h:121

◆ shiftedEval()

double Polynomial::shiftedEval ( Vector  Point,
double  minusVal 
)

Definition at line 380 of file Poly.cpp.

381 {
382  double tmp1=d->coeff[0], tmp2;
383  d->coeff[0]-=minusVal;
384  tmp2=(*this)(Point);
385  d->coeff[0]=tmp1;
386  return tmp2;
387 }
PolynomialData * d
Definition: Poly.h:49

◆ sz()

unsigned Polynomial::sz ( )
inline

Definition at line 64 of file Poly.h.

64 { return d->n; };
PolynomialData * d
Definition: Poly.h:49

◆ translate()

void Polynomial::translate ( Vector  translation)

Definition at line 563 of file Poly.cpp.

564 {
565  if (d->deg>2)
566  {
567  printf("Translation only for polynomial of degree lower than 3.\n");
568  getchar(); exit(255);
569  }
570  d->coeff[0]=(*this)(translation);
571  if (d->deg==1) return;
572  int dim=d->dim;
573  Vector G(dim);
574  Matrix H(dim,dim);
575  gradientHessian(translation, G, H);
576  memcpy(((double*)d->coeff)+1, (double*)G, dim*sizeof(double));
577 }
Definition: Vector.h:37
unsigned dim()
Definition: Poly.h:62
void gradientHessian(Vector P, Vector G, Matrix H)
Definition: Poly.cpp:515
Definition: Matrix.h:38
PolynomialData * d
Definition: Poly.h:49

◆ unsetFlag()

void Polynomial::unsetFlag ( unsigned int  val)
inline

Definition at line 123 of file Poly.h.

123 { flags &= ~val; }
static unsigned int flags
Definition: Poly.h:121

Member Data Documentation

◆ d

PolynomialData* Polynomial::d
protected

Definition at line 49 of file Poly.h.

◆ emptyPolynomial

Polynomial Polynomial::emptyPolynomial
static

Definition at line 126 of file Poly.h.

◆ flags

unsigned int Polynomial::flags = Polynomial::Warning||Polynomial::NicePrint
static

Definition at line 121 of file Poly.h.

◆ NicePrint

const unsigned int Polynomial::NicePrint = 1
static

Definition at line 117 of file Poly.h.

◆ Normalized

const unsigned int Polynomial::Normalized = 4
static

Definition at line 119 of file Poly.h.

◆ Warning

const unsigned int Polynomial::Warning = 2
static

Definition at line 118 of file Poly.h.


The documentation for this class was generated from the following files: