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