Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MaximumCPlanarSubgraph.h
Go to the documentation of this file.
1 
33 #pragma once
34 
35 #include <ogdf/basic/Module.h>
36 #include <ogdf/basic/Timeouter.h>
40 
41 #include <ogdf/external/abacus.h>
42 
43 #include <chrono>
44 #include <sstream>
45 
46 namespace ogdf {
47 
49 
53 public:
56 
59  : m_heuristicLevel(1)
60  , m_heuristicRuns(1)
61  , m_heuristicOEdgeBound(0.4)
62  , m_heuristicNPermLists(5)
63  , m_kuratowskiIterations(10)
64  , m_subdivisions(10)
65  , m_kSupportGraphs(10)
66  , m_kuratowskiHigh(0.8)
67  , m_kuratowskiLow(0.8)
68  , m_perturbation(false)
69  , m_branchingGap(0.4)
70  , m_time("00:20:00")
71  , m_pricing(false)
72  , m_checkCPlanar(false)
73  , m_numAddVariables(15)
74  , m_strongConstraintViolation(0.3)
75  , m_strongVariableViolation(0.3)
76  , m_totalTime(-1.0)
77  , m_heurTime(-1.0)
78  , m_lpTime(-1.0)
79  , m_lpSolverTime(-1.0)
80  , m_sepTime(-1.0)
81  , m_totalWTime(-1.0)
82  , m_numCCons(-1)
83  , m_numKCons(-1)
84  , m_numLPs(-1)
85  , m_numBCs(-1)
86  , m_numSubSelected(-1)
87  , m_numVars(-1)
88  , m_portaOutput(false)
89  , m_defaultCutPool(true)
90 #ifdef OGDF_DEBUG
91  , m_solByHeuristic(false)
92 #endif
93  {
94  }
95 
96  //destruction
98 
107  /*
108  * @param ClusterGraph the graph that we want to compute a subgraph of
109  * @param pCost the cost of each edge or \c nullptr if edges should have uniform cost
110  * @param delEdges contains all deleted edges after the call
111  * @param addedEdges the set of edges that makes the subgraph connected
112  */
114  List<edge>& delEdges, NodePairs& addedEdges) {
115  return doCall(G, pCost, delEdges, addedEdges);
116  }
117 
118  //setter methods for the module parameters
119  void setHeuristicLevel(int i) { m_heuristicLevel = i; }
120 
121  void setHeuristicRuns(int i) { m_heuristicRuns = i; }
122 
123  void setHeuristicBound(double d) { m_heuristicOEdgeBound = d; }
124 
125  void setNumberOfPermutations(int i) { m_heuristicNPermLists = i; }
126 
127  void setNumberOfKuraIterations(int i) { m_kuratowskiIterations = i; }
128 
129  void setNumberOfSubDivisions(int i) { m_subdivisions = i; }
130 
131  void setNumberOfSupportGraphs(int i) { m_kSupportGraphs = i; }
132 
133  void setUpperRounding(double d) { m_kuratowskiHigh = d; }
134 
135  void setLowerRounding(double d) { m_kuratowskiLow = d; }
136 
137  void setPerturbation(bool b) { m_perturbation = b; }
138 
139  void setBranchingGap(double d) { m_branchingGap = d; }
140 
141  void setTimeLimit(string s) { m_time = s.c_str(); }
142 
143  void setTimeLimit(std::chrono::milliseconds milliSec) {
144  // format string only supports seconds
145  OGDF_ASSERT(milliSec.count() >= 1000);
146  // transform to format string
147  std::chrono::milliseconds remaining(milliSec);
148  auto h = std::chrono::duration_cast<std::chrono::hours>(remaining);
149  remaining -= h;
150  auto m = std::chrono::duration_cast<std::chrono::minutes>(remaining);
151  remaining -= m;
152  auto s = std::chrono::duration_cast<std::chrono::seconds>(remaining);
153  std::stringstream ss;
154  ss << h.count() << ":" << m.count() << ":" << s.count();
155  setTimeLimit(ss.str());
156  }
157 
158  void setPortaOutput(bool b) { m_portaOutput = b; }
159 
160  void setPricing(bool b) { m_pricing = b; }
161 
162  void setCheckCPlanar(bool b) { m_checkCPlanar = b; }
163 
164  void setNumAddVariables(int n) { m_numAddVariables = n; }
165 
166  void setStrongConstraintViolation(double d) { m_strongConstraintViolation = d; }
167 
168  void setStrongVariableViolation(double d) { m_strongVariableViolation = d; }
169 
172  bool& useDefaultCutPool() { return m_defaultCutPool; }
173 
174  //getter methods for results
175  double getTotalTime() { return m_totalTime; }
176 
177  double getHeurTime() { return m_heurTime; }
178 
179  double getLPTime() { return m_lpTime; }
180 
181  double getLPSolverTime() { return m_lpSolverTime; }
182 
183  double getSeparationTime() { return m_sepTime; }
184 
185  double getTotalWTime() { return m_totalWTime; }
186 
188  int getNumCCons() { return m_numCCons; }
189 
191  int getNumKCons() { return m_numKCons; }
192 
194  int getNumLPs() { return m_numLPs; }
195 
197  int getNumBCs() { return m_numBCs; }
198 
200  int getNumSubSelected() { return m_numSubSelected; }
201 
203  int getNumVars() { return m_numVars; }
204 
206  void writeFeasible(const char* filename, MaxCPlanarMaster& master,
207  abacus::Master::STATUS& status);
208 #ifdef OGDF_DEBUG
209  bool getSolByHeuristic() { return m_solByHeuristic; }
210 #endif
211 
212 
213 protected:
218  virtual ReturnType doCall(const ClusterGraph& G, const EdgeArray<double>* pCost,
219  List<edge>& delEdges) override {
220  NodePairs addEdges;
221  return doCall(G, pCost, delEdges, addEdges);
222  }
223 
224  //as above, also returns the set of edges that were
225  //added to construct a completely connected planar
226  //graph that contains the computed c-planar subgraph
227  virtual ReturnType doCall(const ClusterGraph& G, const EdgeArray<double>* pCost,
228  List<edge>& delEdges, NodePairs& addedEdges);
229 
230  double getDoubleTime(const Stopwatch& act) {
231  int64_t tempo = act.centiSeconds() + 100 * act.seconds() + 6000 * act.minutes()
232  + 360000 * act.hours();
233  return ((double)tempo) / 100.0;
234  }
235 
237  void getBottomUpClusterList(const cluster c, List<cluster>& theList);
238 
239 private:
240  //Abacus Master class settings in order of appearance
241  int m_heuristicLevel, m_heuristicRuns;
243  int m_heuristicNPermLists, m_kuratowskiIterations;
244  int m_subdivisions, m_kSupportGraphs;
245  double m_kuratowskiHigh, m_kuratowskiLow;
248  string m_time;
249  bool m_pricing; //<! Decides if pricing is used
250  bool m_checkCPlanar; //<! If set to true, only c-planarity is checked
254 
255  const char* getPortaFileName() { return "porta.poi"; }
256 
257  const char* getIeqFileName() { return "porta.ieq"; }
258 
259  int maxConLength() { return 1024; }
260 
261  void outputCons(std::ofstream& os,
264 
265  //results
266  double m_totalTime; //<! Total computation time, returned from abacus
267  double m_heurTime; //<! Time spent in heuristic, returned from abacus
268  double m_lpTime; //<! Cpu time spent in members of the LP-interface, returned from abacus
269  double m_lpSolverTime; //<! Cpu time required by the LP solver, returned from abacus
270  double m_sepTime; //<! Cpu time spent in the separation of cutting planes, returned from abacus
271  double m_totalWTime; //<! Total wall clock time, returned from abacus
272  int m_numCCons; //<! Number of added connectivity constraints
273  int m_numKCons; //<! Number of added kuratowski constraints
274  int m_numLPs; //<! The number of optimized linear programs (LP-relax.).
275  int m_numBCs; //<! The number of generated subproblems.
276  int m_numSubSelected; //<! The number of subproblems selected by ABACUS.
277  int m_numVars; //<! The number of global variables.
278  bool m_portaOutput; //<! If set to true, output for PORTA in ieq format is generated.
279  bool m_defaultCutPool; //<! Passed through to master
280 #ifdef OGDF_DEBUG
282 #endif
283 };
284 
285 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::MaximumCPlanarSubgraph::m_pricing
bool m_pricing
Definition: MaximumCPlanarSubgraph.h:249
ogdf::MaximumCPlanarSubgraph::setHeuristicRuns
void setHeuristicRuns(int i)
Definition: MaximumCPlanarSubgraph.h:121
ogdf::MaximumCPlanarSubgraph::getPortaFileName
const char * getPortaFileName()
Definition: MaximumCPlanarSubgraph.h:255
ogdf::MaximumCPlanarSubgraph::m_totalWTime
double m_totalWTime
Definition: MaximumCPlanarSubgraph.h:271
ogdf::MaximumCPlanarSubgraph::m_solByHeuristic
bool m_solByHeuristic
Definition: MaximumCPlanarSubgraph.h:281
ogdf::MaximumCPlanarSubgraph::useDefaultCutPool
bool & useDefaultCutPool()
Use default abacus master cut pool or dedicated connectivity and kuratowski cut pools.
Definition: MaximumCPlanarSubgraph.h:172
abacus.h
Includes Abacus.
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::MaximumCPlanarSubgraph::~MaximumCPlanarSubgraph
~MaximumCPlanarSubgraph()
Definition: MaximumCPlanarSubgraph.h:97
ogdf::MaximumCPlanarSubgraph::getTotalTime
double getTotalTime()
Definition: MaximumCPlanarSubgraph.h:175
ogdf::MaximumCPlanarSubgraph::m_totalTime
double m_totalTime
Definition: MaximumCPlanarSubgraph.h:266
abacus::Master::STATUS
STATUS
The various statuses of the optimization process.
Definition: master.h:77
ogdf::MaximumCPlanarSubgraph::setCheckCPlanar
void setCheckCPlanar(bool b)
Definition: MaximumCPlanarSubgraph.h:162
ogdf::MaximumCPlanarSubgraph::setNumberOfPermutations
void setNumberOfPermutations(int i)
Definition: MaximumCPlanarSubgraph.h:125
ogdf::MaximumCPlanarSubgraph::m_defaultCutPool
bool m_defaultCutPool
Definition: MaximumCPlanarSubgraph.h:279
ogdf::MaximumCPlanarSubgraph::setTimeLimit
void setTimeLimit(string s)
Definition: MaximumCPlanarSubgraph.h:141
ogdf::MaximumCPlanarSubgraph::setPricing
void setPricing(bool b)
Definition: MaximumCPlanarSubgraph.h:160
ogdf::MaximumCPlanarSubgraph::MaximumCPlanarSubgraph
MaximumCPlanarSubgraph()
Construction.
Definition: MaximumCPlanarSubgraph.h:58
ogdf::MaximumCPlanarSubgraph::setNumberOfKuraIterations
void setNumberOfKuraIterations(int i)
Definition: MaximumCPlanarSubgraph.h:127
ogdf::MaximumCPlanarSubgraph::setUpperRounding
void setUpperRounding(double d)
Definition: MaximumCPlanarSubgraph.h:133
ogdf::MaximumCPlanarSubgraph::setStrongConstraintViolation
void setStrongConstraintViolation(double d)
Definition: MaximumCPlanarSubgraph.h:166
ogdf::MaximumCPlanarSubgraph::getLPTime
double getLPTime()
Definition: MaximumCPlanarSubgraph.h:179
ogdf::MaximumCPlanarSubgraph::m_kuratowskiLow
double m_kuratowskiLow
Definition: MaximumCPlanarSubgraph.h:245
ogdf::MaximumCPlanarSubgraph::getSeparationTime
double getSeparationTime()
Definition: MaximumCPlanarSubgraph.h:183
ogdf::MaximumCPlanarSubgraph::getIeqFileName
const char * getIeqFileName()
Definition: MaximumCPlanarSubgraph.h:257
ogdf::MaximumCPlanarSubgraph::setNumberOfSupportGraphs
void setNumberOfSupportGraphs(int i)
Definition: MaximumCPlanarSubgraph.h:131
ogdf::MaximumCPlanarSubgraph::getNumCCons
int getNumCCons()
Returns number of connectivity constraints added during computation.
Definition: MaximumCPlanarSubgraph.h:188
ogdf::MaximumCPlanarSubgraph::getSolByHeuristic
bool getSolByHeuristic()
Definition: MaximumCPlanarSubgraph.h:209
ogdf::Stopwatch::hours
int64_t hours() const
Returns the currently elapsed time in hours.
Definition: Stopwatch.h:123
Timeouter.h
Declares base class for modules with timeout functionality.
ogdf::MaximumCPlanarSubgraph::setPerturbation
void setPerturbation(bool b)
Definition: MaximumCPlanarSubgraph.h:137
ogdf::MaximumCPlanarSubgraph::setNumAddVariables
void setNumAddVariables(int n)
Definition: MaximumCPlanarSubgraph.h:164
ogdf::MaximumCPlanarSubgraph::m_numAddVariables
int m_numAddVariables
Definition: MaximumCPlanarSubgraph.h:251
abacus::StandardPool< abacus::Constraint, abacus::Variable >
ogdf::MaximumCPlanarSubgraph::getNumBCs
int getNumBCs()
Returns number of generated LPs.
Definition: MaximumCPlanarSubgraph.h:197
ogdf::MaximumCPlanarSubgraph::m_heurTime
double m_heurTime
Definition: MaximumCPlanarSubgraph.h:267
ogdf::MaximumCPlanarSubgraph::setHeuristicLevel
void setHeuristicLevel(int i)
Definition: MaximumCPlanarSubgraph.h:119
ogdf::MaximumCPlanarSubgraph::setTimeLimit
void setTimeLimit(std::chrono::milliseconds milliSec)
Definition: MaximumCPlanarSubgraph.h:143
ogdf::MaximumCPlanarSubgraph::setNumberOfSubDivisions
void setNumberOfSubDivisions(int i)
Definition: MaximumCPlanarSubgraph.h:129
ogdf::ClusterElement
Representation of clusters in a clustered graph.
Definition: ClusterGraph.h:55
ogdf::cluster_planarity::MaxCPlanarMaster
Definition: MaxCPlanarMaster.h:48
ogdf::Stopwatch::seconds
int64_t seconds() const
Returns the currently elapsed time in seconds.
Definition: Stopwatch.h:109
ogdf::MaximumCPlanarSubgraph::getNumLPs
int getNumLPs()
Returns number of optimized LPs (only LP-relaxations)
Definition: MaximumCPlanarSubgraph.h:194
ogdf::MaximumCPlanarSubgraph::maxConLength
int maxConLength()
Definition: MaximumCPlanarSubgraph.h:259
ogdf::MaximumCPlanarSubgraph::m_portaOutput
bool m_portaOutput
Definition: MaximumCPlanarSubgraph.h:278
ogdf::MaximumCPlanarSubgraph::m_strongConstraintViolation
double m_strongConstraintViolation
Definition: MaximumCPlanarSubgraph.h:252
ogdf::MaximumCPlanarSubgraph::getHeurTime
double getHeurTime()
Definition: MaximumCPlanarSubgraph.h:177
ogdf::MaximumCPlanarSubgraph::m_perturbation
bool m_perturbation
Definition: MaximumCPlanarSubgraph.h:246
ogdf::MaximumCPlanarSubgraph::getNumKCons
int getNumKCons()
Returns number of Kuratowski constraints added during computation.
Definition: MaximumCPlanarSubgraph.h:191
ogdf::MaximumCPlanarSubgraph::m_heuristicOEdgeBound
double m_heuristicOEdgeBound
Definition: MaximumCPlanarSubgraph.h:242
ogdf::MaximumCPlanarSubgraph::m_numCCons
int m_numCCons
Definition: MaximumCPlanarSubgraph.h:272
ogdf::MaximumCPlanarSubgraph::callAndConnect
ReturnType callAndConnect(const ClusterGraph &G, const EdgeArray< double > *pCost, List< edge > &delEdges, NodePairs &addedEdges)
Computes set of edges delEdges, which have to be deleted in order to get a c-planar subgraph and also...
Definition: MaximumCPlanarSubgraph.h:113
ogdf::Stopwatch::minutes
int64_t minutes() const
Returns the currently elapsed time in minutes.
Definition: Stopwatch.h:116
ogdf::MaximumCPlanarSubgraph
Exact computation of a maximum c-planar subgraph.
Definition: MaximumCPlanarSubgraph.h:52
ogdf::MaximumCPlanarSubgraph::m_subdivisions
int m_subdivisions
Definition: MaximumCPlanarSubgraph.h:244
ogdf::Stopwatch::centiSeconds
int64_t centiSeconds() const
Returns the currently elapsed time in 1/100-seconds.
Definition: Stopwatch.h:102
MaxCPlanarMaster.h
Declaration of the master class for the Branch&Cut algorithm for the Maximum C-Planar SubGraph proble...
ogdf::List
Doubly linked lists (maintaining the length of the list).
Definition: List.h:42
ogdf::MaximumCPlanarSubgraph::m_numSubSelected
int m_numSubSelected
Definition: MaximumCPlanarSubgraph.h:276
ogdf::MaximumCPlanarSubgraph::setPortaOutput
void setPortaOutput(bool b)
Definition: MaximumCPlanarSubgraph.h:158
ogdf::MaximumCPlanarSubgraph::setHeuristicBound
void setHeuristicBound(double d)
Definition: MaximumCPlanarSubgraph.h:123
ogdf::MaximumCPlanarSubgraph::getTotalWTime
double getTotalWTime()
Definition: MaximumCPlanarSubgraph.h:185
ogdf::MaximumCPlanarSubgraph::m_strongVariableViolation
double m_strongVariableViolation
Definition: MaximumCPlanarSubgraph.h:253
ogdf::MaximumCPlanarSubgraph::getNumVars
int getNumVars()
Returns number of global variables. Todo: Real number from ABACUS.
Definition: MaximumCPlanarSubgraph.h:203
ogdf::CPlanarSubgraphModule
Interface of algorithms for the computation of c-planar subgraphs.
Definition: CPlanarSubgraphModule.h:41
ogdf::MaximumCPlanarSubgraph::m_numBCs
int m_numBCs
Definition: MaximumCPlanarSubgraph.h:275
ogdf::MaximumCPlanarSubgraph::setStrongVariableViolation
void setStrongVariableViolation(double d)
Definition: MaximumCPlanarSubgraph.h:168
ogdf::MaximumCPlanarSubgraph::doCall
virtual ReturnType doCall(const ClusterGraph &G, const EdgeArray< double > *pCost, List< edge > &delEdges) override
Computes a maximum c-planar subgraph, returns the set of edges that have to be deleted in delEdges if...
Definition: MaximumCPlanarSubgraph.h:218
ogdf::MaximumCPlanarSubgraph::m_numVars
int m_numVars
Definition: MaximumCPlanarSubgraph.h:277
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::Stopwatch
Realizes a stopwatch for measuring elapsed time.
Definition: Stopwatch.h:42
ogdf::MaximumCPlanarSubgraph::m_heuristicRuns
int m_heuristicRuns
Definition: MaximumCPlanarSubgraph.h:241
ogdf::MaximumCPlanarSubgraph::m_kuratowskiIterations
int m_kuratowskiIterations
Definition: MaximumCPlanarSubgraph.h:243
CPlanarSubgraphModule.h
Declaration of an interface for c-planar subgraph algorithms.
ClusterGraph.h
Derived class of GraphObserver providing additional functionality to handle clustered graphs.
ogdf::MaximumCPlanarSubgraph::m_checkCPlanar
bool m_checkCPlanar
Definition: MaximumCPlanarSubgraph.h:250
Module.h
Declares base class for all module types.
ogdf::MaximumCPlanarSubgraph::setBranchingGap
void setBranchingGap(double d)
Definition: MaximumCPlanarSubgraph.h:139
ogdf::MaximumCPlanarSubgraph::m_sepTime
double m_sepTime
Definition: MaximumCPlanarSubgraph.h:270
ogdf::MaximumCPlanarSubgraph::getNumSubSelected
int getNumSubSelected()
Returns number of subproblems selected by ABACUS.
Definition: MaximumCPlanarSubgraph.h:200
ogdf::MaximumCPlanarSubgraph::setLowerRounding
void setLowerRounding(double d)
Definition: MaximumCPlanarSubgraph.h:135
ogdf::MaximumCPlanarSubgraph::m_numKCons
int m_numKCons
Definition: MaximumCPlanarSubgraph.h:273
ogdf::MaximumCPlanarSubgraph::m_branchingGap
double m_branchingGap
Definition: MaximumCPlanarSubgraph.h:247
ogdf::MaximumCPlanarSubgraph::m_time
string m_time
Definition: MaximumCPlanarSubgraph.h:248
ogdf::Module::ReturnType
ReturnType
The return type of a module.
Definition: Module.h:50
ogdf::MaximumCPlanarSubgraph::m_lpTime
double m_lpTime
Definition: MaximumCPlanarSubgraph.h:268
ogdf::ClusterGraph
Representation of clustered graphs.
Definition: ClusterGraph.h:339
ogdf::MaximumCPlanarSubgraph::getDoubleTime
double getDoubleTime(const Stopwatch &act)
Definition: MaximumCPlanarSubgraph.h:230
ogdf::MaximumCPlanarSubgraph::m_numLPs
int m_numLPs
Definition: MaximumCPlanarSubgraph.h:274
ogdf::MaximumCPlanarSubgraph::m_lpSolverTime
double m_lpSolverTime
Definition: MaximumCPlanarSubgraph.h:269
ogdf::MaximumCPlanarSubgraph::getLPSolverTime
double getLPSolverTime()
Definition: MaximumCPlanarSubgraph.h:181
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:709