From 779173c6af2a1c8afd3662164233a3c858984f7f Mon Sep 17 00:00:00 2001 From: Bartlomiej Zaborowski Date: Wed, 8 Aug 2012 14:11:06 +0200 Subject: [PATCH] Maximum likelihood parameters optimization program for CSA added without examples. --- bin/maxlik/maxlik-opt | Bin 0 -> 78650 bytes bin/maxlik/maxlik-opt-multprot | Bin 0 -> 87441 bytes bin/maxlik/maxlik-opt-tmscore | Bin 0 -> 78674 bytes examples/unres/CSA/E0LL2Y/global_1l2y_csa.e154922 | 448 --- examples/unres/CSA/E0LL2Y/global_1l2y_csa.o154922 | 135 - examples/unres/CSA/E0LL2Y/unres_Yihe.csh | 24 - source/maxlik/src_CSA/COMMON.CALC | 14 + source/maxlik/src_CSA/COMMON.CALC-single | 12 + source/maxlik/src_CSA/DIMENSIONS | 5 + source/maxlik/src_CSA/Makefile | 44 + source/maxlik/src_CSA/Makefile_tmscore | 38 + source/maxlik/src_CSA/cored.f | 3151 +++++++++++++++++++++ source/maxlik/src_CSA/log | 2 + source/maxlik/src_CSA/maxlik-opt-el.f | 319 +++ source/maxlik/src_CSA/maxlik-opt-multprot.f | 254 ++ source/maxlik/src_CSA/maxlik-opt-tmscore.f | 200 ++ source/maxlik/src_CSA/maxlik-opt.f | 198 ++ source/maxlik/src_CSA/minsumsl.f | 86 + source/maxlik/src_CSA/rmdd.f | 159 ++ source/maxlik/src_CSA/sumsld.f | 1446 ++++++++++ 20 files changed, 5928 insertions(+), 607 deletions(-) create mode 100755 bin/maxlik/maxlik-opt create mode 100755 bin/maxlik/maxlik-opt-multprot create mode 100755 bin/maxlik/maxlik-opt-tmscore delete mode 100644 examples/unres/CSA/E0LL2Y/global_1l2y_csa.e154922 delete mode 100644 examples/unres/CSA/E0LL2Y/global_1l2y_csa.o154922 delete mode 100755 examples/unres/CSA/E0LL2Y/unres_Yihe.csh create mode 100644 source/maxlik/src_CSA/COMMON.CALC create mode 100644 source/maxlik/src_CSA/COMMON.CALC-single create mode 100644 source/maxlik/src_CSA/DIMENSIONS create mode 100644 source/maxlik/src_CSA/Makefile create mode 100644 source/maxlik/src_CSA/Makefile_tmscore create mode 100644 source/maxlik/src_CSA/cored.f create mode 100644 source/maxlik/src_CSA/log create mode 100644 source/maxlik/src_CSA/maxlik-opt-el.f create mode 100644 source/maxlik/src_CSA/maxlik-opt-multprot.f create mode 100644 source/maxlik/src_CSA/maxlik-opt-tmscore.f create mode 100644 source/maxlik/src_CSA/maxlik-opt.f create mode 100644 source/maxlik/src_CSA/minsumsl.f create mode 100644 source/maxlik/src_CSA/rmdd.f create mode 100644 source/maxlik/src_CSA/sumsld.f diff --git a/bin/maxlik/maxlik-opt b/bin/maxlik/maxlik-opt new file mode 100755 index 0000000000000000000000000000000000000000..7abb720e5e81ede2122eeb5314cd6dafae71d9a9 GIT binary patch literal 78650 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 literal 0 HcmV?d00001 diff --git a/bin/maxlik/maxlik-opt-multprot b/bin/maxlik/maxlik-opt-multprot new file mode 100755 index 0000000000000000000000000000000000000000..dd8630171e19f75ead51c3ac8692c68c3edd4615 GIT binary patch literal 87441 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 PfaJ9l>bOFVTjKu%L>Z-c literal 0 HcmV?d00001 diff --git a/bin/maxlik/maxlik-opt-tmscore b/bin/maxlik/maxlik-opt-tmscore new file mode 100755 index 0000000000000000000000000000000000000000..32d850c7f148c1f9d909c05459532e8d48ec080e GIT binary patch literal 78674 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 literal 0 HcmV?d00001 diff --git a/examples/unres/CSA/E0LL2Y/global_1l2y_csa.e154922 b/examples/unres/CSA/E0LL2Y/global_1l2y_csa.e154922 deleted file mode 100644 index fc068d6..0000000 --- a/examples/unres/CSA/E0LL2Y/global_1l2y_csa.e154922 +++ /dev/null @@ -1,448 +0,0 @@ -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B95715D3B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B6A5092DB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002BA2C4B9FB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B5FDD47EB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AEE5CF4AB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B8534EBAB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AF8B32EDB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AD2C2441B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AE58141DB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B9C258B5B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002ADC824E2B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AC105C14B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B668F304B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B995D82FB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B5F0133BB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AB48C899B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B6E2E56CB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002AB2E43CEB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B484D187B44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003AAAE1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003AAAE1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003F81A1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003AAAE1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 00002B6A2A1ACB44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003F81A1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003401C1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003401C1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003F81A1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003AAAE1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003401C1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003F81A1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown -forrtl: severe (59): list-directed I/O syntax error, unit 28, file /users/bartek/UNRESPACK/unres/PARAM/bond_AM1.parm -Image PC Routine Line Source -unres_csa_ifort_m 000000000060B46D Unknown Unknown Unknown -unres_csa_ifort_m 0000000000609F75 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005ADC39 Unknown Unknown Unknown -unres_csa_ifort_m 00000000005645DD Unknown Unknown Unknown -unres_csa_ifort_m 0000000000563E2A Unknown Unknown Unknown -unres_csa_ifort_m 000000000058E7CE Unknown Unknown Unknown -unres_csa_ifort_m 0000000000423438 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000410AC3 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404F55 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404E9C Unknown Unknown Unknown -libc.so.6 0000003401C1DA44 Unknown Unknown Unknown -unres_csa_ifort_m 0000000000404D99 Unknown Unknown Unknown diff --git a/examples/unres/CSA/E0LL2Y/global_1l2y_csa.o154922 b/examples/unres/CSA/E0LL2Y/global_1l2y_csa.o154922 deleted file mode 100644 index 6c7d1f7..0000000 --- a/examples/unres/CSA/E0LL2Y/global_1l2y_csa.o154922 +++ /dev/null @@ -1,135 +0,0 @@ -Warning: no access to tty (Bad file descriptor). -Thus no job control in this shell. - Processor 0 out of 32 rank in CG_COMM 0 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 4 out of 32 rank in CG_COMM 4 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 10 out of 32 rank in CG_COMM 10 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 19 out of 32 rank in CG_COMM 19 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 9 out of 32 rank in CG_COMM 9 - Processor 31 out of 32 rank in CG_COMM 31 - Processor 1 out of 32 rank in CG_COMM 1 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 7 out of 32 rank in CG_COMM 7 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 2 out of 32 rank in CG_COMM 2 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 8 out of 32 rank in CG_COMM 8 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 5 out of 32 rank in CG_COMM 5 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 12 out of 32 rank in CG_COMM 12 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 16 out of 32 rank in CG_COMM 16 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 15 out of 32 rank in CG_COMM 15 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 17 out of 32 rank in CG_COMM 17 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 25 out of 32 rank in CG_COMM 25 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 - Processor 3 out of 32 rank in CG_COMM 3 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 18 out of 32 rank in CG_COMM 18 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 11 out of 32 rank in CG_COMM 11 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 6 out of 32 rank in CG_COMM 6 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 14 out of 32 rank in CG_COMM 14 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 29 out of 32 rank in CG_COMM 29 - Processor 13 out of 32 rank in CG_COMM 13 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 21 out of 32 rank in CG_COMM 21 - Processor 24 out of 32 rank in CG_COMM 24 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 - Processor 26 out of 32 rank in CG_COMM 26 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 28 out of 32 rank in CG_COMM 28 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 23 out of 32 rank in CG_COMM 23 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 22 out of 32 rank in CG_COMM 22 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 20 out of 32 rank in CG_COMM 20 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize Processor 30 out of 32 rank in CG_COMM 30 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 - Processor 27 out of 32 rank in CG_COMM 27 - size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initializeInside initialize size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initialize size of CG_COMM 32 size of FG_COMM 1 rank in FG_COMM1 - 0 size of FG_COMM1 1 -Inside initializeInside initializeInside initialize-------------------------------------- -Running PBS epilogue script - -Killing processes of user bartek on the batch nodes -Doing node m10 -Doing node m10 -Doing node m10 -Doing node m10 -Doing node m09 -Doing node m09 -Doing node m09 -Doing node m09 -Doing node m08 -Doing node m08 -Doing node m08 -Doing node m08 -Doing node m06 -Doing node m06 -Doing node m06 -Doing node m06 -Doing node m05 -Doing node m05 -Doing node m05 -Doing node m05 -Doing node m04 -Doing node m04 -Doing node m04 -Doing node m04 -Doing node m03 -Doing node m03 -Doing node m03 -Doing node m03 -Doing node m01 -Doing node m01 -Doing node m01 -Doing node m01 -Done. diff --git a/examples/unres/CSA/E0LL2Y/unres_Yihe.csh b/examples/unres/CSA/E0LL2Y/unres_Yihe.csh deleted file mode 100755 index 9a2e9dd..0000000 --- a/examples/unres/CSA/E0LL2Y/unres_Yihe.csh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/csh -f - -setenv FGPROCS 1 -setenv POT GB -setenv PREFIX 1tfi_csa -setenv OUT1FILE NO -#----------------------------------------------------------------------------- -setenv DD /users/kdm/adaml/UNRES/PARAM -setenv BONDPAR $DD/bond_AM1.parm -setenv THETPAR $DD/theta_abinitio.parm -setenv ROTPAR $DD/rotamers_AM1_aura.10022007.parm -setenv THETPARPDB $DD/thetaml.5parm -setenv ROTPARPDB $DD/scgauss.parm -setenv TORPAR $DD/torsion_631Gdp.parm -setenv TORDPAR $DD/torsion_double_631Gdp.parm -setenv ELEPAR $DD/electr_631Gdp.parm -setenv SIDEPAR $DD/scinter_${POT}.parm -setenv FOURIER $DD/fourier_opt.parm.1igd_hc_iter3_3 -setenv SCCORPAR $DD/rotcorr_AM1.parm -setenv SCPPAR $DD/scp.parm -setenv PATTERN $DD/patterns.cart -setenv PRINT_PARM NO -#----------------------------------------------------------------------------- -/users/kdm/czarek/UNRES/bin/unres_dfa_csa-Yi.exe diff --git a/source/maxlik/src_CSA/COMMON.CALC b/source/maxlik/src_CSA/COMMON.CALC new file mode 100644 index 0000000..8efc9da --- /dev/null +++ b/source/maxlik/src_CSA/COMMON.CALC @@ -0,0 +1,14 @@ + integer nene,nT,nconf(maxprot),iweight(maxene),mask(maxene), + & nprot + character*8 protname(maxprot) + double precision enetb(maxene,maxconf,maxprot), + & rmstab(maxconf,maxprot), + & qtab(maxconf,maxprot),rgytab(maxconf,maxprot),wsq, + & entfac(maxconf,maxprot),weight(maxene),sig0, + & temper(maxT),ft(2,maxT),sigma2,frac(maxT),heat(maxT), + & sumlik(maxT,maxprot),rmsave(maxT,maxprot) + double precision ener0(maxconf,maxprot),ener(maxconf,maxprot) + common/calc/enetb,sig0,rmstab,qtab,rgytab,entfac, + & ener0,ener,temper,weight,ft,sigma2,wsq,heat, + & rmsave,sumlik,iweight,mask,nT,nconf,nene,nprot + common /names/ protname diff --git a/source/maxlik/src_CSA/COMMON.CALC-single b/source/maxlik/src_CSA/COMMON.CALC-single new file mode 100644 index 0000000..34f3324 --- /dev/null +++ b/source/maxlik/src_CSA/COMMON.CALC-single @@ -0,0 +1,12 @@ + integer nene,nT,nconf,iweight(maxene),mask(maxene), + & maskel(3*nnbase) + double precision enetb(maxene,maxconf), + & rmstab(maxconf), + & qtab(maxconf),rgytab(maxcon),wsq, + & entfac(maxconf),weight(maxene), + & temper(maxT),ft(2,maxT),sigma2,frac(maxT),heat(maxT) + double precision ener0(maxconf),ener(maxconf) + common/calc/enetb,sig0,rmstab,qtab,rgytab,entfac, + & ener0,ener,temper,weight,weightel,ft,sigma2,wsq,fave,frac,heat, + & iweight,mask,maskel,nT,nconf,nene + diff --git a/source/maxlik/src_CSA/DIMENSIONS b/source/maxlik/src_CSA/DIMENSIONS new file mode 100644 index 0000000..5d7b19d --- /dev/null +++ b/source/maxlik/src_CSA/DIMENSIONS @@ -0,0 +1,5 @@ + integer maxconf,maxene,maxT,maxprot + parameter (maxconf=100000,maxene=30,maxT=20,maxprot=30) + integer nbase,nnbase + parameter (nbase=5,nnbase=nbase*(nbase+1)/2) + diff --git a/source/maxlik/src_CSA/Makefile b/source/maxlik/src_CSA/Makefile new file mode 100644 index 0000000..37a9ca6 --- /dev/null +++ b/source/maxlik/src_CSA/Makefile @@ -0,0 +1,44 @@ +BINDIR = ../bin + +FC = gfortran + +#OPT = -O6 +OPT = -g -fbounds-check +OPT1 = -O + +FFLAGS = -c ${OPT} -I. +FFLAGS1 = -c ${OPT1} -I. + +CPPFLAGS = -DLINUX + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F +.f.o: + ${FC} ${FFLAGS} $*.f +.c.o: + ${CC} -c ${CPPFLAGS} $*.c + +#maxlik-opt: maxlik-opt.o minsumsl.o sumsld.o cored.o rmdd.o + ${FC} -o ${BINDIR}/maxlik-opt maxlik-opt.o minsumsl.o sumsld.o cored.o rmdd.o + +maxlik-opt-multprot: maxlik-opt-multprot.o minsumsl.o sumsld.o cored.o rmdd.o + ${FC} -o ${BINDIR}/maxlik-opt-multprot maxlik-opt-multprot.o minsumsl.o sumsld.o cored.o rmdd.o + +maxlik-opt-tmscore: maxlik-opt-tmscore.o minsumsl.o sumsld.o cored.o rmdd.o + ${FC} -o ${BINDIR}/maxlik-opt-tmscore maxlik-opt-tmscore.o minsumsl.o sumsld.o cored.o rmdd.o + +minsumsl.o: minsumsl.f + ${FC} ${FFLAGS1} minsumsl.f + +cored.o: cored.f + ${FC} ${FFLAGS1} cored.f + +rmdd.o: rmdd.f + ${FC} ${FFLAGS1} rmdd.f + +sumsld.o: sumsld.f + ${FC} ${FFLAGS1} sumsld.f + +clean: + /bin/rm -f *.o diff --git a/source/maxlik/src_CSA/Makefile_tmscore b/source/maxlik/src_CSA/Makefile_tmscore new file mode 100644 index 0000000..08b804f --- /dev/null +++ b/source/maxlik/src_CSA/Makefile_tmscore @@ -0,0 +1,38 @@ +BINDIR = ../bin + +FC = gfortran + +#OPT = -O6 +OPT = -g -fbounds-check +OPT1 = -O + +FFLAGS = -c ${OPT} -I. +FFLAGS1 = -c ${OPT1} -I. + +CPPFLAGS = -DLINUX + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F +.f.o: + ${FC} ${FFLAGS} $*.f +.c.o: + ${CC} -c ${CPPFLAGS} $*.c + +maxlik-opt: maxlik-opt.o minsumsl.o sumsld.o cored.o rmdd.o + ${FC} -o ${BINDIR}/maxlik-opt maxlik-opt.o minsumsl.o sumsld.o cored.o rmdd.o + +minsumsl.o: minsumsl.f + ${FC} ${FFLAGS1} minsumsl.f + +cored.o: cored.f + ${FC} ${FFLAGS1} cored.f + +rmdd.o: rmdd.f + ${FC} ${FFLAGS1} rmdd.f + +sumsld.o: sumsld.f + ${FC} ${FFLAGS1} sumsld.f + +clean: + /bin/rm -f *.o diff --git a/source/maxlik/src_CSA/cored.f b/source/maxlik/src_CSA/cored.f new file mode 100644 index 0000000..1cf25e5 --- /dev/null +++ b/source/maxlik/src_CSA/cored.f @@ -0,0 +1,3151 @@ + subroutine assst(iv, liv, lv, v) +c +c *** assess candidate step (***sol version 2.3) *** +c + integer liv, l + integer iv(liv) + double precision v(lv) +c +c *** purpose *** +c +c this subroutine is called by an unconstrained minimization +c routine to assess the next candidate step. it may recommend one +c of several courses of action, such as accepting the step, recom- +c puting it using the same or a new quadratic model, or halting due +c to convergence or false convergence. see the return code listing +c below. +c +c-------------------------- parameter usage -------------------------- +c +c iv (i/o) integer parameter and scratch vector -- see description +c below of iv values referenced. +c liv (in) length of iv array. +c lv (in) length of v array. +c v (i/o) real parameter and scratch vector -- see description +c below of v values referenced. +c +c *** iv values referenced *** +c +c iv(irc) (i/o) on input for the first step tried in a new iteration, +c iv(irc) should be set to 3 or 4 (the value to which it is +c set when step is definitely to be accepted). on input +c after step has been recomputed, iv(irc) should be +c unchanged since the previous return of assst. +c on output, iv(irc) is a return code having one of the +c following values... +c 1 = switch models or try smaller step. +c 2 = switch models or accept step. +c 3 = accept step and determine v(radfac) by gradient +c tests. +c 4 = accept step, v(radfac) has been determined. +c 5 = recompute step (using the same model). +c 6 = recompute step with radius = v(lmaxs) but do not +c evaulate the objective function. +c 7 = x-convergence (see v(xctol)). +c 8 = relative function convergence (see v(rfctol)). +c 9 = both x- and relative function convergence. +c 10 = absolute function convergence (see v(afctol)). +c 11 = singular convergence (see v(lmaxs)). +c 12 = false convergence (see v(xftol)). +c 13 = iv(irc) was out of range on input. +c return code i has precdence over i+1 for i = 9, 10, 11. +c iv(mlstgd) (i/o) saved value of iv(model). +c iv(model) (i/o) on input, iv(model) should be an integer identifying +c the current quadratic model of the objective function. +c if a previous step yielded a better function reduction, +c then iv(model) will be set to iv(mlstgd) on output. +c iv(nfcall) (in) invocation count for the objective function. +c iv(nfgcal) (i/o) value of iv(nfcall) at step that gave the biggest +c function reduction this iteration. iv(nfgcal) remains +c unchanged until a function reduction is obtained. +c iv(radinc) (i/o) the number of radius increases (or minus the number +c of decreases) so far this iteration. +c iv(restor) (out) set to 1 if v(f) has been restored and x should be +c restored to its initial value, to 2 if x should be saved, +c to 3 if x should be restored from the saved value, and to +c 0 otherwise. +c iv(stage) (i/o) count of the number of models tried so far in the +c current iteration. +c iv(stglim) (in) maximum number of models to consider. +c iv(switch) (out) set to 0 unless a new model is being tried and it +c gives a smaller function value than the previous model, +c in which case assst sets iv(switch) = 1. +c iv(toobig) (in) is nonzero if step was too big (e.g. if it caused +c overflow). +c iv(xirc) (i/o) value that iv(irc) would have in the absence of +c convergence, false convergence, and oversized steps. +c +c *** v values referenced *** +c +c v(afctol) (in) absolute function convergence tolerance. if the +c absolute value of the current function value v(f) is less +c than v(afctol), then assst returns with iv(irc) = 10. +c v(decfac) (in) factor by which to decrease radius when iv(toobig) is +c nonzero. +c v(dstnrm) (in) the 2-norm of d*step. +c v(dstsav) (i/o) value of v(dstnrm) on saved step. +c v(dst0) (in) the 2-norm of d times the newton step (when defined, +c i.e., for v(nreduc) .ge. 0). +c v(f) (i/o) on both input and output, v(f) is the objective func- +c tion value at x. if x is restored to a previous value, +c then v(f) is restored to the corresponding value. +c v(fdif) (out) the function reduction v(f0) - v(f) (for the output +c value of v(f) if an earlier step gave a bigger function +c decrease, and for the input value of v(f) otherwise). +c v(flstgd) (i/o) saved value of v(f). +c v(f0) (in) objective function value at start of iteration. +c v(gtslst) (i/o) value of v(gtstep) on saved step. +c v(gtstep) (in) inner product between step and gradient. +c v(incfac) (in) minimum factor by which to increase radius. +c v(lmaxs) (in) maximum reasonable step size (and initial step bound). +c if the actual function decrease is no more than twice +c what was predicted, if a return with iv(irc) = 7, 8, 9, +c or 10 does not occur, if v(dstnrm) .gt. v(lmaxs), and if +c v(preduc) .le. v(sctol) * abs(v(f0)), then assst re- +c turns with iv(irc) = 11. if so doing appears worthwhile, +c then assst repeats this test with v(preduc) computed for +c a step of length v(lmaxs) (by a return with iv(irc) = 6). +c v(nreduc) (i/o) function reduction predicted by quadratic model for +c newton step. if assst is called with iv(irc) = 6, i.e., +c if v(preduc) has been computed with radius = v(lmaxs) for +c use in the singular convervence test, then v(nreduc) is +c set to -v(preduc) before the latter is restored. +c v(plstgd) (i/o) value of v(preduc) on saved step. +c v(preduc) (i/o) function reduction predicted by quadratic model for +c current step. +c v(radfac) (out) factor to be used in determining the new radius, +c which should be v(radfac)*dst, where dst is either the +c output value of v(dstnrm) or the 2-norm of +c diag(newd)*step for the output value of step and the +c updated version, newd, of the scale vector d. for +c iv(irc) = 3, v(radfac) = 1.0 is returned. +c v(rdfcmn) (in) minimum value for v(radfac) in terms of the input +c value of v(dstnrm) -- suggested value = 0.1. +c v(rdfcmx) (in) maximum value for v(radfac) -- suggested value = 4.0. +c v(reldx) (in) scaled relative change in x caused by step, computed +c (e.g.) by function reldst as +c max (d(i)*abs(x(i)-x0(i)), 1 .le. i .le. p) / +c max (d(i)*(abs(x(i))+abs(x0(i))), 1 .le. i .le. p). +c v(rfctol) (in) relative function convergence tolerance. if the +c actual function reduction is at most twice what was pre- +c dicted and v(nreduc) .le. v(rfctol)*abs(v(f0)), then +c assst returns with iv(irc) = 8 or 9. +c v(stppar) (in) marquardt parameter -- 0 means full newton step. +c v(tuner1) (in) tuning constant used to decide if the function +c reduction was much less than expected. suggested +c value = 0.1. +c v(tuner2) (in) tuning constant used to decide if the function +c reduction was large enough to accept step. suggested +c value = 10**-4. +c v(tuner3) (in) tuning constant used to decide if the radius +c should be increased. suggested value = 0.75. +c v(xctol) (in) x-convergence criterion. if step is a newton step +c (v(stppar) = 0) having v(reldx) .le. v(xctol) and giving +c at most twice the predicted function decrease, then +c assst returns iv(irc) = 7 or 9. +c v(xftol) (in) false convergence tolerance. if step gave no or only +c a small function decrease and v(reldx) .le. v(xftol), +c then assst returns with iv(irc) = 12. +c +c------------------------------- notes ------------------------------- +c +c *** application and usage restrictions *** +c +c this routine is called as part of the nl2sol (nonlinear +c least-squares) package. it may be used in any unconstrained +c minimization solver that uses dogleg, goldfeld-quandt-trotter, +c or levenberg-marquardt steps. +c +c *** algorithm notes *** +c +c see (1) for further discussion of the assessing and model +c switching strategies. while nl2sol considers only two models, +c assst is designed to handle any number of models. +c +c *** usage notes *** +c +c on the first call of an iteration, only the i/o variables +c step, x, iv(irc), iv(model), v(f), v(dstnrm), v(gtstep), and +c v(preduc) need have been initialized. between calls, no i/o +c values execpt step, x, iv(model), v(f) and the stopping toler- +c ances should be changed. +c after a return for convergence or false convergence, one can +c change the stopping tolerances and call assst again, in which +c case the stopping tests will be repeated. +c +c *** references *** +c +c (1) dennis, j.e., jr., gay, d.m., and welsch, r.e. (1981), +c an adaptive nonlinear least-squares algorithm, +c acm trans. math. software, vol. 7, no. 3. +c +c (2) powell, m.j.d. (1970) a fortran subroutine for solving +c systems of nonlinear algebraic equations, in numerical +c methods for nonlinear algebraic equations, edited by +c p. rabinowitz, gordon and breach, london. +c +c *** history *** +c +c john dennis designed much of this routine, starting with +c ideas in (2). roy welsch suggested the model switching strategy. +c david gay and stephen peters cast this subroutine into a more +c portable form (winter 1977), and david gay cast it into its +c present form (fall 1978). +c +c *** general *** +c +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** no external functions and subroutines *** +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1 +c/ +c *** no common blocks *** +c +c-------------------------- local variables -------------------------- +c + logical goodx + integer i, nfc + double precision emax, emaxs, gts, rfac1, xmax + double precision half, one, onep2, two, zero +c +c *** subscripts for iv and v *** +c + integer afctol, decfac, dstnrm, dstsav, dst0, f, fdif, flstgd, f0, + 1 gtslst, gtstep, incfac, irc, lmaxs, mlstgd, model, nfcall, + 2 nfgcal, nreduc, plstgd, preduc, radfac, radinc, rdfcmn, + 3 rdfcmx, reldx, restor, rfctol, sctol, stage, stglim, + 4 stppar, switch, toobig, tuner1, tuner2, tuner3, xctol, + 5 xftol, xirc +c +c *** data initializations *** +c +c/6 +c data half/0.5d+0/, one/1.d+0/, onep2/1.2d+0/, two/2.d+0/, +c 1 zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, onep2=1.2d+0, two=2.d+0, + 1 zero=0.d+0) +c/ +c +c/6 +c data irc/29/, mlstgd/32/, model/5/, nfcall/6/, nfgcal/7/, +c 1 radinc/8/, restor/9/, stage/10/, stglim/11/, switch/12/, +c 2 toobig/2/, xirc/13/ +c/7 + parameter (irc=29, mlstgd=32, model=5, nfcall=6, nfgcal=7, + 1 radinc=8, restor=9, stage=10, stglim=11, switch=12, + 2 toobig=2, xirc=13) +c/ +c/6 +c data afctol/31/, decfac/22/, dstnrm/2/, dst0/3/, dstsav/18/, +c 1 f/10/, fdif/11/, flstgd/12/, f0/13/, gtslst/14/, gtstep/4/, +c 2 incfac/23/, lmaxs/36/, nreduc/6/, plstgd/15/, preduc/7/, +c 3 radfac/16/, rdfcmn/24/, rdfcmx/25/, reldx/17/, rfctol/32/, +c 4 sctol/37/, stppar/5/, tuner1/26/, tuner2/27/, tuner3/28/, +c 5 xctol/33/, xftol/34/ +c/7 + parameter (afctol=31, decfac=22, dstnrm=2, dst0=3, dstsav=18, + 1 f=10, fdif=11, flstgd=12, f0=13, gtslst=14, gtstep=4, + 2 incfac=23, lmaxs=36, nreduc=6, plstgd=15, preduc=7, + 3 radfac=16, rdfcmn=24, rdfcmx=25, reldx=17, rfctol=32, + 4 sctol=37, stppar=5, tuner1=26, tuner2=27, tuner3=28, + 5 xctol=33, xftol=34) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nfc = iv(nfcall) + iv(switch) = 0 + iv(restor) = 0 + rfac1 = one + goodx = .true. + i = iv(irc) + if (i .ge. 1 .and. i .le. 12) + 1 go to (20,30,10,10,40,280,220,220,220,220,220,170), i + iv(irc) = 13 + go to 999 +c +c *** initialize for new iteration *** +c + 10 iv(stage) = 1 + iv(radinc) = 0 + v(flstgd) = v(f0) + if (iv(toobig) .eq. 0) go to 110 + iv(stage) = -1 + iv(xirc) = i + go to 60 +c +c *** step was recomputed with new model or smaller radius *** +c *** first decide which *** +c + 20 if (iv(model) .ne. iv(mlstgd)) go to 30 +c *** old model retained, smaller radius tried *** +c *** do not consider any more new models this iteration *** + iv(stage) = iv(stglim) + iv(radinc) = -1 + go to 110 +c +c *** a new model is being tried. decide whether to keep it. *** +c + 30 iv(stage) = iv(stage) + 1 +c +c *** now we add the possibiltiy that step was recomputed with *** +c *** the same model, perhaps because of an oversized step. *** +c + 40 if (iv(stage) .gt. 0) go to 50 +c +c *** step was recomputed because it was too big. *** +c + if (iv(toobig) .ne. 0) go to 60 +c +c *** restore iv(stage) and pick up where we left off. *** +c + iv(stage) = -iv(stage) + i = iv(xirc) + go to (20, 30, 110, 110, 70), i +c + 50 if (iv(toobig) .eq. 0) go to 70 +c +c *** handle oversize step *** +c + if (iv(radinc) .gt. 0) go to 80 + iv(stage) = -iv(stage) + iv(xirc) = iv(irc) +c + 60 v(radfac) = v(decfac) + iv(radinc) = iv(radinc) - 1 + iv(irc) = 5 + iv(restor) = 1 + go to 999 +c + 70 if (v(f) .lt. v(flstgd)) go to 110 +c +c *** the new step is a loser. restore old model. *** +c + if (iv(model) .eq. iv(mlstgd)) go to 80 + iv(model) = iv(mlstgd) + iv(switch) = 1 +c +c *** restore step, etc. only if a previous step decreased v(f). +c + 80 if (v(flstgd) .ge. v(f0)) go to 110 + iv(restor) = 1 + v(f) = v(flstgd) + v(preduc) = v(plstgd) + v(gtstep) = v(gtslst) + if (iv(switch) .eq. 0) rfac1 = v(dstnrm) / v(dstsav) + v(dstnrm) = v(dstsav) + nfc = iv(nfgcal) + goodx = .false. +c + 110 v(fdif) = v(f0) - v(f) + if (v(fdif) .gt. v(tuner2) * v(preduc)) go to 140 + if(iv(radinc).gt.0) go to 140 +c +c *** no (or only a trivial) function decrease +c *** -- so try new model or smaller radius +c + if (v(f) .lt. v(f0)) go to 120 + iv(mlstgd) = iv(model) + v(flstgd) = v(f) + v(f) = v(f0) + iv(restor) = 1 + go to 130 + 120 iv(nfgcal) = nfc + 130 iv(irc) = 1 + if (iv(stage) .lt. iv(stglim)) go to 160 + iv(irc) = 5 + iv(radinc) = iv(radinc) - 1 + go to 160 +c +c *** nontrivial function decrease achieved *** +c + 140 iv(nfgcal) = nfc + rfac1 = one + v(dstsav) = v(dstnrm) + if (v(fdif) .gt. v(preduc)*v(tuner1)) go to 190 +c +c *** decrease was much less than predicted -- either change models +c *** or accept step with decreased radius. +c + if (iv(stage) .ge. iv(stglim)) go to 150 +c *** consider switching models *** + iv(irc) = 2 + go to 160 +c +c *** accept step with decreased radius *** +c + 150 iv(irc) = 4 +c +c *** set v(radfac) to fletcher*s decrease factor *** +c + 160 iv(xirc) = iv(irc) + emax = v(gtstep) + v(fdif) + v(radfac) = half * rfac1 + if (emax .lt. v(gtstep)) v(radfac) = rfac1 * dmax1(v(rdfcmn), + 1 half * v(gtstep)/emax) +c +c *** do false convergence test *** +c + 170 if (v(reldx) .le. v(xftol)) go to 180 + iv(irc) = iv(xirc) + if (v(f) .lt. v(f0)) go to 200 + go to 230 +c + 180 iv(irc) = 12 + go to 240 +c +c *** handle good function decrease *** +c + 190 if (v(fdif) .lt. (-v(tuner3) * v(gtstep))) go to 210 +c +c *** increasing radius looks worthwhile. see if we just +c *** recomputed step with a decreased radius or restored step +c *** after recomputing it with a larger radius. +c + if (iv(radinc) .lt. 0) go to 210 + if (iv(restor) .eq. 1) go to 210 +c +c *** we did not. try a longer step unless this was a newton +c *** step. +c + v(radfac) = v(rdfcmx) + gts = v(gtstep) + if (v(fdif) .lt. (half/v(radfac) - one) * gts) + 1 v(radfac) = dmax1(v(incfac), half*gts/(gts + v(fdif))) + iv(irc) = 4 + if (v(stppar) .eq. zero) go to 230 + if (v(dst0) .ge. zero .and. (v(dst0) .lt. two*v(dstnrm) + 1 .or. v(nreduc) .lt. onep2*v(fdif))) go to 230 +c *** step was not a newton step. recompute it with +c *** a larger radius. + iv(irc) = 5 + iv(radinc) = iv(radinc) + 1 +c +c *** save values corresponding to good step *** +c + 200 v(flstgd) = v(f) + iv(mlstgd) = iv(model) + if (iv(restor) .ne. 1) iv(restor) = 2 + v(dstsav) = v(dstnrm) + iv(nfgcal) = nfc + v(plstgd) = v(preduc) + v(gtslst) = v(gtstep) + go to 230 +c +c *** accept step with radius unchanged *** +c + 210 v(radfac) = one + iv(irc) = 3 + go to 230 +c +c *** come here for a restart after convergence *** +c + 220 iv(irc) = iv(xirc) + if (v(dstsav) .ge. zero) go to 240 + iv(irc) = 12 + go to 240 +c +c *** perform convergence tests *** +c + 230 iv(xirc) = iv(irc) + 240 if (iv(restor) .eq. 1 .and. v(flstgd) .lt. v(f0)) iv(restor) = 3 + if (half * v(fdif) .gt. v(preduc)) go to 999 + emax = v(rfctol) * dabs(v(f0)) + emaxs = v(sctol) * dabs(v(f0)) + if (v(dstnrm) .gt. v(lmaxs) .and. v(preduc) .le. emaxs) + 1 iv(irc) = 11 + if (v(dst0) .lt. zero) go to 250 + i = 0 + if ((v(nreduc) .gt. zero .and. v(nreduc) .le. emax) .or. + 1 (v(nreduc) .eq. zero. and. v(preduc) .eq. zero)) i = 2 + if (v(stppar) .eq. zero .and. v(reldx) .le. v(xctol) + 1 .and. goodx) i = i + 1 + if (i .gt. 0) iv(irc) = i + 6 +c +c *** consider recomputing step of length v(lmaxs) for singular +c *** convergence test. +c + 250 if (iv(irc) .gt. 5 .and. iv(irc) .ne. 12) go to 999 + if (v(dstnrm) .gt. v(lmaxs)) go to 260 + if (v(preduc) .ge. emaxs) go to 999 + if (v(dst0) .le. zero) go to 270 + if (half * v(dst0) .le. v(lmaxs)) go to 999 + go to 270 + 260 if (half * v(dstnrm) .le. v(lmaxs)) go to 999 + xmax = v(lmaxs) / v(dstnrm) + if (xmax * (two - xmax) * v(preduc) .ge. emaxs) go to 999 + 270 if (v(nreduc) .lt. zero) go to 290 +c +c *** recompute v(preduc) for use in singular convergence test *** +c + v(gtslst) = v(gtstep) + v(dstsav) = v(dstnrm) + if (iv(irc) .eq. 12) v(dstsav) = -v(dstsav) + v(plstgd) = v(preduc) + i = iv(restor) + iv(restor) = 2 + if (i .eq. 3) iv(restor) = 0 + iv(irc) = 6 + go to 999 +c +c *** perform singular convergence test with recomputed v(preduc) *** +c + 280 v(gtstep) = v(gtslst) + v(dstnrm) = dabs(v(dstsav)) + iv(irc) = iv(xirc) + if (v(dstsav) .le. zero) iv(irc) = 12 + v(nreduc) = -v(preduc) + v(preduc) = v(plstgd) + iv(restor) = 3 + 290 if (-v(nreduc) .le. v(sctol) * dabs(v(f0))) iv(irc) = 11 +c + 999 return +c +c *** last card of assst follows *** + end + subroutine deflt(alg, iv, liv, lv, v) +c +c *** supply ***sol (version 2.3) default values to iv and v *** +c +c *** alg = 1 means regression constants. +c *** alg = 2 means general unconstrained optimization constants. +c + integer liv, l + integer alg, iv(liv) + double precision v(lv) +c + external imdcon, vdflt + integer imdcon +c imdcon... returns machine-dependent integer constants. +c vdflt.... provides default values to v. +c + integer miv, m + integer miniv(2), minv(2) +c +c *** subscripts for iv *** +c + integer algsav, covprt, covreq, dtype, hc, ierr, inith, inits, + 1 ipivot, ivneed, lastiv, lastv, lmat, mxfcal, mxiter, + 2 nfcov, ngcov, nvdflt, outlev, parprt, parsav, perm, + 3 prunit, qrtyp, rdreq, rmat, solprt, statpr, vneed, + 4 vsave, x0prt +c +c *** iv subscript values *** +c +c/6 +c data algsav/51/, covprt/14/, covreq/15/, dtype/16/, hc/71/, +c 1 ierr/75/, inith/25/, inits/25/, ipivot/76/, ivneed/3/, +c 2 lastiv/44/, lastv/45/, lmat/42/, mxfcal/17/, mxiter/18/, +c 3 nfcov/52/, ngcov/53/, nvdflt/50/, outlev/19/, parprt/20/, +c 4 parsav/49/, perm/58/, prunit/21/, qrtyp/80/, rdreq/57/, +c 5 rmat/78/, solprt/22/, statpr/23/, vneed/4/, vsave/60/, +c 6 x0prt/24/ +c/7 + parameter (algsav=51, covprt=14, covreq=15, dtype=16, hc=71, + 1 ierr=75, inith=25, inits=25, ipivot=76, ivneed=3, + 2 lastiv=44, lastv=45, lmat=42, mxfcal=17, mxiter=18, + 3 nfcov=52, ngcov=53, nvdflt=50, outlev=19, parprt=20, + 4 parsav=49, perm=58, prunit=21, qrtyp=80, rdreq=57, + 5 rmat=78, solprt=22, statpr=23, vneed=4, vsave=60, + 6 x0prt=24) +c/ + data miniv(1)/80/, miniv(2)/59/, minv(1)/98/, minv(2)/71/ +c +c------------------------------- body -------------------------------- +c + if (alg .lt. 1 .or. alg .gt. 2) go to 40 + miv = miniv(alg) + if (liv .lt. miv) go to 20 + mv = minv(alg) + if (lv .lt. mv) go to 30 + call vdflt(alg, lv, v) + iv(1) = 12 + iv(algsav) = alg + iv(ivneed) = 0 + iv(lastiv) = miv + iv(lastv) = mv + iv(lmat) = mv + 1 + iv(mxfcal) = 200 + iv(mxiter) = 150 + iv(outlev) = 1 + iv(parprt) = 1 + iv(perm) = miv + 1 + iv(prunit) = imdcon(1) + iv(solprt) = 1 + iv(statpr) = 1 + iv(vneed) = 0 + iv(x0prt) = 1 +c + if (alg .ge. 2) go to 10 +c +c *** regression values +c + iv(covprt) = 3 + iv(covreq) = 1 + iv(dtype) = 1 + iv(hc) = 0 + iv(ierr) = 0 + iv(inits) = 0 + iv(ipivot) = 0 + iv(nvdflt) = 32 + iv(parsav) = 67 + iv(qrtyp) = 1 + iv(rdreq) = 3 + iv(rmat) = 0 + iv(vsave) = 58 + go to 999 +c +c *** general optimization values +c + 10 iv(dtype) = 0 + iv(inith) = 1 + iv(nfcov) = 0 + iv(ngcov) = 0 + iv(nvdflt) = 25 + iv(parsav) = 47 + go to 999 +c + 20 iv(1) = 15 + go to 999 +c + 30 iv(1) = 16 + go to 999 +c + 40 iv(1) = 67 +c + 999 return +c *** last card of deflt follows *** + end + double precision function dotprd(p, x, y) +c +c *** return the inner product of the p-vectors x and y. *** +c + integer p + double precision x(p), y(p) +c + integer i + double precision one, sqteta, t, zero +c/+ + double precision dmax1, dabs +c/ + external rmdcon + double precision rmdcon +c +c *** rmdcon(2) returns a machine-dependent constant, sqteta, which +c *** is slightly larger than the smallest positive number that +c *** can be squared without underflowing. +c +c/6 +c data one/1.d+0/, sqteta/0.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) + data sqteta/0.d+0/ +c/ +c + dotprd = zero + if (p .le. 0) go to 999 +crc if (sqteta .eq. zero) sqteta = rmdcon(2) + do 20 i = 1, p +crc t = dmax1(dabs(x(i)), dabs(y(i))) +crc if (t .gt. one) go to 10 +crc if (t .lt. sqteta) go to 20 +crc t = (x(i)/sqteta)*y(i) +crc if (dabs(t) .lt. sqteta) go to 20 + 10 dotprd = dotprd + x(i)*y(i) + 20 continue +c + 999 return +c *** last card of dotprd follows *** + end + subroutine itsum(d, g, iv, liv, lv, p, v, x) +c +c *** print iteration summary for ***sol (version 2.3) *** +c +c *** parameter declarations *** +c + integer liv, lv, p + integer iv(liv) + double precision d(p), g(p), v(lv), x(p) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer alg, i, iv1, m, nf, ng, ol, pu +c/6 +c real model1(6), model2(6) +c/7 + character*4 model1(6), model2(6) +c/ + double precision nreldf, oldf, preldf, reldf, zero +c +c *** intrinsic functions *** +c/+ + integer iabs + double precision dabs, dmax1 +c/ +c *** no external functions or subroutines *** +c +c *** subscripts for iv and v *** +c + integer algsav, dstnrm, f, fdif, f0, needhd, nfcall, nfcov, ngcov, + 1 ngcall, niter, nreduc, outlev, preduc, prntit, prunit, + 2 reldx, solprt, statpr, stppar, sused, x0prt +c +c *** iv subscript values *** +c +c/6 +c data algsav/51/, needhd/36/, nfcall/6/, nfcov/52/, ngcall/30/, +c 1 ngcov/53/, niter/31/, outlev/19/, prntit/39/, prunit/21/, +c 2 solprt/22/, statpr/23/, sused/64/, x0prt/24/ +c/7 + parameter (algsav=51, needhd=36, nfcall=6, nfcov=52, ngcall=30, + 1 ngcov=53, niter=31, outlev=19, prntit=39, prunit=21, + 2 solprt=22, statpr=23, sused=64, x0prt=24) +c/ +c +c *** v subscript values *** +c +c/6 +c data dstnrm/2/, f/10/, f0/13/, fdif/11/, nreduc/6/, preduc/7/, +c 1 reldx/17/, stppar/5/ +c/7 + parameter (dstnrm=2, f=10, f0=13, fdif=11, nreduc=6, preduc=7, + 1 reldx=17, stppar=5) +c/ +c +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c/6 +c data model1(1)/4h /, model1(2)/4h /, model1(3)/4h /, +c 1 model1(4)/4h /, model1(5)/4h g /, model1(6)/4h s /, +c 2 model2(1)/4h g /, model2(2)/4h s /, model2(3)/4hg-s /, +c 3 model2(4)/4hs-g /, model2(5)/4h-s-g/, model2(6)/4h-g-s/ +c/7 + data model1/' ',' ',' ',' ',' g ',' s '/, + 1 model2/' g ',' s ','g-s ','s-g ','-s-g','-g-s'/ +c/ +c +c------------------------------- body -------------------------------- +c + pu = iv(prunit) + if (pu .eq. 0) go to 999 + iv1 = iv(1) + if (iv1 .gt. 62) iv1 = iv1 - 51 + ol = iv(outlev) + alg = iv(algsav) + if (iv1 .lt. 2 .or. iv1 .gt. 15) go to 370 + if (iv1 .ge. 12) go to 120 + if (iv1 .eq. 2 .and. iv(niter) .eq. 0) go to 390 + if (ol .eq. 0) go to 120 + if (iv1 .ge. 10 .and. iv(prntit) .eq. 0) go to 120 + if (iv1 .gt. 2) go to 10 + iv(prntit) = iv(prntit) + 1 + if (iv(prntit) .lt. iabs(ol)) go to 999 + 10 nf = iv(nfcall) - iabs(iv(nfcov)) + iv(prntit) = 0 + reldf = zero + preldf = zero + oldf = dmax1(dabs(v(f0)), dabs(v(f))) + if (oldf .le. zero) go to 20 + reldf = v(fdif) / oldf + preldf = v(preduc) / oldf + 20 if (ol .gt. 0) go to 60 +c +c *** print short summary line *** +c + if (iv(needhd) .eq. 1 .and. alg .eq. 1) write(pu,30) + 30 format(/10h it nf,6x,1hf,7x,5hreldf,3x,6hpreldf,3x,5hreldx, + 1 2x,13hmodel stppar) + if (iv(needhd) .eq. 1 .and. alg .eq. 2) write(pu,40) + 40 format(/11h it nf,7x,1hf,8x,5hreldf,4x,6hpreldf,4x,5hreldx, + 1 3x,6hstppar) + iv(needhd) = 0 + if (alg .eq. 2) go to 50 + m = iv(sused) + write(pu,100) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 model1(m), model2(m), v(stppar) + go to 120 +c + 50 write(pu,110) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 v(stppar) + go to 120 +c +c *** print long summary line *** +c + 60 if (iv(needhd) .eq. 1 .and. alg .eq. 1) write(pu,70) + 70 format(/11h it nf,6x,1hf,7x,5hreldf,3x,6hpreldf,3x,5hreldx, + 1 2x,13hmodel stppar,2x,6hd*step,2x,7hnpreldf) + if (iv(needhd) .eq. 1 .and. alg .eq. 2) write(pu,80) + 80 format(/11h it nf,7x,1hf,8x,5hreldf,4x,6hpreldf,4x,5hreldx, + 1 3x,6hstppar,3x,6hd*step,3x,7hnpreldf) + iv(needhd) = 0 + nreldf = zero + if (oldf .gt. zero) nreldf = v(nreduc) / oldf + if (alg .eq. 2) go to 90 + m = iv(sused) + write(pu,100) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 model1(m), model2(m), v(stppar), v(dstnrm), nreldf + go to 120 +c + 90 write(pu,110) iv(niter), nf, v(f), reldf, preldf, + 1 v(reldx), v(stppar), v(dstnrm), nreldf + 100 format(i6,i5,d10.3,2d9.2,d8.1,a3,a4,2d8.1,d9.2) + 110 format(i6,i5,d11.3,2d10.2,3d9.1,d10.2) +c + 120 if (iv(statpr) .lt. 0) go to 430 + go to (999, 999, 130, 150, 170, 190, 210, 230, 250, 270, 290, 310, + 1 330, 350, 520), iv1 +c + 130 write(pu,140) + 140 format(/26h ***** x-convergence *****) + go to 430 +c + 150 write(pu,160) + 160 format(/42h ***** relative function convergence *****) + go to 430 +c + 170 write(pu,180) + 180 format(/49h ***** x- and relative function convergence *****) + go to 430 +c + 190 write(pu,200) + 200 format(/42h ***** absolute function convergence *****) + go to 430 +c + 210 write(pu,220) + 220 format(/33h ***** singular convergence *****) + go to 430 +c + 230 write(pu,240) + 240 format(/30h ***** false convergence *****) + go to 430 +c + 250 write(pu,260) + 260 format(/38h ***** function evaluation limit *****) + go to 430 +c + 270 write(pu,280) + 280 format(/28h ***** iteration limit *****) + go to 430 +c + 290 write(pu,300) + 300 format(/18h ***** stopx *****) + go to 430 +c + 310 write(pu,320) + 320 format(/44h ***** initial f(x) cannot be computed *****) +c + go to 390 +c + 330 write(pu,340) + 340 format(/37h ***** bad parameters to assess *****) + go to 999 +c + 350 write(pu,360) + 360 format(/43h ***** gradient could not be computed *****) + if (iv(niter) .gt. 0) go to 480 + go to 390 +c + 370 write(pu,380) iv(1) + 380 format(/14h ***** iv(1) =,i5,6h *****) + go to 999 +c +c *** initial call on itsum *** +c + 390 if (iv(x0prt) .ne. 0) write(pu,400) (i, x(i), d(i), i = 1, p) + 400 format(/23h i initial x(i),8x,4hd(i)//(1x,i5,d17.6,d14.3)) +c *** the following are to avoid undefined variables when the +c *** function evaluation limit is 1... + v(dstnrm) = zero + v(fdif) = zero + v(nreduc) = zero + v(preduc) = zero + v(reldx) = zero + if (iv1 .ge. 12) go to 999 + iv(needhd) = 0 + iv(prntit) = 0 + if (ol .eq. 0) go to 999 + if (ol .lt. 0 .and. alg .eq. 1) write(pu,30) + if (ol .lt. 0 .and. alg .eq. 2) write(pu,40) + if (ol .gt. 0 .and. alg .eq. 1) write(pu,70) + if (ol .gt. 0 .and. alg .eq. 2) write(pu,80) + if (alg .eq. 1) write(pu,410) v(f) + if (alg .eq. 2) write(pu,420) v(f) + 410 format(/11h 0 1,d10.3) +c365 format(/11h 0 1,e11.3) + 420 format(/11h 0 1,d11.3) + go to 999 +c +c *** print various information requested on solution *** +c + 430 iv(needhd) = 1 + if (iv(statpr) .eq. 0) go to 480 + oldf = dmax1(dabs(v(f0)), dabs(v(f))) + preldf = zero + nreldf = zero + if (oldf .le. zero) go to 440 + preldf = v(preduc) / oldf + nreldf = v(nreduc) / oldf + 440 nf = iv(nfcall) - iv(nfcov) + ng = iv(ngcall) - iv(ngcov) + write(pu,450) v(f), v(reldx), nf, ng, preldf, nreldf + 450 format(/9h function,d17.6,8h reldx,d17.3/12h func. evals, + 1 i8,9x,11hgrad. evals,i8/7h preldf,d16.3,6x,7hnpreldf,d15.3) +c + if (iv(nfcov) .gt. 0) write(pu,460) iv(nfcov) + 460 format(/1x,i4,50h extra func. evals for covariance and diagnost + 1ics.) + if (iv(ngcov) .gt. 0) write(pu,470) iv(ngcov) + 470 format(1x,i4,50h extra grad. evals for covariance and diagnosti + 1cs.) +c + 480 if (iv(solprt) .eq. 0) go to 999 + iv(needhd) = 1 + write(pu,490) + 490 format(/22h i final x(i),8x,4hd(i),10x,4hg(i)/) + do 500 i = 1, p + write(pu,510) i, x(i), d(i), g(i) + 500 continue + 510 format(1x,i5,d16.6,2d14.3) + go to 999 +c + 520 write(pu,530) + 530 format(/24h inconsistent dimensions) + 999 return +c *** last card of itsum follows *** + end + subroutine litvmu(n, x, l, y) +c +c *** solve (l**t)*x = y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) + integer i, ii, ij, im1, i0, j, np1 + double precision xi, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + do 10 i = 1, n + 10 x(i) = y(i) + np1 = n + 1 + i0 = n*(n+1)/2 + do 30 ii = 1, n + i = np1 - ii + xi = x(i)/l(i0) + x(i) = xi + if (i .le. 1) go to 999 + i0 = i0 - i + if (xi .eq. zero) go to 30 + im1 = i - 1 + do 20 j = 1, im1 + ij = i0 + j + x(j) = x(j) - xi*l(ij) + 20 continue + 30 continue + 999 return +c *** last card of litvmu follows *** + end + subroutine livmul(n, x, l, y) +c +c *** solve l*x = y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) + external dotprd + double precision dotprd + integer i, j, k + double precision t, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + do 10 k = 1, n + if (y(k) .ne. zero) go to 20 + x(k) = zero + 10 continue + go to 999 + 20 j = k*(k+1)/2 + x(k) = y(k) / l(j) + if (k .ge. n) go to 999 + k = k + 1 + do 30 i = k, n + t = dotprd(i-1, l(j+1), x) + j = j + i + x(i) = (y(i) - t)/l(j) + 30 continue + 999 return +c *** last card of livmul follows *** + end + subroutine parck(alg, d, iv, liv, lv, n, v) +c +c *** check ***sol (version 2.3) parameters, print changed values *** +c +c *** alg = 1 for regression, alg = 2 for general unconstrained opt. +c + integer alg, liv, lv, n + integer iv(liv) + double precision d(n), v(lv) +c + external rmdcon, vcopy, vdflt + double precision rmdcon +c rmdcon -- returns machine-dependent constants. +c vcopy -- copies one vector to another. +c vdflt -- supplies default parameter values to v alone. +c/+ + integer max0 +c/ +c +c *** local variables *** +c + integer i, ii, iv1, j, k, l, m, miv1, miv2, ndfalt, parsv1, pu + integer ijmp, jlim(2), miniv(2), ndflt(2) +c/6 +c integer varnm(2), sh(2) +c real cngd(3), dflt(3), vn(2,34), which(3) +c/7 + character*1 varnm(2), sh(2) + character*4 cngd(3), dflt(3), vn(2,34), which(3) +c/ + double precision big, machep, tiny, vk, vm(34), vx(34), zero +c +c *** iv and v subscripts *** +c + integer algsav, dinit, dtype, dtype0, epslon, inits, ivneed, + 1 lastiv, lastv, lmat, nextiv, nextv, nvdflt, oldn, + 2 parprt, parsav, perm, prunit, vneed +c +c +c/6 +c data algsav/51/, dinit/38/, dtype/16/, dtype0/54/, epslon/19/, +c 1 inits/25/, ivneed/3/, lastiv/44/, lastv/45/, lmat/42/, +c 2 nextiv/46/, nextv/47/, nvdflt/50/, oldn/38/, parprt/20/, +c 3 parsav/49/, perm/58/, prunit/21/, vneed/4/ +c/7 + parameter (algsav=51, dinit=38, dtype=16, dtype0=54, epslon=19, + 1 inits=25, ivneed=3, lastiv=44, lastv=45, lmat=42, + 2 nextiv=46, nextv=47, nvdflt=50, oldn=38, parprt=20, + 3 parsav=49, perm=58, prunit=21, vneed=4) + save big, machep, tiny +c/ +c + data big/0.d+0/, machep/-1.d+0/, tiny/1.d+0/, zero/0.d+0/ +c/6 +c data vn(1,1),vn(2,1)/4hepsl,4hon../ +c data vn(1,2),vn(2,2)/4hphmn,4hfc../ +c data vn(1,3),vn(2,3)/4hphmx,4hfc../ +c data vn(1,4),vn(2,4)/4hdecf,4hac../ +c data vn(1,5),vn(2,5)/4hincf,4hac../ +c data vn(1,6),vn(2,6)/4hrdfc,4hmn../ +c data vn(1,7),vn(2,7)/4hrdfc,4hmx../ +c data vn(1,8),vn(2,8)/4htune,4hr1../ +c data vn(1,9),vn(2,9)/4htune,4hr2../ +c data vn(1,10),vn(2,10)/4htune,4hr3../ +c data vn(1,11),vn(2,11)/4htune,4hr4../ +c data vn(1,12),vn(2,12)/4htune,4hr5../ +c data vn(1,13),vn(2,13)/4hafct,4hol../ +c data vn(1,14),vn(2,14)/4hrfct,4hol../ +c data vn(1,15),vn(2,15)/4hxcto,4hl.../ +c data vn(1,16),vn(2,16)/4hxfto,4hl.../ +c data vn(1,17),vn(2,17)/4hlmax,4h0.../ +c data vn(1,18),vn(2,18)/4hlmax,4hs.../ +c data vn(1,19),vn(2,19)/4hscto,4hl.../ +c data vn(1,20),vn(2,20)/4hdini,4ht.../ +c data vn(1,21),vn(2,21)/4hdtin,4hit../ +c data vn(1,22),vn(2,22)/4hd0in,4hit../ +c data vn(1,23),vn(2,23)/4hdfac,4h..../ +c data vn(1,24),vn(2,24)/4hdltf,4hdc../ +c data vn(1,25),vn(2,25)/4hdltf,4hdj../ +c data vn(1,26),vn(2,26)/4hdelt,4ha0../ +c data vn(1,27),vn(2,27)/4hfuzz,4h..../ +c data vn(1,28),vn(2,28)/4hrlim,4hit../ +c data vn(1,29),vn(2,29)/4hcosm,4hin../ +c data vn(1,30),vn(2,30)/4hhube,4hrc../ +c data vn(1,31),vn(2,31)/4hrspt,4hol../ +c data vn(1,32),vn(2,32)/4hsigm,4hin../ +c data vn(1,33),vn(2,33)/4heta0,4h..../ +c data vn(1,34),vn(2,34)/4hbias,4h..../ +c/7 + data vn(1,1),vn(2,1)/'epsl','on..'/ + data vn(1,2),vn(2,2)/'phmn','fc..'/ + data vn(1,3),vn(2,3)/'phmx','fc..'/ + data vn(1,4),vn(2,4)/'decf','ac..'/ + data vn(1,5),vn(2,5)/'incf','ac..'/ + data vn(1,6),vn(2,6)/'rdfc','mn..'/ + data vn(1,7),vn(2,7)/'rdfc','mx..'/ + data vn(1,8),vn(2,8)/'tune','r1..'/ + data vn(1,9),vn(2,9)/'tune','r2..'/ + data vn(1,10),vn(2,10)/'tune','r3..'/ + data vn(1,11),vn(2,11)/'tune','r4..'/ + data vn(1,12),vn(2,12)/'tune','r5..'/ + data vn(1,13),vn(2,13)/'afct','ol..'/ + data vn(1,14),vn(2,14)/'rfct','ol..'/ + data vn(1,15),vn(2,15)/'xcto','l...'/ + data vn(1,16),vn(2,16)/'xfto','l...'/ + data vn(1,17),vn(2,17)/'lmax','0...'/ + data vn(1,18),vn(2,18)/'lmax','s...'/ + data vn(1,19),vn(2,19)/'scto','l...'/ + data vn(1,20),vn(2,20)/'dini','t...'/ + data vn(1,21),vn(2,21)/'dtin','it..'/ + data vn(1,22),vn(2,22)/'d0in','it..'/ + data vn(1,23),vn(2,23)/'dfac','....'/ + data vn(1,24),vn(2,24)/'dltf','dc..'/ + data vn(1,25),vn(2,25)/'dltf','dj..'/ + data vn(1,26),vn(2,26)/'delt','a0..'/ + data vn(1,27),vn(2,27)/'fuzz','....'/ + data vn(1,28),vn(2,28)/'rlim','it..'/ + data vn(1,29),vn(2,29)/'cosm','in..'/ + data vn(1,30),vn(2,30)/'hube','rc..'/ + data vn(1,31),vn(2,31)/'rspt','ol..'/ + data vn(1,32),vn(2,32)/'sigm','in..'/ + data vn(1,33),vn(2,33)/'eta0','....'/ + data vn(1,34),vn(2,34)/'bias','....'/ +c/ +c + data vm(1)/1.0d-3/, vm(2)/-0.99d+0/, vm(3)/1.0d-3/, vm(4)/1.0d-2/, + 1 vm(5)/1.2d+0/, vm(6)/1.d-2/, vm(7)/1.2d+0/, vm(8)/0.d+0/, + 2 vm(9)/0.d+0/, vm(10)/1.d-3/, vm(11)/-1.d+0/, vm(13)/0.d+0/, + 3 vm(15)/0.d+0/, vm(16)/0.d+0/, vm(19)/0.d+0/, vm(20)/-10.d+0/, + 4 vm(21)/0.d+0/, vm(22)/0.d+0/, vm(23)/0.d+0/, vm(27)/1.01d+0/, + 5 vm(28)/1.d+10/, vm(30)/0.d+0/, vm(31)/0.d+0/, vm(32)/0.d+0/, + 6 vm(34)/0.d+0/ + data vx(1)/0.9d+0/, vx(2)/-1.d-3/, vx(3)/1.d+1/, vx(4)/0.8d+0/, + 1 vx(5)/1.d+2/, vx(6)/0.8d+0/, vx(7)/1.d+2/, vx(8)/0.5d+0/, + 2 vx(9)/0.5d+0/, vx(10)/1.d+0/, vx(11)/1.d+0/, vx(14)/0.1d+0/, + 3 vx(15)/1.d+0/, vx(16)/1.d+0/, vx(19)/1.d+0/, vx(23)/1.d+0/, + 4 vx(24)/1.d+0/, vx(25)/1.d+0/, vx(26)/1.d+0/, vx(27)/1.d+10/, + 5 vx(29)/1.d+0/, vx(31)/1.d+0/, vx(32)/1.d+0/, vx(33)/1.d+0/, + 6 vx(34)/1.d+0/ +c +c/6 +c data varnm(1)/1hp/, varnm(2)/1hn/, sh(1)/1hs/, sh(2)/1hh/ +c data cngd(1),cngd(2),cngd(3)/4h---c,4hhang,4hed v/, +c 1 dflt(1),dflt(2),dflt(3)/4hnond,4hefau,4hlt v/ +c/7 + data varnm(1)/'p'/, varnm(2)/'n'/, sh(1)/'s'/, sh(2)/'h'/ + data cngd(1),cngd(2),cngd(3)/'---c','hang','ed v'/, + 1 dflt(1),dflt(2),dflt(3)/'nond','efau','lt v'/ +c/ + data ijmp/33/, jlim(1)/0/, jlim(2)/24/, ndflt(1)/32/, ndflt(2)/25/ + data miniv(1)/80/, miniv(2)/59/ +c +c............................... body ................................ +c + pu = 0 + if (prunit .le. liv) pu = iv(prunit) + if (alg .lt. 1 .or. alg .gt. 2) go to 340 + if (iv(1) .eq. 0) call deflt(alg, iv, liv, lv, v) + iv1 = iv(1) + if (iv1 .ne. 13 .and. iv1 .ne. 12) go to 10 + miv1 = miniv(alg) + if (perm .le. liv) miv1 = max0(miv1, iv(perm) - 1) + if (ivneed .le. liv) miv2 = miv1 + max0(iv(ivneed), 0) + if (lastiv .le. liv) iv(lastiv) = miv2 + if (liv .lt. miv1) go to 300 + iv(ivneed) = 0 + iv(lastv) = max0(iv(vneed), 0) + iv(lmat) - 1 + iv(vneed) = 0 + if (liv .lt. miv2) go to 300 + if (lv .lt. iv(lastv)) go to 320 + 10 if (alg .eq. iv(algsav)) go to 30 + if (pu .ne. 0) write(pu,20) alg, iv(algsav) + 20 format(/39h the first parameter to deflt should be,i3, + 1 12h rather than,i3) + iv(1) = 82 + go to 999 + 30 if (iv1 .lt. 12 .or. iv1 .gt. 14) go to 60 + if (n .ge. 1) go to 50 + iv(1) = 81 + if (pu .eq. 0) go to 999 + write(pu,40) varnm(alg), n + 40 format(/8h /// bad,a1,2h =,i5) + go to 999 + 50 if (iv1 .ne. 14) iv(nextiv) = iv(perm) + if (iv1 .ne. 14) iv(nextv) = iv(lmat) + if (iv1 .eq. 13) go to 999 + k = iv(parsav) - epslon + call vdflt(alg, lv-k, v(k+1)) + iv(dtype0) = 2 - alg + iv(oldn) = n + which(1) = dflt(1) + which(2) = dflt(2) + which(3) = dflt(3) + go to 110 + 60 if (n .eq. iv(oldn)) go to 80 + iv(1) = 17 + if (pu .eq. 0) go to 999 + write(pu,70) varnm(alg), iv(oldn), n + 70 format(/5h /// ,1a1,14h changed from ,i5,4h to ,i5) + go to 999 +c + 80 if (iv1 .le. 11 .and. iv1 .ge. 1) go to 100 + iv(1) = 80 + if (pu .ne. 0) write(pu,90) iv1 + 90 format(/13h /// iv(1) =,i5,28h should be between 0 and 14.) + go to 999 +c + 100 which(1) = cngd(1) + which(2) = cngd(2) + which(3) = cngd(3) +c + 110 if (iv1 .eq. 14) iv1 = 12 + if (big .gt. tiny) go to 120 + tiny = rmdcon(1) + machep = rmdcon(3) + big = rmdcon(6) + vm(12) = machep + vx(12) = big + vx(13) = big + vm(14) = machep + vm(17) = tiny + vx(17) = big + vm(18) = tiny + vx(18) = big + vx(20) = big + vx(21) = big + vx(22) = big + vm(24) = machep + vm(25) = machep + vm(26) = machep + vx(28) = rmdcon(5) + vm(29) = machep + vx(30) = big + vm(33) = machep + 120 m = 0 + i = 1 + j = jlim(alg) + k = epslon + ndfalt = ndflt(alg) + do 150 l = 1, ndfalt + vk = v(k) + if (vk .ge. vm(i) .and. vk .le. vx(i)) go to 140 + m = k + if (pu .ne. 0) write(pu,130) vn(1,i), vn(2,i), k, vk, + 1 vm(i), vx(i) + 130 format(/6h /// ,2a4,5h.. v(,i2,3h) =,d11.3,7h should, + 1 11h be between,d11.3,4h and,d11.3) + 140 k = k + 1 + i = i + 1 + if (i .eq. j) i = ijmp + 150 continue +c + if (iv(nvdflt) .eq. ndfalt) go to 170 + iv(1) = 51 + if (pu .eq. 0) go to 999 + write(pu,160) iv(nvdflt), ndfalt + 160 format(/13h iv(nvdflt) =,i5,13h rather than ,i5) + go to 999 + 170 if ((iv(dtype) .gt. 0 .or. v(dinit) .gt. zero) .and. iv1 .eq. 12) + 1 go to 200 + do 190 i = 1, n + if (d(i) .gt. zero) go to 190 + m = 18 + if (pu .ne. 0) write(pu,180) i, d(i) + 180 format(/8h /// d(,i3,3h) =,d11.3,19h should be positive) + 190 continue + 200 if (m .eq. 0) go to 210 + iv(1) = m + go to 999 +c + 210 if (pu .eq. 0 .or. iv(parprt) .eq. 0) go to 999 + if (iv1 .ne. 12 .or. iv(inits) .eq. alg-1) go to 230 + m = 1 + write(pu,220) sh(alg), iv(inits) + 220 format(/22h nondefault values..../5h init,a1,14h..... iv(25) =, + 1 i3) + 230 if (iv(dtype) .eq. iv(dtype0)) go to 250 + if (m .eq. 0) write(pu,260) which + m = 1 + write(pu,240) iv(dtype) + 240 format(20h dtype..... iv(16) =,i3) + 250 i = 1 + j = jlim(alg) + k = epslon + l = iv(parsav) + ndfalt = ndflt(alg) + do 290 ii = 1, ndfalt + if (v(k) .eq. v(l)) go to 280 + if (m .eq. 0) write(pu,260) which + 260 format(/1h ,3a4,9halues..../) + m = 1 + write(pu,270) vn(1,i), vn(2,i), k, v(k) + 270 format(1x,2a4,5h.. v(,i2,3h) =,d15.7) + 280 k = k + 1 + l = l + 1 + i = i + 1 + if (i .eq. j) i = ijmp + 290 continue +c + iv(dtype0) = iv(dtype) + parsv1 = iv(parsav) + call vcopy(iv(nvdflt), v(parsv1), v(epslon)) + go to 999 +c + 300 iv(1) = 15 + if (pu .eq. 0) go to 999 + write(pu,310) liv, miv2 + 310 format(/10h /// liv =,i5,17h must be at least,i5) + if (liv .lt. miv1) go to 999 + if (lv .lt. iv(lastv)) go to 320 + go to 999 +c + 320 iv(1) = 16 + if (pu .eq. 0) go to 999 + write(pu,330) lv, iv(lastv) + 330 format(/9h /// lv =,i5,17h must be at least,i5) + go to 999 +c + 340 iv(1) = 67 + if (pu .eq. 0) go to 999 + write(pu,350) alg + 350 format(/10h /// alg =,i5,15h must be 1 or 2) +c + 999 return +c *** last card of parck follows *** + end + double precision function reldst(p, d, x, x0) +c +c *** compute and return relative difference between x and x0 *** +c *** nl2sol version 2.2 *** +c + integer p + double precision d(p), x(p), x0(p) +c/+ + double precision dabs +c/ + integer i + double precision emax, t, xmax, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + emax = zero + xmax = zero + do 10 i = 1, p + t = dabs(d(i) * (x(i) - x0(i))) + if (emax .lt. t) emax = t + t = d(i) * (dabs(x(i)) + dabs(x0(i))) + if (xmax .lt. t) xmax = t + 10 continue + reldst = zero + if (xmax .gt. zero) reldst = emax / xmax + 999 return +c *** last card of reldst follows *** + end +c logical function stopx(idummy) +c *****parameters... +c integer idummy +c +c .................................................................. +c +c *****purpose... +c this function may serve as the stopx (asynchronous interruption) +c function for the nl2sol (nonlinear least-squares) package at +c those installations which do not wish to implement a +c dynamic stopx. +c +c *****algorithm notes... +c at installations where the nl2sol system is used +c interactively, this dummy stopx should be replaced by a +c function that returns .true. if and only if the interrupt +c (break) key has been pressed since the last call on stopx. +c +c .................................................................. +c +c stopx = .false. +c return +c end + subroutine vaxpy(p, w, a, x, y) +c +c *** set w = a*x + y -- w, x, y = p-vectors, a = scalar *** +c + integer p + double precision a, w(p), x(p), y(p) +c + integer i +c + do 10 i = 1, p + 10 w(i) = a*x(i) + y(i) + return + end + subroutine vcopy(p, y, x) +c +c *** set y = x, where x and y are p-vectors *** +c + integer p + double precision x(p), y(p) +c + integer i +c + do 10 i = 1, p + 10 y(i) = x(i) + return + end + subroutine vdflt(alg, lv, v) +c +c *** supply ***sol (version 2.3) default values to v *** +c +c *** alg = 1 means regression constants. +c *** alg = 2 means general unconstrained optimization constants. +c + integer alg, l + double precision v(lv) +c/+ + double precision dmax1 +c/ + external rmdcon + double precision rmdcon +c rmdcon... returns machine-dependent constants +c + double precision machep, mepcrt, one, sqteps, three +c +c *** subscripts for v *** +c + integer afctol, bias, cosmin, decfac, delta0, dfac, dinit, dltfdc, + 1 dltfdj, dtinit, d0init, epslon, eta0, fuzz, huberc, + 2 incfac, lmax0, lmaxs, phmnfc, phmxfc, rdfcmn, rdfcmx, + 3 rfctol, rlimit, rsptol, sctol, sigmin, tuner1, tuner2, + 4 tuner3, tuner4, tuner5, xctol, xftol +c +c/6 +c data one/1.d+0/, three/3.d+0/ +c/7 + parameter (one=1.d+0, three=3.d+0) +c/ +c +c *** v subscript values *** +c +c/6 +c data afctol/31/, bias/43/, cosmin/47/, decfac/22/, delta0/44/, +c 1 dfac/41/, dinit/38/, dltfdc/42/, dltfdj/43/, dtinit/39/, +c 2 d0init/40/, epslon/19/, eta0/42/, fuzz/45/, huberc/48/, +c 3 incfac/23/, lmax0/35/, lmaxs/36/, phmnfc/20/, phmxfc/21/, +c 4 rdfcmn/24/, rdfcmx/25/, rfctol/32/, rlimit/46/, rsptol/49/, +c 5 sctol/37/, sigmin/50/, tuner1/26/, tuner2/27/, tuner3/28/, +c 6 tuner4/29/, tuner5/30/, xctol/33/, xftol/34/ +c/7 + parameter (afctol=31, bias=43, cosmin=47, decfac=22, delta0=44, + 1 dfac=41, dinit=38, dltfdc=42, dltfdj=43, dtinit=39, + 2 d0init=40, epslon=19, eta0=42, fuzz=45, huberc=48, + 3 incfac=23, lmax0=35, lmaxs=36, phmnfc=20, phmxfc=21, + 4 rdfcmn=24, rdfcmx=25, rfctol=32, rlimit=46, rsptol=49, + 5 sctol=37, sigmin=50, tuner1=26, tuner2=27, tuner3=28, + 6 tuner4=29, tuner5=30, xctol=33, xftol=34) +c/ +c +c------------------------------- body -------------------------------- +c + machep = rmdcon(3) + v(afctol) = 1.d-20 + if (machep .gt. 1.d-10) v(afctol) = machep**2 + v(decfac) = 0.5d+0 + sqteps = rmdcon(4) + v(dfac) = 0.6d+0 + v(delta0) = sqteps + v(dtinit) = 1.d-6 + mepcrt = machep ** (one/three) + v(d0init) = 1.d+0 + v(epslon) = 0.1d+0 + v(incfac) = 2.d+0 + v(lmax0) = 1.d+0 + v(lmaxs) = 1.d+0 + v(phmnfc) = -0.1d+0 + v(phmxfc) = 0.1d+0 + v(rdfcmn) = 0.1d+0 + v(rdfcmx) = 4.d+0 + v(rfctol) = dmax1(1.d-10, mepcrt**2) + v(sctol) = v(rfctol) + v(tuner1) = 0.1d+0 + v(tuner2) = 1.d-4 + v(tuner3) = 0.75d+0 + v(tuner4) = 0.5d+0 + v(tuner5) = 0.75d+0 + v(xctol) = sqteps + v(xftol) = 1.d+2 * machep +c + if (alg .ge. 2) go to 10 +c +c *** regression values +c + v(cosmin) = dmax1(1.d-6, 1.d+2 * machep) + v(dinit) = 0.d+0 + v(dltfdc) = mepcrt + v(dltfdj) = sqteps + v(fuzz) = 1.5d+0 + v(huberc) = 0.7d+0 + v(rlimit) = rmdcon(5) + v(rsptol) = 1.d-3 + v(sigmin) = 1.d-4 + go to 999 +c +c *** general optimization values +c + 10 v(bias) = 0.8d+0 + v(dinit) = -1.0d+0 + v(eta0) = 1.0d+3 * machep +c + 999 return +c *** last card of vdflt follows *** + end + subroutine vscopy(p, y, s) +c +c *** set p-vector y to scalar s *** +c + integer p + double precision s, y(p) +c + integer i +c + do 10 i = 1, p + 10 y(i) = s + return + end + double precision function v2norm(p, x) +c +c *** return the 2-norm of the p-vector x, taking *** +c *** care to avoid the most likely underflows. *** +c + integer p + double precision x(p) +c + integer i, j + double precision one, r, scale, sqteta, t, xi, zero +c/+ + double precision dabs, dsqrt +c/ + external rmdcon + double precision rmdcon +c +c/6 +c data one/1.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) + save sqteta +c/ + data sqteta/0.d+0/ +c + if (p .gt. 0) go to 10 + v2norm = zero + go to 999 + 10 do 20 i = 1, p + if (x(i) .ne. zero) go to 30 + 20 continue + v2norm = zero + go to 999 +c + 30 scale = dabs(x(i)) + if (i .lt. p) go to 40 + v2norm = scale + go to 999 + 40 t = one + if (sqteta .eq. zero) sqteta = rmdcon(2) +c +c *** sqteta is (slightly larger than) the square root of the +c *** smallest positive floating point number on the machine. +c *** the tests involving sqteta are done to prevent underflows. +c + j = i + 1 + do 60 i = j, p + xi = dabs(x(i)) + if (xi .gt. scale) go to 50 + r = xi / scale + if (r .gt. sqteta) t = t + r*r + go to 60 + 50 r = scale / xi + if (r .le. sqteta) r = zero + t = one + t * r*r + scale = xi + 60 continue +c + v2norm = scale * dsqrt(t) + 999 return +c *** last card of v2norm follows *** + end + subroutine humsl(n, d, x, calcf, calcgh, iv, liv, lv, v, + 1 uiparm, urparm, ufparm) +c +c *** minimize general unconstrained objective function using *** +c *** (analytic) gradient and hessian provided by the caller. *** +c + integer liv, lv, n + integer iv(liv), uiparm(1) + double precision d(n), x(n), v(lv), urparm(1) +c dimension v(78 + n*(n+12)), uiparm(*), urparm(*) + external calcf, calcgh, ufparm +c +c------------------------------ discussion --------------------------- +c +c this routine is like sumsl, except that the subroutine para- +c meter calcg of sumsl (which computes the gradient of the objec- +c tive function) is replaced by the subroutine parameter calcgh, +c which computes both the gradient and (lower triangle of the) +c hessian of the objective function. the calling sequence is... +c call calcgh(n, x, nf, g, h, uiparm, urparm, ufparm) +c parameters n, x, nf, g, uiparm, urparm, and ufparm are the same +c as for sumsl, while h is an array of length n*(n+1)/2 in which +c calcgh must store the lower triangle of the hessian at x. start- +c ing at h(1), calcgh must store the hessian entries in the order +c (1,1), (2,1), (2,2), (3,1), (3,2), (3,3), ... +c the value printed (by itsum) in the column labelled stppar +c is the levenberg-marquardt used in computing the current step. +c zero means a full newton step. if the special case described in +c ref. 1 is detected, then stppar is negated. the value printed +c in the column labelled npreldf is zero if the current hessian +c is not positive definite. +c it sometimes proves worthwhile to let d be determined from the +c diagonal of the hessian matrix by setting iv(dtype) = 1 and +c v(dinit) = 0. the following iv and v components are relevant... +c +c iv(dtol)..... iv(59) gives the starting subscript in v of the dtol +c array used when d is updated. (iv(dtol) can be +c initialized by calling humsl with iv(1) = 13.) +c iv(dtype).... iv(16) tells how the scale vector d should be chosen. +c iv(dtype) .le. 0 means that d should not be updated, and +c iv(dtype) .ge. 1 means that d should be updated as +c described below with v(dfac). default = 0. +c v(dfac)..... v(41) and the dtol and d0 arrays (see v(dtinit) and +c v(d0init)) are used in updating the scale vector d when +c iv(dtype) .gt. 0. (d is initialized according to +c v(dinit), described in sumsl.) let +c d1(i) = max(sqrt(abs(h(i,i))), v(dfac)*d(i)), +c where h(i,i) is the i-th diagonal element of the current +c hessian. if iv(dtype) = 1, then d(i) is set to d1(i) +c unless d1(i) .lt. dtol(i), in which case d(i) is set to +c max(d0(i), dtol(i)). +c if iv(dtype) .ge. 2, then d is updated during the first +c iteration as for iv(dtype) = 1 (after any initialization +c due to v(dinit)) and is left unchanged thereafter. +c default = 0.6. +c v(dtinit)... v(39), if positive, is the value to which all components +c of the dtol array (see v(dfac)) are initialized. if +c v(dtinit) = 0, then it is assumed that the caller has +c stored dtol in v starting at v(iv(dtol)). +c default = 10**-6. +c v(d0init)... v(40), if positive, is the value to which all components +c of the d0 vector (see v(dfac)) are initialized. if +c v(dfac) = 0, then it is assumed that the caller has +c stored d0 in v starting at v(iv(dtol)+n). default = 1.0. +c +c *** reference *** +c +c 1. gay, d.m. (1981), computing optimal locally constrained steps, +c siam j. sci. statist. comput. 2, pp. 186-197. +c. +c *** general *** +c +c coded by david m. gay (winter 1980). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c---------------------------- declarations --------------------------- +c + external deflt, humit +c +c deflt... provides default input values for iv and v. +c humit... reverse-communication routine that does humsl algorithm. +c + integer g1, h1, iv1, lh, nf + double precision f +c +c *** subscripts for iv *** +c + integer g, h, nextv, nfcall, nfgcal, toobig, vneed +c +c/6 +c data nextv/47/, nfcall/6/, nfgcal/7/, g/28/, h/56/, toobig/2/, +c 1 vneed/4/ +c/7 + parameter (nextv=47, nfcall=6, nfgcal=7, g=28, h=56, toobig=2, + 1 vneed=4) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + lh = n * (n + 1) / 2 + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+3)/2 + iv1 = iv(1) + if (iv1 .eq. 14) go to 10 + if (iv1 .gt. 2 .and. iv1 .lt. 12) go to 10 + g1 = 1 + h1 = 1 + if (iv1 .eq. 12) iv(1) = 13 + go to 20 +c + 10 g1 = iv(g) + h1 = iv(h) +c + 20 call humit(d, f, v(g1), v(h1), iv, lh, liv, lv, n, v, x) + if (iv(1) - 2) 30, 40, 50 +c + 30 nf = iv(nfcall) + call calcf(n, x, nf, f, uiparm, urparm, ufparm) + if (nf .le. 0) iv(toobig) = 1 + go to 20 +c + 40 call calcgh(n, x, iv(nfgcal), v(g1), v(h1), uiparm, urparm, + 1 ufparm) + go to 20 +c + 50 if (iv(1) .ne. 14) go to 999 +c +c *** storage allocation +c + iv(g) = iv(nextv) + iv(h) = iv(g) + n + iv(nextv) = iv(h) + n*(n+1)/2 + if (iv1 .ne. 13) go to 10 +c + 999 return +c *** last card of humsl follows *** + end + subroutine humit(d, fx, g, h, iv, lh, liv, lv, n, v, x) +c +c *** carry out humsl (unconstrained minimization) iterations, using +c *** hessian matrix provided by the caller. +c +c *** parameter declarations *** +c + integer lh, liv, lv, n + integer iv(liv) + double precision d(n), fx, g(n), h(lh), v(lv), x(n) +c +c-------------------------- parameter usage -------------------------- +c +c d.... scale vector. +c fx... function value. +c g.... gradient vector. +c h.... lower triangle of the hessian, stored rowwise. +c iv... integer value array. +c lh... length of h = p*(p+1)/2. +c liv.. length of iv (at least 60). +c lv... length of v (at least 78 + n*(n+21)/2). +c n.... number of variables (components in x and g). +c v.... floating-point value array. +c x.... parameter vector. +c +c *** discussion *** +c +c parameters iv, n, v, and x are the same as the corresponding +c ones to humsl (which see), except that v can be shorter (since +c the part of v that humsl uses for storing g and h is not needed). +c moreover, compared with humsl, iv(1) may have the two additional +c output values 1 and 2, which are explained below, as is the use +c of iv(toobig) and iv(nfgcal). the value iv(g), which is an +c output value from humsl, is not referenced by humit or the +c subroutines it calls. +c +c iv(1) = 1 means the caller should set fx to f(x), the function value +c at x, and call humit again, having changed none of the +c other parameters. an exception occurs if f(x) cannot be +c computed (e.g. if overflow would occur), which may happen +c because of an oversized step. in this case the caller +c should set iv(toobig) = iv(2) to 1, which will cause +c humit to ignore fx and try a smaller step. the para- +c meter nf that humsl passes to calcf (for possible use by +c calcgh) is a copy of iv(nfcall) = iv(6). +c iv(1) = 2 means the caller should set g to g(x), the gradient of f at +c x, and h to the lower triangle of h(x), the hessian of f +c at x, and call humit again, having changed none of the +c other parameters except perhaps the scale vector d. +c the parameter nf that humsl passes to calcg is +c iv(nfgcal) = iv(7). if g(x) and h(x) cannot be evaluated, +c then the caller may set iv(nfgcal) to 0, in which case +c humit will return with iv(1) = 65. +c note -- humit overwrites h with the lower triangle +c of diag(d)**-1 * h(x) * diag(d)**-1. +c. +c *** general *** +c +c coded by david m. gay (winter 1980). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c (see sumsl and humsl for references.) +c +c+++++++++++++++++++++++++++ declarations ++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer dg1, dummy, i, j, k, l, lstgst, nn1o2, step1, + 1 temp1, w1, x01 + double precision t +c +c *** constants *** +c + double precision one, onep2, zero +c +c *** no intrinsic functions *** +c +c *** external functions and subroutines *** +c + external assst, deflt, dotprd, dupdu, gqtst, itsum, parck, + 1 reldst, slvmul, stopx, vaxpy, vcopy, vscopy, v2norm + logical stopx + double precision dotprd, reldst, v2norm +c +c assst.... assesses candidate step. +c deflt.... provides default iv and v input values. +c dotprd... returns inner product of two vectors. +c dupdu.... updates scale vector d. +c gqtst.... computes optimally locally constrained step. +c itsum.... prints iteration summary and info on initial and final x. +c parck.... checks validity of input iv and v values. +c reldst... computes v(reldx) = relative step size. +c slvmul... multiplies symmetric matrix times vector, given the lower +c triangle of the matrix. +c stopx.... returns .true. if the break key has been pressed. +c vaxpy.... computes scalar times one vector plus another. +c vcopy.... copies one vector to another. +c vscopy... sets all elements of a vector to a scalar. +c v2norm... returns the 2-norm of a vector. +c +c *** subscripts for iv and v *** +c + integer cnvcod, dg, dgnorm, dinit, dstnrm, dtinit, dtol, + 1 dtype, d0init, f, f0, fdif, gtstep, incfac, irc, kagqt, + 2 lmat, lmax0, lmaxs, mode, model, mxfcal, mxiter, nextv, + 3 nfcall, nfgcal, ngcall, niter, preduc, radfac, radinc, + 4 radius, rad0, reldx, restor, step, stglim, stlstg, stppar, + 5 toobig, tuner4, tuner5, vneed, w, xirc, x0 +c +c *** iv subscript values *** +c +c/6 +c data cnvcod/55/, dg/37/, dtol/59/, dtype/16/, irc/29/, kagqt/33/, +c 1 lmat/42/, mode/35/, model/5/, mxfcal/17/, mxiter/18/, +c 2 nextv/47/, nfcall/6/, nfgcal/7/, ngcall/30/, niter/31/, +c 3 radinc/8/, restor/9/, step/40/, stglim/11/, stlstg/41/, +c 4 toobig/2/, vneed/4/, w/34/, xirc/13/, x0/43/ +c/7 + parameter (cnvcod=55, dg=37, dtol=59, dtype=16, irc=29, kagqt=33, + 1 lmat=42, mode=35, model=5, mxfcal=17, mxiter=18, + 2 nextv=47, nfcall=6, nfgcal=7, ngcall=30, niter=31, + 3 radinc=8, restor=9, step=40, stglim=11, stlstg=41, + 4 toobig=2, vneed=4, w=34, xirc=13, x0=43) +c/ +c +c *** v subscript values *** +c +c/6 +c data dgnorm/1/, dinit/38/, dstnrm/2/, dtinit/39/, d0init/40/, +c 1 f/10/, f0/13/, fdif/11/, gtstep/4/, incfac/23/, lmax0/35/, +c 2 lmaxs/36/, preduc/7/, radfac/16/, radius/8/, rad0/9/, +c 3 reldx/17/, stppar/5/, tuner4/29/, tuner5/30/ +c/7 + parameter (dgnorm=1, dinit=38, dstnrm=2, dtinit=39, d0init=40, + 1 f=10, f0=13, fdif=11, gtstep=4, incfac=23, lmax0=35, + 2 lmaxs=36, preduc=7, radfac=16, radius=8, rad0=9, + 3 reldx=17, stppar=5, tuner4=29, tuner5=30) +c/ +c +c/6 +c data one/1.d+0/, onep2/1.2d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, onep2=1.2d+0, zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + i = iv(1) + if (i .eq. 1) go to 30 + if (i .eq. 2) go to 40 +c +c *** check validity of iv and v input values *** +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+21)/2 + 7 + call parck(2, d, iv, liv, lv, n, v) + i = iv(1) - 2 + if (i .gt. 12) go to 999 + nn1o2 = n * (n + 1) / 2 + if (lh .ge. nn1o2) go to (210,210,210,210,210,210,160,120,160, + 1 10,10,20), i + iv(1) = 66 + go to 350 +c +c *** storage allocation *** +c + 10 iv(dtol) = iv(lmat) + nn1o2 + iv(x0) = iv(dtol) + 2*n + iv(step) = iv(x0) + n + iv(stlstg) = iv(step) + n + iv(dg) = iv(stlstg) + n + iv(w) = iv(dg) + n + iv(nextv) = iv(w) + 4*n + 7 + if (iv(1) .ne. 13) go to 20 + iv(1) = 14 + go to 999 +c +c *** initialization *** +c + 20 iv(niter) = 0 + iv(nfcall) = 1 + iv(ngcall) = 1 + iv(nfgcal) = 1 + iv(mode) = -1 + iv(model) = 1 + iv(stglim) = 1 + iv(toobig) = 0 + iv(cnvcod) = 0 + iv(radinc) = 0 + v(rad0) = zero + v(stppar) = zero + if (v(dinit) .ge. zero) call vscopy(n, d, v(dinit)) + k = iv(dtol) + if (v(dtinit) .gt. zero) call vscopy(n, v(k), v(dtinit)) + k = k + n + if (v(d0init) .gt. zero) call vscopy(n, v(k), v(d0init)) + iv(1) = 1 + go to 999 +c + 30 v(f) = fx + if (iv(mode) .ge. 0) go to 210 + iv(1) = 2 + if (iv(toobig) .eq. 0) go to 999 + iv(1) = 63 + go to 350 +c +c *** make sure gradient could be computed *** +c + 40 if (iv(nfgcal) .ne. 0) go to 50 + iv(1) = 65 + go to 350 +c +c *** update the scale vector d *** +c + 50 dg1 = iv(dg) + if (iv(dtype) .le. 0) go to 70 + k = dg1 + j = 0 + do 60 i = 1, n + j = j + i + v(k) = h(j) + k = k + 1 + 60 continue + call dupdu(d, v(dg1), iv, liv, lv, n, v) +c +c *** compute scaled gradient and its norm *** +c + 70 dg1 = iv(dg) + k = dg1 + do 80 i = 1, n + v(k) = g(i) / d(i) + k = k + 1 + 80 continue + v(dgnorm) = v2norm(n, v(dg1)) +c +c *** compute scaled hessian *** +c + k = 1 + do 100 i = 1, n + t = one / d(i) + do 90 j = 1, i + h(k) = t * h(k) / d(j) + k = k + 1 + 90 continue + 100 continue +c + if (iv(cnvcod) .ne. 0) go to 340 + if (iv(mode) .eq. 0) go to 300 +c +c *** allow first step to have scaled 2-norm at most v(lmax0) *** +c + v(radius) = v(lmax0) +c + iv(mode) = 0 +c +c +c----------------------------- main loop ----------------------------- +c +c +c *** print iteration summary, check iteration limit *** +c + 110 call itsum(d, g, iv, liv, lv, n, v, x) + 120 k = iv(niter) + if (k .lt. iv(mxiter)) go to 130 + iv(1) = 10 + go to 350 +c + 130 iv(niter) = k + 1 +c +c *** initialize for start of next iteration *** +c + dg1 = iv(dg) + x01 = iv(x0) + v(f0) = v(f) + iv(irc) = 4 + iv(kagqt) = -1 +c +c *** copy x to x0 *** +c + call vcopy(n, v(x01), x) +c +c *** update radius *** +c + if (k .eq. 0) go to 150 + step1 = iv(step) + k = step1 + do 140 i = 1, n + v(k) = d(i) * v(k) + k = k + 1 + 140 continue + v(radius) = v(radfac) * v2norm(n, v(step1)) +c +c *** check stopx and function evaluation limit *** +c +C AL 4/30/95 + dummy=iv(nfcall) + 150 if (.not. stopx(dummy)) go to 170 + iv(1) = 11 + go to 180 +c +c *** come here when restarting after func. eval. limit or stopx. +c + 160 if (v(f) .ge. v(f0)) go to 170 + v(radfac) = one + k = iv(niter) + go to 130 +c + 170 if (iv(nfcall) .lt. iv(mxfcal)) go to 190 + iv(1) = 9 + 180 if (v(f) .ge. v(f0)) go to 350 +c +c *** in case of stopx or function evaluation limit with +c *** improved v(f), evaluate the gradient at x. +c + iv(cnvcod) = iv(1) + go to 290 +c +c. . . . . . . . . . . . . compute candidate step . . . . . . . . . . +c + 190 step1 = iv(step) + dg1 = iv(dg) + l = iv(lmat) + w1 = iv(w) + call gqtst(d, v(dg1), h, iv(kagqt), v(l), n, v(step1), v, v(w1)) + if (iv(irc) .eq. 6) go to 210 +c +c *** check whether evaluating f(x0 + step) looks worthwhile *** +c + if (v(dstnrm) .le. zero) go to 210 + if (iv(irc) .ne. 5) go to 200 + if (v(radfac) .le. one) go to 200 + if (v(preduc) .le. onep2 * v(fdif)) go to 210 +c +c *** compute f(x0 + step) *** +c + 200 x01 = iv(x0) + step1 = iv(step) + call vaxpy(n, x, one, v(step1), v(x01)) + iv(nfcall) = iv(nfcall) + 1 + iv(1) = 1 + iv(toobig) = 0 + go to 999 +c +c. . . . . . . . . . . . . assess candidate step . . . . . . . . . . . +c + 210 x01 = iv(x0) + v(reldx) = reldst(n, d, x, v(x01)) + call assst(iv, liv, lv, v) + step1 = iv(step) + lstgst = iv(stlstg) + if (iv(restor) .eq. 1) call vcopy(n, x, v(x01)) + if (iv(restor) .eq. 2) call vcopy(n, v(lstgst), v(step1)) + if (iv(restor) .ne. 3) go to 220 + call vcopy(n, v(step1), v(lstgst)) + call vaxpy(n, x, one, v(step1), v(x01)) + v(reldx) = reldst(n, d, x, v(x01)) +c + 220 k = iv(irc) + go to (230,260,260,260,230,240,250,250,250,250,250,250,330,300), k +c +c *** recompute step with new radius *** +c + 230 v(radius) = v(radfac) * v(dstnrm) + go to 150 +c +c *** compute step of length v(lmaxs) for singular convergence test. +c + 240 v(radius) = v(lmaxs) + go to 190 +c +c *** convergence or false convergence *** +c + 250 iv(cnvcod) = k - 4 + if (v(f) .ge. v(f0)) go to 340 + if (iv(xirc) .eq. 14) go to 340 + iv(xirc) = 14 +c +c. . . . . . . . . . . . process acceptable step . . . . . . . . . . . +c + 260 if (iv(irc) .ne. 3) go to 290 + temp1 = lstgst +c +c *** prepare for gradient tests *** +c *** set temp1 = hessian * step + g(x0) +c *** = diag(d) * (h * step + g(x0)) +c +c use x0 vector as temporary. + k = x01 + do 270 i = 1, n + v(k) = d(i) * v(step1) + k = k + 1 + step1 = step1 + 1 + 270 continue + call slvmul(n, v(temp1), h, v(x01)) + do 280 i = 1, n + v(temp1) = d(i) * v(temp1) + g(i) + temp1 = temp1 + 1 + 280 continue +c +c *** compute gradient and hessian *** +c + 290 iv(ngcall) = iv(ngcall) + 1 + iv(1) = 2 + go to 999 +c + 300 iv(1) = 2 + if (iv(irc) .ne. 3) go to 110 +c +c *** set v(radfac) by gradient tests *** +c + temp1 = iv(stlstg) + step1 = iv(step) +c +c *** set temp1 = diag(d)**-1 * (hessian*step + (g(x0)-g(x))) *** +c + k = temp1 + do 310 i = 1, n + v(k) = (v(k) - g(i)) / d(i) + k = k + 1 + 310 continue +c +c *** do gradient tests *** +c + if (v2norm(n, v(temp1)) .le. v(dgnorm) * v(tuner4)) go to 320 + if (dotprd(n, g, v(step1)) + 1 .ge. v(gtstep) * v(tuner5)) go to 110 + 320 v(radfac) = v(incfac) + go to 110 +c +c. . . . . . . . . . . . . . misc. details . . . . . . . . . . . . . . +c +c *** bad parameters to assess *** +c + 330 iv(1) = 64 + go to 350 +c +c *** print summary of final iteration and other requested items *** +c + 340 iv(1) = iv(cnvcod) + iv(cnvcod) = 0 + 350 call itsum(d, g, iv, liv, lv, n, v, x) +c + 999 return +c +c *** last card of humit follows *** + end + subroutine dupdu(d, hdiag, iv, liv, lv, n, v) +c +c *** update scale vector d for humsl *** +c +c *** parameter declarations *** +c + integer liv, lv, n + integer iv(liv) + double precision d(n), hdiag(n), v(lv) +c +c *** local variables *** +c + integer dtoli, d0i, i + double precision t, vdfac +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1, dsqrt +c/ +c *** subscripts for iv and v *** +c + integer dfac, dtol, dtype, niter +c/6 +c data dfac/41/, dtol/59/, dtype/16/, niter/31/ +c/7 + parameter (dfac=41, dtol=59, dtype=16, niter=31) +c/ +c +c------------------------------- body -------------------------------- +c + i = iv(dtype) + if (i .eq. 1) go to 10 + if (iv(niter) .gt. 0) go to 999 +c + 10 dtoli = iv(dtol) + d0i = dtoli + n + vdfac = v(dfac) + do 20 i = 1, n + t = dmax1(dsqrt(dabs(hdiag(i))), vdfac*d(i)) + if (t .lt. v(dtoli)) t = dmax1(v(dtoli), v(d0i)) + d(i) = t + dtoli = dtoli + 1 + d0i = d0i + 1 + 20 continue +c + 999 return +c *** last card of dupdu follows *** + end + subroutine gqtst(d, dig, dihdi, ka, l, p, step, v, w) +c +c *** compute goldfeld-quandt-trotter step by more-hebden technique *** +c *** (nl2sol version 2.2), modified a la more and sorensen *** +c +c *** parameter declarations *** +c + integer ka, p +cal double precision d(p), dig(p), dihdi(1), l(1), v(21), step(p), +cal 1 w(1) + double precision d(p), dig(p), dihdi(p*(p+1)/2), l(p*(p+1)/2), + 1 v(21), step(p),w(4*p+7) +c dimension dihdi(p*(p+1)/2), l(p*(p+1)/2), w(4*p+7) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** purpose *** +c +c given the (compactly stored) lower triangle of a scaled +c hessian (approximation) and a nonzero scaled gradient vector, +c this subroutine computes a goldfeld-quandt-trotter step of +c approximate length v(radius) by the more-hebden technique. in +c other words, step is computed to (approximately) minimize +c psi(step) = (g**t)*step + 0.5*(step**t)*h*step such that the +c 2-norm of d*step is at most (approximately) v(radius), where +c g is the gradient, h is the hessian, and d is a diagonal +c scale matrix whose diagonal is stored in the parameter d. +c (gqtst assumes dig = d**-1 * g and dihdi = d**-1 * h * d**-1.) +c +c *** parameter description *** +c +c d (in) = the scale vector, i.e. the diagonal of the scale +c matrix d mentioned above under purpose. +c dig (in) = the scaled gradient vector, d**-1 * g. if g = 0, then +c step = 0 and v(stppar) = 0 are returned. +c dihdi (in) = lower triangle of the scaled hessian (approximation), +c i.e., d**-1 * h * d**-1, stored compactly by rows., i.e., +c in the order (1,1), (2,1), (2,2), (3,1), (3,2), etc. +c ka (i/o) = the number of hebden iterations (so far) taken to deter- +c mine step. ka .lt. 0 on input means this is the first +c attempt to determine step (for the present dig and dihdi) +c -- ka is initialized to 0 in this case. output with +c ka = 0 (or v(stppar) = 0) means step = -(h**-1)*g. +c l (i/o) = workspace of length p*(p+1)/2 for cholesky factors. +c p (in) = number of parameters -- the hessian is a p x p matrix. +c step (i/o) = the step computed. +c v (i/o) contains various constants and variables described below. +c w (i/o) = workspace of length 4*p + 6. +c +c *** entries in v *** +c +c v(dgnorm) (i/o) = 2-norm of (d**-1)*g. +c v(dstnrm) (output) = 2-norm of d*step. +c v(dst0) (i/o) = 2-norm of d*(h**-1)*g (for pos. def. h only), or +c overestimate of smallest eigenvalue of (d**-1)*h*(d**-1). +c v(epslon) (in) = max. rel. error allowed for psi(step). for the +c step returned, psi(step) will exceed its optimal value +c by less than -v(epslon)*psi(step). suggested value = 0.1. +c v(gtstep) (out) = inner product between g and step. +c v(nreduc) (out) = psi(-(h**-1)*g) = psi(newton step) (for pos. def. +c h only -- v(nreduc) is set to zero otherwise). +c v(phmnfc) (in) = tol. (together with v(phmxfc)) for accepting step +c (more*s sigma). the error v(dstnrm) - v(radius) must lie +c between v(phmnfc)*v(radius) and v(phmxfc)*v(radius). +c v(phmxfc) (in) (see v(phmnfc).) +c suggested values -- v(phmnfc) = -0.25, v(phmxfc) = 0.5. +c v(preduc) (out) = psi(step) = predicted obj. func. reduction for step. +c v(radius) (in) = radius of current (scaled) trust region. +c v(rad0) (i/o) = value of v(radius) from previous call. +c v(stppar) (i/o) is normally the marquardt parameter, i.e. the alpha +c described below under algorithm notes. if h + alpha*d**2 +c (see algorithm notes) is (nearly) singular, however, +c then v(stppar) = -alpha. +c +c *** usage notes *** +c +c if it is desired to recompute step using a different value of +c v(radius), then this routine may be restarted by calling it +c with all parameters unchanged except v(radius). (this explains +c why step and w are listed as i/o). on an initial call (one with +c ka .lt. 0), step and w need not be initialized and only compo- +c nents v(epslon), v(stppar), v(phmnfc), v(phmxfc), v(radius), and +c v(rad0) of v must be initialized. +c +c *** algorithm notes *** +c +c the desired g-q-t step (ref. 2, 3, 4, 6) satisfies +c (h + alpha*d**2)*step = -g for some nonnegative alpha such that +c h + alpha*d**2 is positive semidefinite. alpha and step are +c computed by a scheme analogous to the one described in ref. 5. +c estimates of the smallest and largest eigenvalues of the hessian +c are obtained from the gerschgorin circle theorem enhanced by a +c simple form of the scaling described in ref. 7. cases in which +c h + alpha*d**2 is nearly (or exactly) singular are handled by +c the technique discussed in ref. 2. in these cases, a step of +c (exact) length v(radius) is returned for which psi(step) exceeds +c its optimal value by less than -v(epslon)*psi(step). the test +c suggested in ref. 6 for detecting the special case is performed +c once two matrix factorizations have been done -- doing so sooner +c seems to degrade the performance of optimization routines that +c call this routine. +c +c *** functions and subroutines called *** +c +c dotprd - returns inner product of two vectors. +c litvmu - applies inverse-transpose of compact lower triang. matrix. +c livmul - applies inverse of compact lower triang. matrix. +c lsqrt - finds cholesky factor (of compactly stored lower triang.). +c lsvmin - returns approx. to min. sing. value of lower triang. matrix. +c rmdcon - returns machine-dependent constants. +c v2norm - returns 2-norm of a vector. +c +c *** references *** +c +c 1. dennis, j.e., gay, d.m., and welsch, r.e. (1981), an adaptive +c nonlinear least-squares algorithm, acm trans. math. +c software, vol. 7, no. 3. +c 2. gay, d.m. (1981), computing optimal locally constrained steps, +c siam j. sci. statist. computing, vol. 2, no. 2, pp. +c 186-197. +c 3. goldfeld, s.m., quandt, r.e., and trotter, h.f. (1966), +c maximization by quadratic hill-climbing, econometrica 34, +c pp. 541-551. +c 4. hebden, m.d. (1973), an algorithm for minimization using exact +c second derivatives, report t.p. 515, theoretical physics +c div., a.e.r.e. harwell, oxon., england. +c 5. more, j.j. (1978), the levenberg-marquardt algorithm, implemen- +c tation and theory, pp.105-116 of springer lecture notes +c in mathematics no. 630, edited by g.a. watson, springer- +c verlag, berlin and new york. +c 6. more, j.j., and sorensen, d.c. (1981), computing a trust region +c step, technical report anl-81-83, argonne national lab. +c 7. varga, r.s. (1965), minimal gerschgorin sets, pacific j. math. 15, +c pp. 719-729. +c +c *** general *** +c +c coded by david m. gay. +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, and +c mcs-7906671. +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + logical restrt + integer dggdmx, diag, diag0, dstsav, emax, emin, i, im1, inc, irc, + 1 j, k, kalim, kamin, k1, lk0, phipin, q, q0, uk0, x + double precision alphak, aki, akk, delta, dst, eps, gtsta, lk, + 1 oldphi, phi, phimax, phimin, psifac, rad, radsq, + 2 root, si, sk, sw, t, twopsi, t1, t2, uk, wi +c +c *** constants *** + double precision big, dgxfac, epsfac, four, half, kappa, negone, + 1 one, p001, six, three, two, zero +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1, dmin1, dsqrt +c/ +c *** external functions and subroutines *** +c + external dotprd, litvmu, livmul, lsqrt, lsvmin, rmdcon, v2norm + double precision dotprd, lsvmin, rmdcon, v2norm +c +c *** subscripts for v *** +c + integer dgnorm, dstnrm, dst0, epslon, gtstep, stppar, nreduc, + 1 phmnfc, phmxfc, preduc, radius, rad0 +c/6 +c data dgnorm/1/, dstnrm/2/, dst0/3/, epslon/19/, gtstep/4/, +c 1 nreduc/6/, phmnfc/20/, phmxfc/21/, preduc/7/, radius/8/, +c 2 rad0/9/, stppar/5/ +c/7 + parameter (dgnorm=1, dstnrm=2, dst0=3, epslon=19, gtstep=4, + 1 nreduc=6, phmnfc=20, phmxfc=21, preduc=7, radius=8, + 2 rad0=9, stppar=5) +c/ +c +c/6 +c data epsfac/50.0d+0/, four/4.0d+0/, half/0.5d+0/, +c 1 kappa/2.0d+0/, negone/-1.0d+0/, one/1.0d+0/, p001/1.0d-3/, +c 2 six/6.0d+0/, three/3.0d+0/, two/2.0d+0/, zero/0.0d+0/ +c/7 + parameter (epsfac=50.0d+0, four=4.0d+0, half=0.5d+0, + 1 kappa=2.0d+0, negone=-1.0d+0, one=1.0d+0, p001=1.0d-3, + 2 six=6.0d+0, three=3.0d+0, two=2.0d+0, zero=0.0d+0) + save dgxfac +c/ + data big/0.d+0/, dgxfac/0.d+0/ +c +c *** body *** +c +c *** store largest abs. entry in (d**-1)*h*(d**-1) at w(dggdmx). + dggdmx = p + 1 +c *** store gerschgorin over- and underestimates of the largest +c *** and smallest eigenvalues of (d**-1)*h*(d**-1) at w(emax) +c *** and w(emin) respectively. + emax = dggdmx + 1 + emin = emax + 1 +c *** for use in recomputing step, the final values of lk, uk, dst, +c *** and the inverse derivative of more*s phi at 0 (for pos. def. +c *** h) are stored in w(lk0), w(uk0), w(dstsav), and w(phipin) +c *** respectively. + lk0 = emin + 1 + phipin = lk0 + 1 + uk0 = phipin + 1 + dstsav = uk0 + 1 +c *** store diag of (d**-1)*h*(d**-1) in w(diag),...,w(diag0+p). + diag0 = dstsav + diag = diag0 + 1 +c *** store -d*step in w(q),...,w(q0+p). + q0 = diag0 + p + q = q0 + 1 +c *** allocate storage for scratch vector x *** + x = q + p + rad = v(radius) + radsq = rad**2 +c *** phitol = max. error allowed in dst = v(dstnrm) = 2-norm of +c *** d*step. + phimax = v(phmxfc) * rad + phimin = v(phmnfc) * rad + psifac = two * v(epslon) / (three * (four * (v(phmnfc) + one) * + 1 (kappa + one) + kappa + two) * rad**2) +c *** oldphi is used to detect limits of numerical accuracy. if +c *** we recompute step and it does not change, then we accept it. + oldphi = zero + eps = v(epslon) + irc = 0 + restrt = .false. + kalim = ka + 50 +c +c *** start or restart, depending on ka *** +c + if (ka .ge. 0) go to 290 +c +c *** fresh start *** +c + k = 0 + uk = negone + ka = 0 + kalim = 50 + v(dgnorm) = v2norm(p, dig) + v(nreduc) = zero + v(dst0) = zero + kamin = 3 + if (v(dgnorm) .eq. zero) kamin = 0 +c +c *** store diag(dihdi) in w(diag0+1),...,w(diag0+p) *** +c + j = 0 + do 10 i = 1, p + j = j + i + k1 = diag0 + i + w(k1) = dihdi(j) + 10 continue +c +c *** determine w(dggdmx), the largest element of dihdi *** +c + t1 = zero + j = p * (p + 1) / 2 + do 20 i = 1, j + t = dabs(dihdi(i)) + if (t1 .lt. t) t1 = t + 20 continue + w(dggdmx) = t1 +c +c *** try alpha = 0 *** +c + 30 call lsqrt(1, p, l, dihdi, irc) + if (irc .eq. 0) go to 50 +c *** indef. h -- underestimate smallest eigenvalue, use this +c *** estimate to initialize lower bound lk on alpha. + j = irc*(irc+1)/2 + t = l(j) + l(j) = one + do 40 i = 1, irc + 40 w(i) = zero + w(irc) = one + call litvmu(irc, w, l, w) + t1 = v2norm(irc, w) + lk = -t / t1 / t1 + v(dst0) = -lk + if (restrt) go to 210 + go to 70 +c +c *** positive definite h -- compute unmodified newton step. *** + 50 lk = zero + t = lsvmin(p, l, w(q), w(q)) + if (t .ge. one) go to 60 + if (big .le. zero) big = rmdcon(6) + if (v(dgnorm) .ge. t*t*big) go to 70 + 60 call livmul(p, w(q), l, dig) + gtsta = dotprd(p, w(q), w(q)) + v(nreduc) = half * gtsta + call litvmu(p, w(q), l, w(q)) + dst = v2norm(p, w(q)) + v(dst0) = dst + phi = dst - rad + if (phi .le. phimax) go to 260 + if (restrt) go to 210 +c +c *** prepare to compute gerschgorin estimates of largest (and +c *** smallest) eigenvalues. *** +c + 70 k = 0 + do 100 i = 1, p + wi = zero + if (i .eq. 1) go to 90 + im1 = i - 1 + do 80 j = 1, im1 + k = k + 1 + t = dabs(dihdi(k)) + wi = wi + t + w(j) = w(j) + t + 80 continue + 90 w(i) = wi + k = k + 1 + 100 continue +c +c *** (under-)estimate smallest eigenvalue of (d**-1)*h*(d**-1) *** +c + k = 1 + t1 = w(diag) - w(1) + if (p .le. 1) go to 120 + do 110 i = 2, p + j = diag0 + i + t = w(j) - w(i) + if (t .ge. t1) go to 110 + t1 = t + k = i + 110 continue +c + 120 sk = w(k) + j = diag0 + k + akk = w(j) + k1 = k*(k-1)/2 + 1 + inc = 1 + t = zero + do 150 i = 1, p + if (i .eq. k) go to 130 + aki = dabs(dihdi(k1)) + si = w(i) + j = diag0 + i + t1 = half * (akk - w(j) + si - aki) + t1 = t1 + dsqrt(t1*t1 + sk*aki) + if (t .lt. t1) t = t1 + if (i .lt. k) go to 140 + 130 inc = i + 140 k1 = k1 + inc + 150 continue +c + w(emin) = akk - t + uk = v(dgnorm)/rad - w(emin) + if (v(dgnorm) .eq. zero) uk = uk + p001 + p001*uk + if (uk .le. zero) uk = p001 +c +c *** compute gerschgorin (over-)estimate of largest eigenvalue *** +c + k = 1 + t1 = w(diag) + w(1) + if (p .le. 1) go to 170 + do 160 i = 2, p + j = diag0 + i + t = w(j) + w(i) + if (t .le. t1) go to 160 + t1 = t + k = i + 160 continue +c + 170 sk = w(k) + j = diag0 + k + akk = w(j) + k1 = k*(k-1)/2 + 1 + inc = 1 + t = zero + do 200 i = 1, p + if (i .eq. k) go to 180 + aki = dabs(dihdi(k1)) + si = w(i) + j = diag0 + i + t1 = half * (w(j) + si - aki - akk) + t1 = t1 + dsqrt(t1*t1 + sk*aki) + if (t .lt. t1) t = t1 + if (i .lt. k) go to 190 + 180 inc = i + 190 k1 = k1 + inc + 200 continue +c + w(emax) = akk + t + lk = dmax1(lk, v(dgnorm)/rad - w(emax)) +c +c *** alphak = current value of alpha (see alg. notes above). we +c *** use more*s scheme for initializing it. + alphak = dabs(v(stppar)) * v(rad0)/rad +c + if (irc .ne. 0) go to 210 +c +c *** compute l0 for positive definite h *** +c + call livmul(p, w, l, w(q)) + t = v2norm(p, w) + w(phipin) = dst / t / t + lk = dmax1(lk, phi*w(phipin)) +c +c *** safeguard alphak and add alphak*i to (d**-1)*h*(d**-1) *** +c + 210 ka = ka + 1 + if (-v(dst0) .ge. alphak .or. alphak .lt. lk .or. alphak .ge. uk) + 1 alphak = uk * dmax1(p001, dsqrt(lk/uk)) + if (alphak .le. zero) alphak = half * uk + if (alphak .le. zero) alphak = uk + k = 0 + do 220 i = 1, p + k = k + i + j = diag0 + i + dihdi(k) = w(j) + alphak + 220 continue +c +c *** try computing cholesky decomposition *** +c + call lsqrt(1, p, l, dihdi, irc) + if (irc .eq. 0) go to 240 +c +c *** (d**-1)*h*(d**-1) + alphak*i is indefinite -- overestimate +c *** smallest eigenvalue for use in updating lk *** +c + j = (irc*(irc+1))/2 + t = l(j) + l(j) = one + do 230 i = 1, irc + 230 w(i) = zero + w(irc) = one + call litvmu(irc, w, l, w) + t1 = v2norm(irc, w) + lk = alphak - t/t1/t1 + v(dst0) = -lk + go to 210 +c +c *** alphak makes (d**-1)*h*(d**-1) positive definite. +c *** compute q = -d*step, check for convergence. *** +c + 240 call livmul(p, w(q), l, dig) + gtsta = dotprd(p, w(q), w(q)) + call litvmu(p, w(q), l, w(q)) + dst = v2norm(p, w(q)) + phi = dst - rad + if (phi .le. phimax .and. phi .ge. phimin) go to 270 + if (phi .eq. oldphi) go to 270 + oldphi = phi + if (phi .lt. zero) go to 330 +c +c *** unacceptable alphak -- update lk, uk, alphak *** +c + 250 if (ka .ge. kalim) go to 270 +c *** the following dmin1 is necessary because of restarts *** + if (phi .lt. zero) uk = dmin1(uk, alphak) +c *** kamin = 0 only iff the gradient vanishes *** + if (kamin .eq. 0) go to 210 + call livmul(p, w, l, w(q)) + t1 = v2norm(p, w) + alphak = alphak + (phi/t1) * (dst/t1) * (dst/rad) + lk = dmax1(lk, alphak) + go to 210 +c +c *** acceptable step on first try *** +c + 260 alphak = zero +c +c *** successful step in general. compute step = -(d**-1)*q *** +c + 270 do 280 i = 1, p + j = q0 + i + step(i) = -w(j)/d(i) + 280 continue + v(gtstep) = -gtsta + v(preduc) = half * (dabs(alphak)*dst*dst + gtsta) + go to 410 +c +c +c *** restart with new radius *** +c + 290 if (v(dst0) .le. zero .or. v(dst0) - rad .gt. phimax) go to 310 +c +c *** prepare to return newton step *** +c + restrt = .true. + ka = ka + 1 + k = 0 + do 300 i = 1, p + k = k + i + j = diag0 + i + dihdi(k) = w(j) + 300 continue + uk = negone + go to 30 +c + 310 kamin = ka + 3 + if (v(dgnorm) .eq. zero) kamin = 0 + if (ka .eq. 0) go to 50 +c + dst = w(dstsav) + alphak = dabs(v(stppar)) + phi = dst - rad + t = v(dgnorm)/rad + uk = t - w(emin) + if (v(dgnorm) .eq. zero) uk = uk + p001 + p001*uk + if (uk .le. zero) uk = p001 + if (rad .gt. v(rad0)) go to 320 +c +c *** smaller radius *** + lk = zero + if (alphak .gt. zero) lk = w(lk0) + lk = dmax1(lk, t - w(emax)) + if (v(dst0) .gt. zero) lk = dmax1(lk, (v(dst0)-rad)*w(phipin)) + go to 250 +c +c *** bigger radius *** + 320 if (alphak .gt. zero) uk = dmin1(uk, w(uk0)) + lk = dmax1(zero, -v(dst0), t - w(emax)) + if (v(dst0) .gt. zero) lk = dmax1(lk, (v(dst0)-rad)*w(phipin)) + go to 250 +c +c *** decide whether to check for special case... in practice (from +c *** the standpoint of the calling optimization code) it seems best +c *** not to check until a few iterations have failed -- hence the +c *** test on kamin below. +c + 330 delta = alphak + dmin1(zero, v(dst0)) + twopsi = alphak*dst*dst + gtsta + if (ka .ge. kamin) go to 340 +c *** if the test in ref. 2 is satisfied, fall through to handle +c *** the special case (as soon as the more-sorensen test detects +c *** it). + if (delta .ge. psifac*twopsi) go to 370 +c +c *** check for the special case of h + alpha*d**2 (nearly) +c *** singular. use one step of inverse power method with start +c *** from lsvmin to obtain approximate eigenvector corresponding +c *** to smallest eigenvalue of (d**-1)*h*(d**-1). lsvmin returns +c *** x and w with l*w = x. +c + 340 t = lsvmin(p, l, w(x), w) +c +c *** normalize w *** + do 350 i = 1, p + 350 w(i) = t*w(i) +c *** complete current inv. power iter. -- replace w by (l**-t)*w. + call litvmu(p, w, l, w) + t2 = one/v2norm(p, w) + do 360 i = 1, p + 360 w(i) = t2*w(i) + t = t2 * t +c +c *** now w is the desired approximate (unit) eigenvector and +c *** t*x = ((d**-1)*h*(d**-1) + alphak*i)*w. +c + sw = dotprd(p, w(q), w) + t1 = (rad + dst) * (rad - dst) + root = dsqrt(sw*sw + t1) + if (sw .lt. zero) root = -root + si = t1 / (sw + root) +c +c *** the actual test for the special case... +c + if ((t2*si)**2 .le. eps*(dst**2 + alphak*radsq)) go to 380 +c +c *** update upper bound on smallest eigenvalue (when not positive) +c *** (as recommended by more and sorensen) and continue... +c + if (v(dst0) .le. zero) v(dst0) = dmin1(v(dst0), t2**2 - alphak) + lk = dmax1(lk, -v(dst0)) +c +c *** check whether we can hope to detect the special case in +c *** the available arithmetic. accept step as it is if not. +c +c *** if not yet available, obtain machine dependent value dgxfac. + 370 if (dgxfac .eq. zero) dgxfac = epsfac * rmdcon(3) +c + if (delta .gt. dgxfac*w(dggdmx)) go to 250 + go to 270 +c +c *** special case detected... negate alphak to indicate special case +c + 380 alphak = -alphak + v(preduc) = half * twopsi +c +c *** accept current step if adding si*w would lead to a +c *** further relative reduction in psi of less than v(epslon)/3. +c + t1 = zero + t = si*(alphak*sw - half*si*(alphak + t*dotprd(p,w(x),w))) + if (t .lt. eps*twopsi/six) go to 390 + v(preduc) = v(preduc) + t + dst = rad + t1 = -si + 390 do 400 i = 1, p + j = q0 + i + w(j) = t1*w(i) - w(j) + step(i) = w(j) / d(i) + 400 continue + v(gtstep) = dotprd(p, dig, w(q)) +c +c *** save values for use in a possible restart *** +c + 410 v(dstnrm) = dst + v(stppar) = alphak + w(lk0) = lk + w(uk0) = uk + v(rad0) = rad + w(dstsav) = dst +c +c *** restore diagonal of dihdi *** +c + j = 0 + do 420 i = 1, p + j = j + i + k = diag0 + i + dihdi(j) = w(k) + 420 continue +c + 999 return +c +c *** last card of gqtst follows *** + end + subroutine lsqrt(n1, n, l, a, irc) +c +c *** compute rows n1 through n of the cholesky factor l of +c *** a = l*(l**t), where l and the lower triangle of a are both +c *** stored compactly by rows (and may occupy the same storage). +c *** irc = 0 means all went well. irc = j means the leading +c *** principal j x j submatrix of a is not positive definite -- +c *** and l(j*(j+1)/2) contains the (nonpos.) reduced j-th diagonal. +c +c *** parameters *** +c + integer n1, n, irc +cal double precision l(1), a(1) + double precision l(n*(n+1)/2), a(n*(n+1)/2) +c dimension l(n*(n+1)/2), a(n*(n+1)/2) +c +c *** local variables *** +c + integer i, ij, ik, im1, i0, j, jk, jm1, j0, k + double precision t, td, zero +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c +c *** body *** +c + i0 = n1 * (n1 - 1) / 2 + do 50 i = n1, n + td = zero + if (i .eq. 1) go to 40 + j0 = 0 + im1 = i - 1 + do 30 j = 1, im1 + t = zero + if (j .eq. 1) go to 20 + jm1 = j - 1 + do 10 k = 1, jm1 + ik = i0 + k + jk = j0 + k + t = t + l(ik)*l(jk) + 10 continue + 20 ij = i0 + j + j0 = j0 + j + t = (a(ij) - t) / l(j0) + l(ij) = t + td = td + t*t + 30 continue + 40 i0 = i0 + i + t = a(i0) - td + if (t .le. zero) go to 60 + l(i0) = dsqrt(t) + 50 continue +c + irc = 0 + go to 999 +c + 60 l(i0) = t + irc = i +c + 999 return +c +c *** last card of lsqrt *** + end + double precision function lsvmin(p, l, x, y) +c +c *** estimate smallest sing. value of packed lower triang. matrix l +c +c *** parameter declarations *** +c + integer p +cal double precision l(1), x(p), y(p) + double precision l(p*(p+1)/2), x(p), y(p) +c dimension l(p*(p+1)/2) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** purpose *** +c +c this function returns a good over-estimate of the smallest +c singular value of the packed lower triangular matrix l. +c +c *** parameter description *** +c +c p (in) = the order of l. l is a p x p lower triangular matrix. +c l (in) = array holding the elements of l in row order, i.e. +c l(1,1), l(2,1), l(2,2), l(3,1), l(3,2), l(3,3), etc. +c x (out) if lsvmin returns a positive value, then x is a normalized +c approximate left singular vector corresponding to the +c smallest singular value. this approximation may be very +c crude. if lsvmin returns zero, then some components of x +c are zero and the rest retain their input values. +c y (out) if lsvmin returns a positive value, then y = (l**-1)*x is an +c unnormalized approximate right singular vector correspond- +c ing to the smallest singular value. this approximation +c may be crude. if lsvmin returns zero, then y retains its +c input value. the caller may pass the same vector for x +c and y (nonstandard fortran usage), in which case y over- +c writes x (for nonzero lsvmin returns). +c +c *** algorithm notes *** +c +c the algorithm is based on (1), with the additional provision that +c lsvmin = 0 is returned if the smallest diagonal element of l +c (in magnitude) is not more than the unit roundoff times the +c largest. the algorithm uses a random number generator proposed +c in (4), which passes the spectral test with flying colors -- see +c (2) and (3). +c +c *** subroutines and functions called *** +c +c v2norm - function, returns the 2-norm of a vector. +c +c *** references *** +c +c (1) cline, a., moler, c., stewart, g., and wilkinson, j.h.(1977), +c an estimate for the condition number of a matrix, report +c tm-310, applied math. div., argonne national laboratory. +c +c (2) hoaglin, d.c. (1976), theoretical properties of congruential +c random-number generators -- an empirical view, +c memorandum ns-340, dept. of statistics, harvard univ. +c +c (3) knuth, d.e. (1969), the art of computer programming, vol. 2 +c (seminumerical algorithms), addison-wesley, reading, mass. +c +c (4) smith, c.s. (1971), multiplicative pseudo-random number +c generators with prime modulus, j. assoc. comput. mach. 18, +c pp. 586-593. +c +c *** history *** +c +c designed and coded by david m. gay (winter 1977/summer 1978). +c +c *** general *** +c +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, and mcs76-11989. +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer i, ii, ix, j, ji, jj, jjj, jm1, j0, pm1 + double precision b, sminus, splus, t, xminus, xplus +c +c *** constants *** +c + double precision half, one, r9973, zero +c +c *** intrinsic functions *** +c/+ + integer mod + real float + double precision dabs +c/ +c *** external functions and subroutines *** +c + external dotprd, v2norm, vaxpy + double precision dotprd, v2norm +c +c/6 +c data half/0.5d+0/, one/1.d+0/, r9973/9973.d+0/, zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, r9973=9973.d+0, zero=0.d+0) +c/ +c +c *** body *** +c + ix = 2 + pm1 = p - 1 +c +c *** first check whether to return lsvmin = 0 and initialize x *** +c + ii = 0 + j0 = p*pm1/2 + jj = j0 + p + if (l(jj) .eq. zero) go to 110 + ix = mod(3432*ix, 9973) + b = half*(one + float(ix)/r9973) + xplus = b / l(jj) + x(p) = xplus + if (p .le. 1) go to 60 + do 10 i = 1, pm1 + ii = ii + i + if (l(ii) .eq. zero) go to 110 + ji = j0 + i + x(i) = xplus * l(ji) + 10 continue +c +c *** solve (l**t)*x = b, where the components of b have randomly +c *** chosen magnitudes in (.5,1) with signs chosen to make x large. +c +c do j = p-1 to 1 by -1... + do 50 jjj = 1, pm1 + j = p - jjj +c *** determine x(j) in this iteration. note for i = 1,2,...,j +c *** that x(i) holds the current partial sum for row i. + ix = mod(3432*ix, 9973) + b = half*(one + float(ix)/r9973) + xplus = (b - x(j)) + xminus = (-b - x(j)) + splus = dabs(xplus) + sminus = dabs(xminus) + jm1 = j - 1 + j0 = j*jm1/2 + jj = j0 + j + xplus = xplus/l(jj) + xminus = xminus/l(jj) + if (jm1 .eq. 0) go to 30 + do 20 i = 1, jm1 + ji = j0 + i + splus = splus + dabs(x(i) + l(ji)*xplus) + sminus = sminus + dabs(x(i) + l(ji)*xminus) + 20 continue + 30 if (sminus .gt. splus) xplus = xminus + x(j) = xplus +c *** update partial sums *** + if (jm1 .gt. 0) call vaxpy(jm1, x, xplus, l(j0+1), x) + 50 continue +c +c *** normalize x *** +c + 60 t = one/v2norm(p, x) + do 70 i = 1, p + 70 x(i) = t*x(i) +c +c *** solve l*y = x and return lsvmin = 1/twonorm(y) *** +c + do 100 j = 1, p + jm1 = j - 1 + j0 = j*jm1/2 + jj = j0 + j + t = zero + if (jm1 .gt. 0) t = dotprd(jm1, l(j0+1), y) + y(j) = (x(j) - t) / l(jj) + 100 continue +c + lsvmin = one/v2norm(p, y) + go to 999 +c + 110 lsvmin = zero + 999 return +c *** last card of lsvmin follows *** + end + subroutine slvmul(p, y, s, x) +c +c *** set y = s * x, s = p x p symmetric matrix. *** +c *** lower triangle of s stored rowwise. *** +c +c *** parameter declarations *** +c + integer p +cal double precision s(1), x(p), y(p) + double precision s(p*(p+1)/2), x(p), y(p) +c dimension s(p*(p+1)/2) +c +c *** local variables *** +c + integer i, im1, j, k + double precision xi +c +c *** no intrinsic functions *** +c +c *** external function *** +c + external dotprd + double precision dotprd +c +c----------------------------------------------------------------------- +c + j = 1 + do 10 i = 1, p + y(i) = dotprd(i, s(j), x) + j = j + i + 10 continue +c + if (p .le. 1) go to 999 + j = 1 + do 40 i = 2, p + xi = x(i) + im1 = i - 1 + j = j + 1 + do 30 k = 1, im1 + y(k) = y(k) + s(j)*xi + j = j + 1 + 30 continue + 40 continue +c + 999 return +c *** last card of slvmul follows *** + end diff --git a/source/maxlik/src_CSA/log b/source/maxlik/src_CSA/log new file mode 100644 index 0000000..b503944 --- /dev/null +++ b/source/maxlik/src_CSA/log @@ -0,0 +1,2 @@ +f77 -c -g -fbounds-check -I. maxlik-opt-el.f +f77 -o ../bin/maxlik-opt-el maxlik-opt-el.o minsumsl.o sumsld.o cored.o rmdd.o diff --git a/source/maxlik/src_CSA/maxlik-opt-el.f b/source/maxlik/src_CSA/maxlik-opt-el.f new file mode 100644 index 0000000..7ff3c24 --- /dev/null +++ b/source/maxlik/src_CSA/maxlik-opt-el.f @@ -0,0 +1,319 @@ + implicit none + include "DIMENSIONS" + include "COMMON.CALC" + integer i,j,k,l,ii,nf,n,uiparm(1) + double precision x(maxene) + double precision rmsave(maxT),fdum,rr + external fdum,funclik + double precision quot,quotl,f,T0 /300.0d0/ + character*8 ename(maxene) + common /names/ ename + character*1 restyp(nbase) + data restyp /'A','G','C','T','U'/ + character maskchar(0:1) /' ','*'/ + character*80 Naresfile,Fracfile + double precision g(100) +c print *,"start" + read(1,*) nene,sigma2,wsq + write (2,*) "nene",nene," nT",nT," sigma",sigma2 + read(1,*) (ename(i),i=1,nene) + read(1,*) (weight(i),i=1,nene) + read(1,*) (iweight(i),i=1,nene) + read(1,*) (mask(i),i=1,nene) + do i=1,nnbase + read(1,*) sig0(i),(weightel(3*(i-1)+j),maskel(3*(i-1)+j),j=1,3) + enddo + read(1,'(a)') Naresfile + read(1,'(a)') Fracfile + close(1) + open(7,file=Naresfile,status='old') + i=0 + do +c print *,"i=",i + read(7,*,end=10,err=10) ii,(enetb(j,i+1),j=1,nene), + & ((eletb(3*(j-1)+k,i+1),j=1,nnbase),k=1,3), + & entfac(i+1), + & qtab(i+1),rmstab(i+1),rgytab(i+1), + & fpair(i+1),rr,fdup(i+1) + i=i+1 + enddo + 10 continue + nconf=i + close(7) + write (2,*) "nconf",nconf + write (2,'(/"Initial energy-term weights (* optimized)")') + write (2,'(i5,2x,a4,f10.5,1x,a1,i5)') + & (j,ename(j),weight(j),maskchar(mask(j)),iweight(j),j=1,nene) + ii=0 + write (2,*) + & "Initial base-dipole-interaction parameters (* optimizable)" + do i=1,nbase + do j=1,i + ii=ii+1 + write (2,'(2a2,f10.5,3(f10.5,1x,a1))') restyp(i),restyp(j), + & sig0(ii),(weightel(3*(ii-1)+k),maskchar(maskel(3*(ii-1)+k)), + & k=1,3) + enddo + enddo + write (2,*) "sigma",sigma2," wsq",wsq + sigma2=sigma2*sigma2 + close(7) + open(7,file=Fracfile,status='old') + i=0 + do + read(7,*,end=11,err=11) temper(i+1),frac(i+1) + i=i+1 + enddo + 11 continue + nT=i + close(7) + write (2,*) "Fractions of base pairs" + do i=1,nT + write (2,'(i5,f8.1,f10.5)') i,temper(i),frac(i) + enddo +c Transfer weights to variables + call w2x(n,x) + write (2,*) "n",n +c Compute the temperature scale factors + do i=1,nT + ft(1,i)=1.0d0 + quot=temper(i)/T0 + quotl=1.0d0 + do l=2,2 + quotl=quotl*quot + fT(l,i)=1.12692801104297249644d0/ + & dlog(dexp(quotl)+dexp(-quotl)) + enddo + enddo +c do i=1,nT +c write (2,'(i5,f8.3,f10.5)') (i,(ft(j,i),j=1,2),i=1,nT) +c enddo + + call funclik(n,x,nf,f,uiparm,rmsave,fdum) + write (2,*) "f",f + write(2,'(/a3,a8,3a10)')" Nr"," Temp"," rmsave", + & " fave"," fave(exp)" + do i=1,nT + write (2,'(i3,f8.1,3f10.5)') i,temper(i),rmsave(i), + & fave(i),frac(i) + enddo +c call grad(n,x,nf,g,uiparm,rmsave,fdum) +c write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f +c stop + call minsumsl(n,x,f) + call funclik(n,x,nf,f,uiparm,rmsave,fdum) + write (2,'(/"Final parameters (",i5,")")') n + do i=1,n + write (2,'(i5,f10.5)') i,x(i) + enddo + write (2,'(/"Energy-term weights (* optimized)")') + write (2,'(i5,2x,a4,f10.5,1x,a1,i5)') + & (j,ename(j),weight(j),maskchar(mask(j)),iweight(j),j=1,nene) + write (2,*) "Base-dipole-interaction parameters (* optimized)" + ii=0 + do i=1,nbase + do j=1,i + ii=ii+1 + write (2,'(2a2,f10.5,3(f10.5,1x,a1))') restyp(i),restyp(j), + & sig0(ii),(weightel(3*(ii-1)+k),maskchar(maskel(3*(ii-1)+k)), + & k=1,3) + enddo + enddo + write (2,*) "f",f + write(2,'(/a3,a8,3a10)')" Nr"," Temp"," rmsave", + & " fave"," fave(exp)" + do i=1,nT + write (2,'(i3,f8.1,3f10.5)') i,temper(i),rmsave(i), + & fave(i),frac(i) + enddo + +c do i=10,30 +c do k=10,30 +c weight(6)=0.1d0*i +c weight(1)=0.1d0*k +c write (2,'(i5,2x,a4,f10.5,i5)') +c & (j,ename(j),weight(j),iweight(j),j=1,nene) +c call funclik(nene,weight,nf,f,uiparm,rmsave,fdum) +c write (2,*) "f",f +c enddo +c enddo + stop + end +c------------------------------------------------------------------------------- + subroutine funclik(n,x,nf,f,uiparm,rmsave,ufparm) + implicit none + include "DIMENSIONS" + include "COMMON.CALC" + character*8 ename(maxene) + common /names/ ename + integer n,nf + double precision f,loglik,chisq + double precision x(n) + integer uiparm + double precision ufparm + external ufparm + double precision ww(maxene),sumlik(maxT),rmsave(maxT) + integer it,i,j,k + double precision beta,over,boltz,sumQ,ener(maxconf),emin,ee,enel, + & sumover,eboltz + call x2w(n,x) + loglik=0.0d0 + chisq=0.0d0 + do iT=1,nT + do i=1,nene + ww(i)=weight(i)*ft(iweight(i),iT) + enddo +c write (2,*) "iT",iT," temper",temper(iT)," beta",beta +c write (2,'(i5,2x,a4,2f10.5,i5,f10.5)') +c & (i,ename(i),weight(i),ww(i),iweight(i),ft(iweight(i),iT), +c & i=1,n) + beta=1.0d0/(temper(iT)*1.987D-3) +c write (2,*) "beta",beta + emin=1.0d10 + do i=1,nconf + enel=0.0d0 + do j=1,nnbase +c write (2,*) +c & i,j,sig0(j),(weightel(3*(j-1)+k),eletb(3*(j-1)+k,i),k=1,3) + enel=enel+weightel(3*(j-1)+1)*sig0(j)**6*eletb(3*(j-1)+1,i) + & +weightel(3*(j-1)+2)*sig0(j)**3*eletb(3*(j-1)+2,i) + & +weightel(3*j)*sig0(j)**6*eletb(3*j,i) + enddo +c write (2,*) i,enel,enetb(6,i) + enetb(6,i)=enel + ener(i)=0.0d0 + do j=1,nene + ener(i)=ener(i)+ww(j)*enetb(j,i) + enddo + ee = ener(i)-entfac(i)/beta + if (ee.lt.emin) emin=ee + enddo + rmsave(it)=0.0d0 + sumlik(it)=0.0d0 + fave(it)=0.0d0 + sumQ=0.0d0 + sumover=0.0d0 + do i=1,nconf + boltz=-beta*(ener(i)-emin)+entfac(i) + eboltz=dexp(boltz) + rmsave(iT)=rmsave(iT)+rmstab(i)*dexp(boltz) + over=dexp(-0.5d0*rmstab(i)**2/sigma2) + if (frac(iT).lt.0.5d0) over=1.0d0-over + sumover=sumover+over +c write (2,*) i,ener(i),entfac(i),rmstab(i),fpair(i),fdup(i), +c & over,boltz,eboltz + fave(iT)=fave(iT)+fdup(i)*eboltz + sumQ=sumQ+eboltz + sumlik(iT)=sumlik(iT)+over*boltz + enddo + fave(iT)=fave(iT)/sumq + sumlik(it)=sumlik(iT)-dlog(sumQ)*sumover + rmsave(iT)=rmsave(iT)/sumQ + if (frac(iT).gt.0.95d0 .or. frac(iT).lt.0.05d0) then + loglik=loglik-sumlik(iT) + endif + chisq=chisq+(frac(iT)-fave(iT))**2 +c write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover, +c & fave(iT),frac(iT) +c call flush(2) + enddo + f = loglik/nconf+wsq*chisq +c write (2,*) "loglik",loglik/nconf," chisq",chisq," f",f + return + end +c------------------------------------------------------------------------------- + subroutine grad(n,x,nf,g,uiparm,urparm,ufparm) + implicit none + integer n,nf,uiparm(1) + double precision x(n),g(n),urparm(1),ufparm + external ufparm + integer i + double precision xi,fplus,fminus,delta/1.0d-9/,delta2/2.0d-9/ + do i=1,n + xi=x(i) + x(i)=xi+delta + call funclik(n,x,nf,fplus,uiparm,urparm,ufparm) + x(i)=xi-delta + call funclik(n,x,nf,fminus,uiparm,urparm,ufparm) + g(i)=(fplus-fminus)/delta2 +c write(2,*) i,fplus,fminus,g(i) + enddo + return + end +c------------------------------------------------------------------------------- + double precision function fdum() + fdum=0.0d0 + return + end +c------------------------------------------------------------------------------- + logical function stopx(idum) + integer idum + stopx=.false. + return + end +c------------------------------------------------------------------------------- + subroutine x2w(n,x) + include "DIMENSIONS" + include "COMMON.CALC" + double precision fabs + integer n,i,ii + double precision x(n) + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + weight(i)=fabs(x(ii)) + endif + enddo + do i=1,nnbase + if (maskel(3*(i-1)+1).gt.0) then + ii=ii+1 + weightel(3*(i-1)+1)=-fabs(x(ii)) + endif + if (maskel(3*(i-1)+2).gt.0) then + ii=ii+1 + weightel(3*(i-1)+2)=x(ii) + endif + if (maskel(3*i).gt.0) then + ii=ii+1 + weightel(3*i)=-fabs(x(ii)) + endif + enddo + return + end +c------------------------------------------------------------------------------- + subroutine w2x(n,x) + include "DIMENSIONS" + include "COMMON.CALC" + integer n,i,ii + double precision x(maxene+3*nnbase) + ii=0 + do i=1,nene +c write (2,*) "i",i," mask",mask(i)," ii",ii + if (mask(i).gt.0) then + ii=ii+1 + x(ii)=weight(i) + endif + enddo + do i=1,3*nnbase +c write (2,*) "i",i," maskel",maskel(i)," ii",ii + if (maskel(i).gt.0) then + ii=ii+1 + x(ii)=weightel(i) + endif + enddo + n=ii +c write (2,*) "W2X: n=",n + return + end +c------------------------------------------------------------------------------------ + double precision function fabs(x) + double precision x + double precision a /100.0d0/ + if (dabs(x).gt.1.0d-2) then + fabs = dabs(x) + else + fabs = dlog(dexp(a*x)+dexp(-a*x))/a + endif + return + end diff --git a/source/maxlik/src_CSA/maxlik-opt-multprot.f b/source/maxlik/src_CSA/maxlik-opt-multprot.f new file mode 100644 index 0000000..e51674f --- /dev/null +++ b/source/maxlik/src_CSA/maxlik-opt-multprot.f @@ -0,0 +1,254 @@ + implicit none + include "DIMENSIONS" + include "COMMON.CALC" + integer i,j,k,l,ii,iprot,nf,n,uiparm(1),ienecheck + double precision x(maxene) + double precision urparm(1),fdum,rjunk + external fdum,funclik + double precision quot,quotl,f,T0 /300.0d0/ + character*8 ename(maxene) + character*480 karta + common /names/ ename + character*32 protfile(maxprot) +c print *,"start" + read(1,*) nprot,nene,sigma2,temper(1),ienecheck + nT = 1 + write (2,*) "nene",nene," nT",nT," sigma",sigma2, + & " ienechek",ienecheck + read(1,*) (ename(i),i=1,nene) + read(1,*) (weight(i),i=1,nene) +c read(1,*) (iweight(i),i=1,nene) + read(1,*) (mask(i),i=1,nene) +c read(1,*) (temper(i),i=1,nT) + + do iprot=1,nprot + + read (1,'(2a)') protname(iprot) + read (1,'(2a)') protfile(iprot) + + write (2,*) "Reading data for protein ",protname(iprot) + write (2,*) "File: ",protfile(iprot) + + open (7,file=protfile(iprot),status='old') + + i=0 + do +c print *,"i=",i + read(7,'(a)',end=10) karta + if (index(karta,'#').gt.0) cycle + read(karta,*,end=10,err=10) ii,(enetb(j,i+1,iprot),j=1,nene), + & ener0(i+1,iprot),rmstab(i+1,iprot),rjunk,rjunk,qtab(i+1,iprot) + i=i+1 + enddo + 10 continue + nconf(iprot)=i + do i=1,nconf(iprot) + entfac(i,iprot)=0.0d0 + enddo + write (2,*) "Protein:",iprot, " nconf",nconf(iprot) + + close(7) + + enddo ! iprot + + write (2,'(i5,2x,a4,f10.5,2i5)') + & (i,ename(i),weight(i),iweight(i),mask(i),i=1,nene) + sigma2=sigma2*sigma2 +c Transfer weights to variables + call w2x(n,x) +c write (2,*) "BEFORE funclik: x",(x(i),i=1,n) + call funclik(n,x,nf,f,uiparm,urparm,fdum) + + if (ienecheck.gt.0) then + write (2,*) "Checking energies" + do iprot=1,nprot + write (2,*) "Protein",iprot," name",protname(iprot) + write (2,'(a5,2a15)') "Conf","UNRES-calc E","Initial E" + do i=1,nconf(iprot) + write (2,'(i5,2e15.5)') i,ener0(i,iprot),ener(i,iprot) + enddo + enddo + endif + + do iprot=1,nprot + write (2,*) "Protein",iprot," name",protname(iprot) + write (2,*) "Initial average rmsd(s)" + write (2,*) "rmsave",(rmsave(i,iprot),i=1,nT) + enddo + write (2,*) "Initial target function f",f + + call minsumsl(n,x,f) + write (2,*) "n",n," x",(x(i),i=1,n) + write (2,'(i5,2x,a4,f10.5,i5)') + & (j,ename(j),weight(j),iweight(j),j=1,nene) + write (2,*) "f",f + call funclik(n,x,nf,f,uiparm,urparm,fdum) + + do iprot=1,nprot + write (2,*) "Protein",iprot," name",protname(iprot) + write (2,*) "rmsave",(rmsave(i,iprot),i=1,nT) + enddo + write (2,*) "Final target function f",f + +c do i=10,30 +c do k=10,30 +c weight(6)=0.1d0*i +c weight(1)=0.1d0*k +c write (2,'(i5,2x,a4,f10.5,i5)') +c & (j,ename(j),weight(j),iweight(j),j=1,nene) +c call funclik(nene,weight,nf,f,uiparm,rmsave,fdum) +c write (2,*) "f",f +c enddo +c enddo + stop + end +c------------------------------------------------------------------------------- + subroutine funclik(n,x,nf,f,uiparm,urparm,ufparm) + implicit none + include "DIMENSIONS" + include "COMMON.CALC" + character*8 ename(maxene) + common /names/ ename + integer n,nf,iprot + double precision f + double precision x(n) + integer uiparm + double precision ufparm + external ufparm + double precision ww(maxene) + double precision urparm(1) + integer it,i,j + double precision beta,over,boltz,sumQ,emin,ee, + & sumover +c write (2,*) "funclik: x",(x(i),i=1,n) + call x2w(n,x) + f=0.0d0 + + +c do iT=1,nT +c write (2,'(i5,2x,a4,f10.5,i5)') +c & (i,ename(i),weight(i),ww(i),iweight(i),ft(iweight(i),iT), +c & (i,ename(i),weight(i),iweight(i), +c & i=21,20+n) +c enddo + + do iprot=1,nprot + + do iT=1,nT + do i=1,nene + ww(i)=weight(i) + enddo + beta=1.0d0/(temper(iT)*1.987D-3) +c write (2,*) "iprot",iprot," iT",iT," temper",temper(iT), +c & " beta",beta +c write (2,*) "beta",beta + emin=1.0d10 + do i=1,nconf(iprot) + ener(i,iprot)=0.0d0 + do j=1,nene + ener(i,iprot)=ener(i,iprot)+ww(j)*enetb(j,i,iprot) + enddo + ee = ener(i,iprot)-entfac(i,iprot)/beta + if (ee.lt.emin) emin=ee + enddo + rmsave(it,iprot)=0.0d0 + sumlik(it,iprot)=0.0d0 + sumQ=0.0d0 + sumover=0.0d0 + do i=1,nconf(iprot) + over=dexp(-0.5d0*rmstab(i,iprot)**2/sigma2) +c if (temper(iT).gt.340.0d0) over=1.0d0-over + sumover=sumover+over + boltz=-beta*(ener(i,iprot)-emin)+entfac(i,iprot) +c write (2,*) i,ener(i),entfac(i),rmstab(i),over,boltz, +c & dexp(boltz) + sumQ=sumQ+dexp(boltz) + rmsave(iT,iprot)=rmsave(iT,iprot)+rmstab(i,iprot)*dexp(boltz) + sumlik(iT,iprot)=sumlik(iT,iprot)+over*boltz + enddo + sumlik(it,iprot)=sumlik(iT,iprot)-dlog(sumQ)*sumover + rmsave(iT,iprot)=rmsave(iT,iprot)/sumQ +c write (2,*) iprot,iT,temper(iT),rmsave(iT,iprot), +c & sumlik(iT,iprot),sumQ,sumover +c write (2,*) iT,temper(iT),rmsave(iT,iprot),sumlik(iT,iprot), +c & sumQ,sumover + f=f-sumlik(iT,iprot) + enddo + + enddo ! iprot + + return + end +c------------------------------------------------------------------------------- + subroutine grad(n,x,nf,g,uiparm,urparm,ufparm) + implicit none + integer n,nf,uiparm(1) + double precision x(n),g(n),urparm(1),ufparm + external ufparm + integer i + double precision xi,fplus,fminus,delta/1.0d-9/,delta2/2.0d-9/ + do i=1,n + xi=x(i) + x(i)=xi+delta + call funclik(n,x,nf,fplus,uiparm,urparm,ufparm) + x(i)=xi-delta + call funclik(n,x,nf,fminus,uiparm,urparm,ufparm) + g(i)=(fplus-fminus)/delta2 +c write(2,*) i,fplus,fminus,g(i) + enddo + return + end +c------------------------------------------------------------------------------- + double precision function fdum() + fdum=0.0d0 + return + end +c------------------------------------------------------------------------------- + logical function stopx(idum) + integer idum + stopx=.false. + return + end +c------------------------------------------------------------------------------- + subroutine x2w(n,x) + include "DIMENSIONS" + include "COMMON.CALC" + integer n,i,ii + double precision x(n) + double precision fabs + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + weight(i)=fabs(x(ii)) + endif + enddo + return + end +c------------------------------------------------------------------------------- + subroutine w2x(n,x) + include "DIMENSIONS" + include "COMMON.CALC" + integer n,i,ii + double precision x(maxene) + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + x(ii)=weight(i) + endif + enddo + n=ii + return + end +c------------------------------------------------------------------------------- + double precision function fabs(x) + double precision x + double precision a /1.0d4/ + if (dabs(x).gt.1.0d-2) then + fabs = dabs(x) + else + fabs = dlog(dexp(a*x)+dexp(-a*x))/a + endif + return + end diff --git a/source/maxlik/src_CSA/maxlik-opt-tmscore.f b/source/maxlik/src_CSA/maxlik-opt-tmscore.f new file mode 100644 index 0000000..cbcbcc7 --- /dev/null +++ b/source/maxlik/src_CSA/maxlik-opt-tmscore.f @@ -0,0 +1,200 @@ + implicit none + include "DIMENSIONS" + include "COMMON.CALC" + integer i,j,k,l,ii,nf,n,uiparm(1) + double precision x(maxene) + double precision rmsave(maxT),fdum,rjunk + external fdum,funclik + double precision quot,quotl,f,T0 /300.0d0/ + character*8 ename(maxene) + common /names/ ename +c print *,"start" + read(1,*) nene,sigma2,temper(1) + nT = 1 + write (2,*) "nene",nene," nT",nT," sigma",sigma2 + read(1,*) (ename(i),i=1,nene) + read(1,*) (weight(i),i=1,nene) +c read(1,*) (iweight(i),i=1,nene) + read(1,*) (mask(i),i=1,nene) +c read(1,*) (temper(i),i=1,nT) + i=0 + do +c print *,"i=",i + read(1,*,end=10,err=10) ii,(enetb(j,i+1),j=1,nene),ener0(i+1), + & rmstab(i+1),rjunk,rjunk,rjunk,qtab(i+1) + i=i+1 + enddo + 10 continue + nconf=i + do i=1,nconf + entfac(i)=0.0d0 + enddo + write (2,*) "nconf",nconf + write (2,'(i5,2x,a4,f10.5,2i5)') + & (i,ename(i),weight(i),iweight(i),mask(i),i=1,nene) + sigma2=sigma2*sigma2 +c Transfer weights to variables + call w2x(n,x) + call funclik(n,x,nf,f,uiparm,rmsave,fdum) + do i=1,nconf + write (2,'(i5,2e15.5)') i,ener0(i),ener(i) + enddo + write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f + call minsumsl(n,x,f) + write (2,*) "n",n," x",(x(i),i=1,n) + write (2,'(i5,2x,a4,f10.5,i5)') + & (j,ename(j),weight(j),iweight(j),j=1,nene) + write (2,*) "f",f + call funclik(n,x,nf,f,uiparm,rmsave,fdum) + write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f + +c do i=10,30 +c do k=10,30 +c weight(6)=0.1d0*i +c weight(1)=0.1d0*k +c write (2,'(i5,2x,a4,f10.5,i5)') +c & (j,ename(j),weight(j),iweight(j),j=1,nene) +c call funclik(nene,weight,nf,f,uiparm,rmsave,fdum) +c write (2,*) "f",f +c enddo +c enddo + stop + end +c------------------------------------------------------------------------------- + subroutine funclik(n,x,nf,f,uiparm,rmsave,ufparm) + implicit none + include "DIMENSIONS" + include "COMMON.CALC" + character*8 ename(maxene) + common /names/ ename + integer n,nf + double precision f + double precision x(n) + integer uiparm + double precision ufparm + external ufparm + double precision ww(maxene),sumlik(maxT),rmsave(maxT) + integer it,i,j + double precision beta,over,boltz,sumQ,emin,ee, + & sumover + call x2w(n,x) + f=0.0d0 + do iT=1,nT + do i=1,nene + ww(i)=weight(i) + enddo + write (2,*) "iT",iT," temper",temper(iT)," beta",beta + write (2,'(i5,2x,a4,2f10.5,i5)') +c write (2,'(i5,2x,a4,2f10.5,i5,f10.5)') +c & (i,ename(i),weight(i),ww(i),iweight(i),ft(iweight(i),iT), + & (i,ename(i),weight(i),ww(i),iweight(i), + & i=21,20+n) + beta=1.0d0/(temper(iT)*1.987D-3) +c write (2,*) "beta",beta + emin=1.0d10 + do i=1,nconf + ener(i)=0.0d0 + do j=1,nene + ener(i)=ener(i)+ww(j)*enetb(j,i) + enddo + ee = ener(i)-entfac(i)/beta + if (ee.lt.emin) emin=ee + enddo + rmsave(it)=0.0d0 + sumlik(it)=0.0d0 + sumQ=0.0d0 + sumover=0.0d0 + do i=1,nconf +crms over=dexp(-0.5d0*rmstab(i)**2/sigma2) + over=dexp(-0.5d0*(1-qtab(i))**2/sigma2) +c if (temper(iT).gt.340.0d0) over=1.0d0-over + sumover=sumover+over + boltz=-beta*(ener(i)-emin)+entfac(i) +c write (2,*) i,ener(i),entfac(i),rmstab(i),over,boltz, +c & dexp(boltz) + sumQ=sumQ+dexp(boltz) +crms rmsave(iT)=rmsave(iT)+rmstab(i)*dexp(boltz) + rmsave(iT)=rmsave(iT)+(1-qtab(i))*dexp(boltz) + sumlik(iT)=sumlik(iT)+over*boltz + enddo + sumlik(it)=sumlik(iT)-dlog(sumQ)*sumover + rmsave(iT)=rmsave(iT)/sumQ + write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover +c write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover + f=f-sumlik(iT) + enddo + return + end +c------------------------------------------------------------------------------- + subroutine grad(n,x,nf,g,uiparm,urparm,ufparm) + implicit none + integer n,nf,uiparm(1) + double precision x(n),g(n),urparm(1),ufparm + external ufparm + integer i + double precision xi,fplus,fminus,delta/1.0d-9/,delta2/2.0d-9/ + do i=1,n + xi=x(i) + x(i)=xi+delta + call funclik(n,x,nf,fplus,uiparm,urparm,ufparm) + x(i)=xi-delta + call funclik(n,x,nf,fminus,uiparm,urparm,ufparm) + g(i)=(fplus-fminus)/delta2 +c write(2,*) i,fplus,fminus,g(i) + enddo + return + end +c------------------------------------------------------------------------------- + double precision function fdum() + fdum=0.0d0 + return + end +c------------------------------------------------------------------------------- + logical function stopx(idum) + integer idum + stopx=.false. + return + end +c------------------------------------------------------------------------------- + subroutine x2w(n,x) + include "DIMENSIONS" + include "COMMON.CALC" + integer n,i,ii + double precision x(n) + double precision fabs + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + weight(i)=fabs(x(ii)) + endif + enddo + return + end +c------------------------------------------------------------------------------- + subroutine w2x(n,x) + include "DIMENSIONS" + include "COMMON.CALC" + integer n,i,ii + double precision x(maxene) + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + x(ii)=weight(i) + endif + enddo + n=ii + return + end +c------------------------------------------------------------------------------- + double precision function fabs(x) + double precision x + double precision a /100.0d0/ + if (dabs(x).gt.1.0d-4) then + fabs = dabs(x) + else + fabs = dlog(dexp(a*x)+dexp(-a*x))/a + endif + return + end diff --git a/source/maxlik/src_CSA/maxlik-opt.f b/source/maxlik/src_CSA/maxlik-opt.f new file mode 100644 index 0000000..d93d91f --- /dev/null +++ b/source/maxlik/src_CSA/maxlik-opt.f @@ -0,0 +1,198 @@ + implicit none + include "DIMENSIONS" + include "COMMON.CALC-single" + integer i,j,k,l,ii,nf,n,uiparm(1) + double precision x(maxene) + double precision rmsave(maxT),fdum,rjunk + external fdum,funclik + double precision quot,quotl,f,T0 /300.0d0/ + character*8 ename(maxene) + common /names/ ename +c print *,"start" + read(1,*) nene,sigma2,temper(1) + nT = 1 + write (2,*) "nene",nene," nT",nT," sigma",sigma2 + read(1,*) (ename(i),i=1,nene) + read(1,*) (weight(i),i=1,nene) +c read(1,*) (iweight(i),i=1,nene) + read(1,*) (mask(i),i=1,nene) +c read(1,*) (temper(i),i=1,nT) + i=0 + do +c print *,"i=",i + read(1,*,end=10,err=10) ii,(enetb(j,i+1),j=1,nene),ener0(i+1), + & rmstab(i+1),rjunk,rjunk,qtab(i+1) + i=i+1 + enddo + 10 continue + nconf=i + do i=1,nconf + entfac(i)=0.0d0 + enddo + write (2,*) "nconf",nconf + write (2,'(i5,2x,a4,f10.5,2i5)') + & (i,ename(i),weight(i),iweight(i),mask(i),i=1,nene) + sigma2=sigma2*sigma2 +c Transfer weights to variables + call w2x(n,x) + call funclik(n,x,nf,f,uiparm,rmsave,fdum) + do i=1,nconf + write (2,'(i5,2e15.5)') i,ener0(i),ener(i) + enddo + write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f + call minsumsl(n,x,f) + write (2,*) "n",n," x",(x(i),i=1,n) + write (2,'(i5,2x,a4,f10.5,i5)') + & (j,ename(j),weight(j),iweight(j),j=1,nene) + write (2,*) "f",f + call funclik(n,x,nf,f,uiparm,rmsave,fdum) + write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f + +c do i=10,30 +c do k=10,30 +c weight(6)=0.1d0*i +c weight(1)=0.1d0*k +c write (2,'(i5,2x,a4,f10.5,i5)') +c & (j,ename(j),weight(j),iweight(j),j=1,nene) +c call funclik(nene,weight,nf,f,uiparm,rmsave,fdum) +c write (2,*) "f",f +c enddo +c enddo + stop + end +c------------------------------------------------------------------------------- + subroutine funclik(n,x,nf,f,uiparm,rmsave,ufparm) + implicit none + include "DIMENSIONS" + include "COMMON.CALC-single" + character*8 ename(maxene) + common /names/ ename + integer n,nf + double precision f + double precision x(n) + integer uiparm + double precision ufparm + external ufparm + double precision ww(maxene),sumlik(maxT),rmsave(maxT) + integer it,i,j + double precision beta,over,boltz,sumQ,emin,ee, + & sumover + call x2w(n,x) + f=0.0d0 + do iT=1,nT + do i=1,nene + ww(i)=weight(i) + enddo + beta=1.0d0/(temper(iT)*1.987D-3) + write (2,*) "iT",iT," temper",temper(iT)," beta",beta + write (2,'(i5,2x,a4,2f10.5,i5)') +c write (2,'(i5,2x,a4,2f10.5,i5,f10.5)') +c & (i,ename(i),weight(i),ww(i),iweight(i),ft(iweight(i),iT), + & (i,ename(i),weight(i),ww(i),iweight(i), + & i=21,20+n) +c write (2,*) "beta",beta + emin=1.0d10 + do i=1,nconf + ener(i)=0.0d0 + do j=1,nene + ener(i)=ener(i)+ww(j)*enetb(j,i) + enddo + ee = ener(i)-entfac(i)/beta + if (ee.lt.emin) emin=ee + enddo + rmsave(it)=0.0d0 + sumlik(it)=0.0d0 + sumQ=0.0d0 + sumover=0.0d0 + do i=1,nconf + over=dexp(-0.5d0*rmstab(i)**2/sigma2) +c if (temper(iT).gt.340.0d0) over=1.0d0-over + sumover=sumover+over + boltz=-beta*(ener(i)-emin)+entfac(i) +c write (2,*) i,ener(i),entfac(i),rmstab(i),over,boltz, +c & dexp(boltz) + sumQ=sumQ+dexp(boltz) + rmsave(iT)=rmsave(iT)+rmstab(i)*dexp(boltz) + sumlik(iT)=sumlik(iT)+over*boltz + enddo + sumlik(it)=sumlik(iT)-dlog(sumQ)*sumover + rmsave(iT)=rmsave(iT)/sumQ + write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover +c write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover + f=f-sumlik(iT) + enddo + return + end +c------------------------------------------------------------------------------- + subroutine grad(n,x,nf,g,uiparm,urparm,ufparm) + implicit none + integer n,nf,uiparm(1) + double precision x(n),g(n),urparm(1),ufparm + external ufparm + integer i + double precision xi,fplus,fminus,delta/1.0d-9/,delta2/2.0d-9/ + do i=1,n + xi=x(i) + x(i)=xi+delta + call funclik(n,x,nf,fplus,uiparm,urparm,ufparm) + x(i)=xi-delta + call funclik(n,x,nf,fminus,uiparm,urparm,ufparm) + g(i)=(fplus-fminus)/delta2 +c write(2,*) i,fplus,fminus,g(i) + enddo + return + end +c------------------------------------------------------------------------------- + double precision function fdum() + fdum=0.0d0 + return + end +c------------------------------------------------------------------------------- + logical function stopx(idum) + integer idum + stopx=.false. + return + end +c------------------------------------------------------------------------------- + subroutine x2w(n,x) + include "DIMENSIONS" + include "COMMON.CALC-single" + integer n,i,ii + double precision x(n) + double precision fabs + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + weight(i)=fabs(x(ii)) + endif + enddo + return + end +c------------------------------------------------------------------------------- + subroutine w2x(n,x) + include "DIMENSIONS" + include "COMMON.CALC-single" + integer n,i,ii + double precision x(maxene) + ii=0 + do i=1,nene + if (mask(i).gt.0) then + ii=ii+1 + x(ii)=weight(i) + endif + enddo + n=ii + return + end +c------------------------------------------------------------------------------- + double precision function fabs(x) + double precision x + double precision a /1.0d4/ + if (dabs(x).gt.1.0d-2) then + fabs = dabs(x) + else + fabs = dlog(dexp(a*x)+dexp(-a*x))/a + endif + return + end diff --git a/source/maxlik/src_CSA/minsumsl.f b/source/maxlik/src_CSA/minsumsl.f new file mode 100644 index 0000000..53105e5 --- /dev/null +++ b/source/maxlik/src_CSA/minsumsl.f @@ -0,0 +1,86 @@ + subroutine minsumsl(nvar,x,minval) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (maxvar=maxene+3*nnbase) + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) +********************************************************************* +* OPTIMIZE sets up SUMSL or DFP and provides a simple interface for * +* the calling subprogram. * +* when d(i)=1.0, then v(35) is the length of the initial step, * +* calculated in the usual pythagorean way. * +* absolute convergence occurs when the function is within v(31) of * +* zero. unless you know the minimum value in advance, abs convg * +* is probably not useful. * +* relative convergence is when the model predicts that the function * +* will decrease by less than v(32)*abs(fun). * +********************************************************************* + dimension iv(liv) + real*8 minval,x(nvar),d(maxvar),v(1:lv) + external funclik,grad,fdum + integer idum(1) + double precision rdum(1) + double precision urparm(maxT) + double precision g(maxvar) + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + maxfun=1000 + iv(17)=maxfun +* max num of iterations + maxit=50 + iv(18)=maxit +* controls output + iv(19)=1 +* selects output unit + iv(21)=2 +* 1 means to print out result + iv(22)=1 +* 1 means to print out summary stats + iv(23)=1 +* 1 means to print initial x and d + iv(24)=1 +* min val for v(radfac) default is 0.1 + v(24)=0.01D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.001D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + tolf=1.0D-4 + v(31)=tolf +* relative convergence + rtolf=1.0D-12 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-6 +* large vals of d correspond to small components of step + do 20 i=1,nvar + d(i)=1.0D0 +20 continue + + nf=0 + call funclik(nvar,x,nf,f,idum,urparm,fdum) + write (2,'(a,1pe17.10)') 'Initial function value:',f + call grad(nvar,x,nf,g,idum,urparm,fdum) + write (2,*) "Initial gradient" + do i=1,nvar + write (2,'(i5,e15.5)') i,g(i) + enddo +c minimize the log-likelihood function + print *,"iv1",iv(1) + call sumsl(nvar,d,x,funclik,grad,iv,liv,lv,v,idum,urparm,fdum) + minval=v(10) + write (2,*) + write (2,'(a,i4)') 'SUMSL return code:',iv(1) + write (2,'(a,1pe17.10)') 'Final function value:',minval +c print *,"exiting minsumsl" + return + end +c--------------------------------------------------------------------- + diff --git a/source/maxlik/src_CSA/rmdd.f b/source/maxlik/src_CSA/rmdd.f new file mode 100644 index 0000000..799ab47 --- /dev/null +++ b/source/maxlik/src_CSA/rmdd.f @@ -0,0 +1,159 @@ +c algorithm 611, collected algorithms from acm. +c algorithm appeared in acm-trans. math. software, vol.9, no. 4, +c dec., 1983, p. 503-524. + integer function imdcon(k) +c + integer k +c +c *** return integer machine-dependent constants *** +c +c *** k = 1 means return standard output unit number. *** +c *** k = 2 means return alternate output unit number. *** +c *** k = 3 means return input unit number. *** +c (note -- k = 2, 3 are used only by test programs.) +c +c +++ port version follows... +c external i1mach +c integer i1mach +c integer mdperm(3) +c data mdperm(1)/2/, mdperm(2)/4/, mdperm(3)/1/ +c imdcon = i1mach(mdperm(k)) +c +++ end of port version +++ +c +c +++ non-port version follows... + integer mdcon(3) + data mdcon(1)/6/, mdcon(2)/8/, mdcon(3)/5/ + imdcon = mdcon(k) +c +++ end of non-port version +++ +c + 999 return +c *** last card of imdcon follows *** + end + double precision function rmdcon(k) +c +c *** return machine dependent constants used by nl2sol *** +c +c +++ comments below contain data statements for various machines. +++ +c +++ to convert to another machine, place a c in column 1 of the +++ +c +++ data statement line(s) that correspond to the current machine +++ +c +++ and remove the c from column 1 of the data statement line(s) +++ +c +++ that correspond to the new machine. +++ +c + integer k +c +c *** the constant returned depends on k... +c +c *** k = 1... smallest pos. eta such that -eta exists. +c *** k = 2... square root of eta. +c *** k = 3... unit roundoff = smallest pos. no. machep such +c *** that 1 + machep .gt. 1 .and. 1 - machep .lt. 1. +c *** k = 4... square root of machep. +c *** k = 5... square root of big (see k = 6). +c *** k = 6... largest machine no. big such that -big exists. +c + double precision big, eta, machep + integer bigi(4), etai(4), machei(4) +c/+ + double precision dsqrt +c/ + equivalence (big,bigi(1)), (eta,etai(1)), (machep,machei(1)) +c +c +++ ibm 360, ibm 370, or xerox +++ +c +c data big/z7fffffffffffffff/, eta/z0010000000000000/, +c 1 machep/z3410000000000000/ +c +c +++ data general +++ +c +c data big/0.7237005577d+76/, eta/0.5397605347d-78/, +c 1 machep/2.22044605d-16/ +c +c +++ dec 11 +++ +c +c data big/1.7d+38/, eta/2.938735878d-39/, machep/2.775557562d-17/ +c +c +++ hp3000 +++ +c +c data big/1.157920892d+77/, eta/8.636168556d-78/, +c 1 machep/5.551115124d-17/ +c +c +++ honeywell +++ +c +c data big/1.69d+38/, eta/5.9d-39/, machep/2.1680435d-19/ +c +c +++ dec10 +++ +c +c data big/"377777100000000000000000/, +c 1 eta/"002400400000000000000000/, +c 2 machep/"104400000000000000000000/ +c +c +++ burroughs +++ +c +c data big/o0777777777777777,o7777777777777777/, +c 1 eta/o1771000000000000,o7770000000000000/, +c 2 machep/o1451000000000000,o0000000000000000/ +c +c +++ control data +++ +c +c data big/37767777777777777777b,37167777777777777777b/, +c 1 eta/00014000000000000000b,00000000000000000000b/, +c 2 machep/15614000000000000000b,15010000000000000000b/ +c +c +++ prime +++ +c +c data big/1.0d+9786/, eta/1.0d-9860/, machep/1.4210855d-14/ +c +c +++ univac +++ +c +c data big/8.988d+307/, eta/1.2d-308/, machep/1.734723476d-18/ +c +c +++ vax +++ +c + data big/1.7d+38/, eta/2.939d-39/, machep/1.3877788d-17/ +c +c +++ cray 1 +++ +c +c data bigi(1)/577767777777777777777b/, +c 1 bigi(2)/000007777777777777776b/, +c 2 etai(1)/200004000000000000000b/, +c 3 etai(2)/000000000000000000000b/, +c 4 machei(1)/377224000000000000000b/, +c 5 machei(2)/000000000000000000000b/ +c +c +++ port library -- requires more than just a data statement... +++ +c +c external d1mach +c double precision d1mach, zero +c data big/0.d+0/, eta/0.d+0/, machep/0.d+0/, zero/0.d+0/ +c if (big .gt. zero) go to 1 +c big = d1mach(2) +c eta = d1mach(1) +c machep = d1mach(4) +c1 continue +c +c +++ end of port +++ +c +c------------------------------- body -------------------------------- +c + go to (10, 20, 30, 40, 50, 60), k +c + 10 rmdcon = eta + go to 999 +c + 20 rmdcon = dsqrt(256.d+0*eta)/16.d+0 + go to 999 +c + 30 rmdcon = machep + go to 999 +c + 40 rmdcon = dsqrt(machep) + go to 999 +c + 50 rmdcon = dsqrt(big/256.d+0)*16.d+0 + go to 999 +c + 60 rmdcon = big +c + 999 return +c *** last card of rmdcon follows *** + end diff --git a/source/maxlik/src_CSA/sumsld.f b/source/maxlik/src_CSA/sumsld.f new file mode 100644 index 0000000..1ce7b78 --- /dev/null +++ b/source/maxlik/src_CSA/sumsld.f @@ -0,0 +1,1446 @@ + subroutine sumsl(n, d, x, calcf, calcg, iv, liv, lv, v, + 1 uiparm, urparm, ufparm) +c +c *** minimize general unconstrained objective function using *** +c *** analytic gradient and hessian approx. from secant update *** +c + integer n, liv, lv + integer iv(liv), uiparm(1) + double precision d(n), x(n), v(lv), urparm(1) +c dimension v(71 + n*(n+15)/2), uiparm(*), urparm(*) + external calcf, calcg, ufparm +c +c *** purpose *** +c +c this routine interacts with subroutine sumit in an attempt +c to find an n-vector x* that minimizes the (unconstrained) +c objective function computed by calcf. (often the x* found is +c a local minimizer rather than a global one.) +c +c-------------------------- parameter usage -------------------------- +c +c n........ (input) the number of variables on which f depends, i.e., +c the number of components in x. +c d........ (input/output) a scale vector such that d(i)*x(i), +c i = 1,2,...,n, are all in comparable units. +c d can strongly affect the behavior of sumsl. +c finding the best choice of d is generally a trial- +c and-error process. choosing d so that d(i)*x(i) +c has about the same value for all i often works well. +c the defaults provided by subroutine deflt (see i +c below) require the caller to supply d. +c x........ (input/output) before (initially) calling sumsl, the call- +c er should set x to an initial guess at x*. when +c sumsl returns, x contains the best point so far +c found, i.e., the one that gives the least value so +c far seen for f(x). +c calcf.... (input) a subroutine that, given x, computes f(x). calcf +c must be declared external in the calling program. +c it is invoked by +c call calcf(n, x, nf, f, uiparm, urparm, ufparm) +c when calcf is called, nf is the invocation +c count for calcf. nf is included for possible use +c with calcg. if x is out of bounds (e.g., if it +c would cause overflow in computing f(x)), then calcf +c should set nf to 0. this will cause a shorter step +c to be attempted. (if x is in bounds, then calcf +c should not change nf.) the other parameters are as +c described above and below. calcf should not change +c n, p, or x. +c calcg.... (input) a subroutine that, given x, computes g(x), the gra- +c dient of f at x. calcg must be declared external in +c the calling program. it is invoked by +c call calcg(n, x, nf, g, uiparm, urparm, ufaprm) +c when calcg is called, nf is the invocation +c count for calcf at the time f(x) was evaluated. the +c x passed to calcg is usually the one passed to calcf +c on either its most recent invocation or the one +c prior to it. if calcf saves intermediate results +c for use by calcg, then it is possible to tell from +c nf whether they are valid for the current x (or +c which copy is valid if two copies are kept). if g +c cannot be computed at x, then calcg should set nf to +c 0. in this case, sumsl will return with iv(1) = 65. +c (if g can be computed at x, then calcg should not +c changed nf.) the other parameters to calcg are as +c described above and below. calcg should not change +c n or x. +c iv....... (input/output) an integer value array of length liv (see +c below) that helps control the sumsl algorithm and +c that is used to store various intermediate quanti- +c ties. of particular interest are the initialization/ +c return code iv(1) and the entries in iv that control +c printing and limit the number of iterations and func- +c tion evaluations. see the section on iv input +c values below. +c liv...... (input) length of iv array. must be at least 60. if li +c is too small, then sumsl returns with iv(1) = 15. +c when sumsl returns, the smallest allowed value of +c liv is stored in iv(lastiv) -- see the section on +c iv output values below. (this is intended for use +c with extensions of sumsl that handle constraints.) +c lv....... (input) length of v array. must be at least 71+n*(n+15)/2. +c (at least 77+n*(n+17)/2 for smsno, at least +c 78+n*(n+12) for humsl). if lv is too small, then +c sumsl returns with iv(1) = 16. when sumsl returns, +c the smallest allowed value of lv is stored in +c iv(lastv) -- see the section on iv output values +c below. +c v........ (input/output) a floating-point value array of length l +c (see below) that helps control the sumsl algorithm +c and that is used to store various intermediate +c quantities. of particular interest are the entries +c in v that limit the length of the first step +c attempted (lmax0) and specify convergence tolerances +c (afctol, lmaxs, rfctol, sctol, xctol, xftol). +c uiparm... (input) user integer parameter array passed without change +c to calcf and calcg. +c urparm... (input) user floating-point parameter array passed without +c change to calcf and calcg. +c ufparm... (input) user external subroutine or function passed without +c change to calcf and calcg. +c +c *** iv input values (from subroutine deflt) *** +c +c iv(1)... on input, iv(1) should have a value between 0 and 14...... +c 0 and 12 mean this is a fresh start. 0 means that +c deflt(2, iv, liv, lv, v) +c is to be called to provide all default values to iv and +c v. 12 (the value that deflt assigns to iv(1)) means the +c caller has already called deflt and has possibly changed +c some iv and/or v entries to non-default values. +c 13 means deflt has been called and that sumsl (and +c sumit) should only do their storage allocation. that is, +c they should set the output components of iv that tell +c where various subarrays arrays of v begin, such as iv(g) +c (and, for humsl and humit only, iv(dtol)), and return. +c 14 means that a storage has been allocated (by a call +c with iv(1) = 13) and that the algorithm should be +c started. when called with iv(1) = 13, sumsl returns +c iv(1) = 14 unless liv or lv is too small (or n is not +c positive). default = 12. +c iv(inith).... iv(25) tells whether the hessian approximation h should +c be initialized. 1 (the default) means sumit should +c initialize h to the diagonal matrix whose i-th diagonal +c element is d(i)**2. 0 means the caller has supplied a +c cholesky factor l of the initial hessian approximation +c h = l*(l**t) in v, starting at v(iv(lmat)) = v(iv(42)) +c (and stored compactly by rows). note that iv(lmat) may +c be initialized by calling sumsl with iv(1) = 13 (see +c the iv(1) discussion above). default = 1. +c iv(mxfcal)... iv(17) gives the maximum number of function evaluations +c (calls on calcf) allowed. if this number does not suf- +c fice, then sumsl returns with iv(1) = 9. default = 200. +c iv(mxiter)... iv(18) gives the maximum number of iterations allowed. +c it also indirectly limits the number of gradient evalua- +c tions (calls on calcg) to iv(mxiter) + 1. if iv(mxiter) +c iterations do not suffice, then sumsl returns with +c iv(1) = 10. default = 150. +c iv(outlev)... iv(19) controls the number and length of iteration sum- +c mary lines printed (by itsum). iv(outlev) = 0 means do +c not print any summary lines. otherwise, print a summary +c line after each abs(iv(outlev)) iterations. if iv(outlev) +c is positive, then summary lines of length 78 (plus carri- +c age control) are printed, including the following... the +c iteration and function evaluation counts, f = the current +c function value, relative difference in function values +c achieved by the latest step (i.e., reldf = (f0-v(f))/f01, +c where f01 is the maximum of abs(v(f)) and abs(v(f0)) and +c v(f0) is the function value from the previous itera- +c tion), the relative function reduction predicted for the +c step just taken (i.e., preldf = v(preduc) / f01, where +c v(preduc) is described below), the scaled relative change +c in x (see v(reldx) below), the step parameter for the +c step just taken (stppar = 0 means a full newton step, +c between 0 and 1 means a relaxed newton step, between 1 +c and 2 means a double dogleg step, greater than 2 means +c a scaled down cauchy step -- see subroutine dbldog), the +c 2-norm of the scale vector d times the step just taken +c (see v(dstnrm) below), and npreldf, i.e., +c v(nreduc)/f01, where v(nreduc) is described below -- if +c npreldf is positive, then it is the relative function +c reduction predicted for a newton step (one with +c stppar = 0). if npreldf is negative, then it is the +c negative of the relative function reduction predicted +c for a step computed with step bound v(lmaxs) for use in +c testing for singular convergence. +c if iv(outlev) is negative, then lines of length 50 +c are printed, including only the first 6 items listed +c above (through reldx). +c default = 1. +c iv(parprt)... iv(20) = 1 means print any nondefault v values on a +c fresh start or any changed v values on a restart. +c iv(parprt) = 0 means skip this printing. default = 1. +c iv(prunit)... iv(21) is the output unit number on which all printing +c is done. iv(prunit) = 0 means suppress all printing. +c default = standard output unit (unit 6 on most systems). +c iv(solprt)... iv(22) = 1 means print out the value of x returned (as +c well as the gradient and the scale vector d). +c iv(solprt) = 0 means skip this printing. default = 1. +c iv(statpr)... iv(23) = 1 means print summary statistics upon return- +c ing. these consist of the function value, the scaled +c relative change in x caused by the most recent step (see +c v(reldx) below), the number of function and gradient +c evaluations (calls on calcf and calcg), and the relative +c function reductions predicted for the last step taken and +c for a newton step (or perhaps a step bounded by v(lmaxs) +c -- see the descriptions of preldf and npreldf under +c iv(outlev) above). +c iv(statpr) = 0 means skip this printing. +c iv(statpr) = -1 means skip this printing as well as that +c of the one-line termination reason message. default = 1. +c iv(x0prt).... iv(24) = 1 means print the initial x and scale vector d +c (on a fresh start only). iv(x0prt) = 0 means skip this +c printing. default = 1. +c +c *** (selected) iv output values *** +c +c iv(1)........ on output, iv(1) is a return code.... +c 3 = x-convergence. the scaled relative difference (see +c v(reldx)) between the current parameter vector x and +c a locally optimal parameter vector is very likely at +c most v(xctol). +c 4 = relative function convergence. the relative differ- +c ence between the current function value and its lo- +c cally optimal value is very likely at most v(rfctol). +c 5 = both x- and relative function convergence (i.e., the +c conditions for iv(1) = 3 and iv(1) = 4 both hold). +c 6 = absolute function convergence. the current function +c value is at most v(afctol) in absolute value. +c 7 = singular convergence. the hessian near the current +c iterate appears to be singular or nearly so, and a +c step of length at most v(lmaxs) is unlikely to yield +c a relative function decrease of more than v(sctol). +c 8 = false convergence. the iterates appear to be converg- +c ing to a noncritical point. this may mean that the +c convergence tolerances (v(afctol), v(rfctol), +c v(xctol)) are too small for the accuracy to which +c the function and gradient are being computed, that +c there is an error in computing the gradient, or that +c the function or gradient is discontinuous near x. +c 9 = function evaluation limit reached without other con- +c vergence (see iv(mxfcal)). +c 10 = iteration limit reached without other convergence +c (see iv(mxiter)). +c 11 = stopx returned .true. (external interrupt). see the +c usage notes below. +c 14 = storage has been allocated (after a call with +c iv(1) = 13). +c 17 = restart attempted with n changed. +c 18 = d has a negative component and iv(dtype) .le. 0. +c 19...43 = v(iv(1)) is out of range. +c 63 = f(x) cannot be computed at the initial x. +c 64 = bad parameters passed to assess (which should not +c occur). +c 65 = the gradient could not be computed at x (see calcg +c above). +c 67 = bad first parameter to deflt. +c 80 = iv(1) was out of range. +c 81 = n is not positive. +c iv(g)........ iv(28) is the starting subscript in v of the current +c gradient vector (the one corresponding to x). +c iv(lastiv)... iv(44) is the least acceptable value of liv. (it is +c only set if liv is at least 44.) +c iv(lastv).... iv(45) is the least acceptable value of lv. (it is +c only set if liv is large enough, at least iv(lastiv).) +c iv(nfcall)... iv(6) is the number of calls so far made on calcf (i.e., +c function evaluations). +c iv(ngcall)... iv(30) is the number of gradient evaluations (calls on +c calcg). +c iv(niter).... iv(31) is the number of iterations performed. +c +c *** (selected) v input values (from subroutine deflt) *** +c +c v(bias)..... v(43) is the bias parameter used in subroutine dbldog -- +c see that subroutine for details. default = 0.8. +c v(afctol)... v(31) is the absolute function convergence tolerance. +c if sumsl finds a point where the function value is less +c than v(afctol) in absolute value, and if sumsl does not +c return with iv(1) = 3, 4, or 5, then it returns with +c iv(1) = 6. this test can be turned off by setting +c v(afctol) to zero. default = max(10**-20, machep**2), +c where machep is the unit roundoff. +c v(dinit).... v(38), if nonnegative, is the value to which the scale +c vector d is initialized. default = -1. +c v(lmax0).... v(35) gives the maximum 2-norm allowed for d times the +c very first step that sumsl attempts. this parameter can +c markedly affect the performance of sumsl. +c v(lmaxs).... v(36) is used in testing for singular convergence -- if +c the function reduction predicted for a step of length +c bounded by v(lmaxs) is at most v(sctol) * abs(f0), where +c f0 is the function value at the start of the current +c iteration, and if sumsl does not return with iv(1) = 3, +c 4, 5, or 6, then it returns with iv(1) = 7. default = 1. +c v(rfctol)... v(32) is the relative function convergence tolerance. +c if the current model predicts a maximum possible function +c reduction (see v(nreduc)) of at most v(rfctol)*abs(f0) +c at the start of the current iteration, where f0 is the +c then current function value, and if the last step attempt- +c ed achieved no more than twice the predicted function +c decrease, then sumsl returns with iv(1) = 4 (or 5). +c default = max(10**-10, machep**(2/3)), where machep is +c the unit roundoff. +c v(sctol).... v(37) is the singular convergence tolerance -- see the +c description of v(lmaxs) above. +c v(tuner1)... v(26) helps decide when to check for false convergence. +c this is done if the actual function decrease from the +c current step is no more than v(tuner1) times its predict- +c ed value. default = 0.1. +c v(xctol).... v(33) is the x-convergence tolerance. if a newton step +c (see v(nreduc)) is tried that has v(reldx) .le. v(xctol) +c and if this step yields at most twice the predicted func- +c tion decrease, then sumsl returns with iv(1) = 3 (or 5). +c (see the description of v(reldx) below.) +c default = machep**0.5, where machep is the unit roundoff. +c v(xftol).... v(34) is the false convergence tolerance. if a step is +c tried that gives no more than v(tuner1) times the predict- +c ed function decrease and that has v(reldx) .le. v(xftol), +c and if sumsl does not return with iv(1) = 3, 4, 5, 6, or +c 7, then it returns with iv(1) = 8. (see the description +c of v(reldx) below.) default = 100*machep, where +c machep is the unit roundoff. +c v(*)........ deflt supplies to v a number of tuning constants, with +c which it should ordinarily be unnecessary to tinker. see +c section 17 of version 2.2 of the nl2sol usage summary +c (i.e., the appendix to ref. 1) for details on v(i), +c i = decfac, incfac, phmnfc, phmxfc, rdfcmn, rdfcmx, +c tuner2, tuner3, tuner4, tuner5. +c +c *** (selected) v output values *** +c +c v(dgnorm)... v(1) is the 2-norm of (diag(d)**-1)*g, where g is the +c most recently computed gradient. +c v(dstnrm)... v(2) is the 2-norm of diag(d)*step, where step is the +c current step. +c v(f)........ v(10) is the current function value. +c v(f0)....... v(13) is the function value at the start of the current +c iteration. +c v(nreduc)... v(6), if positive, is the maximum function reduction +c possible according to the current model, i.e., the func- +c tion reduction predicted for a newton step (i.e., +c step = -h**-1 * g, where g is the current gradient and +c h is the current hessian approximation). +c if v(nreduc) is negative, then it is the negative of +c the function reduction predicted for a step computed with +c a step bound of v(lmaxs) for use in testing for singular +c convergence. +c v(preduc)... v(7) is the function reduction predicted (by the current +c quadratic model) for the current step. this (divided by +c v(f0)) is used in testing for relative function +c convergence. +c v(reldx).... v(17) is the scaled relative change in x caused by the +c current step, computed as +c max(abs(d(i)*(x(i)-x0(i)), 1 .le. i .le. p) / +c max(d(i)*(abs(x(i))+abs(x0(i))), 1 .le. i .le. p), +c where x = x0 + step. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c this routine uses a hessian approximation computed from the +c bfgs update (see ref 3). only a cholesky factor of the hessian +c approximation is stored, and this is updated using ideas from +c ref. 4. steps are computed by the double dogleg scheme described +c in ref. 2. the steps are assessed as in ref. 1. +c +c *** usage notes *** +c +c after a return with iv(1) .le. 11, it is possible to restart, +c i.e., to change some of the iv and v input values described above +c and continue the algorithm from the point where it was interrupt- +c ed. iv(1) should not be changed, nor should any entries of i +c and v other than the input values (those supplied by deflt). +c those who do not wish to write a calcg which computes the +c gradient analytically should call smsno rather than sumsl. +c smsno uses finite differences to compute an approximate gradient. +c those who would prefer to provide f and g (the function and +c gradient) by reverse communication rather than by writing subrou- +c tines calcf and calcg may call on sumit directly. see the com- +c ments at the beginning of sumit. +c those who use sumsl interactively may wish to supply their +c own stopx function, which should return .true. if the break key +c has been pressed since stopx was last invoked. this makes it +c possible to externally interrupt sumsl (which will return with +c iv(1) = 11 if stopx returns .true.). +c storage for g is allocated at the end of v. thus the caller +c may make v longer than specified above and may allow calcg to use +c elements of g beyond the first n as scratch storage. +c +c *** portability notes *** +c +c the sumsl distribution tape contains both single- and double- +c precision versions of the sumsl source code, so it should be un- +c necessary to change precisions. +c only the functions imdcon and rmdcon contain machine-dependent +c constants. to change from one machine to another, it should +c suffice to change the (few) relevant lines in these functions. +c intrinsic functions are explicitly declared. on certain com- +c puters (e.g. univac), it may be necessary to comment out these +c declarations. so that this may be done automatically by a simple +c program, such declarations are preceded by a comment having c/+ +c in columns 1-3 and blanks in columns 4-72 and are followed by +c a comment having c/ in columns 1 and 2 and blanks in columns 3-72. +c the sumsl source code is expressed in 1966 ansi standard +c fortran. it may be converted to fortran 77 by commenting out all +c lines that fall between a line having c/6 in columns 1-3 and a +c line having c/7 in columns 1-3 and by removing (i.e., replacing +c by a blank) the c in column 1 of the lines that follow the c/7 +c line and precede a line having c/ in columns 1-2 and blanks in +c columns 3-72. these changes convert some data statements into +c parameter statements, convert some variables from real to +c character*4, and make the data statements that initialize these +c variables use character strings delimited by primes instead +c of hollerith constants. (such variables and data statements +c appear only in modules itsum and parck. parameter statements +c appear nearly everywhere.) these changes also add save state- +c ments for variables given machine-dependent constants by rmdcon. +c +c *** references *** +c +c 1. dennis, j.e., gay, d.m., and welsch, r.e. (1981), algorithm 573 -- +c an adaptive nonlinear least-squares algorithm, acm trans. +c math. software 7, pp. 369-383. +c +c 2. dennis, j.e., and mei, h.h.w. (1979), two new unconstrained opti- +c mization algorithms which use function and gradient +c values, j. optim. theory applic. 28, pp. 453-482. +c +c 3. dennis, j.e., and more, j.j. (1977), quasi-newton methods, motiva- +c tion and theory, siam rev. 19, pp. 46-89. +c +c 4. goldfarb, d. (1976), factorized variable metric methods for uncon- +c strained optimization, math. comput. 30, pp. 796-811. +c +c *** general *** +c +c coded by david m. gay (winter 1980). revised summer 1982. +c this subroutine was written in connection with research +c supported in part by the national science foundation under +c grants mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, +c and mcs-7906671. +c. +c +c---------------------------- declarations --------------------------- +c + external deflt, sumit +c +c deflt... supplies default iv and v input components. +c sumit... reverse-communication routine that carries out sumsl algo- +c rithm. +c + integer g1, iv1, nf + double precision f +c +c *** subscripts for iv *** +c + integer nextv, nfcall, nfgcal, g, toobig, vneed +c +c/6 +c data nextv/47/, nfcall/6/, nfgcal/7/, g/28/, toobig/2/, vneed/4/ +c/7 + parameter (nextv=47, nfcall=6, nfgcal=7, g=28, toobig=2, vneed=4) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + iv1 = iv(1) + if (iv1 .eq. 12 .or. iv1 .eq. 13) iv(vneed) = iv(vneed) + n + if (iv1 .eq. 14) go to 10 + if (iv1 .gt. 2 .and. iv1 .lt. 12) go to 10 + g1 = 1 + if (iv1 .eq. 12) iv(1) = 13 + go to 20 +c + 10 g1 = iv(g) +c + 20 call sumit(d, f, v(g1), iv, liv, lv, n, v, x) + if (iv(1) - 2) 30, 40, 50 +c + 30 nf = iv(nfcall) + call calcf(n, x, nf, f, uiparm, urparm, ufparm) + if (nf .le. 0) iv(toobig) = 1 + go to 20 +c + 40 call calcg(n, x, iv(nfgcal), v(g1), uiparm, urparm, ufparm) + go to 20 +c + 50 if (iv(1) .ne. 14) go to 999 +c +c *** storage allocation +c + iv(g) = iv(nextv) + iv(nextv) = iv(g) + n + if (iv1 .ne. 13) go to 10 +c + 999 return +c *** last card of sumsl follows *** + end + subroutine sumit(d, fx, g, iv, liv, lv, n, v, x) +c +c *** carry out sumsl (unconstrained minimization) iterations, using +c *** double-dogleg/bfgs steps. +c +c *** parameter declarations *** +c + integer liv, lv, n + integer iv(liv) + double precision d(n), fx, g(n), v(lv), x(n) +c +c-------------------------- parameter usage -------------------------- +c +c d.... scale vector. +c fx... function value. +c g.... gradient vector. +c iv... integer value array. +c liv.. length of iv (at least 60). +c lv... length of v (at least 71 + n*(n+13)/2). +c n.... number of variables (components in x and g). +c v.... floating-point value array. +c x.... vector of parameters to be optimized. +c +c *** discussion *** +c +c parameters iv, n, v, and x are the same as the corresponding +c ones to sumsl (which see), except that v can be shorter (since +c the part of v that sumsl uses for storing g is not needed). +c moreover, compared with sumsl, iv(1) may have the two additional +c output values 1 and 2, which are explained below, as is the use +c of iv(toobig) and iv(nfgcal). the value iv(g), which is an +c output value from sumsl (and smsno), is not referenced by +c sumit or the subroutines it calls. +c fx and g need not have been initialized when sumit is called +c with iv(1) = 12, 13, or 14. +c +c iv(1) = 1 means the caller should set fx to f(x), the function value +c at x, and call sumit again, having changed none of the +c other parameters. an exception occurs if f(x) cannot be +c (e.g. if overflow would occur), which may happen because +c of an oversized step. in this case the caller should set +c iv(toobig) = iv(2) to 1, which will cause sumit to ig- +c nore fx and try a smaller step. the parameter nf that +c sumsl passes to calcf (for possible use by calcg) is a +c copy of iv(nfcall) = iv(6). +c iv(1) = 2 means the caller should set g to g(x), the gradient vector +c of f at x, and call sumit again, having changed none of +c the other parameters except possibly the scale vector d +c when iv(dtype) = 0. the parameter nf that sumsl passes +c to calcg is iv(nfgcal) = iv(7). if g(x) cannot be +c evaluated, then the caller may set iv(nfgcal) to 0, in +c which case sumit will return with iv(1) = 65. +c. +c *** general *** +c +c coded by david m. gay (december 1979). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c (see sumsl for references.) +c +c+++++++++++++++++++++++++++ declarations ++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer dg1, dummy, g01, i, k, l, lstgst, nwtst1, step1, + 1 temp1, w, x01, z + double precision t +c +c *** constants *** +c + double precision half, negone, one, onep2, zero +c +c *** no intrinsic functions *** +c +c *** external functions and subroutines *** +c + external assst, dbdog, deflt, dotprd, itsum, litvmu, livmul, + 1 ltvmul, lupdat, lvmul, parck, reldst, stopx, vaxpy, + 2 vcopy, vscopy, vvmulp, v2norm, wzbfgs + logical stopx + double precision dotprd, reldst, v2norm +c +c assst.... assesses candidate step. +c dbdog.... computes double-dogleg (candidate) step. +c deflt.... supplies default iv and v input components. +c dotprd... returns inner product of two vectors. +c itsum.... prints iteration summary and info on initial and final x. +c litvmu... multiplies inverse transpose of lower triangle times vector. +c livmul... multiplies inverse of lower triangle times vector. +c ltvmul... multiplies transpose of lower triangle times vector. +c lupdt.... updates cholesky factor of hessian approximation. +c lvmul.... multiplies lower triangle times vector. +c parck.... checks validity of input iv and v values. +c reldst... computes v(reldx) = relative step size. +c stopx.... returns .true. if the break key has been pressed. +c vaxpy.... computes scalar times one vector plus another. +c vcopy.... copies one vector to another. +c vscopy... sets all elements of a vector to a scalar. +c vvmulp... multiplies vector by vector raised to power (componentwise). +c v2norm... returns the 2-norm of a vector. +c wzbfgs... computes w and z for lupdat corresponding to bfgs update. +c +c *** subscripts for iv and v *** +c + integer afctol + integer cnvcod, dg, dgnorm, dinit, dstnrm, dst0, f, f0, fdif, + 1 gthg, gtstep, g0, incfac, inith, irc, kagqt, lmat, lmax0, + 2 lmaxs, mode, model, mxfcal, mxiter, nextv, nfcall, nfgcal, + 3 ngcall, niter, nreduc, nwtstp, preduc, radfac, radinc, + 4 radius, rad0, reldx, restor, step, stglim, stlstg, toobig, + 5 tuner4, tuner5, vneed, xirc, x0 +c +c *** iv subscript values *** +c +c/6 +c data cnvcod/55/, dg/37/, g0/48/, inith/25/, irc/29/, kagqt/33/, +c 1 mode/35/, model/5/, mxfcal/17/, mxiter/18/, nfcall/6/, +c 2 nfgcal/7/, ngcall/30/, niter/31/, nwtstp/34/, radinc/8/, +c 3 restor/9/, step/40/, stglim/11/, stlstg/41/, toobig/2/, +c 4 vneed/4/, xirc/13/, x0/43/ +c/7 + parameter (cnvcod=55, dg=37, g0=48, inith=25, irc=29, kagqt=33, + 1 mode=35, model=5, mxfcal=17, mxiter=18, nfcall=6, + 2 nfgcal=7, ngcall=30, niter=31, nwtstp=34, radinc=8, + 3 restor=9, step=40, stglim=11, stlstg=41, toobig=2, + 4 vneed=4, xirc=13, x0=43) +c/ +c +c *** v subscript values *** +c +c/6 +c data afctol/31/ +c data dgnorm/1/, dinit/38/, dstnrm/2/, dst0/3/, f/10/, f0/13/, +c 1 fdif/11/, gthg/44/, gtstep/4/, incfac/23/, lmat/42/, +c 2 lmax0/35/, lmaxs/36/, nextv/47/, nreduc/6/, preduc/7/, +c 3 radfac/16/, radius/8/, rad0/9/, reldx/17/, tuner4/29/, +c 4 tuner5/30/ +c/7 + parameter (afctol=31) + parameter (dgnorm=1, dinit=38, dstnrm=2, dst0=3, f=10, f0=13, + 1 fdif=11, gthg=44, gtstep=4, incfac=23, lmat=42, + 2 lmax0=35, lmaxs=36, nextv=47, nreduc=6, preduc=7, + 3 radfac=16, radius=8, rad0=9, reldx=17, tuner4=29, + 4 tuner5=30) +c/ +c +c/6 +c data half/0.5d+0/, negone/-1.d+0/, one/1.d+0/, onep2/1.2d+0/, +c 1 zero/0.d+0/ +c/7 + parameter (half=0.5d+0, negone=-1.d+0, one=1.d+0, onep2=1.2d+0, + 1 zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c +C Following SAVE statement inserted. + save l + i = iv(1) + if (i .eq. 1) go to 50 + if (i .eq. 2) go to 60 +c +c *** check validity of iv and v input values *** +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+13)/2 + call parck(2, d, iv, liv, lv, n, v) + i = iv(1) - 2 + if (i .gt. 12) go to 999 + go to (180, 180, 180, 180, 180, 180, 120, 90, 120, 10, 10, 20), i +c +c *** storage allocation *** +c +10 l = iv(lmat) + iv(x0) = l + n*(n+1)/2 + iv(step) = iv(x0) + n + iv(stlstg) = iv(step) + n + iv(g0) = iv(stlstg) + n + iv(nwtstp) = iv(g0) + n + iv(dg) = iv(nwtstp) + n + iv(nextv) = iv(dg) + n + if (iv(1) .ne. 13) go to 20 + iv(1) = 14 + go to 999 +c +c *** initialization *** +c + 20 iv(niter) = 0 + iv(nfcall) = 1 + iv(ngcall) = 1 + iv(nfgcal) = 1 + iv(mode) = -1 + iv(model) = 1 + iv(stglim) = 1 + iv(toobig) = 0 + iv(cnvcod) = 0 + iv(radinc) = 0 + v(rad0) = zero + if (v(dinit) .ge. zero) call vscopy(n, d, v(dinit)) + if (iv(inith) .ne. 1) go to 40 +c +c *** set the initial hessian approximation to diag(d)**-2 *** +c + l = iv(lmat) + call vscopy(n*(n+1)/2, v(l), zero) + k = l - 1 + do 30 i = 1, n + k = k + i + t = d(i) + if (t .le. zero) t = one + v(k) = t + 30 continue +c +c *** compute initial function value *** +c + 40 iv(1) = 1 + go to 999 +c + 50 v(f) = fx + if (iv(mode) .ge. 0) go to 180 + iv(1) = 2 + if (iv(toobig) .eq. 0) go to 999 + iv(1) = 63 + go to 300 +c +c *** make sure gradient could be computed *** +c + 60 if (iv(nfgcal) .ne. 0) go to 70 + iv(1) = 65 + go to 300 +c + 70 dg1 = iv(dg) + call vvmulp(n, v(dg1), g, d, -1) + v(dgnorm) = v2norm(n, v(dg1)) +c +c *** test norm of gradient *** +c + if (v(dgnorm) .gt. v(afctol)) go to 75 + iv(irc) = 10 + iv(cnvcod) = iv(irc) - 4 +c + 75 if (iv(cnvcod) .ne. 0) go to 290 + if (iv(mode) .eq. 0) go to 250 +c +c *** allow first step to have scaled 2-norm at most v(lmax0) *** +c + v(radius) = v(lmax0) +c + iv(mode) = 0 +c +c +c----------------------------- main loop ----------------------------- +c +c +c *** print iteration summary, check iteration limit *** +c + 80 call itsum(d, g, iv, liv, lv, n, v, x) + 90 k = iv(niter) + if (k .lt. iv(mxiter)) go to 100 + iv(1) = 10 + go to 300 +c +c *** update radius *** +c + 100 iv(niter) = k + 1 + if(k.gt.0)v(radius) = v(radfac) * v(dstnrm) +c +c *** initialize for start of next iteration *** +c + g01 = iv(g0) + x01 = iv(x0) + v(f0) = v(f) + iv(irc) = 4 + iv(kagqt) = -1 +c +c *** copy x to x0, g to g0 *** +c + call vcopy(n, v(x01), x) + call vcopy(n, v(g01), g) +c +c *** check stopx and function evaluation limit *** +c +C AL 4/30/95 + dummy=iv(nfcall) + 110 if (.not. stopx(dummy)) go to 130 + iv(1) = 11 + go to 140 +c +c *** come here when restarting after func. eval. limit or stopx. +c + 120 if (v(f) .ge. v(f0)) go to 130 + v(radfac) = one + k = iv(niter) + go to 100 +c + 130 if (iv(nfcall) .lt. iv(mxfcal)) go to 150 + iv(1) = 9 + 140 if (v(f) .ge. v(f0)) go to 300 +c +c *** in case of stopx or function evaluation limit with +c *** improved v(f), evaluate the gradient at x. +c + iv(cnvcod) = iv(1) + go to 240 +c +c. . . . . . . . . . . . . compute candidate step . . . . . . . . . . +c + 150 step1 = iv(step) + dg1 = iv(dg) + nwtst1 = iv(nwtstp) + if (iv(kagqt) .ge. 0) go to 160 + l = iv(lmat) + call livmul(n, v(nwtst1), v(l), g) + v(nreduc) = half * dotprd(n, v(nwtst1), v(nwtst1)) + call litvmu(n, v(nwtst1), v(l), v(nwtst1)) + call vvmulp(n, v(step1), v(nwtst1), d, 1) + v(dst0) = v2norm(n, v(step1)) + call vvmulp(n, v(dg1), v(dg1), d, -1) + call ltvmul(n, v(step1), v(l), v(dg1)) + v(gthg) = v2norm(n, v(step1)) + iv(kagqt) = 0 + 160 call dbdog(v(dg1), lv, n, v(nwtst1), v(step1), v) + if (iv(irc) .eq. 6) go to 180 +c +c *** check whether evaluating f(x0 + step) looks worthwhile *** +c + if (v(dstnrm) .le. zero) go to 180 + if (iv(irc) .ne. 5) go to 170 + if (v(radfac) .le. one) go to 170 + if (v(preduc) .le. onep2 * v(fdif)) go to 180 +c +c *** compute f(x0 + step) *** +c + 170 x01 = iv(x0) + step1 = iv(step) + call vaxpy(n, x, one, v(step1), v(x01)) + iv(nfcall) = iv(nfcall) + 1 + iv(1) = 1 + iv(toobig) = 0 + go to 999 +c +c. . . . . . . . . . . . . assess candidate step . . . . . . . . . . . +c + 180 x01 = iv(x0) + v(reldx) = reldst(n, d, x, v(x01)) + call assst(iv, liv, lv, v) + step1 = iv(step) + lstgst = iv(stlstg) + if (iv(restor) .eq. 1) call vcopy(n, x, v(x01)) + if (iv(restor) .eq. 2) call vcopy(n, v(lstgst), v(step1)) + if (iv(restor) .ne. 3) go to 190 + call vcopy(n, v(step1), v(lstgst)) + call vaxpy(n, x, one, v(step1), v(x01)) + v(reldx) = reldst(n, d, x, v(x01)) +c + 190 k = iv(irc) + go to (200,230,230,230,200,210,220,220,220,220,220,220,280,250), k +c +c *** recompute step with changed radius *** +c + 200 v(radius) = v(radfac) * v(dstnrm) + go to 110 +c +c *** compute step of length v(lmaxs) for singular convergence test. +c + 210 v(radius) = v(lmaxs) + go to 150 +c +c *** convergence or false convergence *** +c + 220 iv(cnvcod) = k - 4 + if (v(f) .ge. v(f0)) go to 290 + if (iv(xirc) .eq. 14) go to 290 + iv(xirc) = 14 +c +c. . . . . . . . . . . . process acceptable step . . . . . . . . . . . +c + 230 if (iv(irc) .ne. 3) go to 240 + step1 = iv(step) + temp1 = iv(stlstg) +c +c *** set temp1 = hessian * step for use in gradient tests *** +c + l = iv(lmat) + call ltvmul(n, v(temp1), v(l), v(step1)) + call lvmul(n, v(temp1), v(l), v(temp1)) +c +c *** compute gradient *** +c + 240 iv(ngcall) = iv(ngcall) + 1 + iv(1) = 2 + go to 999 +c +c *** initializations -- g0 = g - g0, etc. *** +c + 250 g01 = iv(g0) + call vaxpy(n, v(g01), negone, v(g01), g) + step1 = iv(step) + temp1 = iv(stlstg) + if (iv(irc) .ne. 3) go to 270 +c +c *** set v(radfac) by gradient tests *** +c +c *** set temp1 = diag(d)**-1 * (hessian*step + (g(x0)-g(x))) *** +c + call vaxpy(n, v(temp1), negone, v(g01), v(temp1)) + call vvmulp(n, v(temp1), v(temp1), d, -1) +c +c *** do gradient tests *** +c + if (v2norm(n, v(temp1)) .le. v(dgnorm) * v(tuner4)) + 1 go to 260 + if (dotprd(n, g, v(step1)) + 1 .ge. v(gtstep) * v(tuner5)) go to 270 + 260 v(radfac) = v(incfac) +c +c *** update h, loop *** +c + 270 w = iv(nwtstp) + z = iv(x0) + l = iv(lmat) + call wzbfgs(v(l), n, v(step1), v(w), v(g01), v(z)) +c +c ** use the n-vectors starting at v(step1) and v(g01) for scratch.. + call lupdat(v(temp1), v(step1), v(l), v(g01), v(l), n, v(w), v(z)) + iv(1) = 2 + go to 80 +c +c. . . . . . . . . . . . . . misc. details . . . . . . . . . . . . . . +c +c *** bad parameters to assess *** +c + 280 iv(1) = 64 + go to 300 +c +c *** print summary of final iteration and other requested items *** +c + 290 iv(1) = iv(cnvcod) + iv(cnvcod) = 0 + 300 call itsum(d, g, iv, liv, lv, n, v, x) +c + 999 return +c +c *** last line of sumit follows *** + end + subroutine dbdog(dig, lv, n, nwtstp, step, v) +c +c *** compute double dogleg step *** +c +c *** parameter declarations *** +c + integer lv, n + double precision dig(n), nwtstp(n), step(n), v(lv) +c +c *** purpose *** +c +c this subroutine computes a candidate step (for use in an uncon- +c strained minimization code) by the double dogleg algorithm of +c dennis and mei (ref. 1), which is a variation on powell*s dogleg +c scheme (ref. 2, p. 95). +c +c-------------------------- parameter usage -------------------------- +c +c dig (input) diag(d)**-2 * g -- see algorithm notes. +c g (input) the current gradient vector. +c lv (input) length of v. +c n (input) number of components in dig, g, nwtstp, and step. +c nwtstp (input) negative newton step -- see algorithm notes. +c step (output) the computed step. +c v (i/o) values array, the following components of which are +c used here... +c v(bias) (input) bias for relaxed newton step, which is v(bias) of +c the way from the full newton to the fully relaxed newton +c step. recommended value = 0.8 . +c v(dgnorm) (input) 2-norm of diag(d)**-1 * g -- see algorithm notes. +c v(dstnrm) (output) 2-norm of diag(d) * step, which is v(radius) +c unless v(stppar) = 0 -- see algorithm notes. +c v(dst0) (input) 2-norm of diag(d) * nwtstp -- see algorithm notes. +c v(grdfac) (output) the coefficient of dig in the step returned -- +c step(i) = v(grdfac)*dig(i) + v(nwtfac)*nwtstp(i). +c v(gthg) (input) square-root of (dig**t) * (hessian) * dig -- see +c algorithm notes. +c v(gtstep) (output) inner product between g and step. +c v(nreduc) (output) function reduction predicted for the full newton +c step. +c v(nwtfac) (output) the coefficient of nwtstp in the step returned -- +c see v(grdfac) above. +c v(preduc) (output) function reduction predicted for the step returned. +c v(radius) (input) the trust region radius. d times the step returned +c has 2-norm v(radius) unless v(stppar) = 0. +c v(stppar) (output) code telling how step was computed... 0 means a +c full newton step. between 0 and 1 means v(stppar) of the +c way from the newton to the relaxed newton step. between +c 1 and 2 means a true double dogleg step, v(stppar) - 1 of +c the way from the relaxed newton to the cauchy step. +c greater than 2 means 1 / (v(stppar) - 1) times the cauchy +c step. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c let g and h be the current gradient and hessian approxima- +c tion respectively and let d be the current scale vector. this +c routine assumes dig = diag(d)**-2 * g and nwtstp = h**-1 * g. +c the step computed is the same one would get by replacing g and h +c by diag(d)**-1 * g and diag(d)**-1 * h * diag(d)**-1, +c computing step, and translating step back to the original +c variables, i.e., premultiplying it by diag(d)**-1. +c +c *** references *** +c +c 1. dennis, j.e., and mei, h.h.w. (1979), two new unconstrained opti- +c mization algorithms which use function and gradient +c values, j. optim. theory applic. 28, pp. 453-482. +c 2. powell, m.j.d. (1970), a hybrid method for non-linear equations, +c in numerical methods for non-linear equations, edited by +c p. rabinowitz, gordon and breach, london. +c +c *** general *** +c +c coded by david m. gay. +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** functions and subroutines called *** +c + external dotprd, v2norm + double precision dotprd, v2norm +c +c dotprd... returns inner product of two vectors. +c v2norm... returns 2-norm of a vector. +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i + double precision cfact, cnorm, ctrnwt, ghinvg, femnsq, gnorm, + 1 nwtnrm, relax, rlambd, t, t1, t2 + double precision half, one, two, zero +c +c *** v subscripts *** +c + integer bias, dgnorm, dstnrm, dst0, grdfac, gthg, gtstep, + 1 nreduc, nwtfac, preduc, radius, stppar +c +c *** data initializations *** +c +c/6 +c data half/0.5d+0/, one/1.d+0/, two/2.d+0/, zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, two=2.d+0, zero=0.d+0) +c/ +c +c/6 +c data bias/43/, dgnorm/1/, dstnrm/2/, dst0/3/, grdfac/45/, +c 1 gthg/44/, gtstep/4/, nreduc/6/, nwtfac/46/, preduc/7/, +c 2 radius/8/, stppar/5/ +c/7 + parameter (bias=43, dgnorm=1, dstnrm=2, dst0=3, grdfac=45, + 1 gthg=44, gtstep=4, nreduc=6, nwtfac=46, preduc=7, + 2 radius=8, stppar=5) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nwtnrm = v(dst0) + rlambd = one + if (nwtnrm .gt. zero) rlambd = v(radius) / nwtnrm + gnorm = v(dgnorm) + ghinvg = two * v(nreduc) + v(grdfac) = zero + v(nwtfac) = zero + if (rlambd .lt. one) go to 30 +c +c *** the newton step is inside the trust region *** +c + v(stppar) = zero + v(dstnrm) = nwtnrm + v(gtstep) = -ghinvg + v(preduc) = v(nreduc) + v(nwtfac) = -one + do 20 i = 1, n + 20 step(i) = -nwtstp(i) + go to 999 +c + 30 v(dstnrm) = v(radius) + cfact = (gnorm / v(gthg))**2 +c *** cauchy step = -cfact * g. + cnorm = gnorm * cfact + relax = one - v(bias) * (one - gnorm*cnorm/ghinvg) + if (rlambd .lt. relax) go to 50 +c +c *** step is between relaxed newton and full newton steps *** +c + v(stppar) = one - (rlambd - relax) / (one - relax) + t = -rlambd + v(gtstep) = t * ghinvg + v(preduc) = rlambd * (one - half*rlambd) * ghinvg + v(nwtfac) = t + do 40 i = 1, n + 40 step(i) = t * nwtstp(i) + go to 999 +c + 50 if (cnorm .lt. v(radius)) go to 70 +c +c *** the cauchy step lies outside the trust region -- +c *** step = scaled cauchy step *** +c + t = -v(radius) / gnorm + v(grdfac) = t + v(stppar) = one + cnorm / v(radius) + v(gtstep) = -v(radius) * gnorm + v(preduc) = v(radius)*(gnorm - half*v(radius)*(v(gthg)/gnorm)**2) + do 60 i = 1, n + 60 step(i) = t * dig(i) + go to 999 +c +c *** compute dogleg step between cauchy and relaxed newton *** +c *** femur = relaxed newton step minus cauchy step *** +c + 70 ctrnwt = cfact * relax * ghinvg / gnorm +c *** ctrnwt = inner prod. of cauchy and relaxed newton steps, +c *** scaled by gnorm**-1. + t1 = ctrnwt - gnorm*cfact**2 +c *** t1 = inner prod. of femur and cauchy step, scaled by +c *** gnorm**-1. + t2 = v(radius)*(v(radius)/gnorm) - gnorm*cfact**2 + t = relax * nwtnrm + femnsq = (t/gnorm)*t - ctrnwt - t1 +c *** femnsq = square of 2-norm of femur, scaled by gnorm**-1. + t = t2 / (t1 + dsqrt(t1**2 + femnsq*t2)) +c *** dogleg step = cauchy step + t * femur. + t1 = (t - one) * cfact + v(grdfac) = t1 + t2 = -t * relax + v(nwtfac) = t2 + v(stppar) = two - t + v(gtstep) = t1*gnorm**2 + t2*ghinvg + v(preduc) = -t1*gnorm * ((t2 + one)*gnorm) + 1 - t2 * (one + half*t2)*ghinvg + 2 - half * (v(gthg)*t1)**2 + do 80 i = 1, n + 80 step(i) = t1*dig(i) + t2*nwtstp(i) +c + 999 return +c *** last line of dbdog follows *** + end + subroutine ltvmul(n, x, l, y) +c +c *** compute x = (l**t)*y, where l is an n x n lower +c *** triangular matrix stored compactly by rows. x and y may +c *** occupy the same storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) +c dimension l(n*(n+1)/2) + integer i, ij, i0, j + double precision yi, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + i0 = 0 + do 20 i = 1, n + yi = y(i) + x(i) = zero + do 10 j = 1, i + ij = i0 + j + x(j) = x(j) + yi*l(ij) + 10 continue + i0 = i0 + i + 20 continue + 999 return +c *** last card of ltvmul follows *** + end + subroutine lupdat(beta, gamma, l, lambda, lplus, n, w, z) +c +c *** compute lplus = secant update of l *** +c +c *** parameter declarations *** +c + integer n +cal double precision beta(n), gamma(n), l(1), lambda(n), lplus(1), + double precision beta(n), gamma(n), l(n*(n+1)/2), lambda(n), + 1 lplus(n*(n+1)/2),w(n), z(n) +c dimension l(n*(n+1)/2), lplus(n*(n+1)/2) +c +c-------------------------- parameter usage -------------------------- +c +c beta = scratch vector. +c gamma = scratch vector. +c l (input) lower triangular matrix, stored rowwise. +c lambda = scratch vector. +c lplus (output) lower triangular matrix, stored rowwise, which may +c occupy the same storage as l. +c n (input) length of vector parameters and order of matrices. +c w (input, destroyed on output) right singular vector of rank 1 +c correction to l. +c z (input, destroyed on output) left singular vector of rank 1 +c correction to l. +c +c------------------------------- notes ------------------------------- +c +c *** application and usage restrictions *** +c +c this routine updates the cholesky factor l of a symmetric +c positive definite matrix to which a secant update is being +c applied -- it computes a cholesky factor lplus of +c l * (i + z*w**t) * (i + w*z**t) * l**t. it is assumed that w +c and z have been chosen so that the updated matrix is strictly +c positive definite. +c +c *** algorithm notes *** +c +c this code uses recurrence 3 of ref. 1 (with d(j) = 1 for all j) +c to compute lplus of the form l * (i + z*w**t) * q, where q +c is an orthogonal matrix that makes the result lower triangular. +c lplus may have some negative diagonal elements. +c +c *** references *** +c +c 1. goldfarb, d. (1976), factorized variable metric methods for uncon- +c strained optimization, math. comput. 30, pp. 796-811. +c +c *** general *** +c +c coded by david m. gay (fall 1979). +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i, ij, j, jj, jp1, k, nm1, np1 + double precision a, b, bj, eta, gj, lj, lij, ljj, nu, s, theta, + 1 wj, zj + double precision one, zero +c +c *** data initializations *** +c +c/6 +c data one/1.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nu = one + eta = zero + if (n .le. 1) go to 30 + nm1 = n - 1 +c +c *** temporarily store s(j) = sum over k = j+1 to n of w(k)**2 in +c *** lambda(j). +c + s = zero + do 10 i = 1, nm1 + j = n - i + s = s + w(j+1)**2 + lambda(j) = s + 10 continue +c +c *** compute lambda, gamma, and beta by goldfarb*s recurrence 3. +c + do 20 j = 1, nm1 + wj = w(j) + a = nu*z(j) - eta*wj + theta = one + a*wj + s = a*lambda(j) + lj = dsqrt(theta**2 + a*s) + if (theta .gt. zero) lj = -lj + lambda(j) = lj + b = theta*wj + s + gamma(j) = b * nu / lj + beta(j) = (a - b*eta) / lj + nu = -nu / lj + eta = -(eta + (a**2)/(theta - lj)) / lj + 20 continue + 30 lambda(n) = one + (nu*z(n) - eta*w(n))*w(n) +c +c *** update l, gradually overwriting w and z with l*w and l*z. +c + np1 = n + 1 + jj = n * (n + 1) / 2 + do 60 k = 1, n + j = np1 - k + lj = lambda(j) + ljj = l(jj) + lplus(jj) = lj * ljj + wj = w(j) + w(j) = ljj * wj + zj = z(j) + z(j) = ljj * zj + if (k .eq. 1) go to 50 + bj = beta(j) + gj = gamma(j) + ij = jj + j + jp1 = j + 1 + do 40 i = jp1, n + lij = l(ij) + lplus(ij) = lj*lij + bj*w(i) + gj*z(i) + w(i) = w(i) + lij*wj + z(i) = z(i) + lij*zj + ij = ij + i + 40 continue + 50 jj = jj - j + 60 continue +c + 999 return +c *** last card of lupdat follows *** + end + subroutine lvmul(n, x, l, y) +c +c *** compute x = l*y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) +c dimension l(n*(n+1)/2) + integer i, ii, ij, i0, j, np1 + double precision t, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + np1 = n + 1 + i0 = n*(n+1)/2 + do 20 ii = 1, n + i = np1 - ii + i0 = i0 - i + t = zero + do 10 j = 1, i + ij = i0 + j + t = t + l(ij)*y(j) + 10 continue + x(i) = t + 20 continue + 999 return +c *** last card of lvmul follows *** + end + subroutine vvmulp(n, x, y, z, k) +c +c *** set x(i) = y(i) * z(i)**k, 1 .le. i .le. n (for k = 1 or -1) *** +c + integer n, k + double precision x(n), y(n), z(n) + integer i +c + if (k .ge. 0) go to 20 + do 10 i = 1, n + 10 x(i) = y(i) / z(i) + go to 999 +c + 20 do 30 i = 1, n + 30 x(i) = y(i) * z(i) + 999 return +c *** last card of vvmulp follows *** + end + subroutine wzbfgs (l, n, s, w, y, z) +c +c *** compute y and z for lupdat corresponding to bfgs update. +c + integer n +cal double precision l(1), s(n), w(n), y(n), z(n) + double precision l(n*(n+1)/2), s(n), w(n), y(n), z(n) +c dimension l(n*(n+1)/2) +c +c-------------------------- parameter usage -------------------------- +c +c l (i/o) cholesky factor of hessian, a lower triang. matrix stored +c compactly by rows. +c n (input) order of l and length of s, w, y, z. +c s (input) the step just taken. +c w (output) right singular vector of rank 1 correction to l. +c y (input) change in gradients corresponding to s. +c z (output) left singular vector of rank 1 correction to l. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c when s is computed in certain ways, e.g. by gqtstp or +c dbldog, it is possible to save n**2/2 operations since (l**t)*s +c or l*(l**t)*s is then known. +c if the bfgs update to l*(l**t) would reduce its determinant to +c less than eps times its old value, then this routine in effect +c replaces y by theta*y + (1 - theta)*l*(l**t)*s, where theta +c (between 0 and 1) is chosen to make the reduction factor = eps. +c +c *** general *** +c +c coded by david m. gay (fall 1979). +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** functions and subroutines called *** +c + external dotprd, livmul, ltvmul + double precision dotprd +c dotprd returns inner product of two vectors. +c livmul multiplies l**-1 times a vector. +c ltvmul multiplies l**t times a vector. +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i + double precision cs, cy, eps, epsrt, one, shs, ys, theta +c +c *** data initializations *** +c +c/6 +c data eps/0.1d+0/, one/1.d+0/ +c/7 + parameter (eps=0.1d+0, one=1.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + call ltvmul(n, w, l, s) + shs = dotprd(n, w, w) + ys = dotprd(n, y, s) + if (ys .ge. eps*shs) go to 10 + theta = (one - eps) * shs / (shs - ys) + epsrt = dsqrt(eps) + cy = theta / (shs * epsrt) + cs = (one + (theta-one)/epsrt) / shs + go to 20 + 10 cy = one / (dsqrt(ys) * dsqrt(shs)) + cs = one / shs + 20 call livmul(n, z, l, y) + do 30 i = 1, n + 30 z(i) = cy * z(i) - cs * w(i) +c + 999 return +c *** last card of wzbfgs follows *** + end -- 1.7.9.5