12#ifndef MINOTAURMULTILINEARTERMSHANDLER_H
13#define MINOTAURMULTILINEARTERMSHANDLER_H
25typedef std::set<ConstVariablePtr> SetOfVars;
26typedef std::set<SetOfVars> SetOfSetOfVars;
42 bool operator()(
const SetOfVars &lhs,
const SetOfVars &rhs )
const
44 return lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
48 typedef std::map<SetOfVars, double, CompareSetsOfVars> SetOfVarsDoubleMap;
49 typedef std::list<SetOfVars> ListOfSetOfVars;
50 typedef std::map<ConstVariablePtr, ListOfSetOfVars> AdjListType;
56 void adjustEdgeWeightsBetween(
const VariablePtr v,
const SetOfVars &g,
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;
64 VariablePtr maxWeightedDegreeVertex(
bool &maxWeightPositive)
const;
65 int numEdges()
const {
return E_.size(); }
66 int numVertices()
const {
return V_.size(); }
68 SetOfVars randomEdge(
bool &maxWeightPositive);
70 void setWeight(
const SetOfVars &e,
double w);
71 double weightedDegree(ConstVariablePtr v)
const;
72 void write(std::ostream &out)
const;
76 ConstProblemPtr problem_;
82 SetOfVarsDoubleMap weights_;
83 SetOfVarsDoubleMap originalWeights_;
88typedef Hypergraph* HypergraphPtr;
89typedef const Hypergraph* HypergraphConstPtr;
101 } HandleCallingFunction;
116 std::set<ConstVariablePtr> ivars);
125 const DoubleVector &x, ModVector &mods,
126 BrVarCandSet &cands, BrCandVector &,
170 std::string
getName()
const {
return std::string(
"Multilinear Term Handler"); }
190 double augmentCoverFactor_;
191 int initialTermCoverSize_;
194 typedef std::set<ConstVariablePtr> SetOfVars;
195 typedef std::set<SetOfVars> SetOfSetOfVars;
198 typedef std::map<ConstVariablePtr, SetOfVars > TermContainer;
199 TermContainer termsO_;
201 TermContainer termsR_;
204 typedef std::vector<SetOfVars> GroupContainer;
205 GroupContainer groups_;
207 typedef std::vector<SetOfSetOfVars> PointContainer;
208 PointContainer points_;
212 std::vector<std::vector<ConstVariablePtr> > lambdavars_;
218 typedef std::multimap<ConstVariablePtr, ConstraintPtr> VariableConstraintMMap;
219 VariableConstraintMMap xConMMap_;
221 typedef std::map<ConstConstraintPtr, int> ConstraintIntMap;
222 ConstraintIntMap conGroupMap_;
226 std::map<ConstVariablePtr, ConstraintPtr> zConMap_;
230 typedef std::pair<int, ConstVariablePtr> IntVarPtrPair;
231 typedef std::map<IntVarPtrPair, ConstraintPtr> IntVarPtrPairConstraintMap;
233 IntVarPtrPairConstraintMap xConMap_;
234 IntVarPtrPairConstraintMap zConMap_;
241 typedef TermContainer::const_iterator ConstTermIterator;
242 typedef TermContainer::iterator TermIterator;
244 typedef GroupContainer::const_iterator ConstGroupIterator;
245 typedef GroupContainer::iterator GroupIterator;
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;
261 void greedyDenseHeuristic_();
266 void handleXDefConstraints_(
RelaxationPtr relaxation, HandleCallingFunction wherefrom, ModVector &mods);
272 void handleZDefConstraints_(
RelaxationPtr relaxation, HandleCallingFunction wherefrom, ModVector &mods);
278 std::set<SetOfVars> powerset_(SetOfVars
const &s);
281 void removeSubsetsFromGroups_();
286 bool varsAreGrouped_(SetOfVars
const &termvars)
const;
292 return !(varIsAtLowerBoundAtPoint_(x, p));
296 void weightedDegreeHeuristic_();
299typedef MultilinearTermsHandler* MultilinearTermsHandlerPtr;
300typedef const MultilinearTermsHandler* MultilinearConstHandlerPtr;
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: 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: 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