13#ifndef MINOTAURMULTILINEARHANDLER_H
14#define MINOTAURMULTILINEARHANDLER_H
23class PolynomialFunction;
24class QuadraticFunction;
26typedef PolynomialFunction* PolyFunPtr;
27typedef QuadraticFunction* QuadraticFunctionPtr;
48 const DoubleVector &x, ModVector &mods,
50 BrCandVector &gencands,
bool &is_inf );
65 void relaxInitInc(RelaxationPtr,
bool *) {};
80 {
return rev_mlterms_; }
85 std::map <ConstVariablePtr, std::vector<ConstVariablePtr> >
getMlterms()
91 std::map <ConstVariablePtr, UInt>
getMaxPow() {
return max_pow_; }
96 std::map <ConstVariablePtr, ConstVariablePair>
getBlterms() {
return blterms_; }
101 std::map <ConstVariablePair, ConstVariablePtr>
getRevBlterms() {
return rev_blterms_; }
111 std::map <ConstVariablePtr, ConstVariablePair>
getSqterms() {
return sqterms_; }
116 std::map <ConstVariablePair, ConstVariablePtr>
getRevSqterms() {
return rev_sqterms_; }
121 std::vector<std::vector<ConstVariablePtr> >
getGroups() {
return groups_; }
126 std::vector<std::vector<ConstVariablePtr> >
getAllLambdas() {
return all_lambdas_; }
143 {
return newCopyVariables_; }
155 {
return rev_blterms_; }
198 int linearizationCnt_;
208 std::map <ConstVariablePtr, UInt> max_pow_;
209 std::map <ConstVariablePtr, UInt>::iterator max_pow_it_;
214 std::map <ConstVariablePtr, ConstVariablePtr> oVars_;
217 std::map <ConstVariablePtr, ConstVariablePtr> rev_oVars_;
220 std::map <ConstVariablePtr, ConstVariablePair> sqterms_;
223 std::map <ConstVariablePair, ConstVariablePtr> rev_sqterms_;
227 std::map <ConstVariablePtr, ConstVariablePair> blterms_cons_;
228 std::map <ConstVariablePair, std::vector<double> > blterms_cons_coef_;
231 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_cons_;
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_;
239 std::map <std::vector<ConstVariablePtr>,
ConstVariablePtr > rev_mlterms_cons_;
245 std::map <ConstVariablePtr, ConstVariablePair> blterms_obj_;
246 std::map <ConstVariablePair, std::vector<double> > blterms_obj_coef_;
249 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_obj_;
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_;
257 std::map <std::vector<ConstVariablePtr>,
ConstVariablePtr > rev_mlterms_obj_;
262 std::map <ConstVariablePtr, ConstVariablePair> blterms_;
263 std::map <ConstVariablePair, std::vector<double> > blterms_coef_;
266 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms_;
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_;
277 std::map <VarIntMap, ConstVariablePtr> monomial_terms_;
278 std::map <VarIntMap, ConstVariablePtr>::iterator monomial_terms_it_;
281 std::vector<std::vector<ConstVariablePtr> > groups_;
284 std::vector<std::vector<ConstVariablePtr> > all_lambdas_;
287 std::map<ConstVariablePtr, std::vector<ConstVariablePtr> > newCopyVariables_;
288 std::map<ConstVariablePtr, std::vector<ConstVariablePtr> >::iterator newCopyVariables_it_;
292 void clearAllContainers();
296 void makeMcCormick(
RelaxationPtr relaxation,
bool &isInfeasible);
299 void makeGroupedConvexHull(
RelaxationPtr relaxation,
bool &isInfeasible,
300 int groupStrategy,
bool objModified);
303 void makeGroups(std::map <ConstVariablePtr, ConstVariablePair> blterms,
304 std::map <ConstVariablePair, ConstVariablePtr> rev_blterms,
305 std::map <ConstVariablePair, std::vector<double> > blterms_coef,
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,
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,
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,
326 void getMultilinearTerms(std::map <ConstVariablePtr, ConstVariablePair> blterms,
329 std::vector<std::vector<ConstVariablePtr> > &terms);
334 void getMultilinearTermsCoef(std::map <ConstVariablePair, double> blterms_coef,
335 std::vector<std::vector<ConstVariablePtr> > terms,
336 std::vector<double> &termsCoeff);
342 void getMultilinearVariables(std::map <ConstVariablePtr, ConstVariablePair> blterms,
344 std::vector<ConstVariablePtr> &mlVars);
356 void groupUsingIntersection(
UInt gs,
double rho,
357 std::vector<std::vector<ConstVariablePtr> > terms,
358 std::vector <std::vector<ConstVariablePtr> > &groups);
363 void groupUsingIntersection2(
UInt gs,
364 std::vector<std::vector<ConstVariablePtr> > terms,
365 std::vector <std::vector<ConstVariablePtr> > &groups);
367 void groupTermByTerm(std::map <ConstVariablePtr, ConstVariablePair> blterms,
369 std::vector <std::vector<ConstVariablePtr> > &groups);
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);
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,
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);
394 void findSubgraphDensity(std::vector<std::vector<ConstVariablePtr> > terms,
395 double** term_var_matrix,
396 std::vector<ConstVariablePtr> nodes,
397 std::vector<int> nodesInd,
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,
409 void findGraphComponents(
int varsCnt,
411 double** term_var_matrix,
412 std::vector<std::vector<int> > &components);
414 void findGroupDensity(std::vector<std::vector<ConstVariablePtr> > terms,
415 std::vector <std::vector<ConstVariablePtr> > groups,
416 std::vector <int> &density);
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);
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);
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);
439 void termsAppearKtimes(std::vector<std::vector<ConstVariablePtr> > terms,
440 std::vector <double> termsCoef,
441 std::vector <std::vector<ConstVariablePtr> > groups,
443 std::vector<std::vector<ConstVariablePtr> > &termsk,
444 std::vector <double> &termsKCoef,
445 std::vector<int> &termRep);
450 void countTermsAppearance(std::vector<std::vector<ConstVariablePtr> > terms,
451 std::vector <std::vector<ConstVariablePtr> > groups,
452 std::vector<int> &termRep);
468 void allExtreme(std::vector<int> &S, std::vector<double> &lb,
469 std::vector<double> &ub,
470 std::vector<std::vector<double> > &E);
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);
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: 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
PolynomialFunction represents functions of the form , where is a MonomialFunction.
Definition: PolynomialFunction.h:160
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