Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MaxCPlanarSub.h
Go to the documentation of this file.
1 
35 #pragma once
36 
37 #include <ogdf/basic/ArrayBuffer.h>
40 
42 #include <ogdf/lib/abacus/sub.h>
43 
44 namespace ogdf {
45 namespace cluster_planarity {
46 
47 class MaxCPlanarSub : public abacus::Sub {
48 public:
51  List<abacus::Constraint*>& criticalConstraints);
52 
53  virtual ~MaxCPlanarSub();
54 
55  // Creation of a child-node in the Branch&Bound tree according to the
56  // branching rule #rule
57  virtual abacus::Sub* generateSon(abacus::BranchRule* rule) override;
58 
59 
60 protected:
61  // Checks if the current solution of the LP relaxation is also a feasible solution to the ILP,
62  // i.e. Integer-feasible + satisfying all Kuratowski- and Cut-constraints.
63  virtual bool feasible() override;
64 
65  // to trick Sub::solveLp...
66  virtual int makeFeasible() override { return 0; }
67 #if 0
68  // to trick Sub::solveLp into returning 2
69  virtual int removeNonLiftableCons() { return 0; }
70 #endif
71  int repair();
72 
73  virtual int optimize() override {
74  Logger::slout() << "OPTIMIZE BEGIN\tNode=" << this->id() << "\n";
75  int ret = abacus::Sub::optimize();
76  Logger::slout() << "OPTIMIZE END\tNode=" << this->id() << " db=" << dualBound()
77  << "\tReturn=" << (ret ? "(error)" : "(ok)") << "\n";
78  return ret;
79  }
80 
81  //functions for testing properties of the clustered graph
82 
85  bool checkCConnectivity(const GraphCopy& support);
86  bool checkCConnectivityOld(const GraphCopy& support);
87 
91  while (v != parent[v]) {
92  v = parent[v];
93  }
94  return v;
95  }
96 
97  // Todo: Think about putting this into extended_graph_alg.h to make it
98  // publically available
99  int clusterBags(ClusterGraph& CG, cluster c);
100 
101 #if 0
102  // using the below two functions iunstead (and instead of solveLp) we would get a more traditional situation
103  virtual int separate() {
104  return separateRealO(0.001);
105  }
106  virtual int pricing() {
107  return pricingRealO(0.001);
108  }
109 #endif
110 
116  int separateReal(double minViolate);
117 #if 0
118  int pricingReal(double minViolate);
119 #endif
120 
121  inline int separateRealO(double minViolate) {
122  Logger::slout() << "\tSeparate (minViolate=" << minViolate << ")..";
123  int r = separateReal(minViolate);
124  Logger::slout() << "..done: " << r << "\n";
125  return r;
126  }
127 #if 0
128  inline int pricingRealO(double minViolate) {
129  Logger::slout() << "\tPricing (minViolate=" << minViolate << ")..";
130  int r = pricingReal(minViolate);
131  master()->m_varsPrice += r;
132  Logger::slout() << "..done: " << r << "\n";
133  return r;
134  }
135 #endif
136 
137  virtual int separate() override {
138  Logger::slout()
139  << "\tReporting Separation: " << ((m_reportCreation > 0) ? m_reportCreation : 0)
140  << "\n";
141  return (m_reportCreation > 0) ? m_reportCreation : 0;
142  }
143 
144  virtual int pricing() override {
145  if (inOrigSolveLp) {
146  return 1;
147  }
148  Logger::slout()
149  << "\tReporting Prizing: " << ((m_reportCreation < 0) ? -m_reportCreation : 0)
150  << "\n";
151  return (m_reportCreation < 0) ? -m_reportCreation : 0;
152  }
153 
154  virtual int solveLp() override;
155 
156  // Implementation of virtual function improve() inherited from ABA::SUB.
157  // Invokes the function heuristicImprovePrimalBound().
158  // Tthis function belongs to the ABACUS framework. It is invoked after each separation-step.
159  // Since the heuristic is rather time consuming and because it is not very advantageous
160  // to run the heuristic even if additional constraints have been found, the heuristic
161  // is run "by hand" each time no further constraints coud be found, i.e. after having solved
162  // the LP-relaxation optimally.
163  virtual int improve(double& primalValue) override;
164 
165  // Two functions inherited from ABACUS and overritten to manipulate the branching behaviour.
166  virtual int selectBranchingVariableCandidates(ArrayBuffer<int>& candidates) override;
167  virtual int selectBranchingVariable(int& variable) override;
168 
172  return (master()->useDefaultCutPool()) ? addCons(cons) : addCons(cons, pool);
173  }
174 
176  double minViolation) {
177  return (master()->useDefaultCutPool()) ? 0 : constraintPoolSeparation(0, pool, minViolation);
178  }
179 
180 private:
181  MaxCPlanarMaster* master() const { return static_cast<MaxCPlanarMaster*>(master_); }
182 
183  // A flag indicating if constraints have been found in the current separation step.
184  // Is used to check, if the primal heuristic should be run or not.
189 
190  // used for the steering in solveLp
196 
198  int num = b.size();
199  ArrayBuffer<bool> keep(num, false);
200  for (int i = num; i-- > 0;) {
201  keep.push(true);
202  }
203 #ifdef OGDF_DEBUG
204  int r =
205 #endif
206  addVars(b, nullptr, &keep);
207  OGDF_ASSERT(r == num);
208  }
209 
210  // Computes the support graph for Kuratowski- constraints according to the current LP-solution.
211  // Parameter \p low defines a lower threshold, i.e all edges having value at most \p low
212  // are not added to the support graph.
213  // Parameter \p high defines an upper threshold, i.e all edges having value at least \p high,
214  // are added to the support graph.
215  // Edges having LP-value k that lies between \p low and \p high are added to the support graph
216  // randomly with a probability of k.
217  void kuratowskiSupportGraph(GraphCopy& support, double low, double high);
218 
219  // Computes the support graph for Connectivity- constraints according to the current LP-solution.
220  void connectivitySupportGraph(GraphCopy& support, EdgeArray<double>& weight);
221 
222  // Computes the integer solution induced Graph.
223  void intSolutionInducedGraph(GraphCopy& support);
224 
225  // Computes and returns the value of the lefthand side of the Kuratowski constraint
226  // induced by \p it and given support graph \p gc.
228 
229  // Updates the best known solution according to integer solution of this subproblem.
230  void updateSolution();
231 
232 
233  // The following four functions are used by the primal heuristic.
234 
235  int getArrayIndex(double lpValue);
236 
237  void childClusterSpanningTree(GraphCopy& GC, List<edgeValue>& clusterEdges,
238  List<NodePair>& MSTEdges);
239 
241  ClusterArray<List<edgeValue>>& clusterEdges);
242 
243  // Tries to improve the best primal solution by means of the current fractional LP-solution.
244  double heuristicImprovePrimalBound(List<NodePair>& originalEdges,
245  List<NodePair>& connectionEdges, List<edge>& deletedEdges);
246 
249  return addPoolCons(cons, static_cast<MaxCPlanarMaster*>(master_)->getCutConnPool());
250  }
251 
254  return addPoolCons(cons, static_cast<MaxCPlanarMaster*>(master_)->getCutKuraPool());
255  }
256 
257  //tries to regenerate connectivity cuts
258  inline int separateConnPool(double minViolation) {
259  return separateCutPool(static_cast<MaxCPlanarMaster*>(master_)->getCutConnPool(),
260  minViolation);
261  }
262 
263  //tries to regenerate kuratowski cuts
264  inline int separateKuraPool(double minViolation) {
265  return separateCutPool(static_cast<MaxCPlanarMaster*>(master_)->getCutKuraPool(),
266  minViolation);
267  }
268 #if 0
269  void minimumSpanningTree(
270  GraphCopy &GC,
271  List<NodePair> &clusterEdges,
272  List<NodePair> &MSTEdges);
273 
274  void recursiveMinimumSpanningTree(
275  ClusterGraph &C,
276  cluster c,
277  ClusterArray<List<NodePair> > &treeEdges,
278  List<NodePair> &edgesByIncLPValue,
279  List<node> &clusterNodes);
280 
281  double heuristicImprovePrimalBoundDet(
282  List<NodePair> &origEdges,
283  List<NodePair> &conEdges,
284  List<NodePair> &delEdges);
285 #endif
286 };
287 
288 }
289 }
ogdf::ArrayBuffer< int >
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
BoyerMyrvold.h
Declaration of the wrapper class of the Boyer-Myrvold planarity test.
abacus::Sub::constraintPoolSeparation
virtual int constraintPoolSeparation(int ranking=0, Pool< Constraint, Variable > *pool=nullptr, double minViolation=0.001)
Tries to generate inactive constraints from a pool.
ArrayBuffer.h
Declaration and implementation of ArrayBuffer class.
ogdf::cluster_planarity::MaxCPlanarSub::generateSon
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 ...
sub.h
ogdf::cluster_planarity::MaxCPlanarSub::detectedInfeasibility
bool detectedInfeasibility
Definition: MaxCPlanarSub.h:186
ogdf::cluster_planarity::MaxCPlanarSub::selectBranchingVariableCandidates
virtual int selectBranchingVariableCandidates(ArrayBuffer< int > &candidates) override
Selects candidates for branching variables.
ogdf::cluster_planarity::MaxCPlanarSub
Definition: MaxCPlanarSub.h:47
abacus::BranchRule
Abstract base class for all branching rules.
Definition: branchrule.h:59
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::cluster_planarity::MaxCPlanarSub::clusterBags
int clusterBags(ClusterGraph &CG, cluster c)
ogdf::cluster_planarity::MaxCPlanarSub::feasible
virtual bool feasible() override
Must check the feasibility of a solution of the LP-relaxation.
ogdf::cluster_planarity::MaxCPlanarSub::improve
virtual int improve(double &primalValue) override
Can be redefined in order to implement primal heuristics for finding feasible solutions.
abacus::Sub::branchRule
BranchRule * branchRule() const
Returns a pointer to the branching rule of the subproblem.
Definition: sub.h:355
ogdf::ClusterArrayBase
RegisteredArray for labeling the clusters of a ClusterGraph.
Definition: ClusterGraph.h:304
ogdf::SListIteratorBase
Encapsulates a pointer to an ogdf::SList element.
Definition: SList.h:41
ogdf::cluster_planarity::MaxCPlanarSub::m_constraintsFound
bool m_constraintsFound
Definition: MaxCPlanarSub.h:185
ogdf::GraphCopy
Copies of graphs supporting edge splitting.
Definition: GraphCopy.h:384
ogdf::cluster_planarity::MaxCPlanarSub::separateRealO
int separateRealO(double minViolate)
Definition: MaxCPlanarSub.h:121
ogdf::cluster_planarity::MaxCPlanarSub::repair
int repair()
ogdf::cluster_planarity::MaxCPlanarSub::separateConnPool
int separateConnPool(double minViolation)
Definition: MaxCPlanarSub.h:258
ogdf::cluster_planarity::MaxCPlanarSub::checkCConnectivityOld
bool checkCConnectivityOld(const GraphCopy &support)
ogdf::cluster_planarity::MaxCPlanarSub::solveLp
virtual int solveLp() override
Solves the LP-relaxation of the subproblem.
ogdf::cluster_planarity::MaxCPlanarSub::getArrayIndex
int getArrayIndex(double lpValue)
ogdf::cluster_planarity::MaxCPlanarSub::subdivisionLefthandSide
double subdivisionLefthandSide(SListConstIterator< KuratowskiWrapper > it, GraphCopy *gc)
ogdf::cluster_planarity::MaxCPlanarSub::connectivitySupportGraph
void connectivitySupportGraph(GraphCopy &support, EdgeArray< double > &weight)
ogdf::cluster_planarity::MaxCPlanarSub::addCutCons
int addCutCons(ArrayBuffer< abacus::Constraint * > cons)
Adds the given constraints to the connectivity cut pool.
Definition: MaxCPlanarSub.h:248
ogdf::cluster_planarity::MaxCPlanarSub::clusterSpanningTree
void clusterSpanningTree(ClusterGraph &C, cluster c, ClusterArray< List< NodePair >> &treeEdges, ClusterArray< List< edgeValue >> &clusterEdges)
ogdf::cluster_planarity::MaxCPlanarSub::myAddVars
void myAddVars(ArrayBuffer< abacus::Variable * > &b)
Definition: MaxCPlanarSub.h:197
ogdf::cluster_planarity::MaxCPlanarSub::separateCutPool
int separateCutPool(abacus::StandardPool< abacus::Constraint, abacus::Variable > *pool, double minViolation)
Definition: MaxCPlanarSub.h:175
abacus::StandardPool< abacus::Constraint, abacus::Variable >
abacus::Sub::father
const Sub * father() const
Returns a pointer to the father of the subproblem in the branch-and-bound tree.
Definition: sub.h:198
abacus::Sub::variable
Variable * variable(int i) const
Returns a pointer to the i-th active variable.
Definition: sub.h:1863
ogdf::cluster_planarity::MaxCPlanarSub::intSolutionInducedGraph
void intSolutionInducedGraph(GraphCopy &support)
ogdf::ClusterElement
Representation of clusters in a clustered graph.
Definition: ClusterGraph.h:55
ogdf::cluster_planarity::MaxCPlanarMaster
Definition: MaxCPlanarMaster.h:48
ogdf::cluster_planarity::MaxCPlanarSub::checkCConnectivity
bool checkCConnectivity(const GraphCopy &support)
Checks if the cluster induced graphs and their complement are connected in the current solution.
r
int r[]
Definition: hierarchical-ranking.cpp:8
ogdf::cluster_planarity::MaxCPlanarSub::criticalSinceBranching
List< abacus::Constraint * > criticalSinceBranching
Definition: MaxCPlanarSub.h:193
ogdf::cluster_planarity::MaxCPlanarSub::inOrigSolveLp
bool inOrigSolveLp
Definition: MaxCPlanarSub.h:187
ogdf::cluster_planarity::MaxCPlanarSub::master
MaxCPlanarMaster * master() const
Definition: MaxCPlanarSub.h:181
abacus::Sub::master_
Master * master_
A pointer to the corresponding master of the optimization.
Definition: sub.h:1436
ogdf::cluster_planarity::MaxCPlanarSub::addKuraCons
int addKuraCons(ArrayBuffer< abacus::Constraint * > cons)
Adds the given constraints to the planarity cut pool.
Definition: MaxCPlanarSub.h:253
ogdf::cluster_planarity::MaxCPlanarMaster::m_varsPrice
int m_varsPrice
Definition: MaxCPlanarMaster.h:285
ogdf::ArrayBuffer::size
INDEX size() const
Returns number of elements in the buffer.
Definition: ArrayBuffer.h:236
ogdf::ArrayBuffer::push
void push(E e)
Puts a new element in the buffer.
Definition: ArrayBuffer.h:209
ogdf::cluster_planarity::MaxCPlanarSub::kuratowskiSupportGraph
void kuratowskiSupportGraph(GraphCopy &support, double low, double high)
MaxCPlanarMaster.h
Declaration of the master class for the Branch&Cut algorithm for the Maximum C-Planar SubGraph proble...
ogdf::List< abacus::Constraint * >
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
abacus::Sub::id
int id() const
Returns the identity number of the subproblem.
Definition: sub.h:153
abacus::Sub::removeNonLiftableCons
virtual bool removeNonLiftableCons()
ogdf::cluster_planarity::MaxCPlanarSub::separateReal
int separateReal(double minViolate)
these functions are mainly reporting to let abacus think everthing is normal.
ogdf::cluster_planarity::MaxCPlanarSub::separate
virtual int separate() override
Must be redefined in derived classes for the generation of cutting planes.
Definition: MaxCPlanarSub.h:137
ogdf::cluster_planarity::MaxCPlanarSub::optimize
virtual int optimize() override
Performs the optimization of the subproblem.
Definition: MaxCPlanarSub.h:73
ogdf::cluster_planarity::MaxCPlanarSub::separateKuraPool
int separateKuraPool(double minViolation)
Definition: MaxCPlanarSub.h:264
standardpool.h
standard pool.
abacus::Sub::optimize
virtual int optimize()
Performs the optimization of the subproblem.
ogdf::cluster_planarity::MaxCPlanarSub::childClusterSpanningTree
void childClusterSpanningTree(GraphCopy &GC, List< edgeValue > &clusterEdges, List< NodePair > &MSTEdges)
ogdf::cluster_planarity::MaxCPlanarSub::m_sepFirst
bool m_sepFirst
Definition: MaxCPlanarSub.h:192
ogdf::cluster_planarity::MaxCPlanarSub::~MaxCPlanarSub
virtual ~MaxCPlanarSub()
abacus::Sub
The subproblem.
Definition: sub.h:68
ogdf::cluster_planarity::MaxCPlanarSub::realDualBound
double realDualBound
Definition: MaxCPlanarSub.h:188
ogdf::cluster_planarity::MaxCPlanarSub::updateSolution
void updateSolution()
ogdf::cluster_planarity::MaxCPlanarSub::MaxCPlanarSub
MaxCPlanarSub(abacus::Master *master)
ogdf::cluster_planarity::MaxCPlanarSub::createVariablesForBufferedConstraints
int createVariablesForBufferedConstraints()
ogdf::cluster_planarity::MaxCPlanarSub::selectBranchingVariable
virtual int selectBranchingVariable(int &variable) override
Chooses a branching variable.
abacus::Sub::addCons
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.
abacus::Sub::addVars
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.
ogdf::cluster_planarity::MaxCPlanarSub::getRepresentative
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
Definition: MaxCPlanarSub.h:90
ogdf::cluster_planarity::MaxCPlanarSub::m_reportCreation
int m_reportCreation
Definition: MaxCPlanarSub.h:191
ogdf::cluster_planarity::MaxCPlanarSub::bufferedForCreation
ArrayBuffer< abacus::Constraint * > bufferedForCreation
Definition: MaxCPlanarSub.h:194
ogdf::cluster_planarity::MaxCPlanarSub::heuristicImprovePrimalBound
double heuristicImprovePrimalBound(List< NodePair > &originalEdges, List< NodePair > &connectionEdges, List< edge > &deletedEdges)
ogdf::cluster_planarity::MaxCPlanarSub::pricing
virtual int pricing() override
Should generate inactive variables which do not price out correctly.
Definition: MaxCPlanarSub.h:144
ogdf::cluster_planarity::MaxCPlanarSub::makeFeasible
virtual int makeFeasible() override
The default implementation of makeFeasible()does nothing.
Definition: MaxCPlanarSub.h:66
abacus::Sub::dualBound
double dualBound() const
Returns a bound which is "better" than the optimal solution of the subproblem w.r....
Definition: sub.h:181
ogdf::ClusterGraph
Representation of clustered graphs.
Definition: ClusterGraph.h:339
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::Logger::slout
static std::ostream & slout(Level level=Level::Default)
stream for logging-output (global)
Definition: Logger.h:191
abacus::Master
The master of the optimization.
Definition: master.h:69
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:709
ogdf::cluster_planarity::MaxCPlanarSub::addPoolCons
int addPoolCons(ArrayBuffer< abacus::Constraint * > &cons, abacus::StandardPool< abacus::Constraint, abacus::Variable > *pool)
Adds the given constraints to the given pool.
Definition: MaxCPlanarSub.h:170