Scippy

    SCIP

    Solving Constraint Integer Programs

    Debugging

    If you need to debug your own code that uses SCIP, here are some tips and tricks:

    How to activate debug messages

    For example, if we include a #define SCIP_DEBUG at the top of heur_oneopt.c, recompile SCIP in Debug mode, and run the SCIP interactive shell to solve p0033.mps from the MIPLIB 3.0 , we get some output like:

    SCIP version 1.1.0 [precision: 8 byte] [memory: block] [mode: debug] [LP solver: SoPlex 1.4.0]
    Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB)
    user parameter file <scip.set> not found - using default parameters
    SCIP> read check/IP/miplib/p0033.mps
    original problem has 33 variables (33 bin, 0 int, 0 impl, 0 cont) and 16 constraints
    ...
    0.1s| 1 | 0 | 132 | 257k| 0 | 14 | 30 | 13 | 13 | 30 | 51 | 39 | 0 | 0 | 3.026472e+03 | 3.347000e+03 | 10.59%
    [src/scip/heur_oneopt.c:332] debug: Row <R122> has activity 110
    [src/scip/heur_oneopt.c:332] debug: Row <R123> has activity 216
    ...
    [src/scip/heur_oneopt.c:101] debug: Try to shift down variable <t_C157> with
    [src/scip/heur_oneopt.c:102] debug: lb:<-0> <= val:<1> <= ub:<1> and obj:<171> by at most: <1>
    [src/scip/heur_oneopt.c:135] debug: -> The shift value had to be reduced to <0>, because of row <R122>.
    [src/scip/heur_oneopt.c:137] debug: lhs:<-1e+20> <= act:<110> <= rhs:<148>, colval:<-60>
    ...
    [src/scip/heur_oneopt.c:383] debug: Only one shiftcand found, var <t_C167>, which is now shifted by<-1.0>
    k 0.1s| 1 | 0 | 132 | 258k| 0 | 14 | 30 | 13 | 13 | 30 | 51 | 39 | 0 | 0 | 3.026472e+03 | 3.164000e+03 | 4.54%
    [src/scip/heur_oneopt.c:436] debug: found feasible shifted solution:
    objective value: 3164.00000000012
    C157 1 (obj:171)
    C163 1 (obj:163)
    C164 1 (obj:69)
    C170 1 (obj:49)
    C172 1 (obj:258)
    C174 1 (obj:250)
    C175 1 (obj:500)
    C179 1 (obj:318)
    C181 1 (obj:318)
    C182 1 (obj:159)
    C183 1.00000000000038 (obj:318)
    C184 1 (obj:159)
    C185 1 (obj:318)
    C186 1 (obj:114)
    [src/scip/heur_oneopt.c:498] debug: Finished 1-opt heuristic
    ...
    static SCIP_RETCODE optimize(SCIP *scip, SCIP_SOL *worksol, SCIP_VAR **vars, int *blockstart, int *blockend, int nblocks, OPTTYPE opttype, SCIP_Real *activities, int nrows, SCIP_Bool *improvement, SCIP_Bool *varboundserr, SCIP_HEURDATA *heurdata)
    Definition: heur_twoopt.c:967
    static void reduced(TCLIQUE_GETWEIGHTS((*getweights)), TCLIQUE_ISEDGE((*isedge)), TCLIQUE_GRAPH *tcliquegraph, int *V, int nV, TCLIQUE_WEIGHT *apbound, int *tmpcliquenodes, int *ntmpcliquenodes, TCLIQUE_WEIGHT *tmpcliqueweight)
    #define debug(x)
    Definition: tclique_def.h:79

    How to add a debug solution

    Continuing the example above, we finish the solving process. The optimal solution can now be written to a file:

    SCIP> display solution
    objective value: 3089
    C157 1 (obj:171)
    C163 1 (obj:163)
    C164 1 (obj:69)
    C166 1 (obj:183)
    C170 1 (obj:49)
    C174 1 (obj:250)
    C177 1 (obj:500)
    C179 1 (obj:318)
    C181 1 (obj:318)
    C182 1 (obj:159)
    C183 1 (obj:318)
    C184 1 (obj:159)
    C185 1 (obj:318)
    C186 1 (obj:114)
    SCIP> write solution check/p0033.sol
    written solution information to file <check/p0033.sol>

    If we afterwards recompile SCIP with the additional compiler flag cmake -DDEBUGSOL=on (make DEBUGSOL=true in the Makefile system), set the parameter misc/debugsol = check/p0033.sol, and run SCIP again it will output:

    SCIP> read check/IP/miplib/p0033.mps
    original problem has 33 variables (33 bin, 0 int, 0 impl, 0 cont) and 16 constraints
    presolving:
    ***** debug: reading solution file <check/p0033.sol>
    ***** debug: read 15 non-zero entries

    Further debug output would only appear, if the solution was cut off in the solving process.