00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_EXPRSUM_H
00012 #define COUENNE_EXPRSUM_H
00013
00014 #include <vector>
00015
00016 #include "exprOp.hpp"
00017
00018
00020
00021 class exprSum: public exprOp {
00022
00023 public:
00024
00026 exprSum (expression ** = NULL, int = 0);
00027
00029 exprSum (expression *, expression *);
00030
00032 ~exprSum () {}
00033
00035 virtual expression *clone (Domain *d = NULL) const
00036 {return new exprSum (clonearglist (d), nargs_);}
00037
00039 std::string printOp () const
00040 {return "+";}
00041
00043 virtual CouNumber operator () ();
00044
00046 virtual expression *differentiate (int index);
00047
00049 virtual expression *simplify ();
00050
00052 virtual int Linearity ();
00053
00055 virtual void getBounds (expression *&, expression *&);
00056
00058 virtual void getBounds (CouNumber &, CouNumber &);
00059
00062 virtual exprAux *standardize (CouenneProblem *p, bool addAux = true);
00063
00065 virtual void generateCuts (expression *, const OsiSolverInterface &,
00066 OsiCuts &, const CouenneCutGenerator *,
00067 t_chg_bounds * = NULL, int = -1,
00068 CouNumber = -COUENNE_INFINITY,
00069 CouNumber = COUENNE_INFINITY);
00070
00072 virtual enum expr_type code ()
00073 {return COU_EXPRSUM;}
00074
00096 virtual bool impliedBound (int, CouNumber *, CouNumber *, t_chg_bounds *);
00097
00101 exprAux *createQuadratic (CouenneProblem *);
00102
00103 protected:
00104
00106 int impliedBoundSum (CouNumber wl,
00107 CouNumber wu,
00108 std::vector <CouNumber> &xl,
00109 std::vector <CouNumber> &xu,
00110 std::vector <std::pair <int, CouNumber> > &nl,
00111 std::vector <std::pair <int, CouNumber> > &nu);
00112 };
00113
00114
00116
00117 inline CouNumber exprSum::operator () () {
00118
00119 CouNumber ret = 0;
00120
00121 expression **al = arglist_;
00122
00123 for (int n = nargs_; n--;)
00124 ret += (**al++) ();
00125
00126 return ret;
00127 }
00128
00129 #endif