Пример #1
0
void dump_buffer(uint8_t *data, int N)
{
    int i;
    
    for(i=0; i<N; i+=16)
    {
        if(i + 16 <= N)
            printdataline((uint8_t *)data+i, 16);
        else
            printdataline((uint8_t *)data+1, N - i);
    }
}
Пример #2
0
void grgitn ( )
{

    /*	  CONTROLS MAIN ITERATIVE LOOP;  CALLS consbs TO COMPUTE    */
    /*	  INITIAL BASIS INVERSE ;  CALLS direc TO COMPUTE SEARCH    */
    /*	  DIRECTION;  CALLS ONE DIMENTIONAL SEARCH SUBROUTINE	    */
    /*	  search;  TEST FOR OPTIMALITY				    */

    /*	  Local Declarations	*/

    double  ts, tst, cons2, phhold, objtst, trubst;
    int   i, j, k, ii, jr, kk, iii, istop, msgcg, nfail, idegct;
    int   linect, iparm;

    /*	  INITIALIZE PERFORMANCE COUNTERS    */

    ncalls = 0;  /*  ncalls = NUMBER OF NEWTON CALLS  */
    nit = 0;     /*  nit    = CUMULATIVE NO. OF NEWTON ITERATIONS    */
    nftn = 1;    /*  nftn   = TOTAL NO. OF gcomp CALLS  */
    ngrad = 0;   /*  ngrad  = NO. OF GRADIENT CALLS  */
    nsear = 0;   /*  nsear  = NO. OF ONE DIMENTIONAL SEARCHES  */
    nsear0 = 0;  /*  nsear0 = VALUE OF NSEAR AT START FOR THIS NEWTON VALUE*/
    istop = 0;   /*  istop  = NO. OF CONSECUTIVE TIMES RELATIVE CHANGE  */
			  /*          IN FUNCTION IS LESS THAN epstop  */
    nbs = 0;     /*  nbs    = NO. OF TIMES BASIC VARIABLE VIOLATES BOUND  */
    nnfail = 0;  /*  nnfail = NO. TIMES NEWTON FAILD TO CONVERGE  */
    nstepc = 0;  /*  nstepc = NO. TIMES STEP SIZE CUT BACK WHEN NEWTON FAILS  */
/*08/1991 thru 11/1991*/
    scaled = 0;
    havescale = 0;
/*08/1991 thru 11/1991*/

    /*	  ADJUSTMENTS FOR USING TWO CONSTRAINT TOLERANCES    */

    epnewt = epinit;
    if ( eplast < epinit )  epstop = 10.0e0 * epstop;
    phhold = ph1eps;
    ipr = ipr3 + 1;
    linect = 60;
    iprhld = ipr;
    iprhd3 = ipr3;

    /*	  THIS IS RETURN POINT FOR epnewt LOOP	  */

w10 :
    drop = 0;		   /* COMMON LOGBLK, SRCHLG, SUPBLK */
    move = 1;
    restrt = 0;
    unbd = 0;
    jstfes = 0;
    degen = 0;
    uncon = 0;
    chngsb = 1;
    sbchng = 0;

    idegct = 0;
    nsuper = 0; 	   /* COMMOM NINTBK */
    trubst = 0.0e0;
    nsupp = 0;		   /* COMMON DIRGRG */
    ierr = 0;
    nfail = 0;
    msgcg = 1;
    stpbst = 1.0e0;
    lv = 0;
    istop = 0;
    objtst = plinfy;
    step = 0.0e0;
    cond = 1.0e0;
    ninf= 0;
    nb = 0;
    if ( iper != 0 )  {  ipr = 1;  ipr3 = 0; }
    for ( i = 1; i <= mp1; i++ )    x[n+i] = g[i];
    for ( i=1; i<=nbmax; i++ )
		for ( j=1; j<=nnbmax; j++ )  binv[i][j] = 0.0e0;

    /*	  THIS IS RETURN POINT FOR MAIN LOOP	*/

w40 : ;

    /*	  COMPUTE BASIS INVERSE, EXCEPT WHEN DEGENERATE    */

    consbs ( );

    if ( ninf == 0 || ph1eps == 0.0e0 )  goto w50;
    initph = 1;
    ph1obj();
    initph = 0;
w50 :
    if ( nsear != nsear0 )  goto w100;

    /*	INITIALIZATIONS THAT MUST BE DONE AFTER 1ST consbs CALLS  */
    /*	FOR EACH VALUE OF epnewt  */

    initph = 2;
    ph1obj();
    initph = 0;
    if ( nb == 0 )  goto w70;
    for ( i=1; i<=nb; i++ )  {
	k = ibv[i];
	xbest[i] = x[k];
    }
w70 :
    if ( nnbc == 0 )  goto w100;
    for ( i=1; i<=nnbc; i++ ) {
	k = inbc[i];
	xbest[nb+i] = g[k];
    }
    for ( i=1; i<=mp1; i++ )   gbest[i] = g[i];
w100 :
    /*	COMPUTE REDUCED GRADIENT  */

    redgra(gradf);

    if ( ipr < 4 ) goto w140;
    for ( i=1; i<=n; i++ )   xstat[i] = gradf[i];
    if ( maxim == 0 || ninf!= 0 )  goto w130;
    for ( i=1; i<=n; i++ )  xstat[i] = -xstat[i];
w130 :
    if ( ipr < 0 )  goto w140;
    fprintf ( ioout, "REDUCED GRADIENT IS\n");
    for ( i=1; i<=n; i++ )  fprintf ( ioout, "   %e\n", xstat[i] );
w140 :
    /*	===CHECK IF ANY OF THE STOP CRITERIA ARE SATISFIED===  */

    /*	UNCONDITIONAL STOP IF NUMBER OF LINEAR SEARCH > LIMSER	*/

    if ( nsear < limser )  goto w155;
    /*	DID REACH LIMIT SO QUIT  */

    if ( ipr < 0 )  goto w151;
    fprintf ( ioout, "NUMBER OF COMPLETED ONE-DIMENSIONAL SEARCHES = LIMSER");
    fprintf ( ioout, " =  %d.\nOPTIMIZATION TERMINATED.\n", nsear);
    linect++;
w151 :
    info = 3;
    ierr = 11;
    goto w520;

    /*	TEST IF KUHN-TUCKER CONDITIONS SATISFIED  */

w155 :
    for ( i=1; i<=n; i++ )  {
	ii = inbv[i];
	tst = gradf[i];
	if ( ii <= n )	goto w160;
	if ( istat[ii-n] == 1 )  goto w190;
w160 :
	if ( iub[i] == 0 )  goto w180;
	if ( iub[i] == 1 )  goto w170;
	if ( tst < -epstop )  goto w200;
	goto w190;
w170 :
	if ( tst > epstop ) goto w200;
	goto w190;
w180 :
	if ( fabs(tst) > epstop )  goto w200;
w190 :	;
    }

    /*	K-T CONDITIONS ARE SATISFIED.  GO CHECK IF epnewt AT FINAL VALUE  */

    if ( ipr < 0 )  goto w191;
    fprintf ( ioout, "TERMINATION CRITERION MET.  KUHN-TUCKER CONDITIONS");
    fprintf ( ioout, " SATISFIED TO\nWITHIN %e AT CURRENT POINT\n", epstop );
    linect++;
w191 :
    info = 0;
    goto w480;

    /*	CHECK IF RELATIVE CHANGE IN OBJECTIVE IS LESS THAN epstop  */
    /*	FOR nstop CONSECUTIVE ITERATIONS.    */

w200 :
    if ( degen == 1 )  goto w250;
    if ( fabs(g[nobj] - objtst) > fabs(objtst*epstop) )  goto w230;

    /*	FRACTIONAL CHANGE TOO SMALL.  COUNT HOW OFTEN CONSECUTIVELY.  */

    istop++;
    if ( istop < nstop )  goto w250;

    /*    FRACTIONAL CHANGE TOO SMALL nstop OR MORE TIMES.    */
    /*    SO GO CHECK IF epnewt AT FINAL VALUE  */

    if ( ipr < 0 )  goto w201;
    fprintf ( ioout, "TOTAL FRACTIONAL CHANGE IN OBJECTIVE LESS THAN %e\n", epstop);
    fprintf ( ioout, "  FOR %d CONSECUTIVE ITERATIONS\n", istop );
    linect = linect + 2;
w201 :
    ierr = 1;
    info = 1;
    goto w480;
w230 :
    istop = 0;
    chngsb = 0;
    objtst = g[nobj];

    /*	COMPUTE SEARCH DIRECTION FOR SUPERBASICS  */

w250 :
    direc();

    if ( dfail == 1 )  goto  w520;
    if ( ipr >= 4 )    {
	fprintf ( ioout, "DIRECTION VECTOR :\n" );
	for ( i=1; i<=nsuper; i++ )
	    fprintf ( ioout, "  D[%d] = %e\n", i, d[i] );
    }
    if ( nb == 0 )  goto w300;

    /*	COMPUTE TANGENT VECTOR V  */

    tang();

    if ( ipr >= 4 )  {
	fprintf ( ioout, "TANGENT VECTOR :\n" );
	for ( i=1; i<=nb; i++ )
	    fprintf ( ioout, "V[%d] = %e\n", i, v[i] );
    }

    /*	  FIND JP,  INDEX OF FIRST BASIC VARIABLE TO HIT A BOUND    */

    chuzr();

    if ( move == 1 )   goto w300;

    /*	  DEGENERATE AND NO MOVE IN BASICS IS POSSIBLE	  */

    jr = ibv[jp];
    if ( ipr >= 3 )
	fprintf (ioout, "BASIS DEGENERATE-- VARIABLE %d LEAVING BASIS\n", jr );
    lv = jp;
    degen = 1;
    idegct++;
    if ( idegct < 15 )   goto w281;
    if ( ipr < 0 )  goto w281;
    fprintf (ioout, "DEGENERATE FOR %d STEPS.  PROBABLY CYCLING.\n", idegct );

w281 :
    printdataline ( );

    /*      EXCHANGE BASIC WITH SOME SUPERBASIC AND UPDATE BINV   */

    chuzq();

    /*	  SET LOGICALS FOR USE BY DIREC    */

    restrt = 0;
    uncon = 0;
    sbchng = 1;
    mxstep = 1;

    /*	  NOW GO TO BEGIN NEW ITERATION FOR DEGENERATE CASE    */

    goto w100;

w300 :
    degen = 0;
    idegct = 0;

    printdataline ( );

    search();

    /* IF ABSOLUTE VALUE OF X'S IS VERY SMALL, CHANGE TO 0 TO AVOID UNDERFLOW */

    for ( i=1; i<=n; i++ )
	if ( fabs(x[i]) < eps )  x[i] = 0.0;

    nsear++;
    if ( nsear == ipn4 )  ipr = 4;
    if ( nsear == ipn5 )  ipr = 5;
    if ( nsear == ipn6 )  ipr = 6;
    ipr3 = ipr - 1;

    /*	IF SUPERBASIC HAS HIT BOUND, DELETE APPROPRIATE COLUMNS OF HESSIAN  */

    if ( mxstep == 0 )	goto w400;
    ii = nsuper;
    iii = nsuper;
    for ( kk=1; kk<=ii; kk++ )	{
	iparm = ii + 1 - kk;
	j = inbv[i];
	if ( fabs(x[j] - alb[j]) > epnewt && fabs(x[j] - ub[j]) >epnewt )  goto w390;
	iii--;
	if ( varmet == 1 )   delcol( &iparm );
	if ( iparm > iii )   goto w390;
	for ( k=iparm; k<=iii; k++ ) gradp[k] = gradp[k+1];
w390 :	;
    }
w400 :
    if ( succes == 1 )	 goto w440;

    /*	TROUBLE -- NO FUNCTION DECREASE  */
    /*	TRY DROPPING CONSTRAINTS ( AND GRADIENT STEP ) IF NOT DONE ALREADY  */

    if ( drop == 1 )   goto w435;
    drop = 1;
    chngsb = 1;
    goto w40;
w435 :
    /*	NO IMPROVEMENT IN LINESEARCH.  ALL REMEDIES FAILED.  */

    ierr = 2;
    if ( ipr < 0 )   goto w436;
    fprintf (ioout,"ALL REMEDIES HAVE FAILED TO FIND A BETTER POINT.");
    fprintf (ioout,"  PROGRAM TERMINATED.\n");
    linect = linect + 2;
w436 :
    info = 2;
    goto w480;
w440 :
    if ( unbd == 0 )   goto w450;

    /*	UNBOUNDED SOLUTION  */

    ierr = 20;
    if ( ipr < 0 )  goto w441;
    fprintf (ioout,"SOLUTION UNBOUNDED--FUNCTION IMPROVING AFTER DOUBLING STEP");
    fprintf (ioout," %d TIMES.\n", ndub);
    linect++;
w441 :
    info = 4;
    goto w520;
w450 :
    nfail = 0;
    restrt = 0;
    drop = 0;
    goto w40;

    /*********************************************************************/

    /*	SEGMENT CHECKS AND IF NEEDED ADJUSTS EPNEWT TO FINAL VALUE  */

w480 :
    if ( epnewt == eplast )   goto w520;
    printdataline ( );
    epnewt = eplast;
    if ( ipr < 0 )  goto w481;
    fprintf (ioout,"CONSTRAINT TOLERANCE HAS BEEN TIGHTENED TO ITS FINAL ");
    fprintf (ioout,"VALUE OF %e.\n", epnewt );
    linect = linect + 2;
w481 :
    epstop = 0.1 * epstop;
    nsear0 = nsear;
    ph1eps = 0.2;
    for ( i=1; i<=n; i++ )   {
	if ( ifix[i] != 0 )  goto w485;
	ts = ub[i] + epnewt;
	if ( x[i] > ts )  x[i] = ts;
	ts = alb[i] - epnewt;
	if ( x[i] < ts )  x[i] = ts;
w485 :	;
    }
    sclgcomp(g, x);
    nftn++;
    if ( maxim == 1 )	g[nobj] = -g[nobj];
    goto w10;

    /*************************************************************/

    /*	NORMAL TERMINATION STEP  */

w520 :
    printdataline ( );
    if ( ninf == 0 )   goto w540;

    /*	SOLUTION INFEASABLE  */

    if ( ipr < 0 )  goto w521;
    fprintf (ioout,"FEASIBLE POINT NOT FOUND.\n");
    fprintf (ioout,"  FINAL VALUE OF TRUE OBJECTIVE = %e.\n", truobj );
    fprintf (ioout,"  THE FOLLOWING %d CONSTRAINTS WERE IN VIOLATION:\n", ninf);
    linect = linect + 2;
w521 :
    info = info + 10;
    ierr = 9;
    for ( i=1; i<=nnbc; i++ )  {
	j =inbc[i];
	if ( g[j] > alb[n+j] && g[j] < ub[n+j] )   goto w530;
	if ( ipr < 0 )	goto w523;
/*08/1991 thru 11/1991*/
        if (scaled == 1)
            fprintf (ioout, "  %d    %e\n", j, g[j]*scale[n+j] );
        else
            fprintf (ioout, "  %d    %e\n", j, g[j] );
/*08/1991 thru 11/1991*/
w523 :	;
w530 :	;
    }
    g[nobj] = truobj;
w540 :
    if ( epnewt != eplast )    epstop = 0.1 * epstop;
    epnewt = eplast;
    ph1eps = phhold;

/*08/1991 thru 11/1991*/
    if ( scaled == 1 )
       /*  must unscale the x[*] and g[*] before returning */
       { for (i = 1; i <= n; i++ )
	     { x[i] /= scale[i];
	       if (ub[i]  < plinfy) ub[i]  /= scale[i];
	       if (alb[i] >-plinfy) alb[i] /= scale[i];
	     }
w1000 :
	 for (j = 1; j <= mp1; j++ )
	     { i = n + j;
	       g[j] *= scale[i];
	       if (ub[i] < plinfy)  ub[i]  *= scale[i];
	       if (alb[i] >-plinfy) alb[i] *= scale[i];
	     }
       }
w1010 :
/*08/1991 thru 11/1991*/
    return;
}