src/work/marci/bipartite_matching_demo.cc
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
child 921 818510fa3d99
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
marci@771
     1
// -*- c++ -*-
marci@771
     2
#include <iostream>
marci@771
     3
#include <fstream>
marci@771
     4
#include <vector>
marci@771
     5
marci@771
     6
#include <sage_graph.h>
marci@771
     7
//#include <smart_graph.h>
marci@771
     8
//#include <dimacs.h>
marci@771
     9
#include <hugo/time_measure.h>
marci@771
    10
#include <for_each_macros.h>
marci@771
    11
#include <bfs_dfs.h>
marci@771
    12
#include <bipartite_graph_wrapper.h>
marci@771
    13
#include <hugo/maps.h>
marci@771
    14
#include <hugo/max_flow.h>
marci@771
    15
#include <graph_gen.h>
marci@771
    16
#include <max_bipartite_matching.h>
marci@771
    17
marci@771
    18
using namespace hugo;
marci@771
    19
marci@771
    20
using std::cin;
marci@771
    21
using std::cout;
marci@771
    22
using std::endl;
marci@771
    23
marci@771
    24
int main() {
marci@771
    25
  //typedef UndirListGraph Graph; 
marci@771
    26
  typedef BipartiteGraph<SageGraph> Graph;
marci@771
    27
  
marci@771
    28
  typedef Graph::Node Node;
marci@771
    29
  typedef Graph::NodeIt NodeIt;
marci@771
    30
  typedef Graph::Edge Edge;
marci@771
    31
  typedef Graph::EdgeIt EdgeIt;
marci@771
    32
  typedef Graph::OutEdgeIt OutEdgeIt;
marci@771
    33
marci@771
    34
  Graph g;
marci@771
    35
marci@771
    36
  int a;
marci@771
    37
  cout << "number of nodes in the first color class=";
marci@771
    38
  cin >> a; 
marci@771
    39
  int b;
marci@771
    40
  cout << "number of nodes in the second color class=";
marci@771
    41
  cin >> b; 
marci@771
    42
  int m;
marci@771
    43
  cout << "number of edges=";
marci@771
    44
  cin >> m; 
marci@771
    45
  
marci@771
    46
  cout << "Generatig a random bipartite graph..." << endl;
marci@771
    47
  random_init();
marci@771
    48
  randomBipartiteGraph(g, a, b, m);
marci@771
    49
marci@771
    50
//   cout << "Edges of the bipartite graph:" << endl;
marci@771
    51
//   FOR_EACH_LOC(EdgeIt, e, g) cout << e << " ";
marci@771
    52
//   cout << endl;
marci@771
    53
marci@771
    54
//   cout << "Nodes:" << endl;
marci@771
    55
//   FOR_EACH_LOC(Graph::NodeIt, v, g) cout << v << " ";
marci@771
    56
//   cout << endl;
marci@771
    57
//   cout << "Nodes in T:" << endl;
marci@771
    58
//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::T_CLASS) cout << v << " ";
marci@771
    59
//   cout << endl;
marci@771
    60
//   cout << "Nodes in S:" << endl;
marci@771
    61
//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::S_CLASS) cout << v << " ";
marci@771
    62
//   cout << endl;
marci@771
    63
marci@771
    64
//   cout << "Erasing the first node..." << endl;
marci@771
    65
//   NodeIt n;
marci@771
    66
//   g.first(n);
marci@771
    67
//   g.erase(n);
marci@771
    68
//   cout << "Nodes of the bipartite graph:" << endl;
marci@771
    69
//   FOR_EACH_GLOB(n, g) cout << n << " ";
marci@771
    70
//   cout << endl;
marci@771
    71
marci@771
    72
//   cout << "Nodes in T:" << endl;
marci@771
    73
//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::T_CLASS) cout << v << " ";
marci@771
    74
//   cout << endl;
marci@771
    75
//   cout << "Nodes in S:" << endl;
marci@771
    76
//   FOR_EACH_INC_LOC(Graph::ClassNodeIt, v, g, Graph::S_CLASS) cout << v << " ";
marci@771
    77
//   cout << endl;
marci@771
    78
marci@771
    79
  typedef stBipartiteGraphWrapper<Graph> stGW;
marci@771
    80
  stGW stgw(g);
marci@771
    81
  ConstMap<stGW::Edge, int> const1map(1);
marci@771
    82
marci@771
    83
  Timer ts;
marci@771
    84
  cout << "max bipartite matching with stGraphWrapper..." << endl;
marci@771
    85
  ts.reset();
marci@771
    86
  stGW::EdgeMap<int> flow(stgw);
marci@771
    87
  MaxFlow<stGW, int, ConstMap<stGW::Edge, int>, stGW::EdgeMap<int> > 
marci@771
    88
    max_flow_test(stgw, stgw.S_NODE, stgw.T_NODE, const1map, flow);
marci@771
    89
  max_flow_test.run();
marci@771
    90
//  while (max_flow_test.augmentOnShortestPath()) { }
marci@771
    91
//  typedef ListGraph MutableGraph;
marci@771
    92
//  while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) {
marci@771
    93
//  while (max_flow_test.augmentOnBlockingFlow2()) {
marci@771
    94
//   cout << max_flow_test.flowValue() << endl;
marci@771
    95
//  }
marci@771
    96
  cout << "matching value: " << max_flow_test.flowValue() << endl;
marci@771
    97
  cout << "elapsed time: " << ts << endl;
marci@771
    98
//   FOR_EACH_LOC(stGW::EdgeIt, e, stgw) { 
marci@771
    99
//     if (flow[e]) cout << e << endl; 
marci@771
   100
//   }
marci@771
   101
  cout << endl;
marci@771
   102
marci@771
   103
  typedef ConstMap<Graph::Edge, int> EdgeCap; 
marci@771
   104
  EdgeCap ge1(1);
marci@771
   105
  typedef ConstMap<Graph::Node, int> NodeCap;
marci@771
   106
  NodeCap gn1(1);
marci@771
   107
  typedef Graph::EdgeMap<int> EdgeFlow;
marci@771
   108
  EdgeFlow gef(g); //0
marci@771
   109
  typedef Graph::NodeMap<int> NodeFlow; 
marci@771
   110
  NodeFlow gnf(g); //0 
marci@771
   111
marci@771
   112
  typedef stGW::EdgeMapWrapper<EdgeCap, NodeCap> CapMap; 
marci@771
   113
  typedef stGW::EdgeMapWrapper<EdgeFlow, NodeFlow> FlowMap; 
marci@771
   114
  CapMap cm(ge1, gn1);
marci@771
   115
  FlowMap fm(gef, gnf);
marci@771
   116
marci@771
   117
  //Timer ts;
marci@771
   118
  cout << "max bipartite matching with stGraphWrapper..." << endl;
marci@771
   119
  ts.reset();
marci@771
   120
  //stGW::EdgeMap<int> flow(stgw);
marci@771
   121
  MaxFlow<stGW, int, CapMap, FlowMap> 
marci@771
   122
    max_flow_test1(stgw, stgw.S_NODE, stgw.T_NODE, cm, fm);
marci@771
   123
  max_flow_test1.run();
marci@771
   124
//  while (max_flow_test.augmentOnShortestPath()) { }
marci@771
   125
//  typedef ListGraph MutableGraph;
marci@771
   126
//  while (max_flow_test.augmentOnBlockingFlow1<MutableGraph>()) {
marci@771
   127
//  while (max_flow_test.augmentOnBlockingFlow2()) {
marci@771
   128
//   cout << max_flow_test.flowValue() << endl;
marci@771
   129
//  }
marci@771
   130
  cout << "matching value: " << max_flow_test1.flowValue() << endl;
marci@771
   131
  cout << "elapsed time: " << ts << endl;
marci@771
   132
//   FOR_EACH_LOC(Graph::EdgeIt, e, g) { 
marci@771
   133
//     if (gef[e]) cout << e << endl; 
marci@771
   134
//   }
marci@771
   135
  cout << endl;
marci@771
   136
marci@771
   137
  cout << "max bipartite matching with stGraphWrapper..." << endl;
marci@771
   138
  ts.reset();
marci@771
   139
  FOR_EACH_LOC(Graph::EdgeIt, e, g) gef.set(e, 0); 
marci@771
   140
  FOR_EACH_LOC(Graph::NodeIt, n, g) gnf.set(n, 0); 
marci@771
   141
  MaxBipartiteMatching<Graph, ConstMap<Graph::Edge, int>, ConstMap<Graph::Node, int>, 
marci@771
   142
    Graph::EdgeMap<int>, Graph::NodeMap<int> > 
marci@771
   143
    matching_test(g, ge1, gn1, gef, gnf);
marci@771
   144
  matching_test.run();
marci@771
   145
marci@771
   146
  cout << "matching value: " << matching_test.matchingValue() << endl;
marci@771
   147
  cout << "elapsed time: " << ts << endl;
marci@771
   148
//   FOR_EACH_LOC(Graph::EdgeIt, e, g) { 
marci@771
   149
//     if (gef[e]) cout << e << endl; 
marci@771
   150
//   }
marci@771
   151
  cout << endl;
marci@771
   152
marci@771
   153
  cout << "max bipartite matching with MaxBipartiteMatching..." << endl;
marci@771
   154
  ts.reset();
marci@771
   155
  FOR_EACH_LOC(Graph::EdgeIt, e, g) gef.set(e, 0); 
marci@771
   156
  //FOR_EACH_LOC(Graph::NodeIt, n, g) gnf.set(n, 0); 
marci@771
   157
  typedef MaxBipartiteMatching<Graph, ConstMap<Graph::Edge, int>, 
marci@771
   158
    ConstMap<Graph::Node, int>, 
marci@771
   159
    Graph::EdgeMap<int>, Graph::NodeMap<int> > MaxBipartiteMatching;
marci@771
   160
  MaxBipartiteMatching matching_test_1(g, ge1, gn1, gef/*, gnf*/);
marci@771
   161
  matching_test_1.run();
marci@771
   162
marci@771
   163
  cout << "matching value: " << matching_test_1.matchingValue() << endl;
marci@771
   164
  cout << "elapsed time: " << ts << endl;
marci@771
   165
//   FOR_EACH_LOC(Graph::EdgeIt, e, g) { 
marci@771
   166
//     if (gef[e]) cout << e << endl; 
marci@771
   167
//   }
marci@771
   168
  cout << endl;
marci@771
   169
marci@771
   170
  cout << "testing optimality with MaxBipartiteMatching..." << endl;
marci@771
   171
  ts.reset();
marci@771
   172
  matching_test_1.run(MaxBipartiteMatching::GEN_MATCHING);
marci@771
   173
  cout << "matching value: " << matching_test_1.matchingValue() << endl;
marci@771
   174
  cout << "elapsed time: " << ts << endl;
marci@771
   175
marci@771
   176
  cout << "testing optimality with MaxBipartiteMatching..." << endl;
marci@771
   177
  ts.reset();
marci@771
   178
  matching_test_1.run(MaxBipartiteMatching::GEN_MATCHING_WITH_GOOD_NODE_FLOW);
marci@771
   179
  cout << "matching value: " << matching_test_1.matchingValue() << endl;
marci@771
   180
  cout << "elapsed time: " << ts << endl;
marci@771
   181
marci@771
   182
  return 0;
marci@771
   183
}