Minotaur 0.4.1
Docs for developers
LinearHandler.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
14#ifndef MINOTAURLINEARHANDLER_H
15#define MINOTAURLINEARHANDLER_H
16
17#include "Handler.h"
18
19namespace Minotaur
20{
21
24 int iters;
25 double time;
26 double timeN;
27 int varDel;
28 int conDel;
29 int var2Bin;
30 int var2Int;
31 int vBnd;
32 int cBnd;
33 int cImp;
34 int bImpl;
35 int nMods;
36};
37
40 bool doPresolve;
41
42 bool showStats;
43
45
46 bool purgeVars;
47
48 bool purgeCons;
49
50 bool dualFix;
51
52 bool coeffImp;
53};
54
59class LinearHandler : public Handler
60{
61public:
64
66 LinearHandler(EnvPtr env, ProblemPtr problem);
67
70
71 // Does nothing.
72 void relaxInitFull(RelaxationPtr rel, SolutionPool* sp, bool* is_inf);
73
74 // Does nothing.
75 void relaxInitInc(RelaxationPtr rel, SolutionPool* sp, bool* is_inf);
76
77 // Does nothing.
78 void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool* is_inf);
79
80 // Does nothing.
81 void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool* is_inf);
82
88 {
89 return true;
90 }
91
92 bool isNeeded()
93 {
94 return true;
95 }
96
101 CutManager* cutman, SolutionPoolPtr s_pool, ModVector& p_mods,
102 ModVector& r_mods, bool* sol_found, SeparationStatus* status);
103
105 virtual void getBranchingCandidates(RelaxationPtr, const DoubleVector&,
106 ModVector&, BrVarCandSet&, BrCandVector&,
107 bool&){};
108
112 {
113 return ModificationPtr();
114 }; // NULL
115
117 virtual Branches getBranches(BrCandPtr, DoubleVector&, RelaxationPtr,
119 {
120 return Branches();
121 }; // NULL
122
123 // presolve.
124 virtual SolveStatus presolve(PreModQ* pre_mods, bool* changed,
125 Solution** sol);
126
127 // Implement Handler::presolveNode().
128 virtual bool presolveNode(RelaxationPtr p, NodePtr node,
129 SolutionPoolPtr s_pool, ModVector& p_mods,
130 ModVector& r_mods);
131
132 // Write name
133 virtual std::string getName() const;
134
136 const LinPresolveOpts* getOpts() const;
137
139 void setPreOptMaxIters(int val)
140 {
141 pOpts_->maxIters = val;
142 };
143
145 void setPreOptPurgeVars(bool val)
146 {
147 pOpts_->purgeVars = val;
148 };
149
151 void setPreOptPurgeCons(bool val)
152 {
153 pOpts_->purgeCons = val;
154 };
155
156 void setPreOptDualFix(bool val)
157 {
158 pOpts_->dualFix = val;
159 };
160
161 void setPreOptCoeffImp(bool val)
162 {
163 pOpts_->coeffImp = val;
164 };
165
166 void simplePresolve(ProblemPtr p, SolutionPoolPtr spool, ModVector& t_mods,
167 SolveStatus& status);
168
170 void writePreStats(std::ostream& out) const;
171
172 // Write statistics.
173 void writeStats(std::ostream& out) const;
174
175protected:
178
181
184
186
190 const double intTol_;
191
194
196 const double eTol_;
197
199 const double infty_;
200
203
206
211 VarQueue linVars_;
212
214 static const std::string me_;
215
216 void chkIntToBin_(VariablePtr v);
217
226 void chkSing_(bool* changed);
227
228 void coeffImp_(bool* changed);
229 void computeImpBounds_(ConstraintPtr c, VariablePtr z, double zval,
230 double* lb, double* ub);
231 void copyBndsFromRel_(RelaxationPtr rel, ModVector& p_mods);
232
233 void delFixedVars_(bool* changed);
234
235 void dualFix_(bool* changed);
236 void domRows_(bool* changed);
237 void dupRows_(bool* changed);
238
241
244
245 void findLinVars_();
246
247 void findAllBinCons_();
248 void fixToCont_();
249
250 void getLfBnds_(LinearFunctionPtr lf, double* lo, double* up);
251 void getSingLfBnds_(LinearFunctionPtr lf, double* lo, double* up);
252
253 SolveStatus linBndTighten_(ProblemPtr p, bool apply_to_prob,
254 ConstraintPtr c_ptr, bool* changed, ModQ* mods,
255 UInt* nintmods);
256
257 void purgeVars_(PreModQ* pre_mods);
258
269 void relax_(ProblemPtr p, RelaxationPtr rel, bool* is_inf);
270
271 void substVars_(bool* changed, PreModQ* pre_mods);
272
274 void tightenInts_(ProblemPtr p, bool apply_to_prob, bool* changed,
275 ModQ* mods);
276
277 bool treatDupRows_(ConstraintPtr c1, ConstraintPtr c2, double mult,
278 bool* changed);
279
280 void updateLfBoundsFromLb_(ProblemPtr p, bool apply_to_prob,
281 LinearFunctionPtr lf, double lb, double uu,
282 bool is_sing, bool* changed, ModQ* mods,
283 UInt* nintmods);
284
285 void updateLfBoundsFromUb_(ProblemPtr p, bool apply_to_prob,
286 LinearFunctionPtr lf, double ub, double ll,
287 bool is_sing, bool* changed, ModQ* mods,
288 UInt* nintmods);
289
290 SolveStatus varBndsFromCons_(ProblemPtr p, bool apply_to_prob, bool* changed,
291 ModQ* mods, UInt* nintmods);
292
293 SolveStatus varBndsFromObj_(ProblemPtr p, double ub, bool apply_to_prob,
294 bool* changed, ModQ* mods);
295};
298} // namespace Minotaur
299#endif
300
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
The base class linear function is of the form c'x.
Definition: LinearFunction.h:31
Definition: LinearHandler.h:60
SolveStatus checkBounds_(ProblemPtr p)
check if lb <= ub for all variables and constraints.
Definition: LinearHandler.cpp:324
virtual SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol)
Initial presolve.
Definition: LinearHandler.cpp:215
bool chkDupRows_
If true, dupRows_ is run in presolve.
Definition: LinearHandler.h:193
const double eTol_
Tolerance.
Definition: LinearHandler.h:196
void setPreOptPurgeCons(bool val)
If True, purge redundant constraints.
Definition: LinearHandler.h:151
void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel, CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods, ModVector &r_mods, bool *sol_found, SeparationStatus *status)
Definition: LinearHandler.cpp:208
ProblemPtr problem_
The problem for which the handler was created.
Definition: LinearHandler.h:180
~LinearHandler()
Destroy.
Definition: LinearHandler.cpp:97
virtual Branches getBranches(BrCandPtr, DoubleVector &, RelaxationPtr, SolutionPoolPtr)
Does nothing.
Definition: LinearHandler.h:117
void relaxInitInc(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing incremental node relaxations.
Definition: LinearHandler.cpp:1495
LoggerPtr logger_
Log.
Definition: LinearHandler.h:183
virtual void getBranchingCandidates(RelaxationPtr, const DoubleVector &, ModVector &, BrVarCandSet &, BrCandVector &, bool &)
Does nothing.
Definition: LinearHandler.h:105
VarQueue linVars_
Definition: LinearHandler.h:211
virtual 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: LinearHandler.cpp:1670
void tightenInts_(ProblemPtr p, bool apply_to_prob, bool *changed, ModQ *mods)
Round the bounds.
Definition: LinearHandler.cpp:407
bool isNeeded()
Return true if this handler is needed for the problem.
Definition: LinearHandler.h:92
void relaxInitFull(RelaxationPtr rel, SolutionPool *sp, bool *is_inf)
Create root relaxation if doing full node relaxations.
Definition: LinearHandler.cpp:1489
void relaxNodeFull(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create a relaxation for a node, building from scratch.
Definition: LinearHandler.cpp:1500
void changeBFlag_(VariablePtr v)
change constraints flag for presolve
Definition: LinearHandler.cpp:1320
const double intTol_
Tolerance for checking integrality.
Definition: LinearHandler.h:190
virtual std::string getName() const
Return the name of the handler.
Definition: LinearHandler.cpp:1852
void writeStats(std::ostream &out) const
Write statistics to ostream out.
Definition: LinearHandler.cpp:1847
void setPreOptMaxIters(int val)
Maximum number of iterations.
Definition: LinearHandler.h:139
LinPresolveStats * pStats_
Statistics of presolve.
Definition: LinearHandler.h:202
void simplePresolve(ProblemPtr p, SolutionPoolPtr spool, ModVector &t_mods, SolveStatus &status)
Definition: LinearHandler.cpp:1682
EnvPtr env_
Environment.
Definition: LinearHandler.h:177
LinearHandler()
Default constructor.
Definition: LinearHandler.cpp:52
void writePreStats(std::ostream &out) const
Write the presolve statistics.
Definition: LinearHandler.cpp:1818
const double infty_
Infinity. Bounds beyond this number are treated as infinity.
Definition: LinearHandler.h:199
const LinPresolveOpts * getOpts() const
Return a constant pointer to the presolve options.
Definition: LinearHandler.cpp:1747
void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *is_inf)
Create an incremental relaxation for a node.
Definition: LinearHandler.cpp:1505
LinPresolveOpts * pOpts_
Options for presolve.
Definition: LinearHandler.h:205
virtual ModificationPtr getBrMod(BrCandPtr, DoubleVector &, RelaxationPtr, BranchDirection)
Does nothing.
Definition: LinearHandler.h:110
static const std::string me_
For log.
Definition: LinearHandler.h:214
bool isFeasible(ConstSolutionPtr, RelaxationPtr, bool &, double &)
Definition: LinearHandler.h:87
void chkSing_(bool *changed)
Find variables that appear in exactly one constraint in linear form and do not appear in objective....
Definition: LinearHandler.cpp:356
void setPreOptPurgeVars(bool val)
If True, purge fixed variables.
Definition: LinearHandler.h:145
void relax_(ProblemPtr p, RelaxationPtr rel, bool *is_inf)
Common routine for building relaxation by copying all the linear constraints and variable-bounds from...
Definition: LinearHandler.cpp:1433
Definition: Logger.h:37
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: 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
Options for presolve.
Definition: LinearHandler.h:39
bool purgeCons
If True, purge fixed variables.
Definition: LinearHandler.h:48
bool dualFix
If True, purge redundant constraints.
Definition: LinearHandler.h:50
bool showStats
True if presolve is enabled, false otherwise.
Definition: LinearHandler.h:42
bool coeffImp
If True, do dual cost fixing.
Definition: LinearHandler.h:52
int maxIters
True if stats are displayed, false otherwise.
Definition: LinearHandler.h:44
bool purgeVars
Maximum number of iterations.
Definition: LinearHandler.h:46
Store statistics of presolving.
Definition: LinearHandler.h:23
int conDel
‍Number of variables marked for deletion.
Definition: LinearHandler.h:28
double timeN
‍Total time used in initial presolve.
Definition: LinearHandler.h:26
int nMods
‍No. of times a binary var. was changed to implied binary.
Definition: LinearHandler.h:35
int cImp
‍Number of times constraint-bounds were tightened.
Definition: LinearHandler.h:33
int cBnd
‍Number of times variable-bounds were tightened.
Definition: LinearHandler.h:32
int bImpl
‍Number of times coefficient in a constraint was improved.
Definition: LinearHandler.h:34
int var2Bin
‍Number of constraints marked for deletion.
Definition: LinearHandler.h:29
int var2Int
‍Number of variables converted to binary.
Definition: LinearHandler.h:30
int varDel
‍Total time used in presolveNode.
Definition: LinearHandler.h:27
double time
‍Number of iterations (main cycle).
Definition: LinearHandler.h:25
int vBnd
‍Number of variables converted to integers.
Definition: LinearHandler.h:31

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