Scippy

SoPlex

Sequential object-oriented simPlex

spxdefines.h
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the class library */
4/* SoPlex --- the Sequential object-oriented simPlex. */
5/* */
6/* Copyright (c) 1996-2026 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 SoPlex; see the file LICENSE. If not email to soplex@zib.de. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file spxdefines.h
26 * @brief Debugging, floating point type and parameter definitions.
27 *
28 * In optimized code with \c NDEBUG defined, only
29 * \ref soplex::SPxOut::VERB_INFO1 "VERB_INFO1",
30 * \ref soplex::SPxOut::VERB_INFO2 "VERB_INFO2", and
31 * \ref soplex::SPxOut::VERB_INFO3 "VERB_INFO3" are set.
32 * If \c NDEBUG is not defined, the code within \#TRACE is used.
33 * If \c SOPLEX_DEBUG is defined, the code within
34 * \ref soplex::SPxOut::VERB_DEBUG "VERB_DEBUG" is also used.
35 *
36 * If \c WITH_LONG_DOUBLE is defined, all Real numbers are of type
37 * long double instead of just double.
38 */
39#ifndef _SPXDEFINES_H_
40#define _SPXDEFINES_H_
41#include <cmath>
42
43#ifdef _MSC_VER
44#include <float.h>
45#endif
46
47#include <assert.h>
48#include <stdarg.h>
49#include <stdio.h>
50#include <iostream>
51
52#include <cstdlib>
53#include <memory>
54
55/*
56 * include build configuration flags
57 */
58#ifndef SOPLEX_NO_CONFIG_HEADER
59#include "soplex/config.h"
60#endif
61
62#ifdef SOPLEX_WITH_BOOST
63#include "boost/multiprecision/number.hpp"
64#ifdef SOPLEX_WITH_FLOAT128
65#include <boost/multiprecision/float128.hpp>
66#endif
67
68#ifdef SOPLEX_WITH_MPFR
69// For multiple precision
70#include <boost/multiprecision/mpfr.hpp>
71#ifndef NDEBUG
72#include "boost/multiprecision/debug_adaptor.hpp" // For debuging mpf numbers
73#endif // NDEBUG
74#endif // SOPLEX_WITH_MPFR
75#ifdef SOPLEX_WITH_CPPMPF
76#include <boost/serialization/nvp.hpp>
77#include <boost/multiprecision/cpp_dec_float.hpp>
78#endif // SOPLEX_WITH_CPPMPF
79
80#ifdef SOPLEX_WITH_GMP
81#include <boost/multiprecision/gmp.hpp>
82#else
83#include <boost/multiprecision/cpp_int.hpp>
84#endif
85
86#endif
87
88namespace soplex
89{
90// Overloaded EQ function
91bool EQ(int a, int b);
92
93#define SOPLEX_VERSION 802
94#define SOPLEX_VERSION_SUB 0 ///< @deprecated Always 0
95#define SOPLEX_SUBVERSION 0 ///< @deprecated Always 0
96#define SOPLEX_APIVERSION 20
97#define SOPLEX_COPYRIGHT "Copyright (c) 1996-2026 Zuse Institute Berlin (ZIB)"
98
99/*-----------------------------------------------------------------------------
100 * Assertion Macros etc.
101 *-----------------------------------------------------------------------------
102 */
103
104/**
105 \brief Macro to turn some assertions into warnings.
106
107 If both \c NDEBUG and \c WITH_WARNINGS are defined then the failed
108 assertion is converted to a warning. In all other cases this macro is
109 equivalent to assert().
110
111 @param prefix Short string for grepping in source code.
112 @param expr Expression that must be satisfied.
113*/
114#if defined (NDEBUG) && defined (WITH_WARNINGS)
115#define SOPLEX_ASSERT_WARN( prefix, expr ) \
116 if ( !( expr ) ) \
117 { \
118 std::cerr \
119 << prefix \
120 << " failed assertion on line " << __LINE__ \
121 << " in file " << __FILE__ << ": " \
122 << #expr \
123 << std::endl; \
124 }
125#else // just a normal assert
126#define SOPLEX_ASSERT_WARN( prefix, expr ) ( assert( expr ) )
127#endif
128
129
130
131/*-----------------------------------------------------------------------------
132 * Debugging Macros etc.
133 *-----------------------------------------------------------------------------
134 */
135
136/**
137 Prints/Executes \p stream with verbosity level \p verbosity, resetting
138 the old verbosity level afterwards.
139 Usually the parameter \p stream prints something out.
140 This is an internal define used by SPX_MSG_ERROR, SPX_MSG_WARNING, etc.
141*/
142#ifdef DISABLE_VERBOSITY
143#define SOPLEX_DO_WITH_TMP_VERBOSITY( verbosity, spxout, do_something ) {}
144#define SOPLEX_DO_WITH_ERR_VERBOSITY( do_something ) {}
145#else
146#define SOPLEX_DO_WITH_TMP_VERBOSITY( verbosity, spxout, do_something ) \
147 { \
148 if( &spxout != nullptr ) \
149 { \
150 if( verbosity <= spxout.getVerbosity() ) \
151 { \
152 const SPxOut::Verbosity old_verbosity = spxout.getVerbosity(); \
153 spxout.setVerbosity( verbosity ); \
154 do_something; \
155 spxout.setVerbosity( old_verbosity ); \
156 } \
157 } \
158 }
159#define SOPLEX_DO_WITH_ERR_VERBOSITY( do_something ) { do_something; }
160#endif
161
162/// Prints out message \p x if the verbosity level is at least SPxOut::VERB_ERROR.
163#define SPX_MSG_ERROR(x) { SOPLEX_DO_WITH_ERR_VERBOSITY( x ) }
164/// Prints out message \p x if the verbosity level is at least SPxOut::VERB_WARNING.
165#define SPX_MSG_WARNING(spxout, x) { SOPLEX_DO_WITH_TMP_VERBOSITY( SPxOut::VERB_WARNING, spxout, x ) }
166/// Prints out message \p x if the verbosity level is at least SPxOut::VERB_INFO1.
167#define SPX_MSG_INFO1(spxout, x) { SOPLEX_DO_WITH_TMP_VERBOSITY( SPxOut::VERB_INFO1, spxout, x ) }
168/// Prints out message \p x if the verbosity level is at least SPxOut::VERB_INFO2.
169#define SPX_MSG_INFO2(spxout, x) { SOPLEX_DO_WITH_TMP_VERBOSITY( SPxOut::VERB_INFO2, spxout, x ) }
170/// Prints out message \p x if the verbosity level is at least SPxOut::VERB_INFO3.
171#define SPX_MSG_INFO3(spxout, x) { SOPLEX_DO_WITH_TMP_VERBOSITY( SPxOut::VERB_INFO3, spxout, x ) }
172
173extern bool msginconsistent(const char* name, const char* file, int line);
174
175#define SPX_MSG_INCONSISTENT(name) msginconsistent(name, __FILE__, __LINE__)
176
177#if defined(SOPLEX_DEBUG)
178// print output in any case, regardless of _tolerances->verbose():
179#define SPX_MSG_DEBUG(x) { x; }
180#define SPX_DEBUG(x) { x; }
181#else
182#define SPX_MSG_DEBUG(x) /**/
183#define SPX_DEBUG(x) /**/
184#endif //!SOPLEX_DEBUG
185
186
187/*-----------------------------------------------------------------------------
188 * multi-thread support
189 *-----------------------------------------------------------------------------
190 */
191// enable the user to compile without thread_local by setting USRCXXFLAGS=-DTHREADLOCAL=""
192#if !defined(SOPLEX_THREADLOCAL)
193#if defined(_MSC_VER) && _MSC_VER < 1900
194#define SOPLEX_THREADLOCAL
195#else
196#define SOPLEX_THREADLOCAL thread_local
197#endif
198#endif
199
200/*-----------------------------------------------------------------------------
201 * Long double support, Parameters and Epsilons
202 *-----------------------------------------------------------------------------
203 */
204
205
206#ifdef WITH_LONG_DOUBLE
207
208
209typedef long double Real;
210
211#ifndef SOPLEX_REAL
212#define SOPLEX_REAL(x) x##L
213#define SOPLEX_REAL_FORMAT "Lf"
214#endif
215/// default allowed bound violation
216#ifndef SOPLEX_DEFAULT_BND_VIOL
217#define SOPLEX_DEFAULT_BND_VIOL 1e-12L
218#endif
219/// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
220#ifndef SOPLEX_DEFAULT_EPS_ZERO
221#define SOPLEX_DEFAULT_EPS_ZERO 1e-28L
222#endif
223/// epsilon for factorization
224#ifndef SOPLEX_DEFAULT_EPS_FACTOR
225#define SOPLEX_DEFAULT_EPS_FACTOR 1e-30L
226#endif
227/// epsilon for factorization update
228#ifndef SOPLEX_DEFAULT_EPS_UPDATE
229#define SOPLEX_DEFAULT_EPS_UPDATE 1e-26L
230#endif
231#ifndef SOPLEX_DEFAULT_EPS_PIVOR
232#define SOPLEX_DEFAULT_EPS_PIVOR 1e-20L
233#endif
234///
235#define SOPLEX_DEFAULT_INFINITY 1e100L
236
237
238#else
239
240#ifdef WITH_FLOAT
241
242typedef float Real;
243
244#ifndef SOPLEX_REAL
245#define SOPLEX_REAL(x) x
246#define SOPLEX_REAL_FORMAT "f"
247#endif
248/// default allowed bound violation
249#ifndef SOPLEX_DEFAULT_BND_VIOL
250#define SOPLEX_DEFAULT_BND_VIOL 1e-1f
251#endif
252/// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
253#ifndef SOPLEX_DEFAULT_EPS_ZERO
254#define SOPLEX_DEFAULT_EPS_ZERO 1e-7f
255#endif
256#ifndef SOPLEX_DEFAULT_EPS_FACTOR
257#define SOPLEX_DEFAULT_EPS_FACTOR 1e-7f
258#endif
259#ifndef SOPLEX_DEFAULT_EPS_UPDATE
260#define SOPLEX_DEFAULT_EPS_UPDATE 1e-6f
261#endif
262#ifndef SOPLEX_DEFAULT_EPS_PIVOR
263#define SOPLEX_DEFAULT_EPS_PIVOR 1e-6f
264#endif
265#define SOPLEX_DEFAULT_INFINITY 1e35f
266
267#else
268
269typedef double Real;
270
271#ifndef SOPLEX_REAL
272#define SOPLEX_REAL(x) x
273#define SOPLEX_REAL_FORMAT "lf"
274#endif
275/// default allowed bound violation
276#ifndef SOPLEX_DEFAULT_BND_VIOL
277#define SOPLEX_DEFAULT_BND_VIOL 1e-6
278#endif
279/// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
280#ifndef SOPLEX_DEFAULT_EPS_ZERO
281#define SOPLEX_DEFAULT_EPS_ZERO 1e-16
282#endif
283#ifndef SOPLEX_DEFAULT_EPS_FACTOR
284#define SOPLEX_DEFAULT_EPS_FACTOR 1e-20
285#endif
286#ifndef SOPLEX_DEFAULT_EPS_UPDATE
287#define SOPLEX_DEFAULT_EPS_UPDATE 1e-16
288#endif
289#ifndef SOPLEX_DEFAULT_EPS_PIVOR
290#define SOPLEX_DEFAULT_EPS_PIVOR 1e-10
291#endif
292#define SOPLEX_DEFAULT_INFINITY 1e100
293
294#endif // !WITH_FLOAT
295#endif // !WITH_LONG_DOUBLE
296
297#define SOPLEX_MAX(x,y) ((x)>(y) ? (x) : (y))
298#define SOPLEX_MIN(x,y) ((x)<(y) ? (x) : (y))
299
300#define SPX_MAXSTRLEN 1024 /**< maximum string length in SoPlex */
301
302/* Sparse vector handling:
303 * - Positive zero (+0): Uninitialized position, not in structure
304 * - Negative zero (-0): Value cancelled to zero, can temporarily remain
305 * - Nonzero value: Active structure position
306 * Zero distinction avoids duplicate indices when values cancel to zero during updates.
307 * Only apply to floating point types because the rational zero is unsigned.
308 */
309
310/// detects whether value is positive zero
311template <typename R>
312inline bool isPlusZero(R x)
313{
314 using std::signbit;
315 return x == 0 && !signbit(x);
316}
317
318SOPLEX_THREADLOCAL extern const Real infinity;
319
321{
322private:
323
324 //------------------------------------
325 /**@name Data */
326 ///@{
327 /// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
329 /// epsilon for factorization
331 /// epsilon for factorization update
333 /// epsilon for pivot zero tolerance in factorization
335 /// feasibility tolerance
337 /// optimality tolerance
339 /// floating point feasibility tolerance
341 /// floating point optimality tolerance
343 /// multiplier for fixed numbers that should change if s_epsilon changes
345 ///@}
346
347public:
348
349 // default constructor
350 explicit Tolerances()
357 {}
358
359 //------------------------------------
360 /**@name Access / modification */
361 ///@{
362 /// global zero epsilon
363 Real epsilon();
364 /// set global zero epsilon
365 void setEpsilon(Real eps);
366 /// zero espilon used in factorization
368 /// set zero espilon used in factorization
370 /// zero espilon used in factorization update
372 /// set zero espilon used in factorization update
373 void setEpsilonUpdate(Real eps);
374 /// zero espilon used in pivot
376 /// set zero espilon used in pivot
377 void setEpsilonPivot(Real eps);
378 /// global feasibility tolerance
379 Real feastol();
380 /// set global feasibility tolerance
381 void setFeastol(Real ftol);
382 /// global optimality tolerance
383 Real opttol();
384 /// set global optimality tolerance
385 void setOpttol(Real otol);
386 /// floating point feasibility tolerance used within the solver
388 /// set floating point feasibility tolerance used within the solver
389 void setFloatingPointFeastol(Real ftol);
390 /// floating point optimality tolerance used within the solver
392 /// set floating point optimality tolerance used within the solver
393 void setFloatingPointOpttol(Real otol);
394 /// scale a value such that it remains unchanged at default epsilon, but is scaled withs smaller epsilon values
395 /// this is updated in setEpsilon()
397 {
398 return s_epsilon_multiplier == 1.0 ? a : a * s_epsilon_multiplier;
399 }
400 ///@}
401};
402
403// A generic version of spxAbs. It would be nice if we could replace spxAbs
404// with std::abs. Currently there are different versions of spxAbs under
405// compile time #if. It's better to make this an overloaded function. Even
406// better, replace it by std::abs since types from boost/multiprecision would
407// need no extra modification.
408template <class R>
409R spxAbs(R a)
410{
411 return abs(a);
412}
413
414// cmath means proper long double function gets called, e.g. for fabs -> fabsl.
415// Documentation unclear for nextafterl, so the ifdef remains for that case.
416#ifdef WITH_LONG_DOUBLE
417// returns the next representable value after x in the direction of y
418inline Real spxNextafter(Real x, Real y)
419{
420 return nextafterl(x, y);
421}
422#else
423// returns the next representable value after x in the direction of y
425{
426#ifndef _MSC_VER
427 return nextafter(x, y);
428#else
429 return _nextafter(x, y);
430#endif
431}
432#endif
433
434/// returns |a|
435template <>
436inline Real spxAbs(Real a)
437{
438 return fabs(a);
439}
440
441/// returns square root
443{
444 return std::sqrt(a);
445}
446
447/// returns max(|a|,|b|)
448inline Real maxAbs(Real a, Real b)
449{
450 const Real absa = spxAbs(a);
451 const Real absb = spxAbs(b);
452
453 return absa > absb ? absa : absb;
454}
455
456/// returns (a-b) / max(|a|,|b|,1.0)
457inline Real relDiff(Real a, Real b)
458{
459 return (a - b) / (maxAbs(a, b) > 1.0 ? maxAbs(a, b) : 1.0);
460}
461
462/// safe version of snprintf
463inline int spxSnprintf(
464 char* t, /**< target string */
465 size_t len, /**< length of the string to copy */
466 const char* s, /**< source string */
467 ... /**< further parameters */
468)
469{
470 va_list ap;
471 int n;
472
473 assert(t != nullptr);
474 assert(len > 0);
475
476 va_start(ap, s); /*lint !e826*/
477
478#ifdef _WIN32
479 n = _vsnprintf(t, len, s, ap);
480#else
481 n = vsnprintf(t, len, s, ap); /*lint !e571*/
482#endif
483 va_end(ap);
484
485 if(n < 0 || (size_t) n >= len)
486 {
487#ifndef NDEBUG
488
489 if(n < 0)
490 {
491 SPX_MSG_ERROR(std::cerr << "vsnprintf returned " << n << " while reading: " << s << std::endl;)
492 }
493
494#endif
495 t[len - 1] = '\0';
496 n = (int) len - 1;
497 }
498
499 return n;
500}
501
502#ifdef SOPLEX_WITH_BOOST
503
504using namespace boost::multiprecision;
505
506#ifdef SOPLEX_WITH_GMP
507template<boost::multiprecision::expression_template_option eto>
508inline number<gmp_rational, eto> ldexp(number<gmp_rational, eto>, int exp)
509{
510 assert(false);
511 return number<gmp_rational>();
512}
513
514template<boost::multiprecision::expression_template_option eto>
515inline number<gmp_rational, eto> frexp(number<gmp_rational, eto>, int* exp)
516{
517 assert(false);
518 return number<gmp_rational>();
519}
520#else
521inline cpp_rational ldexp(cpp_rational r, int exp)
522{
523 assert(false);
524 return cpp_rational();
525}
526
527inline cpp_rational frexp(cpp_rational, int* exp)
528{
529 assert(false);
530 return cpp_rational();
531}
532#endif
533
534// wrapped frexp function
535template <typename T, boost::multiprecision::expression_template_option eto>
536boost::multiprecision::number<T, eto> spxFrexp(boost::multiprecision::number<T, eto> y, int* exp)
537{
538 return frexp(y, exp);
539}
540
541// Overloaded spxLdexp
542template <typename T, boost::multiprecision::expression_template_option eto>
543boost::multiprecision::number<T> spxLdexp(boost::multiprecision::number<T, eto> x, int exp)
544{
545 return ldexp(x, exp);
546}
547
548// Overloaded function to return the square-root
549template <typename T, expression_template_option ep>
550number<T, ep> spxSqrt(number<T, ep> a)
551{
552 return sqrt(a);
553}
554
555// the nextafter function
556template <typename T, expression_template_option eto>
557number<T, eto> spxNextafter(number<T, eto> x,
558 number<T, eto> y)
559{
560 // Turns out that nextafter is not supported in the mpfr library? The mpfr
561 // library does a different function named nextabove. Probably a
562 // replacement? I've made an issue about this.
563 // return nextafter(x,y);
564
565 // @todo Temporarily, I'm returning 0
566 assert(false);
567 return 0;
568}
569
570// Returns the square root
571template <typename T>
572number<T> spxSqrt(number<T> a)
573{
574 return sqrt(a);
575}
576
577/// returns max(|a|,|b|)
578template <typename T, expression_template_option et>
579inline number<T, et> maxAbs(
580 number<T, et> a, number<T, et> b)
581{
582 const auto absa = spxAbs(a);
583 const auto absb = spxAbs(b);
584
585 return absa > absb ? absa : absb;
586}
587
588template <typename T, expression_template_option et>
589inline number<T, et> relDiff(number<T, et> a,
590 number<T, et> b)
591{
592 return (a - b) / (maxAbs(a, b) > 1.0 ? maxAbs(a, b) : 1.0);
593}
594#endif
595using namespace soplex;
596
597} // namespace soplex
598
599// For the templated functions
600#include "spxdefines.hpp"
601
602#endif // _SPXDEFINES_H_
Real s_epsilon_factorization
epsilon for factorization
Definition: spxdefines.h:330
Real feastol()
global feasibility tolerance
Definition: spxdefines.cpp:99
Real floatingPointFeastol()
floating point feasibility tolerance used within the solver
Definition: spxdefines.cpp:119
void setFloatingPointFeastol(Real ftol)
set floating point feasibility tolerance used within the solver
Definition: spxdefines.cpp:124
Real s_floating_point_opttol
floating point optimality tolerance
Definition: spxdefines.h:342
Real s_floating_point_feastol
floating point feasibility tolerance
Definition: spxdefines.h:340
Real epsilon()
global zero epsilon
Definition: spxdefines.cpp:56
Real s_epsilon_update
epsilon for factorization update
Definition: spxdefines.h:332
Real s_epsilon_pivot
epsilon for pivot zero tolerance in factorization
Definition: spxdefines.h:334
Real epsilonFactorization()
zero espilon used in factorization
Definition: spxdefines.cpp:68
Real s_feastol
feasibility tolerance
Definition: spxdefines.h:336
Real scaleAccordingToEpsilon(Real a)
scale a value such that it remains unchanged at default epsilon, but is scaled withs smaller epsilon ...
Definition: spxdefines.h:396
void setFeastol(Real ftol)
set global feasibility tolerance
Definition: spxdefines.cpp:104
void setEpsilonUpdate(Real eps)
set zero espilon used in factorization update
Definition: spxdefines.cpp:84
Real epsilonPivot()
zero espilon used in pivot
Definition: spxdefines.cpp:89
void setOpttol(Real otol)
set global optimality tolerance
Definition: spxdefines.cpp:114
void setEpsilonFactorization(Real eps)
set zero espilon used in factorization
Definition: spxdefines.cpp:73
Real floatingPointOpttol()
floating point optimality tolerance used within the solver
Definition: spxdefines.cpp:129
void setFloatingPointOpttol(Real otol)
set floating point optimality tolerance used within the solver
Definition: spxdefines.cpp:134
void setEpsilon(Real eps)
set global zero epsilon
Definition: spxdefines.cpp:61
Real s_epsilon
default allowed additive zero: 1.0 + EPS_ZERO == 1.0
Definition: spxdefines.h:328
void setEpsilonPivot(Real eps)
set zero espilon used in pivot
Definition: spxdefines.cpp:94
Real s_epsilon_multiplier
multiplier for fixed numbers that should change if s_epsilon changes
Definition: spxdefines.h:344
Real epsilonUpdate()
zero espilon used in factorization update
Definition: spxdefines.cpp:79
Real s_opttol
optimality tolerance
Definition: spxdefines.h:338
Real opttol()
global optimality tolerance
Definition: spxdefines.cpp:109
Everything should be within this namespace.
int spxSnprintf(char *t, size_t len, const char *s,...)
safe version of snprintf
Definition: spxdefines.h:463
R spxAbs(R a)
Definition: spxdefines.h:409
Real spxNextafter(Real x, Real y)
Definition: spxdefines.h:424
bool msginconsistent(const char *name, const char *file, int line)
Definition: spxdefines.cpp:43
double Real
Definition: spxdefines.h:269
Real maxAbs(Real a, Real b)
returns max(|a|,|b|)
Definition: spxdefines.h:448
Real spxSqrt(Real a)
returns square root
Definition: spxdefines.h:442
Real relDiff(Real a, Real b)
returns (a-b) / max(|a|,|b|,1.0)
Definition: spxdefines.h:457
bool EQ(int a, int b)
Definition: spxdefines.cpp:36
bool isPlusZero(R x)
detects whether value is positive zero
Definition: spxdefines.h:312
SOPLEX_THREADLOCAL const Real infinity
Definition: spxdefines.cpp:41
#define SOPLEX_DEFAULT_EPS_PIVOR
Definition: spxdefines.h:290
#define SOPLEX_DEFAULT_EPS_ZERO
default allowed additive zero: 1.0 + EPS_ZERO == 1.0
Definition: spxdefines.h:281
#define SPX_MSG_ERROR(x)
Prints out message x if the verbosity level is at least SPxOut::VERB_ERROR.
Definition: spxdefines.h:163
#define SOPLEX_THREADLOCAL
SOPLEX_DEBUG.
Definition: spxdefines.h:196
#define SOPLEX_DEFAULT_EPS_UPDATE
Definition: spxdefines.h:287
#define SOPLEX_DEFAULT_EPS_FACTOR
Definition: spxdefines.h:284
#define SOPLEX_DEFAULT_BND_VIOL
default allowed bound violation
Definition: spxdefines.h:277