lbfgsb 0.4.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|