/** prints error message for return code via error message */ void SCIPretcodePrintError( SCIP_RETCODE retcode /**< SCIP return code causing the error */ ) { switch( retcode ) { case SCIP_OKAY: SCIPmessagePrintError("normal termination"); break; case SCIP_ERROR: SCIPmessagePrintError("unspecified error"); break; case SCIP_NOMEMORY: SCIPmessagePrintError("insufficient memory error"); break; case SCIP_READERROR: SCIPmessagePrintError("read error"); break; case SCIP_WRITEERROR: SCIPmessagePrintError("write error"); break; case SCIP_NOFILE: SCIPmessagePrintError("file not found error"); break; case SCIP_FILECREATEERROR: SCIPmessagePrintError("cannot create file"); break; case SCIP_LPERROR: SCIPmessagePrintError("error in LP solver"); break; case SCIP_NOPROBLEM: SCIPmessagePrintError("no problem exists"); break; case SCIP_INVALIDCALL: SCIPmessagePrintError("method cannot be called at this time in solution process"); break; case SCIP_INVALIDDATA: SCIPmessagePrintError("method cannot be called with this type of data"); break; case SCIP_INVALIDRESULT: SCIPmessagePrintError("method returned an invalid result code"); break; case SCIP_PLUGINNOTFOUND: SCIPmessagePrintError("a required plugin was not found"); break; case SCIP_PARAMETERUNKNOWN: SCIPmessagePrintError("the parameter with the given name was not found"); break; case SCIP_PARAMETERWRONGTYPE: SCIPmessagePrintError("the parameter is not of the expected type"); break; case SCIP_PARAMETERWRONGVAL: SCIPmessagePrintError("the value is invalid for the given parameter"); break; case SCIP_KEYALREADYEXISTING: SCIPmessagePrintError("the given key is already existing in table"); break; case SCIP_MAXDEPTHLEVEL: SCIPmessagePrintError("maximal branching depth level exceeded"); break; default: SCIPmessagePrintError("unknown error code"); break; } }
/** creates a presolver */ SCIP_RETCODE SCIPpresolCreate( SCIP_PRESOL** presol, /**< pointer to store presolver */ SCIP_SET* set, /**< global SCIP settings */ SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */ BMS_BLKMEM* blkmem, /**< block memory for parameter settings */ const char* name, /**< name of presolver */ const char* desc, /**< description of presolver */ int priority, /**< priority of the presolver (>= 0: before, < 0: after constraint handlers) */ int maxrounds, /**< maximal number of presolving rounds the presolver participates in (-1: no limit) */ SCIP_PRESOLTIMING timing, /**< timing mask of the presolver */ SCIP_DECL_PRESOLCOPY ((*presolcopy)), /**< copy method of presolver or NULL if you don't want to copy your plugin into sub-SCIPs */ SCIP_DECL_PRESOLFREE ((*presolfree)), /**< destructor of presolver to free user data (called when SCIP is exiting) */ SCIP_DECL_PRESOLINIT ((*presolinit)), /**< initialization method of presolver (called after problem was transformed) */ SCIP_DECL_PRESOLEXIT ((*presolexit)), /**< deinitialization method of presolver (called before transformed problem is freed) */ SCIP_DECL_PRESOLINITPRE((*presolinitpre)),/**< presolving initialization method of presolver (called when presolving is about to begin) */ SCIP_DECL_PRESOLEXITPRE((*presolexitpre)),/**< presolving deinitialization method of presolver (called after presolving has been finished) */ SCIP_DECL_PRESOLEXEC ((*presolexec)), /**< execution method of presolver */ SCIP_PRESOLDATA* presoldata /**< presolver data */ ) { char paramname[SCIP_MAXSTRLEN]; char paramdesc[SCIP_MAXSTRLEN]; assert(presol != NULL); assert(name != NULL); assert(desc != NULL); /* the interface change from delay flags to timings cannot be recognized at compile time: Exit with an appropriate * error message */ if( timing < SCIP_PRESOLTIMING_FAST || timing > SCIP_PRESOLTIMING_ALWAYS ) { SCIPmessagePrintError("ERROR: 'PRESOLDELAY'-flag no longer available since SCIP 3.2, use an appropriate " "'SCIP_PRESOLTIMING' for <%s> presolver instead.\n", name); return SCIP_PARAMETERWRONGVAL; } SCIP_ALLOC( BMSallocMemory(presol) ); SCIP_ALLOC( BMSduplicateMemoryArray(&(*presol)->name, name, strlen(name)+1) ); SCIP_ALLOC( BMSduplicateMemoryArray(&(*presol)->desc, desc, strlen(desc)+1) ); (*presol)->presolcopy = presolcopy; (*presol)->presolfree = presolfree; (*presol)->presolinit = presolinit; (*presol)->presolexit = presolexit; (*presol)->presolinitpre = presolinitpre; (*presol)->presolexitpre = presolexitpre; (*presol)->presolexec = presolexec; (*presol)->presoldata = presoldata; SCIP_CALL( SCIPclockCreate(&(*presol)->setuptime, SCIP_CLOCKTYPE_DEFAULT) ); SCIP_CALL( SCIPclockCreate(&(*presol)->presolclock, SCIP_CLOCKTYPE_DEFAULT) ); (*presol)->initialized = FALSE; /* add parameters */ (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/priority", name); (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of presolver <%s>", name); SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc, &(*presol)->priority, TRUE, priority, INT_MIN/4, INT_MAX/4, paramChgdPresolPriority, (SCIP_PARAMDATA*)(*presol)) ); /*lint !e740*/ (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/maxrounds", name); SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, "maximal number of presolving rounds the presolver participates in (-1: no limit)", &(*presol)->maxrounds, FALSE, maxrounds, -1, INT_MAX, NULL, NULL) ); /*lint !e740*/ (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "presolving/%s/timing", name); (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "timing mask of presolver <%s> (%u:FAST, %u:MEDIUM, %u:EXHAUSTIVE)", name, SCIP_PRESOLTIMING_FAST, SCIP_PRESOLTIMING_MEDIUM, SCIP_PRESOLTIMING_EXHAUSTIVE); SCIP_CALL( SCIPsetAddIntParam(set, messagehdlr, blkmem, paramname, paramdesc, (int*)&(*presol)->timing, TRUE, (int)timing, (int) SCIP_PRESOLTIMING_FAST, (int) SCIP_PRESOLTIMING_ALWAYS, NULL, NULL) ); /*lint !e740*/ return SCIP_OKAY; }