[Scip] Numerical troubles with a set partitioning formulation

Tobias Achterberg achterberg at zib.de
Thu Feb 23 21:04:24 MET 2012


The use of the primal really comes from SCIP calling CPXprimopt(), so your test to call 
"primopt" from the CPLEX interactive is correct.

Did you use the .sav file format for writing out your problem? This would be the only one 
that could save the exact state.

The 1017 parameter is indeed the FASTMIP parameter. It just disappeared from the CPLEX 
docs, but its numerical value did not change.

So, I think everything should be as in SCIP if you load in the parameters and the .sav 
file, and you call the appropriate optimizer method.

Tobias


Sebastian Ruther wrote:
>    Hello,
>
> yeah that was pretty embarrassing. Ok, it now works and I'll have a look
> at it.
>
> I also tried what Tobias suggested, i.e. use
>
> CPXwriteprob and CPXwriteparam when an LP has numerical issues to reproduce these in CPLEX.The output of CPXwriteparam is something like:
>
> CPLEX Parameter File Version 12.3.0.0
> CPX_PARAM_DPRIIND                2
> CPX_PARAM_EPOPT                  1.00000000000000e-09
> 1017                             1
> CPX_PARAM_ITLIM                  10000
> ...
>
> a quick search reveals that in CPLEX 9.0 parameter 1017 was used for
> CPX_PARAM_FASTMIP. In newer versions of CPLEX this doesn't seem to exist
> anymore - at least I can't find such a parameter in the manual.
>
> Reading this .prm file into CPLEX fails. I can let SCIP run a bit longer
> and it tries several settings that all return numerical issues. At some
> point SCIP doesn't tell CPLEX to use fastmip. I then load CPLEX with the
> .prm and .sav file and optimize. It doesn't have any numerical issues
> but I don't think it uses the exact parameters it uses under SCIP. For
> example it uses the barrier method though SCIP was using the primal
> simplex when I was printing the 2 files. CPXwriteparam writes all non
> default parameters. Is it possible that the CPLEX default values are
> different when using the terminal compared to as a callable library? If
> so, is there any way to get the complete set of parameters?
> Yes, I tried using 'primopt' instead of 'optimize'. Also no numerical
> issues. But again, this may not be the only parameter that was not set
> accordingly.
>
> Thanks
> Sebastian
>
>
> On 23/02/2012 7:12 PM, Gerald Gamrath wrote:
>> Hi Sebastian,
>>
>> in order to activate the debugging output, you should define SCIP_DEBUG
>> in the file for which you want to have the information, so in your case
>> lp.c. You have to do this right at the beginning of the file, e.g.,
>> before the header files are included. This way, SCIP_DEBUG is defined
>> when message.h is included and debugging messages will be printed.
>>
>> Best,
>> Gerald
>>
>>
>> Am 23.02.2012 07:51, schrieb Sebastian Ruther:
>>>      Hello,
>>>
>>> I enable #define SCIP_DEBUG in lp.c. However, that doesn't print
>>> anything because in pub_message.h   SCIP_DEBUG   is not defined and so
>>> we get #define SCIPdebugPrintf                 while( FALSE ) printf.
>>> Therefore I define SCIP_DEBUG in pub_message.h. However, then I get
>>> compilation errors for
>>> sepa_zerohalf.c(1498): error C2143: syntax error : missing ';' before 'type'
>>> the offending term is the
>>> int     i;
>>> just after the function header of debugPrintLPRowsAndCols().
>>>
>>>
>>> I figured the SCIP_DEBUG from pub_message.h gets included in some other
>>> file and we don't really want that so I don't define  #define SCIP_DEBUG
>>> in pub_message.h but just comment in a way such that I have
>>>
>>> /** executes command only if SCIP_DEBUG flag is set */
>>> #define SCIPdebug(x)                        x
>>>
>>> /** prints a debugging message if SCIP_DEBUG flag is set */
>>> #define SCIPdebugMessage                printf("[%s:%d] debug: ",
>>> __FILE__, __LINE__); printf
>>>
>>> /** executes printf command only if SCIP_DEBUG flag is set */
>>> #define SCIPdebugPrintf                 printf
>>>
>>> I then get these 2 compilation errors
>>> cons_bivariate.c(2962): error C2065: 'paramnames' : undeclared identifier
>>> cons_varbound.c(2291): error C2198: 'SCIPprintCons' : too few arguments
>>> for call
>>>
>>> when I comment out these lines I get linkage errors.
>>>
>>> The problem here is the #define SCIPdebug(x)                        x
>>> if I use
>>> #define SCIPdebug(x)                        /**/
>>> I get output although I don't know how helpful that is since it is not
>>> really debugging....
>>>
>>> Regards,
>>> Sebastian
>>>
>>> On 12/01/2012 2:48 AM, Tobias Achterberg wrote:
>>>> Hi Sebastian,
>>>>
>>>> in order to analyze what is going on, I would do the following:
>>>>
>>>> First, you can activate the LP solver logging by setting the
>>>> "display/lpinfo" to TRUE.
>>>>
>>>> Then, use gdb and set a breakpoint at the end of lp.c:lpSolveStable
>>>> where the message about unresolved numerical trouble is printed (or,
>>>> alternatively, where the first "solve again" message is displayed).
>>>>
>>>> Then save the CPLEX LP into a *.sav file by calling
>>>>       CPXwriteprob(lp->lpi->cpxenv, lp->lpi->cpxlp, "nodelp.sav", 0)
>>>> and save the current CPLEX parameters with
>>>>       CPXwriteparam(lp->lpi->cpxenv, "nodelp.prm")
>>>>
>>>> Now, if you load in these parameters and this *.sav file into the
>>>> CPLEX interactive, you should be able to generate exactly the same log
>>>> output as the one displayed from SCIP due to the "display/lpinfo"
>>>> parameter. And you should get the same numerical trouble...
>>>>
>>>> Finally, you can use CPLEX to analyze the source of the numerical
>>>> issue. For example, use "display solution quality" inthe CPLEX
>>>> interactive to print statistics about the primal and dual feasibility
>>>> and the condition number of the final LP basis.
>>>>
>>>>
>>>> Tobias
>>>>
>>>>
>>>> Sebastian Ruther wrote:
>>>>> Hello,
>>>>>
>>>>> I've had numerical troubles with larger instances for a long time. So
>>>>> far I've been able
>>>>> to ignore them because I mostly dealt with smaller instances but I
>>>>> now have to resolve
>>>>> this issue.
>>>>>
>>>>>
>>>>> I'm running SCIP 2.1 with CPLEX 12.3 on Windows 7. I've coded a
>>>>> branch-and-price algorithm
>>>>> with a pure set partitioning master LP. All coefficients are
>>>>> integral, the objective
>>>>> function coefficients are either 5000 (artificial variables) or
>>>>> ranging from 400 to 1000
>>>>> for some columns but most of them have a cost of 0. (I don't think
>>>>> this is the issue
>>>>> though - in earlier versions these columns did have non-zero cost and
>>>>> I still had
>>>>> numerical troubles). All variables are binary.
>>>>>
>>>>> The numerical troubles happen throughout the algorithm, but SCIP is
>>>>> usually able to
>>>>> recover using different tolerances, methods, etc. This can take up a
>>>>> lot of time though.
>>>>> However, at some point it is not able to recover and will try for
>>>>> ObjBranchGE::scip_execps. Since I don't give it any additional
>>>>> columns there it then will
>>>>> finish the node. Please see the output below.
>>>>> I dumped the Lp using SCIPwriteLP. CPLEX solves this without any
>>>>> issues but of course it
>>>>> may use methods that SCIP isn't allowed to use because it knows that
>>>>> variables may not
>>>>> have been added yet. I've attached the .lp file. This is the Lp at
>>>>> the end of the root
>>>>> node (or I should say it aborts the root node at this point).
>>>>>
>>>>> The output is:
>>>>>
>>>>> (node 1) numerical troubles in LP 297 -- solve again with primal
>>>>> simplex without scaling
>>>>> (node 1) numerical troubles in LP 298 -- solve again with primal
>>>>> simplex without presolving
>>>>> (node 1) numerical troubles in LP 299 -- solve again with primal
>>>>> simplex with tighter
>>>>> feasibility tolerance
>>>>> (node 1) numerical troubles in LP 300 -- solve again from scratch
>>>>> with primal simplex
>>>>> (node 1) numerical troubles in LP 301 -- solve again from scratch
>>>>> with dual simplex
>>>>> (node 1) numerical troubles in LP 302 -- solve again from scratch
>>>>> with dual simplex
>>>>> without scaling
>>>>> (node 1) numerical troubles in LP 303 -- solve again from scratch
>>>>> with dual simplex
>>>>> without presolving
>>>>> (node 1) numerical troubles in LP 304 -- solve again from scratch
>>>>> with dual simplex with
>>>>> tighter feasibility tolerance
>>>>> (node 1) unresolved numerical troubles in LP 305
>>>>> (node 1) numerical troubles in LP 306 -- solve again with dual
>>>>> simplex without scaling
>>>>> (node 1) numerical troubles in LP 307 -- solve again with dual
>>>>> simplex without presolving
>>>>> (node 1) numerical troubles in LP 308 -- solve again with dual
>>>>> simplex with tighter
>>>>> feasibility tolerance
>>>>> (node 1) numerical troubles in LP 309 -- solve again from scratch
>>>>> with dual simplex
>>>>> (node 1) numerical troubles in LP 310 -- solve again from scratch
>>>>> with primal simplex
>>>>> (node 1) numerical troubles in LP 311 -- solve again from scratch
>>>>> with primal simplex
>>>>> without scaling
>>>>> (node 1) numerical troubles in LP 312 -- solve again from scratch
>>>>> with primal simplex
>>>>> without presolving
>>>>> (node 1) numerical troubles in LP 313 -- solve again from scratch
>>>>> with primal simplex with
>>>>> tighter feasibility tolerance
>>>>> (node 1) unresolved numerical troubles in LP 314
>>>>> 256s| 1 | 0 |313683 | - | 14M| 0 | - |4373 |1057 |4373 |1057 | 0 | 0
>>>>> | 0 | --
>>>>> |2.620000e+006 |
>>>>> 256s| 1 | 0 |313683 | - | 14M| 0 | - |4373 |1057 |4373 |1057 | 0 | 0
>>>>> | 0 | --
>>>>> |2.620000e+006 |
>>>>> (node 1) unresolved numerical troubles in LP 314 -- using pseudo
>>>>> solution instead (loop 1)
>>>>> it then goes into ObjBranchGE::scip_execps.
>>>>>
>>>>> I use the following to generate the constraints:
>>>>>
>>>>> set partitioning constraints
>>>>> SCIP_CALL( SCIPcreateConsSetpart(
>>>>> scip,
>>>>> &cons,
>>>>> namebuf.str().c_str(), //name
>>>>> 0, //nvars
>>>>> 0, //vars
>>>>> InitMPconsInitial,
>>>>> InitMPconsSeparate,
>>>>> InitMPconsEnforce,
>>>>> InitMPconsCheck,
>>>>> InitMPconsPropagate,
>>>>> InitMPconsLocal,
>>>>> InitMPconsModifiable,
>>>>> InitMPconsDynamic ,
>>>>> InitMPconsRemovable,
>>>>> InitMPconsStickingatnode) );
>>>>>
>>>>> convexity constraints:
>>>>> SCIP_CALL( SCIPcreateConsSetpack(
>>>>> scip,
>>>>> &cons,
>>>>> namebuf.str().c_str(), //name
>>>>> 0, //nvars
>>>>> 0, //vars
>>>>> InitMPconsInitial,
>>>>> InitMPconsSeparate,
>>>>> InitMPconsEnforce,
>>>>> InitMPconsCheck,
>>>>> InitMPconsPropagate,
>>>>> InitMPconsLocal,
>>>>> InitMPconsModifiable,
>>>>> InitMPconsDynamic ,
>>>>> InitMPconsRemovable,
>>>>> InitMPconsStickingatnode) );
>>>>>
>>>>> with
>>>>> #define InitMPconsInitial true
>>>>> #define InitMPconsSeparate false
>>>>> #define InitMPconsEnforce true
>>>>> #define InitMPconsCheck true
>>>>> #define InitMPconsPropagate true
>>>>> #define InitMPconsLocal false
>>>>> #define InitMPconsModifiable true
>>>>> #define InitMPconsDynamic false
>>>>> #define InitMPconsRemovable false
>>>>> #define InitMPconsStickingatnode false
>>>>>
>>>>>
>>>>> Any ideas what I can do? I mean the formulation is very basic and I
>>>>> don't think the
>>>>> coefficients are too large.
>>>>> Thank you!
>>>>> Sebastian
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Scip mailing list
>>>>> Scip at zib.de
>>>>> http://listserv.zib.de/mailman/listinfo/scip
>>>> .
>>>>
>>> _______________________________________________
>>> Scip mailing list
>>> Scip at zib.de
>>> http://listserv.zib.de/mailman/listinfo/scip
>> _______________________________________________
>> Scip mailing list
>> Scip at zib.de
>> http://listserv.zib.de/mailman/listinfo/scip
>>
>> .
>>
>
> _______________________________________________
> Scip mailing list
> Scip at zib.de
> http://listserv.zib.de/mailman/listinfo/scip


More information about the Scip mailing list