/* Curtis-Reid scaling */ long __declspec(dllexport) WINAPI _scaleCR(lprec *lp) { long ret; if (lp != NULL) { freebuferror(); ret = scaleCR(lp); } else ret = 0; return(ret); }
STATIC REAL auto_scale(lprec *lp) { int n = 1; REAL scalingmetric = 0, *scalenew = NULL; if(lp->scaling_used && ((((lp->scalemode & SCALE_DYNUPDATE) == 0)) || (lp->bb_level > 0))) return( scalingmetric); if(lp->scalemode != SCALE_NONE) { /* Allocate array for incremental scaling if appropriate */ if((lp->solvecount > 1) && (lp->bb_level < 1) && ((lp->scalemode & SCALE_DYNUPDATE) != 0)) allocREAL(lp, &scalenew, lp->sum + 1, FALSE); if(is_scaletype(lp, SCALE_CURTISREID)) { scalingmetric = scaleCR(lp, scalenew); } else { REAL scalinglimit, scalingdelta; int count; /* Integer value of scalelimit holds the maximum number of iterations; default to 1 */ count = (int) floor(lp->scalelimit); scalinglimit = lp->scalelimit; if((count == 0) || (scalinglimit == 0)) { if(scalinglimit > 0) count = DEF_SCALINGLIMIT; /* A non-zero convergence has been given, default to max 5 iterations */ else count = 1; } else scalinglimit -= count; /* Scale to desired relative convergence or iteration limit */ n = 0; scalingdelta = 1.0; scalingmetric = 1.0; while((n < count) && (fabs(scalingdelta) > scalinglimit)) { n++; scalingdelta = scale(lp, scalenew); scalingmetric = scalingmetric*(1+scalingdelta); } scalingmetric -= 1; } } /* Update the inf norm of the elements of the matrix (excluding the OF) */ mat_computemax(lp->matA); /* Check if we really have to do scaling */ if(lp->scaling_used && (fabs(scalingmetric) >= lp->epsprimal)) /* Ok, do it */ finalize_scaling(lp, scalenew); else { /* Otherwise reset scaling variables */ if(lp->scalars != NULL) { FREE(lp->scalars); } lp->scaling_used = FALSE; lp->columns_scaled = FALSE; } if(scalenew != NULL) FREE(scalenew); return(scalingmetric); }