Minotaur 0.4.1
Docs for developers
Loading...
Searching...
No Matches
RecipHandler.h
Go to the documentation of this file.
1//
2// Minotaur -- It's only 1/2 bull
3//
4// (C)opyright 2010 - 2025 The Minotaur Team.
5//
6
14#ifndef MINOTAURRECIPHANDLER_H
15#define MINOTAURRECIPHANDLER_H
16
17#include "Handler.h"
18#include "Types.h"
19
20namespace Minotaur {
21
22 class Engine;
23 class Function;
24 class LinearFunction;
25 class Objective;
26 class Problem;
27 typedef LinearFunction *LinearFunctionPtr;
28 typedef Objective *ObjectivePtr;
29
30 class RecipHandler : public Handler {
31 public:
32 // Constructor
33 RecipHandler(EnvPtr env, ProblemPtr problem);
34 RecipHandler(EnvPtr env, ProblemPtr problem, ProblemPtr orig_);
35
36 // Destructor
38
39 void addConstraint(ConstraintPtr newcon, ConstVariablePtr ivar,
40 ConstVariablePtr ovar, char sense = 'E');
41 //base method
42 void addConstraint(ConstraintPtr) { assert(0); }
43
44 //Does nothing
46 //Does Nothing
47 void relaxInitInc(RelaxationPtr rel, SolutionPool *, bool *is_inf);
48 bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation,
49 bool &should_prune, double &inf_meas);
50 //Checks if Cutting plane can be added or not based on convexity/concavity
52 CutManager *cutman, SolutionPoolPtr s_pool,
53 ModVector &p_mods, ModVector &r_mods, bool *sol_found,
54 SeparationStatus *status);
55
57
58 //Update the relaxation at each node
59 void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *isInfeasible);
60
61 void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x,
62 ModVector &mods, BrVarCandSet &cands,
63 BrCandVector &gencands, bool &is_inf);
64
65 ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x,
67
68 Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel,
69 SolutionPoolPtr s_pool);
70
71 SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol);
72
74 ModVector &p_mods, ModVector &r_mods);
75
76 std::string getName() const override;
77 void writeStats(std::ostream &out) const override;
78
79 private:
80 struct RecipCons {
81 ConstraintPtr con;
84 VariablePtr riv;
85 VariablePtr rov;
86 char sense;
87 ConstraintPtr secCon;
88 ConstraintVector linCons;
89
90 RecipCons(ConstraintPtr newcon, ConstVariablePtr ivar,
91 ConstVariablePtr ovar, char s)
92 : con(newcon), iv(ivar), ov(ovar), riv(0), rov(0),
93 sense(s), secCon(0), linCons() {}
94 };
95
96 typedef RecipCons *RecipConsPtr;
97 typedef std::vector<RecipConsPtr> RecipConsVec;
98 typedef RecipConsVec::iterator RecipConsIter;
99
100 RecipConsVec consd_;
101 static const std::string me_;
102
103 struct SepaStats {
104 int iters;
105 int tangentcuts;
106 int optcuts;
107 int optrem;
108 double time;
109 };
110
111 struct RecipPresolveStats {
112 UInt iters;
113 double time;
114 UInt conDel;
115 UInt vBnd;
116 UInt nMods;
117 RecipPresolveStats() : iters(0), time(0.0), conDel(0), vBnd(0), nMods(0) {}
118 };
119
120 struct BoundTighteningStats {
121 int niters;
122 int nLP;
123 int dlb;
124 int dub;
125 double timeLP;
126 };
127
128 BoundTighteningStats bStats_;
129 RecipPresolveStats pStats_;
130 SepaStats sStats_;
131
132 double LBd_;
133 double UBd_;
134 double bTol_;
135 EnvPtr env_;
136 ProblemPtr orig_;
137 ConstraintVector optCuts_;
138 double aTol_;
139 double rTol_;
140 double eTol_;
141 double vTol_;
142 ProblemPtr p_;
143 LoggerPtr log_;
144 DoubleVector tmpX_;
145 DoubleVector grad_;
146
147 //Add cuts after separate_ function is called
148 void addCut_(VariablePtr x, VariablePtr y, double xval, double yval,
149 RelaxationPtr rel, bool& ifcuts);
150 // Add Tangent at root and other node for y=1/x
151 void addLin_(RecipCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
152 DoubleVector &grad, ModVector &mods, bool init);
153 //Add Secant at root and other node for y=1/x
154 void addSecant_(RecipCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
155 ModVector &mods, bool init);
156 // delete duplicate constraint
157 void dupRows_(bool *changed);
158 //select branching point for a variable based on its domain
159 BranchPtr doBranch_(BranchDirection UpOrDown, ConstVariablePtr v, double bvalue);
160 // returns violation in y-1/x
161 double getViol_(const RecipCons &cd, const DoubleVector &x) const;
162 //Check Feasibility of y=1/x
163 bool isFeasible_(ConstSolutionPtr sol, RelaxationPtr relaxation,
164 bool &should_prune, double &inf_meas);
165 // Creates root relaxation
166 void initRelax_(RecipCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
167 DoubleVector &grad);
168 //from bound on y->x to bound on x->y
169 bool propRecipBnds_(RecipConsPtr lcd, bool *changed);
170 //marks dup row for deletion
171 bool treatDupRows_(ConstraintPtr c1, ConstraintPtr c2, double mult,
172 bool *changed);
173 // Update the node relaxation by changing the bound
174 void updateRelax_(RecipCons &cd, RelaxationPtr rel, DoubleVector &tmpX,
175 DoubleVector &grad, ModVector &mods);
176
177 int updatePBnds_(VariablePtr p, double newlb, double newub, bool *changed);
178 int updatePBnds_(VariablePtr v, double newlb, double newub,
179 RelaxationPtr rel, bool mod_rel, bool *changed,
180 ModVector &p_mods, ModVector &r_mods);
181
182 bool varBndsFromCons_(bool *changed);
183 };
184
185} // namespace Minotaur
186#endif // MINOTAURRECIPHANDLER_H
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 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 RecipHandler.h:30
std::string getName() const override
Return the name of the handler.
Definition RecipHandler.cpp:797
void relaxNodeFull(NodePtr, RelaxationPtr, bool *)
Create a relaxation for a node, building from scratch.
Definition RecipHandler.h:56
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 RecipHandler.cpp:792
SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol)
Initial presolve.
Definition RecipHandler.cpp:767
Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition RecipHandler.cpp:457
void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *isInfeasible)
Create an incremental relaxation for a node.
Definition RecipHandler.cpp:266
void addConstraint(ConstraintPtr)
Add constraint to be handled by this handler.
Definition RecipHandler.h:42
ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, BranchDirection dir)
Get the modifcation that creates a given (up or down) branch.
Definition RecipHandler.cpp:423
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 RecipHandler.cpp:358
void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &gencands, bool &is_inf)
find branching candidates.
Definition RecipHandler.cpp:393
void writeStats(std::ostream &out) const override
Write statistics to ostream out.
Definition RecipHandler.cpp:802
bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation, bool &should_prune, double &inf_meas)
Check if a solution is feasible.
Definition RecipHandler.cpp:322
void relaxInitFull(RelaxationPtr, SolutionPool *, bool *)
Create root relaxation if doing full node relaxations.
Definition RecipHandler.h:45
void relaxInitInc(RelaxationPtr rel, SolutionPool *, bool *is_inf)
Create root relaxation if doing incremental node relaxations.
Definition RecipHandler.cpp:254
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
SolveStatus
Different states an algorithm like branch-and-bound can be in.
Definition Types.h:158

Minotaur source code documented by Doxygen 1.9.8 on Fri Jul 17 2026