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