49 bool &should_prune,
double &inf_meas);
53 ModVector &p_mods, ModVector &r_mods,
bool *sol_found,
62 ModVector &mods, BrVarCandSet &cands,
63 BrCandVector &gencands,
bool &is_inf);
74 ModVector &p_mods, ModVector &r_mods);
76 std::string
getName()
const override;
77 void writeStats(std::ostream &out)
const override;
82 enum PowCurvature { PC_CONVEX, PC_CONCAVE, PC_MIXED };
94static const size_t POW_NUM_PT_SLOTS = 3;
97static const size_t POW_NUM_TAN_SLOTS = 3;
109 std::vector<ConstraintPtr> ptCons;
110 std::vector<ConstraintPtr> tanCons;
111 PowCons(ConstraintPtr newcon, ConstVariablePtr ivar,
112 ConstVariablePtr ovar,
double degree,
int num,
int den, PowType t,
char s)
113 : con(newcon), iv(ivar), ov(ovar), k(degree), p(num), q(den) , type(t) ,riv(0), rov(0),
116 PowCurvature getCurvature_(
const PowCons &cd,
double xlb,
double xub)
const;
118 typedef PowCons *PowConsPtr;
119 typedef std::vector<PowConsPtr> PowConsVec;
120 typedef PowConsVec::iterator PowConsIter;
123 static const std::string me_;
124bool sepIsGlobal_(
const PowCons &cd)
const;
133 struct PowPresolveStats {
139 PowPresolveStats() : iters(0), time(0.0), conDel(0), vBnd(0), nMods(0) {}
142 struct BoundTighteningStats {
150 BoundTighteningStats bStats_;
151 PowPresolveStats pStats_;
159 ConstraintVector optCuts_;
171 void relaxSlot_(PowCons &cd, RelaxationPtr rel,
172 std::vector<ConstraintPtr> &slots,
size_t slot,
175 void relaxSlotsFrom_(PowCons &cd, RelaxationPtr rel,
176 std::vector<ConstraintPtr> &slots,
177 size_t from,
size_t to, ModVector &mods);
178 void addCutByTan_(PowCons &cd, RelaxationPtr rel,
double xv,
int bound_dir,
179 ModVector &mods,
size_t slot);
180 void addCutByPts_(PowCons &cd, RelaxationPtr rel,
double xlb,
double xub,
181 int bound_dir, ModVector &mods,
bool init,
size_t slot);
182 void linearize_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
184 void buildPosEO_GT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
185 void buildPosEO_LT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
187 void buildPosOO_GT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
188 void buildPosOO_LT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
190 void buildPosOE_GT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
191 void buildPosOE_LT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
193 void buildNegEO_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
194 void buildNegOO_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
195 void buildNegOE_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
198 double computeWStar_(
double k)
const;
200 double computeWCross_(
double k)
const;
212 void addCut_(VariablePtr x, VariablePtr y,
double xval,
double yval,
213 RelaxationPtr rel,
bool& ifcuts, PowCons *cd);
216 void addSecant_(PowCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
217 ModVector &mods,
bool init);
219 void dupRows_(
bool *changed);
221 BranchPtr doBranch_(
BranchDirection UpOrDown, ConstVariablePtr v,
double bvalue);
223 double getViol_(
const PowCons &cd,
const DoubleVector &x)
const;
225 bool isFeasible_(ConstSolutionPtr sol, RelaxationPtr relaxation,
226 bool &should_prune,
double &inf_meas);
228 void initRelax_(PowCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
231 bool propPowBnds_(PowConsPtr lcd,
bool *changed);
233 bool propPosEvenBnds_(PowConsPtr cd,
bool *changed);
234 bool propPosMonotonicBnds_(PowConsPtr cd,
bool *changed);
235 bool propNegEvenBnds_(PowConsPtr cd,
bool *changed);
236 bool propNegMonotonicBnds_(PowConsPtr cd,
bool *changed);
238 bool treatDupRows_(ConstraintPtr c1, ConstraintPtr c2,
double mult,
241 void updateRelax_(PowCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
242 DoubleVector &grad, ModVector &mods);
244 int updatePBnds_(VariablePtr p,
double newlb,
double newub,
bool *changed);
245 int updatePBnds_(VariablePtr v,
double newlb,
double newub,
246 RelaxationPtr rel,
bool mod_rel,
bool *changed,
247 ModVector &p_mods, ModVector &r_mods);
249 bool varBndsFromCons_(
bool *changed);
251 double getF_(
double xv,
double k, PowType type)
const;
252 double getDf_(
double xv,
double k, PowType type)
const;
253 double getD2f_(
double xv,
double k, PowType type)
const;
256 double safeX_(
double xv,
double k)
const;
260 double getMid_(
double xlb,
double xub,
double k, PowType type)
const;
261 void addTan_(PowCons &cd,
double xv, RelaxationPtr rel);
264 bool prepSecantDomain_(
double &xlb,
double &xub,
double k, PowType type)
const;
265 void applySecantCut_(PowCons &cd,
double xlb,
double xub, RelaxationPtr rel,
266 ModVector &mods,
bool init);