Skip to content

Commit 6a13030

Browse files
committed
Merge remote-tracking branch 'origin/performance-master' into strongbranching_dynamiclookahead_lognormal
2 parents 0a52338 + d4b04f1 commit 6a13030

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+27323
-661
lines changed

CHANGELOG

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ Features
2828
- added decomposition kernel search (DKS) heuristic (disabled by default). This heuristic implements a kernel search framework and can be used
2929
both as a construction heuristic as well as an improvement heuristic. In addition, existing decomposition information can be utilized by this heuristic.
3030
- symmetry detection does not treat implicit integer variables separately anymore, but computes symmetries based on the variable type inferred from variable bounds and implied integrality
31+
- when solving a SCIP problem with additional decomposition information (for example, when reading a DEC file) and enabling decomposition/applybenders,
32+
the problem is now solved in a Benders' decomposition relaxator; instead of decomposing the original SCIP instance, the relaxator builds the decomposed problem in
33+
sub-SCIPs and solves it via default Benders' Decomposition; a solution to the original (undecomposed) problem is now made available by the relaxator;
34+
the SCIP shell dialog "display statistics" now also prints the statistics from solving the Benders' decomposition in the relaxator
3135

3236
Performance improvements
3337
------------------------
@@ -68,6 +72,7 @@ Interface changes
6872
- the callback SCIP_DECL_EXPRINTEGRALITY, which returns the integrality of an expression, had its fourth argument change from SCIP_Bool* to SCIP_IMPLINTTYPE*, to represent implied integrality in nonlinear expressions, that is an implied integral type of an auxiliary variable if the expression were assigned to it
6973
- new event SCIP_EVENTTYPE_DUALBOUNDIMPROVED is generated whenever the global dual bound is improved
7074
- new event mask SCIP_EVENTTYPE_GAPUPDATED for catching updates in primal or dual bound
75+
- added new sorting functions SCIPsortRealPtrPtr(), ...
7176

7277
### Deleted and changed API methods
7378

@@ -87,6 +92,8 @@ Interface changes
8792
- SCIPexprSetIntegrality(): set argument generalized from SCIP_Bool integral to SCIP_IMPLINTTYPE integrality (4th position)
8893
- Temporarily for SCIP 10 only: Creating a variable SCIPcreateVar() with type SCIP_VARTYPE_IMPLINT creates a variable of type SCIP_VARTYPE_CONTINUOUS and implied integral type SCIP_IMPLINTTYPE_WEAK instead
8994
- Temporarily for SCIP 10 only: SCIPchgVarType() converts a call with type SCIP_VARTYPE_IMPLINT into a call of SCIPchgVarImplType() with type SCIP_IMPLINTTYPE_WEAK
95+
- SCIPapplyBendersDecomposition has been removed. This was originally used to apply Benders' decomposition from a
96+
supplied decomposition structure. The application of Benders' decomposition now occurs in benders_relax.
9097

9198
### New API functions
9299

@@ -127,6 +134,8 @@ Interface changes
127134
- added SCIPvarsCountTypes() to determine the variable type count distribution for an array of variables
128135
- added SCIPeventGetOldImplType() and SCIPeventGetNewImplType() to query the new event SCIP_EVENTTYPE_IMPLTYPECHANGED
129136
- added SCIPexprGetIntegrality(), which in addition to the existing function SCIPexprIsIntegral() provides information about the presence of weakly implied integral variables
137+
- added SCIPincludeRelaxBenders(), which is used to include the Benders' decomposition relaxator.
138+
- added SCIPgetMasterProblemRelaxBenders() for retrieving the master problem SCIP instance from the Benders' decomposition relaxator.
130139

131140
### Changes in preprocessor macros
132141

@@ -179,6 +188,11 @@ Interface changes
179188
"heuristics/dks/buckmaxgap", "heuristics/dks/maxlinkscore", "heuristics/dks/maxbuckfrac", "heuristics/dks/maxnodes",
180189
"heuristics/dks/usetwolevel", "heuristics/dks/usedecomp", "heuristics/dks/usebestsol", "heuristics/dks/redcostsort", "heuristics/dks/primalonly",
181190
"heuristics/dks/redcostlogsort", "heuristics/dks/objcutoff", and "heuristics/dks/runbinprobsonly" to control heuristic decomposition kernel search
191+
- new parameters "relaxing/benders/continueorig" and "relaxing/benders/nodelimit" for controlling the behaviour of the
192+
Benders' decomposition relaxator. The "continueorig" parameter indicates whether the original problem should continue
193+
solving after the completion of the Benders' decomposition algorithm if the problem is not solved to optimality. The
194+
"nodelimit" parameter allows the user to provide a node limit for the Benders' decomposition master problem (by
195+
default the limits from the original SCIP instance are copied to the master problem).
182196

183197
### Data structures
184198

@@ -285,15 +299,31 @@ Miscellaneous
285299

286300
- updated description of paramater misc/usesymmetry
287301

302+
@section RN923 SCIP 9.2.3
303+
*************************
304+
305+
Fixed bugs
306+
----------
307+
308+
Build system
309+
------------
310+
311+
### Cmake
312+
313+
### Makefile
314+
315+
Miscellaneous
316+
-------------
317+
288318
@section RN922 SCIP 9.2.2
289319
*************************
290320

291321
Fixed bugs
292322
----------
293323

294-
- fixed definition of slack variables of >= constraints and ranged rows in LP interface to Gurobi (lpi_grb.c)
324+
- fixed definition of slack variables of >= constraints and ranged rows in LP interface to Gurobi
295325
- free memory leaking singleton arrays for ignored variables in SCIPapplyHeurDualval()
296-
- use epsilon tolerance for bound implications of dual substitutions in dualPresolve() of cons_linear.c
326+
- use epsilon tolerance for bound implications of dual substitutions in dualPresolve() of cons_linear
297327
- fixed timeouts due to race conditions when using TPI=omp
298328
- fixed issues with indexing of concurrent solvers when a solver finishes (because SCIP is too fast) before others have been created when using TPI=tny
299329
- respect fixing if variable is declared binary in bounds section of mps file
@@ -302,16 +332,18 @@ Fixed bugs
302332
- adds missing NULL check for Benders' subproblems in feasalt cut
303333
- apply objective scale to pseudoboolean non-linear terms
304334
- impose pseudoboolean cost bound without intermediate casting
305-
- flatten aggregation graph before finishing presolving to accelerate evaluating an empty solution
306-
- respect fixed resultants in binvarGetActiveProbindex() of branch_relpscost.c
307-
- drop fixed resultants when copying pseudoboolean constraint to avert segmentation fault
308-
- correct matrix entry when resolving aggregated variables in checkSystemGF2() of cons_xor.c
309-
- corrected symmetry detection graph of cons_and.c, cons_or.c, and cons_xor.c
310-
- correct redundancy filter in consdataCreateRedundant() of cons_bounddisjunction.c
311-
- replaced unreliable comparison of node pointers by node numbers in prop_genvbounds.c
312-
- allocate memory for all integral variables to avoid segmentation faults in applyCliqueFixings() of heur_clique.c
335+
- flatten aggregation graph before finishing presolve to accelerate evaluating an empty solution
336+
- respect fixed resultants in binvarGetActiveProbindex() of branch_relpscost
337+
- drop fixed resultants when copying pseudoboolean constraint
338+
- correct matrix entry when resolving aggregated variables in checkSystemGF2() of cons_xor
339+
- corrected symmetry detection graph of cons_and, cons_or, cons_xor, and cons_indicator
340+
- correct redundancy filter in consdataCreateRedundant() of cons_bounddisjunction
341+
- replaced unreliable comparison of node pointers by node numbers in prop_genvbounds
342+
- allocate memory for all integral variables in applyCliqueFixings() of heur_clique
313343
- fix conflict resolution for one particular case in cons_indicator
314344
- make interface to nauty thread safe
345+
- use relative epsilon tolerance to check Farkas row in SCIPlpGetDualfarkas() to avoid invalid cutoff
346+
- fixed bug with SOS2 constraints of size that avoided a correct enforcing
315347

316348
Build system
317349
------------
@@ -329,9 +361,6 @@ Build system
329361
- fix use of SANITIZE=full for debug builds with GCC on Linux: removed -fsanitize=leak because it cannot be used together with -fsanitize=address
330362
- fix that make install SHARED=true missed to install libscipbase
331363

332-
Miscellaneous
333-
-------------
334-
335364
@section RN921 SCIP 9.2.1
336365
*************************
337366

@@ -346,7 +375,6 @@ Fixed bugs
346375
- added copy callbacks for presolvers dualagg and redvub, branching rules lookahead and cloud, primal heuristics dualval and repair, propagator nlobbt, and separators gauge and convexproj
347376
- respect maximal separation rounds setting by running remaining delayed separators in last round
348377
- replace terms consistently in applyFixings() of cons_linear to handle infinite aggregations
349-
- fixed bug with SOS2 constraints of size that avoided a correct enforcing
350378

351379
Build system
352380
------------

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_R
2121
set(SCIP_VERSION_MAJOR 10)
2222
set(SCIP_VERSION_MINOR 0)
2323
set(SCIP_VERSION_PATCH 0)
24-
set(SCIP_VERSION_API 142)
24+
set(SCIP_VERSION_API 143)
2525

2626
project(SCIP
2727
VERSION ${SCIP_VERSION_MAJOR}.${SCIP_VERSION_MINOR}.${SCIP_VERSION_PATCH}

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,7 @@ SCIPPLUGINLIBOBJ= scip/benders_default.o \
878878
scip/reader_tim.o \
879879
scip/reader_wbo.o \
880880
scip/reader_zpl.o \
881+
scip/relax_benders.o \
881882
scip/sepa_aggregation.o \
882883
scip/sepa_cgmip.o \
883884
scip/sepa_clique.o \

check/CMakeLists.txt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ set(settings_BendersQP
187187
"benders-qp"
188188
)
189189

190+
set(settings_BendersDec
191+
"usebenders-dec"
192+
)
193+
190194
set(settings_Decomp
191195
"decompheurs"
192196
"decompheurs_dps"
@@ -376,7 +380,7 @@ set(instances_Bilinrelax
376380
# PB instances
377381
#
378382
set(instances_PB
379-
"instances/PseudoBoolean/factor-mod-size=9-P0=67-P1=349-P2=67-P3=499-P4=79-P5=347-P6=307-B.opb\;3"
383+
"instances/PseudoBoolean/factor-mod-size=9-P0=263-P1=409-P2=29-P3=379-B.opb\;3"
380384
"instances/PseudoBoolean/normalized-bsg_10_4_5.opb\;-4"
381385
"instances/PseudoBoolean/normalized-mds_10_4_3.opb\;2"
382386
"instances/PseudoBoolean/normalized-mds_50_25_5.opb\;3"
@@ -483,9 +487,16 @@ set(instances_BendersLB
483487
)
484488

485489
set(instances_BendersQP
486-
"instances/Benders/classical_20_0.mps\;instances/Benders/classical_20.dec\;-8.22960761981176e-02"
487-
"instances/Benders/classical_30_0.mps\;instances/Benders/classical_30.dec\;-7.98150796362468e-02"
488-
"instances/Benders/classical_30_15.mps\;instances/Benders/classical_30.dec\;-7.34740783553289e-02"
490+
"instances/Benders/classical_20_0.mps\;instances/Benders/classical_20.dec\;-8.22958452550615e-02"
491+
"instances/Benders/classical_30_0.mps\;instances/Benders/classical_30.dec\;-7.98149452840201e-02"
492+
"instances/Benders/classical_30_15.mps\;instances/Benders/classical_30.dec\;-7.34739274330805e-02"
493+
)
494+
495+
set(instances_BendersDec
496+
"instances/Benders/cap41.lp\;instances/Benders/cap41.dec\;+1.24518068000000e+06"
497+
"instances/Benders/cap42.lp\;instances/Benders/cap42.dec\;+1.31282733250000e+06"
498+
"instances/Benders/cap43.lp\;instances/Benders/cap43.dec\;+1.37782733250000e+06"
499+
"instances/Benders/cap44.lp\;instances/Benders/cap44.dec\;+1.47532733250000e+06"
489500
)
490501

491502
set(instances_Decomp
@@ -667,7 +678,7 @@ if((${TEST_BENDERSQP} AND (NOT ${LPS} STREQUAL "msk" )) OR (NOT ${prefix} STREQU
667678
#
668679
# treat the instance as a tuple (list) of two values
669680
#
670-
if(NOT ((${basename} STREQUAL "classical_30_0.mps") AND (${LPS} STREQUAL "grb")))
681+
if(NOT ((${basename} STREQUAL "classical_30_0.mps") AND ((${LPS} STREQUAL "grb") OR (${LPS} STREQUAL "cpx"))))
671682
add_test(NAME ${prefix}-${setting}-${basename}
672683
COMMAND $<TARGET_FILE:scip> -c "set load ${PROJECT_SOURCE_DIR}/check/coverage/settings/${setting}.set read ${PROJECT_SOURCE_DIR}/check/${instpath} read ${PROJECT_SOURCE_DIR}/check/${decpath} opt validatesol ${optval} ${optval} q"
673684
)
@@ -677,7 +688,7 @@ if((${TEST_BENDERSQP} AND (NOT ${LPS} STREQUAL "msk" )) OR (NOT ${prefix} STREQU
677688
FAIL_REGULAR_EXPRESSION "ERROR|user parameter file <${PROJECT_SOURCE_DIR}/check/coverage/settings/${setting}.set> not found"
678689
DEPENDS scip-build
679690
)
680-
endif() # separation does not converge, #3724 (LPS=grb, BendersQP-benders-qp-classical_30_0.mps)
691+
endif() # separation does not converge, #3724 (LPS=grb or LPS=cpx, BendersQP-benders-qp-classical_30_0.mps)
681692
endforeach(setting)
682693
endforeach(instance)
683694
endif()
@@ -729,6 +740,7 @@ add_instancetests(instances_Benders settings_Benders "Benders")
729740
add_instancetests(instances_Or settings_Or "Or")
730741
add_instancetests(instances_BendersLB settings_BendersLB "BendersLB")
731742
add_decompinstancetests(instances_BendersQP settings_BendersQP "BendersQP")
743+
add_decompinstancetests(instances_BendersDec settings_BendersDec "BendersDec")
732744
add_decompinstancetests(instances_Decomp settings_Decomp "Decomp")
733745
add_pairtests(pairs_Issue "Issue")
734746

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# SCIP version 10.0.0
2+
3+
# should the variables be labelled for the application of Benders' decomposition?
4+
# [type: bool, advanced: FALSE, range: {TRUE,FALSE}, default: FALSE]
5+
decomposition/benderslabels = TRUE
6+
7+
# if a decomposition exists, should Benders' decomposition be applied?
8+
# [type: bool, advanced: FALSE, range: {TRUE,FALSE}, default: FALSE]
9+
decomposition/applybenders = TRUE
10+
11+
# frequency for calling primal heuristic <alns> (-1: never, 0: only at depth freqofs)
12+
# [type: int, advanced: FALSE, range: [-1,65534], default: 20]
13+
heuristics/alns/freq = -1
14+
15+
# frequency for calling primal heuristic <rens> (-1: never, 0: only at depth freqofs)
16+
# [type: int, advanced: FALSE, range: [-1,65534], default: 0]
17+
heuristics/rens/freq = -1
18+
19+
# should Benders' decomposition be used in LNS heurisics?
20+
# [type: bool, advanced: FALSE, range: {TRUE,FALSE}, default: TRUE]
21+
benders/default/lnscheck = FALSE

0 commit comments

Comments
 (0)