Analytics Template Library
 All Classes Namespaces Functions Variables Pages
port.hpp
1 #ifndef PORT_HPP
2 #define PORT_HPP
3 
11 #include <limits>
12 #include <cmath>
13 #include <iostream>
14 #include <cfloat>
15 #include <limits.h>
16 
17 
18 namespace port {
19 
20  typedef long int integer;
21  typedef long int logical;
22 
23 
24 #define TRUE_ (1)
25 #define FALSE_ (0)
26 
27  typedef long int flag;
28  typedef long int ftnlen;
29  typedef long int ftnint;
30 
31  typedef struct {
32  flag cierr;
33  ftnint ciunit;
34  flag ciend;
35  char *cifmt;
36  ftnint cirec;
37  } cilist;
38 
39 
40 
41  static integer ndfalt = 0;
42  static integer c__2 = 2;
43  static double c_b13 = 0.;
44  static integer c_n1 = -1;
45  static integer c__1 = 1;
46  static double c_b33 = 1.;
47  static double c_b44 = -1.;
48 
49  int stopx_(integer* i) {
50 
51  return 0;
52  }
53 
54  static integer c__3 = 3;
55  static integer c__4 = 4;
56  static double c_b4 = .33333333333333331;
57  static integer c__5 = 5;
58  static integer c__6 = 6;
59 
60  static integer c__32767 = 32767;
61  static integer c_b8 = 16777215;
62  static integer c__16405 = 16405;
63  static integer c_b12 = 9876536;
64  static integer c__0 = 0;
65  static integer c_b18 = 4194303;
66  static integer c__9 = 9;
67  static double c_b16 = 0.;
68  static logical c_false = false;
69  static double c_b40 = 1.;
70  static double c_b45 = -1.;
71 
72  //
73  //integer i1mach_(integer *i__)
74  //{
75  // /* Initialized data */
76  //
77  // static integer t3e[3] = { 9777664,5323660,46980 };
78  // static integer sc = 0;
79  //
80  // /* Format strings */
81  // static char fmt_9010[] = "(/\002 Adjust autodoubled I1MACH by uncommenti"
82  // "ng data\002/\002 statements appropriate for your machine and set"
83  // "ting\002/\002 IMACH(I) = IMACH(I+3) for I = 11, 12, and 13.\002)";
84  // static char fmt_9020[] = "(/\002 Adjust I1MACH by uncommenting data stat"
85  // "ements\002/\002 appropriate for your machine.\002)";
86  //
87  // /* System generated locals */
88  // integer ret_val;
89  // static integer equiv_0[16];
90  // static double equiv_1[2];
91  //
92  // /* Builtin functions */
93  // integer s_wsfe(cilist *), e_wsfe(void);
94  // /* Subroutine */ int s_stop(char *, ftnlen);
95  // integer s_wsle(cilist *), do_lio(integer *, integer *, char *, ftnlen),
96  // e_wsle(void);
97  //
98  // /* Local variables */
99  // static integer j, k, i3;
100  //#define imach (equiv_0)
101  //#define rmach (equiv_1)
102  // //extern /* Subroutine */ int i1mcr1_(integer *, integer *, integer *,
104  //#define small ((integer *)equiv_1)
105  //#define output (equiv_0 + 3)
106  //
107  // /* Fortran I/O blocks */
108  // static cilist io___7 = { 0, 6, 0, fmt_9010, 0 };
109  // static cilist io___11 = { 0, 6, 0, fmt_9020, 0 };
110  // static cilist io___12 = { 0, 6, 0, 0, 0 };
111  //
112  //
113  //
135  //
145  //
147  //
164  //
167  //
184  //
186  //
190  //
207  //
208  // if (sc != 987) {
210  // small[1] = 0;
211  // *rmach = 1e13f;
212  // if (small[1] != 0) {
214  // if (small[0] == 1117925532 && small[1] == -448790528 || small[1]
215  // == 1117925532 && small[0] == -448790528) {
217  // imach[9] = 2;
218  // imach[13] = 53;
219  // imach[14] = -1021;
220  // imach[15] = 1024;
221  // } else if (small[0] == -2065213935 && small[1] == 10752) {
223  // imach[9] = 2;
224  // imach[13] = 56;
225  // imach[14] = -127;
226  // imach[15] = 127;
227  // } else if (small[0] == 1267827943 && small[1] == 704643072) {
229  // imach[9] = 16;
230  // imach[13] = 14;
231  // imach[14] = -64;
232  // imach[15] = 63;
233  // } else {
234  // s_wsfe(&io___7);
235  // e_wsfe();
236  // s_stop("777", (ftnlen)3);
237  // }
238  // imach[10] = imach[13];
239  // imach[11] = imach[14];
240  // imach[12] = imach[15];
241  // } else {
242  // *rmach = 1234567.f;
243  // if (small[0] == 1234613304) {
245  // imach[9] = 2;
246  // imach[10] = 24;
247  // imach[11] = -125;
248  // imach[12] = 128;
249  // imach[13] = 53;
250  // imach[14] = -1021;
251  // imach[15] = 1024;
252  // sc = 987;
253  // } else if (small[0] == -1271379306) {
255  // imach[9] = 2;
256  // imach[10] = 24;
257  // imach[11] = -127;
258  // imach[12] = 127;
259  // imach[13] = 56;
260  // imach[14] = -127;
261  // imach[15] = 127;
262  // sc = 987;
263  // } else if (small[0] == 1175639687) {
265  // imach[9] = 16;
266  // imach[10] = 6;
267  // imach[11] = -64;
268  // imach[12] = 63;
269  // imach[13] = 14;
270  // imach[14] = -64;
271  // imach[15] = 63;
272  // sc = 987;
273  // } else if (small[0] == 1251390520) {
275  // imach[9] = 2;
276  // imach[10] = 24;
277  // imach[11] = -128;
278  // imach[12] = 127;
279  // imach[13] = 53;
280  // imach[14] = -1024;
281  // imach[15] = 1023;
282  // } else {
283  // for (i3 = 1; i3 <= 3; ++i3) {
284  // j = small[0] / 10000000;
285  // k = small[0] - j * 10000000;
286  // if (k != t3e[i3 - 1]) {
287  // goto L20;
288  // }
289  // small[0] = j;
291  // }
293  // imach[0] = 5;
294  // imach[1] = 6;
295  // imach[2] = 0;
296  // imach[3] = 0;
297  // imach[4] = 64;
298  // imach[5] = 8;
299  // imach[6] = 2;
300  // imach[7] = 63;
301  // i1mcr1_(&imach[8], &k, &c__32767, &c_b8, &c_b8);
302  // imach[9] = 2;
303  // imach[10] = 53;
304  // imach[11] = -1021;
305  // imach[12] = 1024;
306  // imach[13] = 53;
307  // imach[14] = -1021;
308  // imach[15] = 1024;
309  // goto L35;
310  //L20:
311  // i1mcr1_(&j, &k, &c__16405, &c_b12, &c__0);
312  // if (small[0] != j) {
313  // s_wsfe(&io___11);
314  // e_wsfe();
315  // s_stop("777", (ftnlen)3);
316  // }
318  // imach[0] = 5;
319  // imach[1] = 6;
320  // imach[2] = 102;
321  // imach[3] = 6;
322  // imach[4] = 46;
323  // imach[5] = 8;
324  // imach[6] = 2;
325  // imach[7] = 45;
326  // i1mcr1_(&imach[8], &k, &c__0, &c_b18, &c_b8);
327  // imach[9] = 2;
328  // imach[10] = 47;
329  // imach[11] = -8188;
330  // imach[12] = 8189;
331  // imach[13] = 94;
332  // imach[14] = -8141;
333  // imach[15] = 8189;
334  // goto L35;
335  // }
336  // }
337  // imach[0] = 5;
338  // imach[1] = 6;
339  // imach[2] = 7;
340  // imach[3] = 6;
341  // imach[4] = 32;
342  // imach[5] = 4;
343  // imach[6] = 2;
344  // imach[7] = 31;
345  // imach[8] = 2147483647;
346  //L35:
347  // sc = 987;
348  // }
349  // if (*i__ < 1 || *i__ > 16) {
350  // goto L40;
351  // }
352  // ret_val = imach[*i__ - 1];
353  // return ret_val;
354  //L40:
355  // s_wsle(&io___12);
356  // do_lio(&c__9, &c__1, "I1MACH(I): I =", (ftnlen)14);
357  // do_lio(&c__3, &c__1, (char *)&(*i__), (ftnlen)sizeof(integer));
358  // do_lio(&c__9, &c__1, " is out of bounds.", (ftnlen)18);
359  // e_wsle();
360  // s_stop("", (ftnlen)0);
367  //
368 
369  inline long i1mach_(long *i) {
370  switch (*i) {
371  case 1: return 5;
372  case 2: return 6;
373  case 3: return 7;
374  case 4: return 0;
375  case 5: return 32;
376  case 6: return sizeof (int);
377  case 7: return 2;
378  case 8: return 31;
379  case 9: return LONG_MAX;
380  case 10: return FLT_RADIX;
381  case 11: return FLT_MANT_DIG;
382  case 12: return FLT_MIN_EXP;
383  case 13: return FLT_MAX_EXP;
384  case 14: return DBL_MANT_DIG;
385  case 15: return DBL_MIN_EXP;
386  case 16: return DBL_MAX_EXP;
387  }
388  fprintf(stderr, "invalid argument: i1mach(%ld)\n", *i);
389  exit(1);
390  return 0;
391  }
392  // return ret_val;
393  //} /* i1mach_ */
394 
395  template<typename T>
396  inline T d1mach_(long *i) {
397  switch (*i) {
398  case 1: return std::numeric_limits<T>::min();
399  case 2: return std::numeric_limits<T>::max();
400  case 3: return std::numeric_limits<T>::epsilon() / std::numeric_limits<T>::radix;
401  case 4: return std::numeric_limits<T>::epsilon();
402  case 5: return std::log10(std::numeric_limits<T>::radix);
403  }
404  std::cerr << "invalid argument: d1mach(%ld)\n" << *i;
405  exit(1);
406  return 0;
407  }
408 
409  //
410 
411  integer i7mdcn_(integer *k) {
412  /* Initialized data */
413 
414  static integer mdperm[3] = {2, 4, 1};
415 
416  /* System generated locals */
417  integer ret_val;
418 
419  /* Local variables */
420  //extern integer i1mach_(integer *);
421 
422 
423 
424  /* *** RETURN INTEGER MACHINE-DEPENDENT CONSTANTS *** */
425 
426  /* *** K = 1 MEANS RETURN STANDARD OUTPUT UNIT NUMBER. *** */
427  /* *** K = 2 MEANS RETURN ALTERNATE OUTPUT UNIT NUMBER. *** */
428  /* *** K = 3 MEANS RETURN INPUT UNIT NUMBER. *** */
429  /* (NOTE -- K = 2, 3 ARE USED ONLY BY TEST PROGRAMS.) */
430 
431  /* +++ PORT VERSION FOLLOWS... */
432  ret_val = i1mach_(&mdperm[(0 + (0 + ((*k - 1) << 2))) / 4]);
433  /* +++ END OF PORT VERSION +++ */
434 
435  /* +++ NON-PORT VERSION FOLLOWS... */
436  /* INTEGER MDCON(3) */
437  /* DATA MDCON(1)/6/, MDCON(2)/8/, MDCON(3)/5/ */
438  /* I7MDCN = MDCON(K) */
439  /* +++ END OF NON-PORT VERSION +++ */
440 
441  /* L999: */
442  return ret_val;
443  /* *** LAST CARD OF I7MDCN FOLLOWS *** */
444  } /* i7mdcn_ */
445 
446  template<typename doublereal>
447  doublereal dr7mdc_(integer *k) {
448  /* Initialized data */
449 
450  static doublereal big = 0.;
451  static doublereal eta = 0.;
452  static doublereal machep = 0.;
453  static doublereal zero = 0.;
454 
455  /* System generated locals */
456  doublereal ret_val;
457 
458  /* Builtin functions */
459  // double sqrt(doublereal);
460 
461  /* Local variables */
462  // extern doublereal d1mach_(integer *);
463 
464 
465  /* *** RETURN MACHINE DEPENDENT CONSTANTS USED BY NL2SOL *** */
466 
467 
468  /* *** THE CONSTANT RETURNED DEPENDS ON K... */
469 
470  /* *** K = 1... SMALLEST POS. ETA SUCH THAT -ETA EXISTS. */
471  /* *** K = 2... SQUARE ROOT OF ETA. */
472  /* *** K = 3... UNIT ROUNDOFF = SMALLEST POS. NO. MACHEP SUCH */
473  /* *** THAT 1 + MACHEP .GT. 1 .AND. 1 - MACHEP .LT. 1. */
474  /* *** K = 4... SQUARE ROOT OF MACHEP. */
475  /* *** K = 5... SQUARE ROOT OF BIG (SEE K = 6). */
476  /* *** K = 6... LARGEST MACHINE NO. BIG SUCH THAT -BIG EXISTS. */
477 
478  /* /+ */
479  /* / */
480 
481  if (big > zero) {
482  goto L1;
483  }
484  big = d1mach_<doublereal>(&c__2);
485  eta = d1mach_<doublereal>(&c__1);
486  machep = d1mach_<doublereal>(&c__4);
487 L1:
488 
489  /* ------------------------------- BODY -------------------------------- */
490 
491  switch (*k) {
492  case 1: goto L10;
493  case 2: goto L20;
494  case 3: goto L30;
495  case 4: goto L40;
496  case 5: goto L50;
497  case 6: goto L60;
498  }
499 
500 L10:
501  ret_val = eta;
502  goto L999;
503 
504 L20:
505  ret_val = std::sqrt(eta * 256.) / 16.;
506  goto L999;
507 
508 L30:
509  ret_val = machep;
510  goto L999;
511 
512 L40:
513  ret_val = std::sqrt(machep);
514  goto L999;
515 
516 L50:
517  ret_val = std::sqrt(big / 256.) * 16.;
518  goto L999;
519 
520 L60:
521  ret_val = big;
522 
523 L999:
524  return ret_val;
525  /* *** LAST CARD OF DR7MDC FOLLOWS *** */
526  } /* dr7mdc_ */
527 
528  //
529 
530  template<typename doublereal>
531  int dv7dfl_(integer *alg, integer *lv, doublereal *v) {
532  /* System generated locals */
533  doublereal d__1, d__2, d__3;
534 
535  /* Builtin functions */
536  // double pow_dd(doublereal *, doublereal *);
537 
538  /* Local variables */
539  //extern doublereal dr7mdc_(integer *);
540  static doublereal machep, mepcrt, sqteps;
541 
542 
543  /* *** SUPPLY ***SOL (VERSION 2.3) DEFAULT VALUES TO V *** */
544 
545  /* *** ALG = 1 MEANS REGRESSION CONSTANTS. */
546  /* *** ALG = 2 MEANS GENERAL UNCONSTRAINED OPTIMIZATION CONSTANTS. */
547 
548 
549  /* DR7MDC... RETURNS MACHINE-DEPENDENT CONSTANTS */
550 
551 
552  /* *** SUBSCRIPTS FOR V *** */
553 
554 
555  /* /6 */
556  /* DATA ONE/1.D+0/, THREE/3.D+0/ */
557  /* /7 */
558  /* / */
559 
560  /* *** V SUBSCRIPT VALUES *** */
561 
562  /* /6 */
563  /* DATA AFCTOL/31/, BIAS/43/, COSMIN/47/, DECFAC/22/, DELTA0/44/, */
564  /* 1 DFAC/41/, DINIT/38/, DLTFDC/42/, DLTFDJ/43/, DTINIT/39/, */
565  /* 2 D0INIT/40/, EPSLON/19/, ETA0/42/, FUZZ/45/, HUBERC/48/, */
566  /* 3 INCFAC/23/, LMAX0/35/, LMAXS/36/, PHMNFC/20/, PHMXFC/21/, */
567  /* 4 RDFCMN/24/, RDFCMX/25/, RFCTOL/32/, RLIMIT/46/, RSPTOL/49/, */
568  /* 5 SCTOL/37/, SIGMIN/50/, TUNER1/26/, TUNER2/27/, TUNER3/28/, */
569  /* 6 TUNER4/29/, TUNER5/30/, XCTOL/33/, XFTOL/34/ */
570  /* /7 */
571  /* / */
572 
573  /* ------------------------------- BODY -------------------------------- */
574 
575  /* Parameter adjustments */
576  --v;
577 
578  /* Function Body */
579  machep = dr7mdc_<doublereal>(&c__3);
580  v[31] = 1e-20;
581  if (machep > 1e-10) {
582  /* Computing 2nd power */
583  d__1 = machep;
584  v[31] = d__1 * d__1;
585  }
586  v[22] = .5;
587  sqteps = dr7mdc_<doublereal>(&c__4);
588  v[41] = .6;
589  v[39] = 1e-6;
590  mepcrt = std::pow(machep, c_b4);
591  v[40] = 1.;
592  v[19] = .1;
593  v[23] = 2.;
594  v[35] = 1.;
595  v[36] = 1.;
596  v[20] = -.1;
597  v[21] = .1;
598  v[24] = .1;
599  v[25] = 4.;
600  /* Computing MAX */
601  /* Computing 2nd power */
602  d__3 = mepcrt;
603  d__1 = 1e-10, d__2 = d__3 * d__3;
604  v[32] = std::max(d__1, d__2);
605  v[37] = v[32];
606  v[26] = .1;
607  v[27] = 1e-4;
608  v[28] = .75;
609  v[29] = .5;
610  v[30] = .75;
611  v[33] = sqteps;
612  v[34] = machep * 100.;
613 
614  if (*alg >= 2) {
615  goto L10;
616  }
617 
618  /* *** REGRESSION VALUES */
619 
620  /* Computing MAX */
621  d__1 = 1e-6, d__2 = machep * 100.;
622  v[47] = std::max(d__1, d__2);
623  v[38] = 0.;
624  v[44] = sqteps;
625  v[42] = mepcrt;
626  v[43] = sqteps;
627  v[45] = 1.5;
628  v[48] = .7;
629  v[46] = dr7mdc_<doublereal>(&c__5);
630  v[49] = .001;
631  v[50] = 1e-4;
632  goto L999;
633 
634  /* *** GENERAL OPTIMIZATION VALUES */
635 
636 L10:
637  v[43] = .8;
638  v[38] = -1.;
639  v[42] = machep * 1e3;
640 
641 L999:
642  return 0;
643  /* *** LAST CARD OF DV7DFL FOLLOWS *** */
644  } /* dv7dfl_ */
645  //
646 
647  template<typename doublereal>
648  inline int divset_(integer *alg, integer *iv, integer *liv, integer
649  *lv, doublereal *v) {
650  /* Initialized data */
651 
652  static integer miniv[4] = {82, 59, 103, 103};
653  static integer minv[4] = {98, 71, 101, 85};
654 
655  static integer mv, miv, alg1;
656  //extern integer i7mdcn_(integer *);
657  //extern /* Subroutine */ int dv7dfl_(integer *, integer *, doublereal *);
658 
659 
660  /* *** SUPPLY ***SOL (VERSION 2.3) DEFAULT VALUES TO IV AND V *** */
661 
662  /* *** ALG = 1 MEANS REGRESSION CONSTANTS. */
663  /* *** ALG = 2 MEANS GENERAL UNCONSTRAINED OPTIMIZATION CONSTANTS. */
664 
665 
666  /* I7MDCN... RETURNS MACHINE-DEPENDENT INTEGER CONSTANTS. */
667  /* DV7DFL.... PROVIDES DEFAULT VALUES TO V. */
668 
669 
670  /* *** SUBSCRIPTS FOR IV *** */
671 
672 
673  /* *** IV SUBSCRIPT VALUES *** */
674 
675  /* /6 */
676  /* DATA ALGSAV/51/, COVPRT/14/, COVREQ/15/, DRADPR/101/, DTYPE/16/, */
677  /* 1 HC/71/, IERR/75/, INITH/25/, INITS/25/, IPIVOT/76/, */
678  /* 2 IVNEED/3/, LASTIV/44/, LASTV/45/, LMAT/42/, MXFCAL/17/, */
679  /* 3 MXITER/18/, NFCOV/52/, NGCOV/53/, NVDFLT/50/, NVSAVE/9/, */
680  /* 4 OUTLEV/19/, PARPRT/20/, PARSAV/49/, PERM/58/, PRUNIT/21/, */
681  /* 5 QRTYP/80/, RDREQ/57/, RMAT/78/, SOLPRT/22/, STATPR/23/, */
682  /* 6 VNEED/4/, VSAVE/60/, X0PRT/24/ */
683  /* /7 */
684  /* / */
685  /* Parameter adjustments */
686  --iv;
687  --v;
688 
689  /* Function Body */
690 
691  /* ------------------------------- BODY -------------------------------- */
692 
693  if (21 <= *liv) {
694  iv[21] = i7mdcn_(&c__1);
695  }
696  if (51 <= *liv) {
697  iv[51] = *alg;
698  }
699  if (*alg < 1 || *alg > 4) {
700  goto L40;
701  }
702  miv = miniv[*alg - 1];
703  if (*liv < miv) {
704  goto L20;
705  }
706  mv = minv[*alg - 1];
707  if (*lv < mv) {
708  goto L30;
709  }
710  alg1 = (*alg - 1) % 2 + 1;
711  dv7dfl_(&alg1, lv, &v[1]);
712  iv[1] = 12;
713  if (*alg > 2) {
714  iv[101] = 1;
715  }
716  iv[3] = 0;
717  iv[44] = miv;
718  iv[45] = mv;
719  iv[42] = mv + 1;
720  iv[17] = 200;
721  iv[18] = 150;
722  iv[19] = 1;
723  iv[20] = 1;
724  iv[58] = miv + 1;
725  iv[22] = 1;
726  iv[23] = 1;
727  iv[4] = 0;
728  iv[24] = 1;
729 
730  if (alg1 >= 2) {
731  goto L10;
732  }
733 
734  /* *** REGRESSION VALUES */
735 
736  iv[14] = 3;
737  iv[15] = 1;
738  iv[16] = 1;
739  iv[71] = 0;
740  iv[75] = 0;
741  iv[25] = 0;
742  iv[76] = 0;
743  iv[50] = 32;
744  iv[60] = 58;
745  if (*alg > 2) {
746  iv[60] += 3;
747  }
748  iv[49] = iv[60] + 9;
749  iv[80] = 1;
750  iv[57] = 3;
751  iv[78] = 0;
752  goto L999;
753 
754  /* *** GENERAL OPTIMIZATION VALUES */
755 
756 L10:
757  iv[16] = 0;
758  iv[25] = 1;
759  iv[52] = 0;
760  iv[53] = 0;
761  iv[50] = 25;
762  iv[49] = 47;
763  if (*alg > 2) {
764  iv[49] = 61;
765  }
766  goto L999;
767 
768 L20:
769  iv[1] = 15;
770  goto L999;
771 
772 L30:
773  iv[1] = 16;
774  goto L999;
775 
776 L40:
777  iv[1] = 67;
778 
779 L999:
780  return 0;
781  /* *** LAST CARD OF DIVSET FOLLOWS *** */
782  } /* divset_ */
783 
784  template<typename doublereal>
785  inline int dv7scp_(integer *p, doublereal *y, doublereal *s) {
786  /* System generated locals */
787  integer i__1;
788 
789  /* Local variables */
790  static integer i__;
791 
792 
793  /* *** SET P-VECTOR Y TO SCALAR S *** */
794 
795 
796 
797  /* Parameter adjustments */
798  --y;
799 
800  /* Function Body */
801  i__1 = *p;
802  for (i__ = 1; i__ <= i__1; ++i__) {
803  /* L10: */
804  y[i__] = *s;
805  }
806  return 0;
807  } /* dv7scp_ */
808 
809  template<typename doublereal>
810  inline int dv7vmp_(integer *n, doublereal *x, doublereal *y,
811  doublereal *z__, integer *k) {
812  /* System generated locals */
813  integer i__1;
814 
815  /* Local variables */
816  static integer i__;
817 
818 
819  /* *** SET X(I) = Y(I) * Z(I)**K, 1 .LE. I .LE. N (FOR K = 1 OR -1) *** */
820 
821 
822  /* Parameter adjustments */
823  --z__;
824  --y;
825  --x;
826 
827  /* Function Body */
828  if (*k >= 0) {
829  goto L20;
830  }
831  i__1 = *n;
832  for (i__ = 1; i__ <= i__1; ++i__) {
833  /* L10: */
834  x[i__] = y[i__] / z__[i__];
835  }
836  goto L999;
837 
838 L20:
839  i__1 = *n;
840  for (i__ = 1; i__ <= i__1; ++i__) {
841  /* L30: */
842  x[i__] = y[i__] * z__[i__];
843  }
844 L999:
845  return 0;
846  /* *** LAST CARD OF DV7VMP FOLLOWS *** */
847  } /* dv7vmp_ */
848 
849  template<typename doublereal>
850  doublereal dv2nrm_(integer *p, doublereal *x) {
851  /* Initialized data */
852 
853  static doublereal sqteta = 0.;
854 
855  /* System generated locals */
856  integer i__1;
857  doublereal ret_val, d__1;
858 
859  /* Builtin functions */
860  // double sqrt(doublereal);
861 
862  /* Local variables */
863  static integer i__, j;
864  static doublereal r__, t, xi, scale;
865  // extern doublereal dr7mdc_(integer *);
866 
867 
868  /* *** RETURN THE 2-NORM OF THE P-VECTOR X, TAKING *** */
869  /* *** CARE TO AVOID THE MOST LIKELY UNDERFLOWS. *** */
870 
871 
872  /* /+ */
873  /* / */
874 
875  /* /6 */
876  /* DATA ONE/1.D+0/, ZERO/0.D+0/ */
877  /* /7 */
878  /* / */
879  /* Parameter adjustments */
880  --x;
881 
882  /* Function Body */
883 
884  if (*p > 0) {
885  goto L10;
886  }
887  ret_val = 0.;
888  goto L999;
889 L10:
890  i__1 = *p;
891  for (i__ = 1; i__ <= i__1; ++i__) {
892  if (x[i__] != 0.) {
893  goto L30;
894  }
895  /* L20: */
896  }
897  ret_val = 0.;
898  goto L999;
899 
900 L30:
901  scale = (d__1 = x[i__], std::fabs(d__1));
902  if (i__ < *p) {
903  goto L40;
904  }
905  ret_val = scale;
906  goto L999;
907 L40:
908  t = 1.;
909  if (sqteta == 0.) {
910  sqteta = dr7mdc_<doublereal>(&c__2);
911  }
912 
913  /* *** SQTETA IS (SLIGHTLY LARGER THAN) THE SQUARE ROOT OF THE */
914  /* *** SMALLEST POSITIVE FLOATING POINT NUMBER ON THE MACHINE. */
915  /* *** THE TESTS INVOLVING SQTETA ARE DONE TO PREVENT UNDERFLOWS. */
916 
917  j = i__ + 1;
918  i__1 = *p;
919  for (i__ = j; i__ <= i__1; ++i__) {
920  xi = (d__1 = x[i__], std::fabs(d__1));
921  if (xi > scale) {
922  goto L50;
923  }
924  r__ = xi / scale;
925  if (r__ > sqteta) {
926  t += r__ * r__;
927  }
928  goto L60;
929 L50:
930  r__ = scale / xi;
931  if (r__ <= sqteta) {
932  r__ = 0.;
933  }
934  t = t * r__ * r__ + 1.;
935  scale = xi;
936 L60:
937  ;
938  }
939 
940  ret_val = scale * std::sqrt(t);
941 L999:
942  return ret_val;
943  /* *** LAST LINE OF DV2NRM FOLLOWS *** */
944  } /* dv2nrm_ */
945 
946  template<typename doublereal>
947  inline int dv7cpy_(integer *p, doublereal *y, doublereal *x) {
948  /* System generated locals */
949  integer i__1;
950 
951  /* Local variables */
952  static integer i__;
953 
954 
955  /* *** SET Y = X, WHERE X AND Y ARE P-VECTORS *** */
956 
957 
958 
959  /* Parameter adjustments */
960  --x;
961  --y;
962 
963  /* Function Body */
964  i__1 = *p;
965  for (i__ = 1; i__ <= i__1; ++i__) {
966  /* L10: */
967  y[i__] = x[i__];
968  }
969  return 0;
970  } /* dv7cpy_ */
971 
972  template<typename doublereal>
973  doublereal dd7tpr_(integer *p, doublereal *x, doublereal *y) {
974  /* Initialized data */
975 
976  static doublereal sqteta = 0.;
977 
978  /* System generated locals */
979  integer i__1;
980  doublereal ret_val, d__1, d__2, d__3, d__4;
981 
982  /* Local variables */
983  static integer i__;
984  static doublereal t;
985  // extern doublereal dr7mdc_(integer *);
986 
987 
988  /* *** RETURN THE INNER PRODUCT OF THE P-VECTORS X AND Y. *** */
989 
990 
991 
992  /* *** DR7MDC(2) RETURNS A MACHINE-DEPENDENT CONSTANT, SQTETA, WHICH */
993  /* *** IS SLIGHTLY LARGER THAN THE SMALLEST POSITIVE NUMBER THAT */
994  /* *** CAN BE SQUARED WITHOUT UNDERFLOWING. */
995 
996  /* /6 */
997  /* DATA ONE/1.D+0/, SQTETA/0.D+0/, ZERO/0.D+0/ */
998  /* /7 */
999  /* Parameter adjustments */
1000  --y;
1001  --x;
1002 
1003  /* Function Body */
1004  /* / */
1005 
1006  ret_val = 0.;
1007  if (*p <= 0) {
1008  goto L999;
1009  }
1010  if (sqteta == 0.) {
1011  sqteta = dr7mdc_<doublereal>(&c__2);
1012  }
1013  i__1 = *p;
1014  for (i__ = 1; i__ <= i__1; ++i__) {
1015  /* Computing MAX */
1016  d__3 = (d__1 = x[i__], std::fabs(d__1)), d__4 = (d__2 = y[i__], std::fabs(d__2));
1017  t = std::max(d__3, d__4);
1018  if (t > 1.) {
1019  goto L10;
1020  }
1021  if (t < sqteta) {
1022  goto L20;
1023  }
1024  t = x[i__] / sqteta * y[i__];
1025  if (std::fabs(t) < sqteta) {
1026  goto L20;
1027  }
1028 L10:
1029  ret_val += x[i__] * y[i__];
1030 L20:
1031  ;
1032  }
1033 
1034 L999:
1035  return ret_val;
1036  /* *** LAST LINE OF DD7TPR FOLLOWS *** */
1037  } /* dd7tpr_ */
1038 
1039  template<typename doublereal>
1040  inline int dl7ivm_(integer *n, doublereal *x, doublereal *l,
1041  doublereal *y) {
1042  /* System generated locals */
1043  integer i__1, i__2;
1044 
1045  /* Local variables */
1046  static integer i__, j, k;
1047  static doublereal t;
1048  // extern doublereal dd7tpr_(integer *, doublereal *, doublereal *);
1049 
1050 
1051  /* *** SOLVE L*X = Y, WHERE L IS AN N X N LOWER TRIANGULAR */
1052  /* *** MATRIX STORED COMPACTLY BY ROWS. X AND Y MAY OCCUPY THE SAME */
1053  /* *** STORAGE. *** */
1054 
1055  /* /6 */
1056  /* DATA ZERO/0.D+0/ */
1057  /* /7 */
1058  /* / */
1059 
1060  /* Parameter adjustments */
1061  --y;
1062  --x;
1063  --l;
1064 
1065  /* Function Body */
1066  i__1 = *n;
1067  for (k = 1; k <= i__1; ++k) {
1068  if (y[k] != 0.) {
1069  goto L20;
1070  }
1071  x[k] = 0.;
1072  /* L10: */
1073  }
1074  goto L999;
1075 L20:
1076  j = k * (k + 1) / 2;
1077  x[k] = y[k] / l[j];
1078  if (k >= *n) {
1079  goto L999;
1080  }
1081  ++k;
1082  i__1 = *n;
1083  for (i__ = k; i__ <= i__1; ++i__) {
1084  i__2 = i__ - 1;
1085  t = dd7tpr_(&i__2, &l[j + 1], &x[1]);
1086  j += i__;
1087  x[i__] = (y[i__] - t) / l[j];
1088  /* L30: */
1089  }
1090 L999:
1091  return 0;
1092  /* *** LAST CARD OF DL7IVM FOLLOWS *** */
1093  } /* dl7ivm_ */
1094 
1095  template<typename doublereal>
1096  int dl7itv_(integer *n, doublereal *x, doublereal *l,
1097  doublereal *y) {
1098  /* System generated locals */
1099  integer i__1, i__2;
1100 
1101  /* Local variables */
1102  static integer i__, j, i0, ii, ij;
1103  static doublereal xi;
1104  static integer im1, np1;
1105 
1106 
1107  /* *** SOLVE (L**T)*X = Y, WHERE L IS AN N X N LOWER TRIANGULAR */
1108  /* *** MATRIX STORED COMPACTLY BY ROWS. X AND Y MAY OCCUPY THE SAME */
1109  /* *** STORAGE. *** */
1110 
1111  /* /6 */
1112  /* DATA ZERO/0.D+0/ */
1113  /* /7 */
1114  /* / */
1115 
1116  /* Parameter adjustments */
1117  --y;
1118  --x;
1119  --l;
1120 
1121  /* Function Body */
1122  i__1 = *n;
1123  for (i__ = 1; i__ <= i__1; ++i__) {
1124  /* L10: */
1125  x[i__] = y[i__];
1126  }
1127  np1 = *n + 1;
1128  i0 = *n * (*n + 1) / 2;
1129  i__1 = *n;
1130  for (ii = 1; ii <= i__1; ++ii) {
1131  i__ = np1 - ii;
1132  xi = x[i__] / l[i0];
1133  x[i__] = xi;
1134  if (i__ <= 1) {
1135  goto L999;
1136  }
1137  i0 -= i__;
1138  if (xi == 0.) {
1139  goto L30;
1140  }
1141  im1 = i__ - 1;
1142  i__2 = im1;
1143  for (j = 1; j <= i__2; ++j) {
1144  ij = i0 + j;
1145  x[j] -= xi * l[ij];
1146  /* L20: */
1147  }
1148 L30:
1149  ;
1150  }
1151 L999:
1152  return 0;
1153  /* *** LAST CARD OF DL7ITV FOLLOWS *** */
1154  } /* dl7itv_ */
1155 
1156  template<typename doublereal>
1157  int dl7tvm_(integer *n, doublereal *x, doublereal *l,
1158  doublereal *y) {
1159  /* System generated locals */
1160  integer i__1, i__2;
1161 
1162  /* Local variables */
1163  static integer i__, j, i0, ij;
1164  static doublereal yi;
1165 
1166 
1167  /* *** COMPUTE X = (L**T)*Y, WHERE L IS AN N X N LOWER */
1168  /* *** TRIANGULAR MATRIX STORED COMPACTLY BY ROWS. X AND Y MAY */
1169  /* *** OCCUPY THE SAME STORAGE. *** */
1170 
1171  /* DIMENSION L(N*(N+1)/2) */
1172  /* /6 */
1173  /* DATA ZERO/0.D+0/ */
1174  /* /7 */
1175  /* / */
1176 
1177  /* Parameter adjustments */
1178  --y;
1179  --x;
1180  --l;
1181 
1182  /* Function Body */
1183  i0 = 0;
1184  i__1 = *n;
1185  for (i__ = 1; i__ <= i__1; ++i__) {
1186  yi = y[i__];
1187  x[i__] = 0.;
1188  i__2 = i__;
1189  for (j = 1; j <= i__2; ++j) {
1190  ij = i0 + j;
1191  x[j] += yi * l[ij];
1192  /* L10: */
1193  }
1194  i0 += i__;
1195  /* L20: */
1196  }
1197  /* L999: */
1198  return 0;
1199  /* *** LAST CARD OF DL7TVM FOLLOWS *** */
1200  } /* dl7tvm_ */
1201 
1202  template<typename doublereal>
1203  int dd7dog_(doublereal *dig, integer *lv, integer *n,
1204  doublereal *nwtstp, doublereal *step, doublereal *v) {
1205  /* System generated locals */
1206  integer i__1;
1207  doublereal d__1;
1208 
1209  /* Builtin functions */
1210  // double sqrt(doublereal);
1211 
1212  /* Local variables */
1213  static integer i__;
1214  static doublereal t, t1, t2, cfact, relax, cnorm, gnorm, rlambd, ghinvg,
1215  femnsq, ctrnwt, nwtnrm;
1216 
1217 
1218  /* *** COMPUTE DOUBLE DOGLEG STEP *** */
1219 
1220  /* *** PARAMETER DECLARATIONS *** */
1221 
1222 
1223  /* *** PURPOSE *** */
1224 
1225  /* THIS SUBROUTINE COMPUTES A CANDIDATE STEP (FOR USE IN AN UNCON- */
1226  /* STRAINED MINIMIZATION CODE) BY THE DOUBLE DOGLEG ALGORITHM OF */
1227  /* DENNIS AND MEI (REF. 1), WHICH IS A VARIATION ON POWELL*S DOGLEG */
1228  /* SCHEME (REF. 2, P. 95). */
1229 
1230  /* -------------------------- PARAMETER USAGE -------------------------- */
1231 
1232  /* DIG (INPUT) DIAG(D)**-2 * G -- SEE ALGORITHM NOTES. */
1233  /* G (INPUT) THE CURRENT GRADIENT VECTOR. */
1234  /* LV (INPUT) LENGTH OF V. */
1235  /* N (INPUT) NUMBER OF COMPONENTS IN DIG, G, NWTSTP, AND STEP. */
1236  /* NWTSTP (INPUT) NEGATIVE NEWTON STEP -- SEE ALGORITHM NOTES. */
1237  /* STEP (OUTPUT) THE COMPUTED STEP. */
1238  /* V (I/O) VALUES ARRAY, THE FOLLOWING COMPONENTS OF WHICH ARE */
1239  /* USED HERE... */
1240  /* V(BIAS) (INPUT) BIAS FOR RELAXED NEWTON STEP, WHICH IS V(BIAS) OF */
1241  /* THE WAY FROM THE FULL NEWTON TO THE FULLY RELAXED NEWTON */
1242  /* STEP. RECOMMENDED VALUE = 0.8 . */
1243  /* V(DGNORM) (INPUT) 2-NORM OF DIAG(D)**-1 * G -- SEE ALGORITHM NOTES. */
1244  /* V(DSTNRM) (OUTPUT) 2-NORM OF DIAG(D) * STEP, WHICH IS V(RADIUS) */
1245  /* UNLESS V(STPPAR) = 0 -- SEE ALGORITHM NOTES. */
1246  /* V(DST0) (INPUT) 2-NORM OF DIAG(D) * NWTSTP -- SEE ALGORITHM NOTES. */
1247  /* V(GRDFAC) (OUTPUT) THE COEFFICIENT OF DIG IN THE STEP RETURNED -- */
1248  /* STEP(I) = V(GRDFAC)*DIG(I) + V(NWTFAC)*NWTSTP(I). */
1249  /* V(GTHG) (INPUT) SQUARE-ROOT OF (DIG**T) * (HESSIAN) * DIG -- SEE */
1250  /* ALGORITHM NOTES. */
1251  /* V(GTSTEP) (OUTPUT) INNER PRODUCT BETWEEN G AND STEP. */
1252  /* V(NREDUC) (OUTPUT) FUNCTION REDUCTION PREDICTED FOR THE FULL NEWTON */
1253  /* STEP. */
1254  /* V(NWTFAC) (OUTPUT) THE COEFFICIENT OF NWTSTP IN THE STEP RETURNED -- */
1255  /* SEE V(GRDFAC) ABOVE. */
1256  /* V(PREDUC) (OUTPUT) FUNCTION REDUCTION PREDICTED FOR THE STEP RETURNED. */
1257  /* V(RADIUS) (INPUT) THE TRUST REGION RADIUS. D TIMES THE STEP RETURNED */
1258  /* HAS 2-NORM V(RADIUS) UNLESS V(STPPAR) = 0. */
1259  /* V(STPPAR) (OUTPUT) CODE TELLING HOW STEP WAS COMPUTED... 0 MEANS A */
1260  /* FULL NEWTON STEP. BETWEEN 0 AND 1 MEANS V(STPPAR) OF THE */
1261  /* WAY FROM THE NEWTON TO THE RELAXED NEWTON STEP. BETWEEN */
1262  /* 1 AND 2 MEANS A TRUE DOUBLE DOGLEG STEP, V(STPPAR) - 1 OF */
1263  /* THE WAY FROM THE RELAXED NEWTON TO THE CAUCHY STEP. */
1264  /* GREATER THAN 2 MEANS 1 / (V(STPPAR) - 1) TIMES THE CAUCHY */
1265  /* STEP. */
1266 
1267  /* ------------------------------- NOTES ------------------------------- */
1268 
1269  /* *** ALGORITHM NOTES *** */
1270 
1271  /* LET G AND H BE THE CURRENT GRADIENT AND HESSIAN APPROXIMA- */
1272  /* TION RESPECTIVELY AND LET D BE THE CURRENT SCALE VECTOR. THIS */
1273  /* ROUTINE ASSUMES DIG = DIAG(D)**-2 * G AND NWTSTP = H**-1 * G. */
1274  /* THE STEP COMPUTED IS THE SAME ONE WOULD GET BY REPLACING G AND H */
1275  /* BY DIAG(D)**-1 * G AND DIAG(D)**-1 * H * DIAG(D)**-1, */
1276  /* COMPUTING STEP, AND TRANSLATING STEP BACK TO THE ORIGINAL */
1277  /* VARIABLES, I.E., PREMULTIPLYING IT BY DIAG(D)**-1. */
1278 
1279  /* *** REFERENCES *** */
1280 
1281  /* 1. DENNIS, J.E., AND MEI, H.H.W. (1979), TWO NEW UNCONSTRAINED OPTI- */
1282  /* MIZATION ALGORITHMS WHICH USE FUNCTION AND GRADIENT */
1283  /* VALUES, J. OPTIM. THEORY APPLIC. 28, PP. 453-482. */
1284  /* 2. POWELL, M.J.D. (1970), A HYBRID METHOD FOR NON-LINEAR EQUATIONS, */
1285  /* IN NUMERICAL METHODS FOR NON-LINEAR EQUATIONS, EDITED BY */
1286  /* P. RABINOWITZ, GORDON AND BREACH, LONDON. */
1287 
1288  /* *** GENERAL *** */
1289 
1290  /* CODED BY DAVID M. GAY. */
1291  /* THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH SUPPORTED */
1292  /* BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS MCS-7600324 AND */
1293  /* MCS-7906671. */
1294 
1295  /* ------------------------ EXTERNAL QUANTITIES ------------------------ */
1296 
1297  /* *** INTRINSIC FUNCTIONS *** */
1298  /* /+ */
1299  /* / */
1300  /* -------------------------- LOCAL VARIABLES -------------------------- */
1301 
1302 
1303  /* *** V SUBSCRIPTS *** */
1304 
1305 
1306  /* *** DATA INITIALIZATIONS *** */
1307 
1308  /* /6 */
1309  /* DATA HALF/0.5D+0/, ONE/1.D+0/, TWO/2.D+0/, ZERO/0.D+0/ */
1310  /* /7 */
1311  /* / */
1312 
1313  /* /6 */
1314  /* DATA BIAS/43/, DGNORM/1/, DSTNRM/2/, DST0/3/, GRDFAC/45/, */
1315  /* 1 GTHG/44/, GTSTEP/4/, NREDUC/6/, NWTFAC/46/, PREDUC/7/, */
1316  /* 2 RADIUS/8/, STPPAR/5/ */
1317  /* /7 */
1318  /* / */
1319 
1320  /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */
1321 
1322  /* Parameter adjustments */
1323  --v;
1324  --step;
1325  --nwtstp;
1326  --dig;
1327 
1328  /* Function Body */
1329  nwtnrm = v[3];
1330  rlambd = 1.;
1331  if (nwtnrm > 0.) {
1332  rlambd = v[8] / nwtnrm;
1333  }
1334  gnorm = v[1];
1335  ghinvg = v[6] * 2.;
1336  v[45] = 0.;
1337  v[46] = 0.;
1338  if (rlambd < 1.) {
1339  goto L30;
1340  }
1341 
1342  /* *** THE NEWTON STEP IS INSIDE THE TRUST REGION *** */
1343 
1344  v[5] = 0.;
1345  v[2] = nwtnrm;
1346  v[4] = -ghinvg;
1347  v[7] = v[6];
1348  v[46] = -1.;
1349  i__1 = *n;
1350  for (i__ = 1; i__ <= i__1; ++i__) {
1351  /* L20: */
1352  step[i__] = -nwtstp[i__];
1353  }
1354  goto L999;
1355 
1356 L30:
1357  v[2] = v[8];
1358  /* Computing 2nd power */
1359  d__1 = gnorm / v[44];
1360  cfact = d__1 * d__1;
1361  /* *** CAUCHY STEP = -CFACT * G. */
1362  cnorm = gnorm * cfact;
1363  relax = 1. - v[43] * (1. - gnorm * cnorm / ghinvg);
1364  if (rlambd < relax) {
1365  goto L50;
1366  }
1367 
1368  /* *** STEP IS BETWEEN RELAXED NEWTON AND FULL NEWTON STEPS *** */
1369 
1370  v[5] = 1. - (rlambd - relax) / (1. - relax);
1371  t = -rlambd;
1372  v[4] = t * ghinvg;
1373  v[7] = rlambd * (1. - rlambd * .5) * ghinvg;
1374  v[46] = t;
1375  i__1 = *n;
1376  for (i__ = 1; i__ <= i__1; ++i__) {
1377  /* L40: */
1378  step[i__] = t * nwtstp[i__];
1379  }
1380  goto L999;
1381 
1382 L50:
1383  if (cnorm < v[8]) {
1384  goto L70;
1385  }
1386 
1387  /* *** THE CAUCHY STEP LIES OUTSIDE THE TRUST REGION -- */
1388  /* *** STEP = SCALED CAUCHY STEP *** */
1389 
1390  t = -v[8] / gnorm;
1391  v[45] = t;
1392  v[5] = cnorm / v[8] + 1.;
1393  v[4] = -v[8] * gnorm;
1394  /* Computing 2nd power */
1395  d__1 = v[44] / gnorm;
1396  v[7] = v[8] * (gnorm - v[8] * .5 * (d__1 * d__1));
1397  i__1 = *n;
1398  for (i__ = 1; i__ <= i__1; ++i__) {
1399  /* L60: */
1400  step[i__] = t * dig[i__];
1401  }
1402  goto L999;
1403 
1404  /* *** COMPUTE DOGLEG STEP BETWEEN CAUCHY AND RELAXED NEWTON *** */
1405  /* *** FEMUR = RELAXED NEWTON STEP MINUS CAUCHY STEP *** */
1406 
1407 L70:
1408  ctrnwt = cfact * relax * ghinvg / gnorm;
1409  /* *** CTRNWT = INNER PROD. OF CAUCHY AND RELAXED NEWTON STEPS, */
1410  /* *** SCALED BY GNORM**-1. */
1411  /* Computing 2nd power */
1412  d__1 = cfact;
1413  t1 = ctrnwt - gnorm * (d__1 * d__1);
1414  /* *** T1 = INNER PROD. OF FEMUR AND CAUCHY STEP, SCALED BY */
1415  /* *** GNORM**-1. */
1416  /* Computing 2nd power */
1417  d__1 = cfact;
1418  t2 = v[8] * (v[8] / gnorm) - gnorm * (d__1 * d__1);
1419  t = relax * nwtnrm;
1420  femnsq = t / gnorm * t - ctrnwt - t1;
1421  /* *** FEMNSQ = SQUARE OF 2-NORM OF FEMUR, SCALED BY GNORM**-1. */
1422  /* Computing 2nd power */
1423  d__1 = t1;
1424  t = t2 / (t1 + sqrt(d__1 * d__1 + femnsq * t2));
1425  /* *** DOGLEG STEP = CAUCHY STEP + T * FEMUR. */
1426  t1 = (t - 1.) * cfact;
1427  v[45] = t1;
1428  t2 = -t * relax;
1429  v[46] = t2;
1430  v[5] = 2. - t;
1431  /* Computing 2nd power */
1432  d__1 = gnorm;
1433  v[4] = t1 * (d__1 * d__1) + t2 * ghinvg;
1434  /* Computing 2nd power */
1435  d__1 = v[44] * t1;
1436  v[7] = -t1 * gnorm * ((t2 + 1.) * gnorm) - t2 * (t2 * .5 + 1.) * ghinvg -
1437  d__1 * d__1 * .5;
1438  i__1 = *n;
1439  for (i__ = 1; i__ <= i__1; ++i__) {
1440  /* L80: */
1441  step[i__] = t1 * dig[i__] + t2 * nwtstp[i__];
1442  }
1443 
1444 L999:
1445  return 0;
1446  /* *** LAST LINE OF DD7DOG FOLLOWS *** */
1447  } /* dd7dog_ */
1448 
1449  template<typename doublereal>
1450  int dv2axy_(integer *p, doublereal *w, doublereal *a,
1451  doublereal *x, doublereal *y) {
1452  /* System generated locals */
1453  integer i__1;
1454 
1455  /* Local variables */
1456  static integer i__;
1457 
1458 
1459  /* *** SET W = A*X + Y -- W, X, Y = P-VECTORS, A = SCALAR *** */
1460 
1461 
1462 
1463  /* Parameter adjustments */
1464  --y;
1465  --x;
1466  --w;
1467 
1468  /* Function Body */
1469  i__1 = *p;
1470  for (i__ = 1; i__ <= i__1; ++i__) {
1471  /* L10: */
1472  w[i__] = *a * x[i__] + y[i__];
1473  }
1474  return 0;
1475  } /* dv2axy_ */
1476 
1477  template<typename doublereal>
1478  doublereal drldst_(integer *p, doublereal *d__, doublereal *x, doublereal *x0) {
1479  /* System generated locals */
1480  integer i__1;
1481  doublereal ret_val, d__1, d__2;
1482 
1483  /* Local variables */
1484  static integer i__;
1485  static doublereal t, emax, xmax;
1486 
1487 
1488  /* *** COMPUTE AND RETURN RELATIVE DIFFERENCE BETWEEN X AND X0 *** */
1489  /* *** NL2SOL VERSION 2.2 *** */
1490 
1491 
1492  /* /6 */
1493  /* DATA ZERO/0.D+0/ */
1494  /* /7 */
1495  /* / */
1496 
1497  /* *** BODY *** */
1498 
1499  /* Parameter adjustments */
1500  --x0;
1501  --x;
1502  --d__;
1503 
1504  /* Function Body */
1505  emax = 0.;
1506  xmax = 0.;
1507  i__1 = *p;
1508  for (i__ = 1; i__ <= i__1; ++i__) {
1509  t = (d__1 = d__[i__] * (x[i__] - x0[i__]), std::fabs(d__1));
1510  if (emax < t) {
1511  emax = t;
1512  }
1513  t = d__[i__] * ((d__1 = x[i__], std::fabs(d__1)) + (d__2 = x0[i__], std::fabs(
1514  d__2)));
1515  if (xmax < t) {
1516  xmax = t;
1517  }
1518  /* L10: */
1519  }
1520  ret_val = 0.;
1521  if (xmax > 0.) {
1522  ret_val = emax / xmax;
1523  }
1524  /* L999: */
1525  return ret_val;
1526  /* *** LAST CARD OF DRLDST FOLLOWS *** */
1527  } /* drldst_ */
1528 
1529  template<typename doublereal>
1530  int da7sst_(integer *iv, integer *liv, integer *lv,
1531  doublereal *v) {
1532  /* System generated locals */
1533  doublereal d__1, d__2;
1534 
1535  /* Local variables */
1536  static integer i__, nfc;
1537  static doublereal gts, emax, xmax, rfac1, emaxs;
1538  static logical goodx;
1539 
1540 
1541  /* *** ASSESS CANDIDATE STEP (***SOL VERSION 2.3) *** */
1542 
1543 
1544  /* *** PURPOSE *** */
1545 
1546  /* THIS SUBROUTINE IS CALLED BY AN UNCONSTRAINED MINIMIZATION */
1547  /* ROUTINE TO ASSESS THE NEXT CANDIDATE STEP. IT MAY RECOMMEND ONE */
1548  /* OF SEVERAL COURSES OF ACTION, SUCH AS ACCEPTING THE STEP, RECOM- */
1549  /* PUTING IT USING THE SAME OR A NEW QUADRATIC MODEL, OR HALTING DUE */
1550  /* TO CONVERGENCE OR FALSE CONVERGENCE. SEE THE RETURN CODE LISTING */
1551  /* BELOW. */
1552 
1553  /* -------------------------- PARAMETER USAGE -------------------------- */
1554 
1555  /* IV (I/O) INTEGER PARAMETER AND SCRATCH VECTOR -- SEE DESCRIPTION */
1556  /* BELOW OF IV VALUES REFERENCED. */
1557  /* LIV (IN) LENGTH OF IV ARRAY. */
1558  /* LV (IN) LENGTH OF V ARRAY. */
1559  /* V (I/O) REAL PARAMETER AND SCRATCH VECTOR -- SEE DESCRIPTION */
1560  /* BELOW OF V VALUES REFERENCED. */
1561 
1562  /* *** IV VALUES REFERENCED *** */
1563 
1564  /* IV(IRC) (I/O) ON INPUT FOR THE FIRST STEP TRIED IN A NEW ITERATION, */
1565  /* IV(IRC) SHOULD BE SET TO 3 OR 4 (THE VALUE TO WHICH IT IS */
1566  /* SET WHEN STEP IS DEFINITELY TO BE ACCEPTED). ON INPUT */
1567  /* AFTER STEP HAS BEEN RECOMPUTED, IV(IRC) SHOULD BE */
1568  /* UNCHANGED SINCE THE PREVIOUS RETURN OF DA7SST. */
1569  /* ON OUTPUT, IV(IRC) IS A RETURN CODE HAVING ONE OF THE */
1570  /* FOLLOWING VALUES... */
1571  /* 1 = SWITCH MODELS OR TRY SMALLER STEP. */
1572  /* 2 = SWITCH MODELS OR ACCEPT STEP. */
1573  /* 3 = ACCEPT STEP AND DETERMINE V(RADFAC) BY GRADIENT */
1574  /* TESTS. */
1575  /* 4 = ACCEPT STEP, V(RADFAC) HAS BEEN DETERMINED. */
1576  /* 5 = RECOMPUTE STEP (USING THE SAME MODEL). */
1577  /* 6 = RECOMPUTE STEP WITH RADIUS = V(LMAXS) BUT DO NOT */
1578  /* EVALUATE THE OBJECTIVE FUNCTION. */
1579  /* 7 = X-CONVERGENCE (SEE V(XCTOL)). */
1580  /* 8 = RELATIVE FUNCTION CONVERGENCE (SEE V(RFCTOL)). */
1581  /* 9 = BOTH X- AND RELATIVE FUNCTION CONVERGENCE. */
1582  /* 10 = ABSOLUTE FUNCTION CONVERGENCE (SEE V(AFCTOL)). */
1583  /* 11 = SINGULAR CONVERGENCE (SEE V(LMAXS)). */
1584  /* 12 = FALSE CONVERGENCE (SEE V(XFTOL)). */
1585  /* 13 = IV(IRC) WAS OUT OF RANGE ON INPUT. */
1586  /* RETURN CODE I HAS PRECEDENCE OVER I+1 FOR I = 9, 10, 11. */
1587  /* IV(MLSTGD) (I/O) SAVED VALUE OF IV(MODEL). */
1588  /* IV(MODEL) (I/O) ON INPUT, IV(MODEL) SHOULD BE AN INTEGER IDENTIFYING */
1589  /* THE CURRENT QUADRATIC MODEL OF THE OBJECTIVE FUNCTION. */
1590  /* IF A PREVIOUS STEP YIELDED A BETTER FUNCTION REDUCTION, */
1591  /* THEN IV(MODEL) WILL BE SET TO IV(MLSTGD) ON OUTPUT. */
1592  /* IV(NFCALL) (IN) INVOCATION COUNT FOR THE OBJECTIVE FUNCTION. */
1593  /* IV(NFGCAL) (I/O) VALUE OF IV(NFCALL) AT STEP THAT GAVE THE BIGGEST */
1594  /* FUNCTION REDUCTION THIS ITERATION. IV(NFGCAL) REMAINS */
1595  /* UNCHANGED UNTIL A FUNCTION REDUCTION IS OBTAINED. */
1596  /* IV(RADINC) (I/O) THE NUMBER OF RADIUS INCREASES (OR MINUS THE NUMBER */
1597  /* OF DECREASES) SO FAR THIS ITERATION. */
1598  /* IV(RESTOR) (OUT) SET TO 1 IF V(F) HAS BEEN RESTORED AND X SHOULD BE */
1599  /* RESTORED TO ITS INITIAL VALUE, TO 2 IF X SHOULD BE SAVED, */
1600  /* TO 3 IF X SHOULD BE RESTORED FROM THE SAVED VALUE, AND TO */
1601  /* 0 OTHERWISE. */
1602  /* IV(STAGE) (I/O) COUNT OF THE NUMBER OF MODELS TRIED SO FAR IN THE */
1603  /* CURRENT ITERATION. */
1604  /* IV(STGLIM) (IN) MAXIMUM NUMBER OF MODELS TO CONSIDER. */
1605  /* IV(SWITCH) (OUT) SET TO 0 UNLESS A NEW MODEL IS BEING TRIED AND IT */
1606  /* GIVES A SMALLER FUNCTION VALUE THAN THE PREVIOUS MODEL, */
1607  /* IN WHICH CASE DA7SST SETS IV(SWITCH) = 1. */
1608  /* IV(TOOBIG) (I/O) IS NONZERO ON INPUT IF STEP WAS TOO BIG (E.G., IF */
1609  /* IT WOULD CAUSE OVERFLOW). IT IS SET TO 0 ON RETURN. */
1610  /* IV(XIRC) (I/O) VALUE THAT IV(IRC) WOULD HAVE IN THE ABSENCE OF */
1611  /* CONVERGENCE, FALSE CONVERGENCE, AND OVERSIZED STEPS. */
1612 
1613  /* *** V VALUES REFERENCED *** */
1614 
1615  /* V(AFCTOL) (IN) ABSOLUTE FUNCTION CONVERGENCE TOLERANCE. IF THE */
1616  /* ABSOLUTE VALUE OF THE CURRENT FUNCTION VALUE V(F) IS LESS */
1617  /* THAN V(AFCTOL) AND DA7SST DOES NOT RETURN WITH */
1618  /* IV(IRC) = 11, THEN DA7SST RETURNS WITH IV(IRC) = 10. */
1619  /* V(DECFAC) (IN) FACTOR BY WHICH TO DECREASE RADIUS WHEN IV(TOOBIG) IS */
1620  /* NONZERO. */
1621  /* V(DSTNRM) (IN) THE 2-NORM OF D*STEP. */
1622  /* V(DSTSAV) (I/O) VALUE OF V(DSTNRM) ON SAVED STEP. */
1623  /* V(DST0) (IN) THE 2-NORM OF D TIMES THE NEWTON STEP (WHEN DEFINED, */
1624  /* I.E., FOR V(NREDUC) .GE. 0). */
1625  /* V(F) (I/O) ON BOTH INPUT AND OUTPUT, V(F) IS THE OBJECTIVE FUNC- */
1626  /* TION VALUE AT X. IF X IS RESTORED TO A PREVIOUS VALUE, */
1627  /* THEN V(F) IS RESTORED TO THE CORRESPONDING VALUE. */
1628  /* V(FDIF) (OUT) THE FUNCTION REDUCTION V(F0) - V(F) (FOR THE OUTPUT */
1629  /* VALUE OF V(F) IF AN EARLIER STEP GAVE A BIGGER FUNCTION */
1630  /* DECREASE, AND FOR THE INPUT VALUE OF V(F) OTHERWISE). */
1631  /* V(FLSTGD) (I/O) SAVED VALUE OF V(F). */
1632  /* V(F0) (IN) OBJECTIVE FUNCTION VALUE AT START OF ITERATION. */
1633  /* V(GTSLST) (I/O) VALUE OF V(GTSTEP) ON SAVED STEP. */
1634  /* V(GTSTEP) (IN) INNER PRODUCT BETWEEN STEP AND GRADIENT. */
1635  /* V(INCFAC) (IN) MINIMUM FACTOR BY WHICH TO INCREASE RADIUS. */
1636  /* V(LMAXS) (IN) MAXIMUM REASONABLE STEP SIZE (AND INITIAL STEP BOUND). */
1637  /* IF THE ACTUAL FUNCTION DECREASE IS NO MORE THAN TWICE */
1638  /* WHAT WAS PREDICTED, IF A RETURN WITH IV(IRC) = 7, 8, OR 9 */
1639  /* DOES NOT OCCUR, IF V(DSTNRM) .GT. V(LMAXS) OR THE CURRENT */
1640  /* STEP IS A NEWTON STEP, AND IF */
1641  /* V(PREDUC) .LE. V(SCTOL) * ABS(V(F0)), THEN DA7SST RETURNS */
1642  /* WITH IV(IRC) = 11. IF SO DOING APPEARS WORTHWHILE, THEN */
1643  /* DA7SST REPEATS THIS TEST (DISALLOWING A FULL NEWTON STEP) */
1644  /* WITH V(PREDUC) COMPUTED FOR A STEP OF LENGTH V(LMAXS) */
1645  /* (BY A RETURN WITH IV(IRC) = 6). */
1646  /* V(NREDUC) (I/O) FUNCTION REDUCTION PREDICTED BY QUADRATIC MODEL FOR */
1647  /* NEWTON STEP. IF DA7SST IS CALLED WITH IV(IRC) = 6, I.E., */
1648  /* IF V(PREDUC) HAS BEEN COMPUTED WITH RADIUS = V(LMAXS) FOR */
1649  /* USE IN THE SINGULAR CONVERGENCE TEST, THEN V(NREDUC) IS */
1650  /* SET TO -V(PREDUC) BEFORE THE LATTER IS RESTORED. */
1651  /* V(PLSTGD) (I/O) VALUE OF V(PREDUC) ON SAVED STEP. */
1652  /* V(PREDUC) (I/O) FUNCTION REDUCTION PREDICTED BY QUADRATIC MODEL FOR */
1653  /* CURRENT STEP. */
1654  /* V(RADFAC) (OUT) FACTOR TO BE USED IN DETERMINING THE NEW RADIUS, */
1655  /* WHICH SHOULD BE V(RADFAC)*DST, WHERE DST IS EITHER THE */
1656  /* OUTPUT VALUE OF V(DSTNRM) OR THE 2-NORM OF */
1657  /* DIAG(NEWD)*STEP FOR THE OUTPUT VALUE OF STEP AND THE */
1658  /* UPDATED VERSION, NEWD, OF THE SCALE VECTOR D. FOR */
1659  /* IV(IRC) = 3, V(RADFAC) = 1.0 IS RETURNED. */
1660  /* V(RDFCMN) (IN) MINIMUM VALUE FOR V(RADFAC) IN TERMS OF THE INPUT */
1661  /* VALUE OF V(DSTNRM) -- SUGGESTED VALUE = 0.1. */
1662  /* V(RDFCMX) (IN) MAXIMUM VALUE FOR V(RADFAC) -- SUGGESTED VALUE = 4.0. */
1663  /* V(RELDX) (IN) SCALED RELATIVE CHANGE IN X CAUSED BY STEP, COMPUTED */
1664  /* (E.G.) BY FUNCTION DRLDST AS */
1665  /* MAX (D(I)*ABS(X(I)-X0(I)), 1 .LE. I .LE. P) / */
1666  /* MAX (D(I)*(ABS(X(I))+ABS(X0(I))), 1 .LE. I .LE. P). */
1667  /* V(RFCTOL) (IN) RELATIVE FUNCTION CONVERGENCE TOLERANCE. IF THE */
1668  /* ACTUAL FUNCTION REDUCTION IS AT MOST TWICE WHAT WAS PRE- */
1669  /* DICTED AND V(NREDUC) .LE. V(RFCTOL)*ABS(V(F0)), THEN */
1670  /* DA7SST RETURNS WITH IV(IRC) = 8 OR 9. */
1671  /* V(SCTOL) (IN) SINGULAR CONVERGENCE TOLERANCE -- SEE V(LMAXS). */
1672  /* V(STPPAR) (IN) MARQUARDT PARAMETER -- 0 MEANS FULL NEWTON STEP. */
1673  /* V(TUNER1) (IN) TUNING CONSTANT USED TO DECIDE IF THE FUNCTION */
1674  /* REDUCTION WAS MUCH LESS THAN EXPECTED. SUGGESTED */
1675  /* VALUE = 0.1. */
1676  /* V(TUNER2) (IN) TUNING CONSTANT USED TO DECIDE IF THE FUNCTION */
1677  /* REDUCTION WAS LARGE ENOUGH TO ACCEPT STEP. SUGGESTED */
1678  /* VALUE = 10**-4. */
1679  /* V(TUNER3) (IN) TUNING CONSTANT USED TO DECIDE IF THE RADIUS */
1680  /* SHOULD BE INCREASED. SUGGESTED VALUE = 0.75. */
1681  /* V(XCTOL) (IN) X-CONVERGENCE CRITERION. IF STEP IS A NEWTON STEP */
1682  /* (V(STPPAR) = 0) HAVING V(RELDX) .LE. V(XCTOL) AND GIVING */
1683  /* AT MOST TWICE THE PREDICTED FUNCTION DECREASE, THEN */
1684  /* DA7SST RETURNS IV(IRC) = 7 OR 9. */
1685  /* V(XFTOL) (IN) FALSE CONVERGENCE TOLERANCE. IF STEP GAVE NO OR ONLY */
1686  /* A SMALL FUNCTION DECREASE AND V(RELDX) .LE. V(XFTOL), */
1687  /* THEN DA7SST RETURNS WITH IV(IRC) = 12. */
1688 
1689  /* ------------------------------- NOTES ------------------------------- */
1690 
1691  /* *** APPLICATION AND USAGE RESTRICTIONS *** */
1692 
1693  /* THIS ROUTINE IS CALLED AS PART OF THE NL2SOL (NONLINEAR */
1694  /* LEAST-SQUARES) PACKAGE. IT MAY BE USED IN ANY UNCONSTRAINED */
1695  /* MINIMIZATION SOLVER THAT USES DOGLEG, GOLDFELD-QUANDT-TROTTER, */
1696  /* OR LEVENBERG-MARQUARDT STEPS. */
1697 
1698  /* *** ALGORITHM NOTES *** */
1699 
1700  /* SEE (1) FOR FURTHER DISCUSSION OF THE ASSESSING AND MODEL */
1701  /* SWITCHING STRATEGIES. WHILE NL2SOL CONSIDERS ONLY TWO MODELS, */
1702  /* DA7SST IS DESIGNED TO HANDLE ANY NUMBER OF MODELS. */
1703 
1704  /* *** USAGE NOTES *** */
1705 
1706  /* ON THE FIRST CALL OF AN ITERATION, ONLY THE I/O VARIABLES */
1707  /* STEP, X, IV(IRC), IV(MODEL), V(F), V(DSTNRM), V(GTSTEP), AND */
1708  /* V(PREDUC) NEED HAVE BEEN INITIALIZED. BETWEEN CALLS, NO I/O */
1709  /* VALUES EXCEPT STEP, X, IV(MODEL), V(F) AND THE STOPPING TOLER- */
1710  /* ANCES SHOULD BE CHANGED. */
1711  /* AFTER A RETURN FOR CONVERGENCE OR FALSE CONVERGENCE, ONE CAN */
1712  /* CHANGE THE STOPPING TOLERANCES AND CALL DA7SST AGAIN, IN WHICH */
1713  /* CASE THE STOPPING TESTS WILL BE REPEATED. */
1714 
1715  /* *** REFERENCES *** */
1716 
1717  /* (1) DENNIS, J.E., JR., GAY, D.M., AND WELSCH, R.E. (1981), */
1718  /* AN ADAPTIVE NONLINEAR LEAST-SQUARES ALGORITHM, */
1719  /* ACM TRANS. MATH. SOFTWARE, VOL. 7, NO. 3. */
1720 
1721  /* (2) POWELL, M.J.D. (1970) A FORTRAN SUBROUTINE FOR SOLVING */
1722  /* SYSTEMS OF NONLINEAR ALGEBRAIC EQUATIONS, IN NUMERICAL */
1723  /* METHODS FOR NONLINEAR ALGEBRAIC EQUATIONS, EDITED BY */
1724  /* P. RABINOWITZ, GORDON AND BREACH, LONDON. */
1725 
1726  /* *** HISTORY *** */
1727 
1728  /* JOHN DENNIS DESIGNED MUCH OF THIS ROUTINE, STARTING WITH */
1729  /* IDEAS IN (2). ROY WELSCH SUGGESTED THE MODEL SWITCHING STRATEGY. */
1730  /* DAVID GAY AND STEPHEN PETERS CAST THIS SUBROUTINE INTO A MORE */
1731  /* PORTABLE FORM (WINTER 1977), AND DAVID GAY CAST IT INTO ITS */
1732  /* PRESENT FORM (FALL 1978), WITH MINOR CHANGES TO THE SINGULAR */
1733  /* CONVERGENCE TEST IN MAY, 1984 (TO DEAL WITH FULL NEWTON STEPS). */
1734 
1735  /* *** GENERAL *** */
1736 
1737  /* THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH */
1738  /* SUPPORTED BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS */
1739  /* MCS-7600324, DCR75-10143, 76-14311DSS, MCS76-11989, AND */
1740  /* MCS-7906671. */
1741 
1742  /* ------------------------ EXTERNAL QUANTITIES ------------------------ */
1743 
1744  /* *** NO EXTERNAL FUNCTIONS AND SUBROUTINES *** */
1745 
1746  /* -------------------------- LOCAL VARIABLES -------------------------- */
1747 
1748 
1749  /* *** SUBSCRIPTS FOR IV AND V *** */
1750 
1751 
1752  /* *** DATA INITIALIZATIONS *** */
1753 
1754  /* /6 */
1755  /* DATA HALF/0.5D+0/, ONE/1.D+0/, ONEP2/1.2D+0/, TWO/2.D+0/, */
1756  /* 1 ZERO/0.D+0/ */
1757  /* /7 */
1758  /* / */
1759 
1760  /* /6 */
1761  /* DATA IRC/29/, MLSTGD/32/, MODEL/5/, NFCALL/6/, NFGCAL/7/, */
1762  /* 1 RADINC/8/, RESTOR/9/, STAGE/10/, STGLIM/11/, SWITCH/12/, */
1763  /* 2 TOOBIG/2/, XIRC/13/ */
1764  /* /7 */
1765  /* / */
1766  /* /6 */
1767  /* DATA AFCTOL/31/, DECFAC/22/, DSTNRM/2/, DST0/3/, DSTSAV/18/, */
1768  /* 1 F/10/, FDIF/11/, FLSTGD/12/, F0/13/, GTSLST/14/, GTSTEP/4/, */
1769  /* 2 INCFAC/23/, LMAXS/36/, NREDUC/6/, PLSTGD/15/, PREDUC/7/, */
1770  /* 3 RADFAC/16/, RDFCMN/24/, RDFCMX/25/, RELDX/17/, RFCTOL/32/, */
1771  /* 4 SCTOL/37/, STPPAR/5/, TUNER1/26/, TUNER2/27/, TUNER3/28/, */
1772  /* 5 XCTOL/33/, XFTOL/34/ */
1773  /* /7 */
1774  /* / */
1775 
1776  /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */
1777 
1778  /* Parameter adjustments */
1779  --iv;
1780  --v;
1781 
1782  /* Function Body */
1783  nfc = iv[6];
1784  iv[12] = 0;
1785  iv[9] = 0;
1786  rfac1 = 1.;
1787  goodx = TRUE_;
1788  i__ = iv[29];
1789  if (i__ >= 1 && i__ <= 12) {
1790  switch (i__) {
1791  case 1: goto L20;
1792  case 2: goto L30;
1793  case 3: goto L10;
1794  case 4: goto L10;
1795  case 5: goto L40;
1796  case 6: goto L280;
1797  case 7: goto L220;
1798  case 8: goto L220;
1799  case 9: goto L220;
1800  case 10: goto L220;
1801  case 11: goto L220;
1802  case 12: goto L170;
1803  }
1804  }
1805  iv[29] = 13;
1806  goto L999;
1807 
1808  /* *** INITIALIZE FOR NEW ITERATION *** */
1809 
1810 L10:
1811  iv[10] = 1;
1812  iv[8] = 0;
1813  v[12] = v[13];
1814  if (iv[2] == 0) {
1815  goto L110;
1816  }
1817  iv[10] = -1;
1818  iv[13] = i__;
1819  goto L60;
1820 
1821  /* *** STEP WAS RECOMPUTED WITH NEW MODEL OR SMALLER RADIUS *** */
1822  /* *** FIRST DECIDE WHICH *** */
1823 
1824 L20:
1825  if (iv[5] != iv[32]) {
1826  goto L30;
1827  }
1828  /* *** OLD MODEL RETAINED, SMALLER RADIUS TRIED *** */
1829  /* *** DO NOT CONSIDER ANY MORE NEW MODELS THIS ITERATION *** */
1830  iv[10] = iv[11];
1831  iv[8] = -1;
1832  goto L110;
1833 
1834  /* *** A NEW MODEL IS BEING TRIED. DECIDE WHETHER TO KEEP IT. *** */
1835 
1836 L30:
1837  ++iv[10];
1838 
1839  /* *** NOW WE ADD THE POSSIBILITY THAT STEP WAS RECOMPUTED WITH *** */
1840  /* *** THE SAME MODEL, PERHAPS BECAUSE OF AN OVERSIZED STEP. *** */
1841 
1842 L40:
1843  if (iv[10] > 0) {
1844  goto L50;
1845  }
1846 
1847  /* *** STEP WAS RECOMPUTED BECAUSE IT WAS TOO BIG. *** */
1848 
1849  if (iv[2] != 0) {
1850  goto L60;
1851  }
1852 
1853  /* *** RESTORE IV(STAGE) AND PICK UP WHERE WE LEFT OFF. *** */
1854 
1855  iv[10] = -iv[10];
1856  i__ = iv[13];
1857  switch (i__) {
1858  case 1: goto L20;
1859  case 2: goto L30;
1860  case 3: goto L110;
1861  case 4: goto L110;
1862  case 5: goto L70;
1863  }
1864 
1865 L50:
1866  if (iv[2] == 0) {
1867  goto L70;
1868  }
1869 
1870  /* *** HANDLE OVERSIZE STEP *** */
1871 
1872  iv[2] = 0;
1873  if (iv[8] > 0) {
1874  goto L80;
1875  }
1876  iv[10] = -iv[10];
1877  iv[13] = iv[29];
1878 
1879 L60:
1880  iv[2] = 0;
1881  v[16] = v[22];
1882  --iv[8];
1883  iv[29] = 5;
1884  iv[9] = 1;
1885  v[10] = v[12];
1886  goto L999;
1887 
1888 L70:
1889  if (v[10] < v[12]) {
1890  goto L110;
1891  }
1892 
1893  /* *** THE NEW STEP IS A LOSER. RESTORE OLD MODEL. *** */
1894 
1895  if (iv[5] == iv[32]) {
1896  goto L80;
1897  }
1898  iv[5] = iv[32];
1899  iv[12] = 1;
1900 
1901  /* *** RESTORE STEP, ETC. ONLY IF A PREVIOUS STEP DECREASED V(F). */
1902 
1903 L80:
1904  if (v[12] >= v[13]) {
1905  goto L110;
1906  }
1907  if (iv[10] < iv[11]) {
1908  goodx = FALSE_;
1909  } else if (nfc < iv[7] + iv[11] + 2) {
1910  goodx = FALSE_;
1911  } else if (iv[12] != 0) {
1912  goodx = FALSE_;
1913  }
1914  iv[9] = 3;
1915  v[10] = v[12];
1916  v[7] = v[15];
1917  v[4] = v[14];
1918  if (iv[12] == 0) {
1919  rfac1 = v[2] / v[18];
1920  }
1921  v[2] = v[18];
1922  if (goodx) {
1923 
1924  /* *** ACCEPT PREVIOUS SLIGHTLY REDUCING STEP *** */
1925 
1926  v[11] = v[13] - v[10];
1927  iv[29] = 4;
1928  v[16] = rfac1;
1929  goto L999;
1930  }
1931  nfc = iv[7];
1932 
1933 L110:
1934  v[11] = v[13] - v[10];
1935  if (v[11] > v[27] * v[7]) {
1936  goto L140;
1937  }
1938  if (iv[8] > 0) {
1939  goto L140;
1940  }
1941 
1942  /* *** NO (OR ONLY A TRIVIAL) FUNCTION DECREASE */
1943  /* *** -- SO TRY NEW MODEL OR SMALLER RADIUS */
1944 
1945  if (v[10] < v[13]) {
1946  goto L120;
1947  }
1948  iv[32] = iv[5];
1949  v[12] = v[10];
1950  v[10] = v[13];
1951  iv[9] = 1;
1952  goto L130;
1953 L120:
1954  iv[7] = nfc;
1955 L130:
1956  iv[29] = 1;
1957  if (iv[10] < iv[11]) {
1958  goto L160;
1959  }
1960  iv[29] = 5;
1961  --iv[8];
1962  goto L160;
1963 
1964  /* *** NONTRIVIAL FUNCTION DECREASE ACHIEVED *** */
1965 
1966 L140:
1967  iv[7] = nfc;
1968  rfac1 = 1.;
1969  v[18] = v[2];
1970  if (v[11] > v[7] * v[26]) {
1971  goto L190;
1972  }
1973 
1974  /* *** DECREASE WAS MUCH LESS THAN PREDICTED -- EITHER CHANGE MODELS */
1975  /* *** OR ACCEPT STEP WITH DECREASED RADIUS. */
1976 
1977  if (iv[10] >= iv[11]) {
1978  goto L150;
1979  }
1980  /* *** CONSIDER SWITCHING MODELS *** */
1981  iv[29] = 2;
1982  goto L160;
1983 
1984  /* *** ACCEPT STEP WITH DECREASED RADIUS *** */
1985 
1986 L150:
1987  iv[29] = 4;
1988 
1989  /* *** SET V(RADFAC) TO FLETCHER*S DECREASE FACTOR *** */
1990 
1991 L160:
1992  iv[13] = iv[29];
1993  emax = v[4] + v[11];
1994  v[16] = rfac1 * .5;
1995  if (emax < v[4]) {
1996  /* Computing MAX */
1997  d__1 = v[24], d__2 = v[4] * .5 / emax;
1998  v[16] = rfac1 * std::max(d__1, d__2);
1999  }
2000 
2001  /* *** DO FALSE CONVERGENCE TEST *** */
2002 
2003 L170:
2004  if (v[17] <= v[34]) {
2005  goto L180;
2006  }
2007  iv[29] = iv[13];
2008  if (v[10] < v[13]) {
2009  goto L200;
2010  }
2011  goto L230;
2012 
2013 L180:
2014  iv[29] = 12;
2015  goto L240;
2016 
2017  /* *** HANDLE GOOD FUNCTION DECREASE *** */
2018 
2019 L190:
2020  if (v[11] < -v[28] * v[4]) {
2021  goto L210;
2022  }
2023 
2024  /* *** INCREASING RADIUS LOOKS WORTHWHILE. SEE IF WE JUST */
2025  /* *** RECOMPUTED STEP WITH A DECREASED RADIUS OR RESTORED STEP */
2026  /* *** AFTER RECOMPUTING IT WITH A LARGER RADIUS. */
2027 
2028  if (iv[8] < 0) {
2029  goto L210;
2030  }
2031  if (iv[9] == 1) {
2032  goto L210;
2033  }
2034  if (iv[9] == 3) {
2035  goto L210;
2036  }
2037 
2038  /* *** WE DID NOT. TRY A LONGER STEP UNLESS THIS WAS A NEWTON */
2039  /* *** STEP. */
2040 
2041  v[16] = v[25];
2042  gts = v[4];
2043  if (v[11] < (.5 / v[16] - 1.) * gts) {
2044  /* Computing MAX */
2045  d__1 = v[23], d__2 = gts * .5 / (gts + v[11]);
2046  v[16] = std::max(d__1, d__2);
2047  }
2048  iv[29] = 4;
2049  if (v[5] == 0.) {
2050  goto L230;
2051  }
2052  if (v[3] >= 0. && (v[3] < v[2] * 2. || v[6] < v[11] * 1.2)) {
2053  goto L230;
2054  }
2055  /* *** STEP WAS NOT A NEWTON STEP. RECOMPUTE IT WITH */
2056  /* *** A LARGER RADIUS. */
2057  iv[29] = 5;
2058  ++iv[8];
2059 
2060  /* *** SAVE VALUES CORRESPONDING TO GOOD STEP *** */
2061 
2062 L200:
2063  v[12] = v[10];
2064  iv[32] = iv[5];
2065  if (iv[9] == 0) {
2066  iv[9] = 2;
2067  }
2068  v[18] = v[2];
2069  iv[7] = nfc;
2070  v[15] = v[7];
2071  v[14] = v[4];
2072  goto L230;
2073 
2074  /* *** ACCEPT STEP WITH RADIUS UNCHANGED *** */
2075 
2076 L210:
2077  v[16] = 1.;
2078  iv[29] = 3;
2079  goto L230;
2080 
2081  /* *** COME HERE FOR A RESTART AFTER CONVERGENCE *** */
2082 
2083 L220:
2084  iv[29] = iv[13];
2085  if (v[18] >= 0.) {
2086  goto L240;
2087  }
2088  iv[29] = 12;
2089  goto L240;
2090 
2091  /* *** PERFORM CONVERGENCE TESTS *** */
2092 
2093 L230:
2094  iv[13] = iv[29];
2095 L240:
2096  if (iv[9] == 1 && v[12] < v[13]) {
2097  iv[9] = 3;
2098  }
2099  if (std::fabs(v[10]) < v[31]) {
2100  iv[29] = 10;
2101  }
2102  if (v[11] * .5 > v[7]) {
2103  goto L999;
2104  }
2105  emax = v[32] * std::fabs(v[13]);
2106  emaxs = v[37] * std::fabs(v[13]);
2107  if (v[7] <= emaxs && (v[2] > v[36] || v[5] == 0.)) {
2108  iv[29] = 11;
2109  }
2110  if (v[3] < 0.) {
2111  goto L250;
2112  }
2113  i__ = 0;
2114  if ((v[6] > 0. && v[6] <= emax) || (v[6] == 0. && v[7] == 0.)) {
2115  i__ = 2;
2116  }
2117  if (v[5] == 0. && v[17] <= v[33] && goodx) {
2118  ++i__;
2119  }
2120  if (i__ > 0) {
2121  iv[29] = i__ + 6;
2122  }
2123 
2124  /* *** CONSIDER RECOMPUTING STEP OF LENGTH V(LMAXS) FOR SINGULAR */
2125  /* *** CONVERGENCE TEST. */
2126 
2127 L250:
2128  if (iv[29] > 5 && iv[29] != 12) {
2129  goto L999;
2130  }
2131  if (v[5] == 0.) {
2132  goto L999;
2133  }
2134  if (v[2] > v[36]) {
2135  goto L260;
2136  }
2137  if (v[7] >= emaxs) {
2138  goto L999;
2139  }
2140  if (v[3] <= 0.) {
2141  goto L270;
2142  }
2143  if (v[3] * .5 <= v[36]) {
2144  goto L999;
2145  }
2146  goto L270;
2147 L260:
2148  if (v[2] * .5 <= v[36]) {
2149  goto L999;
2150  }
2151  xmax = v[36] / v[2];
2152  if (xmax * (2. - xmax) * v[7] >= emaxs) {
2153  goto L999;
2154  }
2155 L270:
2156  if (v[6] < 0.) {
2157  goto L290;
2158  }
2159 
2160  /* *** RECOMPUTE V(PREDUC) FOR USE IN SINGULAR CONVERGENCE TEST *** */
2161 
2162  v[14] = v[4];
2163  v[18] = v[2];
2164  if (iv[29] == 12) {
2165  v[18] = -v[18];
2166  }
2167  v[15] = v[7];
2168  i__ = iv[9];
2169  iv[9] = 2;
2170  if (i__ == 3) {
2171  iv[9] = 0;
2172  }
2173  iv[29] = 6;
2174  goto L999;
2175 
2176  /* *** PERFORM SINGULAR CONVERGENCE TEST WITH RECOMPUTED V(PREDUC) *** */
2177 
2178 L280:
2179  v[4] = v[14];
2180  v[2] = std::fabs(v[18]);
2181  iv[29] = iv[13];
2182  if (v[18] <= 0.) {
2183  iv[29] = 12;
2184  }
2185  v[6] = -v[7];
2186  v[7] = v[15];
2187  iv[9] = 3;
2188 L290:
2189  if (-v[6] <= v[37] * std::fabs(v[13])) {
2190  iv[29] = 11;
2191  }
2192 
2193 L999:
2194  return 0;
2195 
2196  /* *** LAST LINE OF DA7SST FOLLOWS *** */
2197  } /* da7sst_ */
2198 
2199  template<typename doublereal>
2200  int dl7vml_(integer *n, doublereal *x, doublereal *l,
2201  doublereal *y) {
2202  /* System generated locals */
2203  integer i__1, i__2;
2204 
2205  /* Local variables */
2206  static integer i__, j;
2207  static doublereal t;
2208  static integer i0, ii, ij, np1;
2209 
2210 
2211  /* *** COMPUTE X = L*Y, WHERE L IS AN N X N LOWER TRIANGULAR */
2212  /* *** MATRIX STORED COMPACTLY BY ROWS. X AND Y MAY OCCUPY THE SAME */
2213  /* *** STORAGE. *** */
2214 
2215  /* DIMENSION L(N*(N+1)/2) */
2216  /* /6 */
2217  /* DATA ZERO/0.D+0/ */
2218  /* /7 */
2219  /* / */
2220 
2221  /* Parameter adjustments */
2222  --y;
2223  --x;
2224  --l;
2225 
2226  /* Function Body */
2227  np1 = *n + 1;
2228  i0 = *n * (*n + 1) / 2;
2229  i__1 = *n;
2230  for (ii = 1; ii <= i__1; ++ii) {
2231  i__ = np1 - ii;
2232  i0 -= i__;
2233  t = 0.;
2234  i__2 = i__;
2235  for (j = 1; j <= i__2; ++j) {
2236  ij = i0 + j;
2237  t += l[ij] * y[j];
2238  /* L10: */
2239  }
2240  x[i__] = t;
2241  /* L20: */
2242  }
2243  /* L999: */
2244  return 0;
2245  /* *** LAST CARD OF DL7VML FOLLOWS *** */
2246  } /* dl7vml_ */
2247 
2248  template<typename doublereal>
2249  int dw7zbf_(doublereal *l, integer *n, doublereal *s,
2250  doublereal *w, doublereal *y, doublereal *z__) {
2251  /* System generated locals */
2252  integer i__1;
2253 
2254  /* Builtin functions */
2255  // double sqrt(doublereal);
2256 
2257  /* Local variables */
2258  static integer i__;
2259  static doublereal cs, cy, ys, shs, theta, epsrt;
2260  // extern /* Subroutine */ int dl7ivm_(integer *, doublereal *, doublereal *,
2261  // doublereal *);
2262  // extern doublereal dd7tpr_(integer *, doublereal *, doublereal *);
2263  // extern /* Subroutine */ int dl7tvm_(integer *, doublereal *, doublereal *,
2264  // doublereal *);
2265 
2266 
2267  /* *** COMPUTE Y AND Z FOR DL7UPD CORRESPONDING TO BFGS UPDATE. */
2268 
2269  /* DIMENSION L(N*(N+1)/2) */
2270 
2271  /* -------------------------- PARAMETER USAGE -------------------------- */
2272 
2273  /* L (I/O) CHOLESKY FACTOR OF HESSIAN, A LOWER TRIANG. MATRIX STORED */
2274  /* COMPACTLY BY ROWS. */
2275  /* N (INPUT) ORDER OF L AND LENGTH OF S, W, Y, Z. */
2276  /* S (INPUT) THE STEP JUST TAKEN. */
2277  /* W (OUTPUT) RIGHT SINGULAR VECTOR OF RANK 1 CORRECTION TO L. */
2278  /* Y (INPUT) CHANGE IN GRADIENTS CORRESPONDING TO S. */
2279  /* Z (OUTPUT) LEFT SINGULAR VECTOR OF RANK 1 CORRECTION TO L. */
2280 
2281  /* ------------------------------- NOTES ------------------------------- */
2282 
2283  /* *** ALGORITHM NOTES *** */
2284 
2285  /* WHEN S IS COMPUTED IN CERTAIN WAYS, E.G. BY GQTSTP OR */
2286  /* DBLDOG, IT IS POSSIBLE TO SAVE N**2/2 OPERATIONS SINCE (L**T)*S */
2287  /* OR L*(L**T)*S IS THEN KNOWN. */
2288  /* IF THE BFGS UPDATE TO L*(L**T) WOULD REDUCE ITS DETERMINANT TO */
2289  /* LESS THAN EPS TIMES ITS OLD VALUE, THEN THIS ROUTINE IN EFFECT */
2290  /* REPLACES Y BY THETA*Y + (1 - THETA)*L*(L**T)*S, WHERE THETA */
2291  /* (BETWEEN 0 AND 1) IS CHOSEN TO MAKE THE REDUCTION FACTOR = EPS. */
2292 
2293  /* *** GENERAL *** */
2294 
2295  /* CODED BY DAVID M. GAY (FALL 1979). */
2296  /* THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH SUPPORTED */
2297  /* BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS MCS-7600324 AND */
2298  /* MCS-7906671. */
2299 
2300  /* ------------------------ EXTERNAL QUANTITIES ------------------------ */
2301 
2302  /* *** FUNCTIONS AND SUBROUTINES CALLED *** */
2303 
2304  /* DD7TPR RETURNS INNER PRODUCT OF TWO VECTORS. */
2305  /* DL7IVM MULTIPLIES L**-1 TIMES A VECTOR. */
2306  /* DL7TVM MULTIPLIES L**T TIMES A VECTOR. */
2307 
2308  /* *** INTRINSIC FUNCTIONS *** */
2309  /* /+ */
2310  /* / */
2311  /* -------------------------- LOCAL VARIABLES -------------------------- */
2312 
2313 
2314  /* *** DATA INITIALIZATIONS *** */
2315 
2316  /* /6 */
2317  /* DATA EPS/0.1D+0/, ONE/1.D+0/ */
2318  /* /7 */
2319  /* / */
2320 
2321  /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */
2322 
2323  /* Parameter adjustments */
2324  --l;
2325  --z__;
2326  --y;
2327  --w;
2328  --s;
2329 
2330  /* Function Body */
2331  dl7tvm_(n, &w[1], &l[1], &s[1]);
2332  shs = dd7tpr_(n, &w[1], &w[1]);
2333  ys = dd7tpr_(n, &y[1], &s[1]);
2334  if (ys >= shs * .1) {
2335  goto L10;
2336  }
2337  theta = shs * .90000000000000002 / (shs - ys);
2338  epsrt = sqrt(.1);
2339  cy = theta / (shs * epsrt);
2340  cs = ((theta - 1.) / epsrt + 1.) / shs;
2341  goto L20;
2342 L10:
2343  cy = 1. / (sqrt(ys) * sqrt(shs));
2344  cs = 1. / shs;
2345 L20:
2346  dl7ivm_(n, &z__[1], &l[1], &y[1]);
2347  i__1 = *n;
2348  for (i__ = 1; i__ <= i__1; ++i__) {
2349  /* L30: */
2350  z__[i__] = cy * z__[i__] - cs * w[i__];
2351  }
2352 
2353  /* L999: */
2354  return 0;
2355  /* *** LAST CARD OF DW7ZBF FOLLOWS *** */
2356  } /* dw7zbf_ */
2357 
2358  template<typename doublereal>
2359  int dl7upd_(doublereal *beta, doublereal *gamma, doublereal *
2360  l, doublereal *lambda, doublereal *lplus, integer *n, doublereal *w,
2361  doublereal *z__) {
2362  /* System generated locals */
2363  integer i__1, i__2;
2364  doublereal d__1;
2365 
2366  /* Builtin functions */
2367  // double sqrt(doublereal);
2368 
2369  /* Local variables */
2370  static doublereal a, b;
2371  static integer i__, j, k;
2372  static doublereal s, bj, gj;
2373  static integer ij, jj;
2374  static doublereal lj, wj, nu, zj;
2375  static integer jp1, nm1, np1;
2376  static doublereal eta, lij, ljj, theta;
2377 
2378 
2379  /* *** COMPUTE LPLUS = SECANT UPDATE OF L *** */
2380 
2381  /* *** PARAMETER DECLARATIONS *** */
2382 
2383  /* DIMENSION L(N*(N+1)/2), LPLUS(N*(N+1)/2) */
2384 
2385  /* -------------------------- PARAMETER USAGE -------------------------- */
2386 
2387  /* BETA = SCRATCH VECTOR. */
2388  /* GAMMA = SCRATCH VECTOR. */
2389  /* L (INPUT) LOWER TRIANGULAR MATRIX, STORED ROWWISE. */
2390  /* LAMBDA = SCRATCH VECTOR. */
2391  /* LPLUS (OUTPUT) LOWER TRIANGULAR MATRIX, STORED ROWWISE, WHICH MAY */
2392  /* OCCUPY THE SAME STORAGE AS L. */
2393  /* N (INPUT) LENGTH OF VECTOR PARAMETERS AND ORDER OF MATRICES. */
2394  /* W (INPUT, DESTROYED ON OUTPUT) RIGHT SINGULAR VECTOR OF RANK 1 */
2395  /* CORRECTION TO L. */
2396  /* Z (INPUT, DESTROYED ON OUTPUT) LEFT SINGULAR VECTOR OF RANK 1 */
2397  /* CORRECTION TO L. */
2398 
2399  /* ------------------------------- NOTES ------------------------------- */
2400 
2401  /* *** APPLICATION AND USAGE RESTRICTIONS *** */
2402 
2403  /* THIS ROUTINE UPDATES THE CHOLESKY FACTOR L OF A SYMMETRIC */
2404  /* POSITIVE DEFINITE MATRIX TO WHICH A SECANT UPDATE IS BEING */
2405  /* APPLIED -- IT COMPUTES A CHOLESKY FACTOR LPLUS OF */
2406  /* L * (I + Z*W**T) * (I + W*Z**T) * L**T. IT IS ASSUMED THAT W */
2407  /* AND Z HAVE BEEN CHOSEN SO THAT THE UPDATED MATRIX IS STRICTLY */
2408  /* POSITIVE DEFINITE. */
2409 
2410  /* *** ALGORITHM NOTES *** */
2411 
2412  /* THIS CODE USES RECURRENCE 3 OF REF. 1 (WITH D(J) = 1 FOR ALL J) */
2413  /* TO COMPUTE LPLUS OF THE FORM L * (I + Z*W**T) * Q, WHERE Q */
2414  /* IS AN ORTHOGONAL MATRIX THAT MAKES THE RESULT LOWER TRIANGULAR. */
2415  /* LPLUS MAY HAVE SOME NEGATIVE DIAGONAL ELEMENTS. */
2416 
2417  /* *** REFERENCES *** */
2418 
2419  /* 1. GOLDFARB, D. (1976), FACTORIZED VARIABLE METRIC METHODS FOR UNCON- */
2420  /* STRAINED OPTIMIZATION, MATH. COMPUT. 30, PP. 796-811. */
2421 
2422  /* *** GENERAL *** */
2423 
2424  /* CODED BY DAVID M. GAY (FALL 1979). */
2425  /* THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH SUPPORTED */
2426  /* BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS MCS-7600324 AND */
2427  /* MCS-7906671. */
2428 
2429  /* ------------------------ EXTERNAL QUANTITIES ------------------------ */
2430 
2431  /* *** INTRINSIC FUNCTIONS *** */
2432  /* /+ */
2433  /* / */
2434  /* -------------------------- LOCAL VARIABLES -------------------------- */
2435 
2436 
2437  /* *** DATA INITIALIZATIONS *** */
2438 
2439  /* /6 */
2440  /* DATA ONE/1.D+0/, ZERO/0.D+0/ */
2441  /* /7 */
2442  /* / */
2443 
2444  /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */
2445 
2446  /* Parameter adjustments */
2447  --l;
2448  --lplus;
2449  --z__;
2450  --w;
2451  --lambda;
2452  --gamma;
2453  --beta;
2454 
2455  /* Function Body */
2456  nu = 1.;
2457  eta = 0.;
2458  if (*n <= 1) {
2459  goto L30;
2460  }
2461  nm1 = *n - 1;
2462 
2463  /* *** TEMPORARILY STORE S(J) = SUM OVER K = J+1 TO N OF W(K)**2 IN */
2464  /* *** LAMBDA(J). */
2465 
2466  s = 0.;
2467  i__1 = nm1;
2468  for (i__ = 1; i__ <= i__1; ++i__) {
2469  j = *n - i__;
2470  /* Computing 2nd power */
2471  d__1 = w[j + 1];
2472  s += d__1 * d__1;
2473  lambda[j] = s;
2474  /* L10: */
2475  }
2476 
2477  /* *** COMPUTE LAMBDA, GAMMA, AND BETA BY GOLDFARB*S RECURRENCE 3. */
2478 
2479  i__1 = nm1;
2480  for (j = 1; j <= i__1; ++j) {
2481  wj = w[j];
2482  a = nu * z__[j] - eta * wj;
2483  theta = a * wj + 1.;
2484  s = a * lambda[j];
2485  /* Computing 2nd power */
2486  d__1 = theta;
2487  lj = sqrt(d__1 * d__1 + a * s);
2488  if (theta > 0.) {
2489  lj = -lj;
2490  }
2491  lambda[j] = lj;
2492  b = theta * wj + s;
2493  gamma[j] = b * nu / lj;
2494  beta[j] = (a - b * eta) / lj;
2495  nu = -nu / lj;
2496  /* Computing 2nd power */
2497  d__1 = a;
2498  eta = -(eta + d__1 * d__1 / (theta - lj)) / lj;
2499  /* L20: */
2500  }
2501 L30:
2502  lambda[*n] = (nu * z__[*n] - eta * w[*n]) * w[*n] + 1.;
2503 
2504  /* *** UPDATE L, GRADUALLY OVERWRITING W AND Z WITH L*W AND L*Z. */
2505 
2506  np1 = *n + 1;
2507  jj = *n * (*n + 1) / 2;
2508  i__1 = *n;
2509  for (k = 1; k <= i__1; ++k) {
2510  j = np1 - k;
2511  lj = lambda[j];
2512  ljj = l[jj];
2513  lplus[jj] = lj * ljj;
2514  wj = w[j];
2515  w[j] = ljj * wj;
2516  zj = z__[j];
2517  z__[j] = ljj * zj;
2518  if (k == 1) {
2519  goto L50;
2520  }
2521  bj = beta[j];
2522  gj = gamma[j];
2523  ij = jj + j;
2524  jp1 = j + 1;
2525  i__2 = *n;
2526  for (i__ = jp1; i__ <= i__2; ++i__) {
2527  lij = l[ij];
2528  lplus[ij] = lj * lij + bj * w[i__] + gj * z__[i__];
2529  w[i__] += lij * wj;
2530  z__[i__] += lij * zj;
2531  ij += i__;
2532  /* L40: */
2533  }
2534 L50:
2535  jj -= j;
2536  /* L60: */
2537  }
2538 
2539  /* L999: */
2540  return 0;
2541  /* *** LAST CARD OF DL7UPD FOLLOWS *** */
2542  } /* dl7upd_ */
2543 
2544  template<typename doublereal>
2545  int dparck_(integer *alg, doublereal *d__, integer *iv,
2546  integer *liv, integer *lv, integer *n, doublereal *v) {
2547  /* Initialized data */
2548 
2549  static doublereal big = 0.;
2550  static char* cngd[] = {"---C", "HANG", "ED V"};
2551  static char* dflt[] = {"NOND", "EFAU", "LT V"};
2552  static integer ijmp = 33;
2553  static integer jlim[4] = {0, 24, 0, 24};
2554  static integer ndflt[4] = {32, 25, 32, 25};
2555  static integer miniv[4] = {82, 59, 103, 103};
2556  static doublereal machep = -1.;
2557  static doublereal tiny = 1.;
2558  static doublereal zero = 0.;
2559  static char* vn[] = {"EPSL", "ON..", "PHMN", "FC..", "PHMX", "FC..", "DECF",
2560  "AC..", "INCF", "AC..", "RDFC", "MN..", "RDFC", "MX..", "TUNE", "R1..",
2561  "TUNE", "R2..", "TUNE", "R3..", "TUNE", "R4..", "TUNE", "R5..", "AFCT",
2562  "OL..", "RFCT", "OL..", "XCTO", "L...", "XFTO", "L...", "LMAX", "0...",
2563  "LMAX", "S...", "SCTO", "L...", "DINI", "T...", "DTIN", "IT..", "D0IN",
2564  "IT..", "DFAC", "....", "DLTF", "DC..", "DLTF", "DJ..", "DELT", "A0..",
2565  "FUZZ", "....", "RLIM", "IT..", "COSM", "IN..", "HUBE", "RC..", "RSPT",
2566  "OL..", "SIGM", "IN..", "ETA0", "....", "BIAS", "...."};
2567  static doublereal vm[34] = {.001, -.99, .001, .01, 1.2, .01, 1.2, 0., 0., .001,
2568  -1., 0.0, 0., 0.0, 0., 0., 0.0, 0.0, 0., -10., 0., 0., 0., 0.0, 0.0, 0.0, 1.01,
2569  1e10, 0.0, 0., 0., 0., 0.0, 0.};
2570  static doublereal vx[34] = {.9, -.001, 10., .8, 100., .8, 100., .5, .5, 1., 1., 0.0,
2571  0.0, .1, 1., 1., 0.0, 0.0, 1., 0.0, 0.0, 0.0, 1., 1., 1., 1., 1e10, 0.0, 1., 0.0,
2572  1., 1., 1., 1.};
2573  static char* varnm[] = {"P", "P"};
2574  static char* sh[] = {"S", "H"};
2575 
2576  /* Format strings */
2577  static char fmt_10[] = "(/\002 THE FIRST PARAMETER TO DIVSET SHOULD B"
2578  "E\002,i3,\002 RATHER THAN\002,i3)";
2579  static char fmt_40[] = "(/\002 /// BAD\002,a1,\002 =\002,i5)";
2580  static char fmt_70[] = "(/\002 /// \002,1a1,\002 CHANGED FROM \002,i5"
2581  ",\002 TO \002,i5)";
2582  static char fmt_90[] = "(/\002 /// IV(1) =\002,i5,\002 SHOULD BE BETWEE"
2583  "N 0 AND 14.\002)";
2584  static char fmt_130[] = "(/\002 /// \002,2a4,\002.. V(\002,i2,\002) "
2585  "=\002,d11.3,\002 SHOULD\002,\002 BE BETWEEN\002,d11.3,\002 AN"
2586  "D\002,d11.3)";
2587  static char fmt_160[] = "(/\002 IV(NVDFLT) =\002,i5,\002 RATHER THAN "
2588  "\002,i5)";
2589  static char fmt_180[] = "(/\002 /// D(\002,i3,\002) =\002,d11.3,\002 SH"
2590  "OULD BE POSITIVE\002)";
2591  static char fmt_220[] = "(/\002 NONDEFAULT VALUES....\002/\002 INIT\002,"
2592  "a1,\002..... IV(25) =\002,i3)";
2593  static char fmt_260[] = "(/\002 \002,3a4,\002ALUES....\002/)";
2594  static char fmt_240[] = "(\002 DTYPE..... IV(16) =\002,i3)";
2595  static char fmt_270[] = "(1x,2a4,\002.. V(\002,i2,\002) =\002,d15.7)";
2596  static char fmt_310[] = "(/\002 /// LIV =\002,i5,\002 MUST BE AT LEAS"
2597  "T\002,i5)";
2598  static char fmt_330[] = "(/\002 /// LV =\002,i5,\002 MUST BE AT LEAST"
2599  "\002,i5)";
2600  static char fmt_350[] = "(/\002 /// ALG =\002,i5,\002 MUST BE 1 2, 3, OR"
2601  " 4\002)";
2602  static char fmt_370[] = "(/\002 /// LIV =\002,i5,\002 MUST BE AT LEAS"
2603  "T\002,i5,\002 TO COMPUTE TRUE MIN. LIV AND MIN. LV\002)";
2604 
2605  /* System generated locals */
2606  integer i__1, i__2;
2607 
2608  /* Builtin functions */
2609  // integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void);
2610  // /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen);
2611 
2612  /* Local variables */
2613  static integer i__, j, k, l, m, ii;
2614  static doublereal vk;
2615  static integer pu, iv1, alg1, miv1, miv2;
2616  static char which[4 * 3];
2617  // extern doublereal dr7mdc_(integer *);
2618  // extern /* Subroutine */ int dv7dfl_(integer *, integer *, doublereal *),
2619  // dv7cpy_(integer *, doublereal *, doublereal *);
2620  static integer parsv1, ndfalt;
2621  // extern /* Subroutine */ int divset_(integer *, integer *, integer *,
2622  // integer *, doublereal *);
2623 
2624  /* Fortran I/O blocks */
2625  static cilist io___17 = {0, 0, 0, fmt_10, 0};
2626  static cilist io___22 = {0, 0, 0, fmt_40, 0};
2627  static cilist io___25 = {0, 0, 0, fmt_70, 0};
2628  static cilist io___26 = {0, 0, 0, fmt_90, 0};
2629  static cilist io___33 = {0, 0, 0, fmt_130, 0};
2630  static cilist io___34 = {0, 0, 0, fmt_160, 0};
2631  static cilist io___35 = {0, 0, 0, fmt_180, 0};
2632  static cilist io___36 = {0, 0, 0, fmt_220, 0};
2633  static cilist io___37 = {0, 0, 0, fmt_260, 0};
2634  static cilist io___38 = {0, 0, 0, fmt_240, 0};
2635  static cilist io___40 = {0, 0, 0, fmt_260, 0};
2636  static cilist io___41 = {0, 0, 0, fmt_270, 0};
2637  static cilist io___43 = {0, 0, 0, fmt_310, 0};
2638  static cilist io___44 = {0, 0, 0, fmt_330, 0};
2639  static cilist io___45 = {0, 0, 0, fmt_350, 0};
2640  static cilist io___46 = {0, 0, 0, fmt_370, 0};
2641 
2642 
2643 
2644  /* *** CHECK ***SOL (VERSION 2.3) PARAMETERS, PRINT CHANGED VALUES *** */
2645 
2646  /* *** ALG = 1 FOR REGRESSION, ALG = 2 FOR GENERAL UNCONSTRAINED OPT. */
2647 
2648 
2649  /* DIVSET -- SUPPLIES DEFAULT VALUES TO BOTH IV AND V. */
2650  /* DR7MDC -- RETURNS MACHINE-DEPENDENT CONSTANTS. */
2651  /* DV7CPY -- COPIES ONE VECTOR TO ANOTHER. */
2652  /* DV7DFL -- SUPPLIES DEFAULT PARAMETER VALUES TO V ALONE. */
2653 
2654  /* *** LOCAL VARIABLES *** */
2655 
2656  /* /6S */
2657  /* INTEGER VARNM(2), SH(2) */
2658  /* REAL CNGD(3), DFLT(3), VN(2,34), WHICH(3) */
2659  /* /7S */
2660  /* / */
2661 
2662  /* *** IV AND V SUBSCRIPTS *** */
2663 
2664 
2665 
2666  /* /6 */
2667  /* DATA ALGSAV/51/, DINIT/38/, DTYPE/16/, DTYPE0/54/, EPSLON/19/, */
2668  /* 1 INITS/25/, IVNEED/3/, LASTIV/44/, LASTV/45/, LMAT/42/, */
2669  /* 2 NEXTIV/46/, NEXTV/47/, NVDFLT/50/, OLDN/38/, PARPRT/20/, */
2670  /* 3 PARSAV/49/, PERM/58/, PRUNIT/21/, VNEED/4/ */
2671  /* /7 */
2672  /* / */
2673 
2674  /* Parameter adjustments */
2675  --iv;
2676  --v;
2677  --d__;
2678 
2679  /* Function Body */
2680  /* /6S */
2681  /* DATA VN(1,1),VN(2,1)/4HEPSL,4HON../ */
2682  /* DATA VN(1,2),VN(2,2)/4HPHMN,4HFC../ */
2683  /* DATA VN(1,3),VN(2,3)/4HPHMX,4HFC../ */
2684  /* DATA VN(1,4),VN(2,4)/4HDECF,4HAC../ */
2685  /* DATA VN(1,5),VN(2,5)/4HINCF,4HAC../ */
2686  /* DATA VN(1,6),VN(2,6)/4HRDFC,4HMN../ */
2687  /* DATA VN(1,7),VN(2,7)/4HRDFC,4HMX../ */
2688  /* DATA VN(1,8),VN(2,8)/4HTUNE,4HR1../ */
2689  /* DATA VN(1,9),VN(2,9)/4HTUNE,4HR2../ */
2690  /* DATA VN(1,10),VN(2,10)/4HTUNE,4HR3../ */
2691  /* DATA VN(1,11),VN(2,11)/4HTUNE,4HR4../ */
2692  /* DATA VN(1,12),VN(2,12)/4HTUNE,4HR5../ */
2693  /* DATA VN(1,13),VN(2,13)/4HAFCT,4HOL../ */
2694  /* DATA VN(1,14),VN(2,14)/4HRFCT,4HOL../ */
2695  /* DATA VN(1,15),VN(2,15)/4HXCTO,4HL.../ */
2696  /* DATA VN(1,16),VN(2,16)/4HXFTO,4HL.../ */
2697  /* DATA VN(1,17),VN(2,17)/4HLMAX,4H0.../ */
2698  /* DATA VN(1,18),VN(2,18)/4HLMAX,4HS.../ */
2699  /* DATA VN(1,19),VN(2,19)/4HSCTO,4HL.../ */
2700  /* DATA VN(1,20),VN(2,20)/4HDINI,4HT.../ */
2701  /* DATA VN(1,21),VN(2,21)/4HDTIN,4HIT../ */
2702  /* DATA VN(1,22),VN(2,22)/4HD0IN,4HIT../ */
2703  /* DATA VN(1,23),VN(2,23)/4HDFAC,4H..../ */
2704  /* DATA VN(1,24),VN(2,24)/4HDLTF,4HDC../ */
2705  /* DATA VN(1,25),VN(2,25)/4HDLTF,4HDJ../ */
2706  /* DATA VN(1,26),VN(2,26)/4HDELT,4HA0../ */
2707  /* DATA VN(1,27),VN(2,27)/4HFUZZ,4H..../ */
2708  /* DATA VN(1,28),VN(2,28)/4HRLIM,4HIT../ */
2709  /* DATA VN(1,29),VN(2,29)/4HCOSM,4HIN../ */
2710  /* DATA VN(1,30),VN(2,30)/4HHUBE,4HRC../ */
2711  /* DATA VN(1,31),VN(2,31)/4HRSPT,4HOL../ */
2712  /* DATA VN(1,32),VN(2,32)/4HSIGM,4HIN../ */
2713  /* DATA VN(1,33),VN(2,33)/4HETA0,4H..../ */
2714  /* DATA VN(1,34),VN(2,34)/4HBIAS,4H..../ */
2715  /* /7S */
2716  /* / */
2717 
2718 
2719  /* /6S */
2720  /* DATA VARNM(1)/1HP/, VARNM(2)/1HP/, SH(1)/1HS/, SH(2)/1HH/ */
2721  /* DATA CNGD(1),CNGD(2),CNGD(3)/4H---C,4HHANG,4HED V/, */
2722  /* 1 DFLT(1),DFLT(2),DFLT(3)/4HNOND,4HEFAU,4HLT V/ */
2723  /* /7S */
2724  /* / */
2725 
2726  /* ............................... BODY ................................ */
2727 
2728  pu = 0;
2729  if (21 <= *liv) {
2730  pu = iv[21];
2731  }
2732  if (51 > *liv) {
2733  goto L20;
2734  }
2735  if (*alg == iv[51]) {
2736  goto L20;
2737  }
2738  if (pu != 0) {
2739  io___17.ciunit = pu;
2740  // s_wsfe(&io___17);
2741  // do_fio(&c__1, (char *)&(*alg), (ftnlen)sizeof(integer));
2742  // do_fio(&c__1, (char *)&iv[51], (ftnlen)sizeof(integer));
2743  // e_wsfe();
2744  }
2745  iv[1] = 67;
2746  goto L999;
2747 L20:
2748  if (*alg < 1 || *alg > 4) {
2749  goto L340;
2750  }
2751  miv1 = miniv[*alg - 1];
2752  if (iv[1] == 15) {
2753  goto L360;
2754  }
2755  alg1 = (*alg - 1) % 2 + 1;
2756  if (iv[1] == 0) {
2757  divset_(alg, &iv[1], liv, lv, &v[1]);
2758  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
2759  }
2760  iv1 = iv[1];
2761  if (iv1 != 13 && iv1 != 12) {
2762  goto L30;
2763  }
2764  if (58 <= *liv) {
2765  /* Computing MAX */
2766  i__1 = miv1, i__2 = iv[58] - 1;
2767  miv1 = std::max(i__1, i__2);
2768  }
2769  if (3 <= *liv) {
2770  miv2 = miv1 + std::max(iv[3], 0l);
2771  }
2772  if (44 <= *liv) {
2773  iv[44] = miv2;
2774  }
2775  if (*liv < miv1) {
2776  goto L300;
2777  }
2778  iv[3] = 0;
2779  iv[45] = std::max(iv[4], 0l) + iv[42] - 1;
2780  iv[4] = 0;
2781  if (*liv < miv2) {
2782  goto L300;
2783  }
2784  if (*lv < iv[45]) {
2785  goto L320;
2786  }
2787 L30:
2788  if (iv1 < 12 || iv1 > 14) {
2789  goto L60;
2790  }
2791  if (*n >= 1) {
2792  goto L50;
2793  }
2794  iv[1] = 81;
2795  if (pu == 0) {
2796  goto L999;
2797  }
2798  io___22.ciunit = pu;
2799  // s_wsfe(&io___22);
2800  // do_fio(&c__1, varnm + (alg1 - 1), (ftnlen)1);
2801  // do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
2802  // e_wsfe();
2803  goto L999;
2804 L50:
2805  if (iv1 != 14) {
2806  iv[46] = iv[58];
2807  }
2808  if (iv1 != 14) {
2809  iv[47] = iv[42];
2810  }
2811  if (iv1 == 13) {
2812  goto L999;
2813  }
2814  k = iv[49] - 19;
2815  i__1 = *lv - k;
2816  dv7dfl_(&alg1, &i__1, &v[k + 1]);
2817  iv[54] = 2 - alg1;
2818  iv[38] = *n;
2819  // s_copy(which, dflt, (ftnlen) 4, (ftnlen) 4);
2820  // s_copy(which + 4, dflt + 4, (ftnlen) 4, (ftnlen) 4);
2821  // s_copy(which + 8, dflt + 8, (ftnlen) 4, (ftnlen) 4);
2822  goto L110;
2823 L60:
2824  if (*n == iv[38]) {
2825  goto L80;
2826  }
2827  iv[1] = 17;
2828  if (pu == 0) {
2829  goto L999;
2830  }
2831  io___25.ciunit = pu;
2832  // s_wsfe(&io___25);
2833  // do_fio(&c__1, varnm + (alg1 - 1), (ftnlen)1);
2834  // do_fio(&c__1, (char *)&iv[38], (ftnlen)sizeof(integer));
2835  // do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
2836  // e_wsfe();
2837  goto L999;
2838 
2839 L80:
2840  if (iv1 <= 11 && iv1 >= 1) {
2841  goto L100;
2842  }
2843  iv[1] = 80;
2844  if (pu != 0) {
2845  // io___26.ciunit = pu;
2846  // s_wsfe(&io___26);
2847  // do_fio(&c__1, (char *)&iv1, (ftnlen)sizeof(integer));
2848  // e_wsfe();
2849  }
2850  goto L999;
2851 
2852 L100:
2853  // s_copy(which, cngd, (ftnlen) 4, (ftnlen) 4);
2854  // s_copy(which + 4, cngd + 4, (ftnlen) 4, (ftnlen) 4);
2855  // s_copy(which + 8, cngd + 8, (ftnlen) 4, (ftnlen) 4);
2856 
2857  L110 :
2858  if (iv1 == 14) {
2859  iv1 = 12;
2860  }
2861  if (big > tiny) {
2862  goto L120;
2863  }
2864  tiny = dr7mdc_<doublereal>(&c__1);
2865  machep = dr7mdc_<doublereal>(&c__3);
2866  big = dr7mdc_<doublereal>(&c__6);
2867  vm[11] = machep;
2868  vx[11] = big;
2869  vx[12] = big;
2870  vm[13] = machep;
2871  vm[16] = tiny;
2872  vx[16] = big;
2873  vm[17] = tiny;
2874  vx[17] = big;
2875  vx[19] = big;
2876  vx[20] = big;
2877  vx[21] = big;
2878  vm[23] = machep;
2879  vm[24] = machep;
2880  vm[25] = machep;
2881  vx[27] = dr7mdc_<doublereal>(&c__5);
2882  vm[28] = machep;
2883  vx[29] = big;
2884  vm[32] = machep;
2885 L120:
2886  m = 0;
2887  i__ = 1;
2888  j = jlim[alg1 - 1];
2889  k = 19;
2890  ndfalt = ndflt[alg1 - 1];
2891  i__1 = ndfalt;
2892  for (l = 1; l <= i__1; ++l) {
2893  vk = v[k];
2894  if (vk >= vm[i__ - 1] && vk <= vx[i__ - 1]) {
2895  goto L140;
2896  }
2897  m = k;
2898  if (pu != 0) {
2899  io___33.ciunit = pu;
2900  // s_wsfe(&io___33);
2901  // do_fio(&c__1, vn + ((i__ << 1) - 2 << 2), (ftnlen)4);
2902  // do_fio(&c__1, vn + ((i__ << 1) - 1 << 2), (ftnlen)4);
2903  // do_fio(&c__1, (char *)&k, (ftnlen)sizeof(integer));
2904  // do_fio(&c__1, (char *)&vk, (ftnlen)sizeof(doublereal));
2905  // do_fio(&c__1, (char *)&vm[i__ - 1], (ftnlen)sizeof(doublereal));
2906  // do_fio(&c__1, (char *)&vx[i__ - 1], (ftnlen)sizeof(doublereal));
2907  // e_wsfe();
2908  }
2909 L140:
2910  ++k;
2911  ++i__;
2912  if (i__ == j) {
2913  i__ = ijmp;
2914  }
2915  /* L150: */
2916  }
2917 
2918  if (iv[50] == ndfalt) {
2919  goto L170;
2920  }
2921  iv[1] = 51;
2922  if (pu == 0) {
2923  goto L999;
2924  }
2925  io___34.ciunit = pu;
2926  // s_wsfe(&io___34);
2927  // do_fio(&c__1, (char *)&iv[50], (ftnlen)sizeof(integer));
2928  // do_fio(&c__1, (char *)&ndfalt, (ftnlen)sizeof(integer));
2929  // e_wsfe();
2930  goto L999;
2931 L170:
2932  if ((iv[16] > 0 || v[38] > zero) && iv1 == 12) {
2933  goto L200;
2934  }
2935  i__1 = *n;
2936  for (i__ = 1; i__ <= i__1; ++i__) {
2937  if (d__[i__] > zero) {
2938  goto L190;
2939  }
2940  m = 18;
2941  if (pu != 0) {
2942  io___35.ciunit = pu;
2943  // s_wsfe(&io___35);
2944  // do_fio(&c__1, (char *)&i__, (ftnlen)sizeof(integer));
2945  // do_fio(&c__1, (char *)&d__[i__], (ftnlen)sizeof(doublereal));
2946  // e_wsfe();
2947  }
2948 L190:
2949  ;
2950  }
2951 L200:
2952  if (m == 0) {
2953  goto L210;
2954  }
2955  iv[1] = m;
2956  //std::cout<<"m = "<<m<<"\n";
2957  goto L999;
2958 
2959 L210:
2960  if (pu == 0 || iv[20] == 0) {
2961  goto L999;
2962  }
2963  if (iv1 != 12 || iv[25] == alg1 - 1) {
2964  goto L230;
2965  }
2966  m = 1;
2967  io___36.ciunit = pu;
2968  // s_wsfe(&io___36);
2969  // do_fio(&c__1, sh + (alg1 - 1), (ftnlen)1);
2970  // do_fio(&c__1, (char *)&iv[25], (ftnlen)sizeof(integer));
2971  // e_wsfe();
2972 L230:
2973  if (iv[16] == iv[54]) {
2974  goto L250;
2975  }
2976  if (m == 0) {
2977  io___37.ciunit = pu;
2978  // s_wsfe(&io___37);
2979  // do_fio(&c__3, which, (ftnlen)4);
2980  // e_wsfe();
2981  }
2982  m = 1;
2983  io___38.ciunit = pu;
2984  // s_wsfe(&io___38);
2985  // do_fio(&c__1, (char *)&iv[16], (ftnlen)sizeof(integer));
2986  // e_wsfe();
2987 L250:
2988  i__ = 1;
2989  j = jlim[alg1 - 1];
2990  k = 19;
2991  l = iv[49];
2992  ndfalt = ndflt[alg1 - 1];
2993  i__1 = ndfalt;
2994  for (ii = 1; ii <= i__1; ++ii) {
2995  if (v[k] == v[l]) {
2996  goto L280;
2997  }
2998  if (m == 0) {
2999  io___40.ciunit = pu;
3000  // s_wsfe(&io___40);
3001  // do_fio(&c__3, which, (ftnlen)4);
3002  // e_wsfe();
3003  }
3004  m = 1;
3005  io___41.ciunit = pu;
3006  // s_wsfe(&io___41);
3007  // do_fio(&c__1, vn + ((i__ << 1) - 2 << 2), (ftnlen)4);
3008  // do_fio(&c__1, vn + ((i__ << 1) - 1 << 2), (ftnlen)4);
3009  // do_fio(&c__1, (char *)&k, (ftnlen)sizeof(integer));
3010  // do_fio(&c__1, (char *)&v[k], (ftnlen)sizeof(doublereal));
3011  // e_wsfe();
3012 L280:
3013  ++k;
3014  ++l;
3015  ++i__;
3016  if (i__ == j) {
3017  i__ = ijmp;
3018  }
3019  /* L290: */
3020  }
3021 
3022  iv[54] = iv[16];
3023  parsv1 = iv[49];
3024  dv7cpy_(&iv[50], &v[parsv1], &v[19]);
3025  goto L999;
3026 
3027 L300:
3028  iv[1] = 15;
3029  if (pu == 0) {
3030  goto L999;
3031  }
3032  io___43.ciunit = pu;
3033  // s_wsfe(&io___43);
3034  // do_fio(&c__1, (char *)&(*liv), (ftnlen)sizeof(integer));
3035  // do_fio(&c__1, (char *)&miv2, (ftnlen)sizeof(integer));
3036  // e_wsfe();
3037  if (*liv < miv1) {
3038  goto L999;
3039  }
3040  if (*lv < iv[45]) {
3041  goto L320;
3042  }
3043  goto L999;
3044 
3045 L320:
3046  iv[1] = 16;
3047  if (pu != 0) {
3048  io___44.ciunit = pu;
3049  // s_wsfe(&io___44);
3050  // do_fio(&c__1, (char *)&(*lv), (ftnlen)sizeof(integer));
3051  // do_fio(&c__1, (char *)&iv[45], (ftnlen)sizeof(integer));
3052  // e_wsfe();
3053  }
3054  goto L999;
3055 
3056 L340:
3057  iv[1] = 67;
3058  if (pu != 0) {
3059  io___45.ciunit = pu;
3060  // s_wsfe(&io___45);
3061  // do_fio(&c__1, (char *)&(*alg), (ftnlen)sizeof(integer));
3062  // e_wsfe();
3063  }
3064  goto L999;
3065 L360:
3066  if (pu != 0) {
3067  io___46.ciunit = pu;
3068  // s_wsfe(&io___46);
3069  // do_fio(&c__1, (char *)&(*liv), (ftnlen)sizeof(integer));
3070  // do_fio(&c__1, (char *)&miv1, (ftnlen)sizeof(integer));
3071  // e_wsfe();
3072  }
3073  if (44 <= *liv) {
3074  iv[44] = miv1;
3075  }
3076  if (45 <= *liv) {
3077  iv[45] = 0;
3078  }
3079 
3080 L999:
3081  return 0;
3082  /* *** LAST LINE OF DPARCK FOLLOWS *** */
3083  } /* dparck_ */
3084 
3085  template<typename doublereal>
3086  int drmng_(doublereal *d__, doublereal *fx, doublereal *g,
3087  integer *iv, integer *liv, integer *lv, integer *n, doublereal *v,
3088  doublereal *x) {
3089  /* System generated locals */
3090  integer i__1;
3091  doublereal c_b33_l = static_cast<doublereal> (c_b33);
3092  doublereal c_b44_l = static_cast<doublereal> (c_b44);
3093  doublereal c_b13_l = static_cast<doublereal> (c_b13);
3094  /* Local variables */
3095  static integer i__, k, l;
3096  static doublereal t;
3097  static integer w, z__, g01, x01, dg1, temp1, step1, dummy;
3098  // //extern /* Subroutine */ int dd7dog_(doublereal *, integer *, integer *,
3099  // doublereal *, doublereal *, doublereal *);
3100  // //extern logical stopx_(integer *);
3101  // //extern /* Subroutine */ int dl7upd_(doublereal *, doublereal *,
3102  // doublereal *, doublereal *, doublereal *, integer *, doublereal *,
3103  // doublereal *), dl7ivm_(integer *, doublereal *, doublereal *,
3104  // doublereal *), dw7zbf_(doublereal *, integer *, doublereal *,
3105  // doublereal *, doublereal *, doublereal *);
3106  // //extern doublereal dd7tpr_(integer *, doublereal *, doublereal *);
3107  // //extern /* Subroutine */ int da7sst_(integer *, integer *, integer *,
3108  // doublereal *), dl7vml_(integer *, doublereal *, doublereal *,
3109  // doublereal *), dv7scp_(integer *, doublereal *, doublereal *);
3110  // //extern doublereal dv2nrm_(integer *, doublereal *);
3111  // //extern /* Subroutine */ int dl7itv_(integer *, doublereal *, doublereal *,
3112  // doublereal *), dv7cpy_(integer *, doublereal *, doublereal *),
3113  // dl7tvm_(integer *, doublereal *, doublereal *, doublereal *),
3114  // dv2axy_(integer *, doublereal *, doublereal *, doublereal *,
3115  // doublereal *), dv7vmp_(integer *, doublereal *, doublereal *,
3116  // doublereal *, integer *);
3117  static integer nwtst1;
3118  // //extern /* Subroutine */ int dparck_(integer *, doublereal *, integer *,
3119  // integer *, integer *, integer *, doublereal *);
3120  // //extern doublereal drldst_(integer *, doublereal *, doublereal *,
3121  // doublereal *);
3122  // //extern /* Subroutine */ int divset_(integer *, integer *, integer *,
3123  // integer *, doublereal *), ditsum_(doublereal *, doublereal *,
3124  // integer *, integer *, integer *, integer *, doublereal *,
3125  // doublereal *);
3126  static integer lstgst, rstrst;
3127 
3128 
3129  /* *** CARRY OUT DMNG (UNCONSTRAINED MINIMIZATION) ITERATIONS, USING */
3130  /* *** DOUBLE-DOGLEG/BFGS STEPS. */
3131 
3132  /* *** PARAMETER DECLARATIONS *** */
3133 
3134 
3135  /* -------------------------- PARAMETER USAGE -------------------------- */
3136 
3137  /* D.... SCALE VECTOR. */
3138  /* FX... FUNCTION VALUE. */
3139  /* G.... GRADIENT VECTOR. */
3140  /* IV... INTEGER VALUE ARRAY. */
3141  /* LIV.. LENGTH OF IV (AT LEAST 60). */
3142  /* LV... LENGTH OF V (AT LEAST 71 + N*(N+13)/2). */
3143  /* N.... NUMBER OF VARIABLES (COMPONENTS IN X AND G). */
3144  /* V.... FLOATING-POINT VALUE ARRAY. */
3145  /* X.... VECTOR OF PARAMETERS TO BE OPTIMIZED. */
3146 
3147  /* *** DISCUSSION *** */
3148 
3149  /* PARAMETERS IV, N, V, AND X ARE THE SAME AS THE CORRESPONDING */
3150  /* ONES TO DMNG (WHICH SEE), EXCEPT THAT V CAN BE SHORTER (SINCE */
3151  /* THE PART OF V THAT DMNG USES FOR STORING G IS NOT NEEDED). */
3152  /* MOREOVER, COMPARED WITH DMNG, IV(1) MAY HAVE THE TWO ADDITIONAL */
3153  /* OUTPUT VALUES 1 AND 2, WHICH ARE EXPLAINED BELOW, AS IS THE USE */
3154  /* OF IV(TOOBIG) AND IV(NFGCAL). THE VALUE IV(G), WHICH IS AN */
3155  /* OUTPUT VALUE FROM DMNG (AND DMNF), IS NOT REFERENCED BY */
3156  /* DRMNG OR THE SUBROUTINES IT CALLS. */
3157  /* FX AND G NEED NOT HAVE BEEN INITIALIZED WHEN DRMNG IS CALLED */
3158  /* WITH IV(1) = 12, 13, OR 14. */
3159 
3160  /* IV(1) = 1 MEANS THE CALLER SHOULD SET FX TO F(X), THE FUNCTION VALUE */
3161  /* AT X, AND CALL DRMNG AGAIN, HAVING CHANGED NONE OF THE */
3162  /* OTHER PARAMETERS. AN EXCEPTION OCCURS IF F(X) CANNOT BE */
3163  /* (E.G. IF OVERFLOW WOULD OCCUR), WHICH MAY HAPPEN BECAUSE */
3164  /* OF AN OVERSIZED STEP. IN THIS CASE THE CALLER SHOULD SET */
3165  /* IV(TOOBIG) = IV(2) TO 1, WHICH WILL CAUSE DRMNG TO IG- */
3166  /* NORE FX AND TRY A SMALLER STEP. THE PARAMETER NF THAT */
3167  /* DMNG PASSES TO CALCF (FOR POSSIBLE USE BY CALCG) IS A */
3168  /* COPY OF IV(NFCALL) = IV(6). */
3169  /* IV(1) = 2 MEANS THE CALLER SHOULD SET G TO G(X), THE GRADIENT VECTOR */
3170  /* OF F AT X, AND CALL DRMNG AGAIN, HAVING CHANGED NONE OF */
3171  /* THE OTHER PARAMETERS EXCEPT POSSIBLY THE SCALE VECTOR D */
3172  /* WHEN IV(DTYPE) = 0. THE PARAMETER NF THAT DMNG PASSES */
3173  /* TO CALCG IS IV(NFGCAL) = IV(7). IF G(X) CANNOT BE */
3174  /* EVALUATED, THEN THE CALLER MAY SET IV(TOOBIG) TO 0, IN */
3175  /* WHICH CASE DRMNG WILL RETURN WITH IV(1) = 65. */
3176  /* . */
3177  /* *** GENERAL *** */
3178 
3179  /* CODED BY DAVID M. GAY (DECEMBER 1979). REVISED SEPT. 1982. */
3180  /* THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH SUPPORTED */
3181  /* IN PART BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS */
3182  /* MCS-7600324 AND MCS-7906671. */
3183 
3184  /* (SEE DMNG FOR REFERENCES.) */
3185 
3186  /* +++++++++++++++++++++++++++ DECLARATIONS ++++++++++++++++++++++++++++ */
3187 
3188  /* *** LOCAL VARIABLES *** */
3189 
3190 
3191  /* *** CONSTANTS *** */
3192 
3193 
3194  /* *** NO INTRINSIC FUNCTIONS *** */
3195 
3196  /* *** EXTERNAL FUNCTIONS AND SUBROUTINES *** */
3197 
3198 
3199  /* DA7SST.... ASSESSES CANDIDATE STEP. */
3200  /* DD7DOG.... COMPUTES DOUBLE-DOGLEG (CANDIDATE) STEP. */
3201  /* DIVSET.... SUPPLIES DEFAULT IV AND V INPUT COMPONENTS. */
3202  /* DD7TPR... RETURNS INNER PRODUCT OF TWO VECTORS. */
3203  /* DITSUM.... PRINTS ITERATION SUMMARY AND INFO ON INITIAL AND FINAL X. */
3204  /* DL7ITV... MULTIPLIES INVERSE TRANSPOSE OF LOWER TRIANGLE TIMES VECTOR. */
3205  /* DL7IVM... MULTIPLIES INVERSE OF LOWER TRIANGLE TIMES VECTOR. */
3206  /* DL7TVM... MULTIPLIES TRANSPOSE OF LOWER TRIANGLE TIMES VECTOR. */
3207  /* LUPDT.... UPDATES CHOLESKY FACTOR OF HESSIAN APPROXIMATION. */
3208  /* DL7VML.... MULTIPLIES LOWER TRIANGLE TIMES VECTOR. */
3209  /* DPARCK.... CHECKS VALIDITY OF INPUT IV AND V VALUES. */
3210  /* DRLDST... COMPUTES V(RELDX) = RELATIVE STEP SIZE. */
3211  /* STOPX.... RETURNS .TRUE. IF THE BREAK KEY HAS BEEN PRESSED. */
3212  /* DV2AXY.... COMPUTES SCALAR TIMES ONE VECTOR PLUS ANOTHER. */
3213  /* DV7CPY.... COPIES ONE VECTOR TO ANOTHER. */
3214  /* DV7SCP... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR. */
3215  /* DV7VMP... MULTIPLIES VECTOR BY VECTOR RAISED TO POWER (COMPONENTWISE). */
3216  /* DV2NRM... RETURNS THE 2-NORM OF A VECTOR. */
3217  /* DW7ZBF... COMPUTES W AND Z FOR DL7UPD CORRESPONDING TO BFGS UPDATE. */
3218 
3219  /* *** SUBSCRIPTS FOR IV AND V *** */
3220 
3221 
3222  /* *** IV SUBSCRIPT VALUES *** */
3223 
3224  /* /6 */
3225  /* DATA CNVCOD/55/, DG/37/, G0/48/, INITH/25/, IRC/29/, KAGQT/33/, */
3226  /* 1 MODE/35/, MODEL/5/, MXFCAL/17/, MXITER/18/, NFCALL/6/, */
3227  /* 2 NFGCAL/7/, NGCALL/30/, NITER/31/, NWTSTP/34/, RADINC/8/, */
3228  /* 3 RESTOR/9/, STEP/40/, STGLIM/11/, STLSTG/41/, TOOBIG/2/, */
3229  /* 4 VNEED/4/, XIRC/13/, X0/43/ */
3230  /* /7 */
3231  /* / */
3232 
3233  /* *** V SUBSCRIPT VALUES *** */
3234 
3235  /* /6 */
3236  /* DATA DGNORM/1/, DINIT/38/, DSTNRM/2/, DST0/3/, F/10/, F0/13/, */
3237  /* 1 FDIF/11/, GTHG/44/, GTSTEP/4/, INCFAC/23/, LMAT/42/, */
3238  /* 2 LMAX0/35/, LMAXS/36/, NEXTV/47/, NREDUC/6/, PREDUC/7/, */
3239  /* 3 RADFAC/16/, RADIUS/8/, RAD0/9/, RELDX/17/, TUNER4/29/, */
3240  /* 4 TUNER5/30/ */
3241  /* /7 */
3242  /* / */
3243 
3244  /* /6 */
3245  /* DATA HALF/0.5D+0/, NEGONE/-1.D+0/, ONE/1.D+0/, ONEP2/1.2D+0/, */
3246  /* 1 ZERO/0.D+0/ */
3247  /* /7 */
3248  /* / */
3249 
3250  /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */
3251 
3252  /* Parameter adjustments */
3253  --iv;
3254  --v;
3255  --x;
3256  --g;
3257  --d__;
3258  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3259  /* Function Body */
3260  i__ = iv[1];
3261  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3262  if (i__ == 1) {
3263  goto L50;
3264  }
3265  if (i__ == 2) {
3266  goto L60;
3267  }
3268 
3269  /* *** CHECK VALIDITY OF IV AND V INPUT VALUES *** */
3270 
3271  if (iv[1] == 0) {
3272  divset_(&c__2, &iv[1], liv, lv, &v[1]);
3273  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3274  }
3275  if (iv[1] == 12 || iv[1] == 13) {
3276  iv[4] += *n * (*n + 13) / 2;
3277  }
3278  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3279  dparck_(&c__2, &d__[1], &iv[1], liv, lv, n, &v[1]);
3280  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3281  i__ = iv[1] - 2;
3282  if (i__ > 12) {
3283  goto L999;
3284  }
3285  switch (i__) {
3286  case 1: goto L190;
3287  case 2: goto L190;
3288  case 3: goto L190;
3289  case 4: goto L190;
3290  case 5: goto L190;
3291  case 6: goto L190;
3292  case 7: goto L120;
3293  case 8: goto L90;
3294  case 9: goto L120;
3295  case 10: goto L10;
3296  case 11: goto L10;
3297  case 12: goto L20;
3298  }
3299 
3300  /* *** STORAGE ALLOCATION *** */
3301 
3302 L10:
3303  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3304  l = iv[42];
3305  iv[43] = l + *n * (*n + 1) / 2;
3306  iv[40] = iv[43] + *n;
3307  iv[41] = iv[40] + *n;
3308  iv[48] = iv[41] + *n;
3309  iv[34] = iv[48] + *n;
3310  iv[37] = iv[34] + *n;
3311  iv[47] = iv[37] + *n;
3312  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3313  if (iv[1] != 13) {
3314  goto L20;
3315  }
3316  iv[1] = 14;
3317  goto L999;
3318 
3319  /* *** INITIALIZATION *** */
3320 
3321 L20:
3322  iv[31] = 0;
3323  iv[6] = 1;
3324  iv[30] = 1;
3325  iv[7] = 1;
3326  iv[35] = -1;
3327  iv[5] = 1;
3328  iv[11] = 1;
3329  iv[2] = 0;
3330  iv[55] = 0;
3331  iv[8] = 0;
3332  v[9] = 0.;
3333  if (v[38] >= 0.) {
3334  dv7scp_(n, &d__[1], &v[38]);
3335  }
3336  if (iv[25] != 1) {
3337  goto L40;
3338  }
3339 
3340  /* *** SET THE INITIAL HESSIAN APPROXIMATION TO DIAG(D)**-2 *** */
3341 
3342  l = iv[42];
3343  i__1 = *n * (*n + 1) / 2;
3344 
3345  dv7scp_<doublereal>(&i__1, &v[l], &c_b13_l);
3346  k = l - 1;
3347  i__1 = *n;
3348  for (i__ = 1; i__ <= i__1; ++i__) {
3349  k += i__;
3350  t = d__[i__];
3351  if (t <= 0.) {
3352  t = 1.;
3353  }
3354  v[k] = t;
3355  /* L30: */
3356  }
3357 
3358  /* *** COMPUTE INITIAL FUNCTION VALUE *** */
3359 
3360 L40:
3361  iv[1] = 1;
3362  goto L999;
3363 
3364 L50:
3365  v[10] = *fx;
3366  if (iv[35] >= 0) {
3367  goto L190;
3368  }
3369  v[13] = *fx;
3370  iv[1] = 2;
3371  if (iv[2] == 0) {
3372  goto L999;
3373  }
3374  iv[1] = 63;
3375  goto L350;
3376 
3377  /* *** MAKE SURE GRADIENT COULD BE COMPUTED *** */
3378 
3379 L60:
3380  if (iv[2] == 0) {
3381  goto L70;
3382  }
3383  iv[1] = 65;
3384  goto L350;
3385 
3386 L70:
3387  dg1 = iv[37];
3388  dv7vmp_(n, &v[dg1], &g[1], &d__[1], &c_n1);
3389  v[1] = dv2nrm_(n, &v[dg1]);
3390 
3391  if (iv[55] != 0) {
3392  goto L340;
3393  }
3394  if (iv[35] == 0) {
3395  goto L300;
3396  }
3397 
3398  /* *** ALLOW FIRST STEP TO HAVE SCALED 2-NORM AT MOST V(LMAX0) *** */
3399 
3400  v[8] = v[35];
3401 
3402  iv[35] = 0;
3403 
3404 
3405  /* ----------------------------- MAIN LOOP ----------------------------- */
3406 
3407 
3408  /* *** PRINT ITERATION SUMMARY, CHECK ITERATION LIMIT *** */
3409 
3410 L80:
3411  // ditsum_(&d__[1], &g[1], &iv[1], liv, lv, n, &v[1], &x[1]);
3412  L90 :
3413  k = iv[31];
3414  if (k < iv[18]) {
3415  goto L100;
3416  }
3417  iv[1] = 10;
3418  goto L350;
3419 
3420  /* *** UPDATE RADIUS *** */
3421 
3422 L100:
3423  iv[31] = k + 1;
3424  if (k > 0) {
3425  v[8] = v[16] * v[2];
3426  }
3427 
3428  /* *** INITIALIZE FOR START OF NEXT ITERATION *** */
3429 
3430  g01 = iv[48];
3431  x01 = iv[43];
3432  v[13] = v[10];
3433  iv[29] = 4;
3434  iv[33] = -1;
3435 
3436  /* *** COPY X TO X0, G TO G0 *** */
3437 
3438  dv7cpy_(n, &v[x01], &x[1]);
3439  dv7cpy_(n, &v[g01], &g[1]);
3440 
3441  /* *** CHECK STOPX AND FUNCTION EVALUATION LIMIT *** */
3442 
3443 L110:
3444  if (!stopx_(&dummy)) {
3445  goto L130;
3446  }
3447  iv[1] = 11;
3448  goto L140;
3449 
3450  /* *** COME HERE WHEN RESTARTING AFTER FUNC. EVAL. LIMIT OR STOPX. */
3451 
3452 L120:
3453  if (v[10] >= v[13]) {
3454  goto L130;
3455  }
3456  v[16] = 1.;
3457  k = iv[31];
3458  goto L100;
3459 
3460 L130:
3461  if (iv[6] < iv[17]) {
3462  goto L150;
3463  }
3464  iv[1] = 9;
3465 L140:
3466  if (v[10] >= v[13]) {
3467  goto L350;
3468  }
3469 
3470  /* *** IN CASE OF STOPX OR FUNCTION EVALUATION LIMIT WITH */
3471  /* *** IMPROVED V(F), EVALUATE THE GRADIENT AT X. */
3472 
3473  iv[55] = iv[1];
3474  goto L290;
3475 
3476  /* . . . . . . . . . . . . . COMPUTE CANDIDATE STEP . . . . . . . . . . */
3477 
3478 L150:
3479  step1 = iv[40];
3480  dg1 = iv[37];
3481  nwtst1 = iv[34];
3482  if (iv[33] >= 0) {
3483  goto L160;
3484  }
3485  l = iv[42];
3486  dl7ivm_(n, &v[nwtst1], &v[l], &g[1]);
3487  v[6] = dd7tpr_(n, &v[nwtst1], &v[nwtst1]) * .5;
3488  dl7itv_(n, &v[nwtst1], &v[l], &v[nwtst1]);
3489  dv7vmp_(n, &v[step1], &v[nwtst1], &d__[1], &c__1);
3490  v[3] = dv2nrm_(n, &v[step1]);
3491  dv7vmp_(n, &v[dg1], &v[dg1], &d__[1], &c_n1);
3492  dl7tvm_(n, &v[step1], &v[l], &v[dg1]);
3493  v[44] = dv2nrm_(n, &v[step1]);
3494  iv[33] = 0;
3495 L160:
3496  dd7dog_(&v[dg1], lv, n, &v[nwtst1], &v[step1], &v[1]);
3497  if (iv[29] != 6) {
3498  goto L170;
3499  }
3500  if (iv[9] != 2) {
3501  goto L190;
3502  }
3503  rstrst = 2;
3504  goto L200;
3505 
3506  /* *** CHECK WHETHER EVALUATING F(X0 + STEP) LOOKS WORTHWHILE *** */
3507 
3508 L170:
3509  iv[2] = 0;
3510  if (v[2] <= 0.) {
3511  goto L190;
3512  }
3513  if (iv[29] != 5) {
3514  goto L180;
3515  }
3516  if (v[16] <= 1.) {
3517  goto L180;
3518  }
3519  if (v[7] > v[11] * 1.2) {
3520  goto L180;
3521  }
3522  if (iv[9] != 2) {
3523  goto L190;
3524  }
3525  rstrst = 0;
3526  goto L200;
3527 
3528  /* *** COMPUTE F(X0 + STEP) *** */
3529 
3530 L180:
3531  x01 = iv[43];
3532  step1 = iv[40];
3533  dv2axy_(n, &x[1], &c_b33_l, &v[step1], &v[x01]);
3534  ++iv[6];
3535  iv[1] = 1;
3536  goto L999;
3537 
3538  /* . . . . . . . . . . . . . ASSESS CANDIDATE STEP . . . . . . . . . . . */
3539 
3540 L190:
3541  rstrst = 3;
3542 L200:
3543  x01 = iv[43];
3544  v[17] = drldst_(n, &d__[1], &x[1], &v[x01]);
3545  da7sst_(&iv[1], liv, lv, &v[1]);
3546  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3547  step1 = iv[40];
3548  lstgst = iv[41];
3549  i__ = iv[9] + 1;
3550  switch (i__) {
3551  case 1: goto L240;
3552  case 2: goto L210;
3553  case 3: goto L220;
3554  case 4: goto L230;
3555  }
3556 L210:
3557  dv7cpy_(n, &x[1], &v[x01]);
3558  goto L240;
3559 L220:
3560  dv7cpy_(n, &v[lstgst], &v[step1]);
3561  goto L240;
3562 L230:
3563  dv7cpy_(n, &v[step1], &v[lstgst]);
3564 
3565  dv2axy_(n, &x[1], &c_b33_l, &v[step1], &v[x01]);
3566  v[17] = drldst_(n, &d__[1], &x[1], &v[x01]);
3567  iv[9] = rstrst;
3568 
3569 L240:
3570  k = iv[29];
3571  switch (k) {
3572  case 1: goto L250;
3573  case 2: goto L280;
3574  case 3: goto L280;
3575  case 4: goto L280;
3576  case 5: goto L250;
3577  case 6: goto L260;
3578  case 7: goto L270;
3579  case 8: goto L270;
3580  case 9: goto L270;
3581  case 10: goto L270;
3582  case 11: goto L270;
3583  case 12: goto L270;
3584  case 13: goto L330;
3585  case 14: goto L300;
3586  }
3587 
3588  /* *** RECOMPUTE STEP WITH CHANGED RADIUS *** */
3589 
3590 L250:
3591  v[8] = v[16] * v[2];
3592  goto L110;
3593 
3594  /* *** COMPUTE STEP OF LENGTH V(LMAXS) FOR SINGULAR CONVERGENCE TEST. */
3595 
3596 L260:
3597  v[8] = v[36];
3598  goto L150;
3599 
3600  /* *** CONVERGENCE OR FALSE CONVERGENCE *** */
3601 
3602 L270:
3603  iv[55] = k - 4;
3604  //std::cout<<__LINE__<<"iv[55] = "<<iv[55]<<"\n";
3605  if (v[10] >= v[13]) {
3606  goto L340;
3607  }
3608  if (iv[13] == 14) {
3609  goto L340;
3610  }
3611  iv[13] = 14;
3612 
3613  /* . . . . . . . . . . . . PROCESS ACCEPTABLE STEP . . . . . . . . . . . */
3614 
3615 L280:
3616  if (iv[29] != 3) {
3617  goto L290;
3618  }
3619  step1 = iv[40];
3620  temp1 = iv[41];
3621 
3622  /* *** SET TEMP1 = HESSIAN * STEP FOR USE IN GRADIENT TESTS *** */
3623 
3624  l = iv[42];
3625  dl7tvm_(n, &v[temp1], &v[l], &v[step1]);
3626  dl7vml_(n, &v[temp1], &v[l], &v[temp1]);
3627 
3628  /* *** COMPUTE GRADIENT *** */
3629 
3630 L290:
3631  ++iv[30];
3632  iv[1] = 2;
3633  goto L999;
3634 
3635  /* *** INITIALIZATIONS -- G0 = G - G0, ETC. *** */
3636 
3637 L300:
3638  g01 = iv[48];
3639 
3640  dv2axy_(n, &v[g01], &c_b44_l, &v[g01], &g[1]);
3641  step1 = iv[40];
3642  temp1 = iv[41];
3643  if (iv[29] != 3) {
3644  goto L320;
3645  }
3646 
3647  /* *** SET V(RADFAC) BY GRADIENT TESTS *** */
3648 
3649  /* *** SET TEMP1 = DIAG(D)**-1 * (HESSIAN*STEP + (G(X0)-G(X))) *** */
3650 
3651  dv2axy_(n, &v[temp1], &c_b44_l, &v[g01], &v[temp1]);
3652  dv7vmp_(n, &v[temp1], &v[temp1], &d__[1], &c_n1);
3653 
3654  /* *** DO GRADIENT TESTS *** */
3655 
3656  if (dv2nrm_(n, &v[temp1]) <= v[1] * v[29]) {
3657  goto L310;
3658  }
3659  if (dd7tpr_(n, &g[1], &v[step1]) >= v[4] * v[30]) {
3660  goto L320;
3661  }
3662 L310:
3663  v[16] = v[23];
3664 
3665  /* *** UPDATE H, LOOP *** */
3666 
3667 L320:
3668  w = iv[34];
3669  z__ = iv[43];
3670  l = iv[42];
3671  dw7zbf_(&v[l], n, &v[step1], &v[w], &v[g01], &v[z__]);
3672 
3673  /* ** USE THE N-VECTORS STARTING AT V(STEP1) AND V(G01) FOR SCRATCH.. */
3674  dl7upd_(&v[temp1], &v[step1], &v[l], &v[g01], &v[l], n, &v[w], &v[z__]);
3675  iv[1] = 2;
3676  goto L80;
3677 
3678  /* . . . . . . . . . . . . . . MISC. DETAILS . . . . . . . . . . . . . . */
3679 
3680  /* *** BAD PARAMETERS TO ASSESS *** */
3681 
3682 L330:
3683  iv[1] = 64;
3684  goto L350;
3685 
3686  /* *** PRINT SUMMARY OF FINAL ITERATION AND OTHER REQUESTED ITEMS *** */
3687 
3688 L340:
3689  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3690  iv[1] = iv[55];
3691  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3692  iv[55] = 0;
3693 L350:
3694  // ditsum_(&d__[1], &g[1], &iv[1], liv, lv, n, &v[1], &x[1]);
3695 
3696  L999 :
3697  //std::cout<<__LINE__<<" "<<iv[1]<<"\n";
3698  return 0;
3699 
3700  /* *** LAST LINE OF DRMNG FOLLOWS *** */
3701  } /* drmng_ */
3702 
3703  int i7shft_(integer *n, integer *k, integer *x) {
3704  /* System generated locals */
3705  integer i__1;
3706 
3707  /* Local variables */
3708  static integer i__, t, k1, ii, nm1;
3709 
3710 
3711  /* *** SHIFT X(K),...,X(N) LEFT CIRCULARLY ONE POSITION IF K .GT. 0. */
3712  /* *** SHIFT X(-K),...,X(N) RIGHT CIRCULARLY ONE POSITION IF K .LT. 0. */
3713 
3714 
3715 
3716  /* Parameter adjustments */
3717  --x;
3718 
3719  /* Function Body */
3720  if (*k < 0) {
3721  goto L20;
3722  }
3723  if (*k >= *n) {
3724  goto L999;
3725  }
3726  nm1 = *n - 1;
3727  t = x[*k];
3728  i__1 = nm1;
3729  for (i__ = *k; i__ <= i__1; ++i__) {
3730  /* L10: */
3731  x[i__] = x[i__ + 1];
3732  }
3733  x[*n] = t;
3734  goto L999;
3735 
3736 L20:
3737  k1 = -(*k);
3738  if (k1 >= *n) {
3739  goto L999;
3740  }
3741  t = x[*n];
3742  nm1 = *n - k1;
3743  i__1 = nm1;
3744  for (ii = 1; ii <= i__1; ++ii) {
3745  i__ = *n - ii;
3746  x[i__ + 1] = x[i__];
3747  /* L30: */
3748  }
3749  x[k1] = t;
3750 L999:
3751  return 0;
3752  /* *** LAST LINE OF I7SHFT FOLLOWS *** */
3753  } /* i7shft_ */
3754 
3755 
3756 // template<typename doublereal>
3757 // int drmnh_(doublereal *d__, doublereal *fx, doublereal *g,
3758 // doublereal *h__, integer *iv, integer *lh, integer *liv, integer *lv,
3759 // integer *n, doublereal *v, doublereal *x)
3760 // {
3761 // /* System generated locals */
3762 // integer i__1, i__2;
3763 //
3764 // /* Local variables */
3765 // static integer i__, j, k, l;
3766 // static doublereal t;
3767 // static integer w1, x01, dg1, nn1o2, temp1, step1, dummy;
3768 // extern logical stopx_(integer *);
3769 // extern /* Subroutine */ int dd7dup_(doublereal *, doublereal *, integer *,
3770 // integer *, integer *, integer *, doublereal *);
3771 // extern doublereal dd7tpr_(integer *, doublereal *, doublereal *);
3772 // extern /* Subroutine */ int da7sst_(integer *, integer *, integer *,
3773 // doublereal *), dv7scp_(integer *, doublereal *, doublereal *);
3774 // extern doublereal dv2nrm_(integer *, doublereal *);
3775 // extern /* Subroutine */ int dg7qts_(doublereal *, doublereal *,
3776 // doublereal *, integer *, doublereal *, integer *, doublereal *,
3777 // doublereal *, doublereal *), ds7lvm_(integer *, doublereal *,
3778 // doublereal *, doublereal *), dv2axy_(integer *, doublereal *,
3779 // doublereal *, doublereal *, doublereal *), dv7cpy_(integer *,
3780 // doublereal *, doublereal *), dparck_(integer *, doublereal *,
3781 // integer *, integer *, integer *, integer *, doublereal *);
3782 // extern doublereal drldst_(integer *, doublereal *, doublereal *,
3783 // doublereal *);
3784 // extern /* Subroutine */ int divset_(integer *, integer *, integer *,
3785 // integer *, doublereal *), ditsum_(doublereal *, doublereal *,
3786 // integer *, integer *, integer *, integer *, doublereal *,
3787 // doublereal *);
3788 // static integer lstgst, rstrst;
3789 //
3790 //
3791 // /* *** CARRY OUT DMNH (UNCONSTRAINED MINIMIZATION) ITERATIONS, USING */
3792 // /* *** HESSIAN MATRIX PROVIDED BY THE CALLER. */
3793 //
3794 // /* *** PARAMETER DECLARATIONS *** */
3795 //
3796 //
3797 // /* -------------------------- PARAMETER USAGE -------------------------- */
3798 //
3799 // /* D.... SCALE VECTOR. */
3800 // /* FX... FUNCTION VALUE. */
3801 // /* G.... GRADIENT VECTOR. */
3802 // /* H.... LOWER TRIANGLE OF THE HESSIAN, STORED ROWWISE. */
3803 // /* IV... INTEGER VALUE ARRAY. */
3804 // /* LH... LENGTH OF H = P*(P+1)/2. */
3805 // /* LIV.. LENGTH OF IV (AT LEAST 60). */
3806 // /* LV... LENGTH OF V (AT LEAST 78 + N*(N+21)/2). */
3807 // /* N.... NUMBER OF VARIABLES (COMPONENTS IN X AND G). */
3808 // /* V.... FLOATING-POINT VALUE ARRAY. */
3809 // /* X.... PARAMETER VECTOR. */
3810 //
3811 // /* *** DISCUSSION *** */
3812 //
3813 // /* PARAMETERS IV, N, V, AND X ARE THE SAME AS THE CORRESPONDING */
3814 // /* ONES TO DMNH (WHICH SEE), EXCEPT THAT V CAN BE SHORTER (SINCE */
3815 // /* THE PART OF V THAT DMNH USES FOR STORING G AND H IS NOT NEEDED). */
3816 // /* MOREOVER, COMPARED WITH DMNH, IV(1) MAY HAVE THE TWO ADDITIONAL */
3817 // /* OUTPUT VALUES 1 AND 2, WHICH ARE EXPLAINED BELOW, AS IS THE USE */
3818 // /* OF IV(TOOBIG) AND IV(NFGCAL). THE VALUE IV(G), WHICH IS AN */
3819 // /* OUTPUT VALUE FROM DMNH, IS NOT REFERENCED BY DRMNH OR THE */
3820 // /* SUBROUTINES IT CALLS. */
3821 //
3822 // /* IV(1) = 1 MEANS THE CALLER SHOULD SET FX TO F(X), THE FUNCTION VALUE */
3823 // /* AT X, AND CALL DRMNH AGAIN, HAVING CHANGED NONE OF THE */
3824 // /* OTHER PARAMETERS. AN EXCEPTION OCCURS IF F(X) CANNOT BE */
3825 // /* COMPUTED (E.G. IF OVERFLOW WOULD OCCUR), WHICH MAY HAPPEN */
3826 // /* BECAUSE OF AN OVERSIZED STEP. IN THIS CASE THE CALLER */
3827 // /* SHOULD SET IV(TOOBIG) = IV(2) TO 1, WHICH WILL CAUSE */
3828 // /* DRMNH TO IGNORE FX AND TRY A SMALLER STEP. THE PARA- */
3829 // /* METER NF THAT DMNH PASSES TO CALCF (FOR POSSIBLE USE BY */
3830 // /* CALCGH) IS A COPY OF IV(NFCALL) = IV(6). */
3831 // /* IV(1) = 2 MEANS THE CALLER SHOULD SET G TO G(X), THE GRADIENT OF F AT */
3832 // /* X, AND H TO THE LOWER TRIANGLE OF H(X), THE HESSIAN OF F */
3833 // /* AT X, AND CALL DRMNH AGAIN, HAVING CHANGED NONE OF THE */
3834 // /* OTHER PARAMETERS EXCEPT PERHAPS THE SCALE VECTOR D. */
3835 // /* THE PARAMETER NF THAT DMNH PASSES TO CALCG IS */
3836 // /* IV(NFGCAL) = IV(7). IF G(X) AND H(X) CANNOT BE EVALUATED, */
3837 // /* THEN THE CALLER MAY SET IV(TOOBIG) TO 0, IN WHICH CASE */
3838 // /* DRMNH WILL RETURN WITH IV(1) = 65. */
3839 // /* NOTE -- DRMNH OVERWRITES H WITH THE LOWER TRIANGLE */
3840 // /* OF DIAG(D)**-1 * H(X) * DIAG(D)**-1. */
3841 // /* . */
3842 // /* *** GENERAL *** */
3843 //
3844 // /* CODED BY DAVID M. GAY (WINTER 1980). REVISED SEPT. 1982. */
3845 // /* THIS SUBROUTINE WAS WRITTEN IN CONNECTION WITH RESEARCH SUPPORTED */
3846 // /* IN PART BY THE NATIONAL SCIENCE FOUNDATION UNDER GRANTS */
3847 // /* MCS-7600324 AND MCS-7906671. */
3848 //
3849 // /* (SEE DMNG AND DMNH FOR REFERENCES.) */
3850 //
3851 // /* +++++++++++++++++++++++++++ DECLARATIONS ++++++++++++++++++++++++++++ */
3852 //
3853 // /* *** LOCAL VARIABLES *** */
3854 //
3855 //
3856 // /* *** CONSTANTS *** */
3857 //
3858 //
3859 // /* *** NO INTRINSIC FUNCTIONS *** */
3860 //
3861 // /* *** EXTERNAL FUNCTIONS AND SUBROUTINES *** */
3862 //
3863 //
3864 // /* DA7SST.... ASSESSES CANDIDATE STEP. */
3865 // /* DIVSET.... PROVIDES DEFAULT IV AND V INPUT VALUES. */
3866 // /* DD7TPR... RETURNS INNER PRODUCT OF TWO VECTORS. */
3867 // /* DD7DUP.... UPDATES SCALE VECTOR D. */
3868 // /* DG7QTS.... COMPUTES OPTIMALLY LOCALLY CONSTRAINED STEP. */
3869 // /* DITSUM.... PRINTS ITERATION SUMMARY AND INFO ON INITIAL AND FINAL X. */
3870 // /* DPARCK.... CHECKS VALIDITY OF INPUT IV AND V VALUES. */
3871 // /* DRLDST... COMPUTES V(RELDX) = RELATIVE STEP SIZE. */
3872 // /* DS7LVM... MULTIPLIES SYMMETRIC MATRIX TIMES VECTOR, GIVEN THE LOWER */
3873 // /* TRIANGLE OF THE MATRIX. */
3874 // /* STOPX.... RETURNS .TRUE. IF THE BREAK KEY HAS BEEN PRESSED. */
3875 // /* DV2AXY.... COMPUTES SCALAR TIMES ONE VECTOR PLUS ANOTHER. */
3876 // /* DV7CPY.... COPIES ONE VECTOR TO ANOTHER. */
3877 // /* DV7SCP... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR. */
3878 // /* DV2NRM... RETURNS THE 2-NORM OF A VECTOR. */
3879 //
3880 // /* *** SUBSCRIPTS FOR IV AND V *** */
3881 //
3882 //
3883 // /* *** IV SUBSCRIPT VALUES *** */
3884 //
3885 // /* /6 */
3886 // /* DATA CNVCOD/55/, DG/37/, DTOL/59/, DTYPE/16/, IRC/29/, KAGQT/33/, */
3887 // /* 1 LMAT/42/, MODE/35/, MODEL/5/, MXFCAL/17/, MXITER/18/, */
3888 // /* 2 NEXTV/47/, NFCALL/6/, NFGCAL/7/, NGCALL/30/, NITER/31/, */
3889 // /* 3 RADINC/8/, RESTOR/9/, STEP/40/, STGLIM/11/, STLSTG/41/, */
3890 // /* 4 TOOBIG/2/, VNEED/4/, W/34/, XIRC/13/, X0/43/ */
3891 // /* /7 */
3892 // /* / */
3893 //
3894 // /* *** V SUBSCRIPT VALUES *** */
3895 //
3896 // /* /6 */
3897 // /* DATA DGNORM/1/, DINIT/38/, DSTNRM/2/, DTINIT/39/, D0INIT/40/, */
3898 // /* 1 F/10/, F0/13/, FDIF/11/, GTSTEP/4/, INCFAC/23/, LMAX0/35/, */
3899 // /* 2 LMAXS/36/, PHMXFC/21/, PREDUC/7/, RADFAC/16/, RADIUS/8/, */
3900 // /* 3 RAD0/9/, RELDX/17/, STPPAR/5/, TUNER4/29/, TUNER5/30/ */
3901 // /* /7 */
3902 // /* / */
3903 //
3904 // /* /6 */
3905 // /* DATA ONE/1.D+0/, ONEP2/1.2D+0/, ZERO/0.D+0/ */
3906 // /* /7 */
3907 // /* / */
3908 //
3909 // /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */
3910 //
3911 // /* Parameter adjustments */
3912 // --h__;
3913 // --iv;
3914 // --v;
3915 // --x;
3916 // --g;
3917 // --d__;
3918 //
3919 // /* Function Body */
3920 // i__ = iv[1];
3921 // if (i__ == 1) {
3922 // goto L30;
3923 // }
3924 // if (i__ == 2) {
3925 // goto L40;
3926 // }
3927 //
3928 // /* *** CHECK VALIDITY OF IV AND V INPUT VALUES *** */
3929 //
3930 // if (iv[1] == 0) {
3931 // divset_(&c__2, &iv[1], liv, lv, &v[1]);
3932 // }
3933 // if (iv[1] == 12 || iv[1] == 13) {
3934 // iv[4] = iv[4] + *n * (*n + 21) / 2 + 7;
3935 // }
3936 // dparck_(&c__2, &d__[1], &iv[1], liv, lv, n, &v[1]);
3937 // i__ = iv[1] - 2;
3938 // if (i__ > 12) {
3939 // goto L999;
3940 // }
3941 // nn1o2 = *n * (*n + 1) / 2;
3942 // if (*lh >= nn1o2) {
3943 // switch (i__) {
3944 // case 1: goto L220;
3945 // case 2: goto L220;
3946 // case 3: goto L220;
3947 // case 4: goto L220;
3948 // case 5: goto L220;
3949 // case 6: goto L220;
3950 // case 7: goto L160;
3951 // case 8: goto L120;
3952 // case 9: goto L160;
3953 // case 10: goto L10;
3954 // case 11: goto L10;
3955 // case 12: goto L20;
3956 // }
3957 // }
3958 // iv[1] = 66;
3959 // goto L400;
3960 //
3961 // /* *** STORAGE ALLOCATION *** */
3962 //
3963 // L10:
3964 // iv[59] = iv[42] + nn1o2;
3965 // iv[43] = iv[59] + (*n << 1);
3966 // iv[40] = iv[43] + *n;
3967 // iv[41] = iv[40] + *n;
3968 // iv[37] = iv[41] + *n;
3969 // iv[34] = iv[37] + *n;
3970 // iv[47] = iv[34] + (*n << 2) + 7;
3971 // if (iv[1] != 13) {
3972 // goto L20;
3973 // }
3974 // iv[1] = 14;
3975 // goto L999;
3976 //
3977 // /* *** INITIALIZATION *** */
3978 //
3979 // L20:
3980 // iv[31] = 0;
3981 // iv[6] = 1;
3982 // iv[30] = 1;
3983 // iv[7] = 1;
3984 // iv[35] = -1;
3985 // iv[5] = 1;
3986 // iv[11] = 1;
3987 // iv[2] = 0;
3988 // iv[55] = 0;
3989 // iv[8] = 0;
3990 // v[9] = 0.;
3991 // v[5] = 0.;
3992 // if (v[38] >= 0.) {
3993 // dv7scp_(n, &d__[1], &v[38]);
3994 // }
3995 // k = iv[59];
3996 // if (v[39] > 0.) {
3997 // dv7scp_(n, &v[k], &v[39]);
3998 // }
3999 // k += *n;
4000 // if (v[40] > 0.) {
4001 // dv7scp_(n, &v[k], &v[40]);
4002 // }
4003 // iv[1] = 1;
4004 // goto L999;
4005 //
4006 // L30:
4007 // v[10] = *fx;
4008 // if (iv[35] >= 0) {
4009 // goto L220;
4010 // }
4011 // v[13] = *fx;
4012 // iv[1] = 2;
4013 // if (iv[2] == 0) {
4014 // goto L999;
4015 // }
4016 // iv[1] = 63;
4017 // goto L400;
4018 //
4019 // /* *** MAKE SURE GRADIENT COULD BE COMPUTED *** */
4020 //
4021 // L40:
4022 // if (iv[2] == 0) {
4023 // goto L50;
4024 // }
4025 // iv[1] = 65;
4026 // goto L400;
4027 //
4028 // /* *** UPDATE THE SCALE VECTOR D *** */
4029 //
4030 // L50:
4031 // dg1 = iv[37];
4032 // if (iv[16] <= 0) {
4033 // goto L70;
4034 // }
4035 // k = dg1;
4036 // j = 0;
4037 // i__1 = *n;
4038 // for (i__ = 1; i__ <= i__1; ++i__) {
4039 // j += i__;
4040 // v[k] = h__[j];
4041 // ++k;
4042 // /* L60: */
4043 // }
4044 // dd7dup_(&d__[1], &v[dg1], &iv[1], liv, lv, n, &v[1]);
4045 //
4046 // /* *** COMPUTE SCALED GRADIENT AND ITS NORM *** */
4047 //
4048 // L70:
4049 // dg1 = iv[37];
4050 // k = dg1;
4051 // i__1 = *n;
4052 // for (i__ = 1; i__ <= i__1; ++i__) {
4053 // v[k] = g[i__] / d__[i__];
4054 // ++k;
4055 // /* L80: */
4056 // }
4057 // v[1] = dv2nrm_(n, &v[dg1]);
4058 //
4059 // /* *** COMPUTE SCALED HESSIAN *** */
4060 //
4061 // k = 1;
4062 // i__1 = *n;
4063 // for (i__ = 1; i__ <= i__1; ++i__) {
4064 // t = 1. / d__[i__];
4065 // i__2 = i__;
4066 // for (j = 1; j <= i__2; ++j) {
4067 // h__[k] = t * h__[k] / d__[j];
4068 // ++k;
4069 // /* L90: */
4070 // }
4071 // /* L100: */
4072 // }
4073 //
4074 // if (iv[55] != 0) {
4075 // goto L390;
4076 // }
4077 // if (iv[35] == 0) {
4078 // goto L350;
4079 // }
4080 //
4081 // /* *** ALLOW FIRST STEP TO HAVE SCALED 2-NORM AT MOST V(LMAX0) *** */
4082 //
4083 // v[8] = v[35] / (v[21] + 1.);
4084 //
4085 // iv[35] = 0;
4086 //
4087 //
4088 // /* ----------------------------- MAIN LOOP ----------------------------- */
4089 //
4090 //
4091 // /* *** PRINT ITERATION SUMMARY, CHECK ITERATION LIMIT *** */
4092 //
4093 // L110:
4094 // ditsum_(&d__[1], &g[1], &iv[1], liv, lv, n, &v[1], &x[1]);
4095 // L120:
4096 // k = iv[31];
4097 // if (k < iv[18]) {
4098 // goto L130;
4099 // }
4100 // iv[1] = 10;
4101 // goto L400;
4102 //
4103 // L130:
4104 // iv[31] = k + 1;
4105 //
4106 // /* *** INITIALIZE FOR START OF NEXT ITERATION *** */
4107 //
4108 // dg1 = iv[37];
4109 // x01 = iv[43];
4110 // v[13] = v[10];
4111 // iv[29] = 4;
4112 // iv[33] = -1;
4113 //
4114 // /* *** COPY X TO X0 *** */
4115 //
4116 // dv7cpy_(n, &v[x01], &x[1]);
4117 //
4118 // /* *** UPDATE RADIUS *** */
4119 //
4120 // if (k == 0) {
4121 // goto L150;
4122 // }
4123 // step1 = iv[40];
4124 // k = step1;
4125 // i__1 = *n;
4126 // for (i__ = 1; i__ <= i__1; ++i__) {
4127 // v[k] = d__[i__] * v[k];
4128 // ++k;
4129 // /* L140: */
4130 // }
4131 // v[8] = v[16] * dv2nrm_(n, &v[step1]);
4132 //
4133 // /* *** CHECK STOPX AND FUNCTION EVALUATION LIMIT *** */
4134 //
4135 // L150:
4136 // if (! stopx_(&dummy)) {
4137 // goto L170;
4138 // }
4139 // iv[1] = 11;
4140 // goto L180;
4141 //
4142 // /* *** COME HERE WHEN RESTARTING AFTER FUNC. EVAL. LIMIT OR STOPX. */
4143 //
4144 // L160:
4145 // if (v[10] >= v[13]) {
4146 // goto L170;
4147 // }
4148 // v[16] = 1.;
4149 // k = iv[31];
4150 // goto L130;
4151 //
4152 // L170:
4153 // if (iv[6] < iv[17]) {
4154 // goto L190;
4155 // }
4156 // iv[1] = 9;
4157 // L180:
4158 // if (v[10] >= v[13]) {
4159 // goto L400;
4160 // }
4161 //
4162 // /* *** IN CASE OF STOPX OR FUNCTION EVALUATION LIMIT WITH */
4163 // /* *** IMPROVED V(F), EVALUATE THE GRADIENT AT X. */
4164 //
4165 // iv[55] = iv[1];
4166 // goto L340;
4167 //
4168 // /* . . . . . . . . . . . . . COMPUTE CANDIDATE STEP . . . . . . . . . . */
4169 //
4170 // L190:
4171 // step1 = iv[40];
4172 // dg1 = iv[37];
4173 // l = iv[42];
4174 // w1 = iv[34];
4175 // dg7qts_(&d__[1], &v[dg1], &h__[1], &iv[33], &v[l], n, &v[step1], &v[1], &
4176 // v[w1]);
4177 // if (iv[29] != 6) {
4178 // goto L200;
4179 // }
4180 // if (iv[9] != 2) {
4181 // goto L220;
4182 // }
4183 // rstrst = 2;
4184 // goto L230;
4185 //
4186 // /* *** CHECK WHETHER EVALUATING F(X0 + STEP) LOOKS WORTHWHILE *** */
4187 //
4188 // L200:
4189 // iv[2] = 0;
4190 // if (v[2] <= 0.) {
4191 // goto L220;
4192 // }
4193 // if (iv[29] != 5) {
4194 // goto L210;
4195 // }
4196 // if (v[16] <= 1.) {
4197 // goto L210;
4198 // }
4199 // if (v[7] > v[11] * 1.2) {
4200 // goto L210;
4201 // }
4202 // if (iv[9] != 2) {
4203 // goto L220;
4204 // }
4205 // rstrst = 0;
4206 // goto L230;
4207 //
4208 // /* *** COMPUTE F(X0 + STEP) *** */
4209 //
4210 // L210:
4211 // x01 = iv[43];
4212 // step1 = iv[40];
4213 // dv2axy_(n, &x[1], &c_b32, &v[step1], &v[x01]);
4214 // ++iv[6];
4215 // iv[1] = 1;
4216 // goto L999;
4217 //
4218 // /* . . . . . . . . . . . . . ASSESS CANDIDATE STEP . . . . . . . . . . . */
4219 //
4220 // L220:
4221 // rstrst = 3;
4222 // L230:
4223 // x01 = iv[43];
4224 // v[17] = drldst_(n, &d__[1], &x[1], &v[x01]);
4225 // da7sst_(&iv[1], liv, lv, &v[1]);
4226 // step1 = iv[40];
4227 // lstgst = iv[41];
4228 // i__ = iv[9] + 1;
4229 // switch (i__) {
4230 // case 1: goto L270;
4231 // case 2: goto L240;
4232 // case 3: goto L250;
4233 // case 4: goto L260;
4234 // }
4235 // L240:
4236 // dv7cpy_(n, &x[1], &v[x01]);
4237 // goto L270;
4238 // L250:
4239 // dv7cpy_(n, &v[lstgst], &v[step1]);
4240 // goto L270;
4241 // L260:
4242 // dv7cpy_(n, &v[step1], &v[lstgst]);
4243 // dv2axy_(n, &x[1], &c_b32, &v[step1], &v[x01]);
4244 // v[17] = drldst_(n, &d__[1], &x[1], &v[x01]);
4245 // iv[9] = rstrst;
4246 //
4247 // L270:
4248 // k = iv[29];
4249 // switch (k) {
4250 // case 1: goto L280;
4251 // case 2: goto L310;
4252 // case 3: goto L310;
4253 // case 4: goto L310;
4254 // case 5: goto L280;
4255 // case 6: goto L290;
4256 // case 7: goto L300;
4257 // case 8: goto L300;
4258 // case 9: goto L300;
4259 // case 10: goto L300;
4260 // case 11: goto L300;
4261 // case 12: goto L300;
4262 // case 13: goto L380;
4263 // case 14: goto L350;
4264 // }
4265 //
4266 // /* *** RECOMPUTE STEP WITH NEW RADIUS *** */
4267 //
4268 // L280:
4269 // v[8] = v[16] * v[2];
4270 // goto L150;
4271 //
4272 // /* *** COMPUTE STEP OF LENGTH V(LMAXS) FOR SINGULAR CONVERGENCE TEST. */
4273 //
4274 // L290:
4275 // v[8] = v[36];
4276 // goto L190;
4277 //
4278 // /* *** CONVERGENCE OR FALSE CONVERGENCE *** */
4279 //
4280 // L300:
4281 // iv[55] = k - 4;
4282 // if (v[10] >= v[13]) {
4283 // goto L390;
4284 // }
4285 // if (iv[13] == 14) {
4286 // goto L390;
4287 // }
4288 // iv[13] = 14;
4289 //
4290 // /* . . . . . . . . . . . . PROCESS ACCEPTABLE STEP . . . . . . . . . . . */
4291 //
4292 // L310:
4293 // if (iv[29] != 3) {
4294 // goto L340;
4295 // }
4296 // temp1 = lstgst;
4297 //
4298 // /* *** PREPARE FOR GRADIENT TESTS *** */
4299 // /* *** SET TEMP1 = HESSIAN * STEP + G(X0) */
4300 // /* *** = DIAG(D) * (H * STEP + G(X0)) */
4301 //
4302 // /* USE X0 VECTOR AS TEMPORARY. */
4303 // k = x01;
4304 // i__1 = *n;
4305 // for (i__ = 1; i__ <= i__1; ++i__) {
4306 // v[k] = d__[i__] * v[step1];
4307 // ++k;
4308 // ++step1;
4309 // /* L320: */
4310 // }
4311 // ds7lvm_(n, &v[temp1], &h__[1], &v[x01]);
4312 // i__1 = *n;
4313 // for (i__ = 1; i__ <= i__1; ++i__) {
4314 // v[temp1] = d__[i__] * v[temp1] + g[i__];
4315 // ++temp1;
4316 // /* L330: */
4317 // }
4318 //
4319 // /* *** COMPUTE GRADIENT AND HESSIAN *** */
4320 //
4321 // L340:
4322 // ++iv[30];
4323 // iv[2] = 0;
4324 // iv[1] = 2;
4325 // goto L999;
4326 //
4327 // L350:
4328 // iv[1] = 2;
4329 // if (iv[29] != 3) {
4330 // goto L110;
4331 // }
4332 //
4333 // /* *** SET V(RADFAC) BY GRADIENT TESTS *** */
4334 //
4335 // temp1 = iv[41];
4336 // step1 = iv[40];
4337 //
4338 // /* *** SET TEMP1 = DIAG(D)**-1 * (HESSIAN*STEP + (G(X0)-G(X))) *** */
4339 //
4340 // k = temp1;
4341 // i__1 = *n;
4342 // for (i__ = 1; i__ <= i__1; ++i__) {
4343 // v[k] = (v[k] - g[i__]) / d__[i__];
4344 // ++k;
4345 // /* L360: */
4346 // }
4347 //
4348 // /* *** DO GRADIENT TESTS *** */
4349 //
4350 // if (dv2nrm_(n, &v[temp1]) <= v[1] * v[29]) {
4351 // goto L370;
4352 // }
4353 // if (dd7tpr_(n, &g[1], &v[step1]) >= v[4] * v[30]) {
4354 // goto L110;
4355 // }
4356 // L370:
4357 // v[16] = v[23];
4358 // goto L110;
4359 //
4360 // /* . . . . . . . . . . . . . . MISC. DETAILS . . . . . . . . . . . . . . */
4361 //
4362 // /* *** BAD PARAMETERS TO ASSESS *** */
4363 //
4364 // L380:
4365 // iv[1] = 64;
4366 // goto L400;
4367 //
4368 // /* *** PRINT SUMMARY OF FINAL ITERATION AND OTHER REQUESTED ITEMS *** */
4369 //
4370 // L390:
4371 // iv[1] = iv[55];
4372 // iv[55] = 0;
4373 // L400:
4374 // ditsum_(&d__[1], &g[1], &iv[1], liv, lv, n, &v[1], &x[1]);
4375 //
4376 // L999:
4377 // return 0;
4378 //
4379 // /* *** LAST CARD OF DRMNH FOLLOWS *** */
4380 // }
4381 
4382 
4383 
4384 }//end namespace port
4385 #endif
THE BASE THE NUMBER OF BASE A DIGITS THE LARGEST MAGNITUDE ***FLOATS HAVE FORM THE BASE ***SINGLE PRECISION THE NUMBER OF BASE B DIGITS THE SMALLEST EXPONENT E THE LARGEST EXPONENT E ***DOUBLE PRECISION THE NUMBER OF BASE B DIGITS THE SMALLEST EXPONENT E THE LARGEST EXPONENT E ****INCLUDING AUTO DOUBLE COMPILERS ***TO COMPILE ON OLDER ADD A C IN COLUMN ***ON THE NEXT LINE ***AND REMOVE THE C FROM COLUMN IN ONE OF THE SECTIONS BELOW ***CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY ***mail netlib research bell labs com ***send old1mach from blas ***PLEASE SEND CORRECTIONS TO dmg OR ehg bell labs com ****DATA SC ****BIT INTEGER ARITHMETIC ****DATA SC ****WHICH IS APPROPRIATE FOR THE UNIVAC FOR SYSTEM ***IF YOU HAVE THE UNIVAC FTN SET IT TO ****DATA SC ****Note that some values may need changing *********long i1mach_(long *i)
Definition: port.hpp:369
Definition: port.hpp:18
const Sqrt< REAL_T, EXPR > sqrt(const ExpressionBase< REAL_T, EXPR > &exp)
Definition: Sqrt.hpp:123