OpenGM  2.3.x
Discrete Graphical Model Library
minstcutkolmogorov.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_MINSTCUTKOLMOGOROV_HXX
3 #define OPENGM_MINSTCUTKOLMOGOROV_HXX
4 
5 #include <queue>
6 #include <cassert>
7 
8 #include <maxflowlib.h>
9 
10 namespace opengm {
11 
13 namespace external {
14 
16 
18 template<class NType, class VType>
19 class MinSTCutKolmogorov {
20 public:
21  typedef NType node_type;
22  typedef VType ValueType;
23  typedef maxflowLib::Graph<ValueType,ValueType,ValueType> graph_type;
24 
25  MinSTCutKolmogorov();
26  ~MinSTCutKolmogorov();
27  MinSTCutKolmogorov(size_t numberOfNodes, size_t numberOfEdges);
28  void addEdge(node_type,node_type,ValueType);
29  void calculateCut(std::vector<bool>&);
30 
31 private:
32  graph_type* graph_;
33  size_t numberOfNodes_;
34  size_t numberOfEdges_;
35  static const NType S = 0;
36  static const NType T = 1;
37 };
38 
39 
40 template<class NType, class VType>
41 MinSTCutKolmogorov<NType,VType>::MinSTCutKolmogorov() {
42  numberOfNodes_ = 2;
43  numberOfEdges_ = 0;
44  graph_ = NULL;
45 }
46 
47 template<class NType, class VType>
48 MinSTCutKolmogorov<NType,VType>::MinSTCutKolmogorov(size_t numberOfNodes, size_t numberOfEdges) {
49  numberOfNodes_ = numberOfNodes;
50  numberOfEdges_ = numberOfEdges;
51  graph_ = new graph_type(numberOfNodes_-2,numberOfEdges_);
52  graph_->add_node(numberOfNodes_-2);
53  //for(size_t i=0; i<numberOfNodes_-2;++i) {
54  // graph_->add_node();
55  //}
56 }
57 
58 template<class NType, class VType>
59 MinSTCutKolmogorov<NType,VType>::~MinSTCutKolmogorov()
60 {
61  if(graph_!=NULL){
62  delete graph_;
63  }
64 }
65 
66 template<class NType, class VType>
67 void MinSTCutKolmogorov<NType,VType>::addEdge(node_type n1, node_type n2, ValueType cost) {
68  assert(n1 < numberOfNodes_);
69  assert(n2 < numberOfNodes_);
70  assert(cost >= 0);
71  if(n1==S) {
72  graph_->add_tweights( n2-2, /* capacities */ cost, 0);
73  } else if(n2==T) {
74  graph_->add_tweights( n1-2, /* capacities */ 0, cost);
75  } else {
76  graph_->add_edge( n1-2, n2-2, /* capacities */ cost, 0 );
77  }
78 }
79 
80 template<class NType, class VType>
81 void MinSTCutKolmogorov<NType,VType>::calculateCut(std::vector<bool>& segmentation) {
82  /*int flow =*/ graph_->maxflow();
83  segmentation.resize(numberOfNodes_);
84  for(size_t i=2; i<numberOfNodes_; ++i) {
85  if (graph_->what_segment(i-2) == graph_type::SOURCE) {
86  segmentation[i]=false;
87  }
88  else {
89  segmentation[i]=true;
90  }
91  }
92  return;
93 }
94 
96 
97 } // namespace external
98 } // namespace opengm
99 
100 #endif // #ifndef OPENGM_MINSTCUTBOOST_HXX
The OpenGM namespace.
Definition: config.hxx:43