Couenne  0.2
CouenneExprBDiv.hpp
Go to the documentation of this file.
1 /* \$Id: CouenneExprBDiv.hpp 490 2011-01-14 16:07:12Z pbelotti \$ */
2 /*
3  * Name: exprBDiv.hpp
4  * Author: Pietro Belotti
5  * Purpose: definition of operators to compute lower/upper bounds of divisions
6  *
7  * (C) Carnegie-Mellon University, 2006.
9  */
10
11 #ifndef COUENNE_EXPRBDIV_H
12 #define COUENNE_EXPRBDIV_H
13
14 #include "CouenneExprOp.hpp"
15
16 namespace Couenne {
17
19 static inline CouNumber safeDiv (register CouNumber a, register CouNumber b, int sign) {
20
21  if (fabs (a) < COUENNE_EPS) return 0;
22  // if (fabs (b) < COUENNE_EPS)) return 0;
23  // else return 0
24
25  if (fabs (b) < COUENNE_EPS) return ((sign < 0) ? -COUENNE_INFINITY : COUENNE_INFINITY);
26
27  if (a > COUENNE_INFINITY) return ((sign < 0) ? -COUENNE_INFINITY : COUENNE_INFINITY);
28  if (a < -COUENNE_INFINITY) return ((sign < 0) ? -COUENNE_INFINITY : COUENNE_INFINITY);
29
30  return a/b;
31 }
32
33
36
37 class exprLBDiv: public exprOp {
38
39  public:
40
42  exprLBDiv (expression **al, int n):
43  exprOp (al, n) {} //< non-leaf expression, with argument list
44
46  expression *clone (Domain *d = NULL) const
47  {return new exprLBDiv (clonearglist (d), nargs_);}
48
51
53  enum pos printPos () const
54  {return PRE;}
55
57  std::string printOp () const
58  {return "LB_Div";}
59 };
60
61
63
65
66  register CouNumber n = (*(arglist_ [0])) ();
67  register CouNumber N = (*(arglist_ [1])) ();
68  register CouNumber d = (*(arglist_ [2])) ();
69  register CouNumber D = (*(arglist_ [3])) ();
70  // (n,N,d,D) lb
71  if (d > 0) // (?,?,+,+)
72  if (n > 0) return safeDiv (n,D,-1); // (+,+,+,+) --> n/D
73  else return safeDiv (n,d,-1); // (-,?,+,+) --> n/d
74  else { // d <= 0
75  if (D > 0) return - COUENNE_INFINITY; // (?,?,-,+) --> unbounded
76  else if (N > 0) return safeDiv (N,D,-1); // (?,+,-,-) --> N/D
77  else return safeDiv (N,d,-1); // (-,-,-,-) --> N/d
78  }
79 }
80
81
84
85 class exprUBDiv: public exprOp {
86
87  public:
88
90  exprUBDiv (expression **al, int n):
91  exprOp (al, n) {} //< non-leaf expression, with argument list
92
94  expression *clone (Domain *d = NULL) const
95  {return new exprUBDiv (clonearglist (d), nargs_);}
96
99
101  enum pos printPos () const
102  {return PRE;}
103
105  std::string printOp () const
106  {return "UB_Div";}
107 };
108
109
111
113
114  register CouNumber n = (*(arglist_ [0])) ();
115  register CouNumber N = (*(arglist_ [1])) ();
116  register CouNumber d = (*(arglist_ [2])) ();
117  register CouNumber D = (*(arglist_ [3])) ();
118
119  if (d > 0) // (n,N,d,D) lb
120  if (N < 0) return safeDiv (N,D,1); // (-,-,+,+) --> N/D
121  else return safeDiv (N,d,1); // (?,+,+,+) --> N/d
122  else { // d <= 0
123  if (D > 0) return + COUENNE_INFINITY; // (?,?,-,+) --> unbounded
124  else if (n < 0) return safeDiv (n,D,1); // (-,?,-,-) --> n/D
125  else return safeDiv (n,d,1); // (+,+,-,-) --> n/d
126  }
127 }
128
129 }
130
131 #endif
expression * clone(Domain *d=NULL) const
cloning method
CouNumber operator()()
function for the evaluation of the expression
pos
position where the operator should be printed when printing the expression
class to compute upper bound of a fraction based on the bounds of both numerator and denominator ...
exprLBDiv(expression **al, int n)
Constructors, destructor.
std::string printOp() const
print operator
exprUBDiv(expression **al, int n)
Constructors, destructor.
enum pos printPos() const
print position (PRE, INSIDE, POST)
expression * clone(Domain *d=NULL) const
cloning method
expression ** clonearglist(Domain *d=NULL) const
clone argument list (for use with clone method)
CouNumber operator()()
function for the evaluation of the expression
#define COUENNE_EPS
expression ** arglist_
argument list is an array of pointers to other expressions
double CouNumber
main number type in Couenne
int nargs_
number of arguments (cardinality of arglist)
general n-ary operator-type expression: requires argument list.
#define COUENNE_INFINITY
Expression base class.
enum pos printPos() const
print position (PRE, INSIDE, POST)
static CouNumber safeDiv(register CouNumber a, register CouNumber b, int sign)
division that avoids NaN&#39;s and considers a sign when returning infinity
std::string printOp() const
print operator
class to compute lower bound of a fraction based on the bounds of both numerator and denominator ...
Define a dynamic point+bounds, with a way to save and restore previous points+bounds through a LIFO s...