Minotaur 0.4.1
Docs for developers
CxUnivarHandler.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 MINOTAURCXUNIVARHANDLER_H
16#define MINOTAURCXUNIVARHANDLER_H
17
18#include "Handler.h"
19#include "Types.h"
20
21namespace Minotaur {
22
23 class Engine;
24 class Function;
25 class LinearFunction;
26 class Objective;
27 class Problem;
28 typedef LinearFunction* LinearFunctionPtr;
29 typedef Objective* ObjectivePtr;
30
31
33
34 protected:
35
37 double eTol_;
38
40 double vTol_;
41
44
49
50 // Points to the relaxation version of the input variable
51 // Updated only after relaxInit is called
52 VariablePtr riv_;
53
57
58 // Points to the relaxation version of the output variable
59 // Updated only after relaxInit is called
60 VariablePtr rov_;
61
65 char sense_;
66
69
71 ConstraintVector linCons_;
72
73 public:
74
76 void initRelax(RelaxationPtr rel, DoubleVector& tmpX, DoubleVector& grad);
77
79 void updateRelax(RelaxationPtr rel, DoubleVector& tmpX, DoubleVector& grad,
80 ModVector &mods);
81
82 bool isFeasible(const double* x);
83
84 double getViol(const std::vector< double > & x);
85
86 // Creates and adds the secant inequality defined by current constraint to
87 // the relaxation
88 // Returns the constraint that was added, which may be null if it was not
89 // possible to add a constraint (e.g., due to an infinite bound)
90 void addSecant(RelaxationPtr rel, ConstVariablePtr iv,
91 ConstVariablePtr ov, FunctionPtr fn, DoubleVector& tmpX,
92 bool init, ModVector &mods);
93
94 // Creates and adds linearization inequalities to approximate the lower
95 // envelope of the convex function
96 // Returns a vector of constraints that were added
97 void addLin(RelaxationPtr rel, ConstVariablePtr iv,
99 DoubleVector& tmpX, DoubleVector& grad, bool init,
100 ModVector &mods);
101
102 ConstraintPtr getOriginalCon() const { return con_; }
103 ConstraintPtr getSecantCon() const { return secCon_; }
104
105 ConstVariablePtr getROutVar() const { return rov_; } ;
106
107 ConstVariablePtr getRInputVar() const { return riv_; } ;
108
109 //ConstraintVector & getLinCons
110 ConstraintIterator linConsBegin() { return linCons_.begin(); }
111 ConstraintIterator linConsEnd() { return linCons_.end(); }
112
113
114 char getSense() { return sense_; } ;
115
117 CxUnivarConstraintData(double eTol, double vTol, ConstraintPtr newcon, ConstVariablePtr ovar,
118 ConstVariablePtr ivar, char sense);
119
122
123
124 };
125
127 typedef std::vector<CxUnivarConstraintDataPtr> CxUnivarConstraintDataVector;
128 typedef CxUnivarConstraintDataVector::iterator CxUnivarConstraintIterator;
129
130
141 class CxUnivarHandler : public Handler {
142
143
144 protected:
145
147 double eTol_;
148
150 double vTol_;
151
154
157
159 static const std::string me_;
160
162 CxUnivarConstraintDataVector cons_data_;
163
165 DoubleVector tmpX_;
166
168 DoubleVector grad_;
169
170 public:
172 CxUnivarHandler(EnvPtr env, ProblemPtr problem);
173
176
182 ConstVariablePtr ovar, char sense = 'E');
183
184 // base class method.
185 void addConstraint(ConstraintPtr ) { assert(0); };
186
192
193 void relaxInitInc(RelaxationPtr rel, SolutionPool *, bool* is_inf);
194
198 bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation,
199 bool &should_prune, double &inf_meas);
200
205 void separate(ConstSolutionPtr sol, NodePtr node, RelaxationPtr rel,
206 CutManager *cutman, SolutionPoolPtr s_pool, ModVector &p_mods,
207 ModVector &r_mods, bool *sol_found,
208 SeparationStatus *status);
209
210
211
217 virtual void relaxNodeFull(NodePtr /* node */, RelaxationPtr /* rel */,
218 bool* /* should_prune */) {} ;
219
224 virtual void relaxNodeInc(NodePtr node, RelaxationPtr rel,
225 bool* isInfeasible);
226
227 // base class method
228 virtual void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x,
229 ModVector &mods, BrVarCandSet &cands,
230 BrCandVector &gencands, bool & is_inf);
231
232 // Implement Handler::getBrMod().
233 virtual ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x,
235
236 // Implement Handler::getBranches().
237 virtual Branches getBranches(BrCandPtr cand, DoubleVector & x,
238 RelaxationPtr rel, SolutionPoolPtr s_pool);
239
240 // presolve.
241 virtual SolveStatus presolve(PreModQ *pre_mods, bool *changed,
242 Solution **sol);
243
244 // Implement Handler::presolveNode().
245 virtual bool presolveNode(RelaxationPtr p, NodePtr node,
246 SolutionPoolPtr s_pool, ModVector &p_mods,
247 ModVector &r_mods);
248
249
250 // Write name
251 virtual std::string getName() const;
252
253 private:
254 // Helper functions
255 BranchPtr doBranch_(BranchDirection UpOrDown, ConstVariablePtr v,
256 double bvalue);
257
258
259
260 };
261
263 typedef CxUnivarConstraintData* CxUnivarConstraintDataPtr;
264
267
270
273}
274#endif
275
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
Base class for storing branching modifications.
Definition: Branch.h:33
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: CxUnivarHandler.h:32
~CxUnivarConstraintData()
Destroy.
Definition: CxUnivarHandler.h:121
ConstraintPtr con_
This is the constraint of the orginal problem.
Definition: CxUnivarHandler.h:43
ConstVariablePtr iv_
Definition: CxUnivarHandler.h:48
void updateRelax(RelaxationPtr rel, DoubleVector &tmpX, DoubleVector &grad, ModVector &mods)
Update the current relaxation based on current variable bounds.
Definition: CxUnivarHandler.cpp:91
char sense_
Definition: CxUnivarHandler.h:65
void initRelax(RelaxationPtr rel, DoubleVector &tmpX, DoubleVector &grad)
Creates initial relaxations
Definition: CxUnivarHandler.cpp:66
ConstraintPtr secCon_
Secant constraint in the relaxation.
Definition: CxUnivarHandler.h:68
double eTol_
Tolerance for constraint violation.
Definition: CxUnivarHandler.h:37
ConstraintVector linCons_
Array of linearization constraints in the relaxation.
Definition: CxUnivarHandler.h:71
ConstVariablePtr ov_
Definition: CxUnivarHandler.h:56
double vTol_
Tolerance for when upper and lower bounds considered equal.
Definition: CxUnivarHandler.h:40
CxUnivarConstraintData(double eTol, double vTol, ConstraintPtr newcon, ConstVariablePtr ovar, ConstVariablePtr ivar, char sense)
Default constructor.
Definition: CxUnivarHandler.cpp:46
Definition: CxUnivarHandler.h:141
CxUnivarHandler(EnvPtr env, ProblemPtr problem)
Default constructor.
Definition: CxUnivarHandler.cpp:143
LoggerPtr logger_
Logger.
Definition: CxUnivarHandler.h:156
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: CxUnivarHandler.cpp:409
void relaxInitInc(RelaxationPtr rel, SolutionPool *, bool *is_inf)
Create root relaxation if doing incremental node relaxations.
Definition: CxUnivarHandler.cpp:161
double eTol_
Tolerance for constraint violation.
Definition: CxUnivarHandler.h:147
virtual SolveStatus presolve(PreModQ *pre_mods, bool *changed, Solution **sol)
Initial presolve.
Definition: CxUnivarHandler.cpp:659
virtual Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition: CxUnivarHandler.cpp:516
ProblemPtr problem_
Original problem.
Definition: CxUnivarHandler.h:153
CxUnivarConstraintDataVector cons_data_
Internal data associated with each constraint.
Definition: CxUnivarHandler.h:162
virtual void relaxNodeInc(NodePtr node, RelaxationPtr rel, bool *isInfeasible)
Definition: CxUnivarHandler.cpp:178
virtual void relaxNodeFull(NodePtr, RelaxationPtr, bool *)
Definition: CxUnivarHandler.h:217
virtual std::string getName() const
Return the name of the handler.
Definition: CxUnivarHandler.cpp:674
void addConstraint(ConstraintPtr newcon, ConstVariablePtr ivar, ConstVariablePtr ovar, char sense='E')
Definition: CxUnivarHandler.cpp:378
DoubleVector grad_
A temporary vector of zeros, for getting gradients.
Definition: CxUnivarHandler.h:168
~CxUnivarHandler()
Destroy.
Definition: CxUnivarHandler.cpp:156
virtual void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &gencands, bool &is_inf)
find branching candidates.
Definition: CxUnivarHandler.cpp:416
DoubleVector tmpX_
A temporary vector of zeros, for evaluating functions.
Definition: CxUnivarHandler.h:165
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: CxUnivarHandler.cpp:666
void relaxInitFull(RelaxationPtr, SolutionPool *, bool *)
Definition: CxUnivarHandler.h:191
bool isFeasible(ConstSolutionPtr sol, RelaxationPtr relaxation, bool &should_prune, double &inf_meas)
Definition: CxUnivarHandler.cpp:389
void addConstraint(ConstraintPtr)
Add constraint to be handled by this handler.
Definition: CxUnivarHandler.h:185
double vTol_
Tolerance for when upper and lower bounds considered equal.
Definition: CxUnivarHandler.h:150
virtual ModificationPtr getBrMod(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, BranchDirection dir)
Get the modifcation that creates a given (up or down) branch.
Definition: CxUnivarHandler.cpp:458
static const std::string me_
For printing.
Definition: CxUnivarHandler.h:159
Definition: Environment.h:28
Definition: Function.h:37
Base class for handling specific types of constraints or objective.
Definition: Handler.h:49
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
CxUnivarHandler * CxUnivarHandlerPtr
Shared pointer to CxUnivarHandler.
Definition: CxUnivarHandler.h:269
BranchDirection
Two directions for branching.
Definition: Types.h:201
const CxUnivarHandler * CxUnivarConstHandlerPtr
Shared pointer to const CxUnivarHandler.
Definition: CxUnivarHandler.h:272
CxUnivarConstraintData * CxUnivarConstraintDataPtr
Shared pointer to CxUnivarHandler.
Definition: CxUnivarHandler.h:126
const CxUnivarConstraintData * CxUnivarConstConstraintDataPtr
Shared pointer to const CxUnivarHandler.
Definition: CxUnivarHandler.h:266
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