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-2017 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SoPlex is distributed under the terms of the ZIB Academic Licence. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SoPlex; see the file COPYING. If not email to soplex@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file spxdefines.h
17  * @brief Debugging, floating point type and parameter definitions.
18  *
19  * In optimized code with \c NDEBUG defined, only
20  * \ref soplex::SPxOut::INFO1 "INFO1",
21  * \ref soplex::SPxOut::INFO2 "INFO2", and
22  * \ref soplex::SPxOut::INFO3 "INFO3" are set.
23  * If \c NDEBUG is not defined, the code within \#TRACE is used.
24  * If \c SOPLEX_DEBUG is defined, the code within
25  * \ref soplex::SPxOut::DEBUG "DEBUG" is also used.
26  *
27  * If \c WITH_LONG_DOUBLE is defined, all Real numbers are of type
28  * long double instead of just double.
29  */
30 #ifndef _SPXDEFINES_H_
31 #define _SPXDEFINES_H_
32 
33 #include <math.h>
34 #ifdef _MSC_VER
35 #include <float.h>
36 #endif
37 
38 #include <assert.h>
39 #include <stdarg.h>
40 #include <stdio.h>
41 #include <iostream>
42 
43 namespace soplex
44 {
45 #define SOPLEX_VERSION 310
46 #define SOPLEX_SUBVERSION 0
47 #define SOPLEX_APIVERSION 1
48 #define SOPLEX_COPYRIGHT "Copyright (c) 1996-2017 Konrad-Zuse-Zentrum fuer Informationstechnik Berlin (ZIB)"
49 
50 /*-----------------------------------------------------------------------------
51  * Assertion Macros etc.
52  *-----------------------------------------------------------------------------
53  */
54 
55 /**
56  \brief Macro to turn some assertions into warnings.
57 
58  If both \c NDEBUG and \c WITH_WARNINGS are defined then the failed
59  assertion is converted to a warning. In all other cases this macro is
60  equivalent to assert().
61 
62  @param prefix Short string for grepping in source code.
63  @param expr Expression that must be satisfied.
64 */
65 #if defined (NDEBUG) && defined (WITH_WARNINGS)
66 #define ASSERT_WARN( prefix, expr ) \
67  if ( !( expr ) ) \
68  { \
69  std::cerr \
70  << prefix \
71  << " failed assertion on line " << __LINE__ \
72  << " in file " << __FILE__ << ": " \
73  << #expr \
74  << std::endl; \
75  }
76 #else // just a normal assert
77 #define ASSERT_WARN( prefix, expr ) ( assert( expr ) )
78 #endif
79 
80 
81 
82 /*-----------------------------------------------------------------------------
83  * Debugging Macros etc.
84  *-----------------------------------------------------------------------------
85  */
86 
87 /**
88  Prints/Executes \p stream with verbosity level \p verbosity, resetting
89  the old verbosity level afterwards.
90  Usually the parameter \p stream prints something out.
91  This is an internal define used by MSG_ERROR, MSG_WARNING, etc.
92 */
93 #ifdef DISABLE_VERBOSITY
94 #define DO_WITH_TMP_VERBOSITY( verbosity, spxout, do_something ) {}
95 #define DO_WITH_ERR_VERBOSITY( do_something ) {}
96 #else
97 #define DO_WITH_TMP_VERBOSITY( verbosity, spxout, do_something ) \
98  { \
99  if( &spxout != NULL ) \
100  { \
101  if( verbosity <= spxout.getVerbosity() ) \
102  { \
103  const SPxOut::Verbosity old_verbosity = spxout.getVerbosity(); \
104  spxout.setVerbosity( verbosity ); \
105  do_something; \
106  spxout.setVerbosity( old_verbosity ); \
107  } \
108  } \
109  }
110 #define DO_WITH_ERR_VERBOSITY( do_something ) { do_something; }
111 #endif
112 
113 /// Prints out message \p x if the verbosity level is at least SPxOut::ERROR.
114 #define MSG_ERROR(x) { DO_WITH_ERR_VERBOSITY( x ) }
115 /// Prints out message \p x if the verbosity level is at least SPxOut::WARNING.
116 #define MSG_WARNING(spxout, x) { DO_WITH_TMP_VERBOSITY( SPxOut::WARNING, spxout, x ) }
117 /// Prints out message \p x if the verbosity level is at least SPxOut::INFO1.
118 #define MSG_INFO1(spxout, x) { DO_WITH_TMP_VERBOSITY( SPxOut::INFO1, spxout, x ) }
119 /// Prints out message \p x if the verbosity level is at least SPxOut::INFO2.
120 #define MSG_INFO2(spxout, x) { DO_WITH_TMP_VERBOSITY( SPxOut::INFO2, spxout, x ) }
121 /// Prints out message \p x if the verbosity level is at least SPxOut::INFO3.
122 #define MSG_INFO3(spxout, x) { DO_WITH_TMP_VERBOSITY( SPxOut::INFO3, spxout, x ) }
123 
124 extern bool msginconsistent(const char* name, const char* file, int line);
125 
126 #define MSGinconsistent(name) msginconsistent(name, __FILE__, __LINE__)
127 
128 #if defined(SOPLEX_DEBUG)
129 // print output in any case, regardless of Param::verbose():
130 #define MSG_DEBUG(x) { x; }
131 #else
132 #define MSG_DEBUG(x) /**/
133 #endif //!SOPLEX_DEBUG
134 
135 
136 /*-----------------------------------------------------------------------------
137  * multi-thread support
138  *-----------------------------------------------------------------------------
139  */
140 // enable the user to compile without thread_local by setting USRCXXFLAGS=-DTHREADLOCAL=""
141 #if !defined(THREADLOCAL)
142 #if defined(_MSC_VER) && _MSC_VER < 1900
143 #define THREADLOCAL
144 #else
145 #define THREADLOCAL thread_local
146 #endif
147 #endif
148 
149 /*-----------------------------------------------------------------------------
150  * Long double support, Parameters and Epsilons
151  *-----------------------------------------------------------------------------
152  */
153 
154 #ifdef WITH_LONG_DOUBLE
155 
156 
157 typedef long double Real;
158 
159 #ifndef REAL
160 #define REAL(x) x##L
161 #define REAL_FORMAT "Lf"
162 #endif
163 /// default allowed bound violation
164 #ifndef DEFAULT_BND_VIOL
165 #define DEFAULT_BND_VIOL 1e-12L
166 #endif
167 /// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
168 #ifndef DEFAULT_EPS_ZERO
169 #define DEFAULT_EPS_ZERO 1e-28L
170 #endif
171 /// epsilon for factorization
172 #ifndef DEFAULT_EPS_FACTOR
173 #define DEFAULT_EPS_FACTOR 1e-30L
174 #endif
175 /// epsilon for factorization update
176 #ifndef DEFAULT_EPS_UPDATE
177 #define DEFAULT_EPS_UPDATE 1e-26L
178 #endif
179 #ifndef DEFAULT_EPS_PIVOT
180 #define DEFAULT_EPS_PIVOT 1e-20L
181 #endif
182 ///
183 #define DEFAULT_INFINITY 1e100L
184 
185 
186 #else
187 
188 #ifdef WITH_FLOAT
189 
190 typedef float Real;
191 
192 #ifndef REAL
193 #define REAL(x) x
194 #define REAL_FORMAT "f"
195 #endif
196 /// default allowed bound violation
197 #ifndef DEFAULT_BND_VIOL
198 #define DEFAULT_BND_VIOL 1e-1
199 #endif
200 /// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
201 #ifndef DEFAULT_EPS_ZERO
202 #define DEFAULT_EPS_ZERO 1e-7
203 #endif
204 #ifndef DEFAULT_EPS_FACTOR
205 #define DEFAULT_EPS_FACTOR 1e-7
206 #endif
207 #ifndef DEFAULT_EPS_UPDATE
208 #define DEFAULT_EPS_UPDATE 1e-6
209 #endif
210 #ifndef DEFAULT_EPS_PIVOT
211 #define DEFAULT_EPS_PIVOT 1e-6
212 #endif
213 #define DEFAULT_INFINITY 1e100
214 
215 
216 #else
217 
218 typedef double Real;
219 
220 #ifndef REAL
221 #define REAL(x) x
222 #define REAL_FORMAT "lf"
223 #endif
224 /// default allowed bound violation
225 #ifndef DEFAULT_BND_VIOL
226 #define DEFAULT_BND_VIOL 1e-6
227 #endif
228 /// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
229 #ifndef DEFAULT_EPS_ZERO
230 #define DEFAULT_EPS_ZERO 1e-16
231 #endif
232 #ifndef DEFAULT_EPS_FACTOR
233 #define DEFAULT_EPS_FACTOR 1e-20
234 #endif
235 #ifndef DEFAULT_EPS_UPDATE
236 #define DEFAULT_EPS_UPDATE 1e-16
237 #endif
238 #ifndef DEFAULT_EPS_PIVOT
239 #define DEFAULT_EPS_PIVOT 1e-10
240 #endif
241 #define DEFAULT_INFINITY 1e100
242 
243 #endif // !WITH_FLOAT
244 #endif // !WITH_LONG_DOUBLE
245 
246 #define MAXIMUM(x,y) ((x)>(y) ? (x) : (y))
247 #define MINIMUM(x,y) ((x)<(y) ? (x) : (y))
248 
249 #define SPX_MAXSTRLEN 1024 /**< maximum string length in SoPlex */
250 
251 THREADLOCAL extern const Real infinity;
252 
253 class Param
254 {
255 private:
256 
257  //------------------------------------
258  /**@name Data */
259  //@{
260  /// default allowed additive zero: 1.0 + EPS_ZERO == 1.0
261  THREADLOCAL static Real s_epsilon;
262  /// epsilon for factorization
264  /// epsilon for factorization update
266  /// epsilon for pivot zero tolerance in factorization
268  //@}
269 
270 public:
271 
272  //------------------------------------
273  /**@name Access / modification */
274  //@{
275  ///
276  static Real epsilon();
277  ///
278  static void setEpsilon(Real eps);
279  ///
280  static Real epsilonFactorization();
281  ///
282  static void setEpsilonFactorization(Real eps);
283  ///
284  static Real epsilonUpdate();
285  ///
286  static void setEpsilonUpdate(Real eps);
287  ///
288  static Real epsilonPivot();
289  ///
290  static void setEpsilonPivot(Real eps);
291  //@}
292 };
293 
294 #ifdef WITH_LONG_DOUBLE
295 /// returns |a|
296 inline Real spxAbs(Real a)
297 {
298  return fabsl(a);
299 }
300 
301 /// returns square root
302 inline Real spxSqrt(Real a)
303 {
304  return sqrtl(a);
305 }
306 
307 // returns the next representable value after x in the direction of y
308 #ifndef SOPLEX_LEGACY
309 inline Real spxNextafter(Real x, Real y)
310 {
311  return nextafterl(x,y);
312 }
313 #endif
314 
315 /// returns x * 2^exp
316 inline Real spxLdexp(Real x, int exp)
317 {
318  return ldexpl(x,exp);
319 }
320 
321 // returns x and exp such that y = x * 2^exp
322 inline Real spxFrexp(Real y, int* exp)
323 {
324  return frexpl(y, exp);
325 }
326 #else
327 /// returns |a|
328 inline Real spxAbs(Real a)
329 {
330  return fabs(a);
331 }
332 
333 /// returns square root
334 inline Real spxSqrt(Real a)
335 {
336  return sqrt(a);
337 }
338 
339 // returns the next representable value after x in the direction of y
340 #ifndef SOPLEX_LEGACY
341 inline Real spxNextafter(Real x, Real y)
342 {
343 #ifndef _MSC_VER
344  return nextafter(x,y);
345 #else
346  return _nextafter(x,y);
347 #endif
348 }
349 #endif
350 
351 /// returns x * 2^exp
352 inline Real spxLdexp(Real x, int exp)
353 {
354  return ldexp(x,exp);
355 }
356 
357 // returns x and exp such that y = x * 2^exp
358 inline Real spxFrexp(Real y, int* exp)
359 {
360  return frexp(y, exp);
361 }
362 #endif
363 
364 /// returns max(|a|,|b|)
365 inline Real maxAbs(Real a, Real b)
366 {
367  const Real absa = spxAbs(a);
368  const Real absb = spxAbs(b);
369 
370  return absa > absb ? absa : absb;
371 }
372 
373 /// returns (a-b) / max(|a|,|b|,1.0)
374 inline Real relDiff(Real a, Real b)
375 {
376  return (a - b) / (maxAbs(a, b) > 1.0 ? maxAbs(a, b) : 1.0);
377 }
378 
379 /// returns \c true iff |a-b| <= eps
380 inline bool EQ(Real a, Real b, Real eps = Param::epsilon())
381 {
382  return spxAbs(a - b) <= eps;
383 }
384 
385 /// returns \c true iff |a-b| > eps
386 inline bool NE(Real a, Real b, Real eps = Param::epsilon())
387 {
388  return spxAbs(a - b) > eps;
389 }
390 
391 /// returns \c true iff a < b + eps
392 inline bool LT(Real a, Real b, Real eps = Param::epsilon())
393 {
394  return (a - b) < -eps;
395 }
396 
397 /// returns \c true iff a <= b + eps
398 inline bool LE(Real a, Real b, Real eps = Param::epsilon())
399 {
400  return (a - b) < eps;
401 }
402 
403 /// returns \c true iff a > b + eps
404 inline bool GT(Real a, Real b, Real eps = Param::epsilon())
405 {
406  return (a - b) > eps;
407 }
408 
409 /// returns \c true iff a >= b + eps
410 inline bool GE(Real a, Real b, Real eps = Param::epsilon())
411 {
412  return (a - b) > -eps;
413 }
414 
415 /// returns \c true iff |a| <= eps
416 inline bool isZero(Real a, Real eps = Param::epsilon())
417 {
418  return spxAbs(a) <= eps;
419 }
420 
421 /// returns \c true iff |a| > eps
422 inline bool isNotZero(Real a, Real eps = Param::epsilon())
423 {
424  return spxAbs(a) > eps;
425 }
426 
427 /// returns \c true iff |relDiff(a,b)| <= eps
428 inline bool EQrel(Real a, Real b, Real eps = Param::epsilon())
429 {
430  return spxAbs(relDiff(a, b)) <= eps;
431 }
432 
433 /// returns \c true iff |relDiff(a,b)| > eps
434 inline bool NErel(Real a, Real b, Real eps = Param::epsilon())
435 {
436  return spxAbs(relDiff(a, b)) > eps;
437 }
438 
439 /// returns \c true iff relDiff(a,b) <= -eps
440 inline bool LTrel(Real a, Real b, Real eps = Param::epsilon())
441 {
442  return relDiff(a, b) <= -eps;
443 }
444 
445 /// returns \c true iff relDiff(a,b) <= eps
446 inline bool LErel(Real a, Real b, Real eps = Param::epsilon())
447 {
448  return relDiff(a, b) <= eps;
449 }
450 
451 /// returns \c true iff relDiff(a,b) > eps
452 inline bool GTrel(Real a, Real b, Real eps = Param::epsilon())
453 {
454  return relDiff(a, b) > eps;
455 }
456 
457 /// returns \c true iff relDiff(a,b) > -eps
458 inline bool GErel(Real a, Real b, Real eps = Param::epsilon())
459 {
460  return relDiff(a, b) > -eps;
461 }
462 
463 /// safe version of snprintf
464 inline int spxSnprintf(
465  char* t, /**< target string */
466  int len, /**< length of the string to copy */
467  const char* s, /**< source string */
468  ... /**< further parameters */
469  )
470 {
471  va_list ap;
472  int n;
473 
474  assert(t != NULL);
475  assert(len > 0);
476 
477  va_start(ap, s); /*lint !e826*/
478 
479 #if defined(_WIN32) || defined(_WIN64)
480  n = _vsnprintf(t, (size_t) len, s, ap);
481 #else
482  n = vsnprintf(t, (size_t) len, s, ap); /*lint !e571*/
483 #endif
484  va_end(ap);
485 
486  if( n < 0 || n >= len )
487  {
488 #ifndef NDEBUG
489  if( n < 0 )
490  {
491  MSG_ERROR( std::cerr << "vsnprintf returned " << n << " while reading: " << s << std::endl; )
492  }
493 #endif
494  t[len-1] = '\0';
495  n = len-1;
496  }
497  return n;
498 }
499 
500 } // namespace soplex
501 #endif // _SPXDEFINES_H_
Rational spxAbs(const Rational &r)
Absolute.
Definition: rational.cpp:3909
bool isNotZero(Real a, Real eps=Param::epsilon())
returns true iff |a| > eps
Definition: spxdefines.h:422
bool LTrel(Real a, Real b, Real eps=Param::epsilon())
returns true iff relDiff(a,b) <= -eps
Definition: spxdefines.h:440
bool GE(Real a, Real b, Real eps=Param::epsilon())
returns true iff a >= b + eps
Definition: spxdefines.h:410
static void setEpsilon(Real eps)
Definition: spxdefines.cpp:50
THREADLOCAL const Real infinity
Definition: spxdefines.cpp:26
int spxSnprintf(char *t, int len, const char *s,...)
safe version of snprintf
Definition: spxdefines.h:464
Real maxAbs(Real a, Real b)
returns max(|a|,|b|)
Definition: spxdefines.h:365
bool msginconsistent(const char *name, const char *file, int line)
Definition: spxdefines.cpp:33
bool LE(Real a, Real b, Real eps=Param::epsilon())
returns true iff a <= b + eps
Definition: spxdefines.h:398
bool LT(Real a, Real b, Real eps=Param::epsilon())
returns true iff a < b + eps
Definition: spxdefines.h:392
bool NE(Real a, Real b, Real eps=Param::epsilon())
returns true iff |a-b| > eps
Definition: spxdefines.h:386
Real spxFrexp(Real y, int *exp)
Definition: spxdefines.h:358
Real spxLdexp(Real x, int exp)
returns x * 2^exp
Definition: spxdefines.h:352
double Real
Definition: spxdefines.h:218
bool GT(Real a, Real b, Real eps=Param::epsilon())
returns true iff a > b + eps
Definition: spxdefines.h:404
static void setEpsilonPivot(Real eps)
Definition: spxdefines.cpp:80
#define MSG_ERROR(x)
Prints out message x if the verbosity level is at least SPxOut::ERROR.
Definition: spxdefines.h:114
static THREADLOCAL Real s_epsilon_pivot
epsilon for pivot zero tolerance in factorization
Definition: spxdefines.h:267
static Real epsilonUpdate()
Definition: spxdefines.cpp:65
Real spxSqrt(Real a)
returns square root
Definition: spxdefines.h:334
bool GTrel(Real a, Real b, Real eps=Param::epsilon())
returns true iff relDiff(a,b) > eps
Definition: spxdefines.h:452
bool GErel(Real a, Real b, Real eps=Param::epsilon())
returns true iff relDiff(a,b) > -eps
Definition: spxdefines.h:458
static Real epsilon()
Definition: spxdefines.cpp:45
bool EQ(Real a, Real b, Real eps=Param::epsilon())
returns true iff |a-b| <= eps
Definition: spxdefines.h:380
static THREADLOCAL Real s_epsilon
default allowed additive zero: 1.0 + EPS_ZERO == 1.0
Definition: spxdefines.h:261
Everything should be within this namespace.
Real relDiff(Real a, Real b)
returns (a-b) / max(|a|,|b|,1.0)
Definition: spxdefines.h:374
bool EQrel(Real a, Real b, Real eps=Param::epsilon())
returns true iff |relDiff(a,b)| <= eps
Definition: spxdefines.h:428
Real spxNextafter(Real x, Real y)
Definition: spxdefines.h:341
static void setEpsilonUpdate(Real eps)
Definition: spxdefines.cpp:70
bool NErel(Real a, Real b, Real eps=Param::epsilon())
returns true iff |relDiff(a,b)| > eps
Definition: spxdefines.h:434
static THREADLOCAL Real s_epsilon_update
epsilon for factorization update
Definition: spxdefines.h:265
static Real epsilonPivot()
Definition: spxdefines.cpp:75
bool LErel(Real a, Real b, Real eps=Param::epsilon())
returns true iff relDiff(a,b) <= eps
Definition: spxdefines.h:446
static void setEpsilonFactorization(Real eps)
Definition: spxdefines.cpp:60
bool isZero(Real a, Real eps=Param::epsilon())
returns true iff |a| <= eps
Definition: spxdefines.h:416
static Real epsilonFactorization()
Definition: spxdefines.cpp:55
static THREADLOCAL Real s_epsilon_factorization
epsilon for factorization
Definition: spxdefines.h:263
#define THREADLOCAL
SOPLEX_DEBUG.
Definition: spxdefines.h:145