1 /* $Id$
2  *
3  * Name:    exprCeil.hpp
4  * Author:  Pietro Belotti
5  * Purpose: definition of ceiling
6  *
7  * (C) Pietro Belotti, 2011.
8  * This file is licensed under the Eclipse Public License (EPL)
9  */
10 
11 #ifndef COUENNE_EXPRCEIL_HPP
12 #define COUENNE_EXPRCEIL_HPP
13 
14 #include "CouenneExpression.hpp"
15 
16 namespace Couenne {
17 
18 /// class ceiling, \f$ \lceil f(x) \rceil \f$
19 
20 class exprCeil: public exprUnary {
21 
22  public:
23 
24   /// constructor, destructor
exprCeil(expression * arg)25   exprCeil (expression *arg):
26     exprUnary (arg) {}
27 
28   /// cloning method
clone(Domain * d=NULL) const29   expression *clone (Domain *d = NULL) const
30   {return new exprCeil (argument_ -> clone (d));}
31 
32   //// the operator's function
F()33   inline unary_function F ()
34   {return ceil;}
35 
36   /// print operator
printOp() const37   std::string printOp () const
38   {return "ceil";}
39 
40   /// return l-2 norm of gradient at given point
gradientNorm(const double * x)41   inline CouNumber gradientNorm (const double *x) {
42     return (argument_ -> Index () < 0) ?
43       0. : fabs (x [argument_ -> Index ()]);
44   }
45 
46   /// obtain derivative of expression
47   expression *differentiate (int index);
48 
49   /// Get lower and upper bound of an expression (if any)
50   void getBounds (expression *&, expression *&);
51 
52   /// Get value of lower and upper bound of an expression
53   void getBounds (CouNumber &lb, CouNumber &ub);
54 
55   /// generate equality between *this and *w
56   void generateCuts (expression *w, //const OsiSolverInterface &si,
57 		     OsiCuts &cs, const CouenneCutGenerator *cg,
58 		     t_chg_bounds * = NULL, int = -1,
59 		     CouNumber = -COUENNE_INFINITY,
60 		     CouNumber =  COUENNE_INFINITY);
61 
62   /// code for comparisons
code()63   virtual enum expr_type code ()
64   {return COU_EXPRCEIL;}
65 
66   /// implied bound processing
impliedBound(int index,CouNumber * l,CouNumber * u,t_chg_bounds * chg,enum auxSign=expression::AUX_EQ)67   bool impliedBound (int index, CouNumber *l, CouNumber *u, t_chg_bounds *chg, enum auxSign = expression::AUX_EQ) {
68 
69     bool impl = true;
70     return impl;
71   }
72 
73   /// Set up branching object by evaluating many branching points for
74   /// each expression's arguments
selectBranch(const CouenneObject * obj,const OsiBranchingInformation * info,expression * & var,double * & brpts,double * & brDist,int & way)75   virtual CouNumber selectBranch (const CouenneObject *obj,
76 				  const OsiBranchingInformation *info,
77 				  expression * &var,
78 				  double * &brpts,
79  				  double * &brDist, // distance of current LP
80 					  	    // point to new convexifications
81 				  int &way)
82   {return 0.;}
83 
84   /// closest feasible points in function in both directions
85   virtual void closestFeasible (expression *varind, expression *vardep,
86 				CouNumber& left, CouNumber& right) const;
87 
88   /// can this expression be further linearized or are we on its
89   /// concave ("bad") side?
isCuttable(CouenneProblem * problem,int index) const90   virtual bool isCuttable (CouenneProblem *problem, int index) const
91   {return false;}
92 
93   /// either CONVEX, CONCAVE, AFFINE, or NONCONVEX
94   //virtual enum convexity convexity () const;
95 };
96 
97 }
98 
99 #endif
100