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