Scippy

SCIP

Solving Constraint Integer Programs

def.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 def.h
26  * @ingroup INTERNALAPI
27  * @brief common defines and data types used in all packages of SCIP
28  * @author Tobias Achterberg
29  */
30 
31 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32 
33 #ifndef __SCIP_DEF_H__
34 #define __SCIP_DEF_H__
35 
36 #ifdef __cplusplus
37 #define __STDC_LIMIT_MACROS
38 #define __STDC_CONSTANT_MACROS
39 #endif
40 
41 #include <stdio.h>
42 #include <stdint.h>
43 #include <math.h>
44 #include <limits.h>
45 #include <float.h>
46 #include <assert.h>
47 
48 /*
49  * include build configuration flags
50  */
51 #include "scip/config.h"
52 #include "scip/scip_export.h"
53 
54 /*
55  * GNU COMPILER VERSION define
56  */
57 #ifdef __GNUC__
58 #ifndef GCC_VERSION
59 #define GCC_VERSION (__GNUC__ * 100 \
60  + __GNUC_MINOR__ * 10 \
61  + __GNUC_PATCHLEVEL__)
62 #endif
63 #endif
64 
65 /*
66  * define whether compiler allows variadic macros
67  * __STDC_VERSION__ only exists for C code
68  * added the extra check using the GCC_VERSION to enable variadic macros also with C++ code with GCC atleast
69  *
70  */
71 #if defined(_MSC_VER) || ( __STDC_VERSION__ >= 199901L ) || ( GCC_VERSION >= 480 )
72 #define SCIP_HAVE_VARIADIC_MACROS 1
73 #endif
74 
75 /** get the first parameter and all-but-the-first arguments from variadic arguments
76  *
77  * normally, SCIP_VARARGS_FIRST_ should be sufficient
78  * the SCIP_VARARGS_FIRST_/SCIP_VARARGS_FIRST kludge is to work around a bug in MSVC (https://stackoverflow.com/questions/4750688/how-to-single-out-the-first-parameter-sent-to-a-macro-taking-only-a-variadic-par)
79  */
80 #define SCIP_VARARGS_FIRST_(firstarg, ...) firstarg
81 #define SCIP_VARARGS_FIRST(args) SCIP_VARARGS_FIRST_ args
82 
83 /** get all but the first parameter from variadic arguments */
84 #define SCIP_VARARGS_REST(firstarg, ...) __VA_ARGS__
85 
86 /*
87  * Boolean values
88  */
89 
90 #ifndef SCIP_Bool
91 #define SCIP_Bool unsigned int /**< type used for Boolean values */
92 #ifndef TRUE
93 #define TRUE 1 /**< Boolean value TRUE */
94 #define FALSE 0 /**< Boolean value FALSE */
95 #endif
96 #endif
97 
98 #ifndef SCIP_Shortbool
99 #define SCIP_Shortbool uint8_t /**< type used for Boolean values with less space */
100 #endif
101 
102 /*
103  * Add some macros for differing functions on Windows
104  */
105 #ifdef _WIN32
106 #define strcasecmp _stricmp
107 #define strncasecmp _strnicmp
108 #define getcwd _getcwd
109 #endif
110 
111 /*
112  * Define the macro SCIP_EXPORT if it is not included from the generated header
113  */
114 #ifndef SCIP_EXPORT
115 #if defined(_WIN32)
116 #define SCIP_EXPORT __declspec(dllexport)
117 #elif defined(__GNUC__) && __GNUC__ >= 4
118 #define SCIP_EXPORT __attribute__((__visibility__("default")))
119 #else
120 #define SCIP_EXPORT
121 #endif
122 #endif
123 
124 /* define INLINE */
125 #ifndef INLINE
126 #if defined(_WIN32) || defined(__STDC__)
127 #define INLINE __inline
128 #else
129 #define INLINE inline
130 #endif
131 #endif
132 
133 
134 #define SCIP_VERSION (100*SCIP_VERSION_MAJOR + 10*SCIP_VERSION_MINOR + SCIP_VERSION_PATCH) /**< SCIP version number (multiplied by 100 to get integer number) */
135 #define SCIP_SUBVERSION SCIP_VERSION_SUB /**< SCIP sub version number */
136 #define SCIP_APIVERSION SCIP_VERSION_API /**< SCIP API version number */
137 #define SCIP_COPYRIGHT "Copyright (c) 2002-2024 Zuse Institute Berlin (ZIB)"
138 
139 
140 /*
141  * CIP format variable characters
142  */
143 
144 #define SCIP_VARTYPE_BINARY_CHAR 'B'
145 #define SCIP_VARTYPE_INTEGER_CHAR 'I'
146 #define SCIP_VARTYPE_IMPLINT_CHAR 'M'
147 #define SCIP_VARTYPE_CONTINUOUS_CHAR 'C'
148 
149 /*
150  * Long Integer values
151  */
152 
153 #ifndef LLONG_MAX
154 #define LLONG_MAX 9223372036854775807LL
155 #define LLONG_MIN (-LLONG_MAX - 1LL)
156 #endif
157 
158 #define SCIP_Longint long long /**< type used for long integer values */
159 #define SCIP_LONGINT_MAX LLONG_MAX
160 #define SCIP_LONGINT_MIN LLONG_MIN
161 #ifndef SCIP_LONGINT_FORMAT
162 #ifdef _WIN32
163 #define SCIP_LONGINT_FORMAT "I64d"
164 #else
165 #define SCIP_LONGINT_FORMAT "lld"
166 #endif
167 #endif
168 
169 /*
170  * Floating point values
171  */
172 
173 #define SCIP_Real double /**< type used for floating point values */
174 #define SCIP_REAL_MAX (SCIP_Real)DBL_MAX
175 #define SCIP_REAL_MIN -(SCIP_Real)DBL_MAX
176 #define SCIP_REAL_FORMAT "lf"
177 
178 #define SCIP_DEFAULT_INFINITY 1e+20 /**< default value considered to be infinity */
179 #define SCIP_DEFAULT_EPSILON 1e-09 /**< default upper bound for floating points to be considered zero */
180 #define SCIP_DEFAULT_SUMEPSILON 1e-06 /**< default upper bound for sums of floating points to be considered zero */
181 #define SCIP_DEFAULT_FEASTOL 1e-06 /**< default feasibility tolerance for constraints */
182 #define SCIP_DEFAULT_CHECKFEASTOLFAC 1.0 /**< default factor to change the feasibility tolerance when testing the best solution for feasibility (after solving process) */
183 #define SCIP_DEFAULT_LPFEASTOLFACTOR 1.0 /**< default factor w.r.t. primal feasibility tolerance that determines default (and maximal) primal feasibility tolerance of LP solver */
184 #define SCIP_DEFAULT_DUALFEASTOL 1e-07 /**< default feasibility tolerance for reduced costs */
185 #define SCIP_DEFAULT_BARRIERCONVTOL 1e-10 /**< default convergence tolerance used in barrier algorithm */
186 #define SCIP_DEFAULT_BOUNDSTREPS 0.05 /**< default minimal relative improve for strengthening bounds */
187 #define SCIP_DEFAULT_PSEUDOCOSTEPS 1e-01 /**< default minimal variable distance value to use for pseudo cost updates */
188 #define SCIP_DEFAULT_PSEUDOCOSTDELTA 1e-04 /**< default minimal objective distance value to use for pseudo cost updates */
189 #define SCIP_DEFAULT_RECOMPFAC 1e+07 /**< default minimal decrease factor that causes the recomputation of a value (e.g., pseudo objective) instead of an update */
190 #define SCIP_DEFAULT_HUGEVAL 1e+15 /**< values larger than this are considered huge and should be handled separately (e.g., in activity computation) */
191 #define SCIP_MAXEPSILON 1e-03 /**< maximum value for any numerical epsilon */
192 #define SCIP_MINEPSILON 1e-20 /**< minimum value for any numerical epsilon */
193 #define SCIP_INVALID (double)1e+99 /**< floating point value is not valid */
194 #define SCIP_UNKNOWN (double)1e+98 /**< floating point value is not known (in primal solution) */
195 #define SCIP_INTERVAL_INFINITY (double)1e+300 /**< infinity value for interval computations */
196 
197 #define REALABS(x) (fabs(x))
198 #define EPSEQ(x,y,eps) (REALABS((x)-(y)) <= (eps))
199 #define EPSLT(x,y,eps) ((x)-(y) < -(eps))
200 #define EPSLE(x,y,eps) ((x)-(y) <= (eps))
201 #define EPSGT(x,y,eps) ((x)-(y) > (eps))
202 #define EPSGE(x,y,eps) ((x)-(y) >= -(eps))
203 #define EPSZ(x,eps) (REALABS(x) <= (eps))
204 #define EPSP(x,eps) ((x) > (eps))
205 #define EPSN(x,eps) ((x) < -(eps))
206 #define EPSFLOOR(x,eps) (floor((x)+(eps)))
207 #define EPSCEIL(x,eps) (ceil((x)-(eps)))
208 #define EPSROUND(x,eps) (ceil((x)-0.5+(eps)))
209 #define EPSFRAC(x,eps) ((x)-EPSFLOOR(x,eps))
210 #define EPSISINT(x,eps) (EPSFRAC(x,eps) <= (eps))
211 
212 
213 #ifndef SQR
214 #define SQR(x) ((x)*(x))
215 #endif
216 
217 /* platform-dependent specification of the log1p, which is numerically more stable around x = 0.0 */
218 #ifndef LOG1P
219 #ifdef _WIN32
220 #define LOG1P(x) (log(1.0+x))
221 #else
222 #define LOG1P(x) (log1p(x))
223 #endif
224 #endif
225 
226 #ifndef LOG2
227 #if defined(_MSC_VER) && (_MSC_VER < 1800)
228 #define LOG2(x) (log(x) / log(2.0))
229 #else
230 #define LOG2(x) log2(x)
231 #endif
232 #endif
233 
234 #ifndef ABS
235 #define ABS(x) ((x) >= 0 ? (x) : -(x))
236 #endif
237 
238 #ifndef MAX
239 #define MAX(x, y) ((x) >= (y) ? (x) : (y)) /**< returns maximum of x and y */
240 #endif
241 
242 #ifndef MIN
243 #define MIN(x, y) ((x) <= (y) ? (x) : (y)) /**< returns minimum of x and y */
244 #endif
245 
246 #ifndef MAX3
247 #define MAX3(x, y, z) ((x) >= (y) ? MAX(x, z) : MAX(y, z)) /**< returns maximum of x, y, and z */
248 #endif
249 
250 #ifndef MIN3
251 #define MIN3(x, y, z) ((x) <= (y) ? MIN(x, z) : MIN(y, z)) /**< returns minimum of x, y, and z */
252 #endif
253 
254 #ifndef COPYSIGN
255 #if defined(_MSC_VER) && (_MSC_VER < 1800)
256 #define COPYSIGN _copysign
257 #else
258 #define COPYSIGN copysign
259 #endif
260 #endif
261 
262 /*
263  * Pointers
264  */
265 
266 #ifndef NULL
267 #define NULL ((void*)0) /**< zero pointer */
268 #endif
269 
270 #ifndef RESTRICT
271 #if defined(_MSC_VER)
272 #define RESTRICT __restrict
273 #else
274 #ifdef __cplusplus
275 #define RESTRICT __restrict__
276 #elif __STDC_VERSION__ >= 199901L
277 #define RESTRICT restrict
278 #else
279 #define RESTRICT
280 #endif
281 #endif
282 #endif
283 
284 /*
285  * Strings
286  */
287 
288 #define SCIP_MAXSTRLEN 1024 /**< maximum string length in SCIP */
289 #define SCIP_SPACECONTROL " tnvfr" /**< control specifier for escaped spaces */
290 
291 /*
292  * Memory settings
293  */
294 
295 /* we use SIZE_MAX / 2 to detect negative sizes which got a very large value when casting to size_t */
296 #define SCIP_MAXMEMSIZE (SIZE_MAX/2) /**< maximum size of allocated memory (array) */
297 
298 #define SCIP_HASHSIZE_PARAMS 2048 /**< size of hash table in parameter name tables */
299 #define SCIP_HASHSIZE_NAMES 500 /**< size of hash table in name tables */
300 #define SCIP_HASHSIZE_CUTPOOLS 500 /**< size of hash table in cut pools */
301 #define SCIP_HASHSIZE_CLIQUES 500 /**< size of hash table in clique tables */
302 #define SCIP_HASHSIZE_NAMES_SMALL 100 /**< size of hash table in name tables for small problems */
303 #define SCIP_HASHSIZE_CUTPOOLS_SMALL 100 /**< size of hash table in cut pools for small problems */
304 #define SCIP_HASHSIZE_CLIQUES_SMALL 100 /**< size of hash table in clique tables for small problems */
305 #define SCIP_HASHSIZE_VBC 500 /**< size of hash map for node -> nodenum mapping used for VBC output */
306 
307 #define SCIP_DEFAULT_MEM_ARRAYGROWFAC 1.2 /**< memory growing factor for dynamically allocated arrays */
308 #define SCIP_DEFAULT_MEM_ARRAYGROWINIT 4 /**< initial size of dynamically allocated arrays */
309 
310 #define SCIP_MEM_NOLIMIT (SCIP_Longint)(SCIP_LONGINT_MAX >> 20)/**< initial size of dynamically allocated arrays */
311 
312 /*
313  * Tree settings
314  */
315 
316 #define SCIP_MAXTREEDEPTH 1073741822 /**< maximal allowed depth of the branch-and-bound tree */
317 
318 /*
319  * Probing scoring settings
320  */
321 
322 #define SCIP_PROBINGSCORE_PENALTYRATIO 2 /**< ratio for penalizing too small fractionalities in diving heuristics.
323  * if the fractional part of a variable is smaller than a given threshold
324  * the corresponding score gets penalized. due to numerical troubles
325  * we will flip a coin whenever SCIPisEQ(scip, fractionality, threshold)
326  * evaluates to true. this parameter defines the chance that this results
327  * in penalizing the score, i.e., there is 1:2 chance for penalizing.
328  */
329 
330 /*
331  * Global debugging settings
332  */
333 
334 /*#define DEBUG*/
335 
336 
337 /*
338  * Defines for handling SCIP return codes
339  */
340 
341 /** this macro is used to stop SCIP in debug mode such that errors can be debugged;
342  *
343  * @note In optimized mode this macro has no effect. That means, in case of an error it has to be ensured that code
344  * terminates with an error code or continues safely.
345  */
346 #define SCIPABORT() assert(FALSE) /*lint --e{527} */
347 
348 #define SCIP_CALL_ABORT_QUIET(x) do { if( (x) != SCIP_OKAY ) SCIPABORT(); } while( FALSE )
349 #define SCIP_CALL_QUIET(x) do { SCIP_RETCODE _restat_; if( (_restat_ = (x)) != SCIP_OKAY ) return _restat_; } while( FALSE )
350 #define SCIP_ALLOC_ABORT_QUIET(x) do { if( NULL == (x) ) SCIPABORT(); } while( FALSE )
351 #define SCIP_ALLOC_QUIET(x) do { if( NULL == (x) ) return SCIP_NOMEMORY; } while( FALSE )
353 #define SCIP_CALL_ABORT(x) do \
354  { \
355  SCIP_RETCODE _restat_; /*lint -e{506,774}*/ \
356  if( (_restat_ = (x)) != SCIP_OKAY ) \
357  { \
358  SCIPerrorMessage("Error <%d> in function call\n", _restat_); \
359  SCIPABORT(); \
360  } \
361  } \
362  while( FALSE )
363 
364 #define SCIP_ALLOC_ABORT(x) do \
365  { \
366  if( NULL == (x) ) \
367  { \
368  SCIPerrorMessage("No memory in function call\n"); \
369  SCIPABORT(); \
370  } \
371  } \
372  while( FALSE )
373 
374 #define SCIP_CALL(x) do \
375  { \
376  SCIP_RETCODE _restat_; /*lint -e{506,774}*/ \
377  if( (_restat_ = (x)) != SCIP_OKAY ) \
378  { \
379  SCIPerrorMessage("Error <%d> in function call\n", _restat_); \
380  return _restat_; \
381  } \
382  } \
383  while( FALSE )
384 
385 #define SCIP_ALLOC(x) do \
386  { \
387  if( NULL == (x) ) \
388  { \
389  SCIPerrorMessage("No memory in function call\n"); \
390  return SCIP_NOMEMORY; \
391  } \
392  } \
393  while( FALSE )
394 
395 #define SCIP_CALL_TERMINATE(retcode, x, TERM) do \
396  { \
397  if( ((retcode) = (x)) != SCIP_OKAY ) \
398  { \
399  SCIPerrorMessage("Error <%d> in function call\n", retcode); \
400  goto TERM; \
401  } \
402  } \
403  while( FALSE )
404 
405 #define SCIP_ALLOC_TERMINATE(retcode, x, TERM) do \
406  { \
407  if( NULL == (x) ) \
408  { \
409  SCIPerrorMessage("No memory in function call\n"); \
410  retcode = SCIP_NOMEMORY; \
411  goto TERM; \
412  } \
413  } \
414  while( FALSE )
415 
416 #define SCIP_CALL_FINALLY(x, y) do \
417  { \
418  SCIP_RETCODE _restat_; \
419  if( (_restat_ = (x)) != SCIP_OKAY ) \
420  { \
421  SCIPerrorMessage("Error <%d> in function call\n", _restat_); \
422  (y); \
423  return _restat_; \
424  } \
425  } \
426  while( FALSE )
427 
428 #define SCIP_UNUSED(x) ((void) (x))
429 
430 /*
431  * Define to mark deprecated API functions
432  */
433 
434 #ifndef SCIP_DEPRECATED
435 #if defined(_MSC_VER)
436 # define SCIP_DEPRECATED __declspec(deprecated)
437 #elif defined(__GNUC__)
438 # define SCIP_DEPRECATED __attribute__ ((deprecated))
439 #else
440 # define SCIP_DEPRECATED
441 #endif
442 #endif
443 
444 #endif