41 double *
c,
double *
d,
double *
a,
double *
b,
double *
xl,
60 double *
c=*((
double**)thisG), *
d=minusvd, *
a=*((
double**)At), *
b=vBstar;
64 double *
xl=vxl, *
xu=vxu, *
x=vXtmp, *
u=vLambda, *
war=temp,
eps1=1e-20;
67 int dim=
n;
while (dim--) { xl[dim]=-
INF; xu[dim]=
INF; }
70 ql0001_(&m,&
me,&mmax,&n,&
nmax,&mnn,c,
d,a,
b,xl,xu,x,u,&iout,&
ifail,
71 &iprint,war,&
lwar,iwar,&liwar,&eps1);
86 int n=vi_QP.
sz()-1, nc=vLambda.
sz();
88 double *l=vLambda, *s=vLambdaScale;
102 if (nc) memset(l,0,nc*
sizeof(
double));
108 const double tolRelFeasibility=1e-6;
112 Matrix mAR, mZ(dim,dim-1), mHZ(dim,dim-1), mZHZ(dim-1,dim-1);
113 Vector vTmp(
mmax(nc,dim)), vYB(dim), vD(dim), vTmp2(dim), vTmp3(nc), vLast(dim),
114 vBR_QP, vLambdaScale(nc);
116 double *
lambda=vLambda, *br, *
b=vB, violationMax, violationMax2,
117 *rlambda,ax,al,dviolation, **a=mA, **ar=mAR, mymin, mymax, maxb, *llambda,
118 **r,t, *scaleLambda=vLambdaScale;
119 char finished=0, feasible=0, *lb=vLB;
124 k=0; vi_QP.
setSize(nc); maxb=0.0;
128 for (j=0; j<dim; j++)
130 mymin=
mmin(mymin,a[i][j]);
131 mymax=
mmax(mymax,a[i][j]);
132 if ((mymin!=mymax)||(mymin!=0.0)||(mymax!=0.0))
break;
134 if ((mymin!=mymax)||(mymin!=0.0)||(mymax!=0.0))
143 nc=
k; vi_QP.
setSize(nc); ii=
vi_QP; maxb=(1.0+maxb)*tolRelFeasibility;
146 for (i=0; i<nc; i++)
if (lambda[i]!=0.0) lb[
i]=2;
else lb[
i]=1;
160 for (j=0; j<dim; j++) ar[ncr][j]=a[k][j]*t;
179 printf(
"warning: cholesky factorisation failed.\n");
189 mAR.
QR(mQ_QP,mR_QP, viPermut_QP);
193 for (i=0; i<ncr; i++)
201 for (i=0; i<ncr; i++)
202 if (viPermut_QP[i]!=i)
239 printf(
"warning: cholesky factorisation failed.\n");
244 mZ.multiply(vTmp, vD);
259 vTmp3.permutOut(vTmp,viPermut_QP);
266 lambda[
i]=rlambda[ncr];
275 k=-1; violationMax=-
INF; violationMax2=-
INF;
281 dviolation=b[ii[
i]]-ax;
291 if (dviolation>violationMax2)
292 { k=
i; violationMax2=dviolation; }
297 if (dviolation>violationMax )
298 { j=
i; violationMax =dviolation; }
309 if (lastJ>=0) lambda[lastJ]=0.0;
331 if ((j==-1)&&(!feasible))
334 for (i=0; i<nc; i++)
if (llambda[i]!=0.0) lb[
i]=2;
else lb[
i]=1;
336 if (j==-1) { j=
k; violationMax=violationMax2; }
337 if (ncr==
mmin(dim,nc)) {
347 if (j>=0) { lambda[
j]=1e-5; finished=0; }
366 if (bQRFailed_QP) { vP.
zero();
return; }
370 for (i=0; i<nc2; i++)
void permutIn(Vector vR, VectorInt viP)
int ql0001_(m, me, mmax, n, nmax, mnn, c, d, a, b, xl, xu, x, u, iout, ifail, iprint, war, lwar, iwar, liwar, eps1) integer *m
void simpleQPSolve(Matrix mH, Vector vG, Matrix mA, Vector vB, Vector vP, Vector vLambda, int *info)
double scalarProduct(int nl, Vector v)
void QPReconstructLambda(Vector vLambda, Vector vLambdaScale)
void QR(Matrix Q=Matrix::emptyMatrix, MatrixTriangle R=MatrixTriangle::emptyMatrixTriangle, VectorInt permutation=VectorInt::emptyVectorInt)
Matrix multiply(Matrix B)
void setSize(int _nLine, int _nColumn)
void restartSimpleQPSolve(Vector vBO, Vector vP)
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 solveTransposInPlace(Vector y)
void getSubMatrix(Matrix R, int startL, int StartC, int nl=0, int nc=0)
bool cholesky(MatrixTriangle matL, double lambda=0, double *lambdaCorrection=NULL)
void solveInPlace(Vector b)
void zero(int _i=0, int _n=0)
double euclidianNorm(int i)
void transposeAndMultiply(Vector vR, Matrix M)
void transposeAndMultiply(Vector R, Vector a)
void setNLine(int _nLine)
static Matrix emptyMatrix
void copyFrom(Vector r, int _n=0)