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