129 #ifdef NOOBJECTIVEFUNCTION 130 const double eps = 1e-6;
132 const double eps = 1e-10;
134 const double good = 1 ;
143 printf(
"ComputeNewtonBasis( ... ) : Alloc for polynomials failed\n");
144 getchar(); exit(251);
155 double v, vmax, vabs;
157 printf(
"Constructing first quadratic ... (N=%i)\n",nPtsUsed);
169 vmax=(pp[0])( xx[0] );
171 for (k=
i; k<nPtsTotal; k++)
180 if (fabs(v) > good )
break;
184 if (fabs(vmax) < eps)
186 printf(
"Cannot construct Lagrange basis");
204 for (k=0; k<
i; k++) pp[k] -= (pp[k])( xx[
i] ) * pp[i];
205 for (k=i+1; k<
nPtsUsed; k++) pp[k] -= (pp[k])( xx[
i] ) * pp[i];
218 double minimumValueF=
INF;
221 if ((ValuesF[i]<minimumValueF)
223 { k=
i; minimumValueF=ValuesF[
i]; }
235 printf(
"InterPolynomial::InterPolynomial( double *) : No data\n");
242 double rhosmall=rho*
ROOT2*.5;
250 int i,ii,
j=0,
k,mdim=
dim();
251 double norm, *p, *pb=_vBase;
259 kb.
add(0.0,p[mdim],p); j++;
267 if (p[mdim+1])
continue;
269 while (
k--) norm+=
sqr(p[
k]-pb[
k]);
271 ((norm<=4.00*rho*rho))
274 kb.
add(norm,p[mdim], p); j++;
279 printf(
"Not Enough points in DB to build interpolation polynomial\n");
283 j=
mmin(j,(
int)(2*nPtsUsed));
285 valuesF=(
double*)malloc(j*
sizeof(
double));
303 double *NewtonCoefPoly=
valuesF;
305 double *coc= NewtonCoefPoly+
nPtsUsed-1;
312 (*this) += *(--coc) * *(--ppc);
318 #ifdef NOOBJECTIVEFUNCTION 330 printf(
"The GenerateBasis function only works for interpolation polynomials of degree 2.\n");
334 *failed=(
int*)malloc(N*
sizeof(
int)),nToCompute, nl=data.
nLine(),best;
337 valuesF=(
double*)malloc((N+dim)*
sizeof(double));
338 double dBase=((
double**)data)[0][
dim],*vrho=
valuesF+N,
339 *base=Base,*dcur,*p,*pb,
norm, normbest, r;
346 for (i=0; i<
dim; i++)
356 for (i=0; i<
dim; i++)
358 normbest=
INF; pb=cp[
i];
362 if (p[dim+1])
continue;
364 while (k--) norm+=
sqr(p[k]-pb[k]);
365 if (normbest>norm) { normbest=
norm; best=
j; }
367 if (normbest<rhosmall*rhosmall)
373 cur=cp[nToCompute]; cp[nToCompute]=cp[
i]; cp[
i]=cur;
374 l=vi[nToCompute]; vi[nToCompute]=vi[
i]; vi[
i]=l;
389 for (j=0; j<nToCompute; j++)
395 for (i=0; i<
dim; i++)
397 dcur[
i]=base[
i]+(base[
i]-dcur[
i])*.7;
401 cur=cp[
k]; cp[
k]=cp[
j]; cp[
j]=cur;
402 l=vi[
k]; vi[
k]=vi[
j]; vi[
j]=l;
411 for (j=0; j<dim-1; j++)
413 k=
j;
while (vi[k]!=j) k++;
415 cur=cp[
k]; cp[
k]=cp[
j]; cp[
j]=cur;
416 l=vi[
k]; vi[
k]=vi[
j]; vi[
j]=l;
422 for (j=0; j<
dim; j++)
427 if (
valuesF[j]<dBase) { cur[
j]+=r*2.0; vrho[
j]=r; }
428 else { cur[
j]-=r; vrho[
j]=-r; }
431 for (j=0; j<
dim; j++)
445 for (i=0; i<N-dim-1; i++)
447 normbest=
INF; pb=cp[
i];
451 if (p[dim+1])
continue;
453 while (k--) norm+=
sqr(p[k]-pb[k]);
454 if (normbest>norm) { normbest=
norm; best=
j; }
456 if (normbest<rhosmall*rhosmall)
463 cp[nToCompute]=cp[
i];
478 for (j=0; j<nToCompute; j++)
484 for (i=0; i<
dim; i++)
486 dcur[
i]=base[
i]+(base[
i]-dcur[
i])*.65;
503 for (i=0; i<N-1; i++)
552 double rho,
Vector pointToAdd,
double *maxd)
566 if (excludeFromT>=0) XkHat=xx[excludeFromT];
567 else XkHat=pointToAdd;
570 double a, aa, maxa=-1.0, maxdd=0;
577 if (
i==excludeFromT)
continue;
579 if (aa==0.0)
return -1;
587 t=
i; maxa=
a; maxdd=aa;
590 if (maxd) *maxd=maxdd;
631 double t2=(pp[t]( pointToAdd ));
637 for (i=0; i<t; i++) pp[i]-= pp[i]( pointToAdd )*t1;
638 for (i=t+1; i<N; i++) pp[i]-= pp[i]( pointToAdd )*t1;
643 valueF-=(*this)(pointToAdd);
644 if (
condorAbs(valueF)>1e-11) (*
this)+=valueF*pp[t];
657 double distMax=-1.0,dd;
669 if (dd>distMax) { j=
i; distMax=dd; };
671 dd=xk.euclidianDistance(pointToAdd);
677 printf(
"good point found.\n");
678 replace(j, pointToAdd, valueF);
701 double *dist=Distance, *dd=dist, distMax, vmax, tmp;
705 for (i=0; i<N; i++) *(dd++)=xk.euclidianDistance(xx[i]);
709 dd=dist; j=-1; distMax=2*
rho;
712 if (*dd>distMax) { j=
i; distMax=*dd; };
724 tmp=
M*distMax*distMax*distMax;
743 if (tmp*vmax>=bound)
break;
761 double *dist=Distance, *dd=dist, distMax, vmax;
764 if (k>=0) xk=xx[
k];
else xk=*v;
768 for (ii=0; ii<d.
nLine(); ii++)
774 if (*dd>distMax) { j=
i; distMax=*dd; };
780 if (distMax>2*rho) r++;
880 printf(
"poly: copyFrom: dim do not agree\n");
881 getchar(); exit(254);
885 printf(
"poly: copyFrom: degree do not agree\n");
886 getchar(); exit(254);
virtual void saveValue(Vector tmp, double valueOF, int nerror)
double interpError(Vector Point)
InterPolynomial & operator=(const InterPolynomial &A)
int getGoodInterPolationSites(Matrix d, int k, double rho, Vector *v=NULL)
unsigned long choose(unsigned n, unsigned k)
void translate(Vector translation)
void GenerateBasis(double rho, double rhosmall, Matrix data, ObjectiveFunction *of)
int calculateNParallelJob(int n, double *vf, Vector *cp, ObjectiveFunction *of, int *notsuccess)
void destroyCurrentBuffer()
int findAGoodPointToReplace(int excludeFromT, double rho, Vector pointToAdd, double *modelStep=NULL)
void updateM(Vector newPoint, double valueF)
double euclidianDistance(Vector v)
T norm(const std::vector< T > &v)
void add(double key, double value)
int maybeAdd(Vector pointToAdd, unsigned k, double rho, double valueF)
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
void replace(int t, Vector pointToAdd, double valueF)
void ComputeLagrangeBasis(double *, unsigned nPtsTotal)
int lineIndex(Vector r, int nn=0)
char isFeasible(Vector vx, double *d=NULL)
Vector LAGMAXModified(Vector G, Matrix H, double rho, double &VMAX)
void zero(int _i=0, int _n=0)
void gradientHessian(Vector P, Vector G, Matrix H)
double getOptValue(int i, int n)
void copyFrom(InterPolynomial a)
int findK(double *ValuesF, int n, ObjectiveFunction *of, Vector *points)
Vector getLine(int i, int n=0, int startCol=0)
int checkIfValidityIsInBound(Vector dd, unsigned k, double bound, double rho)
static Vector emptyVector
void setLine(int i, Vector v, int n=0)
void copyFrom(Polynomial a)
void copyFrom(Vector r, int _n=0)
InterPolynomial(unsigned _deg, double rho, Vector vBase, Matrix data, ObjectiveFunction *of)