29#include "../base/base_uses.f90"
35 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cp_lbfgs'
186 SUBROUTINE setulb(n, m, x, lower_bound, upper_bound, nbd, f, g, factr, pgtol, wa, iwa, &
187 task, iprint, csave, lsave, isave, dsave, trust_radius, spgr, iwunit)
189 INTEGER,
INTENT(in) :: n, m
190 REAL(kind=
dp),
INTENT(inout) :: x(n)
191 REAL(kind=
dp) :: lower_bound(n), upper_bound(n)
193 REAL(kind=
dp) :: f, g(n)
194 REAL(kind=
dp),
INTENT(in) :: factr, pgtol
195 REAL(kind=
dp) :: wa(2*m*n + 5*n + 11*m*m + 8*m)
197 CHARACTER(LEN=60) :: task
199 CHARACTER(LEN=60) :: csave
202 REAL(kind=
dp) :: dsave(29)
203 REAL(kind=
dp),
INTENT(in) :: trust_radius
204 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
205 INTEGER,
OPTIONAL :: iwunit
207 INTEGER :: i, ld, lr, lsnd, lss, lsy, lt, lwa, lwn, &
208 lws, lwt, lwy, lxp, lz, wunit
227 IF (
PRESENT(iwunit))
THEN
228 IF (iwunit > 0) wunit = iwunit
231 IF (task ==
'START')
THEN
239 isave(5) = isave(4) + isave(1)
241 isave(6) = isave(5) + isave(1)
243 isave(7) = isave(6) + isave(2)
245 isave(8) = isave(7) + isave(2)
247 isave(9) = isave(8) + isave(2)
249 isave(10) = isave(9) + isave(3)
251 isave(11) = isave(10) + isave(3)
253 isave(12) = isave(11) + n
255 isave(13) = isave(12) + n
257 isave(14) = isave(13) + n
259 isave(15) = isave(14) + n
261 isave(16) = isave(15) + n
281 IF (trust_radius >= 0)
THEN
283 lower_bound(i) = x(i) - trust_radius
284 upper_bound(i) = x(i) + trust_radius
290 CALL mainlb(n, m, x, lower_bound, upper_bound, nbd, f, g, factr, pgtol, &
291 wa(lws), wa(lwy), wa(lsy), wa(lss), wa(lwt), &
292 wa(lwn), wa(lsnd), wa(lz), wa(lr), wa(ld), wa(lt), wa(lxp), &
294 iwa(1), iwa(n + 1), iwa(2*n + 1), task, iprint, &
295 csave, lsave, isave(22), dsave, spgr, wunit)
401 SUBROUTINE mainlb(n, m, x, lower_bound, upper_bound, nbd, f, g, factr, pgtol, ws, wy, &
402 sy, ss, wt, wn, snd, z, r, d, t, xp, wa, &
403 index, iwhere, indx2, task, &
404 iprint, csave, lsave, isave, dsave, spgr, iwunit)
405 INTEGER,
INTENT(in) :: n, m
406 REAL(kind=
dp),
INTENT(inout) :: x(n)
407 REAL(kind=
dp),
INTENT(in) :: lower_bound(n), upper_bound(n)
409 REAL(kind=
dp) :: f, g(n), factr, pgtol, ws(n, m), wy(n, m), sy(m, m), ss(m, m), wt(m, m), &
410 wn(2*m, 2*m), snd(2*m, 2*m), z(n), r(n), d(n), t(n), xp(n), wa(8*m)
411 INTEGER :: index(n), iwhere(n), indx2(n)
412 CHARACTER(LEN=60) :: task
414 CHARACTER(LEN=60) :: csave
417 REAL(kind=
dp) :: dsave(29)
418 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
419 INTEGER,
OPTIONAL :: iwunit
421 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
423 CHARACTER(LEN=3) :: word
424 INTEGER :: col, head, i, iback, ifun, ileave, info, &
425 itail, iter, itfile, iupdat, iword, k, &
426 nact, nenter, nfgv, nfree, nintol, &
428 LOGICAL :: boxed, constrained, first, &
429 keep_space_group, updatd, wrk, &
431 REAL(kind=
dp) :: cachyt, cpu1, cpu2, ddot, ddum, dnorm, dr, dtd, epsmch, fold, g_inf_norm, &
432 gd, gdold, lnscht, rr, sbtime, step_max, stp, theta, time, time1, time2, tol, xstep
455 IF (
PRESENT(iwunit))
THEN
456 IF (iwunit > 0) wunit = iwunit
459 keep_space_group = .false.
460 IF (
PRESENT(spgr))
THEN
461 IF (
ASSOCIATED(spgr)) keep_space_group = spgr%keep_space_group
464 IF (task ==
'START')
THEN
466 epsmch = epsilon(one)
517 IF (iprint >= 1)
THEN
519 CALL open_file(file_name=
'iterate.dat', unit_number=itfile, file_action=
'WRITE', file_status=
'UNKNOWN')
524 CALL errclb(n, m, factr, lower_bound, upper_bound, nbd, task, info, k)
525 IF (task(1:5) ==
'ERROR')
THEN
526 CALL prn3lb(n, x, f, task, iprint, info, itfile, &
527 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
528 zero, nseg, word, iback, stp, xstep, k, &
529 cachyt, sbtime, lnscht, wunit)
533 CALL prn1lb(n, m, lower_bound, upper_bound, x, iprint, itfile, epsmch, wunit)
537 CALL active(n, lower_bound, upper_bound, nbd, x, iwhere, iprint, x_projected, constrained, boxed, wunit)
539 IF (keep_space_group)
THEN
546 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
547 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
548 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
552 IF (keep_space_group)
THEN
559 x_projected = lsave(1)
560 constrained = lsave(2)
595 g_inf_norm = dsave(13)
603 IF (task(1:4) ==
'STOP')
THEN
604 IF (task(7:9) ==
'CPU')
THEN
606 CALL dcopy(n, t, 1, x, 1)
607 CALL dcopy(n, r, 1, g, 1)
612 CALL prn3lb(n, x, f, task, iprint, info, itfile, &
613 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
614 time, nseg, word, iback, stp, xstep, k, &
615 cachyt, sbtime, lnscht, wunit)
616 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
617 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
618 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
623 IF (.NOT. (task(1:5) ==
'FG_LN' .OR. task(1:5) ==
'NEW_X'))
THEN
630 CALL projgr(n, lower_bound, upper_bound, nbd, x, g, g_inf_norm)
632 IF (iprint >= 1)
THEN
633 WRITE (wunit, 1002) iter, f, g_inf_norm
634 WRITE (itfile, 1003) iter, nfgv, g_inf_norm, f
636 IF (g_inf_norm <= pgtol)
THEN
638 task =
'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
641 CALL prn3lb(n, x, f, task, iprint, info, itfile, &
642 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
643 time, nseg, word, iback, stp, xstep, k, &
644 cachyt, sbtime, lnscht, wunit)
645 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
646 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
647 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
654 IF (.NOT. first .OR. .NOT. (task(1:5) ==
'FG_LN' .OR. task(1:5) ==
'NEW_X'))
THEN
655 IF (iprint >= 99)
WRITE (wunit, 1001) iter + 1
658 IF (.NOT. constrained .AND. col > 0)
THEN
660 CALL dcopy(n, x, 1, z, 1)
672 CALL cauchy(n, x, lower_bound, upper_bound, nbd, g, indx2, iwhere, t, d, z, &
673 m, wy, ws, sy, wt, theta, col, head, &
674 wa(1), wa(2*m + 1), wa(4*m + 1), wa(6*m + 1), nseg, &
675 iprint, g_inf_norm, info, epsmch, wunit)
677 IF (keep_space_group)
THEN
682 IF (iprint >= 1)
WRITE (wunit, 1005)
690 cachyt = cachyt + cpu2 - cpu1
695 cachyt = cachyt + cpu2 - cpu1
696 nintol = nintol + nseg
701 CALL freev(n, nfree, index, nenter, ileave, indx2, &
702 iwhere, wrk, updatd, constrained, iprint, iter, wunit)
710 IF (.NOT. (nfree == 0 .OR. col == 0))
THEN
726 IF (wrk)
CALL formk(n, nfree, index, nenter, ileave, indx2, iupdat, &
727 updatd, wn, snd, m, ws, wy, sy, theta, col, head, info)
731 IF (iprint >= 1)
WRITE (wunit, 1006)
739 sbtime = sbtime + cpu2 - cpu1
746 CALL cmprlb(n, m, x, g, ws, wy, sy, wt, z, r, wa, index, &
747 theta, col, head, nfree, constrained, info)
749 IF (keep_space_group)
THEN
756 CALL subsm(n, m, nfree, index, lower_bound, upper_bound, nbd, z, r, xp, ws, wy, &
757 theta, x, g, col, head, iword, wa, wn, iprint, info, wunit)
759 IF (keep_space_group)
THEN
767 IF (iprint >= 1)
WRITE (wunit, 1005)
775 sbtime = sbtime + cpu2 - cpu1
781 sbtime = sbtime + cpu2 - cpu1
792 IF (keep_space_group)
THEN
801 IF (.NOT. first .OR. .NOT. (task(1:5) ==
'NEW_X'))
THEN
803 IF (keep_space_group)
THEN
810 CALL lnsrlb(n, lower_bound, upper_bound, nbd, x, f, fold, gd, gdold, g, d, r, t, z, stp, dnorm, &
811 dtd, xstep, step_max, iter, ifun, iback, nfgv, info, task, &
812 boxed, constrained, csave, isave(22), dsave(17), wunit)
814 IF (keep_space_group)
THEN
818 IF (info /= 0 .OR. iback >= 20)
THEN
820 CALL dcopy(n, t, 1, x, 1)
821 CALL dcopy(n, r, 1, g, 1)
832 task =
'ABNORMAL_TERMINATION_IN_LNSRCH'
836 CALL prn3lb(n, x, f, task, iprint, info, itfile, &
837 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
838 time, nseg, word, iback, stp, xstep, k, &
839 cachyt, sbtime, lnscht, wunit)
840 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
841 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
842 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
846 IF (iprint >= 1)
WRITE (wunit, 1008)
847 IF (info == 0) nfgv = nfgv - 1
854 task =
'RESTART_FROM_LNSRCH'
856 lnscht = lnscht + cpu2 - cpu1
860 ELSE IF (task(1:5) ==
'FG_LN')
THEN
862 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
863 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
864 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
869 lnscht = lnscht + cpu2 - cpu1
874 CALL projgr(n, lower_bound, upper_bound, nbd, x, g, g_inf_norm)
878 CALL prn2lb(n, x, f, g, iprint, itfile, iter, nfgv, nact, &
879 g_inf_norm, nseg, word, iword, iback, stp, xstep, wunit)
880 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
881 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
882 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
889 IF (g_inf_norm <= pgtol)
THEN
891 task =
'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
894 CALL prn3lb(n, x, f, task, iprint, info, itfile, &
895 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
896 time, nseg, word, iback, stp, xstep, k, &
897 cachyt, sbtime, lnscht, wunit)
898 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
899 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
900 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
904 ddum = max(abs(fold), abs(f), one)
905 IF ((fold - f) <= tol*ddum)
THEN
907 task =
'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
908 IF (iback >= 10) info = -5
912 CALL prn3lb(n, x, f, task, iprint, info, itfile, &
913 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
914 time, nseg, word, iback, stp, xstep, k, &
915 cachyt, sbtime, lnscht, wunit)
916 CALL save_local(lsave, isave, dsave, x_projected, constrained, boxed, updatd, nintol, itfile, iback, nskip, head, col, itail, &
917 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, &
918 cpu1, cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
923 IF (keep_space_group)
THEN
930 rr = ddot(n, r, 1, r, 1)
935 dr = (gd - gdold)*stp
936 CALL dscal(n, stp, d, 1)
940 IF (dr <= epsmch*ddum)
THEN
944 IF (iprint >= 1)
WRITE (wunit, 1004) dr, ddum
960 CALL matupd(n, m, ws, wy, sy, ss, d, r, itail, &
961 iupdat, col, head, theta, rr, dr, stp, dtd)
968 CALL formt(m, wt, sy, ss, col, theta, info)
973 IF (iprint >= 1)
WRITE (wunit, 1007)
9901001
FORMAT(//,
' L-BFGS| ITERATION ', i5)
992 (/,
' L-BFGS| At iterate', i5, 4x,
'f= ', 1p, d12.5, 4x,
'|proj g|= ', 1p, d12.5)
9931003
FORMAT(2(1x, i4), 5x,
'-', 5x,
'-', 3x,
'-', 5x,
'-', 5x,
'-', 8x,
'-', 3x, &
9951004
FORMAT(
' L-BFGS| ys=', 1p, e10.3,
' -gs=', 1p, e10.3,
' BFGS update SKIPPED')
997 ' L-BFGS| Singular triangular system detected;', /, &
998 ' L-BFGS| refresh the lbfgs memory and restart the iteration.')
1000 ' L-BFGS| Nonpositive definiteness in Cholesky factorization in formk;', /, &
1001 ' L-BFGS| refresh the lbfgs memory and restart the iteration.')
1003 ' L-BFGS| Nonpositive definiteness in Cholesky factorization in formt;', /, &
1004 ' L-BFGS| refresh the lbfgs memory and restart the iteration.')
1006 ' L-BFGS| Bad direction in the line search;', /, &
1007 ' L-BFGS| refresh the lbfgs memory and restart the iteration.')
1011 END SUBROUTINE mainlb
1037 SUBROUTINE active(n, lower_bound, upper_bound, nbd, x, iwhere, iprint, &
1038 x_projected, constrained, boxed, iwunit)
1040 INTEGER,
INTENT(in) :: n
1041 REAL(kind=
dp),
INTENT(in) :: lower_bound(n), upper_bound(n)
1043 REAL(kind=
dp) :: x(n)
1044 INTEGER,
INTENT(out) :: iwhere(n)
1046 LOGICAL :: x_projected, constrained, boxed
1047 INTEGER,
OPTIONAL :: iwunit
1049 REAL(kind=
dp),
PARAMETER :: zero = 0.0_dp
1051 INTEGER :: i, nbdd, wunit
1054 IF (
PRESENT(iwunit))
THEN
1055 IF (iwunit > 0) wunit = iwunit
1062 x_projected = .false.
1063 constrained = .false.
1069 IF (nbd(i) > 0)
THEN
1070 IF (nbd(i) <= 2 .AND. x(i) <= lower_bound(i))
THEN
1071 IF (x(i) < lower_bound(i))
THEN
1072 x_projected = .true.
1073 x(i) = lower_bound(i)
1076 ELSE IF (nbd(i) >= 2 .AND. x(i) >= upper_bound(i))
THEN
1077 IF (x(i) > upper_bound(i))
THEN
1078 x_projected = .true.
1079 x(i) = upper_bound(i)
1089 IF (nbd(i) /= 2) boxed = .false.
1090 IF (nbd(i) == 0)
THEN
1096 constrained = .true.
1097 IF (nbd(i) == 2 .AND. upper_bound(i) - lower_bound(i) <= zero)
THEN
1106 IF (iprint >= 0)
THEN
1107 IF (x_projected)
WRITE (wunit, 2001)
1108 IF (.NOT. constrained)
WRITE (wunit, 3001)
1111 IF (iprint > 0)
WRITE (wunit, 1001) nbdd
11131001
FORMAT(/,
' L-BFGS| At X0 ', i9,
' variables are exactly at the bounds')
11142001
FORMAT(
' L-BFGS| The initial X is infeasible. Restart with its projection.')
11153001
FORMAT(
' L-BFGS| This problem is unconstrained.')
1119 END SUBROUTINE active
1143 SUBROUTINE bmv(m, sy, wt, col, v, p, info)
1146 REAL(kind=
dp) :: sy(m, m), wt(m, m)
1148 REAL(kind=
dp),
INTENT(in) :: v(2*col)
1149 REAL(kind=
dp),
INTENT(out) :: p(2*col)
1150 INTEGER,
INTENT(out) :: info
1153 REAL(kind=
dp) :: sum
1155 IF (col == 0)
RETURN
1161 p(col + 1) = v(col + 1)
1166 sum = sum + sy(i, k)*v(k)/sy(k, k)
1171 CALL dtrsl(wt, m, col, p(col + 1), 11, info)
1172 IF (info /= 0)
RETURN
1176 p(i) = v(i)/sqrt(sy(i, i))
1183 CALL dtrsl(wt, m, col, p(col + 1), 01, info)
1184 IF (info /= 0)
RETURN
1189 p(i) = -p(i)/sqrt(sy(i, i))
1194 sum = sum + sy(k, i)*p(col + k)/sy(i, i)
1284 SUBROUTINE cauchy(n, x, lower_bound, upper_bound, nbd, g, iorder, iwhere, t, d, xcp, &
1285 m, wy, ws, sy, wt, theta, col, head, p, c, wbp, &
1286 v, nseg, iprint, g_inf_norm, info, epsmch, iwunit)
1287 INTEGER,
INTENT(in) :: n
1288 REAL(kind=
dp),
INTENT(in) :: x(n), lower_bound(n), upper_bound(n)
1289 INTEGER,
INTENT(in) :: nbd(n)
1290 REAL(kind=
dp),
INTENT(in) :: g(n)
1291 INTEGER :: iorder(n)
1292 INTEGER,
INTENT(inout) :: iwhere(n)
1293 REAL(kind=
dp) :: t(n), d(n), xcp(n)
1294 INTEGER,
INTENT(in) :: m
1295 REAL(kind=
dp),
INTENT(in) :: sy(m, m), wt(m, m), theta
1296 INTEGER,
INTENT(in) :: col
1297 REAL(kind=
dp),
INTENT(in) :: ws(n, col), wy(n, col)
1298 INTEGER,
INTENT(in) :: head
1299 REAL(kind=
dp) :: p(2*m), c(2*m), wbp(2*m), v(2*m)
1300 INTEGER :: nseg, iprint
1301 REAL(kind=
dp),
INTENT(in) :: g_inf_norm
1302 INTEGER,
INTENT(inout) :: info
1303 REAL(kind=
dp) :: epsmch
1304 INTEGER,
OPTIONAL :: iwunit
1306 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
1308 INTEGER :: col2, i, ibkmin, ibp, iter, j, nbreak, &
1309 nfree, nleft, pointr, wunit
1310 LOGICAL :: bnded, xlower, xupper
1311 REAL(kind=
dp) :: bkmin, ddot, dibp, dibp2, dt, dtm, f1, &
1312 f2, f2_org, neggi, tj, tj0, tl, tsum, &
1313 tu, wmc, wmp, wmw, zibp
1316 IF (
PRESENT(iwunit))
THEN
1317 IF (iwunit > 0) wunit = iwunit
1339 IF (g_inf_norm <= zero)
THEN
1340 IF (iprint >= 0)
WRITE (wunit, 7010)
1341 CALL dcopy(n, x, 1, xcp, 1)
1351 IF (iprint >= 99)
WRITE (wunit, 3010)
1365 IF (iwhere(i) /= 3 .AND. iwhere(i) /= -1)
THEN
1368 IF (nbd(i) <= 2) tl = x(i) - lower_bound(i)
1369 IF (nbd(i) >= 2) tu = upper_bound(i) - x(i)
1373 xlower = nbd(i) <= 2 .AND. tl <= zero
1374 xupper = nbd(i) >= 2 .AND. tu <= zero
1379 IF (neggi <= zero) iwhere(i) = 1
1380 ELSE IF (xupper)
THEN
1381 IF (neggi >= zero) iwhere(i) = 2
1383 IF (abs(neggi) <= zero) iwhere(i) = -3
1387 IF (iwhere(i) /= 0 .AND. iwhere(i) /= -1)
THEN
1391 f1 = f1 - neggi*neggi
1394 p(j) = p(j) + wy(i, pointr)*neggi
1395 p(col + j) = p(col + j) + ws(i, pointr)*neggi
1396 pointr = mod(pointr, m) + 1
1398 IF (nbd(i) <= 2 .AND. nbd(i) /= 0 &
1399 & .AND. neggi < zero)
THEN
1403 t(nbreak) = tl/(-neggi)
1404 IF (nbreak == 1 .OR. t(nbreak) < bkmin)
THEN
1408 ELSE IF (nbd(i) >= 2 .AND. neggi > zero)
THEN
1412 t(nbreak) = tu/neggi
1413 IF (nbreak == 1 .OR. t(nbreak) < bkmin)
THEN
1421 IF (abs(neggi) > zero) bnded = .false.
1430 IF (theta /= one)
THEN
1432 CALL dscal(col, theta, p(col + 1), 1)
1437 CALL dcopy(n, x, 1, xcp, 1)
1439 IF (nbreak == 0 .AND. nfree == n + 1)
THEN
1441 IF (iprint > 100)
WRITE (wunit, 1010) (xcp(i), i=1, n)
1456 CALL bmv(m, sy, wt, col, p, v, info)
1457 IF (info /= 0)
RETURN
1458 f2 = f2 - ddot(col2, v, 1, p, 1)
1463 IF (iprint >= 99)
THEN
1464 WRITE (wunit, 1011) nbreak
1474 IF (nleft == 0)
THEN
1475 IF (iprint >= 99)
THEN
1477 WRITE (wunit, 4010) nseg, f1, f2
1478 WRITE (wunit, 6010) dtm
1480 IF (dtm <= zero) dtm = zero
1486 CALL daxpy(n, tsum, d, 1, xcp, 1)
1489 DO WHILE (nleft > 0)
1500 ibp = iorder(ibkmin)
1505 IF (ibkmin /= nbreak)
THEN
1506 t(ibkmin) = t(nbreak)
1507 iorder(ibkmin) = iorder(nbreak)
1512 CALL hpsolb(nleft, t, iorder, iter - 2)
1519 IF (dt /= zero .AND. iprint >= 100)
THEN
1520 WRITE (wunit, 4011) nseg, f1, f2
1521 WRITE (wunit, 5010) dt
1522 WRITE (wunit, 6010) dtm
1528 IF (iprint >= 99)
THEN
1530 WRITE (wunit, 4010) nseg, f1, f2
1531 WRITE (wunit, 6010) dtm
1533 IF (dtm <= zero) dtm = zero
1539 CALL daxpy(n, tsum, d, 1, xcp, 1)
1551 IF (dibp > zero)
THEN
1552 zibp = upper_bound(ibp) - x(ibp)
1553 xcp(ibp) = upper_bound(ibp)
1556 zibp = lower_bound(ibp) - x(ibp)
1557 xcp(ibp) = lower_bound(ibp)
1560 IF (iprint >= 100)
WRITE (wunit, 8010) ibp
1561 IF (nleft == 0 .AND. nbreak == n)
THEN
1576 f1 = f1 + dt*f2 + dibp2 - theta*dibp*zibp
1577 f2 = f2 - theta*dibp2
1581 CALL daxpy(col2, dt, p, 1, c, 1)
1587 wbp(j) = wy(ibp, pointr)
1588 wbp(col + j) = theta*ws(ibp, pointr)
1589 pointr = mod(pointr, m) + 1
1593 CALL bmv(m, sy, wt, col, wbp, v, info)
1594 IF (info /= 0)
RETURN
1595 wmc = ddot(col2, c, 1, v, 1)
1596 wmp = ddot(col2, p, 1, v, 1)
1597 wmw = ddot(col2, wbp, 1, v, 1)
1600 CALL daxpy(col2, -dibp, wbp, 1, p, 1)
1604 f2 = f2 + 2.0_dp*dibp*wmp - dibp2*wmw
1607 f2 = max(epsmch*f2_org, f2)
1620 IF (iprint >= 99)
THEN
1622 WRITE (wunit, 4010) nseg, f1, f2
1623 WRITE (wunit, 6010) dtm
1625 IF (dtm <= zero) dtm = zero
1631 CALL daxpy(n, tsum, d, 1, xcp, 1)
1639 IF (col > 0)
CALL daxpy(col2, dtm, p, 1, c, 1)
1640 IF (iprint > 100)
WRITE (wunit, 1010) (xcp(i), i=1, n)
1641 IF (iprint >= 99)
WRITE (wunit, 2010)
16431010
FORMAT(
' L-BFGS| Cauchy X = ', /, (4x, 1p, 6(1x, d11.4)))
16441011
FORMAT(/,
' L-BFGS| There are ', i12,
' breakpoints ')
16452010
FORMAT(/,
' L-BFGS| ---------------- exit CAUCHY-----------------')
16463010
FORMAT(/,
' L-BFGS| ---------------- enter CAUCHY ---------------')
16474010
FORMAT(
' L-BFGS| Piece ', i3,
' --f1, f2 at start point ', 1p, 2(1x, d11.4))
16484011
FORMAT(/,
' L-BFGS| Piece ', i3,
' --f1, f2 at start point ', &
16504012
FORMAT(/,
' L-BFGS| GCP found in this segment')
16515010
FORMAT(
' L-BFGS| Distance to the next break point = ', 1p, d11.4)
16526010
FORMAT(
' L-BFGS| Distance to the stationary point = ', 1p, d11.4)
16537010
FORMAT(
' L-BFGS| Subgnorm = 0. GCP = X.')
16548010
FORMAT(
' L-BFGS| Variable ', i12,
' is fixed.')
1658 END SUBROUTINE cauchy
1688 SUBROUTINE cmprlb(n, m, x, g, ws, wy, sy, wt, z, r, wa, index, &
1689 theta, col, head, nfree, constrained, info)
1691 INTEGER,
INTENT(in) :: n, m
1692 REAL(kind=
dp),
INTENT(in) :: x(n), g(n), ws(n, m), wy(n, m), &
1693 sy(m, m), wt(m, m), z(n)
1694 REAL(kind=
dp),
INTENT(out) :: r(n), wa(4*m)
1695 INTEGER,
INTENT(in) :: index(n)
1696 REAL(kind=
dp),
INTENT(in) :: theta
1697 INTEGER,
INTENT(in) :: col, head, nfree
1698 LOGICAL,
INTENT(in) :: constrained
1701 INTEGER :: i, j, k, pointr
1702 REAL(kind=
dp) :: a1, a2
1704 IF (.NOT. constrained .AND. col > 0)
THEN
1711 r(i) = -theta*(z(k) - x(k)) - g(k)
1713 CALL bmv(m, sy, wt, col, wa(2*m + 1), wa(1), info)
1721 a2 = theta*wa(col + j)
1724 r(i) = r(i) + wy(k, pointr)*a1 + ws(k, pointr)*a2
1726 pointr = mod(pointr, m) + 1
1732 END SUBROUTINE cmprlb
1752 SUBROUTINE errclb(n, m, factr, lower_bound, upper_bound, nbd, task, info, k)
1754 INTEGER,
INTENT(in) :: n, m
1755 REAL(kind=
dp),
INTENT(in) :: factr, lower_bound(n), upper_bound(n)
1757 CHARACTER(LEN=60) :: task
1760 REAL(kind=
dp),
PARAMETER :: zero = 0.0_dp
1766 IF (n <= 0) task =
'ERROR: N <= 0'
1767 IF (m <= 0) task =
'ERROR: M <= 0'
1768 IF (factr < zero) task =
'ERROR: FACTR < 0'
1773 IF (nbd(i) < 0 .OR. nbd(i) > 3)
THEN
1775 task =
'ERROR: INVALID NBD'
1779 IF (nbd(i) == 2)
THEN
1780 IF (lower_bound(i) > upper_bound(i))
THEN
1782 task =
'ERROR: NO FEASIBLE SOLUTION'
1791 END SUBROUTINE errclb
1840 SUBROUTINE formk(n, nsub, ind, nenter, ileave, indx2, iupdat, &
1841 updatd, wn, wn1, m, ws, wy, sy, theta, col, &
1844 INTEGER,
INTENT(in) :: n, nsub, ind(n), nenter, ileave, &
1847 INTEGER,
INTENT(in) :: m
1848 REAL(kind=
dp) :: wn1(2*m, 2*m)
1849 REAL(kind=
dp),
INTENT(out) :: wn(2*m, 2*m)
1850 REAL(kind=
dp),
INTENT(in) :: ws(n, m), wy(n, m), sy(m, m), theta
1851 INTEGER,
INTENT(in) :: col, head
1852 INTEGER,
INTENT(out) :: info
1854 REAL(kind=
dp),
PARAMETER :: zero = 0.0_dp
1856 INTEGER :: col2, dbegin, dend, i, ipntr, is, is1, &
1857 iy, jpntr, js, js1, jy, k, k1, m2, &
1859 REAL(kind=
dp) :: ddot, temp1, temp2, temp3, temp4
1882 IF (iupdat > m)
THEN
1886 CALL dcopy(m - jy, wn1(jy + 1, jy + 1), 1, wn1(jy, jy), 1)
1887 CALL dcopy(m - jy, wn1(js + 1, js + 1), 1, wn1(js, js), 1)
1888 CALL dcopy(m - 1, wn1(m + 2, jy + 1), 1, wn1(m + 1, jy), 1)
1899 ipntr = head + col - 1
1900 IF (ipntr > m) ipntr = ipntr - m
1910 temp1 = temp1 + wy(k1, ipntr)*wy(k1, jpntr)
1915 temp2 = temp2 + ws(k1, ipntr)*ws(k1, jpntr)
1916 temp3 = temp3 + ws(k1, ipntr)*wy(k1, jpntr)
1921 jpntr = mod(jpntr, m) + 1
1926 jpntr = head + col - 1
1927 IF (jpntr > m) jpntr = jpntr - m
1935 temp3 = temp3 + ws(k1, ipntr)*wy(k1, jpntr)
1937 ipntr = mod(ipntr, m) + 1
1959 temp1 = temp1 + wy(k1, ipntr)*wy(k1, jpntr)
1960 temp2 = temp2 + ws(k1, ipntr)*ws(k1, jpntr)
1964 temp3 = temp3 + wy(k1, ipntr)*wy(k1, jpntr)
1965 temp4 = temp4 + ws(k1, ipntr)*ws(k1, jpntr)
1967 wn1(iy, jy) = wn1(iy, jy) + temp1 - temp3
1968 wn1(is, js) = wn1(is, js) - temp2 + temp4
1969 jpntr = mod(jpntr, m) + 1
1971 ipntr = mod(ipntr, m) + 1
1976 DO is = m + 1, m + upcl
1983 temp1 = temp1 + ws(k1, ipntr)*wy(k1, jpntr)
1987 temp3 = temp3 + ws(k1, ipntr)*wy(k1, jpntr)
1989 IF (is <= jy + m)
THEN
1990 wn1(is, jy) = wn1(is, jy) + temp1 - temp3
1992 wn1(is, jy) = wn1(is, jy) - temp1 + temp3
1994 jpntr = mod(jpntr, m) + 1
1996 ipntr = mod(ipntr, m) + 1
2009 wn(jy, iy) = wn1(iy, jy)/theta
2010 wn(js, is) = wn1(is1, js1)*theta
2013 wn(jy, is) = -wn1(is1, jy)
2016 wn(jy, is) = wn1(is1, jy)
2018 wn(iy, iy) = wn(iy, iy) + sy(iy, iy)
2026 CALL dpofa(wn, m2, col, info)
2033 DO js = col + 1, col2
2034 CALL dtrsl(wn, m2, col, wn(1, js), 11, info)
2040 DO is = col + 1, col2
2042 wn(is, js) = wn(is, js) + ddot(col, wn(1, is), 1, wn(1, js), 1)
2048 CALL dpofa(wn(col + 1, col + 1), m2, col, info)
2056 END SUBROUTINE formk
2077 SUBROUTINE formt(m, wt, sy, ss, col, theta, info)
2080 REAL(kind=
dp) :: wt(m, m), sy(m, m), ss(m, m)
2082 REAL(kind=
dp) :: theta
2085 REAL(kind=
dp),
PARAMETER :: zero = 0.0_dp
2087 INTEGER :: i, j, k, k1
2088 REAL(kind=
dp) :: ddum
2094 wt(1, j) = theta*ss(1, j)
2101 ddum = ddum + sy(i, k)*sy(j, k)/sy(k, k)
2103 wt(i, j) = ddum + theta*ss(i, j)
2110 CALL dpofa(wt, m, col, info)
2117 END SUBROUTINE formt
2152 SUBROUTINE freev(n, nfree, index, nenter, ileave, indx2, &
2153 iwhere, wrk, updatd, constrained, iprint, iter, iwunit)
2156 INTEGER,
INTENT(inout) :: index(n)
2157 INTEGER :: nenter, ileave
2158 INTEGER,
INTENT(out) :: indx2(n)
2159 INTEGER :: iwhere(n)
2160 LOGICAL :: wrk, updatd, constrained
2161 INTEGER :: iprint, iter
2162 INTEGER,
OPTIONAL :: iwunit
2164 INTEGER :: i, iact, k, wunit
2167 IF (
PRESENT(iwunit))
THEN
2168 IF (iwunit > 0) wunit = iwunit
2173 IF (iter > 0 .AND. constrained)
THEN
2178 IF (iwhere(k) > 0)
THEN
2181 IF (iprint >= 100)
WRITE (wunit, 1030) k
2186 IF (iwhere(k) <= 0)
THEN
2189 IF (iprint >= 100)
WRITE (wunit, 2030) k
2192 IF (iprint >= 99)
WRITE (wunit, 3030) n + 1 - ileave, nenter
2194 wrk = (ileave < n + 1) .OR. (nenter > 0) .OR. updatd
2201 IF (iwhere(i) <= 0)
THEN
2209 IF (iprint >= 99)
WRITE (wunit, 4030) nfree, iter + 1
22111030
FORMAT(
' L-BFGS| Variable ', i12,
' leaves the set of free variables')
22122030
FORMAT(
' L-BFGS| Variable ', i12,
' enters the set of free variables')
22133030
FORMAT(
' L-BFGS| ', i12,
' variables leave; ', i12,
' variables enter')
22144030
FORMAT(
' L-BFGS| ', i12,
' variables are free at GCP ', i12)
2218 END SUBROUTINE freev
2240 SUBROUTINE hpsolb(n, t, iorder, iheap)
2241 INTEGER,
INTENT(in) :: n
2242 REAL(kind=
dp),
INTENT(inout) :: t(n)
2243 INTEGER,
INTENT(inout) :: iorder(n)
2244 INTEGER,
INTENT(in) :: iheap
2246 INTEGER :: i, indxin, indxou, j, k
2247 REAL(kind=
dp) :: ddum, out
2255 IF (iheap == 0)
THEN
2267 IF (ddum < t(j))
THEN
2269 iorder(i) = iorder(j)
2293 DO WHILE (j <= n - 1)
2294 IF (t(j + 1) < t(j)) j = j + 1
2295 IF (t(j) < ddum)
THEN
2297 iorder(i) = iorder(j)
2315 END SUBROUTINE hpsolb
2360 SUBROUTINE lnsrlb(n, lower_bound, upper_bound, nbd, x, f, fold, gd, gdold, g, d, r, t, &
2361 z, stp, dnorm, dtd, xstep, step_max, iter, ifun, &
2362 iback, nfgv, info, task, boxed, constrained, csave, &
2363 isave, dsave, iwunit)
2365 INTEGER,
INTENT(in) :: n
2366 REAL(kind=
dp),
INTENT(in) :: lower_bound(n), upper_bound(n)
2368 REAL(kind=
dp) :: x(n), f, fold, gd, gdold, g(n), d(n), &
2369 r(n), t(n), z(n), stp, dnorm, dtd, &
2371 INTEGER :: iter, ifun, iback, nfgv, info
2372 CHARACTER(LEN=60) :: task
2373 LOGICAL :: boxed, constrained
2374 CHARACTER(LEN=60) :: csave
2376 REAL(kind=
dp) :: dsave(13)
2377 INTEGER,
OPTIONAL :: iwunit
2379 REAL(kind=
dp),
PARAMETER :: big = 1.0e10_dp, ftol = 1.0e-3_dp, &
2380 gtol = 0.9_dp, one = 1.0_dp, &
2381 xtol = 0.1_dp, zero = 0.0_dp
2384 REAL(kind=
dp) :: a1, a2, ddot
2387 IF (
PRESENT(iwunit))
THEN
2388 IF (iwunit > 0) wunit = iwunit
2391 IF (.NOT. (task(1:5) ==
'FG_LN'))
THEN
2393 dtd = ddot(n, d, 1, d, 1)
2399 IF (constrained)
THEN
2405 IF (nbd(i) /= 0)
THEN
2406 IF (a1 < zero .AND. nbd(i) <= 2)
THEN
2407 a2 = lower_bound(i) - x(i)
2408 IF (a2 >= zero)
THEN
2410 ELSE IF (a1*step_max < a2)
THEN
2413 ELSE IF (a1 > zero .AND. nbd(i) >= 2)
THEN
2414 a2 = upper_bound(i) - x(i)
2415 IF (a2 <= zero)
THEN
2417 ELSE IF (a1*step_max > a2)
THEN
2426 IF (iter == 0 .AND. .NOT. boxed)
THEN
2427 stp = min(one/dnorm, step_max)
2432 CALL dcopy(n, x, 1, t, 1)
2433 CALL dcopy(n, g, 1, r, 1)
2439 gd = ddot(n, g, 1, d, 1)
2442 IF (gd >= zero)
THEN
2445 WRITE (wunit, 1020) gd
2451 CALL dcsrch(f, gd, stp, ftol, gtol, xtol, zero, step_max, csave, isave, dsave)
2454 IF (csave(1:4) /=
'CONV' .AND. csave(1:4) /=
'WARN')
THEN
2459 IF (stp == one)
THEN
2460 CALL dcopy(n, z, 1, x, 1)
2463 x(i) = stp*d(i) + t(i)
24701020
FORMAT(
' L-BFGS| ascent direction in projection gd = ', d12.5)
2474 END SUBROUTINE lnsrlb
2502 SUBROUTINE matupd(n, m, ws, wy, sy, ss, d, r, itail, &
2503 iupdat, col, head, theta, rr, dr, stp, dtd)
2506 REAL(kind=
dp) :: ws(n, m), wy(n, m), sy(m, m), ss(m, m), &
2508 INTEGER :: itail, iupdat, col, head
2509 REAL(kind=
dp) :: theta, rr, dr, stp, dtd
2511 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp
2513 INTEGER :: j, pointr
2514 REAL(kind=
dp) :: ddot
2519 IF (iupdat <= m)
THEN
2521 itail = mod(head + iupdat - 2, m) + 1
2523 itail = mod(itail, m) + 1
2524 head = mod(head, m) + 1
2529 CALL dcopy(n, d, 1, ws(1, itail), 1)
2530 CALL dcopy(n, r, 1, wy(1, itail), 1)
2540 IF (iupdat > m)
THEN
2543 CALL dcopy(j, ss(2, j + 1), 1, ss(1, j), 1)
2544 CALL dcopy(col - j, sy(j + 1, j + 1), 1, sy(j, j), 1)
2551 sy(col, j) = ddot(n, d, 1, wy(1, pointr), 1)
2552 ss(j, col) = ddot(n, ws(1, pointr), 1, d, 1)
2553 pointr = mod(pointr, m) + 1
2555 IF (stp == one)
THEN
2558 ss(col, col) = stp*stp*dtd
2564 END SUBROUTINE matupd
2588 SUBROUTINE prn1lb(n, m, lower_bound, upper_bound, x, iprint, itfile, epsmch, iwunit)
2590 INTEGER,
INTENT(in) :: n, m
2591 REAL(kind=
dp),
INTENT(in) :: lower_bound(n), upper_bound(n), x(n)
2592 INTEGER :: iprint, itfile
2593 REAL(kind=
dp) :: epsmch
2594 INTEGER,
OPTIONAL :: iwunit
2599 IF (
PRESENT(iwunit))
THEN
2600 IF (iwunit > 0) wunit = iwunit
2603 IF (iprint >= 0)
THEN
2604 WRITE (wunit, 7001) epsmch
2605 WRITE (wunit, 7002) n, m
2606 IF (iprint >= 1)
THEN
2607 WRITE (itfile, 2001) epsmch
2608 WRITE (itfile, 7003) n, m
2609 WRITE (itfile, 9001)
2610 IF (iprint > 100)
THEN
2611 WRITE (wunit, 1004)
' L-BFGS| L =', (lower_bound(i), i=1, n)
2612 WRITE (wunit, 1004)
' L-BFGS| X0 =', (x(i), i=1, n)
2613 WRITE (wunit, 1004)
' L-BFGS| U =', (upper_bound(i), i=1, n)
26181004
FORMAT(/, a13, 1p, /, (4x, 1p, 6(1x, d11.4)))
26192001
FORMAT(
'RUNNING THE L-BFGS-B CODE', /, /, &
2620 'it = iteration number', /, &
2621 'nf = number of function evaluations', /, &
2622 'nseg = number of segments explored during the Cauchy search', /, &
2623 'nact = number of active bounds at the generalized Cauchy point' &
2625 'sub = manner in which the subspace minimization terminated:' &
2626 , /,
' con = converged, bnd = a bound was reached', /, &
2627 'itls = number of iterations performed in the line search', /, &
2628 'stepl = step length used', /, &
2629 'tstep = norm of the displacement (total step)', /, &
2630 'projg = norm of the projected gradient', /, &
2631 'f = function value', /, /, &
2633 'Machine precision =', 1p, d10.3)
26347001
FORMAT(/,
' L-BFGS| RUNNING THE L-BFGS-B CODE', /, &
2635 ' L-BFGS| Machine precision =', 1p, d10.3)
26367002
FORMAT(/,
' L-BFGS| N = ', i12,
' M = ', i12)
26377003
FORMAT(
' N = ', i12,
' M = ', i12)
26389001
FORMAT(/, 3x,
'it', 3x,
'nf', 2x,
'nseg', 2x,
'nact', 2x,
'sub', 2x,
'itls', &
2639 2x,
'stepl', 4x,
'tstep', 5x,
'projg', 8x,
'f')
2643 END SUBROUTINE prn1lb
2672 SUBROUTINE prn2lb(n, x, f, g, iprint, itfile, iter, nfgv, nact, &
2673 g_inf_norm, nseg, word, iword, iback, stp, xstep, iwunit)
2675 INTEGER,
INTENT(in) :: n
2676 REAL(kind=
dp),
INTENT(in) :: x(n), f, g(n)
2677 INTEGER,
INTENT(in) :: iprint, itfile, iter, nfgv, nact
2678 REAL(kind=
dp),
INTENT(in) :: g_inf_norm
2679 INTEGER,
INTENT(in) :: nseg
2680 CHARACTER(LEN=3) :: word
2681 INTEGER :: iword, iback
2682 REAL(kind=
dp) :: stp, xstep
2683 INTEGER,
OPTIONAL :: iwunit
2685 INTEGER :: i, imod, wunit
2688 IF (
PRESENT(iwunit))
THEN
2689 IF (iwunit > 0) wunit = iwunit
2694 IF (iword == 0)
THEN
2697 ELSE IF (iword == 1)
THEN
2700 ELSE IF (iword == 5)
THEN
2706 IF (iprint >= 99)
THEN
2707 WRITE (wunit, 2002) iback, xstep
2708 WRITE (wunit, 2001) iter, f, g_inf_norm
2709 IF (iprint > 100)
THEN
2710 WRITE (wunit, 1004)
' L-BFGS| X =', (x(i), i=1, n)
2711 WRITE (wunit, 1004)
' L-BFGS| G =', (g(i), i=1, n)
2713 ELSE IF (iprint > 0)
THEN
2714 imod = mod(iter, iprint)
2715 IF (imod == 0)
WRITE (wunit, 2001) iter, f, g_inf_norm
2717 IF (iprint >= 1)
WRITE (itfile, 3001) &
2718 iter, nfgv, nseg, nact, word, iback, stp, xstep, g_inf_norm, f
27201004
FORMAT(/, a12, 1p, /, (4x, 1p, 6(1x, d11.4)))
2722 (/,
' L-BFGS| At iterate', i5, 4x,
'f= ', 1p, d12.5, 4x,
'|proj g|= ', 1p, d12.5)
27232002
FORMAT(/,
' L-BFGS| LINE SEARCH ', i12,
' times; norm of step = ', 1p, d24.15)
27243001
FORMAT(2(1x, i4), 2(1x, i5), 2x, a3, 1x, i4, 1p, 2(2x, d7.1), 1p, 2(1x, d10.3))
2728 END SUBROUTINE prn2lb
2766 SUBROUTINE prn3lb(n, x, f, task, iprint, info, itfile, &
2767 iter, nfgv, nintol, nskip, nact, g_inf_norm, &
2768 time, nseg, word, iback, stp, xstep, k, &
2769 cachyt, sbtime, lnscht, iwunit)
2771 INTEGER,
INTENT(in) :: n
2772 REAL(kind=
dp),
INTENT(in) :: x(n), f
2773 CHARACTER(LEN=60),
INTENT(in) :: task
2774 INTEGER,
INTENT(in) :: iprint, info, itfile, iter, nfgv, &
2776 REAL(kind=
dp),
INTENT(in) :: g_inf_norm, time
2777 INTEGER,
INTENT(in) :: nseg
2778 CHARACTER(LEN=3) :: word
2780 REAL(kind=
dp) :: stp, xstep
2782 REAL(kind=
dp) :: cachyt, sbtime, lnscht
2783 INTEGER,
OPTIONAL :: iwunit
2788 IF (
PRESENT(iwunit))
THEN
2789 IF (iwunit > 0) wunit = iwunit
2792 IF (iprint >= 0 .AND. .NOT. (task(1:5) ==
'ERROR'))
THEN
2795 WRITE (wunit, 3005) n, iter, nfgv, nintol, nskip, nact, g_inf_norm, f
2796 IF (iprint >= 100)
THEN
2797 WRITE (wunit, 1004)
' L-BFGS| X =', (x(i), i=1, n)
2799 IF (iprint >= 1)
WRITE (wunit, 3006) f
2801 IF (iprint >= 0)
THEN
2804 WRITE (wunit, 3009) task
2806 IF (info == -1)
WRITE (wunit, 9011)
2807 IF (info == -2)
WRITE (wunit, 9012)
2808 IF (info == -3)
WRITE (wunit, 9013)
2809 IF (info == -4)
WRITE (wunit, 9014)
2810 IF (info == -5)
WRITE (wunit, 9015)
2811 IF (info == -6)
WRITE (wunit, 9016) k
2812 IF (info == -7)
WRITE (wunit, 9017) k, k
2813 IF (info == -8)
WRITE (wunit, 9018)
2814 IF (info == -9)
WRITE (wunit, 9019)
2816 IF (iprint >= 1)
WRITE (wunit, 3007) cachyt, sbtime, lnscht
2817 WRITE (wunit, 3008) time
2820 IF (iprint >= 1)
THEN
2821 IF (info == -4 .OR. info == -9)
THEN
2822 WRITE (itfile, 3002) &
2823 iter, nfgv, nseg, nact, word, iback, stp, xstep
2825 WRITE (itfile, 4009) task
2827 IF (info == -1)
WRITE (itfile, 9011)
2828 IF (info == -2)
WRITE (itfile, 9012)
2829 IF (info == -3)
WRITE (itfile, 9013)
2830 IF (info == -4)
WRITE (itfile, 9014)
2831 IF (info == -5)
WRITE (itfile, 9015)
2832 IF (info == -8)
WRITE (itfile, 9018)
2833 IF (info == -9)
WRITE (itfile, 9019)
2835 WRITE (itfile, 3008) time
28391004
FORMAT(/, a12, 1p, /, (4x, 1p, 6(1x, d11.4)))
28403001
FORMAT(/,
' L-BFGS| ---------------- Information ----------------')
28413002
FORMAT(2(1x, i4), 2(1x, i5), 2x, a3, 1x, i4, 1p, 2(2x, d7.1), 6x,
'-', 10x,
'-')
2843 ' L-BFGS| * * *', /, /, &
2844 ' L-BFGS| Tit = total number of iterations', /, &
2845 ' L-BFGS| Tnf = total number of function evaluations', /, &
2846 ' L-BFGS| Tnint = total number of segments explored during', &
2847 ' L-BFGS| Cauchy searches', /, &
2848 ' L-BFGS| Skip = number of BFGS updates skipped', /, &
2849 ' L-BFGS| Nact = number of active bounds at final generalized', &
2850 ' L-BFGS| Cauchy point', /, &
2851 ' L-BFGS| Projg = norm of the final projected gradient', /, &
2852 ' L-BFGS| F = final function value', /, /, &
28543004
FORMAT(/,
' L-BFGS| ', 3x,
'N', 4x,
'Tit', 5x,
'Tnf', 2x,
'Tnint', 2x, &
2855 'Skip', 2x,
'Nact', 5x,
'Projg', 8x,
'F')
28563005
FORMAT(
' L-BFGS| ', i5, 2(1x, i6), (1x, i6), (2x, i4), (1x, i5), 1p, 2(2x, d10.3))
28573006
FORMAT(
' L-BFGS| F =', d12.5)
2859 ' L-BFGS| Cauchy time', 1p, e10.3,
' seconds.', / &
2860 ' L-BFGS| Subspace minimization time', 1p, e10.3,
' seconds.', / &
2861 ' L-BFGS| Line search time', 1p, e10.3,
' seconds.')
28623008
FORMAT(/,
' Total User time', 1p, e10.3,
' seconds.',/)
28633009
FORMAT(/,
' L-BFGS| ', a60)
2866 ' Matrix in 1st Cholesky factorization in formk is not Pos. Def.')
2868 ' Matrix in 2st Cholesky factorization in formk is not Pos. Def.')
2870 ' Matrix in the Cholesky factorization in formt is not Pos. Def.')
2872 ' Derivative >= 0, backtracking line search impossible.', /, &
2873 ' Previous x, f and g restored.', /, &
2874 ' Possible causes: 1 error in function or gradient evaluation;', /, &
2875 ' 2 rounding errors dominate computation.')
2877 ' Warning: more than 10 function and gradient', /, &
2878 ' evaluations in the last line search. Termination', /, &
2879 ' may possibly be caused by a bad search direction.')
28809016
FORMAT(
' Input nbd(', i12,
') is invalid.')
28819017
FORMAT(
' l(', i12,
') > u(', i12,
'). No feasible solution.')
28829018
FORMAT(/,
' The triangular system is singular.')
2884 ' Line search cannot locate an adequate point after 20 function', /, &
2885 ' and gradient evaluations. Previous x, f and g restored.', /, &
2886 ' Possible causes: 1 error in function or gradient evaluation;', /, &
2887 ' 2 rounding error dominate computation.')
2891 END SUBROUTINE prn3lb
2909 SUBROUTINE projgr(n, lower_bound, upper_bound, nbd, x, g, g_inf_norm)
2911 INTEGER,
INTENT(in) :: n
2912 REAL(kind=
dp),
INTENT(in) :: lower_bound(n), upper_bound(n)
2913 INTEGER,
INTENT(in) :: nbd(n)
2914 REAL(kind=
dp),
INTENT(in) :: x(n), g(n)
2915 REAL(kind=
dp) :: g_inf_norm
2917 REAL(kind=
dp),
PARAMETER :: zero = 0.0_dp
2925 IF (nbd(i) /= 0)
THEN
2927 IF (nbd(i) >= 2) gi = max((x(i) - upper_bound(i)), gi)
2929 IF (nbd(i) <= 2) gi = min((x(i) - lower_bound(i)), gi)
2932 g_inf_norm = max(g_inf_norm, abs(gi))
2937 END SUBROUTINE projgr
3046 SUBROUTINE subsm(n, m, nsub, ind, lower_bound, upper_bound, nbd, x, d, xp, ws, wy, &
3048 col, head, iword, wv, wn, iprint, info, iwunit)
3049 INTEGER,
INTENT(in) :: n, m, nsub, ind(nsub)
3050 REAL(kind=
dp),
INTENT(in) :: lower_bound(n), upper_bound(n)
3051 INTEGER,
INTENT(in) :: nbd(n)
3052 REAL(kind=
dp),
INTENT(inout) :: x(n), d(n)
3053 REAL(kind=
dp) :: xp(n)
3054 REAL(kind=
dp),
INTENT(in) :: ws(n, m), wy(n, m), theta, xx(n), gg(n)
3055 INTEGER,
INTENT(in) :: col, head
3056 INTEGER,
INTENT(out) :: iword
3057 REAL(kind=
dp) :: wv(2*m)
3058 REAL(kind=
dp),
INTENT(in) :: wn(2*m, 2*m)
3060 INTEGER,
INTENT(out) :: info
3061 INTEGER,
OPTIONAL :: iwunit
3063 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
3065 INTEGER :: col2, i, ibd, j, js, jy, k, m2, pointr, &
3067 REAL(kind=
dp) :: alpha, dd_p, dk, temp1, temp2, xk
3081 IF (
PRESENT(iwunit))
THEN
3082 IF (iwunit > 0) wunit = iwunit
3085 IF (nsub <= 0)
RETURN
3086 IF (iprint >= 99)
WRITE (wunit, 4001)
3096 temp1 = temp1 + wy(k, pointr)*d(j)
3097 temp2 = temp2 + ws(k, pointr)*d(j)
3100 wv(col + i) = theta*temp2
3101 pointr = mod(pointr, m) + 1
3108 CALL dtrsl(wn, m2, col2, wv, 11, info)
3109 IF (info /= 0)
RETURN
3113 CALL dtrsl(wn, m2, col2, wv, 01, info)
3114 IF (info /= 0)
RETURN
3123 d(i) = d(i) + wy(k, pointr)*wv(jy)/theta &
3124 & + ws(k, pointr)*wv(js)
3126 pointr = mod(pointr, m) + 1
3129 CALL dscal(nsub, one/theta, d, 1)
3136 CALL dcopy(n, x, 1, xp, 1)
3142 IF (nbd(k) /= 0)
THEN
3145 IF (nbd(k) == 1)
THEN
3146 x(k) = max(lower_bound(k), xk + dk)
3147 IF (x(k) == lower_bound(k)) iword = 1
3151 IF (nbd(k) == 2)
THEN
3152 xk = max(lower_bound(k), xk + dk)
3153 x(k) = min(upper_bound(k), xk)
3154 IF (x(k) == lower_bound(k) .OR. x(k) == upper_bound(k)) iword = 1
3158 IF (nbd(k) == 3)
THEN
3159 x(k) = min(upper_bound(k), xk + dk)
3160 IF (x(k) == upper_bound(k)) iword = 1
3171 IF (.NOT. (iword == 0))
THEN
3177 dd_p = dd_p + (x(i) - xx(i))*gg(i)
3179 IF (dd_p > zero)
THEN
3180 CALL dcopy(n, xp, 1, x, 1)
3181 IF (iprint > 0)
WRITE (wunit, 4002)
3182 IF (iprint > 0)
WRITE (wunit, 4003)
3189 IF (nbd(k) /= 0)
THEN
3190 IF (dk < zero .AND. nbd(k) <= 2)
THEN
3191 temp2 = lower_bound(k) - x(k)
3192 IF (temp2 >= zero)
THEN
3194 ELSE IF (dk*alpha < temp2)
THEN
3197 ELSE IF (dk > zero .AND. nbd(k) >= 2)
THEN
3198 temp2 = upper_bound(k) - x(k)
3199 IF (temp2 <= zero)
THEN
3201 ELSE IF (dk*alpha > temp2)
THEN
3205 IF (temp1 < alpha)
THEN
3212 IF (alpha < one)
THEN
3216 x(k) = upper_bound(k)
3218 ELSE IF (dk < zero)
THEN
3219 x(k) = lower_bound(k)
3225 x(k) = x(k) + alpha*d(i)
3230 IF (iprint >= 99)
WRITE (wunit, 4004)
32324001
FORMAT(/,
' L-BFGS| ---------------- enter SUBSM ----------------',/)
32334002
FORMAT(
' L-BFGS| Positive dir derivative in projection ')
32344003
FORMAT(
' L-BFGS| Using the backtracking step ')
32354004
FORMAT(/,
' L-BFGS| ---------------- exit SUBSM -----------------',/)
3239 END SUBROUTINE subsm
3327 SUBROUTINE dcsrch(f, g, stp, ftol, gtol, xtol, stpmin, stpmax, &
3329 REAL(kind=
dp) :: f, g
3330 REAL(kind=
dp),
INTENT(inout) :: stp
3331 REAL(kind=
dp) :: ftol, gtol, xtol, stpmin, stpmax
3332 CHARACTER(LEN=*) :: task
3334 REAL(kind=
dp) :: dsave(13)
3336 REAL(kind=
dp),
PARAMETER :: p5 = 0.5_dp, p66 = 0.66_dp, &
3337 xtrapl = 1.1_dp, xtrapu = 4.0_dp, &
3342 REAL(kind=
dp) :: finit, fm, ftest, fx, fxm, fy, fym, &
3343 ginit, gm, gtest, gx, gxm, gy, gym, &
3344 stmax, stmin, stx, sty, width, width1
3361 IF (task(1:5) ==
'START')
THEN
3365 IF (stp < stpmin) task =
'ERROR: STP < STPMIN'
3366 IF (stp > stpmax) task =
'ERROR: STP > STPMAX'
3367 IF (g >= zero) task =
'ERROR: INITIAL G >= ZERO'
3368 IF (ftol < zero) task =
'ERROR: FTOL < ZERO'
3369 IF (gtol < zero) task =
'ERROR: GTOL < ZERO'
3370 IF (xtol < zero) task =
'ERROR: XTOL < ZERO'
3371 IF (stpmin < zero) task =
'ERROR: STPMIN < ZERO'
3372 IF (stpmax < stpmin) task =
'ERROR: STPMAX < STPMIN'
3376 IF (task(1:5) ==
'ERROR')
RETURN
3385 width = stpmax - stpmin
3402 stmax = stp + xtrapu*stp
3409 IF (isave(1) == 1)
THEN
3432 ftest = finit + stp*gtest
3433 IF (stage == 1 .AND. f <= ftest .AND. g >= zero)
THEN
3439 IF (brackt .AND. (stp <= stmin .OR. stp >= stmax))
THEN
3440 task =
'WARNING: ROUNDING ERRORS PREVENT PROGRESS'
3442 IF (brackt .AND. stmax - stmin <= xtol*stmax)
THEN
3443 task =
'WARNING: XTOL TEST SATISFIED'
3445 IF (stp == stpmax .AND. f <= ftest .AND. g <= gtest)
THEN
3446 task =
'WARNING: STP = STPMAX'
3448 IF (stp == stpmin .AND. (f > ftest .OR. g >= gtest))
THEN
3449 task =
'WARNING: STP = STPMIN'
3454 IF (f <= ftest .AND. abs(g) <= gtol*(-ginit))
THEN
3455 task =
'CONVERGENCE'
3460 IF (.NOT. (task(1:4) ==
'WARN' .OR. task(1:4) ==
'CONV'))
THEN
3466 IF (stage == 1 .AND. f <= fx .AND. f > ftest)
THEN
3471 fxm = fx - stx*gtest
3472 fym = fy - sty*gtest
3479 CALL dcstep(stx, fxm, gxm, sty, fym, gym, stp, fm, gm, &
3480 brackt, stmin, stmax)
3484 fx = fxm + stx*gtest
3485 fy = fym + sty*gtest
3493 CALL dcstep(stx, fx, gx, sty, fy, gy, stp, f, g, &
3494 brackt, stmin, stmax)
3501 IF (abs(sty - stx) >= p66*width1) stp = stx + p5*(sty - stx)
3503 width = abs(sty - stx)
3509 stmin = min(stx, sty)
3510 stmax = max(stx, sty)
3512 stmin = stp + xtrapl*(stp - stx)
3513 stmax = stp + xtrapu*(stp - stx)
3518 stp = max(stp, stpmin)
3519 stp = min(stp, stpmax)
3524 IF (brackt .AND. (stp <= stmin .OR. stp >= stmax) &
3525 .OR. (brackt .AND. stmax - stmin <= xtol*stmax)) stp = stx
3557 END SUBROUTINE dcsrch
3602 SUBROUTINE dcstep(stx, fx, dx, sty, fy, dy, stp, fp, dp_loc, brackt, &
3604 REAL(kind=
dp),
INTENT(inout) :: stx, fx, dx, sty, fy, dy, stp
3605 REAL(kind=
dp),
INTENT(in) :: fp, dp_loc
3606 LOGICAL,
INTENT(inout) :: brackt
3607 REAL(kind=
dp),
INTENT(in) :: stpmin, stpmax
3609 REAL(kind=
dp),
PARAMETER :: p66 = 0.66_dp, three = 3.0_dp, &
3610 two = 2.0_dp, zero = 0.0_dp
3612 REAL(kind=
dp) ::
gamma, p, q, r, s, sgnd, stpc, stpf, &
3626 sgnd = dp_loc*sign(1.0_dp, dx)
3634 theta = three*(fx - fp)/(stp - stx) + dx + dp_loc
3635 s = max(abs(theta), abs(dx), abs(dp_loc))
3636 gamma = s*sqrt((theta/s)**2 - (dx/s)*(dp_loc/s))
3638 p = (
gamma - dx) + theta
3641 stpc = stx + r*(stp - stx)
3642 stpq = stx + ((dx/((fx - fp)/(stp - stx) + dx))/two)* &
3644 IF (abs(stpc - stx) < abs(stpq - stx))
THEN
3647 stpf = stpc + (stpq - stpc)/two
3656 ELSE IF (sgnd < zero)
THEN
3657 theta = three*(fx - fp)/(stp - stx) + dx + dp_loc
3658 s = max(abs(theta), abs(dx), abs(dp_loc))
3659 gamma = s*sqrt((theta/s)**2 - (dx/s)*(dp_loc/s))
3661 p = (
gamma - dp_loc) + theta
3664 stpc = stp + r*(stx - stp)
3665 stpq = stp + (dp_loc/(dp_loc - dx))*(stx - stp)
3666 IF (abs(stpc - stp) > abs(stpq - stp))
THEN
3676 ELSE IF (abs(dp_loc) < abs(dx))
THEN
3683 theta = three*(fx - fp)/(stp - stx) + dx + dp_loc
3684 s = max(abs(theta), abs(dx), abs(dp_loc))
3689 gamma = s*sqrt(max(zero, (theta/s)**2 - (dx/s)*(dp_loc/s)))
3691 p = (
gamma - dp_loc) + theta
3694 IF (r < zero .AND.
gamma /= zero)
THEN
3695 stpc = stp + r*(stx - stp)
3696 ELSE IF (stp > stx)
THEN
3701 stpq = stp + (dp_loc/(dp_loc - dx))*(stx - stp)
3709 IF (abs(stpc - stp) < abs(stpq - stp))
THEN
3715 stpf = min(stp + p66*(sty - stp), stpf)
3717 stpf = max(stp + p66*(sty - stp), stpf)
3725 IF (abs(stpc - stp) > abs(stpq - stp))
THEN
3730 stpf = min(stpmax, stpf)
3731 stpf = max(stpmin, stpf)
3741 theta = three*(fp - fy)/(sty - stp) + dy + dp_loc
3742 s = max(abs(theta), abs(dy), abs(dp_loc))
3743 gamma = s*sqrt((theta/s)**2 - (dy/s)*(dp_loc/s))
3745 p = (
gamma - dp_loc) + theta
3748 stpc = stp + r*(sty - stp)
3750 ELSE IF (stp > stx)
THEN
3764 IF (sgnd < zero)
THEN
3779 END SUBROUTINE dcstep
3803 SUBROUTINE dpofa(a, lda, n, info)
3804 INTEGER,
INTENT(in) :: lda
3805 REAL(kind=
dp) :: a(lda, *)
3806 INTEGER,
INTENT(in) :: n
3809 INTEGER :: j, jm1, k
3810 REAL(kind=
dp) :: ddot, s, t
3824 IF (.NOT. (jm1 < 1))
THEN
3826 t = a(k, j) - ddot(k - 1, a(1, k), 1, a(1, j), 1)
3834 IF (s <= 0.0_dp)
EXIT
3839 END SUBROUTINE dpofa
3871 SUBROUTINE dtrsl(t, ldt, n, b, job, info)
3872 INTEGER,
INTENT(in) :: ldt
3873 REAL(kind=
dp),
INTENT(in) :: t(ldt, *)
3874 INTEGER,
INTENT(in) :: n
3875 REAL(kind=
dp),
INTENT(inout) :: b(*)
3876 INTEGER,
INTENT(in) :: job
3877 INTEGER,
INTENT(out) :: info
3879 INTEGER :: case, j, jj
3880 REAL(kind=
dp) :: ddot, temp
3892 IF (t(info, info) == 0.0_dp)
RETURN
3899 IF (mod(job, 10) /= 0)
CASE = 2
3900 IF (mod(job, 100)/10 /= 0)
CASE =
CASE + 2
3911 CALL daxpy(n - j + 1, temp, t(j, j - 1), 1, b(j), 1)
3924 CALL daxpy(j, temp, t(1, j + 1), 1, b(1), 1)
3936 b(j) = b(j) - ddot(jj - 1, t(j + 1, j), 1, b(j + 1), 1)
3945 IF (.NOT. (n < 2))
THEN
3947 b(j) = b(j) - ddot(j - 1, t(1, j), 1, b(1), 1)
3952 cpabort(
"unexpected case")
3956 END SUBROUTINE dtrsl
3966 SUBROUTINE timer(ttime)
3967 REAL(kind=
dp) :: ttime
3988 END SUBROUTINE timer
4075 SUBROUTINE save_local(lsave,isave,dsave,x_projected,constrained,boxed,updatd,nintol,itfile,iback,nskip,head,col,itail,&
4076 iter, iupdat, nseg, nfgv, info, ifun, iword, nfree, nact, ileave, nenter, theta, fold, tol, dnorm, epsmch, cpu1, &
4077 cachyt, sbtime, lnscht, time1, gd, step_max, g_inf_norm, stp, gdold, dtd)
4078 LOGICAL,
INTENT(out) :: lsave(4)
4079 INTEGER,
INTENT(out) :: isave(23)
4080 REAL(kind=
dp),
INTENT(out) :: dsave(29)
4081 LOGICAL,
INTENT(in) :: x_projected, constrained, boxed, updatd
4082 INTEGER,
INTENT(in) :: nintol, itfile, iback, nskip, head, col, &
4083 itail, iter, iupdat, nseg, nfgv, info, &
4084 ifun, iword, nfree, nact, ileave, &
4086 REAL(kind=
dp),
INTENT(in) :: theta, fold, tol, dnorm, epsmch, cpu1, &
4087 cachyt, sbtime, lnscht, time1, gd, &
4088 step_max, g_inf_norm, stp, gdold, dtd
4090 lsave(1) = x_projected
4091 lsave(2) = constrained
4125 dsave(12) = step_max
4126 dsave(13) = g_inf_norm
4131 END SUBROUTINE save_local
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public byrd1995
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
LBFGS-B routine (version 3.0, April 25, 2011)
subroutine, public setulb(n, m, x, lower_bound, upper_bound, nbd, f, g, factr, pgtol, wa, iwa, task, iprint, csave, lsave, isave, dsave, trust_radius, spgr, iwunit)
This subroutine partitions the working arrays wa and iwa, and then uses the limited memory BFGS metho...
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public default_output_unit
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Space Group Symmetry Type Module (version 1.0, Ferbruary 12, 2021)
Space Group Symmetry Module (version 1.0, January 16, 2020)
subroutine, public spgr_apply_rotations_coord(spgr, coord)
routine applies the rotation matrices to the coordinates.
subroutine, public spgr_apply_rotations_force(spgr, force)
routine applies the rotation matrices to the forces.