Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
CPlanaritySub.h
Go to the documentation of this file.
1
35#pragma once
36
40
42#include <ogdf/lib/abacus/sub.h>
43
44namespace ogdf {
45namespace cluster_planarity {
46
47class CPlanaritySub : public abacus::Sub {
48public:
52
53 virtual ~CPlanaritySub();
54
55 // Creation of a child-node in the Branch&Bound tree according to the
56 // branching rule \p rule
58
59protected:
60 // Checks if the current solution of the LP relaxation is also a feasible solution to the ILP,
61 // i.e. Integer-feasible + satisfying all Kuratowski- and Cut-constraints.
62 virtual bool feasible() override;
63
64 // to trick Sub::solveLp...
65 virtual int makeFeasible() override { return 0; }
66#if 0
67 // to trick Sub::solveLp into returning 2
68 virtual int removeNonLiftableCons() { return 0; }
69#endif
70 int repair();
71
72 virtual int optimize() override {
73 Logger::slout() << "OPTIMIZE BEGIN\tNode=" << this->id() << "\n";
75 Logger::slout() << "OPTIMIZE END\tNode=" << this->id() << " db=" << dualBound()
76 << "\tReturn=" << (ret ? "(error)" : "(ok)") << "\n";
77 return ret;
78 }
79
80 //functions for testing properties of the clustered graph
81
84 bool checkCConnectivity(const GraphCopy& support);
85 bool checkCConnectivityOld(const GraphCopy& support);
86
90 while (v != parent[v]) {
91 v = parent[v];
92 }
93 return v;
94 }
95
96 // Todo: Think about putting this into extended_graph_alg.h to make it
97 // publically available
99
100#if 0
101 // using the below two functions iunstead (and instead of solveLp) we would get a more traditional situation
102 virtual int separate() {
103 return separateRealO(0.001);
104 }
105 virtual int pricing() {
106 return pricingRealO(0.001);
107 }
108#endif
109
116#if 0
117 int pricingReal(double minViolate);
118#endif
119
120 inline int separateRealO(double minViolate) {
121 Logger::slout() << "\tSeparate (minViolate=" << minViolate << ")..";
123 Logger::slout() << "..done: " << r << "\n";
124 return r;
125 }
126#if 0
127 inline int pricingRealO(double minViolate) {
128 Logger::slout() << "\tPricing (minViolate=" << minViolate << ")..";
129 int r = pricingReal(minViolate);
130 master()->m_varsPrice += r;
131 Logger::slout() << "..done: " << r << "\n";
132 return r;
133 }
134#endif
135
136 virtual int separate() override {
138 << "\tReporting Separation: " << ((m_reportCreation > 0) ? m_reportCreation : 0)
139 << "\n";
140 return (m_reportCreation > 0) ? m_reportCreation : 0;
141 }
142
143 virtual int pricing() override {
144 if (inOrigSolveLp) {
145 return 1;
146 }
148 << "\tReporting Prizing: " << ((m_reportCreation < 0) ? -m_reportCreation : 0)
149 << "\n";
150 return (m_reportCreation < 0) ? -m_reportCreation : 0;
151 }
152
153 virtual int solveLp() override;
154
155 // Implementation of virtual function improve() inherited from ABA::SUB.
156 // Invokes the function heuristicImprovePrimalBound().
157 // This function belongs to the ABACUS framework. It is invoked after each separation-step.
158 // Since the heuristic is rather time consuming and because it is not very advantageous
159 // to run the heuristic even if additional constraints have been found, the heuristic
160 // is run "by hand" each time no further constraints could be found, i.e. after having solved
161 // the LP-relaxation optimally.
162 virtual int improve(double& primalValue) override;
163
164 // Two functions inherited from ABACUS and overritten to manipulate the branching behaviour.
166 virtual int selectBranchingVariable(int& variable) override;
167
173
178
179private:
180 CPlanarityMaster* master() { return static_cast<CPlanarityMaster*>(master_); }
181
182 // A flag indicating if constraints have been found in the current separation step.
183 // Is used to check, if the primal heuristic should be run or not.
188
189 // used for the steering in solveLp
195
197 int num = b.size();
198 ArrayBuffer<bool> keep(num, false);
199 for (int i = num; i-- > 0;) {
200 keep.push(true);
201 }
202#ifdef OGDF_DEBUG
203 int r =
204#endif
205 addVars(b, nullptr, &keep);
206 OGDF_ASSERT(r == num);
207 }
208
209 // Computes the support graph for Kuratowski- constraints according to the current LP-solution.
210 // Parameter \p low defines a lower threshold, i.e all edges having value at most \p low
211 // are not added to the support graph.
212 // Parameter \p high defines an upper threshold, i.e all edges having value at least \p high,
213 // are added to the support graph.
214 // Edges having LP-value k that lies between \p low and \p high are added to the support graph
215 // randomly with a probability of k.
216 void kuratowskiSupportGraph(GraphCopy& support, double low, double high);
217
218 // Computes the support graph for Connectivity- constraints according to the current LP-solution.
220
221 // Computes the integer solution induced Graph.
223
224 // Stores information about Kuratowski subdivision
225 // for violation check
226 struct KuraSize {
227 double lhs; //variable value sum
228 double varnum; //number of variables involved
229 };
230
231 // Computes and returns the value of the lefthand side of the Kuratowski constraint
232 // induced by \p it and given support graph \p gc. Returns list of node pairs that
233 // correspond to connection edges in parameter \p subDivOrig.
236
237 // Updates the best known solution according to integer solution of this subproblem.
239
240
241 // The following four functions are used by the primal heuristic.
242
243 int getArrayIndex(double lpValue);
244
247
250
251 // Tries to improve the best primal solution by means of the current fractional LP-solution.
253
256 return addPoolCons(cons, static_cast<CPlanarityMaster*>(master_)->getCutConnPool());
257 }
258
261 return addPoolCons(cons, static_cast<CPlanarityMaster*>(master_)->getCutKuraPool());
262 }
263
264 //tries to regenerate connectivity cuts
265 inline int separateConnPool(double minViolation) {
266 return separateCutPool(static_cast<CPlanarityMaster*>(master_)->getCutConnPool(),
268 }
269
270 //tries to regenerate kuratowski cuts
271 inline int separateKuraPool(double minViolation) {
272 return separateCutPool(static_cast<CPlanarityMaster*>(master_)->getCutKuraPool(),
274 }
275};
276
277}
278}
Declaration and implementation of ArrayBuffer class.
Declaration of the wrapper class of the Boyer-Myrvold planarity test.
Declaration of the CPlanarityMaster class for the Branch&Cut algorithm for c-planarity testing via an...
Abstract base class for all branching rules.
Definition branchrule.h:59
The master of the optimization.
Definition master.h:69
Standard pools.
The subproblem.
Definition sub.h:68
BranchRule * branchRule() const
Returns a pointer to the branching rule of the subproblem.
Definition sub.h:355
int id() const
Returns the identity number of the subproblem.
Definition sub.h:153
Variable * variable(int i) const
Returns a pointer to the i-th active variable.
Definition sub.h:1863
virtual int optimize()
Performs the optimization of the subproblem.
virtual int addCons(ArrayBuffer< Constraint * > &constraints, Pool< Constraint, Variable > *pool=nullptr, ArrayBuffer< bool > *keepInPool=nullptr, ArrayBuffer< double > *rank=nullptr)
Tries to add new constraints to the constraint buffer and a pool.
double dualBound() const
Returns a bound which is "better" than the optimal solution of the subproblem w.r....
Definition sub.h:181
virtual int constraintPoolSeparation(int ranking=0, Pool< Constraint, Variable > *pool=nullptr, double minViolation=0.001)
Tries to generate inactive constraints from a pool.
Master * master_
A pointer to the corresponding master of the optimization.
Definition sub.h:1436
virtual bool removeNonLiftableCons()
virtual int addVars(ArrayBuffer< Variable * > &variables, Pool< Variable, Constraint > *pool=nullptr, ArrayBuffer< bool > *keepInPool=nullptr, ArrayBuffer< double > *rank=nullptr)
Tries to add new variables to the variable buffer and a pool.
const Sub * father() const
Returns a pointer to the father of the subproblem in the branch-and-bound tree.
Definition sub.h:198
An array that keeps track of the number of inserted elements; also usable as an efficient stack.
Definition ArrayBuffer.h:56
INDEX size() const
Returns number of elements in the buffer.
Dynamic arrays indexed with clusters.
Representation of clusters in a clustered graph.
Representation of clustered graphs.
Dynamic arrays indexed with edges.
Definition EdgeArray.h:125
Copies of graphs supporting edge splitting.
Definition GraphCopy.h:254
Doubly linked lists (maintaining the length of the list).
Definition List.h:1435
static std::ostream & slout(Level level=Level::Default)
stream for logging-output (global)
Definition Logger.h:167
Dynamic arrays indexed with nodes.
Definition NodeArray.h:125
Class for the representation of nodes.
Definition Graph_d.h:177
Encapsulates a pointer to an ogdf::SList element.
Definition SList.h:92
Singly linked lists.
Definition SList.h:179
virtual int improve(double &primalValue) override
Can be redefined in order to implement primal heuristics for finding feasible solutions.
CPlanaritySub(abacus::Master *master, abacus::Sub *father, abacus::BranchRule *branchRule, List< abacus::Constraint * > &criticalConstraints)
void childClusterSpanningTree(GraphCopy &GC, List< edgeValue > &clusterEdges, List< NodePair > &MSTEdges)
CPlanaritySub(abacus::Master *master)
ArrayBuffer< abacus::Constraint * > bufferedForCreation
virtual int solveLp() override
Solves the LP-relaxation of the subproblem.
int separateCutPool(abacus::StandardPool< abacus::Constraint, abacus::Variable > *pool, double minViolation)
int addPoolCons(ArrayBuffer< abacus::Constraint * > &cons, abacus::StandardPool< abacus::Constraint, abacus::Variable > *pool)
Adds the given constraints to the given pool.
List< abacus::Constraint * > criticalSinceBranching
void kuratowskiSupportGraph(GraphCopy &support, double low, double high)
virtual int separate() override
Must be redefined in derived classes for the generation of cutting planes.
node getRepresentative(node v, NodeArray< node > &parent)
run through the pointer list parent and return the representative i.e. the node with parent[v] == v
bool checkCConnectivityOld(const GraphCopy &support)
bool checkCConnectivity(const GraphCopy &support)
Checks if the cluster induced graphs and their complement are connected in the current solution.
int addCutCons(ArrayBuffer< abacus::Constraint * > cons)
Adds the given constraints to the connectivity cut pool.
int separateConnPool(double minViolation)
int addKuraCons(ArrayBuffer< abacus::Constraint * > cons)
Adds the given constraints to the planarity cut pool.
virtual int selectBranchingVariableCandidates(ArrayBuffer< int > &candidates) override
Selects candidates for branching variables.
virtual int selectBranchingVariable(int &variable) override
Chooses a branching variable.
void connectivitySupportGraph(GraphCopy &support, EdgeArray< double > &weight)
virtual int optimize() override
Performs the optimization of the subproblem.
int separateReal(double minViolate)
these functions are mainly reporting to let abacus think everthing is normal.
double heuristicImprovePrimalBound(List< NodePair > &connectionEdges)
int clusterBags(ClusterGraph &CG, cluster c)
int separateKuraPool(double minViolation)
void clusterSpanningTree(ClusterGraph &C, cluster c, ClusterArray< List< NodePair > > &treeEdges, ClusterArray< List< edgeValue > > &clusterEdges)
virtual bool feasible() override
Must check the feasibility of a solution of the LP-relaxation.
void intSolutionInducedGraph(GraphCopy &support)
virtual abacus::Sub * generateSon(abacus::BranchRule *rule) override
Returns a pointer to an object of a problem specific subproblem, which is generated from the current ...
void myAddVars(ArrayBuffer< abacus::Variable * > &b)
virtual int makeFeasible() override
The default implementation of makeFeasible()does nothing.
KuraSize subdivisionLefthandSide(SListConstIterator< KuratowskiWrapper > it, GraphCopy *gc, SListPure< NodePair > &subDivOrig)
virtual int pricing() override
Should generate inactive variables which do not price out correctly.
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition basic.h:41
int r[]
static MultilevelBuilder * getDoubleFactoredZeroAdjustedMerger()
The namespace for all OGDF objects.
standard pool.