00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_EXPRMIN_H
00012 #define COUENNE_EXPRMIN_H
00013
00014 #include "exprOp.hpp"
00015 #include "exprCopy.hpp"
00016 #include "exprStore.hpp"
00017
00018
00020
00021 class exprMin: public exprOp {
00022
00023 public:
00024
00026 exprMin (expression **al, int n):
00027 exprOp (al, n) {}
00028
00030 exprMin (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 exprMin *clone (Domain *d = NULL) const
00038 {return new exprMin (clonearglist (d), nargs_);}
00039
00041 std::string printOp () const
00042 {return "min";}
00043
00045 enum pos printPos () const
00046 {return PRE;}
00047
00049 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
00064 void getBounds (expression *&, expression *&);
00065
00068 virtual inline exprAux *standardize (CouenneProblem *, bool addAux = true)
00069 {return NULL;}
00070
00072 void generateCuts (expression *w,
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_EXPRMIN;}
00081 };
00082
00083
00085
00086 inline CouNumber exprMin::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