00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_EXPRBSIN_HPP
00012 #define COUENNE_EXPRBSIN_HPP
00013
00014 #include "exprOp.hpp"
00015 #include "CoinHelperFunctions.hpp"
00016
00017 #include <math.h>
00018 #ifndef M_PI
00019 # define M_PI 3.14159265358979323846
00020 #endif
00021
00022
00025
00026 class exprLBSin: public exprOp {
00027
00028 public:
00029
00031 exprLBSin (expression *lb, expression *ub):
00032 exprOp (new expression * [2], 2) {
00033 arglist_ [0] = lb;
00034 arglist_ [1] = ub;
00035 }
00036
00038 expression *clone (Domain *d = NULL) const
00039 {return new exprLBSin (arglist_ [0] -> clone (d),
00040 arglist_ [1] -> clone (d));}
00041
00043 CouNumber operator () ();
00044
00046 enum pos printPos () const
00047 {return PRE;}
00048
00050 std::string printOp () const
00051 {return "LB_Sin";}
00052 };
00053
00054
00056
00057 inline CouNumber exprLBSin::operator () () {
00058
00059 register CouNumber
00060 l = (*(arglist_ [0])) (),
00061 u = (*(arglist_ [1])) ();
00062
00063 CouNumber pi2 = 2 * M_PI;
00064
00065 if ((u - l > pi2) ||
00066 (floor (l/pi2 - 0.75) <
00067 floor (u/pi2 - 0.75)))
00068 return -1.;
00069
00070 return CoinMin (sin (l), sin (u));
00071 }
00072
00073
00075
00078
00079 class exprUBSin: public exprOp {
00080
00081 public:
00082
00084 exprUBSin (expression *lb, expression *ub):
00085 exprOp (new expression * [2], 2) {
00086 arglist_ [0] = lb;
00087 arglist_ [1] = ub;
00088 }
00089
00091 expression *clone (Domain *d = NULL) const
00092 {return new exprUBSin (arglist_ [0] -> clone (d),
00093 arglist_ [1] -> clone (d));}
00094
00096 CouNumber operator () ();
00097
00099 std::string printOp () const
00100 {return "UB_Sin";}
00101
00103 enum pos printPos () const
00104 {return PRE;}
00105 };
00106
00107
00109
00110 inline CouNumber exprUBSin::operator () () {
00111
00112 register CouNumber
00113 l = (*(arglist_ [0])) (),
00114 u = (*(arglist_ [1])) ();
00115
00116 CouNumber pi2 = 2 * M_PI;
00117
00118 if ((u - l > pi2) ||
00119 (floor (l/pi2 - 0.25) <
00120 floor (u/pi2 - 0.25)))
00121 return 1.;
00122
00123 return CoinMax (sin (l), sin (u));
00124 }
00125
00126 #endif