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);
463 void makeGroupedConvexHull(RelaxationPtr relaxation, bool &isInfeasible,
464 std::vector<bool> & c_list, int groupStrategy);
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);