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 };
104 std::vector<ConstraintPtr> secCons;
105 ConstraintVector linCons;
107 PowCons(ConstraintPtr newcon, ConstVariablePtr ivar,
108 ConstVariablePtr ovar,
double degree,
int num,
int den, PowType t,
char s)
109 : con(newcon), iv(ivar), ov(ovar), k(degree), p(num), q(den) , type(t) ,riv(0), rov(0),
110 sense(s), linCons() {}
112 PowCurvature getCurvature_(
const PowCons &cd,
double xlb,
double xub)
const;
114 typedef PowCons *PowConsPtr;
115 typedef std::vector<PowConsPtr> PowConsVec;
116 typedef PowConsVec::iterator PowConsIter;
119 static const std::string me_;
129 struct PowPresolveStats {
135 PowPresolveStats() : iters(0), time(0.0), conDel(0), vBnd(0), nMods(0) {}
138 struct BoundTighteningStats {
146 BoundTighteningStats bStats_;
147 PowPresolveStats pStats_;
155 ConstraintVector optCuts_;
168void relaxSlot_(PowCons &cd, RelaxationPtr rel,
size_t slot, ModVector &mods);
169 void addSecXSq_(PowCons &cd, RelaxationPtr rel,
double xlb,
double xub,
int bound_dir, ModVector &mods,
bool init,
size_t slot = 0);
170 void addTanXSq_(PowCons &cd, RelaxationPtr rel,
double xv,
int bound_dir);
172 void linearize_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
174 void buildPosEO_GT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
175 void buildPosEO_LT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
177 void buildPosOO_GT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
178 void buildPosOO_LT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
180 void buildPosOE_GT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
181 void buildPosOE_LT1_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
183 void buildNegEO_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
184 void buildNegOO_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
185 void buildNegOE_(PowCons &cd, RelaxationPtr rel, ModVector &mods,
bool init);
188 double computeWStar_(
double k)
const;
190 double computeWCross_(
double k)
const;
202 void addCut_(VariablePtr x, VariablePtr y,
double xval,
double yval,
203 RelaxationPtr rel,
bool& ifcuts, PowCons *cd);
206 void addSecant_(PowCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
207 ModVector &mods,
bool init);
209 void dupRows_(
bool *changed);
211 BranchPtr doBranch_(
BranchDirection UpOrDown, ConstVariablePtr v,
double bvalue);
213 double getViol_(
const PowCons &cd,
const DoubleVector &x)
const;
215 bool isFeasible_(ConstSolutionPtr sol, RelaxationPtr relaxation,
216 bool &should_prune,
double &inf_meas);
218 void initRelax_(PowCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
221 bool propPowBnds_(PowConsPtr lcd,
bool *changed);
223 bool propPosEvenBnds_(PowConsPtr cd,
bool *changed);
224 bool propPosMonotonicBnds_(PowConsPtr cd,
bool *changed);
225 bool propNegEvenBnds_(PowConsPtr cd,
bool *changed);
226 bool propNegMonotonicBnds_(PowConsPtr cd,
bool *changed);
228 bool treatDupRows_(ConstraintPtr c1, ConstraintPtr c2,
double mult,
231 void updateRelax_(PowCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
232 DoubleVector &grad, ModVector &mods);
234 int updatePBnds_(VariablePtr p,
double newlb,
double newub,
bool *changed);
235 int updatePBnds_(VariablePtr v,
double newlb,
double newub,
236 RelaxationPtr rel,
bool mod_rel,
bool *changed,
237 ModVector &p_mods, ModVector &r_mods);
239 bool varBndsFromCons_(
bool *changed);
241 double getF_(
double xv,
double k, PowType type)
const;
242 double getDf_(
double xv,
double k, PowType type)
const;
243 double getD2f_(
double xv,
double k, PowType type)
const;
246 double safeX_(
double xv,
double k)
const;
250 double getMid_(
double xlb,
double xub,
double k, PowType type)
const;
251 void addTan_(PowCons &cd,
double xv, RelaxationPtr rel);
254 bool prepSecantDomain_(
double &xlb,
double &xub,
double k, PowType type)
const;
255 void applySecantCut_(PowCons &cd,
double xlb,
double xub, RelaxationPtr rel,
256 ModVector &mods,
bool init);
void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel, CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods, bool *sol_found, SeparationStatus *status)
add cuts to separate a given point.
Definition PowHandler.cpp:864