exprBSin.hpp

Go to the documentation of this file.
00001 /* $Id: exprBSin.hpp 141 2009-06-03 04:19:19Z pbelotti $ */
00002 /*
00003  * Name:    exprBSin.hpp
00004  * Author:  Pietro Belotti
00005  * Purpose: definition of operators to compute lower/upper bounds of sines
00006  *
00007  * (C) Carnegie-Mellon University, 2006. 
00008  * This file is licensed under the Common Public License (CPL)
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   } //< non-leaf expression, with argument list
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) ||        // 1) interval spans whole cycle
00066       (floor (l/pi2 - 0.75) < // 2) there is a 3/2 pi + 2k pi between l and u
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   } //< non-leaf expression, with argument list
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) ||        // 1) interval spans whole cycle
00119       (floor (l/pi2 - 0.25) < // 2) there is a pi/2 + 2k pi between l and u
00120        floor (u/pi2 - 0.25))) 
00121     return 1.;
00122 
00123   return CoinMax (sin (l), sin (u));
00124 }
00125 
00126 #endif

Generated on Wed May 19 03:07:13 2010 for Couenne by  doxygen 1.4.7