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