17#ifndef MINOTAURQUADRATICHANDLER_H
18#define MINOTAURQUADRATICHANDLER_H
29typedef LinearFunction* LinearFunctionPtr;
30typedef Engine* EnginePtr;
49typedef LinSqr* LinSqrPtr;
54typedef std::map<VariablePtr, LinSqrPtr, CompareVariablePtr>
LinSqrMap;
55typedef LinSqrMap::iterator LinSqrMapIter;
86 ModVector& mods, BrVarCandSet& cands,
87 BrCandVector& gencands,
bool& is_inf);
98 bool& should_prune,
double& inf_meas);
105 ModVector& p_mods, ModVector& r_mods);
112 void fillmap4auxVars(std::map<std::pair<int, int>,
int>& map4auxVars);
159 struct PresolveStats {
176 struct BoundTighteningStats {
218 BoundTighteningStats bStats_;
249 static const std::string me_;
258 PresolveStats pStats_;
264 ConstraintVector optCuts_;
316 double calcUpperUnivar_(
double a,
double b,
double lx,
double ux);
326 bool calcVarBnd_(
VariablePtr v,
double coef,
double lb,
double ub,
bool* c1);
329 double ub,
bool* c1, ModVector& p_mods, ModVector& r_mods);
342 double ub,
bool* c1,
bool* c2);
345 double coef,
double lb,
double ub,
bool* c1,
bool* c2,
346 ModVector& p_mods, ModVector& r_mods);
358 bool calcVarBnd_(
VariablePtr v,
double a,
double b,
double ly,
double uy,
362 double ly,
double uy,
bool* c1, ModVector& p_mods,
371 void dupRows_(
bool* changed);
381 void findLinPt_(
double xval,
double yval,
double& xl,
double& yl);
389 double getBndByLP_(
bool& is_inf);
402 DoubleVector& fwdLb, DoubleVector& fwdUb,
UInt& count_inf_lb,
437 double ub,
double& r);
450 DoubleVector& fwdLb, DoubleVector& fwdUb,
UInt& count_inf_lb,
467 double& implLb,
double& implUb, DoubleVector& fwdLb,
468 DoubleVector& fwdUb,
UInt& count_inf_lb,
UInt& count_inf_ub,
473 DoubleVector& fwdLb, DoubleVector& fwdUb,
474 UInt& count_inf_lb,
UInt& count_inf_ub, VarVector& qvars);
486 double getSumExcept1_(DoubleVector::iterator b, DoubleVector::iterator e,
487 DoubleVector::iterator curr,
BoundType bt,
double bound,
497 void getTermBnds_(
VariablePtr v,
double coef,
double& lb,
double& ub);
519 void getTermBnds_(
VariablePtr v,
double a,
double b,
double& lb,
double& ub);
528 bool isFeasible_(
const double* x,
double objval,
double& inf_meas);
531 bool isFeasibleToRelaxation_(
RelaxationPtr rel,
const double* x);
534 void linearize_(LinSqrMapIter lx2);
537 bool linearize_(
LinBilSetIter linbil,
bool isx0Binary,
bool isx1Binary);
547 bool propBilBnds_(
LinBil* lx0x1,
bool* changed);
564 bool* changed, ModVector& p_mods, ModVector& r_mods);
574 bool propSqrBnds_(LinSqrMapIter lx2,
bool* changed);
590 bool propSqrBnds_(LinSqrMapIter lx2,
RelaxationPtr rel,
bool mod_rel,
591 bool* changed, ModVector& p_mods, ModVector& r_mods);
612 void resetBoundsinOrig_(DoubleVector& varlb, DoubleVector& varub);
618 void setItmpFromSol_(
const double* x);
629 bool tightenLP_(
RelaxationPtr rel,
double bestSol,
bool* changed,
630 ModVector& p_mods, ModVector& r_mods);
639 bool tightenQuad_(
bool* changed);
641 bool tightenQuad_(
RelaxationPtr rel,
double bestSol,
bool* changed,
642 ModVector& p_mods, ModVector& r_mods);
651 bool tightenSimple_(
bool* changed);
662 DoubleVector& varlb, DoubleVector& varub);
685 int updatePBounds_(
VariablePtr v,
double lb,
double ub,
bool* changed);
722 bool mod_rel,
bool* changed, ModVector& p_mods,
766 bool varBndsFromCons_(
bool* changed);
Define abstract base class for handlers of various kinds.
Declare a class for storing linear under and overestimators of bilinear functions ,...
Define class for generating cuts for quadratic constraints from the simplex tableau.
Base class for describing candidates for branching on a node in branch-and-bound.
Definition: BrCand.h:32
The Constraint class is used to manage a constraint.
Definition: Constraint.h:61
Abstract base class to manage cuts in the relaxation.
Definition: CutManager.h:42
Definition: Environment.h:28
Base class for handling specific types of constraints or objective.
Definition: Handler.h:49
Definition: LPEngine.h:29
The base class linear function is of the form c'x.
Definition: LinearFunction.h:31
Definition: Modification.h:29
Iterator for LinSqrMap
Definition: QuadHandler.h:63
Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition: QuadHandler.cpp:437
std::string getName() const
Return the name of the handler.
Definition: QuadHandler.cpp:712
bool presolveNode(RelaxationPtr p, NodePtr node, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods)
Presolve the problem and its relaxation at a node.
Definition: QuadHandler.cpp:1232
void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing full node relaxations.
Definition: QuadHandler.cpp:1622
bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation, bool &should_prune, double &inf_meas)
Check if a solution is feasible.
Definition: QuadHandler.cpp:975
void removeCuts(RelaxationPtr rel, ConstSolutionPtr sol)
Definition: QuadHandler.cpp:1642
double addDefaultBounds(VariablePtr x, BoundType lu)
Definition: QuadHandler.cpp:184
SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol)
Initial presolve.
Definition: QuadHandler.cpp:1134
QuadHandler(EnvPtr env, ProblemPtr problem)
Default constructor.
Definition: QuadHandler.cpp:60
void addConstraint(ConstraintPtr newcon)
Add constraint to be handled by this handler.
Definition: QuadHandler.cpp:130
void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create a relaxation for a node, building from scratch.
Definition: QuadHandler.cpp:1632
ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, BranchDirection dir)
Get the modifcation that creates a given (up or down) branch.
Definition: QuadHandler.cpp:631
void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing incremental node relaxations.
Definition: QuadHandler.cpp:1627
void simplePresolve(ProblemPtr p, SolutionPoolPtr spool, ModVector &t_mods, SolveStatus &status)
Definition: QuadHandler.cpp:1174
void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create an incremental relaxation for a node.
Definition: QuadHandler.cpp:1637
void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &gencands, bool &is_inf)
find branching candidates.
Definition: QuadHandler.cpp:488
bool postSolveRootNode(RelaxationPtr rel, SolutionPoolPtr s_pool, ConstSolutionPtr sol, ModVector &p_mods, ModVector &r_mods)
At the root node post solve the problem and its relaxation. LP based bound tightening (OBBT) is emplo...
Definition: QuadHandler.cpp:1425
void writeStats(std::ostream &out) const
Write statistics to ostream out.
Definition: QuadHandler.cpp:3697
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: QuadHandler.cpp:1713
~QuadHandler()
Destroy.
Definition: QuadHandler.cpp:105
int fixNodeErr(RelaxationPtr rel, ConstSolutionPtr sol, SolutionPoolPtr s_pool, bool &sol_found)
Definition: QuadHandler.cpp:369
Definition: QuadraticFunction.h:38
Definition: Relaxation.h:53
Definition: SimplexQuadCutGen.h:78
Definition: SolutionPool.h:28
Definition: Solution.h:30
Definition: Variable.h:31
Definition: ActiveNodeStore.h:20
QuadHandler * QuadHandlerPtr
Shared pointer to QuadHandler.
Definition: QuadHandler.h:770
BranchDirection
Two directions for branching.
Definition: Types.h:201
BoundType
Different types of variable-bounds.
Definition: Types.h:131
std::vector< LinSqrPtr > LinSqrVec
Pointer to LinSqr
Definition: QuadHandler.h:50
LinBilSet::iterator LinBilSetIter
Iterator of LinBil objects over a set.
Definition: LinBil.h:119
unsigned int UInt
Unsigned integer.
Definition: Types.h:30
std::map< VariablePtr, LinSqrPtr, CompareVariablePtr > LinSqrMap
Iterator for LinSqr
Definition: QuadHandler.h:54
LinSqrVec::iterator LinSqrVecIter
Vector of LinSqr
Definition: QuadHandler.h:51
SeparationStatus
Status from separation routine:
Definition: Types.h:217
SolveStatus
Different states an algorithm like branch-and-bound can be in.
Definition: Types.h:158
std::set< LinBil *, CompareLinBil > LinBilSet
A set of bilinear objects.
Definition: LinBil.h:116
A structure to save information about constraints of the form .
Definition: QuadHandler.h:36
VariablePtr x
The variable y.
Definition: QuadHandler.h:38
LinSqr(VariablePtr y0, VariablePtr x0, ConstraintPtr con)
Quadratic constraint in the transformed problem
Definition: QuadHandler.h:41
ConstraintPtr oeCon
The variable x.
Definition: QuadHandler.h:39
ConstraintPtr qcon
The linear constraint that gives the over estimator
Definition: QuadHandler.h:40