Minotaur 0.4.1
Docs for developers
CxQuadHandler.h
Go to the documentation of this file.
1//
2// Minotaur -- It's only 1/2 bull
3//
4// (C)opyright 2008 - 2025 The Minotaur Team.
5//
6
14#ifndef MINOTAURCXQUADRATICHANDLER_H
15#define MINOTAURCXQUADRATICHANDLER_H
16
17#include "Handler.h"
18#include "Types.h"
19
20namespace Minotaur {
21
22class Engine;
23class Function;
24class LinearFunction;
25class Problem;
26class QuadraticFunction;
27typedef LinearFunction* LinearFunctionPtr;
28typedef QuadraticFunction* QuadraticFunctionPtr;
29
31struct Secant {
32 VariablePtr auxVar;
35};
36
38typedef Secant * SecantPtr;
39
41typedef std::vector< SecantPtr >::iterator SecantIterator;
42
44typedef std::map<VariablePtr, SecantPtr, CompareVariablePtr> VarSecantMap;
45
47typedef VarSecantMap::iterator VarSecantMapIter;
48
49
55class McCormick {
56public:
58 typedef enum {
59 LT,
60 GT,
61 EQ
62 } Sense;
63
64private:
66 VariablePtr x0_;
67
69 VariablePtr x1_;
70
72 VariablePtr y_;
73
75 Sense s_;
76
78 ConstraintPtr c0_;
79
81 ConstraintPtr c1_;
82
84 ConstraintPtr c2_;
85
87 ConstraintPtr c3_;
88
89public:
92
94 ~McCormick();
95
100 void setAux(VariablePtr y) {y_ = y;};
101
103 void setC0(ConstraintPtr c) {c0_ = c;};
104
106 void setC1(ConstraintPtr c) {c1_ = c;};
107
109 void setC2(ConstraintPtr c) {c2_ = c;};
110
112 void setC3(ConstraintPtr c) {c3_ = c;};
113
115 ConstraintPtr getC0() {return c0_;};
116 ConstraintPtr getC1() {return c1_;};
117 ConstraintPtr getC2() {return c2_;};
118 ConstraintPtr getC3() {return c3_;};
119
121 VariablePtr getAux() {return y_;};
122
124 VariablePtr getX0() {return x0_;};
125
127 VariablePtr getX1() {return x1_;};
128
131
133 Sense getSense() {return s_;};
134
136 void setSense(Sense sense) {s_ = sense;};
137
139 bool isViolated(const double *x, const double &tol) const;
140
145 bool isViolated(const double &x0val, const double &x1val,
146 const double &y0val, const double &tol) const;
147};
150
157 bool operator()(McCormickPtr b0, McCormickPtr b1) const;
158};
159
161typedef std::set<McCormickPtr, CompareMcCormick> McCormickSet;
162
164typedef McCormickSet::iterator McCormickSetIter;
165
166
174class CxQuadHandler : public Handler {
175protected:
182
188
194 VarSet brVars_;
195
197 double eTol_;
198
201
203 static const std::string me_;
204
207
213 RelaxationPtr rel);
214
220 RelaxationPtr rel);
221
223 void relaxObj_(ObjectivePtr obj, RelaxationPtr rel);
224
230
233 double & lb, double & ub, double & r);
234
237 RelaxationPtr rel);
238
241 RelaxationPtr rel);
242
245 RelaxationPtr rel);
246
248 LinearFunctionPtr getMcLf_(VariablePtr x0, double lb0, double ub0,
249 VariablePtr x1, double lb1, double ub1, VariablePtr y,
250 double &rhs, UInt i);
251
252 void binToLin_();
253 void binToLinFun_(FunctionPtr f, LinearFunctionPtr lf2);
254
263 void relax_(RelaxationPtr rel, bool *is_inf);
264
265 void removeFixed_();
266 void removeFixedFun_(FunctionPtr f, LinearFunctionPtr lf2, double *c);
267public:
269 CxQuadHandler(EnvPtr env, ProblemPtr problem);
270
273
274 // Does nothing.
275 void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf);
276
277 // Does nothing.
278 void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf);
279
280 // Does nothing.
281 void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf);
282
283 // Does nothing.
284 void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf);
285
286
294 bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation,
295 bool &is_inf, double &inf_meas);
296
300 void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel,
301 CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods,
302 ModVector &r_mods, bool *sol_found,
303 SeparationStatus *status);
304
305
308 const DoubleVector &x, ModVector &mods,
309 BrVarCandSet &cands, BrCandVector &,
310 bool & is_inf);
311
312 // Implement Handler::getBrMod().
313 ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x,
315
316 // Implement Handler::getBranches().
317 Branches getBranches(BrCandPtr cand, DoubleVector & x,
318 RelaxationPtr rel, SolutionPoolPtr s_pool);
319
320 // presolve.
321 SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol);
322
323 // Implement Handler::presolveNode().
324 bool presolveNode(RelaxationPtr rel, NodePtr node,
325 SolutionPoolPtr s_pool, ModVector &p_mods,
326 ModVector &r_mods);
327
328 // Write name
329 std::string getName() const;
330
331};
332
335
338}
339#endif
340
Define abstract base class for handlers of various kinds.
Declare important 'types' used in Minotaur.
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: CxQuadHandler.h:174
Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition: CxQuadHandler.cpp:775
VariablePtr addMcCormickLower_(VariablePtr x0, VariablePtr x1, RelaxationPtr rel)
Add two McCormick inequalities for .
Definition: CxQuadHandler.cpp:457
void relaxOneSided_(QuadraticFunctionPtr qf, ConstraintPtr cons, RelaxationPtr rel)
Definition: CxQuadHandler.cpp:231
void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing full node relaxations.
Definition: CxQuadHandler.cpp:117
void relaxObj_(ObjectivePtr obj, RelaxationPtr rel)
Relax the objective function, to make it convex.
Definition: CxQuadHandler.cpp:281
SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol)
Initial presolve.
Definition: CxQuadHandler.cpp:942
ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, BranchDirection dir)
Get the modifcation that creates a given (up or down) branch.
Definition: CxQuadHandler.cpp:688
VariablePtr addMcCormickUpper_(VariablePtr x0, VariablePtr x1, RelaxationPtr rel)
Add two McCormick inequalities for .
Definition: CxQuadHandler.cpp:397
bool presolveNode(RelaxationPtr rel, NodePtr node, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods)
Presolve the problem and its relaxation at a node.
Definition: CxQuadHandler.cpp:836
CxQuadHandler(EnvPtr env, ProblemPtr problem)
Default constructor.
Definition: CxQuadHandler.cpp:54
void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel, CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods, bool *sol_found, SeparationStatus *status)
Definition: CxQuadHandler.cpp:827
void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing incremental node relaxations.
Definition: CxQuadHandler.cpp:124
bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation, bool &is_inf, double &inf_meas)
Definition: CxQuadHandler.cpp:564
static const std::string me_
For printing.
Definition: CxQuadHandler.h:203
VariablePtr addMcCormick_(VariablePtr x0, VariablePtr x1, RelaxationPtr rel)
Add all four McCormick inequalities for .
Definition: CxQuadHandler.cpp:387
void relax_(RelaxationPtr rel, bool *is_inf)
Definition: CxQuadHandler.cpp:73
void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &, bool &is_inf)
Return it is constrained to be an integer.
Definition: CxQuadHandler.cpp:597
McCormickSet mcCons_
Definition: CxQuadHandler.h:187
double eTol_
Tolerance.
Definition: CxQuadHandler.h:197
ProblemPtr problem_
Original problem.
Definition: CxQuadHandler.h:206
VarSet brVars_
Definition: CxQuadHandler.h:194
std::string getName() const
Return the name of the handler.
Definition: CxQuadHandler.cpp:1093
void relaxTwoSided_(QuadraticFunctionPtr qf, ConstraintPtr cons, RelaxationPtr rel)
Definition: CxQuadHandler.cpp:143
LoggerPtr logger_
Logger.
Definition: CxQuadHandler.h:200
~CxQuadHandler()
Destroy.
Definition: CxQuadHandler.cpp:62
VarSecantMap cvCons_
Definition: CxQuadHandler.h:181
void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create an incremental relaxation for a node.
Definition: CxQuadHandler.cpp:137
void addSecant_(VariablePtr x, VariablePtr y, RelaxationPtr rel)
Definition: CxQuadHandler.cpp:338
LinearFunctionPtr getMcLf_(VariablePtr x0, double lb0, double ub0, VariablePtr x1, double lb1, double ub1, VariablePtr y, double &rhs, UInt i)
Generate the appropriate McCormick inequality using the bounds.
Definition: CxQuadHandler.cpp:517
LinearFunctionPtr getNewSecantLf_(VariablePtr x, VariablePtr y, double &lb, double &ub, double &r)
Get linear function and right hand side (r) for a secant constraint.
Definition: CxQuadHandler.cpp:364
void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create a relaxation for a node, building from scratch.
Definition: CxQuadHandler.cpp:131
Definition: Environment.h:28
Definition: Function.h:37
Base class for handling specific types of constraints or objective.
Definition: Handler.h:49
The base class linear function is of the form c'x.
Definition: LinearFunction.h:31
Definition: Logger.h:37
Definition: CxQuadHandler.h:55
VariablePtr getX1()
Get .
Definition: CxQuadHandler.h:127
McCormick(VariablePtr x0, VariablePtr x1, Sense sense)
Default constructor.
Definition: CxQuadHandler.cpp:1100
Sense
LT: x0x1 <= y; GT: x0x1 >= y; EQ: x0x1 = y.
Definition: CxQuadHandler.h:58
Sense getSense()
Get the sense of the bilinear constraint: LT, EQ, GT.
Definition: CxQuadHandler.h:133
void setC3(ConstraintPtr c)
Set the third constrait: .
Definition: CxQuadHandler.h:112
~McCormick()
Destroy.
Definition: CxQuadHandler.cpp:1115
void setSense(Sense sense)
Set the sense of the bilinear constraint: LT, EQ, GT.
Definition: CxQuadHandler.h:136
ConstraintPtr getC0()
Get one of the four constraints.
Definition: CxQuadHandler.h:115
VariablePtr getX0()
Get .
Definition: CxQuadHandler.h:124
VariablePtr getAux()
Get the auxiliary variable.
Definition: CxQuadHandler.h:121
void setC1(ConstraintPtr c)
Set the first constraint: .
Definition: CxQuadHandler.h:106
void setAux(VariablePtr y)
Definition: CxQuadHandler.h:100
void setC0(ConstraintPtr c)
Set the zeroth constraint: .
Definition: CxQuadHandler.h:103
VariablePtr getOtherX(ConstVariablePtr x) const
Get the variable other than x, in the product.
Definition: CxQuadHandler.cpp:1200
void setC2(ConstraintPtr c)
Set the third constrait: .
Definition: CxQuadHandler.h:109
bool isViolated(const double *x, const double &tol) const
Check if a bilinear constraint is violated at the current point x.
Definition: CxQuadHandler.cpp:1144
Definition: Modification.h:29
Definition: Node.h:54
Definition: Objective.h:39
Definition: Problem.h:74
Definition: QuadraticFunction.h:38
Definition: Relaxation.h:53
Definition: SolutionPool.h:28
Definition: Solution.h:30
Definition: Variable.h:31
Definition: ActiveNodeStore.h:20
VarSecantMap::iterator VarSecantMapIter
Iterator for VarSecantMap.
Definition: CxQuadHandler.h:47
Secant * SecantPtr
Pointer to Secant.
Definition: CxQuadHandler.h:38
BranchDirection
Two directions for branching.
Definition: Types.h:201
const CxQuadHandler * CxQuadConstHandlerPtr
Shared pointer to const CxQuadHandler.
Definition: CxQuadHandler.h:337
McCormickSet::iterator McCormickSetIter
Iterator of McCormick objects over a set.
Definition: CxQuadHandler.h:164
McCormick * McCormickPtr
shared pointer to McCormick object.
Definition: CxQuadHandler.h:149
std::map< VariablePtr, SecantPtr, CompareVariablePtr > VarSecantMap
Map of 'x' and the secant that is used for .
Definition: CxQuadHandler.h:44
CxQuadHandler * CxQuadHandlerPtr
Shared pointer to CxQuadHandler.
Definition: CxQuadHandler.h:334
std::set< McCormickPtr, CompareMcCormick > McCormickSet
A set of McCormick objects.
Definition: CxQuadHandler.h:161
unsigned int UInt
Unsigned integer.
Definition: Types.h:30
SeparationStatus
Status from separation routine:
Definition: Types.h:217
std::vector< SecantPtr >::iterator SecantIterator
Vector-iterator for Secant.
Definition: CxQuadHandler.h:41
SolveStatus
Different states an algorithm like branch-and-bound can be in.
Definition: Types.h:158
Definition: CxQuadHandler.h:156
Save information about constraints of the form .
Definition: CxQuadHandler.h:31
ConstraintPtr cons
The variable x.
Definition: CxQuadHandler.h:34
VariablePtr sqVar
The variable y.
Definition: CxQuadHandler.h:33

Minotaur source code documented by Doxygen 1.9.4 on Thu Apr 24 2025