Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MaxFlowModule.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/EpsilonTest.h>
35 #include <ogdf/basic/Graph.h>
36 
37 namespace ogdf {
38 
39 template<typename T>
41 protected:
44  const Graph* m_G;
46  const node* m_s;
47  const node* m_t;
48 
49 private:
50  bool usingExternFlow = false;
51  bool doingAReInit = false;
52 
53  void destroy() {
54  if (!usingExternFlow) {
55  delete m_flow;
56  }
57  delete m_et;
58  }
59 
60 public:
63  : m_et(nullptr), m_flow(nullptr), m_G(nullptr), m_cap(nullptr), m_s(nullptr), m_t(nullptr) { }
64 
66 
71  explicit MaxFlowModule(const Graph& graph, EdgeArray<T>* flow = nullptr)
72  : m_s(nullptr), m_t(nullptr) {
73  init(graph, flow);
74  }
75 
77  virtual ~MaxFlowModule() { destroy(); }
78 
82 
87  virtual void init(const Graph& graph, EdgeArray<T>* flow = nullptr) {
88  // if re-init after an init with internal flow:
89  if (doingAReInit) {
90  destroy();
91  }
92  m_G = &graph;
93  if (flow) {
94  m_flow = flow;
95  usingExternFlow = true;
96  } else {
97  usingExternFlow = false; // in case of a re-init
98  m_flow = new EdgeArray<T>(*m_G, 0);
99  }
100  m_et = new EpsilonTest();
101  doingAReInit = true;
102  }
103 
106 
109  void useEpsilonTest(const double& eps) {
110  delete m_et;
111  m_et = new EpsilonTest(eps);
112  }
113 
127  virtual T computeValue(const EdgeArray<T>& cap, const node& s, const node& t) = 0;
128 
132  virtual void computeFlowAfterValue() = 0;
133 
137 
142  flow = *m_flow;
143  }
144 
147  bool isFeasibleInstance() const {
148  for (edge e : m_G->edges) {
149  if ((*m_cap)[e] < 0) {
150  return false;
151  }
152  }
153  return true;
154  }
155 
157 
164  T computeFlow(EdgeArray<T>& cap, node& s, node& t, EdgeArray<T>& flow) {
165  T val = computeValue(cap, s, t);
166  computeFlowAfterValue(flow);
167  return val;
168  }
169 };
170 
171 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
EpsilonTest.h
Compare floating point numbers with epsilons and integral numbers with normal compare operators.
Graph.h
Includes declaration of graph class.
ogdf::MaxFlowModule::MaxFlowModule
MaxFlowModule()
Empty Constructor.
Definition: MaxFlowModule.h:62
ogdf::MaxFlowModule::isFeasibleInstance
bool isFeasibleInstance() const
Return whether the instance is feasible, i.e. the capacities are non-negative.
Definition: MaxFlowModule.h:147
ogdf::EpsilonTest
Definition: EpsilonTest.h:41
ogdf::MaxFlowModule::m_t
const node * m_t
Pointer to the sink node.
Definition: MaxFlowModule.h:47
ogdf::MaxFlowModule::~MaxFlowModule
virtual ~MaxFlowModule()
Destructor that deletes m_flow if it is an internal flow array.
Definition: MaxFlowModule.h:77
ogdf::MaxFlowModule::m_et
EpsilonTest * m_et
Pointer to the used EpsilonTest.
Definition: MaxFlowModule.h:42
ogdf::MaxFlowModule::computeFlow
T computeFlow(EdgeArray< T > &cap, node &s, node &t, EdgeArray< T > &flow)
Only a shortcut for computeValue and computeFlowAfterValue.
Definition: MaxFlowModule.h:164
ogdf::MaxFlowModule::m_s
const node * m_s
Pointer to the source node.
Definition: MaxFlowModule.h:46
ogdf::MaxFlowModule::m_G
const Graph * m_G
Pointer to the given graph.
Definition: MaxFlowModule.h:44
ogdf::MaxFlowModule::useEpsilonTest
void useEpsilonTest(const double &eps)
Change the used EpsilonTest from StandardEpsilonTest to a user given EpsilonTest.
Definition: MaxFlowModule.h:109
ogdf::MaxFlowModule::computeFlowAfterValue
virtual void computeFlowAfterValue()=0
Compute the flow itself after the flow value is already computed. Only used in algorithms with 2 phas...
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::MaxFlowModule::computeFlowAfterValue
void computeFlowAfterValue(EdgeArray< T > &flow)
Compute the flow itself after the flow value is already computed. Only used in algorithms with 2 phas...
Definition: MaxFlowModule.h:140
ogdf::MaxFlowModule::computeValue
virtual T computeValue(const EdgeArray< T > &cap, const node &s, const node &t)=0
Compute only the value of the flow.
ogdf::MaxFlowModule::init
virtual void init(const Graph &graph, EdgeArray< T > *flow=nullptr)
Initialize the problem with a graph and optional flow array. If no flow array is given,...
Definition: MaxFlowModule.h:87
ogdf::MaxFlowModule::doingAReInit
bool doingAReInit
Is the next "init" call a re-init?
Definition: MaxFlowModule.h:51
ogdf::Graph::edges
internal::GraphObjectContainer< EdgeElement > edges
The container containing all edge objects.
Definition: Graph_d.h:927
ogdf::MaxFlowModule
Definition: MaxFlowModule.h:40
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::MaxFlowModule::destroy
void destroy()
Definition: MaxFlowModule.h:53
ogdf::MaxFlowModule::m_cap
const EdgeArray< T > * m_cap
Pointer to the given capacity array.
Definition: MaxFlowModule.h:45
ogdf::MaxFlowModule::MaxFlowModule
MaxFlowModule(const Graph &graph, EdgeArray< T > *flow=nullptr)
Constructor that calls init.
Definition: MaxFlowModule.h:71
ogdf::MaxFlowModule::usingExternFlow
bool usingExternFlow
Is an extern flow array given in the constructor?
Definition: MaxFlowModule.h:50
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::MaxFlowModule::m_flow
EdgeArray< T > * m_flow
Pointer to (extern) flow array.
Definition: MaxFlowModule.h:43
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:709