void MAIN__(VOID) { fint N, liv, lv; fint *iv; real *D, *v; int i; char **av = xargv; static fint L2 = 2; ASL_alloc(ASL_read_f); progname = *av++; if (*av && !strcmp(*av,"-AMPL")) { amplflag = 1; av++; } if (n_con) { fprintf(Stderr, "Ignoring %d constraints.\n", n_con); fflush(Stderr); } N = n_var; liv = 59 + N; lv = 71 + N*(N + 21)/2; v = (real *)Malloc((N + lv)*sizeof(real) + liv*sizeof(fint)); D = v + lv; iv = (fint *)(D + N); for(i = 0; i < N; i++) D[i] = 1.; divset_(&L2, iv, &liv, &lv, v); /* set default iv and v values */ iv[mxfcal] = iv[mxiter] = 1200; /* increase defaults */ if (amplflag) { /* Turn off printing (unless requested in $mng_options). */ iv[outlev] = 0; /* iv[solprt] = 0; */ iv[statpr] = 0; iv[x0prt] = 0; } /* call vivvals to process command-line arguments */ vivvals("mngnlc", "mng_options", av, iv, v); Nprob = nprob; if (nprob >= 0 && nprob < n_obj && objtype[nprob]) { maximize = 1; objsign = -1.; } dmngb_(&N, D, X0, LUv, (U_fp)calcf, (U_fp)calcg, iv, &liv, &lv, v, iv, v, (U_fp)calcf); }
void MAIN__(void) { FILE *nl; fint *iv, liv, lv; fint N, NZ, P; real *rhsLU, *v; int i, j; extern int xargc; extern char **xargv; char *stub; static fint L1 = 1; static char *rvmsg[9] = { "X-Convergence", /* 3 */ "Relative Function Convergence", "X- and Relative Function Convergence", "Absolute Function Convergence", "Singular Convergence", "False Convergence", "Function Evaluation Limit", "Iteration Limit", "Unexpected return code" }; char buf[256]; if (xargc < 2) { fprintf(Stderr, "usage: %s stub\n", xargv[0]); exit(1); } stub = xargv[1]; ASL_alloc(ASL_read_fg); amplflag = xargc >= 3 && !strncmp(xargv[2], "-AMPL", 5); nl = jac0dim(stub, (fint)strlen(stub)); if (n_obj) { fprintf(Stderr, "Ignoring %d objectives.\n", n_obj); fflush(Stderr); } N = n_con; P = n_var; NZ = nzc; liv = 82 + 4*P; lv = 105 + P*(N + 2*P + 21) + 2*N; v = (real *)Malloc((lv + P)*sizeof(real) + liv*sizeof(fint)); X0 = v + lv; iv = (fint *)(X0 + P); fg_read(nl,0); /* Check for valid problem: all equality constraints. */ for(i = j = 0, rhsLU = LUrhs; i++ < N; rhsLU += 2) if (rhsLU[0] != rhsLU[1]) { if (j++ > 4) { /* Stop chattering if > 4 errors. */ fprintf(Stderr, "...\n"); exit(2); } fprintf(Stderr, "Lrhs(%d) = %g < Urhs(%d) = %g\n", i, rhsLU[0], i, rhsLU[1]); } if (j) exit(2); dense_j(); /* Tell jacval_ we want a dense Jacobian. */ divset_(&L1, iv, &liv, &lv, v); /* set default iv and v values */ if (amplflag) iv[prunit] = 0; /* Turn off printing . */ dn2gb_(&N, &P, X0, LUv, (U_fp)calcr, (U_fp)calcj, iv, &liv, &lv, v, &NZ, LUrhs, (U_fp)calcr); j = iv[0] >= 3 && iv[0] <= 10 ? (int)iv[0] - 3 : 8; i = Sprintf(buf, "nl21: %s", rvmsg[j]); if (j == 8) i += Sprintf(buf+i, " %ld", iv[0]); i += Sprintf(buf+i, "\n%ld function, %ld gradient evaluations", iv[nfcall], iv[ngcall]); i += Sprintf(buf+i, "\nFinal sum of squares = "); g_fmtop(buf+i, 2*v[f]); write_sol(buf, X0, 0, 0); }
void Fitter::performNl2sol(int nbit) { enum {vF0 = 12}; //the value of f(xinit) for final output double fxinit = 0; int nbParams = fitParameterList.size(); int nbResids = argumentsList.size(); // RN2GB: "LIV...... LENGTH OF IV... LIV MUST BE AT LEAST 4*P + 82" int liv = 4 * nbParams + 82; // RN2GB: "LV....... LENGTH OF V... LV MUST BE AT LEAST 105 + P*(N + 2*P + 17) + 2*N" int lv = 105 + nbParams * (nbResids + 2 * nbParams + 17) + 2 * nbResids; std::unique_ptr<double[]> x_ptr(new double[nbParams]); std::unique_ptr<double[]> xb_ptr(new double[2 * nbParams]); std::unique_ptr<int[]> iv_ptr(new int[liv]); std::unique_ptr<double[]> v_ptr(new double[lv]); //initialize nl2sol parameters for (size_t i = 0; i < fitParameterList.size(); ++i) { x_ptr[i] = fitParameterList[i].value; xb_ptr[2 * i] = fitParameterList[i].lbvalue; xb_ptr[2 * i + 1] = fitParameterList[i].ubvalue; } //initialize default values for iv and v optimization settings int kind = 1; iv_ptr[0] = 0; divset_(&kind, iv_ptr.get(), &liv, &lv, v_ptr.get()); //turn of output iv_ptr[20] = 0; //max iterations allowed iv_ptr[17] = 0; //try to execute optimization algorithm dn2fb_(&nbResids, &nbParams, x_ptr.get(), xb_ptr.get(), n2fbNormFunc, iv_ptr.get(), &liv, &lv, v_ptr.get(), reinterpret_cast<int *>(this), NULL, NULL); //storage size for iv_ptr or v_ptr was too small if((iv_ptr[0] == 15) || (iv_ptr[0] == 16)) { //reallocate iv_ptr and v_ptr liv = iv_ptr[43]; lv = iv_ptr[44]; iv_ptr.reset(new int[liv]); v_ptr.reset(new double[lv]); //reset defaults divset_(&kind, iv_ptr.get(), &liv, &lv, v_ptr.get()); //turn of output iv_ptr[20] = 0; //max iterations allowed iv_ptr[17] = 0; //execute optimization algorithm once to get f(xinit) dn2fb_(&nbResids, &nbParams, x_ptr.get(), xb_ptr.get(), n2fbNormFunc, iv_ptr.get(), &liv, &lv, v_ptr.get(), reinterpret_cast<int *>(this), NULL, NULL); //v(vF0 = 12) is the function value of f (x) at the start of the last iteration fxinit = v_ptr[vF0]; //max iterations allowed iv_ptr[17] = nbit; //execute optimization algorithm nbit-1 times to optimize dn2fb_(&nbResids, &nbParams, x_ptr.get(), xb_ptr.get(), n2fbNormFunc, iv_ptr.get(), &liv, &lv, v_ptr.get(), reinterpret_cast<int *>(this), NULL, NULL); } resetFParameters(x_ptr.get()); //reset v(vF0) to fxinit v_ptr[vF0] = fxinit; printNl2solInfo(iv_ptr.get(), v_ptr.get()); }
int marquardt(int npoints, /* Nbr of data points */ double *y, /* npoints values of dependent var */ int nparams, /* Nbr of parameters */ double *params, /* IN/OUT nparams parameter values */ int nvars, /* Number of independent variables */ double *x, /* npoints*nvars values of indep var */ void function(), void jacobian(), double *resid, /* OUT: RMS residual of result */ double *covar) /* OUT: C11, C21, C22, C31, C32, C33, C41, ... */ { int i; int j; int k; int one = 1; static int ilen; static int flen; static int firsttime = TRUE; static int *iwork; static double *fwork; static double *usr_doubles; static int ntimes = 0; gbl_function = function; gbl_jacobian = jacobian; if (firsttime){ firsttime = FALSE; /* Allocate working buffers */ ilen = 82 * nparams; flen = 105 + nparams * (npoints + 2 * nparams + 17) + 2 * npoints; iwork = (int *)getmem(ilen * sizeof(int)); fwork = (double *)getmem(flen * sizeof(double)); usr_doubles = (double *)getmem((1 + nvars) * npoints * sizeof(double)); /* Init independent variable array */ for (i=0; i<npoints; i++){ usr_doubles[i] = x[i]; } } /* Set operating modes (needs to be done every time!) */ divset_(&one, iwork, &ilen, &flen, fwork);/* Get default parameters */ iwork[21-1] = 0; /* Turn off all printing */ iwork[18-1] = 30; /* Max iterations allowed */ fwork[32-1] = 1.0e-8; /* Relative convergence tolerance */ fwork[33-1] = 1.0e-8; /* X-convergence tolerance */ if (covar){ /* Note: Covariance calc increases time by about 50% */ iwork[57-1] = 1; /* Calc covariance; no regression diags */ }else{ iwork[57-1] = 0; /* Do not calculate covariance, etc. */ } /* Initialize dependent variable array */ for (i=0; i<npoints; i++){ usr_doubles[npoints + i] = y[i]; } if (jacobian){ //ib_errmsg("MATH: fit.c: calling nd2g_"); // double: params(4), fwork(9), usr_doubles(11) dn2g_(&npoints, &nparams, params, n2g_resid_func, n2g_deriv_func, iwork, &ilen, &flen, fwork, NULL, usr_doubles, NULL); }else{ //ib_errmsg("MATH: fit.c: calling n2f_"); dn2f_(&npoints, &nparams, params, n2g_resid_func, iwork, &ilen, &flen, fwork, NULL, usr_doubles, NULL); } if (resid){ /* RMS residual of final fit */ *resid = sqrt(fwork[10-1] * 2 / npoints); } if (covar){ /* fwork stores lower triangle of covariance array in order: * C11, C21, C22, C31, C32, C33, C41, ... */ k = iwork[26-1]; /* Location of covariances in fwork array */ if (k>0){ k--; for (i=0; i < (nparams * (nparams+1)) / 2; i++){ covar[i] = fwork[k++]; } }else{ /* Covariance not available */ for (i=0; i < (nparams * (nparams+1)) / 2; i++){ covar[i] = 0; } } } if (iwork[1-1] >= 3 && iwork[1-1] <= 6){ return 1; }else{ /* Error return--do not report specific error number */ return 0; } }
/* Subroutine */ int drn2g_(doublereal *d__, doublereal *dr, integer *iv, integer *liv, integer *lv, integer *n, integer *nd, integer *n1, integer *n2, integer *p, doublereal *r__, doublereal *rd, doublereal * v, doublereal *x) { /* System generated locals */ integer dr_dim1, dr_offset, i__1; doublereal d__1; /* Local variables */ static integer i__, k, l; static doublereal t; static integer g1, y1, gi, lh, nn, yi, iv1, qtr1, rmat1, jtol1; extern /* Subroutine */ int dq7rad_(integer *, integer *, integer *, doublereal *, logical *, doublereal *, doublereal *, doublereal *) , dn2lrd_(doublereal *, integer *, doublereal *, integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *), dc7vfn_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *, doublereal *), dd7upd_(doublereal *, doublereal *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, doublereal *), dq7apl_(integer *, integer *, integer *, doublereal *, doublereal *, integer *), dg7lit_(doublereal *, doublereal *, integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *), dn2cvp_(integer *, integer *, integer *, integer *, doublereal *); extern doublereal dd7tpr_(integer *, doublereal *, doublereal *); extern /* Subroutine */ int dl7vml_(integer *, doublereal *, doublereal *, doublereal *), dv7scp_(integer *, doublereal *, doublereal *); extern doublereal dv2nrm_(integer *, doublereal *); extern /* Subroutine */ int dv7cpy_(integer *, doublereal *, doublereal *) ; static integer ivmode; extern /* Subroutine */ int divset_(integer *, integer *, integer *, integer *, doublereal *), ditsum_(doublereal *, doublereal *, integer *, integer *, integer *, integer *, doublereal *, doublereal *); /* *** REVISED ITERATION DRIVER FOR NL2SOL (VERSION 2.3) *** */ /* -------------------------- PARAMETER USAGE -------------------------- */ /* D........ SCALE VECTOR. */ /* DR....... DERIVATIVES OF R AT X. */ /* IV....... INTEGER VALUES ARRAY. */ /* LIV...... LENGTH OF IV... LIV MUST BE AT LEAST P + 82. */ /* LV....... LENGTH OF V... LV MUST BE AT LEAST 105 + P*(2*P+16). */ /* N........ TOTAL NUMBER OF RESIDUALS. */ /* ND....... MAX. NO. OF RESIDUALS PASSED ON ONE CALL. */ /* N1....... LOWEST ROW INDEX FOR RESIDUALS SUPPLIED THIS TIME. */ /* N2....... HIGHEST ROW INDEX FOR RESIDUALS SUPPLIED THIS TIME. */ /* P........ NUMBER OF PARAMETERS (COMPONENTS OF X) BEING ESTIMATED. */ /* R........ RESIDUALS. */ /* RD....... RD(I) = SQRT(G(I)**T * H(I)**-1 * G(I)) ON OUTPUT WHEN */ /* IV(RDREQ) IS NONZERO. DRN2G SETS IV(REGD) = 1 IF RD */ /* IS SUCCESSFULLY COMPUTED, TO 0 IF NO ATTEMPT WAS MADE */ /* TO COMPUTE IT, AND TO -1 IF H (THE FINITE-DIFFERENCE HESSIAN) */ /* WAS INDEFINITE. IF ND .GE. N, THEN RD IS ALSO USED AS */ /* TEMPORARY STORAGE. */ /* V........ FLOATING-POINT VALUES ARRAY. */ /* X........ PARAMETER VECTOR BEING ESTIMATED (INPUT = INITIAL GUESS, */ /* OUTPUT = BEST VALUE FOUND). */ /* *** DISCUSSION *** */ /* NOTE... NL2SOL AND NL2ITR (MENTIONED BELOW) ARE DESCRIBED IN */ /* ACM TRANS. MATH. SOFTWARE, VOL. 7, PP. 369-383 (AN ADAPTIVE */ /* NONLINEAR LEAST-SQUARES ALGORITHM, BY J.E. DENNIS, D.M. GAY, */ /* AND R.E. WELSCH). */ /* THIS ROUTINE CARRIES OUT ITERATIONS FOR SOLVING NONLINEAR */ /* LEAST SQUARES PROBLEMS. WHEN ND = N, IT IS SIMILAR TO NL2ITR */ /* (WITH J = DR), EXCEPT THAT R(X) AND DR(X) NEED NOT BE INITIALIZED */ /* WHEN DRN2G IS CALLED WITH IV(1) = 0 OR 12. DRN2G ALSO ALLOWS */ /* R AND DR TO BE SUPPLIED ROW-WISE -- JUST SET ND = 1 AND CALL */ /* DRN2G ONCE FOR EACH ROW WHEN PROVIDING RESIDUALS AND JACOBIANS. */ /* ANOTHER NEW FEATURE IS THAT CALLING DRN2G WITH IV(1) = 13 */ /* CAUSES STORAGE ALLOCATION ONLY TO BE PERFORMED -- ON RETURN, SUCH */ /* COMPONENTS AS IV(G) (THE FIRST SUBSCRIPT IN G OF THE GRADIENT) */ /* AND IV(S) (THE FIRST SUBSCRIPT IN V OF THE S LOWER TRIANGLE OF */ /* THE S MATRIX) WILL HAVE BEEN SET (UNLESS LIV OR LV IS TOO SMALL), */ /* AND IV(1) WILL HAVE BEEN SET TO 14. CALLING DRN2G WITH IV(1) = 14 */ /* CAUSES EXECUTION OF THE ALGORITHM TO BEGIN UNDER THE ASSUMPTION */ /* THAT STORAGE HAS BEEN ALLOCATED. */ /* *** SUPPLYING R AND DR *** */ /* DRN2G USES IV AND V IN THE SAME WAY AS NL2SOL, WITH A SMALL */ /* NUMBER OF OBVIOUS CHANGES. ONE DIFFERENCE BETWEEN DRN2G AND */ /* NL2ITR IS THAT INITIAL FUNCTION AND GRADIENT INFORMATION NEED NOT */ /* BE SUPPLIED IN THE VERY FIRST CALL ON DRN2G, THE ONE WITH */ /* IV(1) = 0 OR 12. ANOTHER DIFFERENCE IS THAT DRN2G RETURNS WITH */ /* IV(1) = -2 WHEN IT WANTS ANOTHER LOOK AT THE OLD JACOBIAN MATRIX */ /* AND THE CURRENT RESIDUAL -- THE ONE CORRESPONDING TO X AND */ /* IV(NFGCAL). IT THEN RETURNS WITH IV(1) = -3 WHEN IT WANTS TO SEE */ /* BOTH THE NEW RESIDUAL AND THE NEW JACOBIAN MATRIX AT ONCE. NOTE */ /* THAT IV(NFGCAL) = IV(7) CONTAINS THE VALUE THAT IV(NFCALL) = IV(6) */ /* HAD WHEN THE CURRENT RESIDUAL WAS EVALUATED. ALSO NOTE THAT THE */ /* VALUE OF X CORRESPONDING TO THE OLD JACOBIAN MATRIX IS STORED IN */ /* V, STARTING AT V(IV(X0)) = V(IV(43)). */ /* ANOTHER NEW RETURN... DRN2G IV(1) = -1 WHEN IT WANTS BOTH THE */ /* RESIDUAL AND THE JACOBIAN TO BE EVALUATED AT X. */ /* A NEW RESIDUAL VECTOR MUST BE SUPPLIED WHEN DRN2G RETURNS WITH */ /* IV(1) = 1 OR -1. THIS TAKES THE FORM OF VALUES OF R(I,X) PASSED */ /* IN R(I-N1+1), I = N1(1)N2. YOU MAY PASS ALL THESE VALUES AT ONCE */ /* (I.E., N1 = 1 AND N2 = N) OR IN PIECES BY MAKING SEVERAL CALLS ON */ /* DRN2G. EACH TIME DRN2G RETURNS WITH IV(1) = 1, N1 WILL HAVE */ /* BEEN SET TO THE INDEX OF THE NEXT RESIDUAL THAT DRN2G EXPECTS TO */ /* SEE, AND N2 WILL BE SET TO THE INDEX OF THE HIGHEST RESIDUAL THAT */ /* COULD BE GIVEN ON THE NEXT CALL, I.E., N2 = N1 + ND - 1. (THUS */ /* WHEN DRN2G FIRST RETURNS WITH IV(1) = 1 FOR A NEW X, IT WILL */ /* HAVE SET N1 TO 1 AND N2 TO MIN(ND,N).) THE CALLER MAY PROVIDE */ /* FEWER THAN N2-N1+1 RESIDUALS ON THE NEXT CALL BY SETTING N2 TO */ /* A SMALLER VALUE. DRN2G ASSUMES IT HAS SEEN ALL THE RESIDUALS */ /* FOR THE CURRENT X WHEN IT IS CALLED WITH N2 .GE. N. */ /* EXAMPLE... SUPPOSE N = 80 AND THAT R IS TO BE PASSED IN 8 */ /* BLOCKS OF SIZE 10. THE FOLLOWING CODE WOULD DO THE JOB. */ /* N = 80 */ /* ND = 10 */ /* ... */ /* DO 10 K = 1, 8 */ /* *** COMPUTE R(I,X) FOR I = 10*K-9 TO 10*K *** */ /* *** AND STORE THEM IN R(1),...,R(10) *** */ /* CALL DRN2G(..., R, ...) */ /* 10 CONTINUE */ /* THE SITUATION IS SIMILAR WHEN GRADIENT INFORMATION IS */ /* REQUIRED, I.E., WHEN DRN2G RETURNS WITH IV(1) = 2, -1, OR -2. */ /* NOTE THAT DRN2G OVERWRITES R, BUT THAT IN THE SPECIAL CASE OF */ /* N1 = 1 AND N2 = N ON PREVIOUS CALLS, DRN2G NEVER RETURNS WITH */ /* IV(1) = -2. IT SHOULD BE CLEAR THAT THE PARTIAL DERIVATIVE OF */ /* R(I,X) WITH RESPECT TO X(L) IS TO BE STORED IN DR(I-N1+1,L), */ /* L = 1(1)P, I = N1(1)N2. IT IS ESSENTIAL THAT R(I) AND DR(I,L) */ /* ALL CORRESPOND TO THE SAME RESIDUALS WHEN IV(1) = -1 OR -2. */ /* *** COVARIANCE MATRIX *** */ /* IV(RDREQ) = IV(57) TELLS WHETHER TO COMPUTE A COVARIANCE */ /* MATRIX AND/OR REGRESSION DIAGNOSTICS... 0 MEANS NEITHER, */ /* 1 MEANS COVARIANCE MATRIX ONLY, 2 MEANS REG. DIAGNOSTICS ONLY, */ /* 3 MEANS BOTH. AS WITH NL2SOL, IV(COVREQ) = IV(15) TELLS WHAT */ /* HESSIAN APPROXIMATION TO USE IN THIS COMPUTING. */ /* *** REGRESSION DIAGNOSTICS *** */ /* SEE THE COMMENTS IN SUBROUTINE DN2G. */ /* *** GENERAL *** */ /* CODED BY DAVID M. GAY. */ /* +++++++++++++++++++++++++++++ DECLARATIONS ++++++++++++++++++++++++++ */ /* *** INTRINSIC FUNCTIONS *** */ /* /+ */ /* / */ /* *** EXTERNAL FUNCTIONS AND SUBROUTINES *** */ /* DC7VFN... FINISHES COVARIANCE COMPUTATION. */ /* DIVSET.... PROVIDES DEFAULT IV AND V INPUT COMPONENTS. */ /* DD7TPR... COMPUTES INNER PRODUCT OF TWO VECTORS. */ /* DD7UPD... UPDATES SCALE VECTOR D. */ /* DG7LIT.... PERFORMS BASIC MINIMIZATION ALGORITHM. */ /* DITSUM.... PRINTS ITERATION SUMMARY, INFO ABOUT INITIAL AND FINAL X. */ /* DL7VML.... COMPUTES L * V, V = VECTOR, L = LOWER TRIANGULAR MATRIX. */ /* DN2CVP... PRINTS COVARIANCE MATRIX. */ /* DN2LRD... COMPUTES REGRESSION DIAGNOSTICS. */ /* DQ7APL... APPLIES QR TRANSFORMATIONS STORED BY DQ7RAD. */ /* DQ7RAD.... ADDS A NEW BLOCK OF ROWS TO QR DECOMPOSITION. */ /* DV7CPY.... COPIES ONE VECTOR TO ANOTHER. */ /* DV7SCP... SETS ALL ELEMENTS OF A VECTOR TO A SCALAR. */ /* *** LOCAL VARIABLES *** */ /* *** SUBSCRIPTS FOR IV AND V *** */ /* *** IV SUBSCRIPT VALUES *** */ /* /6 */ /* DATA CNVCOD/55/, COVMAT/26/, COVREQ/15/, DTYPE/16/, FDH/74/, */ /* 1 G/28/, H/56/, IPIVOT/76/, IVNEED/3/, JCN/66/, JTOL/59/, */ /* 2 LMAT/42/, MODE/35/, NEXTIV/46/, NEXTV/47/, NFCALL/6/, */ /* 3 NFCOV/52/, NF0/68/, NF00/81/, NF1/69/, NFGCAL/7/, NGCALL/30/, */ /* 4 NGCOV/53/, QTR/77/, RESTOR/9/, RMAT/78/, RDREQ/57/, REGD/67/, */ /* 5 TOOBIG/2/, VNEED/4/, Y/48/ */ /* /7 */ /* / */ /* *** V SUBSCRIPT VALUES *** */ /* /6 */ /* DATA DINIT/38/, DTINIT/39/, D0INIT/40/, F/10/, RLIMIT/46/ */ /* /7 */ /* / */ /* /6 */ /* DATA HALF/0.5D+0/, ZERO/0.D+0/ */ /* /7 */ /* / */ /* +++++++++++++++++++++++++++++++ BODY ++++++++++++++++++++++++++++++++ */ /* Parameter adjustments */ --iv; --v; --rd; --r__; --x; dr_dim1 = *nd; dr_offset = 1 + dr_dim1; dr -= dr_offset; --d__; /* Function Body */ lh = *p * (*p + 1) / 2; if (iv[1] == 0) { divset_(&c__1, &iv[1], liv, lv, &v[1]); } iv1 = iv[1]; if (iv1 > 2) { goto L10; } nn = *n2 - *n1 + 1; iv[9] = 0; i__ = iv1 + 4; if (iv[2] == 0) { switch (i__) { case 1: goto L150; case 2: goto L130; case 3: goto L150; case 4: goto L120; case 5: goto L120; case 6: goto L150; } } if (i__ != 5) { iv[1] = 2; } goto L40; /* *** FRESH START OR RESTART -- CHECK INPUT INTEGERS *** */ L10: if (*nd <= 0) { goto L210; } if (*p <= 0) { goto L210; } if (*n <= 0) { goto L210; } if (iv1 == 14) { goto L30; } if (iv1 > 16) { goto L300; } if (iv1 < 12) { goto L40; } if (iv1 == 12) { iv[1] = 13; } if (iv[1] != 13) { goto L20; } iv[3] += *p; iv[4] += *p * (*p + 13) / 2; L20: dg7lit_(&d__[1], &x[1], &iv[1], liv, lv, p, p, &v[1], &x[1], &x[1]); if (iv[1] != 14) { goto L999; } /* *** STORAGE ALLOCATION *** */ iv[76] = iv[46]; iv[46] = iv[76] + *p; iv[48] = iv[47]; iv[28] = iv[48] + *p; iv[66] = iv[28] + *p; iv[78] = iv[66] + *p; iv[77] = iv[78] + lh; iv[59] = iv[77] + *p; iv[47] = iv[59] + (*p << 1); if (iv1 == 13) { goto L999; } L30: jtol1 = iv[59]; if (v[38] >= 0.) { dv7scp_(p, &d__[1], &v[38]); } if (v[39] > 0.) { dv7scp_(p, &v[jtol1], &v[39]); } i__ = jtol1 + *p; if (v[40] > 0.) { dv7scp_(p, &v[i__], &v[40]); } iv[68] = 0; iv[69] = 0; if (*nd >= *n) { goto L40; } /* *** SPECIAL CASE HANDLING OF FIRST FUNCTION AND GRADIENT EVALUATION */ /* *** -- ASK FOR BOTH RESIDUAL AND JACOBIAN AT ONCE */ g1 = iv[28]; y1 = iv[48]; dg7lit_(&d__[1], &v[g1], &iv[1], liv, lv, p, p, &v[1], &x[1], &v[y1]); if (iv[1] != 1) { goto L220; } v[10] = 0.; dv7scp_(p, &v[g1], &c_b14); iv[1] = -1; qtr1 = iv[77]; dv7scp_(p, &v[qtr1], &c_b14); iv[67] = 0; rmat1 = iv[78]; goto L100; L40: g1 = iv[28]; y1 = iv[48]; dg7lit_(&d__[1], &v[g1], &iv[1], liv, lv, p, p, &v[1], &x[1], &v[y1]); if ((i__1 = iv[1] - 2) < 0) { goto L50; } else if (i__1 == 0) { goto L60; } else { goto L220; } L50: v[10] = 0.; if (iv[69] == 0) { goto L260; } if (iv[9] != 2) { goto L260; } iv[68] = iv[69]; dv7cpy_(n, &rd[1], &r__[1]); iv[67] = 0; goto L260; L60: dv7scp_(p, &v[g1], &c_b14); if (iv[35] > 0) { goto L230; } rmat1 = iv[78]; qtr1 = iv[77]; dv7scp_(p, &v[qtr1], &c_b14); iv[67] = 0; if (*nd < *n) { goto L90; } if (*n1 != 1) { goto L90; } if (iv[35] < 0) { goto L100; } if (iv[69] == iv[7]) { goto L70; } if (iv[68] != iv[7]) { goto L90; } dv7cpy_(n, &r__[1], &rd[1]); goto L80; L70: dv7cpy_(n, &rd[1], &r__[1]); L80: dq7apl_(nd, n, p, &dr[dr_offset], &rd[1], &c__0); dl7vml_(p, &v[y1], &v[rmat1], &rd[1]); goto L110; L90: iv[1] = -2; if (iv[35] < 0) { iv[1] = -1; } L100: dv7scp_(p, &v[y1], &c_b14); L110: dv7scp_(&lh, &v[rmat1], &c_b14); goto L260; /* *** COMPUTE F(X) *** */ L120: t = dv2nrm_(&nn, &r__[1]); if (t > v[46]) { goto L200; } /* Computing 2nd power */ d__1 = t; v[10] += d__1 * d__1 * .5; if (*n2 < *n) { goto L270; } if (*n1 == 1) { iv[69] = iv[6]; } goto L40; /* *** COMPUTE Y *** */ L130: y1 = iv[48]; yi = y1; i__1 = *p; for (l = 1; l <= i__1; ++l) { v[yi] += dd7tpr_(&nn, &dr[l * dr_dim1 + 1], &r__[1]); ++yi; /* L140: */ } if (*n2 < *n) { goto L270; } iv[1] = 2; if (*n1 > 1) { iv[1] = -3; } goto L260; /* *** COMPUTE GRADIENT INFORMATION *** */ L150: if (iv[35] > *p) { goto L240; } g1 = iv[28]; ivmode = iv[35]; if (ivmode < 0) { goto L170; } if (ivmode == 0) { goto L180; } iv[1] = 2; /* *** COMPUTE GRADIENT ONLY (FOR USE IN COVARIANCE COMPUTATION) *** */ gi = g1; i__1 = *p; for (l = 1; l <= i__1; ++l) { v[gi] += dd7tpr_(&nn, &r__[1], &dr[l * dr_dim1 + 1]); ++gi; /* L160: */ } goto L190; /* *** COMPUTE INITIAL FUNCTION VALUE WHEN ND .LT. N *** */ L170: if (*n <= *nd) { goto L180; } t = dv2nrm_(&nn, &r__[1]); if (t > v[46]) { goto L200; } /* Computing 2nd power */ d__1 = t; v[10] += d__1 * d__1 * .5; /* *** UPDATE D IF DESIRED *** */ L180: if (iv[16] > 0) { dd7upd_(&d__[1], &dr[dr_offset], &iv[1], liv, lv, n, nd, &nn, n2, p, & v[1]); } /* *** COMPUTE RMAT AND QTR *** */ qtr1 = iv[77]; rmat1 = iv[78]; dq7rad_(&nn, nd, p, &v[qtr1], &c_true, &v[rmat1], &dr[dr_offset], &r__[1]) ; iv[69] = 0; L190: if (*n2 < *n) { goto L270; } if (ivmode > 0) { goto L40; } iv[81] = iv[7]; /* *** COMPUTE G FROM RMAT AND QTR *** */ dl7vml_(p, &v[g1], &v[rmat1], &v[qtr1]); iv[1] = 2; if (ivmode == 0) { goto L40; } if (*n <= *nd) { goto L40; } /* *** FINISH SPECIAL CASE HANDLING OF FIRST FUNCTION AND GRADIENT */ y1 = iv[48]; iv[1] = 1; dg7lit_(&d__[1], &v[g1], &iv[1], liv, lv, p, p, &v[1], &x[1], &v[y1]); if (iv[1] != 2) { goto L220; } goto L40; /* *** MISC. DETAILS *** */ /* *** X IS OUT OF RANGE (OVERSIZE STEP) *** */ L200: iv[2] = 1; goto L40; /* *** BAD N, ND, OR P *** */ L210: iv[1] = 66; goto L300; /* *** CONVERGENCE OBTAINED -- SEE WHETHER TO COMPUTE COVARIANCE *** */ L220: if (iv[26] != 0) { goto L290; } if (iv[67] != 0) { goto L290; } /* *** SEE IF CHOLESKY FACTOR OF HESSIAN IS AVAILABLE *** */ k = iv[74]; if (k <= 0) { goto L280; } if (iv[57] <= 0) { goto L290; } /* *** COMPUTE REGRESSION DIAGNOSTICS AND DEFAULT COVARIANCE IF */ /* DESIRED *** */ i__ = 0; if (iv[57] % 4 >= 2) { i__ = 1; } if (iv[57] % 2 == 1 && abs(iv[15]) <= 1) { i__ += 2; } if (i__ == 0) { goto L250; } iv[35] = *p + i__; ++iv[30]; ++iv[53]; iv[55] = iv[1]; if (i__ < 2) { goto L230; } l = abs(iv[56]); dv7scp_(&lh, &v[l], &c_b14); L230: ++iv[52]; ++iv[6]; iv[7] = iv[6]; iv[1] = -1; goto L260; L240: l = iv[42]; dn2lrd_(&dr[dr_offset], &iv[1], &v[l], &lh, liv, lv, nd, &nn, p, &r__[1], &rd[1], &v[1]); if (*n2 < *n) { goto L270; } if (*n1 > 1) { goto L250; } /* *** ENSURE WE CAN RESTART -- AND MAKE RETURN STATE OF DR */ /* *** INDEPENDENT OF WHETHER REGRESSION DIAGNOSTICS ARE COMPUTED. */ /* *** USE STEP VECTOR (ALLOCATED BY DG7LIT) FOR SCRATCH. */ rmat1 = iv[78]; dv7scp_(&lh, &v[rmat1], &c_b14); dq7rad_(&nn, nd, p, &r__[1], &c_false, &v[rmat1], &dr[dr_offset], &r__[1]) ; iv[69] = 0; /* *** FINISH COMPUTING COVARIANCE *** */ L250: l = iv[42]; dc7vfn_(&iv[1], &v[l], &lh, liv, lv, n, p, &v[1]); goto L290; /* *** RETURN FOR MORE FUNCTION OR GRADIENT INFORMATION *** */ L260: *n2 = 0; L270: *n1 = *n2 + 1; *n2 += *nd; if (*n2 > *n) { *n2 = *n; } goto L999; /* *** COME HERE FOR INDEFINITE FINITE-DIFFERENCE HESSIAN *** */ L280: iv[26] = k; iv[67] = k; /* *** PRINT SUMMARY OF FINAL ITERATION AND OTHER REQUESTED ITEMS *** */ L290: g1 = iv[28]; L300: ditsum_(&d__[1], &v[g1], &iv[1], liv, lv, p, &v[1], &x[1]); if (iv[1] <= 6 && iv[57] > 0) { dn2cvp_(&iv[1], liv, lv, p, &v[1]); } L999: return 0; /* *** LAST LINE OF DRN2G FOLLOWS *** */ } /* drn2g_ */