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