1515#include " util.hpp"
1616#include " min_heap.hpp"
1717
18- class NeighborPartitioner
18+ class adjlist_t
19+ {
20+ private:
21+ vid_t *start;
22+ vid_t len;
23+
24+ public:
25+ adjlist_t () : start(NULL ), len(0 ) {}
26+ adjlist_t (vid_t *start, vid_t len) : start(start), len(len) {}
27+ vid_t *begin () { return start; }
28+ vid_t *end () { return start + len; }
29+ void increment () { len++; }
30+ size_t size () const { return len; }
31+ vid_t &operator [](size_t idx) { return start[idx]; };
32+ const vid_t &operator [](size_t idx) const { return start[idx]; };
33+ vid_t &back () { return start[len - 1 ]; };
34+ const vid_t &back () const { return start[len - 1 ]; };
35+ void pop_back () { len--; }
36+ void clear () { len = 0 ; }
37+ };
38+
39+ class graph_t
1940{
2041 private:
21- typedef std::vector<vid_t > adjlist_t ;
22- typedef std::vector<adjlist_t > graph_t ;
42+ vid_t num_vertices;
43+ std::vector<vid_t > neighbors;
44+ std::vector<adjlist_t > vdata;
45+
46+ public:
47+ void resize (vid_t _num_vertices)
48+ {
49+ num_vertices = _num_vertices;
50+ vdata.resize (num_vertices);
51+ }
52+
53+ size_t num_edges () const { return neighbors.size (); }
54+
55+ void build (std::vector<edge_t > &edges)
56+ {
57+ repv (v, num_vertices)
58+ vdata[v].clear ();
59+ std::sort (edges.begin (), edges.end (),
60+ [](const edge_t &a, const edge_t &b) {
61+ return a.first < b.first ;
62+ });
63+ neighbors.resize (edges.size ());
64+ vid_t last_v = -1 ;
65+ vid_t *start_ptr = &neighbors[0 ];
66+ for (size_t i = 0 ; i < edges.size (); i++) {
67+ neighbors[i] = edges[i].second ;
68+ if (edges[i].first == last_v) {
69+ vdata[last_v].increment ();
70+ } else {
71+ vdata[edges[i].first ] = adjlist_t (start_ptr + i, 1 );
72+ last_v = edges[i].first ;
73+ }
74+ }
75+ }
76+
77+ void build_reverse (std::vector<edge_t > &edges)
78+ {
79+ repv (v, num_vertices)
80+ vdata[v].clear ();
81+ std::sort (edges.begin (), edges.end (),
82+ [](const edge_t &a, const edge_t &b) {
83+ return a.second < b.second ;
84+ });
85+ neighbors.resize (edges.size ());
86+ vid_t last_v = -1 ;
87+ vid_t *start_ptr = &neighbors[0 ];
88+ for (size_t i = 0 ; i < edges.size (); i++) {
89+ neighbors[i] = edges[i].first ;
90+ if (edges[i].second == last_v) {
91+ vdata[last_v].increment ();
92+ } else {
93+ vdata[edges[i].second ] = adjlist_t (start_ptr + i, 1 );
94+ last_v = edges[i].second ;
95+ }
96+ }
97+ }
98+
99+ adjlist_t &operator [](size_t idx) { return vdata[idx]; };
100+ const adjlist_t &operator [](size_t idx) const { return vdata[idx]; };
101+ };
23102
103+ class NeighborPartitioner
104+ {
105+ private:
24106 std::string basefilename;
25107
26108 vid_t num_vertices;
27109 size_t num_edges, assigned_edges;
28110 int p, bucket;
29111 double average_degree, local_average_degree;
30- size_t sample_size, max_sample_size;
112+ size_t max_sample_size;
31113 size_t capacity, local_capacity;
32114
33115 // use mmap for file input
34116 int fin;
35117 off_t filesize;
36118 char *fin_map, *fin_ptr, *fin_end;
37119
120+ std::vector<edge_t > sample_edges;
38121 graph_t adj_out, adj_in;
39122 MinHeap<vid_t , vid_t > min_heap;
40123 std::vector<size_t > occupied;
@@ -126,13 +209,11 @@ class NeighborPartitioner
126209 for (size_t i = 0 ; i < neighbors.size ();) {
127210 vid_t &u = neighbors[i];
128211 if (is_core[u]) {
129- sample_size--;
130212 assign_edge (bucket, direction ? vid : u, direction ? u : vid);
131213 min_heap.decrease_key (vid);
132214 std::swap (u, neighbors.back ());
133215 neighbors.pop_back ();
134216 } else if (is_boundary[u] && occupied[bucket] < local_capacity) {
135- sample_size--;
136217 assign_edge (bucket, direction ? vid : u, direction ? u : vid);
137218 min_heap.decrease_key (vid);
138219 erase_one (adj_r[u], vid);
@@ -155,11 +236,11 @@ class NeighborPartitioner
155236
156237 add_boundary (vid);
157238
158- for (auto & w : adj_out[vid])
239+ for (auto & w : adj_out[vid])
159240 add_boundary (w);
160241 adj_out[vid].clear ();
161242
162- for (auto & w : adj_in[vid])
243+ for (auto & w : adj_in[vid])
163244 add_boundary (w);
164245 adj_in[vid].clear ();
165246 }
0 commit comments