src/benchmark/hcube.cc
author alpar
Mon, 19 Jul 2004 13:31:47 +0000
changeset 708 429dfcbbf47d
child 711 b6c56353832c
permissions -rw-r--r--
A new benchmark (hcube)
and other minor changes
alpar@708
     1
// -*- mode:C++ -*-
alpar@708
     2
alpar@708
     3
#include<math.h>
alpar@708
     4
#include<hugo/list_graph.h>
alpar@708
     5
#include<hugo/smart_graph.h>
alpar@708
     6
#include<hugo/dijkstra.h>
alpar@708
     7
#include<hugo/time_measure.h>
alpar@708
     8
#include<iostream>
alpar@708
     9
#include<../work/jacint/max_flow.h>
alpar@708
    10
alpar@708
    11
using namespace std;
alpar@708
    12
using namespace hugo;
alpar@708
    13
alpar@708
    14
///An experimental typedef factory
alpar@708
    15
#define GRAPH_TYPEDEF_FACTORY(Graph) \
alpar@708
    16
   typedef typename Graph::   Node      Node;\
alpar@708
    17
   typedef typename Graph::   NodeIt    NodeIn;\
alpar@708
    18
   typedef typename Graph::   Edge      Edge;\
alpar@708
    19
   typedef typename Graph::   EdgeIt    EdgeIt;\
alpar@708
    20
   typedef typename Graph:: InEdgeIt  InEdgeIt;\
alpar@708
    21
   typedef typename Graph::OutEdgeIt OutEdgeIt;
alpar@708
    22
alpar@708
    23
#define GRAPH_TYPEDEF_FACTORY_NOTYPENAME(Graph) \
alpar@708
    24
   typedef Graph::   Node      Node;\
alpar@708
    25
   typedef Graph::   NodeIt    NodeIn;\
alpar@708
    26
   typedef Graph::   Edge      Edge;\
alpar@708
    27
   typedef Graph::   EdgeIt    EdgeIt;\
alpar@708
    28
   typedef Graph:: InEdgeIt  InEdgeIt;\
alpar@708
    29
   typedef Graph::OutEdgeIt OutEdgeIt;
alpar@708
    30
alpar@708
    31
alpar@708
    32
class Primes 
alpar@708
    33
{
alpar@708
    34
  vector<int> primes;
alpar@708
    35
  int n;
alpar@708
    36
  
alpar@708
    37
  bool isPrime(int m) 
alpar@708
    38
  {
alpar@708
    39
    for(int i=0;m<primes[i]*primes[i];i++) if(!(m%primes[i])) return false;
alpar@708
    40
    return true;
alpar@708
    41
  }
alpar@708
    42
public:
alpar@708
    43
  Primes() : n(1) {}
alpar@708
    44
  
alpar@708
    45
  int operator() ()
alpar@708
    46
    {
alpar@708
    47
      if(primes.size()==0) {
alpar@708
    48
	primes.push_back(2);
alpar@708
    49
	return 2;
alpar@708
    50
      }
alpar@708
    51
      else {
alpar@708
    52
	do n+=2; while(!isPrime(n));
alpar@708
    53
	primes.push_back(n);
alpar@708
    54
	return n;
alpar@708
    55
      }
alpar@708
    56
    }
alpar@708
    57
};
alpar@708
    58
alpar@708
    59
template<class Graph>
alpar@708
    60
void addHiperCube(Graph &G,int dim,vector<typename Graph::Node> &nodes)
alpar@708
    61
{
alpar@708
    62
  GRAPH_TYPEDEF_FACTORY(Graph);
alpar@708
    63
  
alpar@708
    64
  vector<int> bits(dim+1);
alpar@708
    65
  bits[0]=1;
alpar@708
    66
  for(int i=1;i<=dim;i++) bits[i]=2*bits[i-1];
alpar@708
    67
  
alpar@708
    68
  for(int i=0;i<bits[dim];i++) {
alpar@708
    69
    nodes.push_back(G.addNode());
alpar@708
    70
    for(j=0;j<dim;j++) if(i&bits[j]) G.addEdge(nodes[i-bits[j]],nodes[i]);
alpar@708
    71
  }
alpar@708
    72
}
alpar@708
    73
alpar@708
    74
template<class Graph>
alpar@708
    75
void addBiDirHiperCube(Graph &G,int dim,vector<typename Graph::Node> &nodes)
alpar@708
    76
{
alpar@708
    77
  GRAPH_TYPEDEF_FACTORY(Graph);
alpar@708
    78
  
alpar@708
    79
  vector<int> bits(dim+1);
alpar@708
    80
  bits[0]=1;
alpar@708
    81
  for(int i=1;i<=dim;i++) bits[i]=2*bits[i-1];
alpar@708
    82
  
alpar@708
    83
  for(int i=0;i<bits[dim];i++) {
alpar@708
    84
    nodes.push_back(G.addNode());
alpar@708
    85
    for(int j=0;j<dim;j++) if(i&bits[j]) {
alpar@708
    86
      G.addEdge(nodes[i-bits[j]],nodes[i]);
alpar@708
    87
      G.addEdge(nodes[i],nodes[i-bits[j]]);
alpar@708
    88
    }
alpar@708
    89
    
alpar@708
    90
  }
alpar@708
    91
}
alpar@708
    92
alpar@708
    93
int main(int argc, char *argv[])
alpar@708
    94
{
alpar@708
    95
  //  typedef ListGraph Graph;
alpar@708
    96
  typedef SmartGraph Graph;
alpar@708
    97
alpar@708
    98
  ///\bug GRAPH_TYPEDEF_FACTORY(Graph);
alpar@708
    99
  GRAPH_TYPEDEF_FACTORY_NOTYPENAME(Graph);
alpar@708
   100
alpar@708
   101
  Graph G;
alpar@708
   102
  
alpar@708
   103
  Timer T;
alpar@708
   104
  
alpar@708
   105
  if(argc!=2) {
alpar@708
   106
    cout << "Usage: " << argv[0] << " dim\n";
alpar@708
   107
    return 1;
alpar@708
   108
  }
alpar@708
   109
  
alpar@708
   110
  int dim=atoi(argv[1]);
alpar@708
   111
  
alpar@708
   112
  cout << "Creating Hipercube ("<< (1<<dim) << " nodes, "
alpar@708
   113
       << dim*(1<<dim) << " edges):";
alpar@708
   114
alpar@708
   115
  vector<Node> nodes;
alpar@708
   116
  addBiDirHiperCube(G,dim,nodes);
alpar@708
   117
  cout << T;
alpar@708
   118
  cout << "\nGenerating the lengths: ";
alpar@708
   119
  T.reset();
alpar@708
   120
  Graph::EdgeMap<int> map(G);
alpar@708
   121
  {
alpar@708
   122
    Primes P;
alpar@708
   123
    for(int i=0;i<dim*(1<<dim);i++) P();
alpar@708
   124
    
alpar@708
   125
    //  for(EdgeIt e(G);G.valid(e);G.next(e)) map[e]=P();
alpar@708
   126
    for(int i=0;i<dim*(1<<dim);i++)
alpar@708
   127
      //    map[Edge(((long long int)(i)*2987)%(dim*(1<<dim)))]=P();
alpar@708
   128
      map[Edge(((long long int)(i)*93505)%(dim*(1<<dim)))]=P();
alpar@708
   129
  }
alpar@708
   130
  
alpar@708
   131
  cout << T;
alpar@708
   132
  cout << "\nRunning Dijkstra: ";
alpar@708
   133
  T.reset();
alpar@708
   134
  {
alpar@708
   135
    Dijkstra<Graph> Dij(G,map);
alpar@708
   136
    Dij.run(nodes[0]);
alpar@708
   137
  }
alpar@708
   138
  cout << T;
alpar@708
   139
//   cout << "\nRunning MaxFlow: ";
alpar@708
   140
//   T.reset();
alpar@708
   141
//   {
alpar@708
   142
//    Graph::EdgeMap<int> flow(G);
alpar@708
   143
   
alpar@708
   144
//     MaxFlow<Graph,int> MF(G,nodes[0],nodes[1<<dim-1],map,flow);
alpar@708
   145
//     MF.run(MF.NO_FLOW);
alpar@708
   146
//   }
alpar@708
   147
//   cout << T;
alpar@708
   148
  cout << "\n";
alpar@708
   149
}