Scippy

    SCIP

    Solving Constraint Integer Programs

    Release notes for SCIP 10

    SCIP 10.0.0

    Features and Performance Improvements

    Exact Solving

    • added numerically exact solving mode for mixed-integer linear programs to the core framework including certification of branch-and-bound phase
    • core extensions:
      • new wrapper struct SCIP_RATIONAL for rational arithmetic currently based on Boost, GMP, and MPFR
      • new data structure SCIP_LPEXACT for handling rational LP relaxation and computing safe dual bounds
      • new interfaces to exact LP solvers SoPlex and QSopt_ex
      • safe dualproof version of conflict analysis
      • new data structure SCIP_CERTIFICATE for certificate printing/proof logging
    • new plugins:
      • new constraint handler "exactlinear" for handling linear constraints with rational data
      • new constraint handler "exactsol" to post-process and repair solutions from floating-point heuristics
    • plugins revised for numerically exact solving mode:
      • adjusted readers for MPS, LP, CIP, OPB/WBO, and ZIMPL files
      • extended presolver "milp" to perform rational presolving with PaPILO
      • adjusted constraint handler "integral" and default reliability pseudo-cost branching rule "relpscost"
      • extended Gomory cut separator to separate and certify numerically safe MIR cuts
      • adjusted all primal heuristics (except for five dedicated MINLP heuristics)
    • new interfaces to exact LP solvers SoPlex and QSopt_ex

    Symmetry Handling

    • added more techniques to handle reflection symmetries, in particular, for orbitopes with column reflections and matrices whose rows and columns can be permuted by a symmetry
    • Dejavu can be used to compute symmetries; the source code is shipped with SCIP and incorporates sassy
    • implemented symmetry detection callbacks for disjunction and superindicator constraint handlers
    • detailed information about applied symmetry handling techniques can be printed to the terminal
    • improve memory usage by introducing different constraint handlers for full orbitopes and packing/partitioning orbitopes
    • symmetry detection no longer treats implicit integer variables separately, but computes symmetries based on the variable type inferred from variable bounds and implied integrality
    • extended the statistics to also include information about the number of variables (per type) affected by symmetry
    • implemented method to compute new permutations from a given list of symmetry group generators
    • cons_orbisack, cons_orbitope_full, cons_orbitope_pp, and cons_symresack now try to replace the stored aggregated variables by active ones at the end of presolving; this should reduce the size of copies of the presolved problem
    • simplified symmetry detection graphs in case all edges have the same color

    Presolve

    • distinguish implicit integrality of variables into strong and weak type, depending on whether integrality is implied for all feasible or only at least one optimal solution
    • added a new presolver "implint", which detects implied integral variables by detecting (transposed) network submatrices in the problem; for now, this plugin is disabled by default
    • added support for (transposed) network matrix detection
    • allow multi-aggregation of unbounded slack variables, which may enable more bound tightening due to a reduction in the number of unbounded variables
    • resolve all fixings in xor constraints also for an available integer variable

    Conflict Analysis

    • added generalized resolution conflict analysis that operates directly on linear constraints instead of conflict graphs
    • disabled dualsol and dualray conflict upgrades to maintain conflict store
    • apply general conflict upgrades in conflict store

    Cutting Planes

    • added a new separator "flower" to generate flower cuts from AND constraints and nonlinear product expressions
    • added functionality to deal with hypergraphs by means of efficient access to vertices, edges, and intersections edges

    Primal Heuristics

    • added decomposition kernel search (DKS) heuristic (disabled by default), which implements a kernel search framework; it can be used both as a construction heuristic as well as an improvement heuristic; existing decomposition information can be utilized
    • reduced maximal fraction of diving LP iterations relative to total node LP iterations

    Branching

    • added a dynamic max-lookahead criterion for strong branching; a probability distribution is fitted to the observed candidate gains and evaluating further candidates stops when the expected tree-size reduction no longer justifies the LP evaluation cost
    • added new fields in history to store ancestral pseudo cost updates, used in the pseudo costs branching rule to compute discounted pseudo costs

    Nonlinearity

    • added an interface to the NLP solver CONOPT
    • implemented columnwise Jacobian sparsity computation in the NLP oracle
    • extended SOC detection to simple bilinear constraints, e.g., x*y >= 1

    Infeasibility Analysis

    • added the possibility to search for irreducible infeasible subsystems (IIS)
    • added new plugin type for finding irreducible infeasible subsystems (IIS)
    • new iisfinder plugin "greedy", which implements a greedy addition and deletion based algorithm with dynamic batch sizing

    Benders' Decomposition

    • when solving a problem with additional decomposition information (for example, when reading a DEC file) and enabling decomposition/applybenders, the problem is now solved in a Benders' decomposition relaxator; instead of decomposing the original SCIP instance, the relaxator builds the decomposed problem in sub-SCIPs and solves it via default Benders' Decomposition; a solution to the original (undecomposed) problem is now made available by the relaxator; the SCIP shell dialog "display statistics" now also prints the statistics from solving the Benders' decomposition in the relaxator
    • adds objective types for Benders' decomposition; the choices are to sum the subproblems objectives (classical approach) and to use the maximum of the subproblems objectives
    • the linking master variables for each Benders' decomposition subproblem are now stored; these can be accessed for the generation of cuts and setting up the subproblems

    Reading and Writing

    • added a new data structure SCIP_DATATREE that holds serializable data and a function to export to a JSON file
    • added ability to collect statistics from tables in a SCIP_DATATREE and write out as JSON file; dialog write statistics now writes a JSON file if name of file to write ends with .json
    • added writing support for AMPL NL writer: currently only general and specialized linear and nonlinear constraints can be written
    • added support for AND-constraints to GAMS writer
    • simplify expressions of nonlinear constraints in MPS and LP writing to increase chance that they are recognized as quadratic

    Applications

    • New application "PBSolver" to solve pseudoboolean instances in OPB and WBO format while complying with PB competition rules
    • Coloring: new parameter branching/coloring/strategy to choose the least/most fractional variable for branching

    Miscellaneous

    • do not allow non-root restarts when no global fixings were found
    • reimplemented SCIPvarGetActiveRepresentatives() by using dense arrays to avoid repeated resorting
    • avoid unnecessary calls of constraint handlers components, benders, benderslp, propagator genvbounds, and heuristics ofins, subnlp, nlpdiving, indicator
    • inlined SCIPgetStatus() to reduce computational overhead
    • variable data pointer are now copied if no copy routine was supplied
    • add check that parameter value pointers are unique, i.e., no two are the same

    Interface changes

    Deprecations

    • The variable type SCIP_VARTYPE_IMPLINT is deprecated in favor of a new enum SCIP_IMPLINTTYPE that indicates if a variable is implied integral, independent of the variable type. The problem variable arrays is still sorted as:
      (0) | binary | integer | implied integral | continuous | (nvars),
      where the implied integral subsection is now subdivided into 3 parts (left to right):
      | binary implied integral | integer implied integral | continuous implied integral |
      SCIP 10 still supports using SCIP_VARTYPE_IMPLINT for backward compatibility, see SCIPcreateVar() and SCIPchgVarType() for more details. SCIP 11 will remove SCIP_VARTYPE_IMPLINT.
    • SCIPsubversion() is deprecated and will be removed

    New and changed callbacks

    Deleted and changed API functions

    New API functions

    Exact Solving:

    Implicit Integrality:

    Symmetry Handling:

    Conflict Analysis:

    Branching:

    Cutting Planes:

    Benders' Decomposition:

    IIS:

    Hypergraphs:

    Network Matrix:

    Solve Statistics:

    • functions to create, modify, and free SCIP_DATATREE objects and to print as JSON or table (see pub_datatree.h and scip_datatree.h)
    • SCIPcollect*Statistics(): for every SCIPprint*Statistics() in scip_solvingstats.h
    • SCIPprintStatisticsJson(): output a JSON string of the table statistics data

    Nonlinearity:

    Miscellaneous:

    Data Structures

    Changes in Preprocessor Macros

    • SCIP_EVENTTYPE_TYPECHANGED: no longer generated if a variable becomes implied integral
    • SCIP_EVENTTYPE_IMPLTYPECHANGED: new event that is generated if a variable is declared implied integral, this event is included in the set SCIP_EVENTTYPE_VARCHANGED
    • SCIP_EVENTTYPE_DUALBOUNDIMPROVED: new event that is generated whenever the global dual bound is improved
    • SCIP_EVENTTYPE_GAPUPDATED: new event mask for catching updates in primal or dual bound
    • SCIP_PROPTIMING_NONE: new propagator timing for never calling a propagator
    • SCIP_HEURTIMING_NONE: new heuristic timing for never call a primal heuristic
    • strcasecmp, strncasecmp (Windows builds): removed #define from scip/def.h; use SCIPstrcasecmp() and SCIPstrncasecmp() instead
    • SCIP_VERSION_SUB, SCIP_SUBVERSION: deprecated
    • SCIP_VARTYPE_IMPLINT_CHAR: removed
    • NO_RAND_R: removed its use

    SCIP Shell

    • help <command> now allows to display information on specific command
    • allow to hide certain commands in the help list
    • added the (hidden) command "exit" to exit the shell
    • added command iis to create an infeasible subsystem
    • added write/iis dialog to write out the infeasible subsystem to file
    • added display/iis dialog to write out the infeasible subsystem to console

    Changed parameters

    • heuristics/scheduler/heurtimelimit removed to avoid indeterministic behavior of scheduler heuristic, uses main time limit instead
    • removed parameters constraints/orbitope/checkpporbitope, constraints/orbitope/sepafullorbitope, constraints/orbitope/forceconscopy, which became superfluous
    • removed reading/gmsreader/signpower
    • removed benders/default/numthreads: multi-threading support for Benders' decomposition has been temporarily disabled
    • restricted range of parameter propagating/symmetry/sstleadervartype to [1,7]; its new default value is 6
    • propagating/∗/timingmask extended by setting 0 to disable propagators completely
    • changed defaults of constraints/components/propfreq and constraints/components/maxdepth to -1 and 2147483647, respectively, to avoid unnecessary calls of components propagator by default
    • changed frequencies for the following heuristics: shifting, gins, crossover, rins, randrounding
    • changed default maxlpiterquot to 0.05 for all LP diving heuristics and feaspump, whereas adaptivediving uses 0.15 and rootsoldiving remains at 0.01
    • changed default of presolving/restartminred to 0.05
    • changed default of presolving/immrestartfac to 0.05
    • removed parameters propagating/symmetry/{nautymaxncells,nautymaxnnodes}
    • updated description of parameter misc/usesymmetry

    New parameters

    • exact/enable: enable exact solving mode
    • exact/improvingsols: whether only improving exact solutions should be considered
    • exact/safedbmethod: method of safe dual bounding
    • exact/interleavedbstrat: interleaving strategy between safe dual bounding and exact LP solving
    • exact/psdualcolselection: project-and-shift strategy of dual column selection
    • exact/cutapproxmaxboundval: maximal absolute bound for which coefficients in exact cuts should be approximated
    • exact/cutmaxdenom: maximal denominator of coefficients in approximating exact cuts
    • exact/allownegslack: whether negative slack variables in exact Gomory cuts should be used
    • exact/lpinfo: whether the exact LP solver should display status messages
    • constraints/exact{linear,sol}/{sepafreq,propfreq,proptiming,eagerfreq,maxprerounds,delaysepa,delayprop,presoltiming}: functionality of constraint handlers exactlinear and exactsol
    • constraints/exactlinear/sortvars: whether binary variable coefficients should be sorted with decreasing absolute value in exactlinear constraints
    • constraints/exactlinear/{tightenboundsfreq,propcont,limitdenom,boundmaxdenom}: propagation of exactlinear constraints
    • constraints/exactlinear/{maxrounds,maxroundsroot,maxsepacuts,maxsepacutsroot}: separation of exactlinear constraints
    • constraints/exactsol/solbufsize: size of solution buffer in exactsol handler
    • constraints/exactsol/{minimprove,checkfpfeasibility,checkcontimplint,abortfrac,unfixfrac}: solution processing in exactsol handler
    • constraints/exactsol/maxstalls: maximal number of consecutive unsuccessful reparations in exactsol handler
    • certificate/filename, certificate/maxfilesize: certificate file
    • branching/pscost/discountfactor, branching/relpscost/discountfactor: discount factor for ancestral pseudo costs in pscost and relpscost branching rules
    • branching/collectancpscost: enable/disable recording of ancestral pseudo costs
    • branching/relpscost/dynamiclookahead, branching/relpscost/dynamiclookaheadquot, branching/relpscost/dynamiclookdistribution, branching/relpscost/minsamplesize: configure the dynamic max-lookahead criterion for strong branching: enable flag, fraction threshold, distribution choice, and minimum sample size
    • constraints/cumulative/maxtime: limit the time horizon and avoid integer overflow for unbounded variables
    • constraints/orbitope_full/forceconscopy, constraints/orbitope_pp/forceconscopy: whether non-model constraints of type full orbitope and packing/partitioning orbitope are copied to sub-SCIPs, respectively
    • propagating/symmetry/handlesignedorbitopes: whether to apply special symmetry handling techniques for orbitopes whose columns can be (partially) reflected
    • propagating/symmetry/usesimplesgncomp: whether symmetry components all of whose variables are simultaneously reflected by a symmetry shall be handled by a special inequality
    • propagating/symmetry/dispsyminfo: whether to print information about applied symmetry handling methods
    • propagating/symmetry/nautymaxlevel: limit on depth level of Nauty's search tree
    • presolving/implint/convertintegers: whether implied integrality should also be detected for enforced integral variables
    • presolving/implint/columnrowratio: ratio of rows/columns where the row-wise network matrix detection algorithm is used instead of the column-wise network matrix detection algorithm
    • presolving/implint/numericslimit: limit for absolute integral coefficients beyond which the corresponding rows and variables are excluded from implied integrality detection
    • write/implintlevel: whether integrality constraints should be written for implied integral variables (regarded by cip, mps, lp, rlp, pip, fzn, and gms writers)
    • iis/∗
    • presolving/milp/enablecliquemerging: whether to enable clique merging in PaPILO
    • presolving/milp/maxedgesparallel: maximal number of edges in the parallel clique merging graph
    • presolving/milp/maxedgessequential: maximal number of edges in the sequential clique merging graph
    • presolving/milp/maxcliquesize: maximal size of cliques considered for clique merging
    • presolving/milp/maxgreedycalls: maximal number of greedy max clique calls in a single thread
    • heuristics/dks/∗: heuristic decomposition kernel search
    • relaxing/benders/continueorig: whether original problem should continue solving after the completion of the Benders' decomposition algorithm in the Benders' relaxator, if the problem is not solved to optimality
    • relaxing/benders/nodelimit: node limit for the Benders' decomposition master problem in the Benders' relaxator; by default the limits from the original SCIP instance are copied
    • conflict/usegenres, conflict/reduction, conflict/mbreduction, conflict/maxvarsfracres, conflict/resfuiplevels, conflict/fixandcontinue, conflict/maxcoefquot: control generalized resolution conflict analysis
    • lp/minsolvedepth: lower bound on the depth at which LPs are solved
    • reading/opbreader/maxintsize: maximal intsize above which an OPB instance is rejected
    • reading/nlreader/binary, reading/nlreader/comments: adjust writing of nl files
    • nlpi/conopt/priority: priority of the CONOPT NLP solver
    • randomization/randomseedshiftmultiplier: multiplier for the shift set by `randomization/randomseedshift; the shift is multiplied by (6*randomseedshiftmultiplier+1), with the default value for randomseedshiftmultiplier set to 10 now; this default value is expected to change with every major release; setting the parameter to 0 restores SCIP 9 behavior

    Other Changes

    • removed LP solver interface lpi_spx1, which used the old SoPlex interface; renamed lpi_spx2 to lpi_spx
    • removed cons_abspower.{h,c}, cons_quadratic.{h,c}, and cons_soc.{h,c}

    Build system

    • new option SYM=dejavu to choose Dejavu for computing symmetries
    • changed the default for TPI to tny
    • added build flag CHECKSTAGE=auto to control stage checks in API function calls
    • removed LPS options spx1 and spx2, only LPS=spx is available to select SoPlex now
    • removed previously deprecated PARASCIP option, use THREADSAFE=false instead to disable thread-safety

    Makefile

    • added build flag EXACTSOLVE=<true|false|auto> to turn exact solving mode on, off, or turn it on if all necessary dependencies are available
    • added build flag MPFR (default: false) to link with the multiprecision floating-point library, needed when SoPlex is also built with MPFR=true for precision boosting in rational solving mode
    • added build flag CONOPT (default: false) to link to the CONOPT NLP solver
    • link-time-optimization can be enabled on Linux and macOS with gcc and clang by setting LTO=true, default is false
    • revised SANITIZE options: removed SANITIZE=full, added SANITIZE=thread, SANITIZE=address, and SANITIZE=memory to enable thread, address, and memory sanitizers, respectively, in addition to undefined behavior sanitizer; changed default to SANITIZE=false
    • default settings for makefile variables in make.project are now only used if variable hasn't been set already
    • the symlink /include/papilo should now point to the src subdirectory of a PaPILO repository or the headers directory of a PaPILO installation without TBB; pointing to the directory of a PaPILO repository still works, but is deprecated
    • removed option to link TBB library, as this is not used by default when PaPILO has not been built via cmake (use USRCXXFLAGS=-DPAPILO_TBB USRLDFLAGS=-ltbb to enable TBB for PaPILO)
    • LPS=spx is no longer mapped to LPS=spx2, which changes the name of the generated LPI libraries and binaries when using SoPlex
    • removed OPENSOURCE flag

    Cmake

    • added build flag EXACTSOLVE=<on|off|auto> to turn exact solving mode on, off, or turn it on if all necessary dependencies are available
    • added build flag CONOPT (default: off) to link to the CONOPT NLP solver and variable CONOPT_DIR to specify the path to CONOPT
    • link-time-optimization can be enabled if supported by compiler by using -DLTO=on, default is off
    • replaced SANITIZE_XYZ=(on|off) options by SANITIZE=(on|off|thread|address|memory); undefined behavior sanitizer is always enabled if not SANITIZE=off (the default)
    • increased minimal required cmake version to 3.11
    • scip-config.cmake now defines a variable SCIP_COMPILE_FLAGS, which could be used to compile code that builds against SCIP via cmake; currently, this only passes on the sanitizer flags that were used to build libscip
    • removed automatic download and build of Bliss during cmake configuration when -DSYM=(s)bliss; a Bliss installation from https://github.com/scipopt/bliss can be specified with -DBLISS_DIR
    • removed option LEGACY

    Fixed bugs

    • fixed bug related to unreleased data for the Benders' decomposition framework; when reading an SMPS file and applying Benders' decomposition, data is created that was not correctly released; also, data within the Benders' decomposition framework was not appropriately reset; the data is now released/reset as expected
    • to fix a bug where duplicate cuts from different constraint handlers were not recognized, SCIPrealHash() was changed to be stable around shortly representable numbers, and a numerical tolerance for comparing cutting plane efficacy for the aggregation separator is introduced
    • accept fractional continuous implied integral variables in heuristic "completesol"
    • invalidate activity with contradicting infinity contributions
    • avoid integer overflow in cumulative constraints triggered by unbounded variables, see new parameter constraints/cumulative/maxtime
    • allow negative update in SCIPconsAddUpgradeLocks() to unlock constraint upgrade
    • fixed memory leaks when LP, MPS, and OPB/WBO readers abort unsuccessfully
    • removed erroneous catching of objective-changed events in intobj separator; instead, the separator no longer executes within probing with changed objective function
    • propagator dualfix no longer fixes variables to infinity to avoid issues when transferring the solution to the original problem
    • track and check bounds on the coefficients that is used for a variable in aggregations of other variables to improve numerical stability
    • corrected the upgrade of full orbitopes to packing/partitioning orbitopes in case the orbitopal symmetries form a proper subgroup of a component's symmetry group
    • aggregate integer variable to not in clique variable in cliquePresolve() of xor constraints to avoid infeasible solutions
    • fixed memory leak in dynamic partition search primal heuristic
    • fixed issue with file existence check in XML parser when SCIP was build with ZLIB support on Windows
    • fixed thread-safety issue when using CppAD and user-defined expression handler
    • fixed typo in #pragma directive of redistributed nauty.h

    Miscellaneous

    • removed 4th number in SCIP version; the new format is major.minor.patch
    • changed sassy to the version included in Dejavu
    • updated ampl/mp to v4.0.3
    • the CIP reader now sets an objective offset instead of adding a variable fixed to the objective offset
    • the solchecker tool has been extended for rational values
    • SCIPclassifyConstraintTypesLinear() classify a varbound only when a binary variable is present
    • the internal limit MAXGENNUMERATOR has been increased to allow more generators of symmetry groups, especially for problems with many variables