81 #define maxprojections 200
83 #define alpha_max 1e10
84 #define alpha_min 1e-10
87 #define ThRand (Randnext = Randnext * 1103515245L + 12345L)
88 #define ThRandPos ((Randnext = Randnext * 1103515245L + 12345L) & 0x7fffffff)
115 int32_t i, j, iter, it, it2, luv, info;
116 float64_t gd, max, normd, dAd, lam, lamnew, alpha, kktlam, ak, bk;
118 int32_t lscount = 0, projcount = 0;
125 int32_t nc = 1, ia1 = -1;
130 #ifdef VARIABLES_ON_STACK
132 int32_t ipt[
in], ipt2[
in], uv[
in];
137 int32_t *ipt, *ipt2, *uv;
153 DELTAsv = EPS_SV * c;
154 if (tol <= 1.0e-5 || n <= 20)
157 ProdDELTAsv = EPS_SV * c;
159 for (i = 0; i < n; i++)
162 projcount +=
InnerProjector(Projector, n, iy, e, tempv, 0, c, x, lam_ext);
170 for (i = 0; i < n; i++)
171 if (fabs(x[i]) > ProdDELTAsv*1e-2)
175 for (i = 0; i < it; i++)
177 tempA = vecA + ipt[i]*n;
178 for (j = 0; j < n; j++)
179 t[j] += (tempA[j] * x[ipt[i]]);
183 for (i = 0; i < n; i++)
189 projcount +=
InnerProjector(Projector, n, iy, e, y, 0, c, tempv, lam_ext);
192 for (i = 0; i < n; i++)
194 y[i] = tempv[i] - x[i];
195 if (fabs(y[i]) > max)
199 if (max < c*tol*1e-3)
208 for (iter = 1; iter <=
maxvpm; iter++)
210 for (i = 0; i < n; i++)
211 tempv[i] = alpha*g[i] - x[i];
213 projcount +=
InnerProjector(Projector, n, iy, e, tempv, 0, c, y, lam_ext);
216 for (i = 0; i < n; i++)
228 for (i = 0; i < n; i++)
229 if (fabs(d[i]) > (ProdDELTAsv*1.0e-2))
231 for (i = 0; i < n; i++)
232 if (fabs(y[i]) > ProdDELTAsv)
238 for (i = 0; i < it; i++)
240 tempA = vecA + ipt[i]*n;
241 for (j = 0; j < n; j++)
242 Ad[j] += (tempA[j] * d[ipt[i]]);
247 for (i = 0; i < it2; i++)
249 tempA = vecA + ipt2[i]*n;
250 for (j = 0; j < n; j++)
251 Ad[j] += (tempA[j] * y[ipt2[i]]);
253 for (j = 0; j < n; j++)
259 for (i = 0; i < n; i++)
260 normd += d[i] * d[i];
263 for (i = 0; i < n; i++)
266 if (dAd > eps*normd && gd < 0.0)
268 lam = lamnew = -gd/dAd;
269 if (lam > 1.0 || lam < 0.0)
279 alpha1 = normd / dAd;
283 for (i = 0; i < n; i++)
284 alpha2 += Ad[i] * Ad[i];
285 alpha2 = dAd / alpha2;
291 lamnew < 0.1 || (alpha1 > alpha && alpha2 < alpha)
297 lamnew > 5.0 || (alpha1 > alpha && alpha2 < alpha)
327 for (i = 0; i < n; i++)
328 alpha += Ad[i] * Ad[i];
334 for (i = 0; i < n; i++)
335 alpha += d[i] * d[i];
348 for (i = 0; i < n; i++)
350 x[i] = x[i] + lam*d[i];
351 t[i] = t[i] + lam*Ad[i];
358 for (i = 0; i < n; i++)
364 if (lam*sqrt(ak) < tol*10 * sqrt(bk))
369 for (i = 0; i < n; i++)
371 if (x[i] > DELTAsv && x[i] < c-DELTAsv)
374 kktlam = kktlam - iy[i]*g[i];
382 if (lam*sqrt(ak) < tol*0.5 * sqrt(bk))
389 for (i = 0; i < it; i++)
390 if (fabs(iy[ipt[i]]*g[ipt[i]]+kktlam) > tol)
397 for (i = 0; i < luv; i++)
398 if (x[uv[i]] <= DELTAsv)
400 if (g[uv[i]] + kktlam*iy[uv[i]] < -tol)
408 if (g[uv[i]] + kktlam*iy[uv[i]] > tol)
426 #ifndef VARIABLES_ON_STACK
438 if (ls != NULL) *ls = lscount;
439 if (proj != NULL) *proj = projcount;
453 int32_t i, j, iter, it, it2, luv, info, lscount = 0, projcount = 0;
454 float64_t gd, max, ak, bk, akold, bkold, lamnew, alpha, kktlam, lam_ext;
463 #ifdef VARIABLES_ON_STACK
465 int32_t ipt[
in], ipt2[
in], uv[
in];
467 xplus[
in], tplus[
in], sk[
in], yk[
in];
470 int32_t *ipt, *ipt2, *uv;
471 float64_t *g, *y, *tempv, *d, *Ad, *t, *xplus, *tplus, *sk, *yk;
490 DELTAsv = EPS_SV * c;
491 if (tol <= 1.0e-5 || n <= 20)
494 ProdDELTAsv = EPS_SV * c;
496 for (i = 0; i < n; i++)
501 projcount +=
InnerProjector(Projector, n, iy, e, tempv, 0, c, x, lam_ext);
509 for (i = 0; i < n; i++)
510 if (fabs(x[i]) > ProdDELTAsv)
514 for (i = 0; i < it; i++)
516 tempA = vecA + ipt[i] * n;
517 for (j = 0; j < n; j++)
518 t[j] += (tempA[j]*x[ipt[i]]);
522 for (i = 0; i < n; i++)
528 projcount +=
InnerProjector(Projector, n, iy, e, y, 0, c, tempv, lam_ext);
531 for (i = 0; i < n; i++)
533 y[i] = tempv[i] - x[i];
534 if (fabs(y[i]) > max)
538 if (max < c*tol*1e-3)
548 for (i = 0; i < n; i++)
549 fv0 += x[i] * (0.5*t[i] + b[i]);
559 for (iter = 1; iter <=
maxvpm; iter++)
561 for (i = 0; i < n; i++)
562 tempv[i] = alpha*g[i] - x[i];
564 projcount +=
InnerProjector(Projector, n, iy, e, tempv, 0, c, y, lam_ext);
567 for (i = 0; i < n; i++)
578 for (i = 0; i < n; i++)
579 if (fabs(d[i]) > (ProdDELTAsv*1.0e-2))
581 for (i = 0; i < n; i++)
582 if (fabs(y[i]) > ProdDELTAsv)
588 for (i = 0; i < it; i++)
590 tempA = vecA + ipt[i]*n;
591 for (j = 0; j < n; j++)
592 Ad[j] += (tempA[j] * d[ipt[i]]);
597 for (i = 0; i < it2; i++)
599 tempA = vecA + ipt2[i]*n;
600 for (j = 0; j < n; j++)
601 Ad[j] += (tempA[j] * y[ipt2[i]]);
603 for (j = 0; j < n; j++)
609 for (i = 0; i < n; i++)
613 for (i = 0; i < n; i++)
616 if (bk > eps*ak && gd < 0.0)
622 for (i = 0; i < n; i++)
624 xplus[i] = x[i] + d[i];
625 tplus[i] = t[i] + Ad[i];
626 fv += xplus[i] * (0.5*tplus[i] + b[i]);
629 if ((iter == 1 && fv >= fv0) || (iter > 1 && fv >= fr))
633 for (i = 0; i < n; i++)
635 xplus[i] = x[i] + lamnew*d[i];
636 tplus[i] = t[i] + lamnew*Ad[i];
637 fv += xplus[i] * (0.5*tplus[i] + b[i]);
641 for (i = 0; i < n; i++)
643 sk[i] = xplus[i] - x[i];
644 yk[i] = tplus[i] - t[i];
660 fc = (fc > fv ? fc : fv);
671 for (i = 0; i < n; i++)
681 if (bkold < eps*akold)
684 alpha = (akold+ak)/(bkold+bk);
698 for (i = 0; i < n; i++)
701 if (sqrt(ak) < tol*10 * sqrt(bk))
706 for (i = 0; i < n; i++)
708 if ((x[i] > DELTAsv) && (x[i] < c-DELTAsv))
711 kktlam = kktlam - iy[i]*g[i];
719 if (sqrt(ak) < tol*0.5 * sqrt(bk))
727 for (i = 0; i < it; i++)
728 if ( fabs(iy[ipt[i]] * g[ipt[i]] + kktlam) > tol )
735 for (i = 0; i < luv; i++)
736 if (x[uv[i]] <= DELTAsv)
738 if (g[uv[i]] + kktlam*iy[uv[i]] < -tol)
746 if (g[uv[i]] + kktlam*iy[uv[i]] > tol)
759 SG_SWARNING(
"Dai-Fletcher method exits after maxvpm = %d iterations.\n",
maxvpm);
763 #ifndef VARIABLES_ON_STACK
779 if (ls != NULL) *ls = lscount;
780 if (proj != NULL) *proj = projcount;
791 int32_t *ls, int32_t *proj)
820 if (Solver == SOLVER_FLETCHER)
821 return FletcherAlg2A(Projector, n, A, b, c, e, iy, x, tol, ls, proj);
823 return gvpm(Projector, n, A, b, c, e, iy, x, tol, ls, proj);
839 for (i = 0; i < n; i++)
842 if (x[i] >= u) x[i] = u;
843 else if (x[i] < l) x[i] = l;
864 float64_t lambda, lambdal, lambdau, dlambda, lambda_new, tol_lam;
869 tol_r = 1.0e-10 * sqrt((u-l)*(
float64_t)n);
876 r =
ProjectR(x, n, lambda, a, b, c, l, u);
884 lambda = lambda + dlambda;
885 r =
ProjectR(x, n, lambda, a, b, c, l, u);
890 if (s < 0.1) s = 0.1;
891 dlambda = dlambda + dlambda/s;
892 lambda = lambda + dlambda;
894 r =
ProjectR(x, n, lambda, a, b, c, l, u);
903 lambda = lambda - dlambda;
904 r =
ProjectR(x, n, lambda, a, b, c, l, u);
909 if (s < 0.1) s = 0.1;
910 dlambda = dlambda + dlambda/s;
911 lambda = lambda - dlambda;
913 r =
ProjectR(x, n, lambda, a, b, c, l, u);
923 lambda = lambdau - dlambda;
924 r =
ProjectR(x, n, lambda, a, b, c, l, u);
926 while ( fabs(r) > tol_r
927 && dlambda > tol_lam * (1.0 + fabs(lambda))
938 dlambda = (lambdau - lambdal) / s;
939 lambda = lambdau - dlambda;
944 if (s < 0.1) s = 0.1;
945 dlambda = (lambdau - lambda) / s;
946 lambda_new = 0.75*lambdal + 0.25*lambda;
947 if (lambda_new < (lambda - dlambda))
948 lambda_new = lambda - dlambda;
952 s = (lambdau - lambdal) / (lambdau - lambda);
962 dlambda = (lambdau - lambdal) / s;
963 lambda = lambdau - dlambda;
968 if (s < 0.1) s = 0.1;
969 dlambda = (lambda-lambdal) / s;
970 lambda_new = 0.75*lambdau + 0.25*lambda;
971 if (lambda_new > (lambda + dlambda))
972 lambda_new = lambda + dlambda;
976 s = (lambdau - lambdal) / (lambdau-lambda);
979 r =
ProjectR(x, n, lambda, a, b, c, l, u);
984 SG_SERROR(
"Projector exits after max iterations: %d\n", iter);
989 #define SWAP(a,b) { register float64_t t=(a);(a)=(b);(b)=t; }
996 int32_t middle, l, h;
1000 median = (low + high) / 2;
1007 if (high == low + 1)
1009 if (arr[low] > arr[high])
1010 SWAP(arr[low], arr[high]);
1014 middle = (low + high) / 2;
1015 if (arr[middle] > arr[high])
SWAP(arr[middle], arr[high]);
1016 if (arr[low] > arr[high])
SWAP(arr[low], arr[high]);
1017 if (arr[middle] > arr[low])
SWAP(arr[middle], arr[low]);
1019 SWAP(arr[middle], arr[low+1]);
1025 do l++;
while (arr[low] > arr[l]);
1026 do h--;
while (arr[h] > arr[low]);
1029 SWAP(arr[l], arr[h]);
1032 SWAP(arr[low], arr[h]);
1058 float64_t d, xmin, xmax, xmold, xmid, xx, ts, sw, s, s1, testsum;
1061 #ifdef VARIABLES_ON_STACK
1062 int32_t uv[
in], uvt[
in];
1068 float64_t *xint, *xint2, *a, *b, *at, *bt, *newdia, *newdt;
1085 for (i = 0; i < n; i++)
1089 for (i = 0; i < n; i++)
1096 a[i] = ((qk[i] + low) * iy[i]) * 0.5;
1097 b[i] = ((up + qk[i]) * iy[i]) * 0.5;
1101 b[i] = ((qk[i] + low) * iy[i]) * 0.5;
1102 a[i] = ((up + qk[i]) * iy[i]) * 0.5;
1104 newdia[i] = (iy[i]*iy[i]);
1111 for (i = 0; i < n; i++)
1128 for (i = 0; i < luv; i++)
1132 newdt[i] = newdia[uv[i]];
1138 xmid = xint[(int32_t)(
ThRandPos % lxint)];
1142 for (i = 0; i < luv; i++)
1145 s += newdt[i]*bt[i];
1146 else if (xmid < at[i])
1147 s += newdt[i]*at[i];
1152 testsum = s + s1*xmid;
1153 if (testsum <= (d+(1e-15)))
1155 if (testsum >= (d-(1e-15)))
1159 for (i = 0; i < lxint; i++)
1160 if((xint[i] >= xmin) && (xint[i] <= xmax))
1161 xint2[l++] = xint[i];
1163 memcpy(xint, xint2, lxint*
sizeof(
float64_t));
1166 for (i = 0; i < luv; i++)
1169 ts += newdt[i]*bt[i];
1170 else if (xmax <= at[i])
1171 ts += newdt[i]*at[i];
1172 else if ((at[i] <= xmin) && (bt[i] >= xmax))
1178 memcpy(uv, uvt, luv*
sizeof(int32_t));
1187 for (i = 0; i < n; i++)
1191 else if (a[i] >= xmax)
1193 else if ((a[i]<=xmin) && (xmax<=b[i]))
1199 for (i = 0; i < n; i++)
1200 x[i] = (2.0*x[i]*iy[i]-qk[i]);
1202 #ifndef VARIABLES_ON_STACK
1226 return Pardalos(n, iy, e, qk, l, u, x);
1228 return ProjectDai(n, iy, e, qk, l, u, x, lambda);