00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_EXPRDIV_HPP
00012 #define COUENNE_EXPRDIV_HPP
00013
00014 #include "CouenneExprOp.hpp"
00015 #include "CouennePrecisions.hpp"
00016
00017 namespace Couenne {
00018
00019 #define BR_NEXT_ZERO 1e-3
00020 #define BR_MULT 1e-3
00021
00023
00024 class exprDiv: public exprOp {
00025
00026 public:
00027
00029 exprDiv (expression **al, int n = 2):
00030 exprOp (al, n) {}
00031
00033 exprDiv (expression *arg0, expression *arg1):
00034 exprOp (arg0, arg1) {}
00035
00037 expression *clone (Domain *d = NULL) const
00038 {return new exprDiv (clonearglist (d), nargs_);}
00039
00041 std::string printOp () const
00042 {return "/";}
00043
00045 inline CouNumber operator () ();
00046
00048 CouNumber gradientNorm (const double *x);
00049
00051 expression *differentiate (int index);
00052
00054 expression *simplify ();
00055
00057 inline int Linearity () {
00058
00059 if (arglist_ [1] -> Type () == CONST)
00060 return arglist_ [0] -> Linearity ();
00061 else return NONLINEAR;
00062 }
00063
00065 void getBounds (expression *&lb, expression *&ub);
00066
00068 void getBounds (CouNumber &lb, CouNumber &ub);
00069
00072 exprAux *standardize (CouenneProblem *p, bool addAux = true);
00073
00075 void generateCuts (expression *w,
00076 OsiCuts &cs, const CouenneCutGenerator *cg,
00077 t_chg_bounds * = NULL, int = -1,
00078 CouNumber = -COUENNE_INFINITY,
00079 CouNumber = COUENNE_INFINITY);
00080
00082 virtual enum expr_type code () {return COU_EXPRDIV;}
00083
00085 bool isInteger ();
00086
00088 bool impliedBound (int, CouNumber *, CouNumber *, t_chg_bounds *, enum auxSign = expression::AUX_EQ);
00089
00092 virtual CouNumber selectBranch (const CouenneObject *obj,
00093 const OsiBranchingInformation *info,
00094 expression * &var,
00095 double * &brpts,
00096 double * &brDist,
00097
00098 int &way);
00099
00101 virtual void closestFeasible (expression *varind,
00102 expression *vardep,
00103 CouNumber &left,
00104 CouNumber &right) const;
00105
00108 virtual bool isCuttable (CouenneProblem *problem, int index) const
00109 {return false;}
00110 };
00111
00112
00114
00115 inline CouNumber exprDiv::operator () ()
00116 {return ((*(*arglist_)) () / (*(arglist_ [1])) ());}
00117
00118
00119 #define SAFE_COEFFICIENT 1e9
00120
00123
00124 inline bool is_boundbox_regular (register CouNumber b1, register CouNumber b2) {
00125
00126
00127
00128
00129
00130 return
00131 (fabs (b1) < SAFE_COEFFICIENT) &&
00132 (fabs (b2) < SAFE_COEFFICIENT) &&
00133 (fabs (b1*b2) < SAFE_COEFFICIENT);
00134
00135 }
00136
00137 }
00138
00139 #endif