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 )
352
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