lbfgsb 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/LICENSE.txt +1 -1
- data/README.md +16 -2
- data/ext/lbfgsb/extconf.rb +12 -3
- data/ext/lbfgsb/lbfgsbext.c +48 -17
- data/ext/lbfgsb/lbfgsbext.h +1 -1
- data/ext/lbfgsb/src/blas.c +25 -25
- data/ext/lbfgsb/src/blas.h +5 -5
- data/ext/lbfgsb/src/common.h +16 -0
- data/ext/lbfgsb/src/lbfgsb.c +260 -281
- data/ext/lbfgsb/src/lbfgsb.h +45 -43
- data/ext/lbfgsb/src/linpack.c +23 -24
- data/ext/lbfgsb/src/linpack.h +3 -3
- data/lib/lbfgsb/version.rb +1 -1
- data/lib/lbfgsb.rb +3 -2
- metadata +8 -16
- data/.clang-format +0 -149
- data/.github/workflows/build.yml +0 -21
- data/.gitignore +0 -17
- data/.rspec +0 -3
- data/.yardopts +0 -1
- data/Gemfile +0 -10
- data/Rakefile +0 -15
- data/Steepfile +0 -20
- data/lbfgsb.gemspec +0 -33
- data/sig/patch.rbs +0 -11
data/ext/lbfgsb/src/lbfgsb.c
CHANGED
@@ -43,14 +43,14 @@
|
|
43
43
|
*
|
44
44
|
* March 2011
|
45
45
|
*/
|
46
|
-
|
47
|
-
#include "lbfgsb.h"
|
48
46
|
#include "blas.h"
|
49
47
|
#include "linpack.h"
|
50
48
|
|
49
|
+
#include "lbfgsb.h"
|
50
|
+
|
51
51
|
static double c_b9 = 0.;
|
52
|
-
static
|
53
|
-
static
|
52
|
+
static F77_int c__1 = 1;
|
53
|
+
static F77_int c__11 = 11;
|
54
54
|
static double c_b280 = .001;
|
55
55
|
static double c_b281 = .9;
|
56
56
|
static double c_b282 = .1;
|
@@ -63,11 +63,11 @@ static double c_b282 = .1;
|
|
63
63
|
* constrained optimization problem by calling mainlb.
|
64
64
|
* (The direct method will be used in the subspace minimization.)
|
65
65
|
*
|
66
|
-
* n is an
|
66
|
+
* n is an integer variable.
|
67
67
|
* On entry n is the dimension of the problem.
|
68
68
|
* On exit n is unchanged.
|
69
69
|
*
|
70
|
-
* m is an
|
70
|
+
* m is an integer variable.
|
71
71
|
* On entry m is the maximum number of variable metric corrections
|
72
72
|
* used to define the limited memory matrix.
|
73
73
|
* On exit m is unchanged.
|
@@ -84,7 +84,7 @@ static double c_b282 = .1;
|
|
84
84
|
* On entry u is the upper bound on x.
|
85
85
|
* On exit u is unchanged.
|
86
86
|
*
|
87
|
-
* nbd is an
|
87
|
+
* nbd is an integer array of dimension n.
|
88
88
|
* On entry nbd represents the type of bounds imposed on the
|
89
89
|
* variables, and must be specified as follows:
|
90
90
|
* nbd(i)=0 if x(i) is unbounded,
|
@@ -126,12 +126,12 @@ static double c_b282 = .1;
|
|
126
126
|
* wa is a double precision working array of length
|
127
127
|
* (2mmax + 5)nmax + 12mmax^2 + 12mmax.
|
128
128
|
*
|
129
|
-
* iwa is an
|
129
|
+
* iwa is an integer working array of length 3nmax.
|
130
130
|
*
|
131
131
|
* task is a working string of characters of length 60 indicating
|
132
132
|
* the current job when entering and quitting this subroutine.
|
133
133
|
*
|
134
|
-
* iprint is an
|
134
|
+
* iprint is an integer variable that must be set by the user.
|
135
135
|
* It controls the frequency and type of output generated:
|
136
136
|
* iprint<0 no output is generated;
|
137
137
|
* iprint=0 print only one line at the last iteration;
|
@@ -153,7 +153,7 @@ static double c_b282 = .1;
|
|
153
153
|
* If lsave(3) = .true. then each variable has upper and lower
|
154
154
|
* bounds;
|
155
155
|
*
|
156
|
-
* isave is an
|
156
|
+
* isave is an integer working array of dimension 44.
|
157
157
|
* On exit with 'task' = NEW_X, the following information is
|
158
158
|
* available:
|
159
159
|
* isave(22) = the total number of intervals explored in the
|
@@ -232,11 +232,11 @@ static double c_b282 = .1;
|
|
232
232
|
* Ciyou Zhu
|
233
233
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
234
234
|
*/
|
235
|
-
|
236
|
-
double* wa,
|
237
|
-
|
235
|
+
void setulb_(F77_int* n, F77_int* m, double* x, double* l, double* u, F77_int* nbd, double* f, double* g, double* factr, double* pgtol,
|
236
|
+
double* wa, F77_int* iwa, char* task, F77_int* iprint, char* csave, F77_int* lsave, F77_int* isave, double* dsave) {
|
237
|
+
F77_int i__1;
|
238
238
|
|
239
|
-
static
|
239
|
+
static F77_int ld, lr, lt, lz, lwa, lwn, lss, lxp, lws, lwt, lsy, lwy, lsnd;
|
240
240
|
|
241
241
|
/* jlm-jn */
|
242
242
|
--iwa;
|
@@ -286,7 +286,6 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
286
286
|
mainlb_(n, m, &x[1], &l[1], &u[1], &nbd[1], f, &g[1], factr, pgtol, &wa[lws], &wa[lwy], &wa[lsy], &wa[lss], &wa[lwt],
|
287
287
|
&wa[lwn], &wa[lsnd], &wa[lz], &wa[lr], &wa[ld], &wa[lt], &wa[lxp], &wa[lwa], &iwa[1], &iwa[*n + 1],
|
288
288
|
&iwa[(*n << 1) + 1], task, iprint, csave, &lsave[1], &isave[22], &dsave[1]);
|
289
|
-
return 0;
|
290
289
|
}
|
291
290
|
|
292
291
|
/**
|
@@ -295,11 +294,11 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
295
294
|
* This subroutine solves bound constrained optimization problems by
|
296
295
|
* using the compact formula of the limited memory BFGS updates.
|
297
296
|
*
|
298
|
-
* n is an
|
297
|
+
* n is an integer variable.
|
299
298
|
* On entry n is the number of variables.
|
300
299
|
* On exit n is unchanged.
|
301
300
|
*
|
302
|
-
* m is an
|
301
|
+
* m is an integer variable.
|
303
302
|
* On entry m is the maximum number of variable metric
|
304
303
|
* corrections allowed in the limited memory matrix.
|
305
304
|
* On exit m is unchanged.
|
@@ -316,7 +315,7 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
316
315
|
* On entry u is the upper bound of x.
|
317
316
|
* On exit u is unchanged.
|
318
317
|
*
|
319
|
-
* nbd is an
|
318
|
+
* nbd is an integer array of dimension n.
|
320
319
|
* On entry nbd represents the type of bounds imposed on the
|
321
320
|
* variables, and must be specified as follows:
|
322
321
|
* nbd(i)=0 if x(i) is unbounded,
|
@@ -384,11 +383,11 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
384
383
|
*
|
385
384
|
* sg(m),sgo(m),yg(m),ygo(m) are double precision working arrays.
|
386
385
|
*
|
387
|
-
* index is an
|
386
|
+
* index is an integer working array of dimension n.
|
388
387
|
* In subroutine freev, index is used to store the free and fixed
|
389
388
|
* variables at the Generalized Cauchy Point (GCP).
|
390
389
|
*
|
391
|
-
* iwhere is an
|
390
|
+
* iwhere is an integer working array of dimension n used to record
|
392
391
|
* the status of the vector x for GCP computation.
|
393
392
|
* iwhere(i)=0 or -3 if x(i) is free and has bounds,
|
394
393
|
* 1 if x(i) is fixed at l(i), and l(i) .ne. u(i)
|
@@ -396,7 +395,7 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
396
395
|
* 3 if x(i) is always fixed, i.e., u(i)=x(i)=l(i)
|
397
396
|
* -1 if x(i) is always free, i.e., no bounds on it.
|
398
397
|
*
|
399
|
-
* indx2 is an
|
398
|
+
* indx2 is an integer working array of dimension n.
|
400
399
|
* Within subroutine cauchy, indx2 corresponds to the array iorder.
|
401
400
|
* In subroutine freev, a list of variables entering and leaving
|
402
401
|
* the free set is stored in indx2, and it is passed on to
|
@@ -405,7 +404,7 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
405
404
|
* task is a working string of characters of length 60 indicating
|
406
405
|
* the current job when entering and leaving this subroutine.
|
407
406
|
*
|
408
|
-
* iprint is an
|
407
|
+
* iprint is an integer variable that must be set by the user.
|
409
408
|
* It controls the frequency and type of output generated:
|
410
409
|
* iprint<0 no output is generated;
|
411
410
|
* iprint=0 print only one line at the last iteration;
|
@@ -420,7 +419,7 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
420
419
|
*
|
421
420
|
* lsave is a logical working array of dimension 4.
|
422
421
|
*
|
423
|
-
* isave is an
|
422
|
+
* isave is an integer working array of dimension 23.
|
424
423
|
*
|
425
424
|
* dsave is a double precision working array of dimension 29.
|
426
425
|
*
|
@@ -465,51 +464,51 @@ int setulb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
465
464
|
* Ciyou Zhu
|
466
465
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
467
466
|
*/
|
468
|
-
|
467
|
+
void mainlb_(F77_int* n, F77_int* m, double* x, double* l, double* u, F77_int* nbd, double* f, double* g, double* factr, double* pgtol,
|
469
468
|
double* ws, double* wy, double* sy, double* ss, double* wt, double* wn, double* snd, double* z__, double* r__,
|
470
|
-
double* d__, double* t, double* xp, double* wa,
|
471
|
-
char* csave,
|
472
|
-
|
469
|
+
double* d__, double* t, double* xp, double* wa, F77_int* index, F77_int* iwhere, F77_int* indx2, char* task, F77_int* iprint,
|
470
|
+
char* csave, F77_int* lsave, F77_int* isave, double* dsave) {
|
471
|
+
F77_int ws_dim1, ws_offset, wy_dim1, wy_offset, sy_dim1, sy_offset, ss_dim1, ss_offset, wt_dim1, wt_offset, wn_dim1, wn_offset,
|
473
472
|
snd_dim1, snd_offset, i__1;
|
474
473
|
double d__1, d__2;
|
475
474
|
FILE* itfptr;
|
476
|
-
static
|
475
|
+
static F77_int i__, k;
|
477
476
|
static double gd, dr, rr, dtd;
|
478
|
-
static
|
477
|
+
static F77_int col;
|
479
478
|
static double tol;
|
480
|
-
static
|
479
|
+
static F77_int wrk;
|
481
480
|
static double stp, cpu1, cpu2;
|
482
|
-
static
|
481
|
+
static F77_int head;
|
483
482
|
static double fold;
|
484
|
-
static
|
483
|
+
static F77_int nact;
|
485
484
|
static double ddum;
|
486
|
-
static
|
485
|
+
static F77_int info, nseg;
|
487
486
|
static double time;
|
488
|
-
static
|
487
|
+
static F77_int nfgv, ifun, iter;
|
489
488
|
static char word[4];
|
490
489
|
static double time1, time2;
|
491
|
-
static
|
490
|
+
static F77_int iback;
|
492
491
|
static double gdold;
|
493
|
-
static
|
494
|
-
static
|
495
|
-
static
|
492
|
+
static F77_int nfree;
|
493
|
+
static F77_int boxed;
|
494
|
+
static F77_int itail;
|
496
495
|
static double theta;
|
497
496
|
static double dnorm;
|
498
|
-
static
|
497
|
+
static F77_int nskip, iword;
|
499
498
|
static double xstep, stpmx;
|
500
|
-
static
|
499
|
+
static F77_int ileave;
|
501
500
|
static double cachyt;
|
502
|
-
static
|
501
|
+
static F77_int itfile;
|
503
502
|
static double epsmch;
|
504
|
-
static
|
503
|
+
static F77_int updatd;
|
505
504
|
static double sbtime;
|
506
|
-
static
|
507
|
-
static
|
505
|
+
static F77_int prjctd;
|
506
|
+
static F77_int iupdat;
|
508
507
|
static double sbgnrm;
|
509
|
-
static
|
510
|
-
static
|
508
|
+
static F77_int cnstnd;
|
509
|
+
static F77_int nenter;
|
511
510
|
static double lnscht;
|
512
|
-
static
|
511
|
+
static F77_int nintol;
|
513
512
|
|
514
513
|
--indx2;
|
515
514
|
--iwhere;
|
@@ -600,7 +599,7 @@ int mainlb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
600
599
|
if (strncmp(task, "ERROR", 5) == 0) {
|
601
600
|
prn3lb_(n, &x[1], f, task, iprint, &info, &itfile, &iter, &nfgv, &nintol, &nskip, &nact, &sbgnrm, &c_b9, &nseg, word,
|
602
601
|
&iback, &stp, &xstep, &k, &cachyt, &sbtime, &lnscht);
|
603
|
-
return
|
602
|
+
return;
|
604
603
|
}
|
605
604
|
prn1lb_(n, m, &l[1], &u[1], &x[1], iprint, &itfile, &epsmch);
|
606
605
|
/* Initialize iwhere & project x onto the feasible set. */
|
@@ -660,8 +659,8 @@ int mainlb_(long* n, long* m, double* x, double* l, double* u, long* nbd, double
|
|
660
659
|
if (strncmp(task, "STOP", 4) == 0) {
|
661
660
|
if (strncmp(task + 6, "CPU", 3) == 0) {
|
662
661
|
/* restore the previous iterate. */
|
663
|
-
|
664
|
-
|
662
|
+
dcopy_(n, &t[1], &c__1, &x[1], &c__1);
|
663
|
+
dcopy_(n, &r__[1], &c__1, &g[1], &c__1);
|
665
664
|
*f = fold;
|
666
665
|
}
|
667
666
|
goto L999;
|
@@ -676,9 +675,9 @@ L111:
|
|
676
675
|
/* Compute the infinity norm of the (-) projected gradient. */
|
677
676
|
projgr_(n, &l[1], &u[1], &nbd[1], &x[1], &g[1], &sbgnrm);
|
678
677
|
if (*iprint >= 1) {
|
679
|
-
fprintf(stdout, "\nAt iterate%
|
678
|
+
fprintf(stdout, "\nAt iterate%5" PRIdF77INT " f= %12.5E |proj g|= %12.5E\n", iter, *f, sbgnrm);
|
680
679
|
itfptr = fopen("iterate.dat", "a");
|
681
|
-
fprintf(itfptr, " %
|
680
|
+
fprintf(itfptr, " %4" PRIdF77INT " %4" PRIdF77INT " - - - - - - %10.3E %10.3E\n", iter, nfgv, sbgnrm, *f);
|
682
681
|
fclose(itfptr);
|
683
682
|
}
|
684
683
|
if (sbgnrm <= *pgtol) {
|
@@ -690,13 +689,13 @@ L111:
|
|
690
689
|
L222:
|
691
690
|
if (*iprint >= 99) {
|
692
691
|
i__1 = iter + 1;
|
693
|
-
fprintf(stdout, "\n\nITERATION %
|
692
|
+
fprintf(stdout, "\n\nITERATION %5" PRIdF77INT "\n", i__1);
|
694
693
|
}
|
695
694
|
iword = -1;
|
696
695
|
|
697
696
|
if (!cnstnd && col > 0) {
|
698
697
|
/* skip the search for GCP. */
|
699
|
-
|
698
|
+
dcopy_(n, &x[1], &c__1, &z__[1], &c__1);
|
700
699
|
wrk = updatd;
|
701
700
|
nseg = 0;
|
702
701
|
goto L333;
|
@@ -815,8 +814,8 @@ L666:
|
|
815
814
|
&xstep, &stpmx, &iter, &ifun, &iback, &nfgv, &info, task, &boxed, &cnstnd, csave, &isave[22], &dsave[17]);
|
816
815
|
if (info != 0 || iback >= 20) {
|
817
816
|
/* restore the previous iterate. */
|
818
|
-
|
819
|
-
|
817
|
+
dcopy_(n, &t[1], &c__1, &x[1], &c__1);
|
818
|
+
dcopy_(n, &r__[1], &c__1, &g[1], &c__1);
|
820
819
|
*f = fold;
|
821
820
|
if (col == 0) {
|
822
821
|
/* abnormal termination. */
|
@@ -890,13 +889,13 @@ L777:
|
|
890
889
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
891
890
|
r__[i__] = g[i__] - r__[i__];
|
892
891
|
}
|
893
|
-
rr =
|
892
|
+
rr = ddot_(n, &r__[1], &c__1, &r__[1], &c__1);
|
894
893
|
if (stp == 1.) {
|
895
894
|
dr = gd - gdold;
|
896
895
|
ddum = -gdold;
|
897
896
|
} else {
|
898
897
|
dr = (gd - gdold) * stp;
|
899
|
-
|
898
|
+
dscal_(n, &stp, &d__[1], &c__1);
|
900
899
|
ddum = -gdold * stp;
|
901
900
|
}
|
902
901
|
if (dr <= epsmch * ddum) {
|
@@ -988,7 +987,6 @@ L1000:
|
|
988
987
|
dsave[14] = stp;
|
989
988
|
dsave[15] = gdold;
|
990
989
|
dsave[16] = dtd;
|
991
|
-
return 0;
|
992
990
|
}
|
993
991
|
|
994
992
|
/**
|
@@ -997,7 +995,7 @@ L1000:
|
|
997
995
|
* This subroutine initializes iwhere and projects the initial x to
|
998
996
|
* the feasible set if necessary.
|
999
997
|
*
|
1000
|
-
* iwhere is an
|
998
|
+
* iwhere is an integer array of dimension n.
|
1001
999
|
* On entry iwhere is unspecified.
|
1002
1000
|
* On exit iwhere(i)=-1 if x(i) has no bounds
|
1003
1001
|
* 3 if l(i)=u(i)
|
@@ -1013,10 +1011,10 @@ L1000:
|
|
1013
1011
|
* Ciyou Zhu
|
1014
1012
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
1015
1013
|
*/
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
static
|
1014
|
+
void active_(F77_int* n, double* l, double* u, F77_int* nbd, double* x, F77_int* iwhere, F77_int* iprint, F77_int* prjctd, F77_int* cnstnd,
|
1015
|
+
F77_int* boxed) {
|
1016
|
+
F77_int i__1;
|
1017
|
+
static F77_int i__, nbdd;
|
1020
1018
|
--iwhere;
|
1021
1019
|
--x;
|
1022
1020
|
--nbd;
|
@@ -1077,9 +1075,8 @@ int active_(long* n, double* l, double* u, long* nbd, double* x, long* iwhere, l
|
|
1077
1075
|
}
|
1078
1076
|
if (*iprint > 0) {
|
1079
1077
|
fprintf(stdout, "\n");
|
1080
|
-
fprintf(stdout, "At X0 %
|
1078
|
+
fprintf(stdout, "At X0 %9" PRIdF77INT " variables are exactly at the bounds\n", nbdd);
|
1081
1079
|
}
|
1082
|
-
return 0;
|
1083
1080
|
}
|
1084
1081
|
|
1085
1082
|
/**
|
@@ -1089,7 +1086,7 @@ int active_(long* n, double* l, double* u, long* nbd, double* x, long* iwhere, l
|
|
1089
1086
|
* in the compact L-BFGS formula of B and a 2m vector v;
|
1090
1087
|
* it returns the product in p.
|
1091
1088
|
*
|
1092
|
-
* m is an
|
1089
|
+
* m is an integer variable.
|
1093
1090
|
* On entry m is the maximum number of variable metric corrections
|
1094
1091
|
* used to define the limited memory matrix.
|
1095
1092
|
* On exit m is unchanged.
|
@@ -1103,7 +1100,7 @@ int active_(long* n, double* l, double* u, long* nbd, double* x, long* iwhere, l
|
|
1103
1100
|
* the Cholesky factor of (thetaS'S+LD^(-1)L').
|
1104
1101
|
* On exit wt is unchanged.
|
1105
1102
|
*
|
1106
|
-
* col is an
|
1103
|
+
* col is an integer variable.
|
1107
1104
|
* On entry col specifies the number of s-vectors (or y-vectors)
|
1108
1105
|
* stored in the compact L-BFGS formula.
|
1109
1106
|
* On exit col is unchanged.
|
@@ -1116,7 +1113,7 @@ int active_(long* n, double* l, double* u, long* nbd, double* x, long* iwhere, l
|
|
1116
1113
|
* On entry p is unspecified.
|
1117
1114
|
* On exit p is the product Mv.
|
1118
1115
|
*
|
1119
|
-
* info is an
|
1116
|
+
* info is an integer variable.
|
1120
1117
|
* On entry info is unspecified.
|
1121
1118
|
* On exit info = 0 for normal return,
|
1122
1119
|
* = nonzero for abnormal return when the system
|
@@ -1135,9 +1132,9 @@ int active_(long* n, double* l, double* u, long* nbd, double* x, long* iwhere, l
|
|
1135
1132
|
* Ciyou Zhu
|
1136
1133
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
1137
1134
|
*/
|
1138
|
-
|
1139
|
-
|
1140
|
-
static
|
1135
|
+
void bmv_(F77_int* m, double* sy, double* wt, F77_int* col, double* v, double* p, F77_int* info) {
|
1136
|
+
F77_int sy_dim1, sy_offset, wt_dim1, wt_offset, i__1, i__2;
|
1137
|
+
static F77_int i__, k, i2;
|
1141
1138
|
static double sum;
|
1142
1139
|
|
1143
1140
|
wt_dim1 = *m;
|
@@ -1150,7 +1147,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1150
1147
|
--v;
|
1151
1148
|
|
1152
1149
|
if (*col == 0) {
|
1153
|
-
return
|
1150
|
+
return;
|
1154
1151
|
}
|
1155
1152
|
/* PART I: solve [ D^(1/2) O ] [ p1 ] = [ v1 ] */
|
1156
1153
|
/* [ -L*D^(-1/2) J ] [ p2 ] [ v2 ]. */
|
@@ -1167,9 +1164,9 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1167
1164
|
p[i2] = v[i2] + sum;
|
1168
1165
|
}
|
1169
1166
|
/* Solve the triangular system */
|
1170
|
-
|
1167
|
+
dtrsl_(&wt[wt_offset], m, col, &p[*col + 1], &c__11, info);
|
1171
1168
|
if (*info != 0) {
|
1172
|
-
return
|
1169
|
+
return;
|
1173
1170
|
}
|
1174
1171
|
/* solve D^(1/2)p1=v1. */
|
1175
1172
|
i__1 = *col;
|
@@ -1179,9 +1176,9 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1179
1176
|
/* PART II: solve [ -D^(1/2) D^(-1/2)*L' ] [ p1 ] = [ p1 ] */
|
1180
1177
|
/* [ 0 J' ] [ p2 ] [ p2 ]. */
|
1181
1178
|
/* solve J^Tp2=p2. */
|
1182
|
-
|
1179
|
+
dtrsl_(&wt[wt_offset], m, col, &p[*col + 1], &c__1, info);
|
1183
1180
|
if (*info != 0) {
|
1184
|
-
return
|
1181
|
+
return;
|
1185
1182
|
}
|
1186
1183
|
/* compute p1=-D^(-1/2)(p1-D^(-1/2)L'p2) */
|
1187
1184
|
/* =-D^(-1/2)p1+D^(-1)L'p2. */
|
@@ -1198,7 +1195,6 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1198
1195
|
}
|
1199
1196
|
p[i__] += sum;
|
1200
1197
|
}
|
1201
|
-
return 0;
|
1202
1198
|
}
|
1203
1199
|
|
1204
1200
|
/**
|
@@ -1212,10 +1208,10 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1212
1208
|
*
|
1213
1209
|
* Q(x + s) = g's + 1/2 s'Bs
|
1214
1210
|
*
|
1215
|
-
*
|
1211
|
+
* aF77_int the projected gradient direction P(x-tg,l,u).
|
1216
1212
|
* The routine returns the GCP in xcp.
|
1217
1213
|
*
|
1218
|
-
* n is an
|
1214
|
+
* n is an integer variable.
|
1219
1215
|
* On entry n is the dimension of the problem.
|
1220
1216
|
* On exit n is unchanged.
|
1221
1217
|
*
|
@@ -1231,7 +1227,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1231
1227
|
* On entry u is the upper bound of x.
|
1232
1228
|
* On exit u is unchanged.
|
1233
1229
|
*
|
1234
|
-
* nbd is an
|
1230
|
+
* nbd is an integer array of dimension n.
|
1235
1231
|
* On entry nbd represents the type of bounds imposed on the
|
1236
1232
|
* variables, and must be specified as follows:
|
1237
1233
|
* nbd(i)=0 if x(i) is unbounded,
|
@@ -1244,7 +1240,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1244
1240
|
* On entry g is the gradient of f(x). g must be a nonzero vector.
|
1245
1241
|
* On exit g is unchanged.
|
1246
1242
|
*
|
1247
|
-
* iorder is an
|
1243
|
+
* iorder is an integer working array of dimension n.
|
1248
1244
|
* iorder will be used to store the breakpoints in the piecewise
|
1249
1245
|
* linear path and free variables encountered. On exit,
|
1250
1246
|
* iorder(1),...,iorder(nleft) are indices of breakpoints
|
@@ -1252,9 +1248,9 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1252
1248
|
* iorder(nleft+1),...,iorder(nbreak) are indices of
|
1253
1249
|
* encountered breakpoints; and
|
1254
1250
|
* iorder(nfree),...,iorder(n) are indices of variables which
|
1255
|
-
* have no bound constraits
|
1251
|
+
* have no bound constraits aF77_int the search direction.
|
1256
1252
|
*
|
1257
|
-
* iwhere is an
|
1253
|
+
* iwhere is an integer array of dimension n.
|
1258
1254
|
* On entry iwhere indicates only the permanently fixed (iwhere=3)
|
1259
1255
|
* or free (iwhere= -1) components of x.
|
1260
1256
|
* On exit iwhere records the status of the current x variables.
|
@@ -1274,7 +1270,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1274
1270
|
* xcp is a double precision array of dimension n used to return the
|
1275
1271
|
* GCP on exit.
|
1276
1272
|
*
|
1277
|
-
* m is an
|
1273
|
+
* m is an integer variable.
|
1278
1274
|
* On entry m is the maximum number of variable metric corrections
|
1279
1275
|
* used to define the limited memory matrix.
|
1280
1276
|
* On exit m is unchanged.
|
@@ -1293,12 +1289,12 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1293
1289
|
* On entry theta is the scaling factor specifying B_0 = theta I.
|
1294
1290
|
* On exit theta is unchanged.
|
1295
1291
|
*
|
1296
|
-
* col is an
|
1292
|
+
* col is an integer variable.
|
1297
1293
|
* On entry col is the actual number of variable metric
|
1298
1294
|
* corrections stored so far.
|
1299
1295
|
* On exit col is unchanged.
|
1300
1296
|
*
|
1301
|
-
* head is an
|
1297
|
+
* head is an integer variable.
|
1302
1298
|
* On entry head is the location of the first s-vector (or y-vector)
|
1303
1299
|
* in S (or Y).
|
1304
1300
|
* On exit col is unchanged.
|
@@ -1315,7 +1311,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1315
1311
|
*
|
1316
1312
|
* v is a double precision working array of dimension 2m.
|
1317
1313
|
*
|
1318
|
-
* nseg is an
|
1314
|
+
* nseg is an integer variable.
|
1319
1315
|
* On exit nseg records the number of quadratic segments explored
|
1320
1316
|
* in searching for the GCP.
|
1321
1317
|
*
|
@@ -1323,7 +1319,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1323
1319
|
* On entry sg and yg store S'g and Y'g correspondingly.
|
1324
1320
|
* On exit they are unchanged.
|
1325
1321
|
*
|
1326
|
-
* iprint is an
|
1322
|
+
* iprint is an integer variable that must be set by the user.
|
1327
1323
|
* It controls the frequency and type of output generated:
|
1328
1324
|
* iprint<0 no output is generated;
|
1329
1325
|
* iprint=0 print only one line at the last iteration;
|
@@ -1338,7 +1334,7 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1338
1334
|
* On entry sbgnrm is the norm of the projected gradient at x.
|
1339
1335
|
* On exit sbgnrm is unchanged.
|
1340
1336
|
*
|
1341
|
-
* info is an
|
1337
|
+
* info is an integer variable.
|
1342
1338
|
* On entry info is 0.
|
1343
1339
|
* On exit info = 0 for normal return,
|
1344
1340
|
* = nonzero for abnormal return when the the system
|
@@ -1374,30 +1370,30 @@ int bmv_(long* m, double* sy, double* wt, long* col, double* v, double* p, long*
|
|
1374
1370
|
* Ciyou Zhu
|
1375
1371
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
1376
1372
|
*/
|
1377
|
-
|
1378
|
-
double* xcp,
|
1379
|
-
double* p, double* c__, double* wbp, double* v,
|
1373
|
+
void cauchy_(F77_int* n, double* x, double* l, double* u, F77_int* nbd, double* g, F77_int* iorder, F77_int* iwhere, double* t, double* d__,
|
1374
|
+
double* xcp, F77_int* m, double* wy, double* ws, double* sy, double* wt, double* theta, F77_int* col, F77_int* head,
|
1375
|
+
double* p, double* c__, double* wbp, double* v, F77_int* nseg, F77_int* iprint, double* sbgnrm, F77_int* info,
|
1380
1376
|
double* epsmch) {
|
1381
|
-
|
1377
|
+
F77_int wy_dim1, wy_offset, ws_dim1, ws_offset, sy_dim1, sy_offset, wt_dim1, wt_offset, i__1, i__2;
|
1382
1378
|
double d__1;
|
1383
|
-
static
|
1379
|
+
static F77_int i__, j;
|
1384
1380
|
static double f1, f2, dt, tj, tl, tu, tj0;
|
1385
|
-
static
|
1381
|
+
static F77_int ibp;
|
1386
1382
|
static double dtm;
|
1387
1383
|
static double wmc, wmp, wmw;
|
1388
|
-
static
|
1384
|
+
static F77_int col2;
|
1389
1385
|
static double dibp;
|
1390
|
-
static
|
1386
|
+
static F77_int iter;
|
1391
1387
|
static double zibp, tsum, dibp2;
|
1392
|
-
static
|
1388
|
+
static F77_int bnded;
|
1393
1389
|
static double neggi;
|
1394
|
-
static
|
1390
|
+
static F77_int nfree;
|
1395
1391
|
static double bkmin;
|
1396
|
-
static
|
1392
|
+
static F77_int nleft;
|
1397
1393
|
static double f2_org__;
|
1398
|
-
static
|
1399
|
-
static
|
1400
|
-
static
|
1394
|
+
static F77_int nbreak, ibkmin;
|
1395
|
+
static F77_int pointr;
|
1396
|
+
static F77_int xlower, xupper;
|
1401
1397
|
|
1402
1398
|
--xcp;
|
1403
1399
|
--d__;
|
@@ -1433,8 +1429,8 @@ int cauchy_(long* n, double* x, double* l, double* u, long* nbd, double* g, long
|
|
1433
1429
|
if (*iprint >= 0) {
|
1434
1430
|
fprintf(stdout, " Subgnorm = 0. GCP = X.\n");
|
1435
1431
|
}
|
1436
|
-
|
1437
|
-
return
|
1432
|
+
dcopy_(n, &x[1], &c__1, &xcp[1], &c__1);
|
1433
|
+
return;
|
1438
1434
|
}
|
1439
1435
|
bnded = TRUE_;
|
1440
1436
|
nfree = *n + 1;
|
@@ -1532,10 +1528,10 @@ int cauchy_(long* n, double* x, double* l, double* u, long* nbd, double* g, long
|
|
1532
1528
|
/* The smallest of the nbreak breakpoints is in t(ibkmin)=bkmin. */
|
1533
1529
|
if (*theta != 1.) {
|
1534
1530
|
/* complete the initialization of p for theta not= one. */
|
1535
|
-
|
1531
|
+
dscal_(col, theta, &p[*col + 1], &c__1);
|
1536
1532
|
}
|
1537
1533
|
/* Initialize GCP xcp = x. */
|
1538
|
-
|
1534
|
+
dcopy_(n, &x[1], &c__1, &xcp[1], &c__1);
|
1539
1535
|
if (nbreak == 0 && nfree == *n + 1) {
|
1540
1536
|
/* is a zero vector, return with the initial xcp as GCP. */
|
1541
1537
|
if (*iprint > 100) {
|
@@ -1551,7 +1547,7 @@ int cauchy_(long* n, double* x, double* l, double* u, long* nbd, double* g, long
|
|
1551
1547
|
}
|
1552
1548
|
fprintf(stdout, "\n");
|
1553
1549
|
}
|
1554
|
-
return
|
1550
|
+
return;
|
1555
1551
|
}
|
1556
1552
|
/* Initialize c = W'(xcp - x) = 0. */
|
1557
1553
|
i__1 = col2;
|
@@ -1564,15 +1560,15 @@ int cauchy_(long* n, double* x, double* l, double* u, long* nbd, double* g, long
|
|
1564
1560
|
if (*col > 0) {
|
1565
1561
|
bmv_(m, &sy[sy_offset], &wt[wt_offset], col, &p[1], &v[1], info);
|
1566
1562
|
if (*info != 0) {
|
1567
|
-
return
|
1563
|
+
return;
|
1568
1564
|
}
|
1569
|
-
f2 -=
|
1565
|
+
f2 -= ddot_(&col2, &v[1], &c__1, &p[1], &c__1);
|
1570
1566
|
}
|
1571
1567
|
dtm = -f1 / f2;
|
1572
1568
|
tsum = 0.;
|
1573
1569
|
*nseg = 1;
|
1574
1570
|
if (*iprint >= 99) {
|
1575
|
-
fprintf(stdout, " There are %
|
1571
|
+
fprintf(stdout, " There are %3" PRIdF77INT " breakpoints \n", nbreak);
|
1576
1572
|
}
|
1577
1573
|
/* If there are no breakpoints, locate the GCP and return. */
|
1578
1574
|
if (nbreak == 0) {
|
@@ -1611,7 +1607,7 @@ L777:
|
|
1611
1607
|
dt = tj - tj0;
|
1612
1608
|
if (dt != 0. && *iprint >= 100) {
|
1613
1609
|
fprintf(stdout, "\n");
|
1614
|
-
fprintf(stdout, "Piece %
|
1610
|
+
fprintf(stdout, "Piece %3" PRIdF77INT " --f1, f2 at start point %11.4E %11.4E\n", *nseg, f1, f2);
|
1615
1611
|
fprintf(stdout, "Distance to the next break point = %11.4E\n", dt);
|
1616
1612
|
fprintf(stdout, "Distance to the stationary point = %11.4E\n", dtm);
|
1617
1613
|
}
|
@@ -1636,7 +1632,7 @@ L777:
|
|
1636
1632
|
iwhere[ibp] = 1;
|
1637
1633
|
}
|
1638
1634
|
if (*iprint >= 100) {
|
1639
|
-
fprintf(stdout, " Variable %
|
1635
|
+
fprintf(stdout, " Variable %" PRIdF77INT " is fixed.\n", ibp);
|
1640
1636
|
}
|
1641
1637
|
if (nleft == 0 && nbreak == *n) {
|
1642
1638
|
/* all n variables are fixed, */
|
@@ -1655,7 +1651,7 @@ L777:
|
|
1655
1651
|
f2 -= *theta * dibp2;
|
1656
1652
|
if (*col > 0) {
|
1657
1653
|
/* update c = c + dt*p. */
|
1658
|
-
|
1654
|
+
daxpy_(&col2, &dt, &p[1], &c__1, &c__[1], &c__1);
|
1659
1655
|
/* choose wbp, */
|
1660
1656
|
/* the row of W corresponding to the breakpoint encountered. */
|
1661
1657
|
pointr = *head;
|
@@ -1668,14 +1664,14 @@ L777:
|
|
1668
1664
|
/* compute (wbp)Mc, (wbp)Mp, and (wbp)M(wbp)'. */
|
1669
1665
|
bmv_(m, &sy[sy_offset], &wt[wt_offset], col, &wbp[1], &v[1], info);
|
1670
1666
|
if (*info != 0) {
|
1671
|
-
return
|
1667
|
+
return;
|
1672
1668
|
}
|
1673
|
-
wmc =
|
1674
|
-
wmp =
|
1675
|
-
wmw =
|
1669
|
+
wmc = ddot_(&col2, &c__[1], &c__1, &v[1], &c__1);
|
1670
|
+
wmp = ddot_(&col2, &p[1], &c__1, &v[1], &c__1);
|
1671
|
+
wmw = ddot_(&col2, &wbp[1], &c__1, &v[1], &c__1);
|
1676
1672
|
/* update p = p - dibp*wbp. */
|
1677
1673
|
d__1 = -dibp;
|
1678
|
-
|
1674
|
+
daxpy_(&col2, &d__1, &wbp[1], &c__1, &p[1], &c__1);
|
1679
1675
|
/* complete updating f1 and f2 while col > 0. */
|
1680
1676
|
f1 += dibp * wmc;
|
1681
1677
|
f2 = f2 + dibp * 2. * wmp - dibp2 * wmw;
|
@@ -1698,7 +1694,7 @@ L888:
|
|
1698
1694
|
if (*iprint >= 99) {
|
1699
1695
|
fprintf(stdout, "\n");
|
1700
1696
|
fprintf(stdout, " GCP found in this segment\n");
|
1701
|
-
fprintf(stdout, "Piece %
|
1697
|
+
fprintf(stdout, "Piece %3" PRIdF77INT " --f1, f2 at start point %11.4E %11.4E\n", *nseg, f1, f2);
|
1702
1698
|
fprintf(stdout, "Distance to the stationary point = %11.4E\n", dtm);
|
1703
1699
|
}
|
1704
1700
|
if (dtm <= 0.) {
|
@@ -1707,12 +1703,12 @@ L888:
|
|
1707
1703
|
tsum += dtm;
|
1708
1704
|
/* Move free variables (i.e., the ones w/o breakpoints) and */
|
1709
1705
|
/* the variables whose breakpoints haven't been reached. */
|
1710
|
-
|
1706
|
+
daxpy_(n, &tsum, &d__[1], &c__1, &xcp[1], &c__1);
|
1711
1707
|
L999:
|
1712
1708
|
/* Update c = c + dtm*p = W'(x^c - x) */
|
1713
1709
|
/* which will be used in computing r = Z'(B(x^c - x) + g). */
|
1714
1710
|
if (*col > 0) {
|
1715
|
-
|
1711
|
+
daxpy_(&col2, &dtm, &p[1], &c__1, &c__[1], &c__1);
|
1716
1712
|
}
|
1717
1713
|
if (*iprint > 100) {
|
1718
1714
|
fprintf(stdout, "Cauchy X = \n");
|
@@ -1730,7 +1726,6 @@ L999:
|
|
1730
1726
|
if (*iprint >= 99) {
|
1731
1727
|
fprintf(stdout, "\n---------------- exit CAUCHY----------------------\n\n");
|
1732
1728
|
}
|
1733
|
-
return 0;
|
1734
1729
|
}
|
1735
1730
|
|
1736
1731
|
/**
|
@@ -1752,12 +1747,12 @@ L999:
|
|
1752
1747
|
* Ciyou Zhu
|
1753
1748
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
1754
1749
|
*/
|
1755
|
-
|
1756
|
-
double* wa,
|
1757
|
-
|
1758
|
-
static
|
1750
|
+
void cmprlb_(F77_int* n, F77_int* m, double* x, double* g, double* ws, double* wy, double* sy, double* wt, double* z__, double* r__,
|
1751
|
+
double* wa, F77_int* index, double* theta, F77_int* col, F77_int* head, F77_int* nfree, F77_int* cnstnd, F77_int* info) {
|
1752
|
+
F77_int ws_dim1, ws_offset, wy_dim1, wy_offset, sy_dim1, sy_offset, wt_dim1, wt_offset, i__1, i__2;
|
1753
|
+
static F77_int i__, j, k;
|
1759
1754
|
static double a1, a2;
|
1760
|
-
static
|
1755
|
+
static F77_int pointr;
|
1761
1756
|
|
1762
1757
|
--index;
|
1763
1758
|
--r__;
|
@@ -1792,7 +1787,7 @@ int cmprlb_(long* n, long* m, double* x, double* g, double* ws, double* wy, doub
|
|
1792
1787
|
bmv_(m, &sy[sy_offset], &wt[wt_offset], col, &wa[(*m << 1) + 1], &wa[1], info);
|
1793
1788
|
if (*info != 0) {
|
1794
1789
|
*info = -8;
|
1795
|
-
return
|
1790
|
+
return;
|
1796
1791
|
}
|
1797
1792
|
pointr = *head;
|
1798
1793
|
i__1 = *col;
|
@@ -1807,7 +1802,6 @@ int cmprlb_(long* n, long* m, double* x, double* g, double* ws, double* wy, doub
|
|
1807
1802
|
pointr = pointr % *m + 1;
|
1808
1803
|
}
|
1809
1804
|
}
|
1810
|
-
return 0;
|
1811
1805
|
}
|
1812
1806
|
|
1813
1807
|
/**
|
@@ -1824,9 +1818,9 @@ int cmprlb_(long* n, long* m, double* x, double* g, double* ws, double* wy, doub
|
|
1824
1818
|
* Ciyou Zhu
|
1825
1819
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
1826
1820
|
*/
|
1827
|
-
|
1828
|
-
|
1829
|
-
static
|
1821
|
+
void errclb_(F77_int* n, F77_int* m, double* factr, double* l, double* u, F77_int* nbd, char* task, F77_int* info, F77_int* k) {
|
1822
|
+
F77_int i__1;
|
1823
|
+
static F77_int i__;
|
1830
1824
|
--nbd;
|
1831
1825
|
--u;
|
1832
1826
|
--l;
|
@@ -1859,7 +1853,6 @@ int errclb_(long* n, long* m, double* factr, double* l, double* u, long* nbd, ch
|
|
1859
1853
|
}
|
1860
1854
|
}
|
1861
1855
|
}
|
1862
|
-
return 0;
|
1863
1856
|
}
|
1864
1857
|
|
1865
1858
|
/**
|
@@ -1875,35 +1868,35 @@ int errclb_(long* n, long* m, double* factr, double* l, double* u, long* nbd, ch
|
|
1875
1868
|
* occurring in section 5.1 of [1], as well as to the matrix
|
1876
1869
|
* Mbar^[-1] Nbar in section 5.3.
|
1877
1870
|
*
|
1878
|
-
* n is an
|
1871
|
+
* n is an integer variable.
|
1879
1872
|
* On entry n is the dimension of the problem.
|
1880
1873
|
* On exit n is unchanged.
|
1881
1874
|
*
|
1882
|
-
* nsub is an
|
1875
|
+
* nsub is an integer variable
|
1883
1876
|
* On entry nsub is the number of subspace variables in free set.
|
1884
1877
|
* On exit nsub is not changed.
|
1885
1878
|
*
|
1886
|
-
* ind is an
|
1879
|
+
* ind is an integer array of dimension nsub.
|
1887
1880
|
* On entry ind specifies the indices of subspace variables.
|
1888
1881
|
* On exit ind is unchanged.
|
1889
1882
|
*
|
1890
|
-
* nenter is an
|
1883
|
+
* nenter is an integer variable.
|
1891
1884
|
* On entry nenter is the number of variables entering the
|
1892
1885
|
* free set.
|
1893
1886
|
* On exit nenter is unchanged.
|
1894
1887
|
*
|
1895
|
-
* ileave is an
|
1888
|
+
* ileave is an integer variable.
|
1896
1889
|
* On entry indx2(ileave),...,indx2(n) are the variables leaving
|
1897
1890
|
* the free set.
|
1898
1891
|
* On exit ileave is unchanged.
|
1899
1892
|
*
|
1900
|
-
* indx2 is an
|
1893
|
+
* indx2 is an integer array of dimension n.
|
1901
1894
|
* On entry indx2(1),...,indx2(nenter) are the variables entering
|
1902
1895
|
* the free set, while indx2(ileave),...,indx2(n) are the
|
1903
1896
|
* variables leaving the free set.
|
1904
1897
|
* On exit indx2 is unchanged.
|
1905
1898
|
*
|
1906
|
-
* iupdat is an
|
1899
|
+
* iupdat is an integer variable.
|
1907
1900
|
* On entry iupdat is the total number of BFGS updates made so far.
|
1908
1901
|
* On exit iupdat is unchanged.
|
1909
1902
|
*
|
@@ -1927,15 +1920,15 @@ int errclb_(long* n, long* m, double* factr, double* l, double* u, long* nbd, ch
|
|
1927
1920
|
* The purpose of wn1 is just to store these inner products
|
1928
1921
|
* so they can be easily updated and inserted into wn.
|
1929
1922
|
*
|
1930
|
-
* m is an
|
1923
|
+
* m is an integer variable.
|
1931
1924
|
* On entry m is the maximum number of variable metric corrections
|
1932
1925
|
* used to define the limited memory matrix.
|
1933
1926
|
* On exit m is unchanged.
|
1934
1927
|
*
|
1935
1928
|
* ws, wy, sy, and wtyy are double precision arrays;
|
1936
1929
|
* theta is a double precision variable;
|
1937
|
-
* col is an
|
1938
|
-
* head is an
|
1930
|
+
* col is an integer variable;
|
1931
|
+
* head is an integer variable.
|
1939
1932
|
* On entry they store the information defining the
|
1940
1933
|
* limited memory BFGS matrix:
|
1941
1934
|
* ws(n,m) stores S, a set of s-vectors;
|
@@ -1948,7 +1941,7 @@ int errclb_(long* n, long* m, double* factr, double* l, double* u, long* nbd, ch
|
|
1948
1941
|
* head is the location of the 1st s- (or y-) vector in S (or Y).
|
1949
1942
|
* On exit they are unchanged.
|
1950
1943
|
*
|
1951
|
-
* info is an
|
1944
|
+
* info is an integer variable.
|
1952
1945
|
* On entry info is unspecified.
|
1953
1946
|
* On exit info = 0 for normal return;
|
1954
1947
|
* = -1 when the 1st Cholesky factorization failed;
|
@@ -1981,13 +1974,13 @@ int errclb_(long* n, long* m, double* factr, double* l, double* u, long* nbd, ch
|
|
1981
1974
|
* Ciyou Zhu
|
1982
1975
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
1983
1976
|
*/
|
1984
|
-
|
1985
|
-
double* wn1,
|
1986
|
-
|
1987
|
-
static
|
1988
|
-
static
|
1977
|
+
void formk_(F77_int* n, F77_int* nsub, F77_int* ind, F77_int* nenter, F77_int* ileave, F77_int* indx2, F77_int* iupdat, F77_int* updatd, double* wn,
|
1978
|
+
double* wn1, F77_int* m, double* ws, double* wy, double* sy, double* theta, F77_int* col, F77_int* head, F77_int* info) {
|
1979
|
+
F77_int wn_dim1, wn_offset, wn1_dim1, wn1_offset, ws_dim1, ws_offset, wy_dim1, wy_offset, sy_dim1, sy_offset, i__1, i__2, i__3;
|
1980
|
+
static F77_int i__, k, k1, m2, is, js, iy, jy, is1, js1, col2, dend, pend;
|
1981
|
+
static F77_int upcl;
|
1989
1982
|
static double temp1, temp2, temp3, temp4;
|
1990
|
-
static
|
1983
|
+
static F77_int ipntr, jpntr, dbegin, pbegin;
|
1991
1984
|
|
1992
1985
|
--indx2;
|
1993
1986
|
--ind;
|
@@ -2019,11 +2012,11 @@ int formk_(long* n, long* nsub, long* ind, long* nenter, long* ileave, long* ind
|
|
2019
2012
|
for (jy = 1; jy <= i__1; ++jy) {
|
2020
2013
|
js = *m + jy;
|
2021
2014
|
i__2 = *m - jy;
|
2022
|
-
|
2015
|
+
dcopy_(&i__2, &wn1[jy + 1 + (jy + 1) * wn1_dim1], &c__1, &wn1[jy + jy * wn1_dim1], &c__1);
|
2023
2016
|
i__2 = *m - jy;
|
2024
|
-
|
2017
|
+
dcopy_(&i__2, &wn1[js + 1 + (js + 1) * wn1_dim1], &c__1, &wn1[js + js * wn1_dim1], &c__1);
|
2025
2018
|
i__2 = *m - 1;
|
2026
|
-
|
2019
|
+
dcopy_(&i__2, &wn1[*m + 2 + (jy + 1) * wn1_dim1], &c__1, &wn1[*m + 1 + jy * wn1_dim1], &c__1);
|
2027
2020
|
}
|
2028
2021
|
}
|
2029
2022
|
/* put new rows in blocks (1,1), (2,1) and (2,2). */
|
@@ -2174,16 +2167,16 @@ int formk_(long* n, long* nsub, long* ind, long* nenter, long* ileave, long* ind
|
|
2174
2167
|
/* [(-L_a +R_z)L'^-1 S'AA'S*theta ] */
|
2175
2168
|
/* first Cholesky factor (1,1) block of wn to get LL' */
|
2176
2169
|
/* with L' stored in the upper triangle of wn. */
|
2177
|
-
|
2170
|
+
dpofa_(&wn[wn_offset], &m2, col, info);
|
2178
2171
|
if (*info != 0) {
|
2179
2172
|
*info = -1;
|
2180
|
-
return
|
2173
|
+
return;
|
2181
2174
|
}
|
2182
2175
|
/* then form L^-1(-L_a'+R_z') in the (1,2) block. */
|
2183
2176
|
col2 = *col << 1;
|
2184
2177
|
i__1 = col2;
|
2185
2178
|
for (js = *col + 1; js <= i__1; ++js) {
|
2186
|
-
|
2179
|
+
dtrsl_(&wn[wn_offset], &m2, col, &wn[js * wn_dim1 + 1], &c__11, info);
|
2187
2180
|
}
|
2188
2181
|
/* Form S'AA'S*theta + (L^-1(-L_a'+R_z'))'L^-1(-L_a'+R_z') in the */
|
2189
2182
|
/* upper triangle of (2,2) block of wn. */
|
@@ -2191,16 +2184,14 @@ int formk_(long* n, long* nsub, long* ind, long* nenter, long* ileave, long* ind
|
|
2191
2184
|
for (is = *col + 1; is <= i__1; ++is) {
|
2192
2185
|
i__2 = col2;
|
2193
2186
|
for (js = is; js <= i__2; ++js) {
|
2194
|
-
wn[is + js * wn_dim1] +=
|
2187
|
+
wn[is + js * wn_dim1] += ddot_(col, &wn[is * wn_dim1 + 1], &c__1, &wn[js * wn_dim1 + 1], &c__1);
|
2195
2188
|
}
|
2196
2189
|
}
|
2197
2190
|
/* Cholesky factorization of (2,2) block of wn. */
|
2198
|
-
|
2191
|
+
dpofa_(&wn[*col + 1 + (*col + 1) * wn_dim1], &m2, col, info);
|
2199
2192
|
if (*info != 0) {
|
2200
2193
|
*info = -2;
|
2201
|
-
return 0;
|
2202
2194
|
}
|
2203
|
-
return 0;
|
2204
2195
|
}
|
2205
2196
|
|
2206
2197
|
/**
|
@@ -2224,9 +2215,9 @@ int formk_(long* n, long* nsub, long* ind, long* nenter, long* ileave, long* ind
|
|
2224
2215
|
* Ciyou Zhu
|
2225
2216
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2226
2217
|
*/
|
2227
|
-
|
2228
|
-
|
2229
|
-
static
|
2218
|
+
void formt_(F77_int* m, double* wt, double* sy, double* ss, F77_int* col, double* theta, F77_int* info) {
|
2219
|
+
F77_int wt_dim1, wt_offset, sy_dim1, sy_offset, ss_dim1, ss_offset, i__1, i__2, i__3;
|
2220
|
+
static F77_int i__, j, k, k1;
|
2230
2221
|
static double ddum;
|
2231
2222
|
|
2232
2223
|
ss_dim1 = *m;
|
@@ -2260,11 +2251,10 @@ int formt_(long* m, double* wt, double* sy, double* ss, long* col, double* theta
|
|
2260
2251
|
}
|
2261
2252
|
/* Cholesky factorize T to J*J' with */
|
2262
2253
|
/* J' stored in the upper triangle of wt. */
|
2263
|
-
|
2254
|
+
dpofa_(&wt[wt_offset], m, col, info);
|
2264
2255
|
if (*info != 0) {
|
2265
2256
|
*info = -3;
|
2266
2257
|
}
|
2267
|
-
return 0;
|
2268
2258
|
}
|
2269
2259
|
|
2270
2260
|
/**
|
@@ -2276,7 +2266,7 @@ int formt_(long* m, double* wt, double* sy, double* ss, long* col, double* theta
|
|
2276
2266
|
*
|
2277
2267
|
* cnstnd is a logical variable indicating whether bounds are present
|
2278
2268
|
*
|
2279
|
-
* index is an
|
2269
|
+
* index is an integer array of dimension n
|
2280
2270
|
* for i=1,...,nfree, index(i) are the indices of free variables
|
2281
2271
|
* for i=nfree+1,...,n, index(i) are the indices of bound variables
|
2282
2272
|
* On entry after the first iteration, index gives
|
@@ -2284,7 +2274,7 @@ int formt_(long* m, double* wt, double* sy, double* ss, long* col, double* theta
|
|
2284
2274
|
* On exit it gives the free variables based on the determination
|
2285
2275
|
* in cauchy using the array iwhere.
|
2286
2276
|
*
|
2287
|
-
* indx2 is an
|
2277
|
+
* indx2 is an integer array of dimension n
|
2288
2278
|
* On entry indx2 is unspecified.
|
2289
2279
|
* On exit with iter>0, indx2 indicates which variables
|
2290
2280
|
* have changed status since the previous iteration.
|
@@ -2300,10 +2290,10 @@ int formt_(long* m, double* wt, double* sy, double* ss, long* col, double* theta
|
|
2300
2290
|
* Ciyou Zhu
|
2301
2291
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2302
2292
|
*/
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2306
|
-
static
|
2293
|
+
void freev_(F77_int* n, F77_int* nfree, F77_int* index, F77_int* nenter, F77_int* ileave, F77_int* indx2, F77_int* iwhere, F77_int* wrk, F77_int* updatd,
|
2294
|
+
F77_int* cnstnd, F77_int* iprint, F77_int* iter) {
|
2295
|
+
F77_int i__1;
|
2296
|
+
static F77_int i__, k, iact;
|
2307
2297
|
|
2308
2298
|
--iwhere;
|
2309
2299
|
--indx2;
|
@@ -2322,7 +2312,7 @@ int freev_(long* n, long* nfree, long* index, long* nenter, long* ileave, long*
|
|
2322
2312
|
--(*ileave);
|
2323
2313
|
indx2[*ileave] = k;
|
2324
2314
|
if (*iprint >= 100) {
|
2325
|
-
fprintf(stdout, " Variable %
|
2315
|
+
fprintf(stdout, " Variable %2" PRIdF77INT " leaves the set of free variables\n", k);
|
2326
2316
|
}
|
2327
2317
|
}
|
2328
2318
|
}
|
@@ -2333,13 +2323,13 @@ int freev_(long* n, long* nfree, long* index, long* nenter, long* ileave, long*
|
|
2333
2323
|
++(*nenter);
|
2334
2324
|
indx2[*nenter] = k;
|
2335
2325
|
if (*iprint >= 100) {
|
2336
|
-
fprintf(stdout, " Variable %
|
2326
|
+
fprintf(stdout, " Variable %2" PRIdF77INT " enters the set of free variables\n", k);
|
2337
2327
|
}
|
2338
2328
|
}
|
2339
2329
|
}
|
2340
2330
|
if (*iprint >= 99) {
|
2341
2331
|
i__1 = *n + 1 - *ileave;
|
2342
|
-
fprintf(stdout, " %
|
2332
|
+
fprintf(stdout, " %2" PRIdF77INT " variables leave; %2" PRIdF77INT " variables enter\n", i__1, *nenter);
|
2343
2333
|
}
|
2344
2334
|
}
|
2345
2335
|
*wrk = *ileave < *n + 1 || *nenter > 0 || *updatd;
|
@@ -2358,9 +2348,8 @@ int freev_(long* n, long* nfree, long* index, long* nenter, long* ileave, long*
|
|
2358
2348
|
}
|
2359
2349
|
if (*iprint >= 99) {
|
2360
2350
|
i__1 = *iter + 1;
|
2361
|
-
fprintf(stdout, " %
|
2351
|
+
fprintf(stdout, " %2" PRIdF77INT " variables are free at GCP %3" PRIdF77INT "\n", *nfree, i__1);
|
2362
2352
|
}
|
2363
|
-
return 0;
|
2364
2353
|
}
|
2365
2354
|
|
2366
2355
|
/**
|
@@ -2369,7 +2358,7 @@ int freev_(long* n, long* nfree, long* index, long* nenter, long* ileave, long*
|
|
2369
2358
|
* This subroutine sorts out the least element of t, and puts the
|
2370
2359
|
* remaining elements of t in a heap.
|
2371
2360
|
*
|
2372
|
-
* n is an
|
2361
|
+
* n is an integer variable.
|
2373
2362
|
* On entry n is the dimension of the arrays t and iorder.
|
2374
2363
|
* On exit n is unchanged.
|
2375
2364
|
*
|
@@ -2378,12 +2367,12 @@ int freev_(long* n, long* nfree, long* index, long* nenter, long* ileave, long*
|
|
2378
2367
|
* On exit t(n) stores the least elements of t, and t(1) to t(n-1)
|
2379
2368
|
* stores the remaining elements in the form of a heap.
|
2380
2369
|
*
|
2381
|
-
* iorder is an
|
2370
|
+
* iorder is an integer array of dimension n.
|
2382
2371
|
* On entry iorder(i) is the index of t(i).
|
2383
2372
|
* On exit iorder(i) is still the index of t(i), but iorder may be
|
2384
2373
|
* permuted in accordance with t.
|
2385
2374
|
*
|
2386
|
-
* iheap is an
|
2375
|
+
* iheap is an integer variable specifying the task.
|
2387
2376
|
* On entry iheap should be set as follows:
|
2388
2377
|
* iheap .eq. 0 if t(1) to t(n) is not in the form of a heap,
|
2389
2378
|
* iheap .ne. 0 if otherwise.
|
@@ -2402,11 +2391,11 @@ int freev_(long* n, long* nfree, long* index, long* nenter, long* ileave, long*
|
|
2402
2391
|
* Ciyou Zhu
|
2403
2392
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2404
2393
|
*/
|
2405
|
-
|
2406
|
-
|
2407
|
-
static
|
2394
|
+
void hpsolb_(F77_int* n, double* t, F77_int* iorder, F77_int* iheap) {
|
2395
|
+
F77_int i__1;
|
2396
|
+
static F77_int i__, j, k;
|
2408
2397
|
static double out, ddum;
|
2409
|
-
static
|
2398
|
+
static F77_int indxin, indxou;
|
2410
2399
|
|
2411
2400
|
--iorder;
|
2412
2401
|
--t;
|
@@ -2462,7 +2451,6 @@ int hpsolb_(long* n, double* t, long* iorder, long* iheap) {
|
|
2462
2451
|
t[*n] = out;
|
2463
2452
|
iorder[*n] = indxou;
|
2464
2453
|
}
|
2465
|
-
return 0;
|
2466
2454
|
}
|
2467
2455
|
|
2468
2456
|
/**
|
@@ -2487,13 +2475,13 @@ int hpsolb_(long* n, double* t, long* iorder, long* iheap) {
|
|
2487
2475
|
* Ciyou Zhu
|
2488
2476
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2489
2477
|
*/
|
2490
|
-
|
2478
|
+
void lnsrlb_(F77_int* n, double* l, double* u, F77_int* nbd, double* x, double* f, double* fold, double* gd, double* gdold, double* g,
|
2491
2479
|
double* d__, double* r__, double* t, double* z__, double* stp, double* dnorm, double* dtd, double* xstep,
|
2492
|
-
double* stpmx,
|
2493
|
-
char* csave,
|
2494
|
-
|
2480
|
+
double* stpmx, F77_int* iter, F77_int* ifun, F77_int* iback, F77_int* nfgv, F77_int* info, char* task, F77_int* boxed, F77_int* cnstnd,
|
2481
|
+
char* csave, F77_int* isave, double* dsave) {
|
2482
|
+
F77_int i__1;
|
2495
2483
|
double d__1;
|
2496
|
-
static
|
2484
|
+
static F77_int i__;
|
2497
2485
|
static double a1, a2;
|
2498
2486
|
|
2499
2487
|
--z__;
|
@@ -2511,7 +2499,7 @@ int lnsrlb_(long* n, double* l, double* u, long* nbd, double* x, double* f, doub
|
|
2511
2499
|
if (strncmp(task, "FG_LN", 5) == 0) {
|
2512
2500
|
goto L556;
|
2513
2501
|
}
|
2514
|
-
*dtd =
|
2502
|
+
*dtd = ddot_(n, &d__[1], &c__1, &d__[1], &c__1);
|
2515
2503
|
*dnorm = sqrt(*dtd);
|
2516
2504
|
/* Determine the maximum step length. */
|
2517
2505
|
*stpmx = 1e10;
|
@@ -2548,14 +2536,14 @@ int lnsrlb_(long* n, double* l, double* u, long* nbd, double* x, double* f, doub
|
|
2548
2536
|
} else {
|
2549
2537
|
*stp = 1.;
|
2550
2538
|
}
|
2551
|
-
|
2552
|
-
|
2539
|
+
dcopy_(n, &x[1], &c__1, &t[1], &c__1);
|
2540
|
+
dcopy_(n, &g[1], &c__1, &r__[1], &c__1);
|
2553
2541
|
*fold = *f;
|
2554
2542
|
*ifun = 0;
|
2555
2543
|
*iback = 0;
|
2556
2544
|
strcpy(csave, "START");
|
2557
2545
|
L556:
|
2558
|
-
*gd =
|
2546
|
+
*gd = ddot_(n, &g[1], &c__1, &d__[1], &c__1);
|
2559
2547
|
if (*ifun == 0) {
|
2560
2548
|
*gdold = *gd;
|
2561
2549
|
if (*gd >= 0.) {
|
@@ -2563,7 +2551,7 @@ L556:
|
|
2563
2551
|
/* Line search is impossible. */
|
2564
2552
|
fprintf(stdout, " ascent direction in projection gd = %.8E\n", *gd);
|
2565
2553
|
*info = -4;
|
2566
|
-
return
|
2554
|
+
return;
|
2567
2555
|
}
|
2568
2556
|
}
|
2569
2557
|
dcsrch_(f, gd, stp, &c_b280, &c_b281, &c_b282, &c_b9, stpmx, csave, &isave[1], &dsave[1]);
|
@@ -2574,7 +2562,7 @@ L556:
|
|
2574
2562
|
++(*nfgv);
|
2575
2563
|
*iback = *ifun - 1;
|
2576
2564
|
if (*stp == 1.) {
|
2577
|
-
|
2565
|
+
dcopy_(n, &z__[1], &c__1, &x[1], &c__1);
|
2578
2566
|
} else {
|
2579
2567
|
i__1 = *n;
|
2580
2568
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
@@ -2584,7 +2572,6 @@ L556:
|
|
2584
2572
|
} else {
|
2585
2573
|
strcpy(task, "NEW_X");
|
2586
2574
|
}
|
2587
|
-
return 0;
|
2588
2575
|
}
|
2589
2576
|
|
2590
2577
|
/**
|
@@ -2606,11 +2593,11 @@ L556:
|
|
2606
2593
|
* Ciyou Zhu
|
2607
2594
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2608
2595
|
*/
|
2609
|
-
|
2610
|
-
|
2611
|
-
|
2612
|
-
static
|
2613
|
-
static
|
2596
|
+
void matupd_(F77_int* n, F77_int* m, double* ws, double* wy, double* sy, double* ss, double* d__, double* r__, F77_int* itail,
|
2597
|
+
F77_int* iupdat, F77_int* col, F77_int* head, double* theta, double* rr, double* dr, double* stp, double* dtd) {
|
2598
|
+
F77_int ws_dim1, ws_offset, wy_dim1, wy_offset, sy_dim1, sy_offset, ss_dim1, ss_offset, i__1, i__2;
|
2599
|
+
static F77_int j;
|
2600
|
+
static F77_int pointr;
|
2614
2601
|
|
2615
2602
|
--r__;
|
2616
2603
|
--d__;
|
@@ -2637,8 +2624,8 @@ int matupd_(long* n, long* m, double* ws, double* wy, double* sy, double* ss, do
|
|
2637
2624
|
*head = *head % *m + 1;
|
2638
2625
|
}
|
2639
2626
|
/* Update matrices WS and WY. */
|
2640
|
-
|
2641
|
-
|
2627
|
+
dcopy_(n, &d__[1], &c__1, &ws[*itail * ws_dim1 + 1], &c__1);
|
2628
|
+
dcopy_(n, &r__[1], &c__1, &wy[*itail * wy_dim1 + 1], &c__1);
|
2642
2629
|
/* Set theta=yy/ys. */
|
2643
2630
|
*theta = *rr / *dr;
|
2644
2631
|
/* Form the middle matrix in B. */
|
@@ -2648,9 +2635,9 @@ int matupd_(long* n, long* m, double* ws, double* wy, double* sy, double* ss, do
|
|
2648
2635
|
/* move old information */
|
2649
2636
|
i__1 = *col - 1;
|
2650
2637
|
for (j = 1; j <= i__1; ++j) {
|
2651
|
-
|
2638
|
+
dcopy_(&j, &ss[(j + 1) * ss_dim1 + 2], &c__1, &ss[j * ss_dim1 + 1], &c__1);
|
2652
2639
|
i__2 = *col - j;
|
2653
|
-
|
2640
|
+
dcopy_(&i__2, &sy[j + 1 + (j + 1) * sy_dim1], &c__1, &sy[j + j * sy_dim1], &c__1);
|
2654
2641
|
}
|
2655
2642
|
}
|
2656
2643
|
/* add new information: the last row of SY */
|
@@ -2658,8 +2645,8 @@ int matupd_(long* n, long* m, double* ws, double* wy, double* sy, double* ss, do
|
|
2658
2645
|
pointr = *head;
|
2659
2646
|
i__1 = *col - 1;
|
2660
2647
|
for (j = 1; j <= i__1; ++j) {
|
2661
|
-
sy[*col + j * sy_dim1] =
|
2662
|
-
ss[j + *col * ss_dim1] =
|
2648
|
+
sy[*col + j * sy_dim1] = ddot_(n, &d__[1], &c__1, &wy[pointr * wy_dim1 + 1], &c__1);
|
2649
|
+
ss[j + *col * ss_dim1] = ddot_(n, &ws[pointr * ws_dim1 + 1], &c__1, &d__[1], &c__1);
|
2663
2650
|
pointr = pointr % *m + 1;
|
2664
2651
|
}
|
2665
2652
|
if (*stp == 1.) {
|
@@ -2668,7 +2655,6 @@ int matupd_(long* n, long* m, double* ws, double* wy, double* sy, double* ss, do
|
|
2668
2655
|
ss[*col + *col * ss_dim1] = *stp * *stp * *dtd;
|
2669
2656
|
}
|
2670
2657
|
sy[*col + *col * sy_dim1] = *dr;
|
2671
|
-
return 0;
|
2672
2658
|
}
|
2673
2659
|
|
2674
2660
|
/**
|
@@ -2687,10 +2673,10 @@ int matupd_(long* n, long* m, double* ws, double* wy, double* sy, double* ss, do
|
|
2687
2673
|
* Ciyou Zhu
|
2688
2674
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2689
2675
|
*/
|
2690
|
-
|
2691
|
-
|
2676
|
+
void prn1lb_(F77_int* n, F77_int* m, double* l, double* u, double* x, F77_int* iprint, F77_int* itfile, double* epsmch) {
|
2677
|
+
F77_int i__1;
|
2692
2678
|
FILE* itfptr;
|
2693
|
-
static
|
2679
|
+
static F77_int i__;
|
2694
2680
|
|
2695
2681
|
--x;
|
2696
2682
|
--u;
|
@@ -2700,7 +2686,7 @@ int prn1lb_(long* n, long* m, double* l, double* u, double* x, long* iprint, lon
|
|
2700
2686
|
fprintf(stdout, "RUNNING THE L-BFGS-B CODE\n\n");
|
2701
2687
|
fprintf(stdout, " * * *\n\n");
|
2702
2688
|
fprintf(stdout, "Machine precision = %.3E\n", *epsmch);
|
2703
|
-
fprintf(stdout, " N = %
|
2689
|
+
fprintf(stdout, " N = %3" PRIdF77INT " M = %2" PRIdF77INT "\n", *n, *m);
|
2704
2690
|
if (*iprint >= 1) {
|
2705
2691
|
itfptr = fopen("iterate.dat", "w");
|
2706
2692
|
fprintf(itfptr, "RUNNING THE L-BFGS-B CODE\n");
|
@@ -2719,7 +2705,7 @@ int prn1lb_(long* n, long* m, double* l, double* u, double* x, long* iprint, lon
|
|
2719
2705
|
fprintf(itfptr, "\n");
|
2720
2706
|
fprintf(itfptr, " * * *\n\n");
|
2721
2707
|
fprintf(itfptr, "Machine precision = %.3E\n", *epsmch);
|
2722
|
-
fprintf(itfptr, " N = %
|
2708
|
+
fprintf(itfptr, " N = %3" PRIdF77INT " M = %2" PRIdF77INT "\n", *n, *m);
|
2723
2709
|
fprintf(itfptr, "\n");
|
2724
2710
|
fprintf(itfptr, " it nf nseg nact sub itls stepl tstep projg f\n");
|
2725
2711
|
fclose(itfptr);
|
@@ -2763,7 +2749,6 @@ int prn1lb_(long* n, long* m, double* l, double* u, double* x, long* iprint, lon
|
|
2763
2749
|
}
|
2764
2750
|
}
|
2765
2751
|
}
|
2766
|
-
return 0;
|
2767
2752
|
}
|
2768
2753
|
|
2769
2754
|
/**
|
@@ -2781,10 +2766,10 @@ int prn1lb_(long* n, long* m, double* l, double* u, double* x, long* iprint, lon
|
|
2781
2766
|
* Ciyou Zhu
|
2782
2767
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2783
2768
|
*/
|
2784
|
-
|
2785
|
-
double* sbgnrm,
|
2786
|
-
|
2787
|
-
static
|
2769
|
+
void prn2lb_(F77_int* n, double* x, double* f, double* g, F77_int* iprint, F77_int* itfile, F77_int* iter, F77_int* nfgv, F77_int* nact,
|
2770
|
+
double* sbgnrm, F77_int* nseg, char* word, F77_int* iword, F77_int* iback, double* stp, double* xstep) {
|
2771
|
+
F77_int i__1;
|
2772
|
+
static F77_int i__, imod;
|
2788
2773
|
FILE* itfptr;
|
2789
2774
|
--g;
|
2790
2775
|
--x;
|
@@ -2803,8 +2788,8 @@ int prn2lb_(long* n, double* x, double* f, double* g, long* iprint, long* itfile
|
|
2803
2788
|
strcpy(word, "---");
|
2804
2789
|
}
|
2805
2790
|
if (*iprint >= 99) {
|
2806
|
-
fprintf(stdout, "LINE SEARCH %
|
2807
|
-
fprintf(stdout, "\nAt iterate%
|
2791
|
+
fprintf(stdout, "LINE SEARCH %" PRIdF77INT " times; norm of step = %E\n", *iback, *xstep);
|
2792
|
+
fprintf(stdout, "\nAt iterate%5" PRIdF77INT" f= %12.5E |proj g|= %12.5E\n", *iter, *f, *sbgnrm);
|
2808
2793
|
|
2809
2794
|
if (*iprint > 100) {
|
2810
2795
|
fprintf(stdout, "X =");
|
@@ -2823,16 +2808,15 @@ int prn2lb_(long* n, double* x, double* f, double* g, long* iprint, long* itfile
|
|
2823
2808
|
} else if (*iprint > 0) {
|
2824
2809
|
imod = *iter % *iprint;
|
2825
2810
|
if (imod == 0) {
|
2826
|
-
fprintf(stdout, "\nAt iterate%
|
2811
|
+
fprintf(stdout, "\nAt iterate%5" PRIdF77INT " f= %12.5E |proj g|= %12.5E\n", *iter, *f, *sbgnrm);
|
2827
2812
|
}
|
2828
2813
|
}
|
2829
2814
|
if (*iprint >= 1) {
|
2830
2815
|
itfptr = fopen("iterate.dat", "a");
|
2831
|
-
fprintf(itfptr, " %
|
2832
|
-
|
2816
|
+
fprintf(itfptr, " %4" PRIdF77INT " %4" PRIdF77INT " %5" PRIdF77INT " %5" PRIdF77INT " %3s %4" PRIdF77INT " %7.1E %7.1E %10.3E %10.3E\n",
|
2817
|
+
*iter, *nfgv, *nseg, *nact, word, *iback, *stp, *xstep, *sbgnrm, *f);
|
2833
2818
|
fclose(itfptr);
|
2834
2819
|
}
|
2835
|
-
return 0;
|
2836
2820
|
}
|
2837
2821
|
|
2838
2822
|
/**
|
@@ -2851,12 +2835,12 @@ int prn2lb_(long* n, double* x, double* f, double* g, long* iprint, long* itfile
|
|
2851
2835
|
* Ciyou Zhu
|
2852
2836
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
2853
2837
|
*/
|
2854
|
-
|
2855
|
-
|
2856
|
-
double* stp, double* xstep,
|
2857
|
-
|
2838
|
+
void prn3lb_(F77_int* n, double* x, double* f, char* task, F77_int* iprint, F77_int* info, F77_int* itfile, F77_int* iter, F77_int* nfgv,
|
2839
|
+
F77_int* nintol, F77_int* nskip, F77_int* nact, double* sbgnrm, double* time, F77_int* nseg, char* word, F77_int* iback,
|
2840
|
+
double* stp, double* xstep, F77_int* k, double* cachyt, double* sbtime, double* lnscht) {
|
2841
|
+
F77_int i__1;
|
2858
2842
|
FILE* itfptr;
|
2859
|
-
static
|
2843
|
+
static F77_int i__;
|
2860
2844
|
|
2861
2845
|
--x;
|
2862
2846
|
|
@@ -2878,7 +2862,8 @@ int prn3lb_(long* n, double* x, double* f, char* task, long* iprint, long* info,
|
|
2878
2862
|
fprintf(stdout, " * * *\n");
|
2879
2863
|
fprintf(stdout, "\n");
|
2880
2864
|
fprintf(stdout, " N Tit Tnf Tnint Skip Nact Projg F\n");
|
2881
|
-
fprintf(stdout, "%
|
2865
|
+
fprintf(stdout, "%5" PRIdF77INT " %6" PRIdF77INT " %6" PRIdF77INT " %6" PRIdF77INT " %5" PRIdF77INT " %5" PRIdF77INT " %10.3E %10.3E\n",
|
2866
|
+
*n, *iter, *nfgv, *nintol, *nskip, *nact, *sbgnrm, *f);
|
2882
2867
|
if (*iprint >= 100) {
|
2883
2868
|
fprintf(stdout, "\n");
|
2884
2869
|
fprintf(stdout, " X =");
|
@@ -2927,10 +2912,10 @@ L999:
|
|
2927
2912
|
fprintf(stdout, " may possibly be caused by a bad search direction.\n");
|
2928
2913
|
}
|
2929
2914
|
if (*info == -6) {
|
2930
|
-
fprintf(stdout, " Input nbd(%
|
2915
|
+
fprintf(stdout, " Input nbd(%2" PRIdF77INT ") is invalid.\n", *k);
|
2931
2916
|
}
|
2932
2917
|
if (*info == -7) {
|
2933
|
-
fprintf(stdout, " l(%
|
2918
|
+
fprintf(stdout, " l(%2" PRIdF77INT ") > u(%2" PRIdF77INT "). No feasible solution.\n", *k, *k);
|
2934
2919
|
}
|
2935
2920
|
if (*info == -8) {
|
2936
2921
|
fprintf(stdout, "\n");
|
@@ -2957,8 +2942,8 @@ L999:
|
|
2957
2942
|
if (*iprint >= 1) {
|
2958
2943
|
itfptr = fopen("iterate.dat", "a");
|
2959
2944
|
if (*info == -4 || *info == -9) {
|
2960
|
-
fprintf(itfptr, " %
|
2961
|
-
|
2945
|
+
fprintf(itfptr, " %4" PRIdF77INT " %4" PRIdF77INT " %5" PRIdF77INT " %5" PRIdF77INT " %3s %4" PRIdF77INT " %7.1E %7.1E - -\n",
|
2946
|
+
*iter, *nfgv, *nseg, *nact, word, *iback, *stp, *xstep);
|
2962
2947
|
}
|
2963
2948
|
fprintf(itfptr, "\n");
|
2964
2949
|
fprintf(itfptr, "%s\n", task);
|
@@ -3006,7 +2991,6 @@ L999:
|
|
3006
2991
|
fclose(itfptr);
|
3007
2992
|
}
|
3008
2993
|
}
|
3009
|
-
return 0;
|
3010
2994
|
}
|
3011
2995
|
|
3012
2996
|
/**
|
@@ -3024,10 +3008,10 @@ L999:
|
|
3024
3008
|
* Ciyou Zhu
|
3025
3009
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.
|
3026
3010
|
*/
|
3027
|
-
|
3028
|
-
|
3011
|
+
void projgr_(F77_int* n, double* l, double* u, F77_int* nbd, double* x, double* g, double* sbgnrm) {
|
3012
|
+
F77_int i__1;
|
3029
3013
|
double d__1, d__2;
|
3030
|
-
static
|
3014
|
+
static F77_int i__;
|
3031
3015
|
static double gi;
|
3032
3016
|
|
3033
3017
|
--g;
|
@@ -3056,7 +3040,6 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3056
3040
|
d__1 = *sbgnrm, d__2 = fabs(gi);
|
3057
3041
|
*sbgnrm = d__1 >= d__2 ? d__1 : d__2;
|
3058
3042
|
}
|
3059
|
-
return 0;
|
3060
3043
|
}
|
3061
3044
|
|
3062
3045
|
/* **********************************************************************
|
@@ -3093,7 +3076,7 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3093
3076
|
* subject to l<=x<=u
|
3094
3077
|
* x_i=xcp_i for all i in A(xcp)
|
3095
3078
|
*
|
3096
|
-
*
|
3079
|
+
* aF77_int the subspace unconstrained Newton direction
|
3097
3080
|
*
|
3098
3081
|
* d = -(Z'BZ)^(-1) r.
|
3099
3082
|
*
|
@@ -3110,20 +3093,20 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3110
3093
|
* from that described in [1]. One can show that the matrix K is
|
3111
3094
|
* equal to the matrix M^[-1]N in that paper.
|
3112
3095
|
*
|
3113
|
-
* n is an
|
3096
|
+
* n is an integer variable.
|
3114
3097
|
* On entry n is the dimension of the problem.
|
3115
3098
|
* On exit n is unchanged.
|
3116
3099
|
*
|
3117
|
-
* m is an
|
3100
|
+
* m is an integer variable.
|
3118
3101
|
* On entry m is the maximum number of variable metric corrections
|
3119
3102
|
* used to define the limited memory matrix.
|
3120
3103
|
* On exit m is unchanged.
|
3121
3104
|
*
|
3122
|
-
* nsub is an
|
3105
|
+
* nsub is an integer variable.
|
3123
3106
|
* On entry nsub is the number of free variables.
|
3124
3107
|
* On exit nsub is unchanged.
|
3125
3108
|
*
|
3126
|
-
* ind is an
|
3109
|
+
* ind is an integer array of dimension nsub.
|
3127
3110
|
* On entry ind specifies the coordinate indices of free variables.
|
3128
3111
|
* On exit ind is unchanged.
|
3129
3112
|
*
|
@@ -3135,7 +3118,7 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3135
3118
|
* On entry u is the upper bound of x.
|
3136
3119
|
* On exit u is unchanged.
|
3137
3120
|
*
|
3138
|
-
* nbd is a
|
3121
|
+
* nbd is a integer array of dimension n.
|
3139
3122
|
* On entry nbd represents the type of bounds imposed on the
|
3140
3123
|
* variables, and must be specified as follows:
|
3141
3124
|
* nbd(i)=0 if x(i) is unbounded,
|
@@ -3165,8 +3148,8 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3165
3148
|
*
|
3166
3149
|
* ws and wy are double precision arrays;
|
3167
3150
|
* theta is a double precision variable;
|
3168
|
-
* col is an
|
3169
|
-
* head is an
|
3151
|
+
* col is an integer variable;
|
3152
|
+
* head is an integer variable.
|
3170
3153
|
* On entry they store the information defining the
|
3171
3154
|
* limited memory BFGS matrix:
|
3172
3155
|
* ws(n,m) stores S, a set of s-vectors;
|
@@ -3176,7 +3159,7 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3176
3159
|
* head is the location of the 1st s- (or y-) vector in S (or Y).
|
3177
3160
|
* On exit they are unchanged.
|
3178
3161
|
*
|
3179
|
-
* iword is an
|
3162
|
+
* iword is an integer variable.
|
3180
3163
|
* On entry iword is unspecified.
|
3181
3164
|
* On exit iword specifies the status of the subspace solution.
|
3182
3165
|
* iword = 0 if the solution is in the box,
|
@@ -3194,7 +3177,7 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3194
3177
|
* [ 0 I]
|
3195
3178
|
* On exit wn is unchanged.
|
3196
3179
|
*
|
3197
|
-
* iprint is an
|
3180
|
+
* iprint is an integer variable that must be set by the user.
|
3198
3181
|
* It controls the frequency and type of output generated:
|
3199
3182
|
* iprint<0 no output is generated;
|
3200
3183
|
* iprint=0 print only one line at the last iteration;
|
@@ -3205,7 +3188,7 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3205
3188
|
* When iprint > 0, the file iterate.dat will be created to
|
3206
3189
|
* summarize the iteration.
|
3207
3190
|
*
|
3208
|
-
* info is an
|
3191
|
+
* info is an integer variable.
|
3209
3192
|
* On entry info is unspecified.
|
3210
3193
|
* On exit info = 0 for normal return,
|
3211
3194
|
* = nonzero for abnormal return
|
@@ -3231,18 +3214,18 @@ int projgr_(long* n, double* l, double* u, long* nbd, double* x, double* g, doub
|
|
3231
3214
|
* Ciyou Zhu
|
3232
3215
|
* in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal
|
3233
3216
|
*/
|
3234
|
-
|
3235
|
-
double* ws, double* wy, double* theta, double* xx, double* gg,
|
3236
|
-
double* wn,
|
3237
|
-
|
3217
|
+
void subsm_(F77_int* n, F77_int* m, F77_int* nsub, F77_int* ind, double* l, double* u, F77_int* nbd, double* x, double* d__, double* xp,
|
3218
|
+
double* ws, double* wy, double* theta, double* xx, double* gg, F77_int* col, F77_int* head, F77_int* iword, double* wv,
|
3219
|
+
double* wn, F77_int* iprint, F77_int* info) {
|
3220
|
+
F77_int ws_dim1, ws_offset, wy_dim1, wy_offset, wn_dim1, wn_offset, i__1, i__2;
|
3238
3221
|
double d__1, d__2;
|
3239
|
-
static
|
3222
|
+
static F77_int i__, j, k, m2;
|
3240
3223
|
static double dk;
|
3241
|
-
static
|
3224
|
+
static F77_int js, jy;
|
3242
3225
|
static double xk;
|
3243
|
-
static
|
3226
|
+
static F77_int ibd, col2;
|
3244
3227
|
static double dd_p__, temp1, temp2, alpha;
|
3245
|
-
static
|
3228
|
+
static F77_int pointr;
|
3246
3229
|
|
3247
3230
|
--gg;
|
3248
3231
|
--xx;
|
@@ -3265,7 +3248,7 @@ int subsm_(long* n, long* m, long* nsub, long* ind, double* l, double* u, long*
|
|
3265
3248
|
--ind;
|
3266
3249
|
|
3267
3250
|
if (*nsub <= 0) {
|
3268
|
-
return
|
3251
|
+
return;
|
3269
3252
|
}
|
3270
3253
|
if (*iprint >= 99) {
|
3271
3254
|
fprintf(stdout, "\n----------------SUBSM entered-----------------\n\n");
|
@@ -3289,17 +3272,17 @@ int subsm_(long* n, long* m, long* nsub, long* ind, double* l, double* u, long*
|
|
3289
3272
|
/* Compute wv:=K^(-1)wv. */
|
3290
3273
|
m2 = *m << 1;
|
3291
3274
|
col2 = *col << 1;
|
3292
|
-
|
3275
|
+
dtrsl_(&wn[wn_offset], &m2, &col2, &wv[1], &c__11, info);
|
3293
3276
|
if (*info != 0) {
|
3294
|
-
return
|
3277
|
+
return;
|
3295
3278
|
}
|
3296
3279
|
i__1 = *col;
|
3297
3280
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
3298
3281
|
wv[i__] = -wv[i__];
|
3299
3282
|
}
|
3300
|
-
|
3283
|
+
dtrsl_(&wn[wn_offset], &m2, &col2, &wv[1], &c__1, info);
|
3301
3284
|
if (*info != 0) {
|
3302
|
-
return
|
3285
|
+
return;
|
3303
3286
|
}
|
3304
3287
|
/* Compute d = (1/theta)d + (1/theta**2)Z'W wv. */
|
3305
3288
|
pointr = *head;
|
@@ -3314,12 +3297,12 @@ int subsm_(long* n, long* m, long* nsub, long* ind, double* l, double* u, long*
|
|
3314
3297
|
pointr = pointr % *m + 1;
|
3315
3298
|
}
|
3316
3299
|
d__1 = 1. / *theta;
|
3317
|
-
|
3300
|
+
dscal_(nsub, &d__1, &d__[1], &c__1);
|
3318
3301
|
|
3319
3302
|
/* ----------------------------------------------------------------- */
|
3320
3303
|
/* Let us try the projection, d is the Newton direction */
|
3321
3304
|
*iword = 0;
|
3322
|
-
|
3305
|
+
dcopy_(n, &x[1], &c__1, &xp[1], &c__1);
|
3323
3306
|
|
3324
3307
|
i__1 = *nsub;
|
3325
3308
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
@@ -3372,7 +3355,7 @@ int subsm_(long* n, long* m, long* nsub, long* ind, double* l, double* u, long*
|
|
3372
3355
|
dd_p__ += (x[i__] - xx[i__]) * gg[i__];
|
3373
3356
|
}
|
3374
3357
|
if (dd_p__ > 0.) {
|
3375
|
-
|
3358
|
+
dcopy_(n, &xp[1], &c__1, &x[1], &c__1);
|
3376
3359
|
fprintf(stderr, " Positive dir derivative in projection\n");
|
3377
3360
|
fprintf(stderr, " Using the backtracking step\n");
|
3378
3361
|
} else {
|
@@ -3431,7 +3414,6 @@ L911:
|
|
3431
3414
|
if (*iprint >= 99) {
|
3432
3415
|
fprintf(stdout, "\n----------------exit SUBSM --------------------\n\n");
|
3433
3416
|
}
|
3434
|
-
return 0;
|
3435
3417
|
}
|
3436
3418
|
|
3437
3419
|
/**
|
@@ -3548,7 +3530,7 @@ L911:
|
|
3548
3530
|
* On exit with convergence, a warning or an error, the
|
3549
3531
|
* variable task contains additional information.
|
3550
3532
|
*
|
3551
|
-
* isave is an
|
3533
|
+
* isave is an integer work array of dimension 2.
|
3552
3534
|
*
|
3553
3535
|
* dsave is a double precision work array of dimension 13.
|
3554
3536
|
*
|
@@ -3564,14 +3546,14 @@ L911:
|
|
3564
3546
|
* Argonne National Laboratory and University of Minnesota.
|
3565
3547
|
* Brett M. Averick, Richard G. Carter, and Jorge J. More'.
|
3566
3548
|
*/
|
3567
|
-
|
3568
|
-
char* task,
|
3549
|
+
void dcsrch_(double* f, double* g, double* stp, double* ftol, double* gtol, double* xtol, double* stpmin, double* stpmax,
|
3550
|
+
char* task, F77_int* isave, double* dsave) {
|
3569
3551
|
|
3570
3552
|
double d__1;
|
3571
3553
|
static double fm, gm, fx, fy, gx, gy, fxm, fym, gxm, gym, stx, sty;
|
3572
|
-
static
|
3554
|
+
static F77_int stage;
|
3573
3555
|
static double finit, ginit, width, ftest, gtest, stmin, stmax, width1;
|
3574
|
-
static
|
3556
|
+
static F77_int brackt;
|
3575
3557
|
|
3576
3558
|
--dsave;
|
3577
3559
|
--isave;
|
@@ -3604,7 +3586,7 @@ int dcsrch_(double* f, double* g, double* stp, double* ftol, double* gtol, doubl
|
|
3604
3586
|
}
|
3605
3587
|
/* Exit if there are errors on input. */
|
3606
3588
|
if (strncmp(task, "ERROR", 5) == 0) {
|
3607
|
-
return
|
3589
|
+
return;
|
3608
3590
|
}
|
3609
3591
|
/* Initialize local variables. */
|
3610
3592
|
brackt = FALSE_;
|
@@ -3748,7 +3730,6 @@ L1000:
|
|
3748
3730
|
dsave[11] = stmax;
|
3749
3731
|
dsave[12] = width;
|
3750
3732
|
dsave[13] = width1;
|
3751
|
-
return 0;
|
3752
3733
|
}
|
3753
3734
|
|
3754
3735
|
/**
|
@@ -3841,8 +3822,8 @@ L1000:
|
|
3841
3822
|
* Argonne National Laboratory and University of Minnesota.
|
3842
3823
|
* Brett M. Averick and Jorge J. More'.
|
3843
3824
|
*/
|
3844
|
-
|
3845
|
-
|
3825
|
+
void dcstep_(double* stx, double* fx, double* dx, double* sty, double* fy, double* dy, double* stp, double* fp, double* dp,
|
3826
|
+
F77_int* brackt, double* stpmin, double* stpmax) {
|
3846
3827
|
double d__1, d__2, d__3;
|
3847
3828
|
static double p, q, r__, s, sgnd, stpc, stpf, stpq, gamma, theta;
|
3848
3829
|
|
@@ -4007,10 +3988,8 @@ int dcstep_(double* stx, double* fx, double* dx, double* sty, double* fy, double
|
|
4007
3988
|
}
|
4008
3989
|
/* Compute the new step. */
|
4009
3990
|
*stp = stpf;
|
4010
|
-
return 0;
|
4011
3991
|
}
|
4012
3992
|
|
4013
|
-
|
3993
|
+
void timer_(double* ttime) {
|
4014
3994
|
*ttime = (double)clock() / CLOCKS_PER_SEC;
|
4015
|
-
return 0;
|
4016
3995
|
}
|