Loading [MathJax]/extensions/tex2jax.js

Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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.