Minotaur 0.4.1
Docs for developers
UnivarQuadHandler.h
Go to the documentation of this file.
1
2//
3// Minotaur -- It's only 1/2 bull
4//
5// (C)opyright 2008 - 2025 The Minotaur Team.
6//
7
19#ifndef MINOTAURUNIVARQUADHANDLER_H
20#define MINOTAURUNIVARQUADHANDLER_H
21
22#include "Handler.h"
23
24namespace Minotaur {
25
26class LinearFunction;
27class Timer;
28typedef LinearFunction* LinearFunctionPtr;
29
34struct LinUnivar {
35 VariablePtr y;
37 double a;
38 double b;
42};
43typedef LinUnivar* LinUnivarPtr;
44typedef std::vector<LinUnivarPtr> LinUnivarVec;
45typedef LinUnivarVec::iterator LinUnivarVecIter;
46
51struct LinBivar {
52 VariablePtr y;
55 bool pos;
62};
63typedef LinBivar* LinBivarPtr;
64typedef std::vector<LinBivarPtr> LinBivarVec;
65typedef LinBivarVec::iterator LinBivarVecIter;
66
68//typedef std::map<VariablePtr, LinSqrPtr, CompareVariablePtr> LinSqrMap;
69//typedef LinSqrMap::iterator LinSqrMapIter; ///> Iterator for LinSqrMap
70
71class UnivarQuadHandler : public Handler {
72public:
75
78
79 // base class method
80 void addConstraint(ConstraintPtr newcon);
81
82 // Implement Handler::getBranches().
83 Branches getBranches(BrCandPtr cand, DoubleVector & x,
84 RelaxationPtr rel, SolutionPoolPtr s_pool);
85
86 // base class method
87 void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x,
88 ModVector &mods, BrVarCandSet &cands,
89 BrCandVector &gencands, bool &is_inf);
90
91 double getBranchingPt_(double vio, double lb, double ub, double allowed_vio);
92
93 // base class method
96 { return 0; };
97
98 // base class method
99 std::string getName() const;
100
101 // base class method.
102 bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation,
103 bool &should_prune, double &inf_meas);
104
105 // base class method.
106 SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **);
107
108 // base class method. Tightens bounds.
110 SolutionPoolPtr s_pool, ModVector &p_mods,
111 ModVector &r_mods);
112
113 // base class method. Adds linear inequalities
114 void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf);
115
116 // Does nothing.
117 void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf);
118
119 // Does nothing.
120 void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf);
121
122 // Does nothing.
123 void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf);
124
125
126 // base class method. Adds linearlization cuts when available.
127 void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel,
128 CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods,
129 ModVector &r_mods, bool *sol_found, SeparationStatus *status);
130
131 // base class method.
132 void writeStats(std::ostream &out) const;
133
134private:
136 struct SepaStats
137 {
138 int iters;
139 int cuts;
140 double time;
141 };
142
144 struct PresolveStats
145 {
146 int iters;
147 double time;
148 double timeN;
149 int vBnd;
150 int nMods;
151 };
152
154 double aTol_;
155
157 double bTol_;
158
163 LinBivarVec bivarFuns_;
164
166 LoggerPtr logger_;
167
169 static const std::string me_;
170
172 ProblemPtr p_;
173
175 PresolveStats pStats_;
176
178 double rTol_;
179
181 SepaStats sStats_;
182
184 const Timer* timer_;
185
190 LinUnivarVec univarFuns_;
191
204 void addCut_(RelaxationPtr rel, LinUnivarPtr luv, double xl, double xval,
205 double yval, bool &ifcuts);
206
219 void addCut_(RelaxationPtr rel, LinBivarPtr lbv, double x1l, double x2l,
220 double x1val, double x2val, double yval, bool &ifcuts);
221
230 bool bwdPropBivar_(LinBivarPtr lbv, bool *changed);
231
245 bool bwdPropBivar_(LinBivarPtr lbv, RelaxationPtr rel, bool mod_rel,
246 bool *changed, ModVector &p_mods, ModVector &r_mods);
247
256 bool bwdPropUnivar_(LinUnivarPtr luv, bool *changed);
257
271 bool bwdPropUnivar_(LinUnivarPtr luv, RelaxationPtr rel, bool mod_rel,
272 bool *changed, ModVector &p_mods, ModVector &r_mods);
273
283 double calcUpperUnivar_(double a, double b, double lx, double ux);
284
294 void findLinPt_(double xval, double yval, LinUnivarPtr luv, double &xl);
295
304 bool fwdPropBivar_(LinBivarPtr lbv, bool *changed);
305
319 bool fwdPropBivar_(LinBivarPtr lbv, RelaxationPtr rel, bool mod_rel,
320 bool *changed, ModVector &p_mods, ModVector &r_mods);
321
330 bool fwdPropUnivar_(LinUnivarPtr luv, bool *changed);
331
345 bool fwdPropUnivar_(LinUnivarPtr luv, RelaxationPtr rel, bool mod_rel,
346 bool *changed, ModVector &p_mods, ModVector &r_mods);
347
355 LinearFunctionPtr getSecant_(VariablePtr y, VariablePtr x,
356 double a, double b);
357
366 std::vector<LinearFunctionPtr> getSecant_(VariablePtr y, VariablePtr x1,
367 VariablePtr x2, bool pos, DoubleVector &rhs);
368
377 LinearFunctionPtr getTangent_(VariablePtr y, VariablePtr x,
378 double a, double b, double pt);
379
389 LinearFunctionPtr getTangent_(VariablePtr y, VariablePtr x1, VariablePtr x2,
390 bool pos, UInt i, double &rhs);
391
393 bool isAtBnds_(ConstVariablePtr x, double xval);
394
407 bool isViolatedAtBounds_(ConstraintPtr c1, ConstraintPtr c2, VariablePtr x1,
408 VariablePtr x2, double l1, double u1, double l2,
409 double u2, bool pos);
410
418 void relax_(RelaxationPtr rel, bool *is_inf);
419
421 void resetStats_();
422
433 void upBivarCon_(LinBivarPtr lbv, RelaxationPtr rel, ModVector &r_mods);
434
447 int updatePBounds_(VariablePtr v, double lb, double ub, bool *changed);
448
468 int updatePBounds_(VariablePtr v, double lb, double ub, RelaxationPtr rel,
469 bool mod_rel, bool *changed, ModVector &p_mods,
470 ModVector &r_mods);
471
486 void upUnivarCon_(ConstraintPtr con, VariablePtr x, VariablePtr y, double a,
487 double b, RelaxationPtr rel, ModVector &r_mods);
488
497 bool varBndsFromCons_(bool *changed);
498};
499
501typedef UnivarQuadHandler* UnivarQuadHandlerPtr;
502}
503#endif
504
Define abstract base class for handlers of various kinds.
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: Modification.h:29
Definition: Node.h:54
Definition: Problem.h:74
Definition: Relaxation.h:53
Definition: SolutionPool.h:28
Definition: Solution.h:30
‍Iterator for LinBivar
Definition: UnivarQuadHandler.h:71
void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create an incremental relaxation for a node.
Definition: UnivarQuadHandler.cpp:1861
void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing full node relaxations.
Definition: UnivarQuadHandler.cpp:1844
SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **)
Initial presolve.
Definition: UnivarQuadHandler.cpp:1672
void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &gencands, bool &is_inf)
find branching candidates.
Definition: UnivarQuadHandler.cpp:780
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: UnivarQuadHandler.cpp:1692
bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation, bool &should_prune, double &inf_meas)
Check if a solution is feasible.
Definition: UnivarQuadHandler.cpp:1574
~UnivarQuadHandler()
Destroy.
Definition: UnivarQuadHandler.cpp:69
void writeStats(std::ostream &out) const
Write statistics to ostream out.
Definition: UnivarQuadHandler.cpp:2170
void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing incremental node relaxations.
Definition: UnivarQuadHandler.cpp:1850
Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition: UnivarQuadHandler.cpp:729
void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create a relaxation for a node, building from scratch.
Definition: UnivarQuadHandler.cpp:1856
ModificationPtr getBrMod(BrCandPtr, DoubleVector &, RelaxationPtr, BranchDirection)
Get the modifcation that creates a given (up or down) branch.
Definition: UnivarQuadHandler.h:94
std::string getName() const
Return the name of the handler.
Definition: UnivarQuadHandler.cpp:959
void addConstraint(ConstraintPtr newcon)
Add constraint to be handled by this handler.
Definition: UnivarQuadHandler.cpp:82
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: UnivarQuadHandler.cpp:1879
UnivarQuadHandler(EnvPtr env, ProblemPtr problem)
Default constructor.
Definition: UnivarQuadHandler.cpp:56
Definition: Variable.h:31
Definition: ActiveNodeStore.h:20
LinBivarVec::iterator LinBivarVecIter
‍Vector of LinBivar
Definition: UnivarQuadHandler.h:65
BranchDirection
Two directions for branching.
Definition: Types.h:201
UnivarQuadHandler * UnivarQuadHandlerPtr
Shared pointer to UnivarQuadHandler.
Definition: QuadTransformer.h:29
std::vector< LinBivarPtr > LinBivarVec
‍Pointer to LinBivar
Definition: UnivarQuadHandler.h:64
LinUnivarVec::iterator LinUnivarVecIter
‍Vector of LinUnivar
Definition: UnivarQuadHandler.h:45
unsigned int UInt
Unsigned integer.
Definition: Types.h:30
SeparationStatus
Status from separation routine:
Definition: Types.h:217
std::vector< LinUnivarPtr > LinUnivarVec
‍Pointer to LinUnivar
Definition: UnivarQuadHandler.h:44
SolveStatus
Different states an algorithm like branch-and-bound can be in.
Definition: Types.h:158
‍Iterator for LinUnivar
Definition: UnivarQuadHandler.h:51
ConstraintPtr tan3
‍The linear underestimator at (l1, u2)
Definition: UnivarQuadHandler.h:60
ConstraintPtr tan2
‍The linear underestimator at (l1, l2)
Definition: UnivarQuadHandler.h:59
ConstraintPtr oeCon1
‍Sign between x_1 and x_2. If true then + else -.
Definition: UnivarQuadHandler.h:56
ConstraintPtr tan1
‍The linear constraint that gives the over estimator
Definition: UnivarQuadHandler.h:58
ConstraintPtr tan4
‍The linear underestimator at (u1, l2)
Definition: UnivarQuadHandler.h:61
VariablePtr x1
‍The variable y.
Definition: UnivarQuadHandler.h:53
VariablePtr x2
‍The variable x_1.
Definition: UnivarQuadHandler.h:54
ConstraintPtr oeCon2
‍The linear constraint that gives the over estimator
Definition: UnivarQuadHandler.h:57
bool pos
‍The variable x_2.
Definition: UnivarQuadHandler.h:55
A structure to save information about constraints of the form .
Definition: UnivarQuadHandler.h:34
double b
‍Coefficient of x^2.
Definition: UnivarQuadHandler.h:38
ConstraintPtr tan2
‍The linear underestimator at the lower bound of x
Definition: UnivarQuadHandler.h:41
ConstraintPtr tan1
‍The linear constraint that gives the over estimator
Definition: UnivarQuadHandler.h:40
ConstraintPtr oeCon
‍Coefficient of x.
Definition: UnivarQuadHandler.h:39
VariablePtr x
‍The variable y.
Definition: UnivarQuadHandler.h:36
double a
‍The variable x.
Definition: UnivarQuadHandler.h:37

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