Minotaur 0.4.1
Docs for developers
MultilinearHandler.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
13#ifndef MINOTAURMULTILINEARHANDLER_H
14#define MINOTAURMULTILINEARHANDLER_H
15
16#include "Handler.h"
17#include "LPEngine.h"
18#include "Types.h"
19
20namespace Minotaur {
21
22class Function;
23class PolynomialFunction;
24class QuadraticFunction;
25class Problem;
26typedef PolynomialFunction* PolyFunPtr;
27typedef QuadraticFunction* QuadraticFunctionPtr;
28
31
32public:
33
36
38 virtual ~MultilinearHandler() {};
39
40
41 bool findOriginalVariable(ConstVariablePtr rv, ConstVariablePtr &ov) const;
42
47 virtual void getBranchingCandidates(RelaxationPtr rel,
48 const DoubleVector &x, ModVector &mods,
49 BrVarCandSet &cands,
50 BrCandVector &gencands, bool &is_inf );
51
56 bool isFeasible(ConstSolutionPtr, RelaxationPtr, bool &should_prune,
57 double &inf_meas);
58
59 void relax(RelaxationPtr relaxation, bool & isInfeasible);
60
61 // Does nothing.
62 void relaxInitFull(RelaxationPtr, bool *) {} ;
63
64 // Does nothing.
65 void relaxInitInc(RelaxationPtr, bool *) {};
66
67 // Does nothing.
69
70 // Does nothing.
72
73 void relaxNode(NodePtr node, RelaxationPtr relaxation, bool & isInfeasible);
74
75
79 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr > getRevMlterms()
80 {return rev_mlterms_; }
81
85 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > getMlterms()
86 {return mlterms_; }
87
91 std::map <ConstVariablePtr, UInt> getMaxPow() {return max_pow_; }
92
96 std::map <ConstVariablePtr, ConstVariablePair> getBlterms() {return blterms_; }
97
101 std::map <ConstVariablePair, ConstVariablePtr> getRevBlterms() {return rev_blterms_; }
102
106 std::map <VarIntMap, ConstVariablePtr> getMonomialterms() {return monomial_terms_; }
107
111 std::map <ConstVariablePtr, ConstVariablePair> getSqterms() {return sqterms_; }
112
116 std::map <ConstVariablePair, ConstVariablePtr> getRevSqterms() {return rev_sqterms_; }
117
121 std::vector<std::vector<ConstVariablePtr> > getGroups() {return groups_; }
122
126 std::vector<std::vector<ConstVariablePtr> > getAllLambdas() {return all_lambdas_; }
127
131 std::map <ConstVariablePtr, ConstVariablePtr> getOriginalVariablesMap() {return oVars_; }
132
136 std::map <ConstVariablePtr, ConstVariablePtr> getRevOriginalVariablesMap() {return rev_oVars_; }
137
142 std::map<ConstVariablePtr, std::vector<ConstVariablePtr> > getNewCopyVariables()
143 {return newCopyVariables_; }
144
148 std::map <VarIntMap, ConstVariablePtr> getMonomialTerms() {return monomial_terms_; }
149
154 std::map <ConstVariablePair, ConstVariablePtr> getRevBilinearTerms()
155 {return rev_blterms_; }
156
157
160 SolutionPoolPtr, bool *, SeparationStatus *) {};
161
162 virtual ModificationPtr getBrMod(BrCandPtr , DoubleVector &,
164
165 virtual Branches getBranches(BrCandPtr cand, DoubleVector &x ,
166 RelaxationPtr rel, SolutionPoolPtr s_pool);
167
168 // presolve.
169 virtual SolveStatus presolve(PreModQ *, bool *changed, Solution **) {return Finished;};
170
171 // Implement Handler::presolveNode()
173 ModVector &)
174 {return false;};
175
176
177 // Write name
178 std::string getName() const;
179
180protected:
181
184
185 // /**
186 // The problem for which the handler was created.
187 //XXX This should be const!
188 // */
189 ConstProblemPtr problem_;
190
191 ProblemPtr workingProblem_;
192
193
194
195private:
196
197 LPEnginePtr lp_engine_;
198 int linearizationCnt_;
199
200 // Whether the objective was nonlinear and was moved to the constraints or not
201 bool objModified_;
202
203 // (Absolute?) error tolerance for branching.
204 double eTol_;
205
206 // max_pow maps each variable with its highest power that appears
207 // in the polynomial or quadratic part
208 std::map <ConstVariablePtr, UInt> max_pow_;
209 std::map <ConstVariablePtr, UInt>::iterator max_pow_it_;
210
211 LoggerPtr logger_;
212
213 // The map for the original variables and their copy in the relaxation (x, newVar)
214 std::map <ConstVariablePtr, ConstVariablePtr> oVars_;
215
216 // The map for the original variables and their copy in the relaxation -- reverse map (newVar, x)
217 std::map <ConstVariablePtr, ConstVariablePtr> rev_oVars_;
218
219 // The square terms <x1,(y,x_1)>
220 std::map <ConstVariablePtr, ConstVariablePair> sqterms_;
221
222 // The square terms -- reverse map
223 std::map <ConstVariablePair, ConstVariablePtr> rev_sqterms_;
224
225 // ******
226 // The bilinear terms of the original constraints
227 std::map <ConstVariablePtr, ConstVariablePair> blterms_cons_;
228 std::map <ConstVariablePair, std::vector<double> > blterms_cons_coef_;
229
230 // The bilinear terms of the original constraints -- reverse map
231 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_cons_;
232
233 // The multilinear terms of the original constraints
234 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms_cons_;
235 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> >::iterator mlterms_cons_it_;
236 std::map <std::vector<ConstVariablePtr>, std::vector<double> > mlterms_cons_coef_;
237
238 // The multilinear terms of the original constraints -- reverse map
239 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr > rev_mlterms_cons_;
240 // ******
241
242
243 // ******
244 // The bilinear terms of the original objective
245 std::map <ConstVariablePtr, ConstVariablePair> blterms_obj_;
246 std::map <ConstVariablePair, std::vector<double> > blterms_obj_coef_;
247
248 // The bilinear terms of the original constraints -- reverse map
249 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_obj_;
250
251 // The multilinear terms of the original constraints
252 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms_obj_;
253 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> >::iterator mlterms_obj_it_;
254 std::map <std::vector<ConstVariablePtr>, std::vector<double> > mlterms_obj_coef_;
255
256 // The multilinear terms of the original constraints -- reverse map
257 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr > rev_mlterms_obj_;
258 // ******
259
260
261 // All the bilinear terms
262 std::map <ConstVariablePtr, ConstVariablePair> blterms_;
263 std::map <ConstVariablePair, std::vector<double> > blterms_coef_;
264
265 // All the bilinear terms -- reverse map
266 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_;
267
268 // All the multilinear terms
269 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms_;
270 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> >::iterator mlterms_it_;
271 std::map <std::vector<ConstVariablePtr>, std::vector<double> > mlterms_coef_;
272
273 // All the multilinear terms -- reverse map
274 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr > rev_mlterms_;
275
276 // The monomial terms
277 std::map <VarIntMap, ConstVariablePtr> monomial_terms_;
278 std::map <VarIntMap, ConstVariablePtr>::iterator monomial_terms_it_;
279
280 // The groups
281 std::vector<std::vector<ConstVariablePtr> > groups_;
282
283 // All the lambda variables
284 std::vector<std::vector<ConstVariablePtr> > all_lambdas_;
285
286 // The copy variables for the variables with exponent
287 std::map<ConstVariablePtr, std::vector<ConstVariablePtr> > newCopyVariables_;
288 std::map<ConstVariablePtr, std::vector<ConstVariablePtr> >::iterator newCopyVariables_it_;
289
290
292 void clearAllContainers();
293
295
296 void makeMcCormick(RelaxationPtr relaxation, bool &isInfeasible);
297
299 void makeGroupedConvexHull(RelaxationPtr relaxation, bool &isInfeasible,
300 int groupStrategy, bool objModified);
301
303 void makeGroups(std::map <ConstVariablePtr, ConstVariablePair> blterms,
304 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms,
305 std::map <ConstVariablePair, std::vector<double> > blterms_coef,
306 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms,
307 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr> rev_mlterms,
308 std::map <std::vector<ConstVariablePtr>, std::vector<double> > mlterms_coef,
309 std::map <ConstVariablePtr, ConstVariablePair> blterms_obj,
310 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_obj,
311 std::map <ConstVariablePair, std::vector<double> > blterms_obj_coef,
312 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms_obj,
313 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr> rev_mlterms_obj,
314 std::map <std::vector<ConstVariablePtr>, std::vector<double> > mlterms_obj_coef,
315 std::map <ConstVariablePtr, ConstVariablePair> blterms_cons,
316 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_cons,
317 std::map <ConstVariablePair, std::vector<double> > blterms_cons_coef,
318 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms_cons,
319 std::map <std::vector<ConstVariablePtr>, ConstVariablePtr> rev_mlterms_cons,
320 std::map <std::vector<ConstVariablePtr>, std::vector<double> > mlterms_cons_coef,
321 std::vector <std::vector<ConstVariablePtr> > &groups,
322 int groupStrategy);
323
324
326 void getMultilinearTerms(std::map <ConstVariablePtr, ConstVariablePair> blterms,
327 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms,
328 UInt maxGroupSize,
329 std::vector<std::vector<ConstVariablePtr> > &terms);
330
334 void getMultilinearTermsCoef(std::map <ConstVariablePair, double> blterms_coef,
335 std::vector<std::vector<ConstVariablePtr> > terms,
336 std::vector<double> &termsCoeff);
337
338
342 void getMultilinearVariables(std::map <ConstVariablePtr, ConstVariablePair> blterms,
343 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms,
344 std::vector<ConstVariablePtr> &mlVars);
345
356 void groupUsingIntersection(UInt gs, double rho,
357 std::vector<std::vector<ConstVariablePtr> > terms,
358 std::vector <std::vector<ConstVariablePtr> > &groups);
359
363 void groupUsingIntersection2(UInt gs,
364 std::vector<std::vector<ConstVariablePtr> > terms,
365 std::vector <std::vector<ConstVariablePtr> > &groups);
366
367 void groupTermByTerm(std::map <ConstVariablePtr, ConstVariablePair> blterms,
368 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> > mlterms,
369 std::vector <std::vector<ConstVariablePtr> > &groups);
370
371 void groupUsingDensest(UInt gs,
372 std::map <ConstVariablePair, std::vector<double> > bl_coef,
373 std::map <std::vector<ConstVariablePtr>, std::vector<double> > ml_coef,
374 std::vector <ConstVariablePtr> vars,
375 std::vector <std::vector<ConstVariablePtr> > &groups);
376
377 void groupUsingDensest2ND(UInt gs,
378 std::map <ConstVariablePair, std::vector<double> > bl_coef,
379 std::map <std::vector<ConstVariablePtr>, std::vector<double> > ml_coef,
380 std::vector <ConstVariablePtr> vars,
381 std::vector <std::vector<ConstVariablePtr> > &groups,
382 UInt maxGroupsCnt);
383
388 void groupUsingCoef(UInt gs,
389 std::map <ConstVariablePair, std::vector<double> > bl_coef,
390 std::map <std::vector<ConstVariablePtr>, std::vector<double> > ml_coef,
391 std::vector <ConstVariablePtr> graphVars,
392 std::vector <std::vector<ConstVariablePtr> > &groups);
393
394 void findSubgraphDensity(std::vector<std::vector<ConstVariablePtr> > terms,
395 double** term_var_matrix,
396 std::vector<ConstVariablePtr> nodes,
397 std::vector<int> nodesInd,
398 double &density);
399
400 void findDensestSubgraph(UInt gs,
401 std::vector<ConstVariablePtr> vars,
402 std::vector<std::vector<ConstVariablePtr> > terms,
403 double** term_var_matrix,
404 std::vector<int> component,
405 std::vector<ConstVariablePtr> &densest,
406 std::vector<int> &densestInd,
407 bool &isCompEmpty);
408
409 void findGraphComponents(int varsCnt,
410 int termsCnt,
411 double** term_var_matrix,
412 std::vector<std::vector<int> > &components);
413
414 void findGroupDensity(std::vector<std::vector<ConstVariablePtr> > terms,
415 std::vector <std::vector<ConstVariablePtr> > groups,
416 std::vector <int> &density);
417
418 void findGroupCoef(std::vector<std::vector<ConstVariablePtr> > terms,
419 std::vector <double> termsCoef,
420 std::vector <std::vector<ConstVariablePtr> > groups,
421 std::vector <double> &sumCoef);
422
423 void removeSubgraphEdges(int termsCnt,
424 double** &term_var_matrix,
425 std::vector<std::vector<ConstVariablePtr> > terms,
426 std::vector<ConstVariablePtr> nodes,
427 std::vector<int> nodesInd);
428
429 void reduceSubgraphEdges(int termsCnt,
430 double** &term_var_matrix,
431 std::vector<std::vector<ConstVariablePtr> > terms,
432 std::vector<ConstVariablePtr> nodes,
433 std::vector<int> nodesInd);
434
439 void termsAppearKtimes(std::vector<std::vector<ConstVariablePtr> > terms,
440 std::vector <double> termsCoef,
441 std::vector <std::vector<ConstVariablePtr> > groups,
442 int k,
443 std::vector<std::vector<ConstVariablePtr> > &termsk,
444 std::vector <double> &termsKCoef,
445 std::vector<int> &termRep);
446
450 void countTermsAppearance(std::vector<std::vector<ConstVariablePtr> > terms,
451 std::vector <std::vector<ConstVariablePtr> > groups,
452 std::vector<int> &termRep);
453
458 void makeBinaryVariablesPowers1(FunctionPtr &f, PolyFunPtr &p,
460
461 /*
463 void makeGroupedConvexHull(RelaxationPtr relaxation, bool &isInfeasible,
464 std::vector<bool> & c_list, int groupStrategy);
465 */
466
468 void allExtreme(std::vector<int> &S, std::vector<double> &lb,
469 std::vector<double> &ub,
470 std::vector<std::vector<double> > &E);
471
473 void visit(std::vector<int> &S, std::vector<double> &lb,
474 std::vector<double> &ub, UInt ix, std::vector<double> &val,
475 std::vector<std::vector<double> > &E);
476
477
478};
481}
482#endif
483
Define abstract base class for handlers of various kinds.
Declare the class LPEngine for solving LPs and getting solution.
Declare important 'types' used in Minotaur.
Base class for describing candidates for branching on a node in branch-and-bound.
Definition: BrCand.h:32
Abstract base class to manage cuts in the relaxation.
Definition: CutManager.h:42
Definition: Environment.h:28
Definition: Function.h:37
Base class for handling specific types of constraints or objective.
Definition: Handler.h:49
Definition: LPEngine.h:29
The base class linear function is of the form c'x.
Definition: LinearFunction.h:31
Definition: Logger.h:37
Definition: Modification.h:29
A MultilinearHandler handles terms like .
Definition: MultilinearHandler.h:30
virtual void getBranchingCandidates(RelaxationPtr rel, const DoubleVector &x, ModVector &mods, BrVarCandSet &cands, BrCandVector &gencands, bool &is_inf)
Definition: MultilinearHandler.cpp:174
std::map< ConstVariablePair, ConstVariablePtr > getRevBlterms()
Definition: MultilinearHandler.h:101
std::map< ConstVariablePtr, ConstVariablePair > getSqterms()
Definition: MultilinearHandler.h:111
virtual SolveStatus presolve(PreModQ *, bool *changed, Solution **)
Initial presolve.
Definition: MultilinearHandler.h:169
std::map< ConstVariablePtr, ConstVariablePtr > getOriginalVariablesMap()
Definition: MultilinearHandler.h:131
std::vector< std::vector< ConstVariablePtr > > getAllLambdas()
Definition: MultilinearHandler.h:126
std::map< ConstVariablePtr, std::vector< ConstVariablePtr > > getMlterms()
Definition: MultilinearHandler.h:85
void separate(ConstSolutionPtr, NodePtr, RelaxationPtr, CutManager *, SolutionPoolPtr, bool *, SeparationStatus *)
Can not return any cuts for this case.
Definition: MultilinearHandler.h:159
std::map< ConstVariablePtr, std::vector< ConstVariablePtr > > getNewCopyVariables()
Definition: MultilinearHandler.h:142
std::map< ConstVariablePair, ConstVariablePtr > getRevSqterms()
Definition: MultilinearHandler.h:116
MultilinearHandler(EnvPtr env, ProblemPtr problem)
Default constructor.
Definition: MultilinearHandler.cpp:47
void relaxNodeFull(NodePtr, RelaxationPtr, bool *)
Create a relaxation for a node, building from scratch.
Definition: MultilinearHandler.h:68
std::map< VarIntMap, ConstVariablePtr > getMonomialterms()
Definition: MultilinearHandler.h:106
std::string getName() const
Return the name of the handler.
Definition: MultilinearHandler.cpp:2806
virtual ModificationPtr getBrMod(BrCandPtr, DoubleVector &, RelaxationPtr, BranchDirection)
Get the modifcation that creates a given (up or down) branch.
Definition: MultilinearHandler.cpp:249
std::map< ConstVariablePtr, ConstVariablePtr > getRevOriginalVariablesMap()
Definition: MultilinearHandler.h:136
bool isFeasible(ConstSolutionPtr, RelaxationPtr, bool &should_prune, double &inf_meas)
Definition: MultilinearHandler.cpp:258
virtual ~MultilinearHandler()
Destroy.
Definition: MultilinearHandler.h:38
std::map< ConstVariablePtr, UInt > getMaxPow()
Definition: MultilinearHandler.h:91
std::map< ConstVariablePtr, ConstVariablePair > getBlterms()
Definition: MultilinearHandler.h:96
virtual bool presolveNode(RelaxationPtr, NodePtr, SolutionPoolPtr, ModVector &, ModVector &)
Presolve the problem and its relaxation at a node.
Definition: MultilinearHandler.h:172
virtual Branches getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr rel, SolutionPoolPtr s_pool)
Return branches for branching.
Definition: MultilinearHandler.cpp:119
std::vector< std::vector< ConstVariablePtr > > getGroups()
Definition: MultilinearHandler.h:121
EnvPtr env_
Environment.
Definition: MultilinearHandler.h:183
std::map< ConstVariablePair, ConstVariablePtr > getRevBilinearTerms()
Definition: MultilinearHandler.h:154
std::map< std::vector< ConstVariablePtr >, ConstVariablePtr > getRevMlterms()
Definition: MultilinearHandler.h:79
void relaxNodeInc(NodePtr, RelaxationPtr, bool *)
Create an incremental relaxation for a node.
Definition: MultilinearHandler.h:71
std::map< VarIntMap, ConstVariablePtr > getMonomialTerms()
Definition: MultilinearHandler.h:148
Definition: Node.h:54
PolynomialFunction represents functions of the form , where is a MonomialFunction.
Definition: PolynomialFunction.h:160
Definition: Problem.h:74
Definition: QuadraticFunction.h:38
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