Scippy

SCIP

Solving Constraint Integer Programs

pub_misc_rowprep.h
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and library */
4/* SCIP --- Solving Constraint Integer Programs */
5/* */
6/* Copyright (c) 2002-2024 Zuse Institute Berlin (ZIB) */
7/* */
8/* Licensed under the Apache License, Version 2.0 (the "License"); */
9/* you may not use this file except in compliance with the License. */
10/* You may obtain a copy of the License at */
11/* */
12/* http://www.apache.org/licenses/LICENSE-2.0 */
13/* */
14/* Unless required by applicable law or agreed to in writing, software */
15/* distributed under the License is distributed on an "AS IS" BASIS, */
16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17/* See the License for the specific language governing permissions and */
18/* limitations under the License. */
19/* */
20/* You should have received a copy of the Apache-2.0 license */
21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file pub_misc_rowprep.h
26 * @brief preparation of a linear inequality to become a SCIP_ROW
27 * @ingroup PUBLICCOREAPI
28 * @author Stefan Vigerske
29 * @author Benjamin Mueller
30 * @author Felipe Serrano
31 */
32
33/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
34
35#ifndef __SCIP_PUB_MISC_ROWPREP_H__
36#define __SCIP_PUB_MISC_ROWPREP_H__
37
38#include "scip/type_misc.h"
39#include "scip/type_cons.h"
40#include "scip/type_lp.h"
41#include "scip/type_sepa.h"
42#include "scip/type_var.h"
43
44#ifdef NDEBUG
45#include "scip/struct_misc.h"
46#endif
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52/**@defgroup RowPrep Linear Inequality
53 * @ingroup DataStructures
54 * @brief a linear inequality that is prepared to become a SCIP_ROW
55 *
56 * This data structure helps to work around some limitations of SCIP_ROW's, in particular,
57 * that it rounds coefficients or sides close to integral values without the appropriate care.
58 * On the other hand, a SCIP_ROWPREP is limited to inequalities.
59 *
60 *@{
61 */
62
63/** creates a SCIP_ROWPREP datastructure
64 *
65 * Initial row represents 0 ≤ 0.
66 */
67SCIP_EXPORT
69 SCIP* scip, /**< SCIP data structure */
70 SCIP_ROWPREP** rowprep, /**< buffer to store pointer to rowprep */
71 SCIP_SIDETYPE sidetype, /**< whether cut will be or lower-equal or larger-equal type */
72 SCIP_Bool local /**< whether cut will be valid only locally */
73 );
74
75/** frees a SCIP_ROWPREP datastructure */
76SCIP_EXPORT
78 SCIP* scip, /**< SCIP data structure */
79 SCIP_ROWPREP** rowprep /**< pointer that stores pointer to rowprep */
80 );
81
82/** creates a copy of a SCIP_ROWPREP datastructure */
83SCIP_EXPORT
85 SCIP* scip, /**< SCIP data structure */
86 SCIP_ROWPREP** target, /**< buffer to store pointer of rowprep copy */
87 SCIP_ROWPREP* source /**< rowprep to copy */
88 );
89
90/** gives number of terms in rowprep */
91SCIP_EXPORT
93 SCIP_ROWPREP* rowprep /**< rowprep */
94 );
95
96/** gives variables of rowprep (feel free to modify) */
97SCIP_EXPORT
99 SCIP_ROWPREP* rowprep /**< rowprep */
100 );
101
102/** gives coefficients of rowprep (feel free to modify) */
103SCIP_EXPORT
105 SCIP_ROWPREP* rowprep /**< rowprep */
106 );
107
108/** gives side of rowprep */
109SCIP_EXPORT
111 SCIP_ROWPREP* rowprep /**< rowprep */
112 );
113
114/** gives kind of inequality of rowprep */
115SCIP_EXPORT
117 SCIP_ROWPREP* rowprep /**< rowprep */
118 );
119
120/** returns whether rowprep is locally valid only */
121SCIP_EXPORT
123 SCIP_ROWPREP* rowprep /**< rowprep */
124 );
125
126/** returns name of rowprep (feel free to modify) */
127SCIP_EXPORT
129 SCIP_ROWPREP* rowprep /**< rowprep */
130 );
131
132/** returns number of variables which coefficients were modified in cleanup */
133SCIP_EXPORT
135 SCIP_ROWPREP* rowprep /**< rowprep */
136 );
137
138/** returns variables which coefficients were modified in cleanup */
139SCIP_EXPORT
141 SCIP_ROWPREP* rowprep /**< rowprep */
142 );
143
144/** resets rowprep to have 0 terms and side 0.0 */
145SCIP_EXPORT
147 SCIP_ROWPREP* rowprep /**< rowprep */
148 );
149
150/** sets coefficient idx of rowprep */
151SCIP_EXPORT
153 SCIP_ROWPREP* rowprep, /**< rowprep */
154 int idx, /**< index of coef to set */
155 SCIP_Real newcoef /**< new coefficient */
156 );
157
158/** adds constant value to side of rowprep */
159SCIP_EXPORT
161 SCIP_ROWPREP* rowprep, /**< rowprep */
162 SCIP_Real side /**< constant value to be added to side */
163 );
164
165/** adds constant term to rowprep
166 *
167 * Substracts constant from side.
168 */
169SCIP_EXPORT
171 SCIP_ROWPREP* rowprep, /**< rowprep */
172 SCIP_Real constant /**< constant value to be added */
173 );
174
175/** sets side type of rowprep */
176SCIP_EXPORT
178 SCIP_ROWPREP* rowprep, /**< rowprep */
179 SCIP_SIDETYPE sidetype /**< new side type */
180 );
181
182/** sets whether rowprep is local */
183SCIP_EXPORT
185 SCIP_ROWPREP* rowprep, /**< rowprep */
186 SCIP_Bool islocal /**< whether rowprep is local */
187 );
188
189/** enables recording for where modifications were done in cleanup */
190SCIP_EXPORT
192 SCIP_ROWPREP* rowprep /**< rowprep */
193 );
194
195#ifdef NDEBUG
196/* If NDEBUG is defined, the function calls are overwritten by defines to reduce the number of function calls and
197 * speed up the algorithms.
198 */
199#define SCIProwprepGetNVars(rowprep) (rowprep)->nvars
200#define SCIProwprepGetVars(rowprep) (rowprep)->vars
201#define SCIProwprepGetCoefs(rowprep) (rowprep)->coefs
202#define SCIProwprepGetSide(rowprep) (rowprep)->side
203#define SCIProwprepGetSidetype(rowprep) (rowprep)->sidetype
204#define SCIProwprepIsLocal(rowprep) (rowprep)->local
205#define SCIProwprepGetName(rowprep) (rowprep)->name
206#define SCIProwprepGetNModifiedVars(rowprep) (rowprep)->nmodifiedvars
207#define SCIProwprepGetModifiedVars(rowprep) (rowprep)->modifiedvars
208#define SCIProwprepSetCoef(rowprep, idx, newcoef) ((rowprep)->coefs[idx] = (newcoef))
209#define SCIProwprepAddSide(rowprep, sideadd) ((rowprep)->side += (sideadd))
210#define SCIProwprepAddConstant(rowprep, constant) SCIProwprepAddSide(rowprep, -(constant))
211#define SCIProwprepSetSidetype(rowprep, sidetype_) (rowprep)->sidetype = sidetype_
212#define SCIProwprepSetLocal(rowprep, islocal) (rowprep)->local = islocal
213#define SCIProwprepRecordModifications(rowprep) (rowprep)->recordmodifications = TRUE
214#endif
215
216/** prints a rowprep */
217SCIP_EXPORT
219 SCIP* scip, /**< SCIP data structure */
220 SCIP_ROWPREP* rowprep, /**< rowprep to be printed */
221 FILE* file /**< file to print to, or NULL for stdout */
222 );
223
224/** prints a rowprep and values in solution */
225SCIP_EXPORT
227 SCIP* scip, /**< SCIP data structure */
228 SCIP_ROWPREP* rowprep, /**< rowprep to be printed */
229 SCIP_SOL* sol, /**< solution for activity */
230 FILE* file /**< file to print to, or NULL for stdout */
231 );
232
233/** ensures that rowprep has space for at least given number of additional terms
234 *
235 * Useful when knowing in advance how many terms will be added.
236 */
237SCIP_EXPORT
239 SCIP* scip, /**< SCIP data structure */
240 SCIP_ROWPREP* rowprep, /**< rowprep */
241 int size /**< number of additional terms for which to alloc space in rowprep */
242 );
243
244/** adds a term coef*var to a rowprep */
245SCIP_EXPORT
247 SCIP* scip, /**< SCIP data structure */
248 SCIP_ROWPREP* rowprep, /**< rowprep */
249 SCIP_VAR* var, /**< variable to add */
250 SCIP_Real coef /**< coefficient to add */
251 );
252
253/** adds several terms coef*var to a rowprep */
254SCIP_EXPORT
256 SCIP* scip, /**< SCIP data structure */
257 SCIP_ROWPREP* rowprep, /**< rowprep */
258 int nvars, /**< number of terms to add */
259 SCIP_VAR** vars, /**< variables to add */
260 SCIP_Real* coefs /**< coefficients to add */
261 );
262
263/** computes violation of rowprep in a given solution
264 *
265 * Can return whether the violation value is reliable from a floating-point accuracy point of view.
266 * The value will not be deemed reliable when its calculation involved the subtraction of large numbers.
267 * To be precise, the violation of an inequality \f$ \sum_i a_ix_i \leq b \f$ in a solution \f$x^*\f$ is deemed
268 * reliable if \f$ |\sum_i a_ix^*_i - b| \geq 2^{-50} \max (|b|, \max_i |a_ix^*_i|) \f$.
269 */
270SCIP_EXPORT
272 SCIP* scip, /**< SCIP data structure */
273 SCIP_ROWPREP* rowprep, /**< rowprep */
274 SCIP_SOL* sol, /**< solution or NULL for LP solution */
275 SCIP_Bool* reliable /**< buffer to store whether computed violation is reliable (numerically), or NULL if not of interest */
276 );
277
278/** computes violation of rowprep in a given solution and reports whether that value seem numerically reliable
279 *
280 * @see SCIPgetRowprepViolation()
281 */
282SCIP_EXPORT
284 SCIP* scip, /**< SCIP data structure */
285 SCIP_ROWPREP* rowprep, /**< rowprep */
286 SCIP_SOL* sol /**< solution or NULL for LP solution */
287 );
288
289/** Merge terms that use same variable and eliminate zero coefficients.
290 *
291 * Removes a variable if its bounds have a relative difference of below epsilon.
292 * Local bounds are checked for local rows, otherwise global bounds are used.
293 * If the bounds are not absolute equal, the bound that relaxes the row is used.
294 *
295 * Terms are sorted by variable (see SCIPvarComp()) after return.
296 */
297SCIP_EXPORT
299 SCIP* scip, /**< SCIP data structure */
300 SCIP_ROWPREP* rowprep /**< rowprep to be cleaned up */
301 );
302
303/** Cleans up and attempts to improve rowprep
304 *
305 * Drops small or large coefficients if their ratio is beyond separating/maxcoefratiofacrowprep / numerics/feastol,
306 * if this can be done by relaxing the row.
307 * Scales coefficients up to reach minimal violation, if possible.
308 * Scaling is omitted if violation is very small (\ref ROWPREP_SCALEUP_VIOLNONZERO) or
309 * maximal coefficient would become huge (\ref ROWPREP_SCALEUP_MAXMAXCOEF).
310 * Scales coefficients and side down if they are large and if the minimal violation is still reached.
311 * Rounds coefficients close to integral values to integrals, if this can be done by relaxing the row.
312 * Rounds side within epsilon of 0 to 0.0 or +/-1.1*epsilon, whichever relaxes the row least.
313 *
314 * After return, the terms in the rowprep will be sorted by absolute value of coefficient, in decreasing order.
315 * Thus, the coefratio can be obtained via `REALABS(rowprep->coefs[0]) / REALABS(rowprep->coefs[rowprep->nvars-1])` (if nvars>0).
316 *
317 * `success` is set to TRUE if and only if the rowprep satisfies the following:
318 * - the coefratio is below separating/maxcoefratiofacrowprep / numerics/feastol
319 * - the violation is at least `minviol`
320 * - the violation is reliable or `minviol` = 0
321 * - the absolute value of coefficients are below SCIPinfinity()
322 * - the absolute value of the side is below SCIPinfinity()
323 */
324SCIP_EXPORT
326 SCIP* scip, /**< SCIP data structure */
327 SCIP_ROWPREP* rowprep, /**< rowprep to be cleaned */
328 SCIP_SOL* sol, /**< solution that we try to cut off, or NULL for LP solution */
329 SCIP_Real minviol, /**< minimal absolute violation the row should achieve (w.r.t. sol) */
330 SCIP_Real* viol, /**< buffer to store absolute violation of cleaned up cut in sol, or NULL if not of interest */
331 SCIP_Bool* success /**< buffer to store whether cut cleanup was successful, or NULL if not of interest */
332 );
333
334/** Cleans up and attempts to improve rowprep without regard for violation
335 *
336 * Drops small or large coefficients if their ratio is beyond separating/maxcoefratiofacrowprep / numerics/feastol,
337 * if this can be done by relaxing the row.
338 * Scales coefficients and side to have maximal coefficient in `[1/maxcoefbound,maxcoefbound]`.
339 * Rounds coefficients close to integral values to integrals, if this can be done by relaxing the row.
340 * Rounds side within epsilon of 0 to 0.0 or +/-1.1*epsilon, whichever relaxes the row least.
341 *
342 * After return, the terms in the rowprep will be sorted by absolute value of coefficient, in decreasing order.
343 * Thus, the coefratio can be obtained via `REALABS(rowprep->coefs[0]) / REALABS(rowprep->coefs[rowprep->nvars-1])` (if nvars>0).
344 *
345 * `success` is set to TRUE if and only if the rowprep satisfies the following:
346 * - the coefratio is below separating/maxcoefratiofacrowprep / numerics/feastol
347 * - the absolute value of coefficients are below SCIPinfinity()
348 * - the absolute value of the side is below SCIPinfinity()
349 *
350 * In difference to SCIPcleanupRowprep(), this function does not scale up the row to increase the absolute violation.
351 */
352SCIP_EXPORT
354 SCIP* scip, /**< SCIP data structure */
355 SCIP_ROWPREP* rowprep, /**< rowprep to be cleaned */
356 SCIP_SOL* sol, /**< solution that we try to cut off, or NULL for LP solution */
357 SCIP_Real maxcoefbound, /**< bound on absolute value of largest coefficient */
358 SCIP_Bool* success /**< buffer to store whether cut cleanup was successful, or NULL if not of interest */
359 );
360
361/** Scales up a rowprep to increase coefficients/sides that are within epsilon to an integer value, if possible.
362 *
363 * Computes the minimal fractionality of all fractional coefficients and the side of the rowprep.
364 * If this fractionality is below epsilon, the rowprep is scaled up such that the fractionality exceeds epsilon,
365 * if this will not put any coefficient or side above SCIPhugeValue().
366 *
367 * This function does not relax the rowprep.
368 *
369 * `success` is set to TRUE if the resulting rowprep can be turned into a SCIP_ROW, that is,
370 * all coefs and the side is below SCIPinfinity() and fractionalities are above epsilon.
371 * If `success` is set to FALSE, then the rowprep will not have been modified.
372 *
373 * @return The applied scaling factor, if `success` is set to TRUE.
374 */
375SCIP_EXPORT
377 SCIP* scip, /**< SCIP data structure */
378 SCIP_ROWPREP* rowprep, /**< rowprep to be cleaned */
379 SCIP_Real minscaleup, /**< minimal factor by which to scale up row, or <= 1.0 if to be ignored */
380 SCIP_Bool* success /**< buffer to store whether rowprep could be turned into SCIP_ROW without loss, or NULL if not of interest */
381 );
382
383/** scales a rowprep by given factor (after some rounding)
384 *
385 * @return Exponent of actually applied scaling factor, if written as \f$2^x\f$.
386 */
387SCIP_EXPORT
389 SCIP_ROWPREP* rowprep, /**< rowprep to be scaled */
390 SCIP_Real factor /**< suggested scale factor */
391 );
392
393/** generates a SCIP_ROW from a rowprep, setting its origin to given constraint handler */
394SCIP_EXPORT
396 SCIP* scip, /**< SCIP data structure */
397 SCIP_ROW** row, /**< buffer to store pointer to new row */
398 SCIP_ROWPREP* rowprep, /**< rowprep to be turned into a row */
399 SCIP_CONSHDLR* conshdlr /**< constraint handler */
400 );
401
402/** generates a SCIP_ROW from a rowprep, setting its origin to given constraint */
403SCIP_EXPORT
405 SCIP* scip, /**< SCIP data structure */
406 SCIP_ROW** row, /**< buffer to store pointer to new row */
407 SCIP_ROWPREP* rowprep, /**< rowprep to be turned into a row */
408 SCIP_CONS* cons /**< constraint */
409 );
410
411/** generates a SCIP_ROW from a rowprep, setting its origin to given separator */
412SCIP_EXPORT
414 SCIP* scip, /**< SCIP data structure */
415 SCIP_ROW** row, /**< buffer to store pointer to new row */
416 SCIP_ROWPREP* rowprep, /**< rowprep to be turned into a row */
417 SCIP_SEPA* sepa /**< separator */
418 );
419
420/** @} */
421
422#ifdef __cplusplus
423}
424#endif
425
426#endif /* __SCIP_PUB_MISC_ROWPREP_H__ */
#define SCIP_Bool
Definition: def.h:91
#define SCIP_Real
Definition: def.h:173
SCIP_VAR ** SCIProwprepGetVars(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:639
void SCIProwprepReset(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:719
SCIP_RETCODE SCIPcleanupRowprep2(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_Real maxcoefbound, SCIP_Bool *success)
SCIP_Real SCIProwprepGetSide(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:659
SCIP_RETCODE SCIPensureRowprepSize(SCIP *scip, SCIP_ROWPREP *rowprep, int size)
Definition: misc_rowprep.c:887
void SCIPmergeRowprepTerms(SCIP *scip, SCIP_ROWPREP *rowprep)
int SCIProwprepGetNModifiedVars(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:699
SCIP_Real SCIPgetRowprepViolation(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_Bool *reliable)
Definition: misc_rowprep.c:972
void SCIProwprepSetCoef(SCIP_ROWPREP *rowprep, int idx, SCIP_Real newcoef)
Definition: misc_rowprep.c:734
SCIP_Real SCIPscaleupRowprep(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_Real minscaleup, SCIP_Bool *success)
SCIP_Real * SCIProwprepGetCoefs(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:649
SCIP_VAR ** SCIProwprepGetModifiedVars(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:709
char * SCIProwprepGetName(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:689
void SCIProwprepSetSidetype(SCIP_ROWPREP *rowprep, SCIP_SIDETYPE sidetype)
Definition: misc_rowprep.c:769
SCIP_Bool SCIPisRowprepViolationReliable(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol)
SCIP_Bool SCIProwprepIsLocal(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:679
void SCIPprintRowprepSol(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, FILE *file)
Definition: misc_rowprep.c:826
void SCIProwprepAddConstant(SCIP_ROWPREP *rowprep, SCIP_Real constant)
Definition: misc_rowprep.c:760
SCIP_SIDETYPE SCIProwprepGetSidetype(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:669
SCIP_RETCODE SCIPgetRowprepRowSepa(SCIP *scip, SCIP_ROW **row, SCIP_ROWPREP *rowprep, SCIP_SEPA *sepa)
SCIP_RETCODE SCIPaddRowprepTerm(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_VAR *var, SCIP_Real coef)
Definition: misc_rowprep.c:913
SCIP_RETCODE SCIPgetRowprepRowCons(SCIP *scip, SCIP_ROW **row, SCIP_ROWPREP *rowprep, SCIP_CONS *cons)
SCIP_RETCODE SCIPgetRowprepRowConshdlr(SCIP *scip, SCIP_ROW **row, SCIP_ROWPREP *rowprep, SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPcreateRowprep(SCIP *scip, SCIP_ROWPREP **rowprep, SCIP_SIDETYPE sidetype, SCIP_Bool local)
Definition: misc_rowprep.c:563
int SCIPscaleRowprep(SCIP_ROWPREP *rowprep, SCIP_Real factor)
int SCIProwprepGetNVars(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:629
void SCIProwprepRecordModifications(SCIP_ROWPREP *rowprep)
Definition: misc_rowprep.c:791
SCIP_RETCODE SCIPaddRowprepTerms(SCIP *scip, SCIP_ROWPREP *rowprep, int nvars, SCIP_VAR **vars, SCIP_Real *coefs)
Definition: misc_rowprep.c:938
void SCIProwprepSetLocal(SCIP_ROWPREP *rowprep, SCIP_Bool islocal)
Definition: misc_rowprep.c:780
void SCIProwprepAddSide(SCIP_ROWPREP *rowprep, SCIP_Real side)
Definition: misc_rowprep.c:746
SCIP_RETCODE SCIPcopyRowprep(SCIP *scip, SCIP_ROWPREP **target, SCIP_ROWPREP *source)
Definition: misc_rowprep.c:599
SCIP_RETCODE SCIPcleanupRowprep(SCIP *scip, SCIP_ROWPREP *rowprep, SCIP_SOL *sol, SCIP_Real minviol, SCIP_Real *viol, SCIP_Bool *success)
void SCIPfreeRowprep(SCIP *scip, SCIP_ROWPREP **rowprep)
Definition: misc_rowprep.c:583
void SCIPprintRowprep(SCIP *scip, SCIP_ROWPREP *rowprep, FILE *file)
Definition: misc_rowprep.c:801
miscellaneous datastructures
type definitions for constraints and constraint handlers
type definitions for LP management
enum SCIP_SideType SCIP_SIDETYPE
Definition: type_lp.h:67
type definitions for miscellaneous datastructures
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
type definitions for separators
type definitions for problem variables