Minotaur 0.4.1
Docs for developers
MultilinearTermsHandler.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
12#ifndef MINOTAURMULTILINEARTERMSHANDLER_H
13#define MINOTAURMULTILINEARTERMSHANDLER_H
14
15#include <algorithm>
16
17#include "Handler.h"
18#include "LPEngine.h"
19
20
21namespace Minotaur {
22
23
24// These should maybe go in Terms.h and be public -- they seem pretty generic
25typedef std::set<ConstVariablePtr> SetOfVars;
26typedef std::set<SetOfVars> SetOfSetOfVars;
27
28
29/*
30 * This class is needed to store information about term cover
31 * It is not a horribly efficient implementation, as I didn't even bother
32 * to make an adjacency list (yet)
33 */
34
36
37public:
38
40{
41public:
42 bool operator()(const SetOfVars &lhs, const SetOfVars &rhs ) const
43 {
44 return lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
45 }
46};
47
48 typedef std::map<SetOfVars, double, CompareSetsOfVars> SetOfVarsDoubleMap;
49 typedef std::list<SetOfVars> ListOfSetOfVars;
50 typedef std::map<ConstVariablePtr, ListOfSetOfVars> AdjListType;
51
52public:
53 Hypergraph(ConstProblemPtr p) : problem_(p) {} ;
54 virtual ~Hypergraph () {};
55
56 void adjustEdgeWeightsBetween(const VariablePtr v, const SetOfVars &g,
57 bool phaseOne);
58 void create(std::map<ConstVariablePtr, SetOfVars > const &terms);
59 double getWeight(const SetOfVars &e);
60 SetOfVars heaviestEdge(bool &maxWeightPositive) const;
61 VariablePtr heaviestIncidentVertex(const SetOfVars &g);
62 ListOfSetOfVars incidentEdges(ConstVariablePtr v) const;
63
64 VariablePtr maxWeightedDegreeVertex(bool &maxWeightPositive) const;
65 int numEdges() const { return E_.size(); }
66 int numVertices() const { return V_.size(); }
67
68 SetOfVars randomEdge(bool &maxWeightPositive);
69 void resetWeights();
70 void setWeight(const SetOfVars &e, double w);
71 double weightedDegree(ConstVariablePtr v) const;
72 void write(std::ostream &out) const;
73
74private:
75
76 ConstProblemPtr problem_;
77
78 SetOfVars V_;
79 AdjListType adjList_;
80
81 SetOfSetOfVars E_;
82 SetOfVarsDoubleMap weights_;
83 SetOfVarsDoubleMap originalWeights_;
84
85};
86
87
88typedef Hypergraph* HypergraphPtr;
89typedef const Hypergraph* HypergraphConstPtr;
90
95
96public:
97 typedef enum {
98 relaxInit_Call,
99 relaxNodeInc_Call,
100 getBrMod_Call
101 } HandleCallingFunction;
102
103
104public:
105
108
111
116 std::set<ConstVariablePtr> ivars);
117
118private:
120
121public:
122
123 // base class method
124 virtual void getBranchingCandidates(RelaxationPtr rel,
125 const DoubleVector &x, ModVector &mods,
126 BrVarCandSet &cands, BrCandVector &,
127 bool &is_inf);
128
133 bool isFeasible(ConstSolutionPtr, RelaxationPtr, bool &should_prune,
134 double &inf_meas );
135
136 // Does nothing.
137 void relaxInitFull(RelaxationPtr, SolutionPool *, bool *) { assert(0); } ;
138
139 // Build initial relaxation
140 void relaxInitInc(RelaxationPtr, SolutionPool *, bool *);
141
142 // Does nothing.
143 void relaxNodeFull(NodePtr, RelaxationPtr, bool *) {assert(0); };
144
145 // All changes are in the branches to the relaxation, so this need not do anything
146 void relaxNodeInc(NodePtr n, RelaxationPtr r , bool *is_inf);
147
148
151 SolutionPoolPtr, ModVector &, ModVector &, bool *,
152 SeparationStatus *) {};
153
154 virtual ModificationPtr getBrMod(BrCandPtr , DoubleVector &,
156
157 virtual Branches getBranches(BrCandPtr cand, DoubleVector &x ,
158 RelaxationPtr rel, SolutionPoolPtr s_pool);
159
160 // presolve.
161 virtual SolveStatus presolve(PreModQ *, bool *, Solution **) {return Finished;};
162
163 // Implement Handler::presolveNode()
165 ModVector &)
166 {return false;};
167
168
169 // Write name
170 std::string getName() const { return std::string("Multilinear Term Handler"); }
171
172protected:
173
176
179
180private:
181
182 LPEnginePtr lp_engine_;
183
184 // (Absolute?) error tolerance for branching.
185 double eTol_;
186 LoggerPtr logger_;
187
188 // Parameters for term cover
189 UInt maxGroupSize_;
190 double augmentCoverFactor_;
191 int initialTermCoverSize_;
192
193private:
194 typedef std::set<ConstVariablePtr> SetOfVars;
195 typedef std::set<SetOfVars> SetOfSetOfVars;
196
197 // This contains map in *original* variables (not relaxation variables)
198 typedef std::map<ConstVariablePtr, SetOfVars > TermContainer;
199 TermContainer termsO_;
200
201 TermContainer termsR_;
202
203 // This contains relaxation variable pointers
204 typedef std::vector<SetOfVars> GroupContainer;
205 GroupContainer groups_;
206
207 typedef std::vector<SetOfSetOfVars> PointContainer;
208 PointContainer points_;
209
210 // Stores the lambda variables for group <groupIx,pointIx>
211 // These (of course) will be variables in the relaxation
212 std::vector<std::vector<ConstVariablePtr> > lambdavars_;
213
214#if 0
215 //XXX Don't need these anymore?
216 // Multimap between <x_j, Constraint expressing x_j as convex comb>
217 // The map is between <relaxation var, relaxation constraint>
218 typedef std::multimap<ConstVariablePtr, ConstraintPtr> VariableConstraintMMap;
219 VariableConstraintMMap xConMMap_;
220
221 typedef std::map<ConstConstraintPtr, int> ConstraintIntMap;
222 ConstraintIntMap conGroupMap_;
223
224 // Map between <z_t, Constraint expressing z_t as convex comb of endpoints>
225 // The map is between <relaxation var, relaxation constraint>
226 std::map<ConstVariablePtr, ConstraintPtr> zConMap_;
227#endif
228
229 // We want (int, VarPtr) as key. ConstraintPtr as value
230 typedef std::pair<int, ConstVariablePtr> IntVarPtrPair;
231 typedef std::map<IntVarPtrPair, ConstraintPtr> IntVarPtrPairConstraintMap;
232
233 IntVarPtrPairConstraintMap xConMap_;
234 IntVarPtrPairConstraintMap zConMap_;
235
236
237 // Hypergraph for termcover
238 HypergraphPtr H_;
239
240public:
241 typedef TermContainer::const_iterator ConstTermIterator;
242 typedef TermContainer::iterator TermIterator;
243
244 typedef GroupContainer::const_iterator ConstGroupIterator;
245 typedef GroupContainer::iterator GroupIterator;
246
247
248private:
249
250 // A bunch of helper functions
251 void addEdgeToGroups_(const SetOfVars &e, bool phaseOne);
252 bool allVarsBinary_(const SetOfVars &v) const;
253 bool edgeIsContainedInGroup_(const SetOfVars &e, const SetOfVars &g) const;
254 bool edgeWillFitInGroup_(const SetOfVars &e, const SetOfVars &g) const;
255
256 // Helper function to do branch
257 BranchPtr doBranch_(BranchDirection UpOrDown, ConstVariablePtr v,
258 double bvalue);
259
260 // A greedy dense term covering heuristic
261 void greedyDenseHeuristic_();
262
263 /* This chunk of code adds (or modifies)
264 x_{V_g} = \sum_{k=1}^{2 |V_g|} \lambda_k^g \chi^{k,g} \forall g \in G
265 */
266 void handleXDefConstraints_(RelaxationPtr relaxation, HandleCallingFunction wherefrom, ModVector &mods);
267
268 /* This chunk of code adds
269 z_t = \sum_{k=1}^{2 |V_g|} \lambda_k^g, \Prod_{j \in J_t} \chi_j^{g,k}
270 \forall J_t \subseteq V_g
271 */
272 void handleZDefConstraints_(RelaxationPtr relaxation, HandleCallingFunction wherefrom, ModVector &mods);
273
274 // Helper function to make the groups
275 void makeGroups_();
276
277 // Returns the powerset of s
278 std::set<SetOfVars> powerset_(SetOfVars const &s);
279
280 // Removes subsets that appear in the groups
281 void removeSubsetsFromGroups_();
282
283 // Setup the (initial) weights for weighted term cover approach
284 //void setupWeights_();
285
286 bool varsAreGrouped_(SetOfVars const &termvars) const;
287
288 //WeightContainer::iterator findMaxWeight_();
289
290 bool varIsAtLowerBoundAtPoint_(ConstVariablePtr &x, SetOfVars const &p);
291 bool varIsAtUpperBoundAtPoint_(ConstVariablePtr &x, SetOfVars const &p) {
292 return !(varIsAtLowerBoundAtPoint_(x, p));
293 }
294
295 // A stoopid weighted degree heuristic
296 void weightedDegreeHeuristic_();
297
298};
299typedef MultilinearTermsHandler* MultilinearTermsHandlerPtr;
300typedef const MultilinearTermsHandler* MultilinearConstHandlerPtr;
301
302}
303#endif
304
Define abstract base class for handlers of various kinds.
Declare the class LPEngine for solving LPs and getting solution.
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: Environment.h:28
Base class for handling specific types of constraints or objective.
Definition: Handler.h:49
Definition: MultilinearTermsHandler.h:40
Definition: MultilinearTermsHandler.h:35
Definition: LPEngine.h:29
Definition: Logger.h:37
Definition: Modification.h:29
Definition: MultilinearTermsHandler.h:94
EnvPtr env_
Environment.
Definition: MultilinearTermsHandler.h:175
void separate(ConstSolutionPtr, NodePtr, RelaxationPtr, CutManager *, SolutionPoolPtr, ModVector &, ModVector &, bool *, SeparationStatus *)
Can not return any cuts for this case.
Definition: MultilinearTermsHandler.h:150
virtual SolveStatus presolve(PreModQ *, bool *, Solution **)
Initial presolve.
Definition: MultilinearTermsHandler.h:161
MultilinearTermsHandler(EnvPtr env, ProblemPtr problem)
Default constructor.
Definition: MultilinearTermsHandler.cpp:41
void relaxInitFull(RelaxationPtr, SolutionPool *, bool *)
Create root relaxation if doing full node relaxations.
Definition: MultilinearTermsHandler.h:137
void addConstraint(ConstraintPtr newcon, ConstVariablePtr ovar, std::set< ConstVariablePtr > ivars)
virtual bool presolveNode(RelaxationPtr, NodePtr, SolutionPoolPtr, ModVector &, ModVector &)
Presolve the problem and its relaxation at a node.
Definition: MultilinearTermsHandler.h:164
virtual ~MultilinearTermsHandler()
Destroy.
Definition: MultilinearTermsHandler.h:110
void relaxNodeFull(NodePtr, RelaxationPtr, bool *)
Create a relaxation for a node, building from scratch.
Definition: MultilinearTermsHandler.h:143
bool isFeasible(ConstSolutionPtr, RelaxationPtr, bool &should_prune, double &inf_meas)
Definition: MultilinearTermsHandler.cpp:321
virtual void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &, bool &is_inf)
find branching candidates.
Definition: MultilinearTermsHandler.cpp:98
std::string getName() const
Return the name of the handler.
Definition: MultilinearTermsHandler.h:170
void relaxNodeInc(NodePtr n, RelaxationPtr r, bool *is_inf)
Create an incremental relaxation for a node.
Definition: MultilinearTermsHandler.cpp:471
virtual Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition: MultilinearTermsHandler.cpp:63
ConstProblemPtr problem_
The handler 'handles' constraints of this problem.
Definition: MultilinearTermsHandler.h:178
void relaxInitInc(RelaxationPtr, SolutionPool *, bool *)
Create root relaxation if doing incremental node relaxations.
Definition: MultilinearTermsHandler.cpp:357
virtual ModificationPtr getBrMod(BrCandPtr, DoubleVector &, RelaxationPtr, BranchDirection)
Get the modifcation that creates a given (up or down) branch.
Definition: MultilinearTermsHandler.cpp:170
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

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