exprMax.hpp

Go to the documentation of this file.
00001 /* $Id: exprMax.hpp 217 2009-07-08 17:02:07Z pbelotti $
00002  *
00003  * Name:    exprMax.hpp
00004  * Author:  Pietro Belotti
00005  * Purpose: definition of $\f(x_{\argmax_{i\in I} y_i})$ 
00006  *
00007  * (C) Carnegie-Mellon University, 2006-09.
00008  * This file is licensed under the Common Public License (CPL)
00009  */
00010 
00011 #ifndef COUENNE_EXPRMAX_H
00012 #define COUENNE_EXPRMAX_H
00013 
00014 #include "exprOp.hpp"
00015 #include "exprCopy.hpp"
00016 #include "exprStore.hpp"
00017 
00018 
00020 
00021 class exprMax: public exprOp {
00022 
00023  public:
00024 
00026   exprMax  (expression **al, int n): 
00027     exprOp (al, n) {} //< non-leaf expression, with argument list
00028 
00030   exprMax  (expression *el0, expression *el1):
00031     exprOp (new expression * [4], 4) {
00032     arglist_ [0] = new exprCopy (el0); arglist_ [1] = new exprStore (arglist_ [0]);
00033     arglist_ [2] = new exprCopy (el1); arglist_ [3] = new exprStore (arglist_ [2]);
00034   }
00035 
00037   exprMax *clone (Domain *d = NULL) const
00038     {return new exprMax (clonearglist (d), nargs_);}
00039 
00041   std::string printOp () const
00042     {return "max";}
00043 
00045   enum pos printPos () const
00046     {return PRE;}
00047 
00049   inline CouNumber operator () ();
00050 
00052   inline expression *differentiate (int) 
00053     {return NULL;} 
00054 
00056   inline expression *simplify () 
00057     {return NULL;}
00058 
00060   virtual inline int Linearity () 
00061     {return NONLINEAR;}
00062 
00063   // Get lower and upper bound of an expression (if any)
00064   void getBounds (expression *&, expression *&);
00065 
00068   virtual inline exprAux *standardize (CouenneProblem *, bool addAux = true)
00069     {return NULL;}
00070 
00072   void generateCuts (expression *w, //const OsiSolverInterface &si, 
00073                      OsiCuts &cs, const CouenneCutGenerator *cg, 
00074                      t_chg_bounds * = NULL, int = -1, 
00075                      CouNumber = -COUENNE_INFINITY, 
00076                      CouNumber =  COUENNE_INFINITY);
00077 
00079   virtual enum expr_type code ()
00080   {return COU_EXPRMAX;}
00081 };
00082 
00083 
00085 
00086 inline CouNumber exprMax::operator () () {
00087 
00088   CouNumber best_val = (*(arglist_ [0])) ();
00089   int best_ind = 0;
00090 
00091   for (int ind = 2; ind < nargs_; ind += 2) {
00092 
00093     CouNumber val = (*(arglist_ [ind])) ();
00094 
00095     if (val > best_val) {
00096       best_ind = ind;
00097       best_val = val;
00098     }
00099   }
00100 
00101   return (*(arglist_ [best_ind + 1])) ();
00102 }
00103 
00104 #endif

Generated on Sun Mar 6 03:03:41 2011 for Couenne by  doxygen 1.4.7