COMBINATORIAL_BLAS  1.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
graph_preprocessor.cpp
Go to the documentation of this file.
1 #include <iostream>
2 #include <string>
3 #include <utility>
4 #include <map>
5 #include <cstdio>
6 #include <vector>
7 #include <sys/file.h>
8 #include <stdint.h>
9 #include <algorithm>
10 
11 
12 using namespace std;
13 
14 template<typename _ForwardIterator>
15 bool is_sorted(_ForwardIterator __first, _ForwardIterator __last)
16 {
17  if (__first == __last)
18  return true;
19 
20  _ForwardIterator __next = __first;
21  for (++__next; __next != __last; __first = __next, ++__next)
22  if (*__next < *__first)
23  return false;
24  return true;
25 }
26 
27 template<typename _ForwardIter, typename T>
28 void iota(_ForwardIter __first, _ForwardIter __last, T __value)
29 {
30  while (__first != __last)
31  *__first++ = __value++;
32 }
33 
34 
35 int main()
36 {
37  int64_t nverts = 133633040;
38  int64_t nedges = 5507679822;
39  FILE * infp = fopen("uk-union.graph.bin", "rb");
40 
41  uint32_t * gen_edges = new uint32_t[2*nedges];
42  fread(gen_edges, 2*nedges, sizeof(uint32_t), infp);
43  cout << "Read data" << endl;
44 
45  vector< vector<uint32_t> > adj(nverts);
46  vector< uint32_t > shuffler(nverts);
47  iota(shuffler.begin(), shuffler.end(), static_cast<uint32_t>(0));
48  random_shuffle ( shuffler.begin(), shuffler.end() );
49 
50  for(int64_t i=0; i< 2*nedges; i+=2)
51  {
52  adj[shuffler[gen_edges[i]]].push_back(shuffler[gen_edges[i+1]]);
53  adj[shuffler[gen_edges[i+1]]].push_back(shuffler[gen_edges[i]]);
54  }
55  cout << "Made adjacencies" << endl;
56  delete [] gen_edges;
57 
58  FILE * outp = fopen("uk-union.symmetric.bin", "wb");
59 
60  int64_t count = 0;
61  for(int64_t i=0; i< nverts; ++i)
62  {
63  uint32_t edge[2];
64  edge[0] = i;
65  sort(adj[i].begin(), adj[i].end());
66  vector<uint32_t>::iterator p_end = unique(adj[i].begin(), adj[i].end()); // move consecutive duplicates past the end, store the new end
67  for(vector<uint32_t>::iterator p = adj[i].begin(); p != p_end; ++p)
68  {
69  edge[1] = *p;
70  fwrite(edge, 1, 2*sizeof(uint32_t), outp);
71  ++count;
72  }
73  }
74  fclose(outp);
75  cout << "Number of edges: " << count << endl;
76 }
77