Solving Constraint Integer Programs

Release notes for SCIP 8.0

SCIP 8.0.1


  • clique lifting in cons_setppc (parameter enablecliquelifting) is only disabled if it has been applied
  • avoid warning if Mosek has reached/exceeded the objective limit
  • improved curvature check for quadratic expressions when extended formulations are disabled

Examples and applications

  • Fixed handling of enforcing in the TSP example.

Interface changes

Interfaces to external software

  • Added compatibility with Mosek 10.0.13.

Build system


  • avoid warnings about unrecognized compiler warning silencing options when compilation with GCC fails
  • adjust mosek find module to version 9.3
  • added cmake compatibility for ipopt versions 3.14.x


  • avoid warnings about unrecognized compiler warning silencing options when compilation with GCC fails
  • fixed that compilation with MS/Intel compilers on Windows and Cray compilers was broken when enabling PAPILO

Fixed bugs

  • fixed uninitialized array in detection of suborbitopes
  • Fixed problem with reading long lines in LP/FZN/OPB/Diff-files. The buffer is now reallocated, which also should be much faster.
  • fixed that recursive products in expressions were sometimes not flattened
  • fixed that expressions in original variables could not be simplified
  • fixed handling of objective limit with Mosek
  • made SCIPlpiGetSolverName()/SCIPlpiGetSolverDesc() thread-safe for LP Solvers (Cplex,Gurobi,Glop,Mosek,SoPlex,Xpress)
  • made SYMsymmetryGetName() thread-safe for Bliss
  • fixed memory allocation issue in detection of SOC nlhdlr
  • fixed that reaching the walltime limit in Ipopt was not handled properly
  • Deactivated dual fixing of unlocked variables with zero objective in presol_milp that SCIP is unable to postsolve.
  • set the column flag kImplInt for implicit integers in the papilo problem

SCIP 8.0.0


  • Variables that were marked as relaxation-only and that were not used in any solution (SCIP_SOL) are now deleted when during a restart.
  • New symmetry handling method, symmetry handling inequalities based on the Schreier Sims table, which is able to handle symmetries of arbitrary kinds of variables.
  • Revise way in which external memory (e.g., of LP-solver) is estimated.
  • The symmetry code can now heuristically search for orbitopes that do not completely handle a symmetry component and add certain Schreier Sims cuts to such components.
  • The LPIs for Gurobi and Mosek are thread-safe now.
  • The complete code is now thread-safe by default.
  • New separator to generate mixing cuts (works well for stochastic programming with probabilistic constraint).
  • New parsing routines for cons_orbisack and cons_symresack.
  • Variables can now be marked to forbid aggregation.
  • Heuristic PADM can now reoptimize found solution with original objective function.
  • Added code to support debugging of catching or releasing of variables to var.c (prints backtrace when catching and releasing).
  • SCIPintervalSin() and SCIPintervalCos() are now rounding-safe.
  • Removed special handling of second-order cones in undercover heuristic for now.
  • Removed use of Hessian sparsity pattern for nonquadratic nonlinear constraints in undercover heuristic.
  • Added reader for AMPL .nl files.
  • New separator sepa_rlt to compute cuts via the reformulation-linearization technique (RLT).
  • New separator sepa_minor to compute cuts from 2x2 minors of a violated semidefiniteness constraint that is implied by the extended formulation for bilinear products.
  • New separator sepa_interminor to compute intersection cuts from 2x2 (not only principle) minors of a violated rank-one constraint that is implied by the extended formulation for bilinear products.
  • Symmetry handling has been extended to detect also symmetries between variables that also appear in nonlinear constraints.
  • Improved OBBT propagator by only considering variables that are contained in at least one nonconvex expression that has an auxiliary variable.
  • Default parameter settings for NLP solves are now defined independently of the NLP solver.
  • Added table to print statistics on NLP solvers.
  • Knapsack, linear, logicor, setppc, and varbound constraints now add themselves to the NLP relaxation, if enabled. And, linking constraints and bounddisjunctions in one variable are added to the NLP relaxation now.
  • Ipopt interface now supports warmstarts from a full primal/dual solution pair.
  • Extended data structure SCIP_ROWPREP and routines to assemble a linear inequality before it is turned into a SCIP row and made it available via the API.
  • MIR procedure is now available for strengthening the Benders' optimality cut
  • SCIPbranchcandCalcLPCands() now also returns fractional variables in unbounded solutions.
  • New emphasis "benchmark" to avoid different solving paths that may come from checking remaining memory.
  • New plugin type for cut selection: users can now include their own cut selection rules, default rule moved to cutsel_hybrid.
  • New construction heuristic DPS which additionally needs a user-provided decomposition and splits the problem into several sub-SCIPs according to this decomposition. The sub-SCIPs are solved and updated repeatedly until a feasible solution of the original problem is found.


  • Removed support for expression types min and max for now. Removed support for expression type sign. Removed complex expression types sum, product, linear, quadratic, polynomial. Removed support for parameterized expressions.
  • Added support for expression types sin, cos, and entropy. Added an expression type that stores a SCIP variable.
  • Added handling of sin and cos expressions in OSiL reader.
  • Added handling of sin, cos, and tan expressions in ZIMPL reader.
  • Added expression handler plugin type, removed user expression type.
  • Replaced expressions, expression trees, and expression graphs by a new implementation of expressions.
  • Added differentiation methods (Gradients and Hessian directions) to expressions.
  • Added integrality information to expressions.
  • Added comparison and hashing of expressions.
  • Improved simplification of expressions and identification of common subexpressions, in particular terms that appear equally in several quadratic functions are now identified.
  • Expression simplification now expands powers also when the resulting exponents will be larger than 2.
  • Added table to print statistics on expression handlers.
  • Removed interval-arithmetic evaluation from expression interpreter (interfaces to automatic differentiation codes).
  • Hessians for user-provided expression handlers are not available in the NLP solver interfaces for now.
  • Sparse Hessians are now returned by expression interpreter. Removed dense Hessians.

Constraint handlers for NLP:

  • cons_nonlinear has been completely rewritten and now handles constraints of the form lhs <= expr <= rhs, where expr is an expression using the new expression type. A linear part of a nonlinear constraint is no longer distinguished.
  • Methods that work on a particular nonlinear structure are now implemented via nonlinear handlers (nlhdlr). These handlers are plugins of cons_nonlinear and interact with cons_nonlinear by detecting structures in expressions and providing propagation and separation mechanisms.
  • Added nlhdlr "default" as a mandatory nlhdlr: this is a nlhdlr that gets active on expressions that no other nlhdlr handles. It then uses the callbacks implemented in expression handlers to provide domain propagation and linear under/overestimates.
  • Added nlhdlr for quadratic expressions: domain propagation that was previously part of cons_quadratic; separation via intersection cuts (currently disabled).
  • Added nlhdlr for bilinear expressions: collects bilinear products and provides under/overestimation of a product over a 2D-projection of the LP.
  • Added nlhdlr for convex and concave expressions: detection of convex/concave subexpressions and linear under/overestimation.
  • Added nlhdlr for quotients: detects quotients, provides specialized linear under/overestimation and domain propagation for univariate quotients.
  • Added nlhdlr for perspective reformulations: detects expressions in semi-continuous variables and tightens linear under/overestimates of these expressions by applying a perspective transformation.
  • Added nlhdlr for second-order cones: detects second-order cone constraints (as ||x|| <= t or a quadratic that can written like that) and separates on a disaggregated reformulation (similar to cons_soc previously).
  • Removed constraint handlers abspower, bivariate, quadratic, and soc.
  • Removed simplification of duplicate abspower constraints for now. Removed simplification of abspower constraints with loose variables. Removed resolving of domain propagation (ConsResProp callback) and conflict analysis for abspower constraints. Removed propagation of varbounds for variables of abspower constraints. Removed reformulation of abs(x)^p * x into signpower expression for now.
  • Removed reformulation of SOC constraints when adding to the NLP. Removed possibility to add linearizations a la Glineur or BenTal&Nemirovski for SOC constraints.
  • Removed possibility to disaggregate quadratic constraints. Removed lifted tangent inequalities for bilinear terms in quadratic constraints. Removed option to project LP solution onto feasible region of a quadratic constraint via interior point or gauge function. Removed handling of unbounded LPs when enforcing quadratic constraints.
  • Removed construction of cuts from interval gradients for nonlinear constraints. Removed possibility to pretend that all nonlinear constraints are convex. Removed possibility to create local or non-initial nonlinear constraints for now.
  • Removed explicit reformulation of nonlinear constraints in presolve. An extended formulation is now generated implicitly and used to construct the LP relaxation, but the original formulation is used to check feasibility, propagate variable domains, etc. Variables that are added for the extended formulation are now marked as relaxation-only.
  • Improved locking of nonlinear variables in nonlinear constraints by taking monotonicity into account.
  • Improved mechanisms to detect and handle structures in nonlinear constraints, which allows for several algorithms to work simultaneously on equal or overlapping expressions.
  • Improved linearization of (sums of) products of binary variables, e.g., clique information is now taken into account. Removed option to linearize products between a binary and a non-binary variable.
  • Nonlinear constraints with the same function (but possibly different left- or right-hand-side) are now merged.
  • When a variable appears in only one concave less-or-equal constraint, it will be fixed to one of its bounds in more cases now.
  • New branching rule for variables in nonlinear constraints (implemented in cons_nonlinear) that scores candidates based on constraint violation, variable type, and pseudo-costs simultaneously.
  • Added tables to print statistics of nonlinear constraint handler and nonlinear handlers.

Performance improvements

  • Use the objective cutoff row as base row for separation in sepa_aggregation.c.
  • Separate lifted cover cuts based on newer lifting function of Letchford and Souli (2019) in sepa_aggregation.c.
  • In-tree restarts due to tree size estimation have been made compatible with orbital fixing.
  • Improved upgrade of orbisacks to packing/partitioning orbitopes.
  • Improved running time of symresack cover separation.
  • Improved propagation algorithm for orbisack and symresack.
  • Improved handling for expressions of type signpower in CppAD interface by making use of CppADs conditional expressions.
  • Faster reevaluation of Hessian for quadratic expressions in CppAD interface.
  • Enabled optimization of taped expressions in the CppAD interface.
  • Sparse Hessian evaluation for expressions with sparse Hessian in the CppAD interface.
  • Disabled branching on variables that are added for the extended formulation of a nonlinear constraint.
  • Prefer branching on variables in nonconvex terms of nonlinear constraints also if a cut could be generated but would yield a small reduction in the convexification gap only.
  • When violations of nonlinear constraints are tiny, the feasibility tolerance for the LP relaxation may now be reduced temporarily to allow for cuts to have an effect.
  • Improved under/overestimation of multidimensional vertex-polyhedral (e.g., multilinear or concave) functions by use of scaling and keeping the cut-generating LP around.
  • Products in nonlinear constraints are no longer disaggregated for the extended formulation.
  • No longer relax bounds of integral variables when computing bounds on activity in nonlinear constraints.
  • Revised and improved Ipopt interface.
  • Revised and improved subNLP primal heuristic, in particular choice of iteration limit and starting condition and reuse of subSCIP.
  • Merge strongcg into the gomory separator to avoid computing the same base equality twice. The files sepa_strongcg.{h|c} have been removed.
  • The RENS neighborhood in ALNS now fixes fractional variables if necessary for reaching its target fixing rate.
  • Use cpsolver emphasis in sepa_rapidlearning.
  • If decomposition/maxgraphedge = 0, the computation of the block graph is completely turned off.
  • Fixed a performance bug in cons_integral.c where rounding information was passed incorrectly to the generic diving algorithm.

Examples and applications

  • Add c++ Sudoku example
  • Removed circle.c and renamed string.c to spring.c in CallableLibrary example.
  • SCIP-Jack (Steiner tree application): Most files have been modified and many new ones have been added (code base more than doubled). Two new problem classes are supported: maximum-weight connected subgraph problem with budget constraints, partial-terminal node-weighted Steiner tree problem. Major performance improvements accross all problem classes that are supported.

Interface changes

New and changed callbacks

  • extend SEPAEXEC{LP,SOL} callbacks by parameter "depth", which should be used within separation instead of SCIPgetCurrentDepth()
  • extend SCIPseparateSolCutpool() by parameter "pretendroot", which is passed to SCIPcutpoolSeparate() instead of SCIPtreeGetCurrentDepth(scip->tree) == 0
  • added argument nvarexprs to SCIP_DECL_NONLINCONSUPGD to inform upgrade method about number of variables in constraint
  • replaced BMS_BLKMEM* blkmem argument of SCIP_DECL_NLPICOPY by SCIP* scip, removed targetnlpi argument
  • added SCIP* scip and SCIP_NLPIDATA** nlpidata arguments to SCIP_DECL_NLPIFREE
  • removed nquadelems, quadelems, exprvaridxs arguments from SCIP_DECL_NLPIADDCONSTRAINTS, changed exprtrees argument to exprs
  • removed nquadelems, quadelems, exprvaridxs arguments from SCIP_DECL_NLPISETOBJECTIVE, changed exprtree argument to expr

Deleted and changed API methods


  • SCIPhasNLPContinuousNonlinearity() now returns SCIP_RETCODE and has additional argument result
  • removed SCIPnlrowGetNQuadVars(), SCIPnlrowGetQuadVars(), SCIPnlrowSearchQuadVar(), SCIPnlrowGetNQuadElems(), SCIPnlrowGetQuadElems(), SCIPnlrowGetQuadData()
  • renamed SCIPnlrowGetExprtree() to SCIPnlrowGetExpr() and changed return type to SCIP_EXPR*
  • removed arguments nquadvars, quadvars, nquadelems, quadelems from SCIPcreateNlRow(); argument expr(ession) is now of type SCIP_EXPR*
  • removed SCIPaddQuadVarToNlRow(), SCIPaddQuadVarsToNlRow(), SCIPaddQuadElementToNlRow(), SCIPaddQuadElementsToNlRow(), SCIPchgNlRowQuadElement(), SCIPsetNlRowExprtreeParam(), SCIPsetNlRowExprtreeParams()
  • renamed SCIPsetNlRowExprtree() to SCIPsetNlRowExpr() and changed type of expr(tree) argument to SCIP_EXPR*
  • SCIPenableNLP() is no longer allowed in stages INITSOLVE and SOLVING
  • removed SCIPaddLinearConsToNlpHeurSubNlp()
  • SCIPhasNLPSolution() now returns true also if a infeasible solution to the NLP exists; SCIPcreateNLPSol() can now also be used when only an infeasible solution to the NLP exists
  • renamed SCIPsolveNLP() to SCIPsolveNLPParam() and added parameter SCIP_NLPPARAM param
  • removed SCIPsolveDiveNLP(), use SCIPsolveNLPParam() instead


Expression interpreter:

  • removed functions that operated with SCIPInterval
  • changed first argument of SCIPexprintCreate() to SCIP*
  • added SCIP* as first argument to SCIPexprintFree()
  • added SCIP* as first argument to SCIPexprintCompile(), changed third argument to SCIP_EXPR*, added fourth argument SCIP_EXPRINTDATA**
  • added arguments SCIP*, SCIP_EXPRINT*, and SCIP_EXPR* as first arguments to SCIPexprintFreeData()
  • renamed SCIPexprintGetExprtreeCapability() to SCIPexprintGetExprCapability(); added SCIP* as first argument, changed third argument to SCIP_EXPR*, added fourth argument SCIP_EXPRINTDATA*
  • removed SCIPexprintNewParametrization()
  • SCIPexprintEval(): added SCIP* as first argument, changed third argument to SCIP_EXPR*, added fourth argument SCIP_EXPRINTDATA*
  • removed SCIPexprintEvalInt()
  • SCIPexprintGrad(): added SCIP* as first argument, changed third argument to SCIP_EXPR*, added fourth argument SCIP_EXPRINTDATA*
  • removed SCIPexprintGradInt()
  • removed SCIPexprintHessianSparsityDense() and SCIPexprintHessianDense, use SCIPexprintHessianSparsity() and SCIPexprintHessian() instead


Expression tree:

  • removed SCIPexprtreeGetVars(), SCIPexprtreeSetVars(), SCIPexprtreeAddVars(), SCIPexprtreePrintWithNames(), SCIPexprtreeFindVar()
  • removed SCIPexprtreeGetRoot(), SCIPexprtreeGetNVars(), SCIPexprtreeGetNParams(), SCIPexprtreeGetParamVals(), SCIPexprtreeSetParamVal(), SCIPexprtreeHasParam()
  • removed SCIPexprtreeGetInterpreterData(), SCIPexprtreeSetInterpreterData(), SCIPexprtreeFreeInterpreterData()
  • removed SCIPexprtreeGetMaxDegree()
  • removed SCIPexprtreeEval(), use SCIPevalExpr() instead
  • removed SCIPexprtreeEvalInt(), use SCIPevalExprActivity() instead
  • removed SCIPexprtreePrint(), use SCIPprintExpr() instead
  • removed SCIPexprtreeCreate()
  • removed SCIPexprtreeCopy(), use SCIPduplicateExpr() instead
  • removed SCIPexprtreeFree(), use SCIPreleaseExpr() instead
  • removed SCIPexprtreeSetParams(), SCIPexprtreeGetVarsUsage()
  • removed SCIPexprtreeSimplify(), use SCIPsimplifyExpr() instead
  • removed SCIPexprtreeAddExpr()
  • removed SCIPexprtreeCheckCurvature(), use SCIPcomputeExprCurvature() instead
  • removed SCIPexprtreeSubstituteVars(), use SCIPcopyExpr() instead
  • removed SCIPquadelemSort(), SCIPquadelemSortedFind(), SCIPquadelemSqueeze()

Expression graph:

  • removed SCIPexprgraphCaptureNode(), use SCIPcaptureExpr() instead
  • removed SCIPexprgraphIsNodeEnabled()
  • removed SCIPexprgraphGetNodeNChildren(), use SCIPexprGetNChildren() instead
  • removed SCIPexprgraphGetNodeChildren(), use SCIPexprGetChildren() instead
  • removed SCIPexprgraphGetNodeNParents(), SCIPexprgraphGetNodeParents(), SCIPexprgraphGetNodeDepth(), SCIPexprgraphGetNodePosition()
  • removed SCIPexprgraphGetNodeOperator(), use SCIPexprGetHdlr() instead
  • removed SCIPexprgraphGetNodeOperatorIndex(), SCIPexprgraphGetNodeOperatorReal(), use SCIPexprGetData() instead
  • removed SCIPexprgraphGetNodeVar(), use SCIPgetVarExprVar() instead
  • removed SCIPexprgraphGetNodeRealPowerExponent(), SCIPexprgraphGetNodeIntPowerExponent(), SCIPexprgraphGetNodeSignPowerExponent(), use SCIPgetExponentExprPow() instead
  • removed SCIPexprgraphGetNodeLinearCoefs(), SCIPexprgraphGetNodeLinearConstant(), use SCIPgetCoefsExprSum(), SCIPgetConstantExprSum() instead
  • removed SCIPexprgraphGetNodeQuadraticConstant(), SCIPexprgraphGetNodeQuadraticLinearCoefs(), SCIPexprgraphGetNodeQuadraticQuadElements(), SCIPexprgraphGetNodeQuadraticNQuadElements(), use SCIPexprGetQuadraticData(), SCIPexprGetQuadraticQuadTerm(), SCIPexprGetQuadraticBilinTerm() instead
  • removed SCIPexprgraphGetNodePolynomialMonomials(), SCIPexprgraphGetNodePolynomialNMonomials(), SCIPexprgraphGetNodePolynomialConstant(), SCIPexprgraphGetNodePolynomialMonomialCurvature()
  • removed SCIPexprgraphGetNodeUserData(), SCIPexprgraphHasNodeUserEstimator()
  • removed SCIPexprgraphGetNodeBounds(), use SCIPexprGetActivity() instead
  • removed SCIPexprgraphGetNodeVal(), use SCIPexprGetEvalValue() instead
  • removed SCIPexprgraphGetNodeCurvature(), use SCIPexprGetCurvature() instead
  • removed SCIPexprgraphCreateNode()
  • removed SCIPexprgraphCreateNodeLinear(), use SCIPcreateExprSum() instead
  • removed SCIPexprgraphCreateNodeQuadratic(), use SCIPcreateExprQuadratic() instead
  • removed SCIPexprgraphCreateNodePolynomial(), SCIPexprgraphNodePolynomialAddMonomials()
  • removed SCIPexprgraphCreateNodeUser(), removed SCIPexprgraphNodeSplitOffLinear(), SCIPexprgraphMoveNodeParents()
  • removed SCIPexprgraphReleaseNode(), use SCIPreleaseExpr() instead
  • removed SCIPexprgraphFreeNode(), use SCIPreleaseExpr() instead
  • removed SCIPexprgraphEnableNode(), SCIPexprgraphDisableNode()
  • removed SCIPexprgraphHasNodeSibling(), SCIPexprgraphAreAllNodeChildrenVars(), SCIPexprgraphHasNodeNonlinearAncestor()
  • removed SCIPexprgraphPrintNode(), SCIPprintExpr() instead
  • removed SCIPexprgraphTightenNodeBounds()
  • removed SCIPexprgraphUpdateNodeBoundsCurvature(), use SCIPevalExprActivity() and SCIPcomputeExprCurvature() instead
  • removed SCIPexprgraphGetDepth(), SCIPexprgraphGetNNodes(), SCIPexprgraphGetNodes(), SCIPexprgraphGetNVars(), SCIPexprgraphGetVars()
  • removed SCIPexprgraphGetVarNodes(), SCIPexprgraphSetVarNodeValue(), SCIPexprgraphSetVarsBounds(), SCIPexprgraphSetVarBounds(), SCIPexprgraphSetVarNodeBounds(), SCIPexprgraphSetVarNodeLb(), SCIPexprgraphSetVarNodeUb(), SCIPexprgraphGetVarsBounds()
  • removed SCIPexprgraphCreate(), SCIPexprgraphFree()
  • removed SCIPexprgraphAddNode(), SCIPexprgraphAddVars(), SCIPexprgraphAddConst(), SCIPexprgraphAddExprtreeSum()
  • removed SCIPexprgraphReplaceVarByLinearSum(), SCIPexprgraphFindVarNode(), SCIPexprgraphFindConstNode()
  • replaced SCIPexprgraphPrintDot() by SCIPprintExprDotInit[2](), SCIPprintExprDot(), SCIPprintExprDotFinal()
  • removed SCIPexprgraphEval(), use SCIPevalExpr() instead
  • removed SCIPexprgraphPropagateVarBounds(), SCIPexprgraphPropagateNodeBounds()
  • removed SCIPexprgraphCheckCurvature(), use SCIPcomputeExprCurvature() instead
  • removed SCIPexprgraphSimplify(), use SCIPsimplifyExpr() instead
  • removed SCIPexprgraphGetTree(), SCIPexprgraphGetSeparableTrees(), SCIPexprgraphGetSubtreeVarsUsage(), SCIPexprgraphGetSumTreesNSummands(), SCIPexprgraphGetSumTrees()

Constraint handlers for NLP:

New API functions

Expression handler:


Expression iterator:

Constraint handlers for NLP:

Nonlinear Handler:


Cut Selector:

Command line interface

Interfaces to external software

  • removed GAMS interface (originally in interfaces/gams) and reading capability of gms reader; the removed interface was a poorly maintained copy of the GAMS/SCIP interface that is available at
  • integrated AMPL interface into main SCIP executable, that is, added possibility to use SCIP executable as solver in AMPL (AMPL calls solver with name of .nl file and -AMPL as arguments; SCIP will then attempt to solve the problem and write an AMPL solution file)
  • the ZIMPL interface has been updated to support ZIMPL 3.4.1; the minimal required ZIMPL version is now 3.4.1

Changed parameters

  • Extended range of parameter "misc/usesymmetry" from [0,3] to [0,7], changed default from 3 to 5
  • deleted parameter "constraints/orbitope/usedynamicprop"
  • changed type of parameter "propagating/symmetry/recomputerestart" from SCIP_Bool to int with range [0,2]
  • deleted parameter "propagating/symmetry/disableofrestart"
  • parameter "heuristics/padm/original" is now an advanced parameter
  • removed constraints/nonlinear/linfeasshift, constraints/nonlinear/reformulate, constraints/nonlinear/maxexpansionexponent, constraints/nonlinear/sepanlpmincont
  • removed constraints/nonlinear/upgrade/abspower
  • removed constraints/nonlinear/upgrade/and, use constraints/nonlinear/reformbinprodsand instead
  • removed constraints/nonlinear/upgrade/bivariate
  • removed constraints/nonlinear/upgrade/quadratic, use nlhdlr/quadratic/enabled instead
  • changed default of constraints/nonlinear/maxproprounds from 1 to 10
  • replaced constraints/nonlinear/enfocutsremovable by constraints/nonlinear/rownotremovable
  • replaced constraints/nonlinear/cutmaxrange by separating/maxcoefratiofacrowprep
  • removed constraints/quadratic/sepafreq, constraints/quadratic/propfreq, constraints/quadratic/proptiming, constraints/quadratic/eagerfreq, constraints/quadratic/maxprerounds, constraints/quadratic/delaysepa, constraints/quadratic/delayprop, constraints/quadratic/presoltiming
  • removed constraints/quadratic/replacebinaryprod, use constraints/nonlinear/reformbinprodsfac instead
  • removed constraints/quadratic/empathy4and, use constraints/nonlinear/reformbinprodsand instead
  • removed constraints/quadratic/binreforminitial, constraints/quadratic/binreformbinaryonly, constraints/quadratic/binreformmaxcoef
  • removed constraints/quadratic/cutmaxrange, constraints/quadratic/mincurvcollectbilinterms, constraints/quadratic/linearizeheursol, constraints/quadratic/checkcurvature, constraints/quadratic/checkfactorable, constraints/quadratic/checkquadvarlocks, constraints/quadratic/linfeasshift
  • removed constraints/quadratic/maxdisaggrsize, constraints/quadratic/disaggrmergemethod, constraints/quadratic/maxproprounds, constraints/quadratic/maxproproundspresolve, constraints/quadratic/enfolplimit, constraints/quadratic/sepanlpmincont, constraints/quadratic/enfocutsremovable
  • removed constraints/quadratic/gaugecuts, constraints/quadratic/interiorcomputation, constraints/quadratic/projectedcuts, constraints/quadratic/branchscoring, constraints/quadratic/usebilinineqbranch, constraints/quadratic/bilinineqmaxseparounds,
  • removed constraints/quadratic/minscorebilinterms, use nlhdlr/bilinear/enabled instead
  • removed constraints/quadratic/upgrade/linear, constraints/quadratic/upgrade/abspower, constraints/quadratic/upgrade/bivariate, constraints/quadratic/upgrade/bounddisjunction
  • removed constraints/quadratic/upgrade/soc, use nlhdlr/soc/enabled instead
  • renamed constraints/quadratic/upgrade/setppc to constraints/nonlinear/upgrade/setppc
  • removed constraints/abspower/sepafreq, constraints/abspower/propfreq, constraints/abspower/proptiming, constraints/abspower/eagerfreq, constraints/abspower/maxprerounds, constraints/abspower/delaysepa, constraints/abspower/delayprop, constraints/abspower/presoltiming
  • removed constraints/abspower/cutmaxrange, constraints/abspower/projectrefpoint, constraints/abspower/preferzerobranch, constraints/abspower/branchminconverror, constraints/abspower/addvarboundcons, constraints/abspower/linfeasshift, constraints/abspower/dualpresolve, constraints/abspower/sepainboundsonly, constraints/abspower/sepanlpmincont, constraints/abspower/enfocutsremovable
  • removed constraints/bivariate/sepafreq, constraints/bivariate/propfreq, constraints/bivariate/proptiming, constraints/bivariate/eagerfreq, constraints/bivariate/maxprerounds, constraints/bivariate/delaysepa, constraints/bivariate/delayprop, constraints/bivariate/presoltiming
  • removed constraints/bivariate/cutmaxrange, constraints/bivariate/linfeasshift, constraints/bivariate/maxproprounds, constraints/bivariate/ninitlprefpoints, constraints/bivariate/enfocutsremovable
  • removed constraints/soc/sepafreq, constraints/soc/propfreq, constraints/soc/proptiming, constraints/soc/eagerfreq, constraints/soc/maxprerounds, constraints/soc/delaysepa, constraints/soc/delayprop, constraints/soc/presoltiming
  • removed constraints/soc/projectpoint, constraints/soc/nauxvars, constraints/soc/glineur, constraints/soc/sparsify, constraints/soc/sparsifymaxloss, constraints/soc/sparsifynzgrowth, constraints/soc/linfeasshift, constraints/soc/nlpform, constraints/soc/sepanlpmincont, constraints/soc/enfocutsremovable, constraints/soc/disaggregate
  • removed constraints/soc/generalsocupgrade, use nlhdlr/soc/compeigenvalues instead
  • changed default of presolving/qpkktref/maxrounds from -1 to 0
  • changed default of propagating/obbt/onlynonconvexvars from FALSE to TRUE
  • changed default of heuristics/subnlp/resolvetolfactor from 0.001 to 1.0
  • removed heuristics/subnlp/nlpoptfile, use nlpi/ipopt/optfile instead
  • removed separating/convexproj/nlptimelimit
  • removed separating/gauge/nlptimelimit
  • removed heuristics/subnlp/nlptimelimit and heuristics/subnlp/nlpiterlimit
  • removed heuristics/subnlp/resolvetolfactor and heuristics/subnlp/resolvefromscratch
  • changed default of heuristics/subnlp/itermin to 20
  • renamed heuristics/subnlp/iteroffset to heuristics/subnlp/nodesoffset
  • renamed heuristics/subnlp/iterquotient to heuristics/subnlp/nodesfactor
  • removed heuristics/subnlp/runalways, use heuristics/subnlp/nodesoffset=INT_MAX and heuristics/subnlp/successrateexp = 0.0 instead
  • removed heuristics/subnlp/minimprove, heuristics/multistart/nlpminimpr
  • Removed parameters for strongcg separator: separating/strongcg/..., i.e., maxrounds, maxroundsroot, maxsepacutsroot, maxsepacuts, dynamiccuts. One can control the strongcg behavior throught the parameters of sepa_gomory.
  • renamed separating/{minortho,minorthoroot,objparalfac,intsupportfac} to cutselection/hybrid/{minortho,minorthoroot,objparalweight,intsupportweight}

New parameters

  • It is now possible to add orbitope constraints to handle symmetries even if not all variables in a component of the symmetry group are binary. This feature can be enabled using the parameter "propagating/symmetry/onlybinorbitope".
  • new parameter "propagating/symmetry/sstleaderrule" to select a rule for selecting the leader in SST cuts
  • new parameter "propagating/symmetry/ssttiebreakrule" to select a tiebreak rule for selecting the leader in SST cuts
  • new parameter "propagating/symmetry/sstleadervartype" to select the possible variable types for a leader in SST cuts
  • new parameter "propagating/symmetry/addconflictcuts" to control whether SST cuts are added if a binary leader variable is in conflict with a variable in its orbit
  • new parameter "propagating/symmetry/sstaddcuts" to control whether SST cuts are added
  • new parameter "propagating/symmetry/sstmixedcomponents" to control whether SST cuts are added if a symmetry component contains variables of different types
  • new parameter "propagating/symmetry/detectsubgroups" to search for orbitopes defined by subgroups
  • new parameter "propagating/symmetry/addweaksbcs" to add Schreier Sims cuts for a single variable orbit in case an orbitope subgroup is detected
  • new parameter "propagating/symmetry/addstrongsbcs" to add symretope facets for a single variable orbit on which the symmetry group acts like a symmetric group
  • new parameter "propagating/symmetry/maxnconsssubgroup" to control up to which number of constraints subgroups are detected
  • new parameter "propagating/symmetry/preferlessrows" to control whether orbitopes with smallest number of rows shall be computed by the subgroup detection heuristic
  • new parameter "propagating/symmetry/usedynamicprop" to control if rows of full orbitope shall be ordered dynamically in propagation
  • new parameter "separating/filtercutpoolrel" to control whether cutpool uses a dynamic strategy to separate only cuts with high relative efficacy
  • if run from AMPL: display/statistics to enable printing detailed solve statistics after solve
  • if run from AMPL: display/logfile to specify name of file to write SCIP log to (additionally to writing to stdout)
  • constraints/nonlinear/propauxvars, constraints/nonlinear/varboundrelax, constraints/nonlinear/varboundrelaxamount, constraints/nonlinear/conssiderelaxamount
  • constraints/nonlinear/vpmaxperturb, constraints/nonlinear/vpadjfacetthresh, constraints/nonlinear/vpdualsimplex
  • constraints/nonlinear/bilinmaxnauxexprs, constraints/nonlinear/forbidmultaggrnlvar, constraints/nonlinear/checkvarlocks, constraints/nonlinear/violscale
  • constraints/nonlinear/reformbinprods, constraints/nonlinear/reformbinprodsand, constraints/nonlinear/reformbinprodsfac
  • constraints/nonlinear/tightenlpfeastol, constraints/nonlinear/propinenforce, constraints/nonlinear/weakcutthreshold, constraints/nonlinear/strongcutmaxcoef, constraints/nonlinear/strongcutefficacy, constraints/nonlinear/forcestrongcut, constraints/nonlinear/enfoauxviolfactor, constraints/nonlinear/weakcutminviolfactor
  • constraints/nonlinear/branching/aux, constraints/nonlinear/branching/external, constraints/nonlinear/branching/highviolfactor, constraints/nonlinear/branching/highscorefactor, constraints/nonlinear/branching/violweight, constraints/nonlinear/branching/dualweight, constraints/nonlinear/branching/pscostweight, constraints/nonlinear/branching/domainweight, constraints/nonlinear/branching/vartypeweight, constraints/nonlinear/branching/scoreagg, constraints/nonlinear/branching/violsplit, constraints/nonlinear/branching/pscostreliable
  • constraints/nonlinear/linearizeheursol
  • nlhdlr/default/enabled
  • nlhdlr/convex/enabled, nlhdlr/convex/detectsum, nlhdlr/convex/extendedform, nlhdlr/convex/cvxquadratic, nlhdlr/convex/cvxsignomial, nlhdlr/convex/cvxprodcomp, nlhdlr/convex/handletrivial
  • nlhdlr/concave/enabled, nlhdlr/concave/detectsum, nlhdlr/concave/cvxquadratic, nlhdlr/concave/cvxsignomial, nlhdlr/concave/cvxprodcomp, nlhdlr/concave/handletrivial
  • nlhdlr/bilinear/enabled, nlhdlr/bilinear/useinteval, nlhdlr/bilinear/usereverseprop, nlhdlr/bilinear/maxseparoundsroot, nlhdlr/bilinear/maxseparounds, nlhdlr/bilinear/maxsepadepth
  • nlhdlr/perspective/enabled, nlhdlr/perspective/maxproprounds, nlhdlr/perspective/mindomreduction, nlhdlr/perspective/minviolprobing, nlhdlr/perspective/probingonlyinsepa, nlhdlr/perspective/probingfreq, nlhdlr/perspective/convexonly, nlhdlr/perspective/tightenbounds, nlhdlr/perspective/adjrefpoint
  • nlhdlr/quadratic/enabled, nlhdlr/quadratic/useintersectioncuts, nlhdlr/quadratic/usestrengthening, nlhdlr/quadratic/useboundsasrays, nlhdlr/quadratic/ncutslimit, nlhdlr/quadratic/ncutslimitroot, nlhdlr/quadratic/maxrank, nlhdlr/quadratic/mincutviolation, nlhdlr/quadratic/minviolation, nlhdlr/quadratic/atwhichnodes, nlhdlr/quadratic/nstrengthlimit, nlhdlr/quadratic/ignorebadrayrestriction, nlhdlr/quadratic/ignorehighre
  • nlhdlr/quotient/enabled
  • nlhdlr/soc/enabled, nlhdlr/soc/mincutefficacy, nlhdlr/soc/compeigenvalues
  • propagating/obbt/createlincons
  • propagating/symmetry/onlybinarysymmetry
  • separating/minor/priority, separating/minor/freq, separating/minor/maxbounddist, separating/minor/delay, separating/minor/expbackoff, separating/minor/maxminorsconst, separating/minor/maxminorsfac, separating/minor/mincutviol, separating/minor/maxrounds, separating/minor/maxroundsroot, separating/minor/ignorepackingconss
  • separating/rlt/priority, separating/rlt/freq, separating/rlt/maxbounddist, separating/rlt/delay, separating/rlt/expbackoff, separating/rlt/maxncuts, separating/rlt/maxunknownterms, separating/rlt/maxusedvars, separating/rlt/maxrounds, separating/rlt/maxroundsroot, separating/rlt/onlyeqrows, separating/rlt/onlycontrows, separating/rlt/onlyoriginal, separating/rlt/useinsubscip, separating/rlt/useprojection, separating/rlt/detecthidden, separating/rlt/hiddenrlt, separating/rlt/addtopool, separating/rlt/goodscore, separating/rlt/badscore, separating/rlt/objparalweight, separating/rlt/efficacyweight, separating/rlt/dircutoffdistweight, separating/rlt/goodmaxparall, separating/rlt/maxparall
  • separating/interminor/usestrengthening, separating/interminor/usebounds, separating/interminor/mincutviol, separating/interminor/maxrounds, separating/interminor/maxroundsroot
  • table/cons_nonlinear/active, table/nlhdlr/active, table/exprhdlr/active, table/nlpi/active, table/nlhdlr_bilinear/active, table/nlhdlr_quadratic/active
  • expr/log/minzerodistance, expr/pow/minzerodistance
  • benders/default/maxslackvarcoef to specify maximal coefficient for slack variables; if exceeded, slack variables are fixed to zero
  • nlpi/ipopt/optfile to specify name of Ipopt options file to use for every solve with Ipopt
  • nlpi/ipopt/print_level, nlpi/ipopt/hsllib, nlpi/ipopt/pardisolib, nlpi/ipopt/linear_solver, nlpi/ipopt/linear_system_scaling, nlpi/ipopt/nlp_scaling_method, nlpi/ipopt/mu_strategy, nlpi/ipopt/hessian_approximation
  • nlpi/ipopt/warm_start_push
  • timing/nlpieval
  • heuristics/subnlp/iterinit, heuristics/subnlp/ninitsolves, heuristics/subnlp/successrateexp
  • heuristics/subnlp/expectinfeas, heuristics/subnlp/opttol, heuristics/subnlp/feastolfactor
  • heuristics/subnlp/presolveemphasis, heuristics/subnlp/setcutoff
  • new parameters "branching/inference/conflictprio" and "branching/inference/cutoffprio" that allow using the different score criteria in inference branching hierarchically
  • new parameters "heuristics/alns/nodesquotmin", "heuristics/alns/maxcallssamesol" and "heuristics/alns/initduringroot" to control neighborhoods in ALNS
  • new parameter "benders/default/benderscut/optimality/mir" to control whether mixed-integer rounding procedure is applied to Benders optimality cuts
  • new parameter "misc/avoidmemout" to try to avoid running into memory limit
  • cutselection/hybrid/dircutoffdistweight, cutselection/hybrid/efficacyweight, cutselection/hybrid/intsupportweight, cutselection/hybrid/objparalweight, cutselection/hybrid/priority
  • new parameter "decomposition/disablemeasures" to disable expensive measures in SCIPcomputeDecompStats()
  • new parameter "presolving/milp/probfilename" filename to write the problem to a file before MILP presolving starts

Data structures

  • removed quadratic terms from NLROWs
  • removed class SCIPInterval
  • removed enum SCIP_EXPROP
  • removed union SCIP_EXPROPDATA, added SCIP_EXPRDATA
  • removed struct SCIP_EXPRTREE, use SCIP_EXPR instead
  • removed struct SCIP_USEREXPRDATA
  • added enum SCIP_MONOTONE
  • added enum SCIP_EXPRITER_TYPE
  • removed enum SCIP_BIVAR_CONVEXITY
  • added type SCIP_NLHDLR_METHOD
  • enum SCIP_NLPPARAM has been changed to a struct that holds values of parameters for an NLP solve
  • removed SCIP_NLPPAR_OPTFILE/optfile from SCIP_NLPPARAM
  • added SCIP_NLPTERMSTAT_INTERRUPT to SCIP_NLPTERMSTAT enum; returned from NLP solver if SCIPinterruptSolve() has been called
  • added evaltime to SCIP_NLPSTATISTICS

Deleted files

  • interfaces/gams/∗
  • interfaces/ampl/∗
  • src/nlpi/∗
  • src/scip/cons_bivariate.{c,h}
  • src/scip/pub_misc_nonlinear.h
  • src/scip/misc_nonlinear.c
  • src/scip/scip_nonlinear.{c,h}
  • src/scip/sepa_strongcg.{h|c}

Unit tests

  • added cons/linear/nonlinupgd.c
  • added cons/nonlinear/addcons.c
  • added cons/nonlinear/bilinhash.c
  • added cons/nonlinear/check.c
  • added cons/nonlinear/copy.c
  • added cons/nonlinear/create_nlrow.c
  • added cons/nonlinear/curvature.c
  • added cons/nonlinear/glbconss.c
  • added cons/nonlinear/hessian.c
  • added cons/nonlinear/locks.c
  • added cons/nonlinear/nlhdlr.c
  • added cons/nonlinear/nlhdlr_bilinear.c
  • added cons/nonlinear/nlhdlr_concave.c
  • added cons/nonlinear/nlhdlr_convex.c
  • added cons/nonlinear/nlhdlr_perspective.c
  • added cons/nonlinear/nlhdlr_quadratic.c
  • added cons/nonlinear/nlhdlr_quotient.c
  • added cons/nonlinear/nlhdlr_soc.c
  • added cons/nonlinear/parse.c
  • added cons/nonlinear/presolve.c
  • added cons/nonlinear/propagate.c
  • added cons/nonlinear/readers.c
  • added cons/nonlinear/reformbinprods.c
  • added cons/nonlinear/repair.c
  • added cons/nonlinear/transform.c
  • added cons/nonlinear/vertexpolyhedral.c
  • removed cons/nonlinear/getCoeffsAndConstantFromLinearExpr.c
  • removed cons/soc/upgrade.c
  • added expr/abs/estimation.c
  • added expr/commonsubexprs.c
  • added expr/compare.c
  • added expr/copy.c
  • added expr/cos/cos.c
  • added expr/cos/estimation.c
  • added expr/curvature.c
  • added expr/derivative.c
  • added expr/entropy/entropy.c
  • added expr/entropy/estimation.c
  • added expr/eval.c
  • added expr/exp/estimation.c
  • added expr/free.c
  • added expr/getvarexprs.c
  • added expr/hash.c
  • added expr/hessian.c
  • added expr/integrality.c
  • added expr/iterator.c
  • added expr/log/estimation.c
  • added expr/monotonicity.c
  • added expr/parse.c
  • added expr/pow/estimation.c
  • added expr/pow/pow.c
  • added expr/product/estimation.c
  • added expr/quad.c
  • added expr/simplify.c
  • added expr/sin/estimation.c
  • added expr/sin/sin.c
  • added expr/sum/estimation.c
  • added nlpi/exprinterpret.c
  • speedup test nlpi:solveQP in nlpi/nlpi.c
  • added test projection:transitivity in prob/obbt.c
  • added reader/nl.c
  • added test intervalarith:sincos in scip/intervalarith.c
  • added sepa/minor.c
  • added sepa/rlt/cuts.c
  • added sepa/rlt/product_detection.c
  • added sepa/rlt/separation.c
  • added tests test_compute_symmetry:expr{1,2,3,4} in symmetry/compute.c


Build system

  • the separate NLPI library has been integrated into the main SCIP library; uses of NLPILIBFILE or NLPILIBSRC in Makefiles that use make/make.project should be removed


  • replace flag PARASCIP by THREADSAFE
  • option AMPL is now ON by default
  • add -D_XOPEN_SOURCE=600 cflag for compilation on systems other than windows
  • add compile options directly instead of modifying CMAKE_C_FLAGS and CMAKE_CXX_FLAGS


  • prefix PKG_CONFIG_PATH with Ipopt's pkgconfig dir instead of postfixing
  • replace flag PARASCIP by THREADSAFE
  • flag AMPL is now true by default
  • libscip has been renamed to libscipbase and libscipsolver has been renamed to libscip in order to have the same library names for makefiles and cmake. For downward compatibility libscipsolver still exists (as a link).

Fixed bugs

  • fixed handling of multi-aggregation in cons_symresack and cons_orbisack
  • SCIPgetLowerbound() now consistently returns infinity when status is infeasible
  • improved the likelihood that a solution that satisfies the nonlinear constraints in the transformed (presolved) problem is also feasible for the original problem
  • worked around a problem with derivatives of pow at 0 with non-integer exponents in CppAD
  • fixed that setting of feasiblity and optimiality tolerance for NLP relaxation was overwritten with defaults when solving NLP
  • fixed variance computation in t-value computation in hypothesis testing of reliability branching
  • fixed potential overflow in cuts.c:evaluateLiftingFunctionKnapsack()
  • do not transfer dual reductions to main SCIP in sepa_rapidlearning if strong dual reductions are forbidden
  • fixed a bug in cons_setppc.c:removeDoubleAndSingletonsAndPerformDualpresolve() which led to wrong variable aggregations
  • added missing redundancy check to coefficient tightening routine in cons_varbound that led to wrong variable locks
  • added a check of numerics to avoid wrong reductions in cons_linear.c:simplifyInequalities()
  • fixed a bug in cons_logicor.c regarding fixed variables that were not removed
  • presol_milp.c handles variable fixings, suggested by PaPILO, more carefully to cover all cases that can appear
  • fixed several reproducability bugs that led to different solving paths across multiple runs with one SCIP environment
  • fixed check of limits/absgap, which was incorrectly applied to the scaled objective of the transformed problem


  • in LP, use absolute instead of relative tolerances to check whether solutions from LP solver are primal feasible
  • when a restart occurs, SCIP now asserts (during EXITSOLVE) that all relaxation-only variables are unlocked and only captured by the transformed problem.
  • Avoid redundant calls to LP solver when LP is already flushed and solved
  • In SCIPdebugMsg(), SCIPsetDebugMsg(), SCIPstatDebugMsg() strip directory from filename.
  • Recompute activity of rows when checking LP solutions instead of trusting the value given by the LP solver
  • The define NPARASCIP has been replaced by SCIP_THREADSAFE
  • Parameters are not reset to their default values before activating an emphasis setting; this now allows to combine different emphasis settings.
  • If a lazy bound is set to a value that is tighter than the current global bound, then the global bound is now tightened accordingly.

Known bugs