154 void Thomas(
double *zMax,
double *z0,
double * Av,
int nn){
187 for (i=1;i < nn; i++){
189 z0[i]=tt - tt / (i+2);
200 z_max= fabs(z0[nn-1]);
202 for (i=nn-2; i>=0; i--){
204 z0[i]+= z0[i+1] - z0[i+1]/ (i+2);
225 void Rose(
double *zMax,
double *z0,
double * Av,
int nn){
267 z0[nn-1]=Av[nn-1]- s;
268 for (i=nn-2;i >=0; i--){
269 z0[i]=Av[i] + z0[i+1];
276 for (i=0; i<nn; i++){
308 int supportSet(
double *x,
double *v,
double *z,
double *g,
int * S,
double lambda,
int nn){
310 int i, j, n=nn+1, numS=0;
320 if ( ( (z[i]==lambda) && (g[i] < delta) ) || ( (z[i]==-lambda) && (g[i] >delta) )){
352 for (i=0;i<=S[0]; i++)
355 temp=( temp + z[ S[0] ] ) / (S[0] +1);
356 for (i=0;i<=S[0]; i++)
364 for (j=1; j < numS; j++){
366 for (i= S[j-1] +1; i<= S[j]; i++){
372 temp=(temp - z[ S[j-1] ] + z[ S[j] ])/ (S[j]- S[j-1]);
374 for (i= S[j-1] +1; i<= S[j]; i++){
383 for (i=S[numS-1] +1 ;i< n; i++)
387 temp=( temp - z[ S[numS-1] ] ) / (nn - S[numS-1]);
389 for (i=S[numS-1] +1 ;i< n; i++)
416 void dualityGap(
double *gap,
double *z,
double *g,
double *s,
double *Av,
double lambda,
int nn){
422 g[0]=z[0] + z[0] - z[1] - Av[0];
423 for (i=1;i<nn-1;i++){
424 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
426 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
445 temp=temp + s[i] *g[i]
460 void dualityGap2(
double *gap,
double *z,
double *g,
double *s,
double *Av,
double lambda,
int nn){
491 temp=temp + s[i] *g[i]
508 int generateSolution(
double *x,
double *z,
double *gap,
509 double *v,
double *Av,
510 double *g,
double *s,
int *S,
511 double lambda,
int nn){
513 int i, m, numS, n=nn+1;
514 double temp, funVal1, funVal2;
534 temp+=z[i]*(g[i] + Av[i]);
537 temp=temp + z[i] *(g[i] + Av[i])
538 + z[i+1]*(g[i+1] + Av[i+1])
539 + z[i+2]*(g[i+2] + Av[i+2])
540 + z[i+3]*(g[i+3] + Av[i+3])
541 + z[i+4]*(g[i+4] + Av[i+4]);
551 temp=temp + fabs(g[i])
556 funVal1=funVal1+ temp*lambda;
563 numS= supportSet(x, v, z, g, S, lambda, nn);
573 temp+=(x[i]-v[i]) * (x[i]-v[i]);
576 temp=temp + (x[i]- v[i]) * ( x[i]- v[i])
577 + (x[i+1]-v[i+1]) * (x[i+1]-v[i+1])
578 + (x[i+2]-v[i+2]) * (x[i+2]-v[i+2])
579 + (x[i+3]-v[i+3]) * (x[i+3]-v[i+3])
580 + (x[i+4]-v[i+4]) * (x[i+4]-v[i+4]);
587 temp+=fabs( x[i+1]-x[i] );
590 temp=temp + fabs( x[i+1]-x[i] )
591 + fabs( x[i+2]-x[i+1] )
592 + fabs( x[i+3]-x[i+2] )
593 + fabs( x[i+4]-x[i+3] )
594 + fabs( x[i+5]-x[i+4] );
595 funVal2=funVal2 + lambda * temp;
605 if (funVal2 > funVal1){
610 x[i]= v[i] - z[i-1] + z[i];
611 x[n-1]=v[n-1] - z[n-2];
621 *gap=*gap - (funVal1- funVal2);
630 void restartMapping(
double *g,
double *z,
double * v,
631 double lambda,
int nn)
636 int* S=(
int *) malloc(
sizeof(
int)*nn);
637 double *x=(
double *)malloc(
sizeof(
double)*n);
638 double *s=(
double *)malloc(
sizeof(
double)*nn);
639 double *Av=(
double *)malloc(
sizeof(
double)*nn);
657 g[0]=z[0] + z[0] - z[1] - Av[0];
658 for (i=1;i<nn-1;i++){
659 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
661 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
676 s[i]=Av[i] - x[i+1] + x[i];
683 Thomas(&temp, g, s, nn);
848 int sfa(
double *x,
double *gap,
int * activeS,
849 double *z,
double *z0,
double * v,
double * Av,
850 double lambda,
int nn,
int maxStep,
851 double *s,
double *g,
852 double tol,
int tau,
int flag){
854 int i, iterStep, m, tFlag=0, n=nn+1;
855 double alphap=0, alpha=1, beta=0, temp;
856 int* S=(
int *) malloc(
sizeof(
int)*nn);
857 double gapp=-1, gappp=-1;
858 int numS=-1, numSp=-2, numSpp=-3;;
874 for (iterStep=1; iterStep<=maxStep; iterStep++){
879 beta=(alphap -1 ) / alpha;
890 s[i]=z[i]+ beta* z0[i];
893 s[i] =z[i] + beta* z0[i];
894 s[i+1] =z[i+1] + beta* z0[i+1];
895 s[i+2] =z[i+2] + beta* z0[i+2];
896 s[i+3] =z[i+3] + beta* z0[i+3];
897 s[i+4] =z[i+4] + beta* z0[i+4];
916 g[0]=s[0] + s[0] - s[1] - Av[0];
917 for (i=1;i<nn-1;i++){
918 g[i]= - s[i-1] + s[i] + s[i] - s[i+1] - Av[i];
920 g[nn-1]= -s[nn-2] + s[nn-1] + s[nn-1] - Av[nn-1];
931 for (i=m; i <nn; i+=7){
950 for (i=m;i<nn; i+=5){
951 z[i] = s[i] - g[i] /4;
952 z[i+1] = s[i+1] - g[i+1]/4;
953 z[i+2] = s[i+2] - g[i+2]/4;
954 z[i+3] = s[i+3] - g[i+3]/4;
955 z[i+4] = s[i+4] - g[i+4]/4;
993 alpha=(1+sqrt(4*alpha*alpha+1))/2;
998 if (iterStep%tau==0){
1034 dualityGap(gap, z, g, s, Av, lambda, nn);
1059 numS = supportSet(x, v, z, g, S, lambda, nn);
1078 if ( abs(numS-numSp) < m){
1080 numS=generateSolution(x, z, gap, v, Av,
1081 g, s, S, lambda, nn);
1092 if ( (*gap ==gappp) && (numS==numSpp) ){
1109 s[i]=Av[i] - x[i+1] + x[i];
1115 Thomas(&temp, z, s, nn);
1143 for (i=m; i<nn; i+=7){
1179 temp=temp + fabs(z0[i])
1216 g[0]=z[0] + z[0] - z[1] - Av[0];
1217 for (i=1;i<nn-1;i++){
1218 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1221 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1227 s[i]=-lambda + z[i];
1236 temp=temp + s[i] *g[i]
1287 g[0]=z[0] + z[0] - z[1] - Av[0];
1288 for (i=1;i<nn-1;i++){
1289 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1292 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1298 s[i]=-lambda + z[i];
1307 temp=temp + s[i] *g[i]
1324 temp+=z[i] * (g[i] - Av[i]);
1327 temp=temp + z[i] * (g[i] - Av[i])
1328 + z[i+1]* (g[i+1]- Av[i+1])
1329 + z[i+2]* (g[i+2]- Av[i+2])
1330 + z[i+3]* (g[i+3]- Av[i+3])
1331 + z[i+4]* (g[i+4]- Av[i+4]);
1364 temp=temp + fabs(z0[i])
1393 if ( (flag !=1) || (tFlag==0) ){
1396 x[i]= v[i] - z[i-1] + z[i];
1397 x[n-1]=v[n-1] - z[n-2];
1400 if ( (flag==1) && (tFlag==1)){
1422 g[0]=z[0] + z[0] - z[1] - Av[0];
1423 for (i=1;i<nn-1;i++){
1424 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1426 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1437 for (i=m;i<nn; i+=5){
1438 z[i] = z[i] - g[i] /4;
1439 z[i+1] = z[i+1] - g[i+1]/4;
1440 z[i+2] = z[i+2] - g[i+2]/4;
1441 z[i+3] = z[i+3] - g[i+3]/4;
1442 z[i+4] = z[i+4] - g[i+4]/4;
1450 for (i=0;i<nn; i++){
1465 g[0]=z[0] + z[0] - z[1] - Av[0];
1466 for (i=1;i<nn-1;i++){
1467 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1469 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1472 numS=generateSolution(x, z, gap, v, Av,
1473 g, s, S, lambda, nn);
1500 int sfa_special(
double *x,
double *gap,
int * activeS,
1501 double *z,
double * v,
double * Av,
1502 double lambda,
int nn,
int maxStep,
1503 double *s,
double *g,
1504 double tol,
int tau){
1510 int* S=(
int *) malloc(
sizeof(
int)*nn);
1512 int numS=-1, numSp=-1;
1520 for (iterStep=1; iterStep<=maxStep; iterStep++){
1523 g[0]=z[0] + z[0] - z[1] - Av[0];
1524 for (i=1;i<nn-1;i++){
1525 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1527 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1530 numS = supportSet(x, v, z, g, S, lambda, nn);
1542 s[i]=Av[i] - x[i+1] + x[i];
1549 Thomas(&temp, z, s, nn);
1568 if (iterStep%tau==0){
1571 dualityGap(gap, z, g, s, Av, lambda, nn);
1583 if ( (*gap <1) && (numS==numSp) && (gapp == *gap) ){
1610 int sfa_one(
double *x,
double *gap,
int * activeS,
1611 double *z,
double * v,
double * Av,
1612 double lambda,
int nn,
int maxStep,
1613 double *s,
double *g,
1614 double tol,
int tau){
1620 int* S=(
int *) malloc(
sizeof(
int)*nn);
1621 double gapp=-1, gappp=-2;
1622 int numS=-100, numSp=-200, numSpp=-300;
1648 g[0]=z[0] + z[0] - z[1] - Av[0];
1649 for (i=1;i<nn-1;i++){
1650 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1652 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1663 for (i=m;i<nn; i+=5){
1664 z[i] = z[i] - g[i] /4;
1665 z[i+1] = z[i+1] - g[i+1]/4;
1666 z[i+2] = z[i+2] - g[i+2]/4;
1667 z[i+3] = z[i+3] - g[i+3]/4;
1668 z[i+4] = z[i+4] - g[i+4]/4;
1676 for (i=0;i<nn; i++){
1692 g[0]=z[0] + z[0] - z[1] - Av[0];
1693 for (i=1;i<nn-1;i++){
1694 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1696 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1698 for (iterStep=1; iterStep<=maxStep; iterStep++){
1708 numS = supportSet(x, v, z, g, S, lambda, nn);
1720 s[i]=Av[i] - x[i+1] + x[i];
1727 Thomas(&temp, z, s, nn);
1757 g[0]=z[0] + z[0] - z[1] - Av[0];
1758 for (i=1;i<nn-1;i++){
1759 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1761 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1772 for (i=m;i<nn; i+=5){
1773 z[i] = z[i] - g[i] /4;
1774 z[i+1] = z[i+1] - g[i+1]/4;
1775 z[i+2] = z[i+2] - g[i+2]/4;
1776 z[i+3] = z[i+3] - g[i+3]/4;
1777 z[i+4] = z[i+4] - g[i+4]/4;
1785 for (i=0;i<nn; i++){
1800 g[0]=z[0] + z[0] - z[1] - Av[0];
1801 for (i=1;i<nn-1;i++){
1802 g[i]= - z[i-1] + z[i] + z[i] - z[i+1] - Av[i];
1804 g[nn-1]= -z[nn-2] + z[nn-1] + z[nn-1] - Av[nn-1];
1807 if (iterStep % tau==0){
1811 dualityGap2(gap, z, g, s, Av, lambda, nn);
1847 if ( abs( numS-numSp) <m ){
1853 m=generateSolution(x, z, gap, v, Av,
1854 g, s, S, lambda, nn);
1865 if ( (*gap ==gappp) && (numS==numSpp) ){
1882 numS=generateSolution(x, z, gap, v, Av, g, s, S, lambda, nn);
1892 #endif //USE_GPL_SHOGUN