Minotaur 0.4.1
Docs for developers
Handler.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
15#ifndef MINOTAURHANDLER_H
16#define MINOTAURHANDLER_H
17
18#include "Types.h"
19
20namespace Minotaur
21{
22
23class CutManager;
24class Engine;
25class Node;
26class Relaxation;
27class PreMod;
28class Solution;
29class SolutionPool;
30class Solution;
31typedef Relaxation* RelaxationPtr;
32typedef PreMod* PreModPtr;
33typedef const Solution* ConstSolutionPtr;
34typedef SolutionPool* SolutionPoolPtr;
35typedef std::deque<PreModPtr> PreModQ;
36typedef PreModQ::iterator PreModQIter;
37typedef PreModQ::const_iterator PreModQConstIter;
38
49{
50public:
53
55 virtual ~Handler(){};
56
62 virtual void addConstraint(ConstraintPtr newcon)
63 {
64 cons_.push_back(newcon);
65 };
66
70 virtual ConstraintVector::const_iterator consBegin() const
71 {
72 return cons_.begin();
73 };
74
78 virtual ConstraintVector::const_iterator consEnd() const
79 {
80 return cons_.end();
81 };
82
88 bool&);
89
103 virtual Branches getBranches(BrCandPtr cand, DoubleVector& x,
104 RelaxationPtr rel, SolutionPoolPtr s_pool) = 0;
105
123 virtual void getBranchingCandidates(RelaxationPtr rel, const DoubleVector& x,
124 ModVector& mods, BrVarCandSet& cands,
125 BrCandVector& gencands, bool& is_inf) = 0;
126
144 virtual ModificationPtr getBrMod(BrCandPtr cand, DoubleVector& x,
145 RelaxationPtr rel, BranchDirection dir) = 0;
146
148 virtual std::string getName() const = 0;
149
155 ModVector& p_mods, ModVector& r_mods);
176 bool& should_prune, double& inf_meas) = 0;
177
184 virtual bool isNeeded()
185 {
186 return !cons_.empty();
187 }
188
205 virtual SolveStatus presolve(PreModQ* pre_mods, bool* changed,
206 Solution** sol) = 0;
207
229 virtual bool presolveNode(RelaxationPtr rel, NodePtr node,
230 SolutionPoolPtr s_pool, ModVector& p_mods,
231 ModVector& r_mods) = 0;
232
250 ConstSolutionPtr, ModVector&, ModVector&)
251 {
252 // Do Nothing
253 // Only used for QuadHandler as of now
254 return true;
255 };
256
270 bool* is_inf) = 0;
271
285 bool* is_inf) = 0;
286
300 virtual void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool* is_inf) = 0;
301
314 virtual void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool* is_inf) = 0;
315
320
336 virtual void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel,
337 CutManager* cutman, SolutionPoolPtr s_pool,
338 ModVector& p_mods, ModVector& r_mods, bool* sol_found,
339 SeparationStatus* status) = 0;
340
351 virtual void setModFlags(bool mod_prob, bool mod_rel)
352 {
353 modProb_ = mod_prob;
354 modRel_ = mod_rel;
355 };
356
365 virtual void simplePresolve(ProblemPtr, SolutionPoolPtr, ModVector&,
366 SolveStatus& status)
367 {
368 // Do Nothing
369 status = Finished;
370 }
371
379 void undoStrongerMods(ProblemPtr p, RelaxationPtr rel, ModVector& p_mods,
380 ModVector& r_mods);
381
383 virtual void writeStats(std::ostream&) const {};
384
385protected:
386 ConstraintVector cons_;
387
390
393};
394
395} // namespace Minotaur
396#endif
397
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
Base class for handling specific types of constraints or objective.
Definition: Handler.h:49
virtual bool isFeasible(ConstSolutionPtr sol, RelaxationPtr rel, bool &should_prune, double &inf_meas)=0
Check if a solution is feasible.
virtual bool isNeeded()
Return true if this handler is needed for the problem.
Definition: Handler.h:184
virtual bool postSolveRootNode(RelaxationPtr, SolutionPoolPtr, ConstSolutionPtr, ModVector &, ModVector &)
At the root node post solve the problem and its relaxation. LP based bound tightening (OBBT) is emplo...
Definition: Handler.h:249
virtual ConstraintVector::const_iterator consEnd() const
Definition: Handler.h:78
virtual SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol)=0
Initial presolve.
bool getStrongerMods(RelaxationPtr rel, NodePtr node, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods)
do node presolve to get mods for stronger branching All params are presolveNode params.
Definition: Handler.cpp:27
virtual void removeCuts(RelaxationPtr, ConstSolutionPtr)
Definition: Handler.h:319
virtual void setModFlags(bool mod_prob, bool mod_rel)
Tell the handler whether the problem will be modified or the relaxation will be modified or both....
Definition: Handler.h:351
void undoStrongerMods(ProblemPtr p, RelaxationPtr rel, ModVector &p_mods, ModVector &r_mods)
Undo Modifications made during stronger branching.
Definition: Handler.cpp:44
virtual void simplePresolve(ProblemPtr, SolutionPoolPtr, ModVector &, SolveStatus &status)
Definition: Handler.h:365
virtual Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)=0
Return branches for branching.
virtual int fixNodeErr(RelaxationPtr, ConstSolutionPtr, SolutionPoolPtr, bool &)
Definition: Handler.cpp:21
virtual bool presolveNode(RelaxationPtr rel, NodePtr node, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods)=0
Presolve the problem and its relaxation at a node.
virtual ConstraintVector::const_iterator consBegin() const
Definition: Handler.h:70
virtual void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf)=0
Create an incremental relaxation for a node.
virtual ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, BranchDirection dir)=0
Get the modifcation that creates a given (up or down) branch.
Handler()
Default constructor.
Definition: Handler.h:52
virtual void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &gencands, bool &is_inf)=0
find branching candidates.
bool modProb_
If true, modify the original (or transformed) problem.
Definition: Handler.h:389
virtual void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf)=0
Create a relaxation for a node, building from scratch.
virtual void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel, CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods, bool *sol_found, SeparationStatus *status)=0
add cuts to separate a given point.
virtual void addConstraint(ConstraintPtr newcon)
Add constraint to be handled by this handler.
Definition: Handler.h:62
virtual void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)=0
Create root relaxation if doing full node relaxations.
virtual ~Handler()
Destroy.
Definition: Handler.h:55
virtual void writeStats(std::ostream &) const
Write statistics to ostream out.
Definition: Handler.h:383
virtual std::string getName() const =0
Return the name of the handler.
virtual void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)=0
Create root relaxation if doing incremental node relaxations.
bool modRel_
If true, modify the relaxation of original (or transformed) problem.
Definition: Handler.h:392
Definition: Modification.h:29
Definition: Node.h:54
Definition: Problem.h:74
Definition: Relaxation.h:53
Definition: SolutionPool.h:28
Definition: Solution.h:30
Definition: ActiveNodeStore.h:20
BranchDirection
Two directions for branching.
Definition: Types.h:201
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

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