Flex  0.17.9
immutable_csr.h
Go to the documentation of this file.
1 
16 #ifndef STORAGES_RT_MUTABLE_GRAPH_CSR_IMMUTABLE_CSR_H_
17 #define STORAGES_RT_MUTABLE_GRAPH_CSR_IMMUTABLE_CSR_H_
18 
19 namespace gs {
20 
21 template <typename EDATA_T>
24 
25  public:
27  : cur_(slice.begin()), end_(slice.end()) {}
28  ~ImmutableCsrConstEdgeIter() = default;
29 
30  vid_t get_neighbor() const override { return (*cur_).get_neighbor(); }
31  Any get_data() const override {
32  return AnyConverter<EDATA_T>::to_any((*cur_).get_data());
33  }
34  timestamp_t get_timestamp() const override { return 0; }
35 
36  void next() override { ++cur_; }
37  CsrConstEdgeIterBase& operator+=(size_t offset) override {
38  cur_ += offset;
39  if (!(cur_ < end_)) {
40  cur_ = end_;
41  }
42  return *this;
43  }
44  bool is_valid() const override { return cur_ != end_; }
45  size_t size() const override { return end_ - cur_; }
46 
47  private:
50 };
51 
52 template <typename EDATA_T>
53 class ImmutableCsr : public TypedImmutableCsrBase<EDATA_T> {
54  public:
57 
58  size_t batch_init(const std::string& name, const std::string& work_dir,
59  const std::vector<int>& degree,
60  double reserve_ratio) override {
61  size_t vnum = degree.size();
62  adj_lists_.open(work_dir + "/" + name + ".adj", true);
63  adj_lists_.resize(vnum);
64 
65  size_t edge_num = 0;
66  for (auto d : degree) {
67  edge_num += d;
68  }
69 
70  nbr_list_.open(work_dir + "/" + name + ".nbr", true);
71  nbr_list_.resize(edge_num);
72 
73  degree_list_.open(work_dir + "/" + name + ".deg", true);
74  degree_list_.resize(vnum);
75 
76  nbr_t* ptr = nbr_list_.data();
77  for (vid_t i = 0; i < vnum; ++i) {
78  int deg = degree[i];
79  if (deg != 0) {
80  adj_lists_[i] = ptr;
81  } else {
82  adj_lists_[i] = NULL;
83  }
84  ptr += deg;
85 
86  degree_list_[i] = 0;
87  }
88 
89  unsorted_since_ = 0;
90  return edge_num;
91  }
92 
93  size_t batch_init_in_memory(const std::vector<int>& degree,
94  double reserve_ratio) override {
95  size_t vnum = degree.size();
96  adj_lists_.open("", false);
97  adj_lists_.resize(vnum);
98 
99  size_t edge_num = 0;
100  for (auto d : degree) {
101  edge_num += d;
102  }
103 
104  nbr_list_.open("", false);
105  nbr_list_.resize(edge_num);
106 
107  degree_list_.open("", false);
108  degree_list_.resize(vnum);
109 
110  nbr_t* ptr = nbr_list_.data();
111  for (vid_t i = 0; i < vnum; ++i) {
112  int deg = degree[i];
113  if (deg != 0) {
114  adj_lists_[i] = ptr;
115  } else {
116  adj_lists_[i] = NULL;
117  }
118  ptr += deg;
119 
120  degree_list_[i] = 0;
121  }
122 
123  unsorted_since_ = 0;
124  return edge_num;
125  }
126 
127  void batch_put_edge(vid_t src, vid_t dst, const EDATA_T& data,
128  timestamp_t ts) override {
129  auto& nbr = adj_lists_[src][degree_list_[src]++];
130  nbr.neighbor = dst;
131  nbr.data = data;
132  }
133 
135  size_t vnum = adj_lists_.size();
136  for (size_t i = 0; i != vnum; ++i) {
137  std::sort(adj_lists_[i], adj_lists_[i] + degree_list_[i],
138  [](const nbr_t& lhs, const nbr_t& rhs) {
139  return lhs.data < rhs.data;
140  });
141  }
142  unsorted_since_ = ts;
143  }
144 
145  timestamp_t unsorted_since() const override { return unsorted_since_; }
146 
147  void open(const std::string& name, const std::string& snapshot_dir,
148  const std::string& work_dir) override {
149  // Changes made to the CSR will not be synchronized to the file
150  // TODO(luoxiaojian): Implement the insert operation on ImmutableCsr.
151  if (snapshot_dir != "") {
152  degree_list_.open(snapshot_dir + "/" + name + ".deg", false);
153  nbr_list_.open(snapshot_dir + "/" + name + ".nbr", false);
154  load_meta(snapshot_dir + "/" + name);
155  }
156 
157  adj_lists_.open(work_dir + "/" + name + ".adj", true);
158  adj_lists_.resize(degree_list_.size());
159 
160  nbr_t* ptr = nbr_list_.data();
161  for (size_t i = 0; i < degree_list_.size(); ++i) {
162  int deg = degree_list_[i];
163  adj_lists_[i] = ptr;
164  ptr += deg;
165  }
166  }
167 
168  void open_in_memory(const std::string& prefix, size_t v_cap) override {
169  degree_list_.open(prefix + ".deg", false);
170  load_meta(prefix);
171  nbr_list_.open(prefix + ".nbr", false);
172  adj_lists_.reset();
173  v_cap = std::max(v_cap, degree_list_.size());
174  adj_lists_.resize(v_cap);
175  size_t old_degree_size = degree_list_.size();
176  degree_list_.resize(v_cap);
177 
178  nbr_t* ptr = nbr_list_.data();
179  for (size_t i = 0; i < old_degree_size; ++i) {
180  int deg = degree_list_[i];
181  if (deg != 0) {
182  adj_lists_[i] = ptr;
183  } else {
184  adj_lists_[i] = NULL;
185  }
186  ptr += deg;
187  }
188  for (size_t i = old_degree_size; i < degree_list_.size(); ++i) {
189  degree_list_[i] = 0;
190  adj_lists_[i] = NULL;
191  }
192  }
193 
194  void open_with_hugepages(const std::string& prefix, size_t v_cap) override {
195  degree_list_.open_with_hugepages(prefix + ".deg", v_cap);
196  load_meta(prefix);
197  nbr_list_.open_with_hugepages(prefix + ".nbr");
198  adj_lists_.reset();
199  v_cap = std::max(v_cap, degree_list_.size());
200  adj_lists_.resize(v_cap);
201  size_t old_degree_size = degree_list_.size();
202  degree_list_.resize(v_cap);
203 
204  nbr_t* ptr = nbr_list_.data();
205  for (size_t i = 0; i < old_degree_size; ++i) {
206  int deg = degree_list_[i];
207  if (deg != 0) {
208  adj_lists_[i] = ptr;
209  } else {
210  adj_lists_[i] = NULL;
211  }
212  ptr += deg;
213  }
214  for (size_t i = old_degree_size; i < degree_list_.size(); ++i) {
215  degree_list_[i] = 0;
216  adj_lists_[i] = NULL;
217  }
218  }
219 
220  void dump(const std::string& name,
221  const std::string& new_snapshot_dir) override {
222  dump_meta(new_snapshot_dir + "/" + name);
223  size_t vnum = adj_lists_.size();
224  {
225  FILE* fout =
226  fopen((new_snapshot_dir + "/" + name + ".deg").c_str(), "wb");
227  fwrite(degree_list_.data(), sizeof(int), vnum, fout);
228  fflush(fout);
229  fclose(fout);
230  }
231  {
232  FILE* fout =
233  fopen((new_snapshot_dir + "/" + name + ".nbr").c_str(), "wb");
234  for (size_t k = 0; k < vnum; ++k) {
235  if (adj_lists_[k] != NULL && degree_list_[k] != 0) {
236  fwrite(adj_lists_[k], sizeof(nbr_t), degree_list_[k], fout);
237  }
238  }
239  fflush(fout);
240  fclose(fout);
241  }
242  }
243 
244  void warmup(int thread_num) const override {}
245 
246  void resize(vid_t vnum) override {
247  if (vnum > adj_lists_.size()) {
248  size_t old_size = adj_lists_.size();
249  adj_lists_.resize(vnum);
250  for (size_t k = old_size; k != vnum; ++k) {
251  adj_lists_[k] = NULL;
252  degree_list_[k] = 0;
253  }
254  } else {
255  adj_lists_.resize(vnum);
256  degree_list_.resize(vnum);
257  }
258  }
259 
260  size_t size() const override { return adj_lists_.size(); }
261 
262  size_t edge_num() const override {
263  size_t ret = 0;
264  for (size_t i = 0; i < adj_lists_.size(); ++i) {
265  ret += degree_list_[i];
266  }
267  return ret;
268  }
269 
270  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
271  return std::make_shared<ImmutableCsrConstEdgeIter<EDATA_T>>(get_edges(v));
272  }
275  }
276  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
277  return nullptr;
278  }
279 
280  void put_edge(vid_t src, vid_t dst, const EDATA_T& data, timestamp_t ts,
281  Allocator& alloc) override {
282  LOG(FATAL) << "Put single edge is not supported";
283  }
284 
285  slice_t get_edges(vid_t v) const override {
286  slice_t ret;
287  ret.set_begin(adj_lists_[v]);
288  ret.set_size(degree_list_[v]);
289  return ret;
290  }
291 
292  void close() override {
293  adj_lists_.reset();
295  nbr_list_.reset();
296  }
297 
298  private:
299  void load_meta(const std::string& prefix) {
300  std::string meta_file_path = prefix + ".meta";
301  if (std::filesystem::exists(meta_file_path)) {
302  FILE* meta_file_fd = fopen(meta_file_path.c_str(), "r");
303  CHECK_EQ(fread(&unsorted_since_, sizeof(timestamp_t), 1, meta_file_fd),
304  1);
305  fclose(meta_file_fd);
306  } else {
307  unsorted_since_ = 0;
308  }
309  }
310 
311  void dump_meta(const std::string& prefix) const {
312  std::string meta_file_path = prefix + ".meta";
313  FILE* meta_file_fd = fopen((prefix + ".meta").c_str(), "wb");
314  CHECK_EQ(fwrite(&unsorted_since_, sizeof(timestamp_t), 1, meta_file_fd), 1);
315  fflush(meta_file_fd);
316  fclose(meta_file_fd);
317  }
318 
323 };
324 
325 template <typename EDATA_T>
326 class SingleImmutableCsr : public TypedImmutableCsrBase<EDATA_T> {
327  public:
330 
333 
334  size_t batch_init(const std::string& name, const std::string& work_dir,
335  const std::vector<int>& degree,
336  double reserve_ratio) override {
337  size_t vnum = degree.size();
338  nbr_list_.open(work_dir + "/" + name + ".snbr", true);
339  nbr_list_.resize(vnum);
340  for (size_t k = 0; k != vnum; ++k) {
341  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
342  }
343  return vnum;
344  }
345 
346  size_t batch_init_in_memory(const std::vector<int>& degree,
347  double reserve_ratio) override {
348  size_t vnum = degree.size();
349  nbr_list_.open("", false);
350  nbr_list_.resize(vnum);
351  for (size_t k = 0; k != vnum; ++k) {
352  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
353  }
354  return vnum;
355  }
356 
357  void batch_put_edge(vid_t src, vid_t dst, const EDATA_T& data,
358  timestamp_t ts) override {
359  CHECK_EQ(nbr_list_[src].neighbor, std::numeric_limits<vid_t>::max());
360  nbr_list_[src].neighbor = dst;
361  nbr_list_[src].data = data;
362  }
363 
365 
366  timestamp_t unsorted_since() const override {
367  return std::numeric_limits<timestamp_t>::max();
368  }
369 
370  void open(const std::string& name, const std::string& snapshot_dir,
371  const std::string& work_dir) override {
372  if (!std::filesystem::exists(work_dir + "/" + name + ".snbr")) {
373  copy_file(snapshot_dir + "/" + name + ".snbr",
374  work_dir + "/" + name + ".snbr");
375  }
376  nbr_list_.open(work_dir + "/" + name + ".snbr", true);
377  }
378 
379  void open_in_memory(const std::string& prefix, size_t v_cap) override {
380  nbr_list_.open(prefix + ".snbr", false);
381  if (nbr_list_.size() < v_cap) {
382  size_t old_size = nbr_list_.size();
383  nbr_list_.reset();
384  nbr_list_.resize(v_cap);
385  FILE* fin = fopen((prefix + ".snbr").c_str(), "r");
386  CHECK_EQ(fread(nbr_list_.data(), sizeof(nbr_t), old_size, fin), old_size);
387  fclose(fin);
388  for (size_t k = old_size; k != v_cap; ++k) {
389  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
390  }
391  }
392  }
393 
394  void open_with_hugepages(const std::string& prefix, size_t v_cap) override {
395  nbr_list_.open_with_hugepages(prefix + ".snbr", v_cap);
396  size_t old_size = nbr_list_.size();
397  if (old_size < v_cap) {
398  nbr_list_.resize(v_cap);
399  for (size_t k = old_size; k != v_cap; ++k) {
400  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
401  }
402  }
403  }
404 
405  void dump(const std::string& name,
406  const std::string& new_snapshot_dir) override {
407  if (!nbr_list_.filename().empty() &&
408  std::filesystem::exists(nbr_list_.filename())) {
409  std::filesystem::create_hard_link(
410  nbr_list_.filename(), new_snapshot_dir + "/" + name + ".snbr");
411  } else {
412  FILE* fp = fopen((new_snapshot_dir + "/" + name + ".snbr").c_str(), "wb");
413  fwrite(nbr_list_.data(), sizeof(nbr_t), nbr_list_.size(), fp);
414  fflush(fp);
415  fclose(fp);
416  }
417  }
418 
419  void warmup(int thread_num) const override {
420  size_t vnum = nbr_list_.size();
421  std::vector<std::thread> threads;
422  std::atomic<size_t> v_i(0);
423  std::atomic<size_t> output(0);
424  const size_t chunk = 4096;
425  for (int i = 0; i < thread_num; ++i) {
426  threads.emplace_back([&]() {
427  size_t ret = 0;
428  while (true) {
429  size_t begin = std::min(v_i.fetch_add(chunk), vnum);
430  size_t end = std::min(begin + chunk, vnum);
431  if (begin == end) {
432  break;
433  }
434  while (begin < end) {
435  auto& nbr = nbr_list_[begin];
436  ret += nbr.neighbor;
437  ++begin;
438  }
439  }
440  output.fetch_add(ret);
441  });
442  }
443  for (auto& thrd : threads) {
444  thrd.join();
445  }
446  (void) output.load();
447  }
448 
449  void resize(vid_t vnum) override {
450  if (vnum > nbr_list_.size()) {
451  size_t old_size = nbr_list_.size();
452  nbr_list_.resize(vnum);
453  for (size_t k = old_size; k != vnum; ++k) {
454  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
455  }
456  } else {
457  nbr_list_.resize(vnum);
458  }
459  }
460 
461  size_t size() const override { return nbr_list_.size(); }
462 
463  size_t edge_num() const override {
464  size_t ret = 0;
465  for (size_t i = 0; i < nbr_list_.size(); ++i) {
466  if (nbr_list_[i].neighbor != std::numeric_limits<vid_t>::max()) {
467  ++ret;
468  }
469  }
470  return ret;
471  }
472 
473  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
474  return std::make_shared<ImmutableCsrConstEdgeIter<EDATA_T>>(get_edges(v));
475  }
476 
479  }
480 
481  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
482  return nullptr;
483  }
484 
485  void put_edge(vid_t src, vid_t dst, const EDATA_T& data, timestamp_t ts,
486  Allocator&) override {
487  CHECK_LT(src, nbr_list_.size());
488  CHECK_EQ(nbr_list_[src].neighbor, std::numeric_limits<vid_t>::max());
489  nbr_list_[src].neighbor = dst;
490  nbr_list_[src].data = data;
491  }
492 
493  slice_t get_edges(vid_t i) const override {
494  slice_t ret;
495  ret.set_size(
496  nbr_list_[i].neighbor == std::numeric_limits<vid_t>::max() ? 0 : 1);
497  if (ret.size() != 0) {
498  ret.set_begin(&nbr_list_[i]);
499  }
500  return ret;
501  }
502 
503  void close() override { nbr_list_.reset(); }
504 
505  const nbr_t& get_edge(vid_t i) const { return nbr_list_[i]; }
506 
507  private:
509 };
510 
511 template <>
512 class SingleImmutableCsr<std::string_view>
513  : public TypedImmutableCsrBase<std::string_view> {
514  public:
517 
518  SingleImmutableCsr(StringColumn& column) : column_(column) {}
520 
521  size_t batch_init(const std::string& name, const std::string& work_dir,
522  const std::vector<int>& degree,
523  double reserve_ratio) override {
524  size_t vnum = degree.size();
525  nbr_list_.open(work_dir + "/" + name + ".snbr", true);
526  nbr_list_.resize(vnum);
527  for (size_t k = 0; k != vnum; ++k) {
528  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
529  }
530  return vnum;
531  }
532 
533  size_t batch_init_in_memory(const std::vector<int>& degree,
534  double reserve_ratio) override {
535  size_t vnum = degree.size();
536  nbr_list_.open("", false);
537  nbr_list_.resize(vnum);
538  for (size_t k = 0; k != vnum; ++k) {
539  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
540  }
541  return vnum;
542  }
543 
544  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
545  timestamp_t ts) override {
546  CHECK_EQ(nbr_list_[src].neighbor, std::numeric_limits<vid_t>::max());
547  nbr_list_[src].neighbor = dst;
548  nbr_list_[src].data = data;
549  }
550 
552 
553  timestamp_t unsorted_since() const override {
554  return std::numeric_limits<timestamp_t>::max();
555  }
556 
557  void open(const std::string& name, const std::string& snapshot_dir,
558  const std::string& work_dir) override {
559  if (!std::filesystem::exists(work_dir + "/" + name + ".snbr")) {
560  copy_file(snapshot_dir + "/" + name + ".snbr",
561  work_dir + "/" + name + ".snbr");
562  }
563  nbr_list_.open(work_dir + "/" + name + ".snbr", true);
564  }
565 
566  void open_in_memory(const std::string& prefix, size_t v_cap) override {
567  nbr_list_.open(prefix + ".snbr", false);
568  if (nbr_list_.size() < v_cap) {
569  size_t old_size = nbr_list_.size();
570  nbr_list_.reset();
571  nbr_list_.resize(v_cap);
572  FILE* fin = fopen((prefix + ".snbr").c_str(), "r");
573  CHECK_EQ(fread(nbr_list_.data(), sizeof(nbr_t), old_size, fin), old_size);
574  fclose(fin);
575  for (size_t k = old_size; k != v_cap; ++k) {
576  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
577  }
578  }
579  }
580 
581  void open_with_hugepages(const std::string& prefix, size_t v_cap) override {
582  nbr_list_.open_with_hugepages(prefix + ".snbr", v_cap);
583  size_t old_size = nbr_list_.size();
584  if (old_size < v_cap) {
585  nbr_list_.resize(v_cap);
586  for (size_t k = old_size; k != v_cap; ++k) {
587  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
588  }
589  }
590  }
591 
592  void dump(const std::string& name,
593  const std::string& new_snapshot_dir) override {
594  if (!nbr_list_.filename().empty() &&
595  std::filesystem::exists(nbr_list_.filename())) {
596  std::filesystem::create_hard_link(
597  nbr_list_.filename(), new_snapshot_dir + "/" + name + ".snbr");
598  } else {
599  FILE* fp = fopen((new_snapshot_dir + "/" + name + ".snbr").c_str(), "wb");
600  fwrite(nbr_list_.data(), sizeof(nbr_t), nbr_list_.size(), fp);
601  fflush(fp);
602  fclose(fp);
603  }
604  }
605 
606  void warmup(int thread_num) const override {
607  size_t vnum = nbr_list_.size();
608  std::vector<std::thread> threads;
609  std::atomic<size_t> v_i(0);
610  std::atomic<size_t> output(0);
611  const size_t chunk = 4096;
612  for (int i = 0; i < thread_num; ++i) {
613  threads.emplace_back([&]() {
614  size_t ret = 0;
615  while (true) {
616  size_t begin = std::min(v_i.fetch_add(chunk), vnum);
617  size_t end = std::min(begin + chunk, vnum);
618  if (begin == end) {
619  break;
620  }
621  while (begin < end) {
622  auto& nbr = nbr_list_[begin];
623  ret += nbr.neighbor;
624  ++begin;
625  }
626  }
627  output.fetch_add(ret);
628  });
629  }
630  for (auto& thrd : threads) {
631  thrd.join();
632  }
633  (void) output.load();
634  }
635 
636  void resize(vid_t vnum) override {
637  if (vnum > nbr_list_.size()) {
638  size_t old_size = nbr_list_.size();
639  nbr_list_.resize(vnum);
640  for (size_t k = old_size; k != vnum; ++k) {
641  nbr_list_[k].neighbor = std::numeric_limits<vid_t>::max();
642  }
643  } else {
644  nbr_list_.resize(vnum);
645  }
646  }
647 
648  size_t size() const override { return nbr_list_.size(); }
649 
650  size_t edge_num() const override {
651  size_t ret = 0;
652  for (size_t i = 0; i < nbr_list_.size(); ++i) {
653  if (nbr_list_[i].neighbor != std::numeric_limits<vid_t>::max()) {
654  ++ret;
655  }
656  }
657  return ret;
658  }
659 
660  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
661  return std::make_shared<ImmutableCsrConstEdgeIter<std::string_view>>(
662  get_edges(v));
663  }
664 
667  }
668 
669  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
670  return nullptr;
671  }
672 
673  void put_edge_with_index(vid_t src, vid_t dst, size_t data, timestamp_t ts,
674  Allocator&) override {
675  CHECK_LT(src, nbr_list_.size());
676  CHECK_EQ(nbr_list_[src].neighbor, std::numeric_limits<vid_t>::max());
677  nbr_list_[src].neighbor = dst;
678  nbr_list_[src].data = data;
679  }
680 
681  slice_t get_edges(vid_t i) const override {
682  slice_t ret(column_);
683  ret.set_size(
684  nbr_list_[i].neighbor == std::numeric_limits<vid_t>::max() ? 0 : 1);
685  if (ret.size() != 0) {
686  ret.set_begin(&nbr_list_[i]);
687  }
688  return ret;
689  }
690 
693  nbr.neighbor = nbr_list_[i].neighbor;
694  nbr.data = column_.get_view(nbr_list_[i].data);
695  return nbr;
696  }
697  void close() override { nbr_list_.reset(); }
698 
699  private:
702 };
703 
704 } // namespace gs
705 
706 #endif // STORAGES_RT_MUTABLE_GRAPH_CSR_IMMUTABLE_CSR_H_
gs::ImmutableCsr::nbr_list_
mmap_array< nbr_t > nbr_list_
Definition: immutable_csr.h:321
gs::SingleImmutableCsr::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: immutable_csr.h:481
gs::ImmutableNbrSlice< std::string_view >
Definition: nbr.h:130
gs::ImmutableCsrConstEdgeIter::end_
const_nbr_ptr_t end_
Definition: immutable_csr.h:49
gs::SingleImmutableCsr< std::string_view >::open_with_hugepages
void open_with_hugepages(const std::string &prefix, size_t v_cap) override
Definition: immutable_csr.h:581
gs::Any
Definition: types.h:383
gs::ImmutableCsr::adj_lists_
mmap_array< nbr_t * > adj_lists_
Definition: immutable_csr.h:319
gs::ImmutableCsr
Definition: immutable_csr.h:53
gs::ImmutableCsr::batch_init
size_t batch_init(const std::string &name, const std::string &work_dir, const std::vector< int > &degree, double reserve_ratio) override
Definition: immutable_csr.h:58
gs::ImmutableCsr::close
void close() override
Definition: immutable_csr.h:292
gs::timestamp_t
uint32_t timestamp_t
Definition: types.h:30
gs::SingleImmutableCsr< std::string_view >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t data, timestamp_t ts, Allocator &) override
Definition: immutable_csr.h:673
gs::ImmutableCsr::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: immutable_csr.h:147
gs::ImmutableCsr::resize
void resize(vid_t vnum) override
Definition: immutable_csr.h:246
gs::SingleImmutableCsr< std::string_view >::column_
StringColumn & column_
Definition: immutable_csr.h:700
gs::ImmutableCsr::unsorted_since
timestamp_t unsorted_since() const override
Definition: immutable_csr.h:145
gs::ImmutableCsrConstEdgeIter::get_timestamp
timestamp_t get_timestamp() const override
Definition: immutable_csr.h:34
gs::SingleImmutableCsr::size
size_t size() const override
Definition: immutable_csr.h:461
gs::SingleImmutableCsr::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: immutable_csr.h:370
gs::SingleImmutableCsr< std::string_view >::SingleImmutableCsr
SingleImmutableCsr(StringColumn &column)
Definition: immutable_csr.h:518
gs::ImmutableCsr::get_edges
slice_t get_edges(vid_t v) const override
Definition: immutable_csr.h:285
gs::ImmutableNbrSlice
Definition: nbr.h:100
gs::SingleImmutableCsr::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: immutable_csr.h:364
gs::ImmutableNbrSlice::set_begin
void set_begin(const_nbr_ptr_t ptr)
Definition: nbr.h:112
gs::SingleImmutableCsr::batch_put_edge
void batch_put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts) override
Definition: immutable_csr.h:357
gs::ImmutableCsrConstEdgeIter::operator+=
CsrConstEdgeIterBase & operator+=(size_t offset) override
Definition: immutable_csr.h:37
gs::SingleImmutableCsr::SingleImmutableCsr
SingleImmutableCsr()
Definition: immutable_csr.h:331
gs::SingleImmutableCsr::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: immutable_csr.h:346
gs::vid_t
uint32_t vid_t
Definition: types.h:31
gs::ImmutableCsrConstEdgeIter::cur_
const_nbr_ptr_t cur_
Definition: immutable_csr.h:48
gs::ImmutableNbr::neighbor
vid_t neighbor
Definition: nbr.h:49
gs::SingleImmutableCsr< std::string_view >::resize
void resize(vid_t vnum) override
Definition: immutable_csr.h:636
gs::mmap_array::resize
void resize(size_t size)
Definition: mmap_array.h:319
gs::SingleImmutableCsr::~SingleImmutableCsr
~SingleImmutableCsr()
Definition: immutable_csr.h:332
gs::SingleImmutableCsr< std::string_view >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: immutable_csr.h:566
gs::ImmutableCsrConstEdgeIter::const_nbr_ptr_t
typename ImmutableNbrSlice< EDATA_T >::const_nbr_ptr_t const_nbr_ptr_t
Definition: immutable_csr.h:23
gs::SingleImmutableCsr::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: immutable_csr.h:405
gs::ImmutableCsr::dump_meta
void dump_meta(const std::string &prefix) const
Definition: immutable_csr.h:311
gs
Definition: adj_list.h:23
gs::ImmutableCsr::load_meta
void load_meta(const std::string &prefix)
Definition: immutable_csr.h:299
gs::SingleImmutableCsr< std::string_view >::nbr_list_
mmap_array< nbr_t > nbr_list_
Definition: immutable_csr.h:701
gs::SingleImmutableCsr::edge_num
size_t edge_num() const override
Definition: immutable_csr.h:463
gs::ImmutableCsrConstEdgeIter
Definition: immutable_csr.h:22
gs::SingleImmutableCsr< std::string_view >::batch_init
size_t batch_init(const std::string &name, const std::string &work_dir, const std::vector< int > &degree, double reserve_ratio) override
Definition: immutable_csr.h:521
gs::ImmutableCsr::unsorted_since_
timestamp_t unsorted_since_
Definition: immutable_csr.h:322
gs::ImmutableCsr::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: immutable_csr.h:168
gs::SingleImmutableCsr::put_edge
void put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts, Allocator &) override
Definition: immutable_csr.h:485
gs::ImmutableNbrSlice< std::string_view >::size
int size() const
Definition: nbr.h:173
gs::mmap_array::open
void open(const std::string &filename, bool sync_to_file=false)
Definition: mmap_array.h:129
gs::ArenaAllocator
Definition: allocators.h:29
gs::ImmutableNbrSlice::set_size
void set_size(int size)
Definition: nbr.h:109
gs::SingleImmutableCsr< std::string_view >::close
void close() override
Definition: immutable_csr.h:697
gs::ImmutableCsr::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: immutable_csr.h:270
gs::ImmutableCsr::size
size_t size() const override
Definition: immutable_csr.h:260
gs::CsrConstEdgeIterBase
Definition: csr_base.h:27
gs::mmap_array::data
T * data()
Definition: mmap_array.h:405
gs::SingleImmutableCsr::unsorted_since
timestamp_t unsorted_since() const override
Definition: immutable_csr.h:366
gs::SingleImmutableCsr< std::string_view >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: immutable_csr.h:665
gs::TypedColumn< std::string_view >
Definition: column.h:338
gs::TypedImmutableCsrBase
Definition: csr_base.h:127
gs::mmap_array::size
size_t size() const
Definition: mmap_array.h:415
gs::ImmutableCsr::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: immutable_csr.h:220
gs::ImmutableCsr::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: immutable_csr.h:134
gs::SingleImmutableCsr
Definition: immutable_csr.h:326
gs::ImmutableCsrConstEdgeIter::get_neighbor
vid_t get_neighbor() const override
Definition: immutable_csr.h:30
gs::SingleImmutableCsr::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: immutable_csr.h:477
gs::SingleImmutableCsr::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: immutable_csr.h:379
gs::SingleImmutableCsr< std::string_view >::batch_put_edge_with_index
void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data, timestamp_t ts) override
Definition: immutable_csr.h:544
gs::ImmutableNbr::data
EDATA_T data
Definition: nbr.h:50
gs::ImmutableCsr::edge_num
size_t edge_num() const override
Definition: immutable_csr.h:262
gs::ImmutableCsr::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: immutable_csr.h:273
gs::ImmutableCsr::batch_put_edge
void batch_put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts) override
Definition: immutable_csr.h:127
gs::SingleImmutableCsr< std::string_view >::edge_num
size_t edge_num() const override
Definition: immutable_csr.h:650
gs::ImmutableCsr::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: immutable_csr.h:276
gs::ImmutableCsr::degree_list_
mmap_array< int > degree_list_
Definition: immutable_csr.h:320
gs::SingleImmutableCsr< std::string_view >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: immutable_csr.h:592
gs::SingleImmutableCsr< std::string_view >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: immutable_csr.h:669
gs::ImmutableNbrSlice< std::string_view >::set_size
void set_size(int size)
Definition: nbr.h:172
gs::SingleImmutableCsr< std::string_view >::get_edge
ImmutableNbr< std::string_view > get_edge(vid_t i) const
Definition: immutable_csr.h:691
gs::SingleImmutableCsr< std::string_view >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: immutable_csr.h:557
gs::SingleImmutableCsr< std::string_view >::size
size_t size() const override
Definition: immutable_csr.h:648
gs::copy_file
void copy_file(const std::string &src, const std::string &dst)
Definition: file_names.h:80
gs::ImmutableCsrConstEdgeIter::next
void next() override
Definition: immutable_csr.h:36
gs::SingleImmutableCsr::resize
void resize(vid_t vnum) override
Definition: immutable_csr.h:449
gs::mmap_array
Definition: mmap_array.h:65
gs::ImmutableCsrConstEdgeIter::~ImmutableCsrConstEdgeIter
~ImmutableCsrConstEdgeIter()=default
gs::snapshot_dir
std::string snapshot_dir(const std::string &work_dir, uint32_t version)
Definition: file_names.h:192
std
Definition: loading_config.h:232
gs::SingleImmutableCsr< std::string_view >::unsorted_since
timestamp_t unsorted_since() const override
Definition: immutable_csr.h:553
gs::SingleImmutableCsr< std::string_view >::~SingleImmutableCsr
~SingleImmutableCsr()
Definition: immutable_csr.h:519
gs::SingleImmutableCsr< std::string_view >::warmup
void warmup(int thread_num) const override
Definition: immutable_csr.h:606
gs::SingleImmutableCsr::warmup
void warmup(int thread_num) const override
Definition: immutable_csr.h:419
gs::SingleImmutableCsr< std::string_view >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: immutable_csr.h:533
gs::SingleImmutableCsr::nbr_list_
mmap_array< nbr_t > nbr_list_
Definition: immutable_csr.h:508
gs::ImmutableNbr
Definition: nbr.h:29
gs::ImmutableCsr::open_with_hugepages
void open_with_hugepages(const std::string &prefix, size_t v_cap) override
Definition: immutable_csr.h:194
gs::AnyConverter
Definition: types.h:381
gs::ImmutableCsrConstEdgeIter::get_data
Any get_data() const override
Definition: immutable_csr.h:31
gs::SingleImmutableCsr::open_with_hugepages
void open_with_hugepages(const std::string &prefix, size_t v_cap) override
Definition: immutable_csr.h:394
gs::mmap_array::open_with_hugepages
void open_with_hugepages(const std::string &filename, size_t capacity=0)
Definition: mmap_array.h:214
gs::SingleImmutableCsr::close
void close() override
Definition: immutable_csr.h:503
gs::SingleImmutableCsr::get_edge
const nbr_t & get_edge(vid_t i) const
Definition: immutable_csr.h:505
gs::SingleImmutableCsr< std::string_view >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: immutable_csr.h:660
gs::SingleImmutableCsr< std::string_view >::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: immutable_csr.h:551
gs::ImmutableCsrConstEdgeIter::is_valid
bool is_valid() const override
Definition: immutable_csr.h:44
gs::ImmutableNbrSlice< std::string_view >::set_begin
void set_begin(const ImmutableNbr< size_t > *ptr)
Definition: nbr.h:175
gs::ImmutableCsrConstEdgeIter::ImmutableCsrConstEdgeIter
ImmutableCsrConstEdgeIter(const ImmutableNbrSlice< EDATA_T > &slice)
Definition: immutable_csr.h:26
gs::ImmutableNbrSlice::size
int size() const
Definition: nbr.h:110
gs::SingleImmutableCsr::batch_init
size_t batch_init(const std::string &name, const std::string &work_dir, const std::vector< int > &degree, double reserve_ratio) override
Definition: immutable_csr.h:334
gs::mmap_array::reset
void reset()
Definition: mmap_array.h:84
gs::SingleImmutableCsr::get_edges
slice_t get_edges(vid_t i) const override
Definition: immutable_csr.h:493
gs::ImmutableCsrConstEdgeIter::size
size_t size() const override
Definition: immutable_csr.h:45
gs::ImmutableCsr::put_edge
void put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts, Allocator &alloc) override
Definition: immutable_csr.h:280
gs::ImmutableCsr::warmup
void warmup(int thread_num) const override
Definition: immutable_csr.h:244
gs::SingleImmutableCsr::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: immutable_csr.h:473
gs::ImmutableCsr::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: immutable_csr.h:93
gs::SingleImmutableCsr< std::string_view >::get_edges
slice_t get_edges(vid_t i) const override
Definition: immutable_csr.h:681