23 #ifndef GRAPHLAB_DISTRIBUTED_SHARDING_CONSTRAINT_HPP
24 #define GRAPHLAB_DISTRIBUTED_SHARDING_CONSTRAINT_HPP
26 #include <graphlab/graph/graph_basic_types.hpp>
27 #include <graphlab/util/generate_pds.hpp>
54 class sharding_constraint {
56 std::vector<std::vector<procid_t> > constraint_graph;
58 sharding_constraint(
size_t num_shards, std::string method) {
62 if (method ==
"grid") {
63 make_grid_constraint();
64 }
else if (method ==
"pds") {
65 make_pds_constraint();
67 logstream(
LOG_FATAL) <<
"Unknown sharding constraint method: " << method << std::endl;
72 bool get_neighbors (
procid_t shard, std::vector<procid_t>& neighbors) {
73 ASSERT_LT(shard, nshards);
75 std::vector<procid_t>& ls = constraint_graph[shard];
76 for (
size_t i = 0; i < ls.size(); ++i)
77 neighbors.push_back(ls[i]);
81 bool get_joint_neighbors (
procid_t shardi,
procid_t shardj, std::vector<procid_t>& neighbors) {
82 ASSERT_EQ(neighbors.size(), 0);
83 ASSERT_LT(shardi, nshards);
84 ASSERT_LT(shardj, nshards);
90 std::vector<procid_t>& ls1 = constraint_graph[shardi];
91 std::vector<procid_t>& ls2 = constraint_graph[shardj];
95 while (i < ls1.size() && j < ls2.size()) {
96 if (ls1[i] == ls2[j]) {
97 neighbors.push_back(ls1[i]);
99 }
else if (ls1[i] < ls2[j]) {
109 void make_grid_constraint() {
111 ncols = nrows = (size_t)sqrt(nshards);
112 ASSERT_EQ(ncols*nrows, nshards);
114 for (
size_t i = 0; i < nshards; i++) {
115 std::vector<procid_t> adjlist;
117 adjlist.push_back(i);
120 size_t rowbegin = (i/ncols) * ncols;
121 for (
size_t j = rowbegin; j < rowbegin + ncols; ++j)
122 if (i != j) adjlist.push_back(j);
125 for (
size_t j = i % ncols; j < nshards; j+=ncols)
126 if (i != j) adjlist.push_back(j);
128 std::sort(adjlist.begin(), adjlist.end());
129 constraint_graph.push_back(adjlist);
133 void make_pds_constraint() {
134 int p = floor(sqrt(nshards-1));
135 ASSERT_EQ((p*p+p+1), nshards);
137 std::vector<size_t> results = pds_generator.get_pds(p);
138 for (
size_t i = 0; i < nshards; i++) {
139 std::vector<procid_t> adjlist;
140 for (
size_t j = 0; j < results.size(); j++) {
141 adjlist.push_back( (results[j] + i) % nshards);
143 std::sort(adjlist.begin(), adjlist.end());
144 constraint_graph.push_back(adjlist);
157 for (
size_t i = 0; i < nshards; ++i) {
158 for (
size_t j = i+1; j < nshards; ++j) {
159 std::vector<procid_t> ls;
160 get_joint_neighbors(i, j, ls);
161 ASSERT_GT(ls.size(), 0);