Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

CPlanaritySub.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 CPlanaritySub : public abacus::Sub {
48 public:
51  List<abacus::Constraint*>& criticalConstraints);
52 
53  virtual ~CPlanaritySub();
54 
55  // Creation of a child-node in the Branch&Bound tree according to the
56  // branching rule \p rule
57  virtual abacus::Sub* generateSon(abacus::BranchRule* rule) override;
58 
59 protected:
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";
74  int ret = abacus::Sub::optimize();
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
98  int clusterBags(ClusterGraph& CG, cluster c);
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 
115  int separateReal(double minViolate);
116 #if 0
117  int pricingReal(double minViolate);
118 #endif
119 
120  inline int separateRealO(double minViolate) {
121  Logger::slout() << "\tSeparate (minViolate=" << minViolate << ")..";
122  int r = separateReal(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 {
137  Logger::slout()
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  }
147  Logger::slout()
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.
165  virtual int selectBranchingVariableCandidates(ArrayBuffer<int>& candidates) override;
166  virtual int selectBranchingVariable(int& variable) override;
167 
171  return (master()->useDefaultCutPool()) ? addCons(cons) : addCons(cons, pool);
172  }
173 
175  double minViolation) {
176  return (master()->useDefaultCutPool()) ? 0 : constraintPoolSeparation(0, pool, minViolation);
177  }
178 
179 private:
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.
219  void connectivitySupportGraph(GraphCopy& support, EdgeArray<double>& weight);
220 
221  // Computes the integer solution induced Graph.
222  void intSolutionInducedGraph(GraphCopy& support);
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.
235  SListPure<NodePair>& subDivOrig);
236 
237  // Updates the best known solution according to integer solution of this subproblem.
238  void updateSolution();
239 
240 
241  // The following four functions are used by the primal heuristic.
242 
243  int getArrayIndex(double lpValue);
244 
245  void childClusterSpanningTree(GraphCopy& GC, List<edgeValue>& clusterEdges,
246  List<NodePair>& MSTEdges);
247 
249  ClusterArray<List<edgeValue>>& clusterEdges);
250 
251  // Tries to improve the best primal solution by means of the current fractional LP-solution.
252  double heuristicImprovePrimalBound(List<NodePair>& connectionEdges);
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(),
267  minViolation);
268  }
269 
270  //tries to regenerate kuratowski cuts
271  inline int separateKuraPool(double minViolation) {
272  return separateCutPool(static_cast<CPlanarityMaster*>(master_)->getCutKuraPool(),
273  minViolation);
274  }
275 };
276 
277 }
278 }
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.
ogdf::cluster_planarity::CPlanaritySub::selectBranchingVariable
virtual int selectBranchingVariable(int &variable) override
Chooses a branching variable.
ArrayBuffer.h
Declaration and implementation of ArrayBuffer class.
ogdf::cluster_planarity::CPlanaritySub::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: CPlanaritySub.h:89
ogdf::cluster_planarity::CPlanaritySub::repair
int repair()
ogdf::cluster_planarity::CPlanaritySub::master
CPlanarityMaster * master()
Definition: CPlanaritySub.h:180
ogdf::cluster_planarity::CPlanaritySub
Definition: CPlanaritySub.h:47
sub.h
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::CPlanaritySub::separateKuraPool
int separateKuraPool(double minViolation)
Definition: CPlanaritySub.h:271
ogdf::cluster_planarity::CPlanaritySub::clusterBags
int clusterBags(ClusterGraph &CG, cluster c)
ogdf::cluster_planarity::CPlanaritySub::pricing
virtual int pricing() override
Should generate inactive variables which do not price out correctly.
Definition: CPlanaritySub.h:143
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
CPlanarityMaster.h
Declaration of the CPlanarityMaster class for the Branch&Cut algorithm for c-planarity testing via an...
ogdf::cluster_planarity::CPlanaritySub::myAddVars
void myAddVars(ArrayBuffer< abacus::Variable * > &b)
Definition: CPlanaritySub.h:196
ogdf::GraphCopy
Copies of graphs supporting edge splitting.
Definition: GraphCopy.h:384
ogdf::cluster_planarity::CPlanaritySub::KuraSize
Definition: CPlanaritySub.h:226
ogdf::cluster_planarity::CPlanaritySub::m_constraintsFound
bool m_constraintsFound
Definition: CPlanaritySub.h:184
ogdf::cluster_planarity::CPlanaritySub::addKuraCons
int addKuraCons(ArrayBuffer< abacus::Constraint * > cons)
Adds the given constraints to the planarity cut pool.
Definition: CPlanaritySub.h:260
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
ogdf::cluster_planarity::CPlanaritySub::addPoolCons
int addPoolCons(ArrayBuffer< abacus::Constraint * > &cons, abacus::StandardPool< abacus::Constraint, abacus::Variable > *pool)
Adds the given constraints to the given pool.
Definition: CPlanaritySub.h:169
abacus::Sub::variable
Variable * variable(int i) const
Returns a pointer to the i-th active variable.
Definition: sub.h:1863
ogdf::cluster_planarity::CPlanaritySub::getArrayIndex
int getArrayIndex(double lpValue)
ogdf::cluster_planarity::CPlanaritySub::optimize
virtual int optimize() override
Performs the optimization of the subproblem.
Definition: CPlanaritySub.h:72
ogdf::ClusterElement
Representation of clusters in a clustered graph.
Definition: ClusterGraph.h:55
ogdf::cluster_planarity::CPlanaritySub::separateConnPool
int separateConnPool(double minViolation)
Definition: CPlanaritySub.h:265
ogdf::cluster_planarity::CPlanaritySub::detectedInfeasibility
bool detectedInfeasibility
Definition: CPlanaritySub.h:185
r
int r[]
Definition: hierarchical-ranking.cpp:8
ogdf::cluster_planarity::CPlanaritySub::kuratowskiSupportGraph
void kuratowskiSupportGraph(GraphCopy &support, double low, double high)
ogdf::cluster_planarity::CPlanaritySub::CPlanaritySub
CPlanaritySub(abacus::Master *master)
ogdf::cluster_planarity::CPlanaritySub::connectivitySupportGraph
void connectivitySupportGraph(GraphCopy &support, EdgeArray< double > &weight)
abacus::Sub::master_
Master * master_
A pointer to the corresponding master of the optimization.
Definition: sub.h:1436
ogdf::cluster_planarity::CPlanaritySub::separateRealO
int separateRealO(double minViolate)
Definition: CPlanaritySub.h:120
ogdf::cluster_planarity::CPlanaritySub::solveLp
virtual int solveLp() override
Solves the LP-relaxation of the subproblem.
ogdf::cluster_planarity::CPlanaritySub::KuraSize::varnum
double varnum
Definition: CPlanaritySub.h:228
ogdf::cluster_planarity::CPlanaritySub::checkCConnectivityOld
bool checkCConnectivityOld(const GraphCopy &support)
ogdf::cluster_planarity::CPlanaritySub::separate
virtual int separate() override
Must be redefined in derived classes for the generation of cutting planes.
Definition: CPlanaritySub.h:136
ogdf::cluster_planarity::CPlanaritySub::m_sepFirst
bool m_sepFirst
Definition: CPlanaritySub.h:191
ogdf::cluster_planarity::CPlanaritySub::KuraSize::lhs
double lhs
Definition: CPlanaritySub.h:227
ogdf::ArrayBuffer::size
INDEX size() const
Returns number of elements in the buffer.
Definition: ArrayBuffer.h:236
ogdf::cluster_planarity::CPlanaritySub::checkCConnectivity
bool checkCConnectivity(const GraphCopy &support)
Checks if the cluster induced graphs and their complement are connected in the current solution.
ogdf::ArrayBuffer::push
void push(E e)
Puts a new element in the buffer.
Definition: ArrayBuffer.h:209
ogdf::SListPure
Singly linked lists.
Definition: SList.h:39
ogdf::cluster_planarity::CPlanaritySub::intSolutionInducedGraph
void intSolutionInducedGraph(GraphCopy &support)
ogdf::cluster_planarity::CPlanaritySub::heuristicImprovePrimalBound
double heuristicImprovePrimalBound(List< NodePair > &connectionEdges)
ogdf::cluster_planarity::CPlanaritySub::subdivisionLefthandSide
KuraSize subdivisionLefthandSide(SListConstIterator< KuratowskiWrapper > it, GraphCopy *gc, SListPure< NodePair > &subDivOrig)
ogdf::cluster_planarity::CPlanaritySub::makeFeasible
virtual int makeFeasible() override
The default implementation of makeFeasible()does nothing.
Definition: CPlanaritySub.h:65
ogdf::List< abacus::Constraint * >
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::cluster_planarity::CPlanaritySub::clusterSpanningTree
void clusterSpanningTree(ClusterGraph &C, cluster c, ClusterArray< List< NodePair >> &treeEdges, ClusterArray< List< edgeValue >> &clusterEdges)
ogdf::cluster_planarity::CPlanaritySub::m_reportCreation
int m_reportCreation
Definition: CPlanaritySub.h:190
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::CPlanaritySub::addCutCons
int addCutCons(ArrayBuffer< abacus::Constraint * > cons)
Adds the given constraints to the connectivity cut pool.
Definition: CPlanaritySub.h:255
standardpool.h
standard pool.
abacus::Sub::optimize
virtual int optimize()
Performs the optimization of the subproblem.
ogdf::cluster_planarity::CPlanarityMaster
Definition: CPlanarityMaster.h:49
ogdf::cluster_planarity::CPlanaritySub::criticalSinceBranching
List< abacus::Constraint * > criticalSinceBranching
Definition: CPlanaritySub.h:192
abacus::Sub
The subproblem.
Definition: sub.h:68
ogdf::cluster_planarity::CPlanaritySub::bufferedForCreation
ArrayBuffer< abacus::Constraint * > bufferedForCreation
Definition: CPlanaritySub.h:193
ogdf::cluster_planarity::CPlanaritySub::~CPlanaritySub
virtual ~CPlanaritySub()
ogdf::cluster_planarity::CPlanaritySub::feasible
virtual bool feasible() override
Must check the feasibility of a solution of the LP-relaxation.
ogdf::cluster_planarity::CPlanaritySub::selectBranchingVariableCandidates
virtual int selectBranchingVariableCandidates(ArrayBuffer< int > &candidates) override
Selects candidates for branching variables.
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.
ogdf::cluster_planarity::CPlanaritySub::improve
virtual int improve(double &primalValue) override
Can be redefined in order to implement primal heuristics for finding feasible solutions.
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::CPlanaritySub::realDualBound
double realDualBound
Definition: CPlanaritySub.h:187
ogdf::cluster_planarity::CPlanaritySub::separateReal
int separateReal(double minViolate)
these functions are mainly reporting to let abacus think everthing is normal.
ogdf::cluster_planarity::CPlanaritySub::createVariablesForBufferedConstraints
int createVariablesForBufferedConstraints()
ogdf::cluster_planarity::CPlanaritySub::inOrigSolveLp
bool inOrigSolveLp
Definition: CPlanaritySub.h:186
ogdf::cluster_planarity::CPlanaritySub::childClusterSpanningTree
void childClusterSpanningTree(GraphCopy &GC, List< edgeValue > &clusterEdges, List< NodePair > &MSTEdges)
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::cluster_planarity::CP_MasterBase::m_varsPrice
int m_varsPrice
Definition: CP_MasterBase.h:293
ogdf::Logger::slout
static std::ostream & slout(Level level=Level::Default)
stream for logging-output (global)
Definition: Logger.h:191
ogdf::cluster_planarity::CPlanaritySub::separateCutPool
int separateCutPool(abacus::StandardPool< abacus::Constraint, abacus::Variable > *pool, double minViolation)
Definition: CPlanaritySub.h:174
ogdf::cluster_planarity::CPlanaritySub::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 ...
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::CPlanaritySub::updateSolution
void updateSolution()