00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_EXPRSUB_HPP
00012 #define COUENNE_EXPRSUB_HPP
00013
00014 #include "exprOp.hpp"
00015 #include "CouennePrecisions.hpp"
00016 #include "CouenneProblem.hpp"
00017
00019
00020 class exprSub: public exprOp {
00021
00022 public:
00023
00025 exprSub (expression **al, int n = 2):
00026 exprOp (al, n) {}
00027
00029 exprSub (expression *arg0, expression *arg1):
00030 exprOp (arg0, arg1) {}
00031
00033 expression *clone (Domain *d = NULL) const
00034 {return new exprSub (clonearglist (d), nargs_);}
00035
00037 std::string printOp () const
00038 {return "-";}
00039
00041 CouNumber operator () ();
00042
00044 expression *differentiate (int index);
00045
00047 expression *simplify ();
00048
00050 virtual inline int Linearity () {
00051
00052 int lin1 = arglist_ [0] -> Linearity ();
00053 int lin2 = arglist_ [1] -> Linearity ();
00054
00055 if (lin1 < lin2) return lin2;
00056 else return lin1;
00057 }
00058
00060 void getBounds (expression *&, expression *&);
00061
00063 void getBounds (CouNumber &lb, CouNumber &ub);
00064
00067 virtual exprAux *standardize (CouenneProblem *p, bool addAux = true);
00068
00070 virtual void generateCuts (expression *, const OsiSolverInterface &,
00071 OsiCuts &, const CouenneCutGenerator *,
00072 t_chg_bounds * = NULL, int = -1,
00073 CouNumber = -COUENNE_INFINITY,
00074 CouNumber = COUENNE_INFINITY);
00075
00077 virtual enum expr_type code () {return COU_EXPRSUB;}
00078
00080 bool impliedBound (int, CouNumber *, CouNumber *, t_chg_bounds *);
00081 };
00082
00083
00085
00086 inline CouNumber exprSub::operator () ()
00087 {return ((*(*arglist_)) () - (*(arglist_ [1])) ());}
00088
00089 #endif