benchmark/swap_bipartite_bench.cc
author alpar
Fri, 13 Oct 2006 15:10:50 +0000
changeset 2241 37e0966e43b6
parent 2232 ae8562537502
child 2242 16523135943d
permissions -rw-r--r--
Improve build environment and scripts
deba@2084
     1
#include <cstdlib>
deba@2084
     2
#include <iostream>
deba@2084
     3
#include <sstream>
deba@2084
     4
deba@2084
     5
#include <lemon/smart_graph.h>
alpar@2239
     6
#include <lemon/list_graph.h>
deba@2084
     7
deba@2084
     8
#include <lemon/bpugraph_adaptor.h>
deba@2084
     9
#include <lemon/bipartite_matching.h>
deba@2084
    10
deba@2084
    11
#include <lemon/graph_utils.h>
deba@2084
    12
#include <lemon/graph_to_eps.h>
deba@2084
    13
deba@2084
    14
#include <lemon/time_measure.h>
deba@2084
    15
deba@2084
    16
using namespace std;
deba@2084
    17
using namespace lemon;
deba@2084
    18
deba@2084
    19
typedef SmartBpUGraph Graph;
alpar@2239
    20
typedef ListBpUGraph LGraph;
deba@2084
    21
BPUGRAPH_TYPEDEFS(Graph);
deba@2084
    22
deba@2084
    23
int _urandom_init() {
deba@2084
    24
  int seed = time(0);
deba@2084
    25
  srand(seed);
deba@2084
    26
  return seed;
deba@2084
    27
}
deba@2084
    28
deba@2084
    29
int urandom(int n) {
deba@2084
    30
  static int seed = _urandom_init();
deba@2130
    31
  ignore_unused_variable_warning(seed);
deba@2084
    32
  return (int)(rand() / (1.0 + RAND_MAX) * n);
deba@2084
    33
}
deba@2084
    34
deba@2084
    35
int main() {
deba@2084
    36
deba@2084
    37
  for (int k = 1; k < 100; ++k) {
deba@2084
    38
    
deba@2084
    39
    int n = k * 100;
deba@2084
    40
    int m = (100 - k) * 100;
deba@2084
    41
    int e = 20000;
deba@2084
    42
    int s = 100;
deba@2084
    43
    
deba@2084
    44
    Timer nt(false), st(false);
alpar@2239
    45
    Timer lnt(false), lst(false);
deba@2084
    46
    
deba@2084
    47
    for (int i = 0; i < s; ++i) {
deba@2084
    48
      Graph graph;
alpar@2239
    49
      LGraph lgraph;
deba@2084
    50
      vector<Node> aNodes;
deba@2084
    51
      vector<Node> bNodes;  
alpar@2239
    52
      vector<LGraph::Node> laNodes;
alpar@2239
    53
      vector<LGraph::Node> lbNodes;  
deba@2084
    54
      
deba@2084
    55
      for (int i = 0; i < n; ++i) {
deba@2084
    56
        Node node = graph.addANode();
deba@2084
    57
        aNodes.push_back(node);
alpar@2239
    58
        LGraph::Node lnode = lgraph.addANode();
alpar@2239
    59
        laNodes.push_back(lnode);
deba@2084
    60
      }
deba@2084
    61
      for (int i = 0; i < m; ++i) {
deba@2084
    62
        Node node = graph.addBNode();
deba@2084
    63
        bNodes.push_back(node);
alpar@2239
    64
        LGraph::Node lnode = lgraph.addBNode();
alpar@2239
    65
        lbNodes.push_back(lnode);
deba@2084
    66
      }
deba@2084
    67
      for (int i = 0; i < e; ++i) {
alpar@2239
    68
        int a,b;
alpar@2239
    69
	Node aNode = aNodes[a=urandom(n)];
alpar@2239
    70
        Node bNode = bNodes[b=urandom(m)];
deba@2084
    71
        graph.addEdge(aNode, bNode);
alpar@2239
    72
	LGraph::Node laNode = laNodes[a];
alpar@2239
    73
        LGraph::Node lbNode = lbNodes[b];
alpar@2239
    74
        lgraph.addEdge(laNode, lbNode);
deba@2084
    75
      }
deba@2084
    76
deba@2084
    77
      {
deba@2084
    78
        MaxBipartiteMatching<Graph> bpmatch(graph);
deba@2084
    79
        
deba@2084
    80
        nt.start();
deba@2084
    81
        bpmatch.init();
deba@2084
    82
        bpmatch.start();
deba@2084
    83
        nt.stop();
deba@2084
    84
        
deba@2084
    85
      }
deba@2084
    86
deba@2084
    87
      {
deba@2084
    88
        typedef SwapBpUGraphAdaptor<Graph> SGraph;
deba@2084
    89
        SGraph sgraph(graph);
deba@2084
    90
        MaxBipartiteMatching<SGraph> bpmatch(sgraph);
deba@2084
    91
deba@2084
    92
        st.start();
deba@2084
    93
        bpmatch.init();
deba@2084
    94
        bpmatch.start();
deba@2084
    95
        st.stop();
deba@2084
    96
        
alpar@2239
    97
      }                 
alpar@2239
    98
      {
alpar@2239
    99
        MaxBipartiteMatching<LGraph> bpmatch(lgraph);
alpar@2239
   100
        
alpar@2239
   101
        lnt.start();
alpar@2239
   102
        bpmatch.init();
alpar@2239
   103
        bpmatch.start();
alpar@2239
   104
        lnt.stop();
alpar@2239
   105
        
deba@2084
   106
      }
deba@2084
   107
alpar@2239
   108
      {
alpar@2239
   109
        typedef SwapBpUGraphAdaptor<LGraph> SGraph;
alpar@2239
   110
        SGraph sgraph(lgraph);
alpar@2239
   111
        MaxBipartiteMatching<SGraph> bpmatch(sgraph);
alpar@2239
   112
alpar@2239
   113
        lst.start();
alpar@2239
   114
        bpmatch.init();
alpar@2239
   115
        bpmatch.start();
alpar@2239
   116
        lst.stop();
alpar@2239
   117
        
alpar@2239
   118
      }
alpar@2239
   119
     }
alpar@2239
   120
alpar@2239
   121
    cout << k * 100 << ' ' << nt.realTime() << ' ' << st.realTime()
alpar@2239
   122
	 << ' ' << lnt.realTime() << ' ' << lst.realTime()<< endl;
deba@2084
   123
deba@2084
   124
  }
deba@2084
   125
deba@2084
   126
  return 0;
deba@2084
   127
}