Minotaur 0.4.1
Docs for developers
HybridBrancher.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
13#ifndef MINOTAURHYBRIDBRANCHER_H
14#define MINOTAURHYBRIDBRANCHER_H
15
16#include "Brancher.h"
17
18namespace Minotaur
19{
20
21class Engine;
22class Timer;
23typedef Engine* EnginePtr;
24
25struct StrBrStats {
26 UInt calls;
29 double time;
30};
31// A class to select a variable for branching using Hybrid branching.
33{
34public:
42 HybridBrancher(EnvPtr env, HandlerVector& handlers);
43
46
50 void doStronger();
51
52 // base class function.
53 Branches findBranches(RelaxationPtr rel, NodePtr node, ConstSolutionPtr sol,
54 SolutionPoolPtr s_pool, BrancherStatus& br_status,
55 ModVector& mods);
56
57 // base class function.
58 std::string getName() const;
59
67 void reliabilitySetup(UInt max_cands, UInt max_iter, UInt thresh);
68
74 void setEngine(EnginePtr engine);
75
81 void setProblem(ProblemPtr p);
82
83 // base class function.
85
87 void writeStats(std::ostream& out) const;
89 void statsTable()const;
90
91private:
92 std::vector<std::string> variableNames_;
94 EnginePtr engine_;
95
97 const double eTol_;
98
100 BrCandVector gencands_;
101
106 HandlerVector handlers_;
107
108 bool init_;
109
111 UInt maxCands_;
112
117 UInt maxIterations_;
118
120 const static std::string me_;
121
123 ModVector mods_;
124
126 ProblemPtr p_;
127
132 UIntVector fracCount_;
133
138 UIntVector unfixedCount_;
143 void updateFracCount_();
148 void updateUnfixedCount_();
149
151 UIntVector actualTimesUp_;
152
154 UIntVector actualTimesDown_;
155
157 DoubleVector pseudoDown_;
158
160 DoubleVector pseudoUp_;
161
163 RelaxationPtr rel_;
164
166 BrVarCandSet relCands_;
167
169 bool reliability_;
170
172 StrBrStats* stats_;
173
175 BrancherStatus status_;
176
177 bool stronger_;
178
180 const Timer* timer_;
181
183 UInt thresh_;
184
186 UIntVector timesDown_;
187
189 UIntVector timesUp_;
190
192 BrVarCandSet unrelCands_;
193
195 DoubleVector x_;
196
207 BrCandPtr findBestCandidate_(const double objval, SolutionPoolPtr s_pool);
208
214 void findCandidates_(bool& should_prune);
215
220 UInt findMaxTSR_();
221
226 void freeCandidates_(BrCandPtr no_del);
227
235 void getPCScore_(BrCandPtr cand, double* ch_dn, double* ch_up, double* score);
236
243 double getScore_(const double& up_score, const double& down_score);
244
250 void initialize_(RelaxationPtr rel);
251
257 bool isReliable_(int pcostIndex);
258
273 bool shouldPrune_(const double& chcutoff, const double& change,
274 const EngineStatus& status, bool* is_rel);
275
280 double sortUnrelCands_(DoubleVector& vio);
281
290 void strongBranch_(BrCandPtr cand, double& obj_up, double& obj_down,
291 EngineStatus& status_up, EngineStatus& status_down,
292 SolutionPoolPtr s_pool);
293
304 void updatePCost_(const int& i, const double& new_cost, DoubleVector& cost,
305 UIntVector& count);
306
322 void useStrongBranchInfo_(BrCandPtr cand, const double& chcutoff,
323 double& change_up, double& change_down,
324 const EngineStatus& status_up,
325 const EngineStatus& status_down);
326
335 void writeScore_(BrCandPtr cand, double score, double change_up,
336 double change_down);
337};
339} // namespace Minotaur
340#endif
341
Declare the base class Brancher for finding and creating branches in Branch-and-Bound.
Base class for describing candidates for branching on a node in branch-and-bound.
Definition: BrCand.h:32
A brancher is used to find suitable branches for a given node. e.g. LexicoBrancher....
Definition: Brancher.h:33
Definition: Engine.h:34
Definition: Environment.h:28
Definition: HybridBrancher.h:33
void writeStats(std::ostream &out) const
Write statistics.
Definition: HybridBrancher.cpp:796
Branches findBranches(RelaxationPtr rel, NodePtr node, ConstSolutionPtr sol, SolutionPoolPtr s_pool, BrancherStatus &br_status, ModVector &mods)
Find a branching candidate.
Definition: HybridBrancher.cpp:185
void doStronger()
Definition: HybridBrancher.cpp:71
void reliabilitySetup(UInt max_cands, UInt max_iter, UInt thresh)
Do reliability branching setup.
Definition: HybridBrancher.cpp:469
HybridBrancher(EnvPtr env, HandlerVector &handlers)
Construct using an environment pointer and handlers.
Definition: HybridBrancher.cpp:42
~HybridBrancher()
Destructor.
Definition: HybridBrancher.cpp:66
void statsTable() const
Print Table.
Definition: HybridBrancher.cpp:761
void updateAfterSolve(NodePtr node, ConstSolutionPtr sol)
Update pseudo-costs after LP is solved.
Definition: HybridBrancher.cpp:644
void setProblem(ProblemPtr p)
Set problem.
Definition: HybridBrancher.cpp:479
std::string getName() const
Return the name of this brancher.
Definition: HybridBrancher.cpp:384
void setEngine(EnginePtr engine)
Set engine.
Definition: HybridBrancher.cpp:464
Definition: Node.h:54
Definition: Problem.h:74
Definition: Relaxation.h:53
Definition: SolutionPool.h:28
Definition: Solution.h:30
Definition: Timer.h:40
Definition: ActiveNodeStore.h:20
BrancherStatus
What can a brancher do to a node in branch-and-bound.
Definition: Types.h:193
unsigned int UInt
Unsigned integer.
Definition: Types.h:30
EngineStatus
Different status that an external engine may report.
Definition: Types.h:176
Definition: HybridBrancher.h:25
double time
Number of times node was pruned by strong branching.
Definition: HybridBrancher.h:29
UInt nodePruned
Number of times an unexpected engine status was met.
Definition: HybridBrancher.h:28
UInt engProbs
Number of calls to find branching candidate.
Definition: HybridBrancher.h:27

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