00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_EXPRMUL_H
00012 #define COUENNE_EXPRMUL_H
00013
00014 #include <vector>
00015
00016 #include "CouenneExprOp.hpp"
00017
00018 namespace Couenne {
00019
00021
00022 class exprMul: public exprOp {
00023
00024 public:
00025
00027 exprMul (expression **, int);
00028
00030 exprMul (expression *, expression *);
00031
00033 virtual expression *clone (Domain *d = NULL) const
00034 {return new exprMul (clonearglist (d), nargs_);}
00035
00037 std::string printOp () const
00038 {return "*";}
00039
00041 inline CouNumber operator () ();
00042
00044 virtual CouNumber gradientNorm (const double *x);
00045
00047 expression *differentiate (int index);
00048
00050 expression *simplify ();
00051
00053 virtual int Linearity ();
00054
00056 virtual void getBounds (expression *&, expression *&);
00057
00059 virtual void getBounds (CouNumber &lb, CouNumber &ub);
00060
00063 virtual exprAux *standardize (CouenneProblem *p, bool addAux = true);
00064
00066 virtual void generateCuts (expression *w,
00067 OsiCuts &cs, const CouenneCutGenerator *cg,
00068 t_chg_bounds * = NULL, int = -1,
00069 CouNumber = -COUENNE_INFINITY,
00070 CouNumber = COUENNE_INFINITY);
00071
00073 virtual enum expr_type code ()
00074 {return COU_EXPRMUL;}
00075
00077 virtual bool impliedBound (int, CouNumber *, CouNumber *, t_chg_bounds *,
00078 enum Couenne::expression::auxSign = Couenne::expression::AUX_EQ);
00079
00082 virtual CouNumber selectBranch (const CouenneObject *obj,
00083 const OsiBranchingInformation *info,
00084 expression * &var,
00085 double * &brpts,
00086 double * &brDist,
00087
00088 int &way);
00089
00091 virtual void closestFeasible (expression *varind,
00092 expression *vardep,
00093 CouNumber &left,
00094 CouNumber &right) const;
00095 protected:
00096
00098 int impliedBoundMul (CouNumber wl,
00099 CouNumber wu,
00100 std::vector <CouNumber> &xl,
00101 std::vector <CouNumber> &xu,
00102 std::vector <std::pair <int, CouNumber> > &nl,
00103 std::vector <std::pair <int, CouNumber> > &nu);
00104
00106 CouNumber balancedMul (const OsiBranchingInformation *info, int index, int wind);
00107
00110 virtual bool isCuttable (CouenneProblem *problem, int index) const
00111 {return false;}
00112 };
00113
00114
00116 inline CouNumber exprMul:: operator () () {
00117
00118 CouNumber ret = 1.;
00119 expression **al = arglist_;
00120
00121 for (int n = nargs_; n--;)
00122 ret *= (**al++) ();
00123
00124 return ret;
00125 }
00126
00127
00129 void unifiedProdCuts (const CouenneCutGenerator *, OsiCuts &,
00130 int, CouNumber, CouNumber, CouNumber,
00131 int, CouNumber, CouNumber, CouNumber,
00132 int, CouNumber, CouNumber, CouNumber,
00133 t_chg_bounds *, enum expression::auxSign);
00134
00135
00137 void upperEnvHull (const CouenneCutGenerator *cg, OsiCuts &cs,
00138 int xi, CouNumber x0, CouNumber xl, CouNumber xu,
00139 int yi, CouNumber y0, CouNumber yl, CouNumber yu,
00140 int wi, CouNumber w0, CouNumber wl, CouNumber wu);
00141
00142
00145 double *computeMulBrDist (const OsiBranchingInformation *info,
00146 int xi, int yi, int wi, int brind, double *brpt, int nPts = 1);
00147
00148 }
00149
00150 #endif