Minotaur 0.4.1
Docs for developers
QGAdvHandler.h
Go to the documentation of this file.
1//
2// Minotaur -- It's only 1/2 bull
3//
4// (C)opyright 2009 - 2025 The Minotaur Team.
5//
6
15#ifndef MINOTAURQGADVHANDLER_H
16#define MINOTAURQGADVHANDLER_H
17
18#include <stack>
19
20#include "Handler.h"
21#include "Engine.h"
22#include "Problem.h"
23#include "Function.h"
24#include "PerspCutHandler.h"
25
26namespace Minotaur {
27
28struct QGStats {
29 size_t nlpS;
30 size_t nlpF;
31 size_t nlpI;
32 size_t nlpIL;
33 size_t cuts;
34};
35
36
45class QGAdvHandler : public Handler {
46
47private:
49 EnvPtr env_;
50
52 double intTol_;
53
55 LoggerPtr logger_;
56
58 static const std::string me_;
59
61 ProblemPtr minlp_;
62
64 std::vector<ConstraintPtr> nlCons_;
65
67 EnginePtr nlpe_;
68
70 std::stack<Modification *> nlpMods_;
71
73 EngineStatus nlpStatus_;
74
80 VariablePtr objVar_;
81
83 bool oNl_;
84
86 RelaxationPtr rel_;
87
89 double relobj_;
90
92 double solAbsTol_;
93
95 double solRelTol_;
96
98 double npATol_;
99
101 double npRTol_;
102
104 QGStats *stats_;
105
110 bool prStatus_;
111
113 PerspCutHandlerPtr pcPtr_;
114
115public:
117 QGAdvHandler();
118
127 QGAdvHandler(EnvPtr env, ProblemPtr minlp, EnginePtr nlpe);
128
129 QGAdvHandler(EnvPtr env, ProblemPtr minlp, EnginePtr nlpe,
130 PerspCutHandlerPtr pcHand);
131
134
136 Branches getBranches(BrCandPtr, DoubleVector &, RelaxationPtr,
138 {return Branches();};
139
142 const DoubleVector &, ModVector &,
143 BrVarCandSet &, BrCandVector &, bool &) {};
144
148 {return ModificationPtr();};
149
150 // Base class method.
151 std::string getName() const;
152
153 // Base class method. Check if x is feasible. x has to satisfy integrality
154 // and also nonlinear constraints.
155 bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation,
156 bool & should_prune, double &inf_meas);
157
159 SolveStatus presolve(PreModQ *, bool *, Solution **sol) {return Finished;};
160
163 ModVector &)
164 {return false;};
165
167 void postsolveGetX(const double *, UInt, DoubleVector *) {};
168
170 void relaxInitFull(RelaxationPtr rel, bool *is_inf);
171
173 void relaxInitInc(RelaxationPtr rel, bool *is_inf);
174
176 void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf);
177
179 void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf);
180
183 CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods,
184 ModVector &r_mods, bool *sol_found, SeparationStatus *status);
185
187 void writeStats(std::ostream &out) const;
188
189private:
194 void addInitLinearX_(const double *x);
195
200 void cutIntSol_(ConstSolutionPtr sol, CutManager *cutMan,
201 SolutionPoolPtr s_pool, bool *sol_found,
202 SeparationStatus *status);
203
208 void fixInts_(const double *x);
209
215 void initLinear_(bool *isInf);
216
221 void linearAt_(FunctionPtr f, double fval, const double *x,
222 double *c, LinearFunctionPtr *lf, int *error);
223
228 void linearizeObj_();
229
234 void oaCutToCons_(const double *nlpx, const double *lpx, CutManager *,
235 SeparationStatus *status);
236
238 void addCut_(const double *nlpx, const double *lpx, ConstraintPtr con,
239 CutManager *cutman, SeparationStatus *status);
240
245 void oaCutToObj_(const double *nlpx, const double *lpx, CutManager *,
246 SeparationStatus *status);
247
248 void oaCutEngLim_(const double *lpx, CutManager *cutman,
249 SeparationStatus *status);
250
255 void relax_(bool *is_inf);
256
258 void solveNLP_();
259
261 void unfixInts_();
262
267 void updateUb_(SolutionPoolPtr s_pool, double *nlp_val, bool *sol_found);
268
269 };
270
271 typedef QGAdvHandler* QGAdvHandlerPtr;
272}
273#endif
274
Define the base class Engine.
Get information about a Function.
Define abstract base class for handlers of various kinds.
Declare PerspCutHandler class for perspective reformulation (PR). It detects constraints amenable to ...
Declare the base class Modification.
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: Engine.h:34
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: Modification.h:29
Definition: Node.h:54
Definition: PerspCutHandler.h:36
Definition: Problem.h:74
Handler for convex constraints, based on quesada-grossmann algorithm.
Definition: QGAdvHandler.h:45
~QGAdvHandler()
Destroy.
Definition: QGAdvHandler.cpp:127
std::string getName() const
Return the name of the handler.
Definition: QGAdvHandler.cpp:816
void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel, CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods, bool *sol_found, SeparationStatus *status)
Base class method. Find cuts.
Definition: QGAdvHandler.cpp:721
void relaxInitInc(RelaxationPtr rel, bool *is_inf)
Base class method. calls relax_().
Definition: QGAdvHandler.cpp:653
void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf)
Base class method. Does nothing.
Definition: QGAdvHandler.cpp:661
bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation, bool &should_prune, double &inf_meas)
Check if a solution is feasible.
Definition: QGAdvHandler.cpp:387
void writeStats(std::ostream &out) const
Show statistics.
Definition: QGAdvHandler.cpp:799
void relaxInitFull(RelaxationPtr rel, bool *is_inf)
Base class method. calls relax_().
Definition: QGAdvHandler.cpp:647
ModificationPtr getBrMod(BrCandPtr, DoubleVector &, RelaxationPtr, BranchDirection)
Does nothing.
Definition: QGAdvHandler.h:146
SolveStatus presolve(PreModQ *, bool *, Solution **sol)
Does nothing.
Definition: QGAdvHandler.h:159
void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf)
Base class method. Does nothing.
Definition: QGAdvHandler.cpp:668
bool presolveNode(RelaxationPtr, NodePtr, SolutionPoolPtr, ModVector &, ModVector &)
Does nothing.
Definition: QGAdvHandler.h:162
void postsolveGetX(const double *, UInt, DoubleVector *)
Does nothing.
Definition: QGAdvHandler.h:167
Branches getBranches(BrCandPtr, DoubleVector &, RelaxationPtr, SolutionPoolPtr)
Does nothing.
Definition: QGAdvHandler.h:136
QGAdvHandler()
Empty constructor.
Definition: QGAdvHandler.cpp:48
void getBranchingCandidates(RelaxationPtr, const DoubleVector &, ModVector &, BrVarCandSet &, BrCandVector &, bool &)
Does nothing.
Definition: QGAdvHandler.h:141
Definition: Relaxation.h:53
Definition: SolutionPool.h:28
Definition: Solution.h:30
Definition: Variable.h:31
Definition: ActiveNodeStore.h:20
BranchDirection
Two directions for branching.
Definition: Types.h:201
unsigned int UInt
Unsigned integer.
Definition: Types.h:30
SeparationStatus
Status from separation routine:
Definition: Types.h:217
EngineStatus
Different status that an external engine may report.
Definition: Types.h:176
SolveStatus
Different states an algorithm like branch-and-bound can be in.
Definition: Types.h:158
Definition: QGAdvHandler.h:28
size_t nlpI
Number of nlps feasible.
Definition: QGAdvHandler.h:31
size_t cuts
Number of nlps hits engine iterations limit.
Definition: QGAdvHandler.h:33
size_t nlpIL
Number of nlps infeasible.
Definition: QGAdvHandler.h:32
size_t nlpF
Number of nlps solved.
Definition: QGAdvHandler.h:30

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