MYBOOL LUSOL_tightenpivot(LUSOLrec *LUSOL) { #if 0 REAL newvalue; #endif /* Give up tightening if we are already less than limit and we cannot change strategy */ if(MIN(LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij]) < 1.1) { if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] >= LUSOL_PIVMOD_TRP) return( FALSE ); LUSOL_setpivotmodel(LUSOL, LUSOL->luparm[LUSOL_IP_PIVOTTYPE]+1, LUSOL_PIVTOL_DEFAULT+1); return( 2 ); } /* Otherwise tighten according to defined schedule */ #if 0 /* This is Michael Saunder's proposed tightening procedure */ newvalue = sqrt(LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = newvalue; SETMIN(LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij], newvalue); #elif 0 /* This is Kjell Eikland's schedule #1 */ newvalue = sqrt(LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = newvalue; LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij] = 1.0 + (newvalue - 1.0) / 2; #else /* This was Kjell Eikland's schedule #2 */ LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = 1.0 + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]/3.0; LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij] = 1.0 + LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij]/3.0; #endif return( TRUE ); }
LUSOLrec *LUSOL_create(FILE *outstream, int msgfil, int pivotmodel, int updatelimit) { LUSOLrec *newLU; newLU = (LUSOLrec *) LUSOL_CALLOC(1, sizeof(*newLU)); if(newLU == NULL) return( newLU ); newLU->luparm[LUSOL_IP_SCALAR_NZA] = LUSOL_MULT_nz_a; newLU->outstream = outstream; newLU->luparm[LUSOL_IP_PRINTUNIT] = msgfil; newLU->luparm[LUSOL_IP_PRINTLEVEL] = LUSOL_MSG_SINGULARITY; LUSOL_setpivotmodel(newLU, pivotmodel, LUSOL_PIVTOL_DEFAULT); newLU->parmlu[LUSOL_RP_GAMMA] = LUSOL_DEFAULT_GAMMA; newLU->parmlu[LUSOL_RP_ZEROTOLERANCE] = 3.0e-13; newLU->parmlu[LUSOL_RP_SMALLDIAG_U] = /*3.7e-11;*/ newLU->parmlu[LUSOL_RP_EPSDIAG_U] = 3.7e-11; newLU->parmlu[LUSOL_RP_COMPSPACE_U] = 3.0e+0; newLU->luparm[LUSOL_IP_MARKOWITZ_MAXCOL] = 5; newLU->parmlu[LUSOL_RP_MARKOWITZ_CONLY] = 0.3e+0; newLU->parmlu[LUSOL_RP_MARKOWITZ_DENSE] = 0.5e+0; newLU->parmlu[LUSOL_RP_SMARTRATIO] = LUSOL_DEFAULT_SMARTRATIO; #ifdef ForceRowBasedL0 newLU->luparm[LUSOL_IP_ACCELERATION] = LUSOL_BASEORDER; #endif newLU->luparm[LUSOL_IP_KEEPLU] = TRUE; newLU->luparm[LUSOL_IP_UPDATELIMIT] = updatelimit; init_BLAS(); return( newLU ); }
/* MUST MODIFY */ MYBOOL BFP_CALLMODEL bfp_resize(lprec *lp, int newsize) { INVrec *lu; lu = lp->invB; /* Increment dimensionality since we put the objective row at the top */ newsize = newsize + bfp_rowoffset(lp); lu->dimalloc = newsize; /* Allocate index tracker arrays, LU matrices and various work vectors */ if(!allocREAL(lp, &(lu->value), newsize+MATINDEXBASE, AUTOMATIC)) return( FALSE ); /* Data specific to the factorization engine */ if(lu->LUSOL != NULL) { if(newsize > 0 || 1) LUSOL_sizeto(lu->LUSOL, newsize, newsize, 0); else { LUSOL_free(lu->LUSOL); lu->LUSOL = NULL; } } else if(newsize > 0 || 1) { int asize; REAL bsize; lu->LUSOL = LUSOL_create(NULL, 0, LUSOL_PIVMOD_TPP, bfp_pivotmax(lp)*0); #if 1 lu->LUSOL->luparm[LUSOL_IP_ACCELERATION] = LUSOL_AUTOORDER; lu->LUSOL->parmlu[LUSOL_RP_SMARTRATIO] = 0.50; #endif #if 0 lu->timed_refact = DEF_TIMEDREFACT; #else lu->timed_refact = FALSE; #endif /* The following adjustments seem necessary to make the really tough NETLIB models perform reliably and still performant (e.g. cycle.mps) */ #if 0 lu->LUSOL->parmlu[LUSOL_RP_SMALLDIAG_U] = lu->LUSOL->parmlu[LUSOL_RP_EPSDIAG_U] = lp->epsprimal; #endif #if 0 lu->LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE] = lp->epsvalue; #endif #if 1 LUSOL_setpivotmodel(lu->LUSOL, LUSOL_PIVMOD_NOCHANGE, LUSOL_PIVTOL_SLIM); #else LUSOL_setpivotmodel(lu->LUSOL, LUSOL_PIVMOD_NOCHANGE, LUSOL_PIVTOL_TIGHT); #endif #ifdef LUSOL_UseBLAS /* if(fileSearchPath("PATH", "myBLAS.DLL", NULL) && load_BLAS("myBLAS")) */ if(is_nativeBLAS() && load_BLAS(libnameBLAS)) lp->report(lp, NORMAL, "Optimized BLAS was successfully loaded for bfp_LUSOL.\n"); #endif /* Try to minimize memory allocation if we have a large number of unit columns */ bsize = (REAL) lp->get_nonzeros(lp); if(newsize > lp->columns) bsize += newsize; else bsize = bsize/lp->columns*newsize; /* Add a "reasonable" delta to allow for B and associated factorizations that are denser than average; this makes reallocations less frequent. Values between 1.2 and 1.5 appear to be reasonable. */ asize = (int) (bsize*MAX_DELTAFILLIN*1.3333); if(!LUSOL_sizeto(lu->LUSOL, newsize, newsize, asize)) return( FALSE ); } lu->dimcount = newsize; return( TRUE ); }