Flex  0.17.9
mutable_csr.h
Go to the documentation of this file.
1 
16 #ifndef STORAGES_RT_MUTABLE_GRAPH_CSR_MUTABLE_CSR_H_
17 #define STORAGES_RT_MUTABLE_GRAPH_CSR_MUTABLE_CSR_H_
18 
19 #include <thread>
20 
21 #include "grape/utils/concurrent_queue.h"
22 
26 
27 namespace gs {
28 
29 void read_file(const std::string& filename, void* buffer, size_t size,
30  size_t num);
31 
32 void write_file(const std::string& filename, const void* buffer, size_t size,
33  size_t num);
34 
35 template <typename EDATA_T>
38 
39  public:
41  : cur_(slice.begin()), end_(slice.end()) {}
42  ~MutableCsrConstEdgeIter() = default;
43 
44  vid_t get_neighbor() const override { return (*cur_).get_neighbor(); }
45  Any get_data() const override {
46  return AnyConverter<EDATA_T>::to_any((*cur_).get_data());
47  }
48  timestamp_t get_timestamp() const override { return (*cur_).get_timestamp(); }
49 
50  void next() override { ++cur_; }
51  CsrConstEdgeIterBase& operator+=(size_t offset) override {
52  cur_ += offset;
53  if (!(cur_ < end_)) {
54  cur_ = end_;
55  }
56  return *this;
57  }
58  bool is_valid() const override { return cur_ != end_; }
59  size_t size() const override { return end_ - cur_; }
60 
61  private:
64 };
65 
66 template <typename EDATA_T>
69 
70  public:
72  : cur_(slice.begin()), end_(slice.end()) {}
73  ~MutableCsrEdgeIter() = default;
74 
75  vid_t get_neighbor() const override { return cur_->neighbor; }
76  Any get_data() const override {
78  }
79  timestamp_t get_timestamp() const override { return cur_->timestamp.load(); }
80 
81  void set_data(const Any& value, timestamp_t ts) override {
83  cur_->timestamp.store(ts);
84  }
85 
86  CsrEdgeIterBase& operator+=(size_t offset) override {
87  if (cur_ + offset >= end_) {
88  cur_ = end_;
89  } else {
90  cur_ += offset;
91  }
92  return *this;
93  }
94 
95  void next() override { ++cur_; }
96  bool is_valid() const override { return cur_ != end_; }
97  size_t size() const override { return end_ - cur_; }
98 
99  private:
102 };
103 
104 template <>
105 class MutableCsrEdgeIter<std::string_view> : public CsrEdgeIterBase {
107 
108  public:
110  : cur_(slice.begin()), end_(slice.end()) {}
111  ~MutableCsrEdgeIter() = default;
112 
113  vid_t get_neighbor() const override { return cur_.get_neighbor(); }
114  Any get_data() const override {
116  }
117  timestamp_t get_timestamp() const override { return cur_.get_timestamp(); }
118 
119  void set_data(const Any& value, timestamp_t ts) override {
120  cur_.set_data(value.AsStringView(), ts);
121  }
122  size_t get_index() const { return cur_.get_index(); }
124 
125  CsrEdgeIterBase& operator+=(size_t offset) override {
126  cur_ += offset;
127  if (!(cur_ < end_)) {
128  cur_ = end_;
129  }
130  return *this;
131  }
132 
133  void next() override { ++cur_; }
134  bool is_valid() const override { return cur_ != end_; }
135  size_t size() const override { return end_.ptr_ - cur_.ptr_; }
136 
137  private:
140 };
141 
142 template <>
145 
146  public:
148  : cur_(slice.begin()), end_(slice.end()) {}
149  ~MutableCsrEdgeIter() = default;
150 
151  vid_t get_neighbor() const override { return cur_->get_neighbor(); }
152  Any get_data() const override {
154  }
155  size_t get_index() const { return cur_.get_index(); }
156 
157  timestamp_t get_timestamp() const override { return cur_->get_timestamp(); }
158 
160 
161  void set_data(const Any& value, timestamp_t ts) override {
162  Record rv = value.AsRecord();
163  cur_->set_data(rv, ts);
164  }
165 
166  CsrEdgeIterBase& operator+=(size_t offset) override {
167  cur_ += offset;
168  if (!(cur_ < end_)) {
169  cur_ = end_;
170  }
171  return *this;
172  }
173 
174  void next() override { ++cur_; }
175  bool is_valid() const override { return cur_ != end_; }
176  size_t size() const override { return end_ - cur_; }
177 
178  private:
181 };
182 template <typename EDATA_T>
183 class MutableCsr : public TypedMutableCsrBase<EDATA_T> {
184  public:
189 
190  MutableCsr() : locks_(nullptr) {}
192  if (locks_ != nullptr) {
193  delete[] locks_;
194  }
195  }
196 
197  size_t batch_init(const std::string& name, const std::string& work_dir,
198  const std::vector<int>& degree,
199  double reserve_ratio) override {
200  reserve_ratio = std::max(reserve_ratio, 1.0);
201  size_t vnum = degree.size();
202  adj_lists_.open(work_dir + "/" + name + ".adj", true);
203  adj_lists_.resize(vnum);
204 
205  locks_ = new grape::SpinLock[vnum];
206 
207  size_t edge_num = 0;
208  for (auto d : degree) {
209  edge_num += (std::ceil(d * reserve_ratio));
210  }
211  nbr_list_.open(work_dir + "/" + name + ".nbr", true);
212  nbr_list_.resize(edge_num);
213 
214  nbr_t* ptr = nbr_list_.data();
215  for (vid_t i = 0; i < vnum; ++i) {
216  int deg = degree[i];
217  int cap = std::ceil(deg * reserve_ratio);
218  adj_lists_[i].init(ptr, cap, 0);
219  ptr += cap;
220  }
221 
222  unsorted_since_ = 0;
223  return edge_num;
224  }
225 
226  size_t batch_init_in_memory(const std::vector<int>& degree,
227  double reserve_ratio) override {
228  reserve_ratio = std::max(reserve_ratio, 1.0);
229  size_t vnum = degree.size();
230  adj_lists_.open("", false);
231  adj_lists_.resize(vnum);
232 
233  locks_ = new grape::SpinLock[vnum];
234 
235  size_t edge_num = 0;
236  for (auto d : degree) {
237  edge_num += (std::ceil(d * reserve_ratio));
238  }
239  nbr_list_.open("", false);
240  nbr_list_.resize(edge_num);
241 
242  nbr_t* ptr = nbr_list_.data();
243  for (vid_t i = 0; i < vnum; ++i) {
244  int deg = degree[i];
245  int cap = std::ceil(deg * reserve_ratio);
246  adj_lists_[i].init(ptr, cap, 0);
247  ptr += cap;
248  }
249 
250  unsorted_since_ = 0;
251  return edge_num;
252  }
253 
254  void batch_put_edge(vid_t src, vid_t dst, const EDATA_T& data,
255  timestamp_t ts) override {
256  adj_lists_[src].batch_put_edge(dst, data, ts);
257  }
258 
260  size_t vnum = adj_lists_.size();
261  for (size_t i = 0; i != vnum; ++i) {
262  std::sort(adj_lists_[i].data(),
263  adj_lists_[i].data() + adj_lists_[i].size(),
264  [](const nbr_t& lhs, const nbr_t& rhs) {
265  return lhs.data < rhs.data;
266  });
267  }
268  unsorted_since_ = ts;
269  }
270 
271  timestamp_t unsorted_since() const override { return unsorted_since_; }
272 
273  void open(const std::string& name, const std::string& snapshot_dir,
274  const std::string& work_dir) override {
275  mmap_array<int> degree_list;
276  mmap_array<int>* cap_list = &degree_list;
277  if (snapshot_dir != "") {
278  degree_list.open(snapshot_dir + "/" + name + ".deg", false);
279  if (std::filesystem::exists(snapshot_dir + "/" + name + ".cap")) {
280  cap_list = new mmap_array<int>();
281  cap_list->open(snapshot_dir + "/" + name + ".cap", false);
282  }
283  nbr_list_.open(snapshot_dir + "/" + name + ".nbr", false);
284  load_meta(snapshot_dir + "/" + name);
285  }
286  nbr_list_.touch(work_dir + "/" + name + ".nbr");
287  adj_lists_.open(work_dir + "/" + name + ".adj", true);
288 
289  adj_lists_.resize(degree_list.size());
290  locks_ = new grape::SpinLock[degree_list.size()];
291 
292  nbr_t* ptr = nbr_list_.data();
293  for (size_t i = 0; i < degree_list.size(); ++i) {
294  int degree = degree_list[i];
295  int cap = (*cap_list)[i];
296  adj_lists_[i].init(ptr, cap, degree);
297  ptr += cap;
298  }
299  if (cap_list != &degree_list) {
300  delete cap_list;
301  }
302  }
303 
304  void open_in_memory(const std::string& prefix, size_t v_cap) override {
305  mmap_array<int> degree_list;
306  degree_list.open(prefix + ".deg", false);
307  load_meta(prefix);
308  mmap_array<int>* cap_list = &degree_list;
309  if (std::filesystem::exists(prefix + ".cap")) {
310  cap_list = new mmap_array<int>();
311  cap_list->open(prefix + ".cap", false);
312  }
313 
314  nbr_list_.open(prefix + ".nbr", false);
315 
316  adj_lists_.reset();
317  v_cap = std::max(v_cap, degree_list.size());
318  adj_lists_.resize(v_cap);
319  locks_ = new grape::SpinLock[v_cap];
320 
321  nbr_t* ptr = nbr_list_.data();
322  for (size_t i = 0; i < degree_list.size(); ++i) {
323  int degree = degree_list[i];
324  int cap = (*cap_list)[i];
325  adj_lists_[i].init(ptr, cap, degree);
326  ptr += cap;
327  }
328  for (size_t i = degree_list.size(); i < v_cap; ++i) {
329  adj_lists_[i].init(ptr, 0, 0);
330  }
331 
332  if (cap_list != &degree_list) {
333  delete cap_list;
334  }
335  }
336 
337  void open_with_hugepages(const std::string& prefix, size_t v_cap) override {
338  mmap_array<int> degree_list;
339  degree_list.open(prefix + ".deg", false);
340  load_meta(prefix);
341  mmap_array<int>* cap_list = &degree_list;
342  if (std::filesystem::exists(prefix + ".cap")) {
343  cap_list = new mmap_array<int>();
344  cap_list->open(prefix + ".cap", false);
345  }
346 
347  nbr_list_.open_with_hugepages(prefix + ".nbr");
348 
349  adj_lists_.reset();
350  v_cap = std::max(v_cap, degree_list.size());
351  adj_lists_.open_with_hugepages("");
352  adj_lists_.resize(v_cap);
353  locks_ = new grape::SpinLock[v_cap];
354 
355  nbr_t* ptr = nbr_list_.data();
356  for (size_t i = 0; i < degree_list.size(); ++i) {
357  int degree = degree_list[i];
358  int cap = (*cap_list)[i];
359  adj_lists_[i].init(ptr, cap, degree);
360  ptr += cap;
361  }
362  for (size_t i = degree_list.size(); i < v_cap; ++i) {
363  adj_lists_[i].init(ptr, 0, 0);
364  }
365 
366  if (cap_list != &degree_list) {
367  delete cap_list;
368  }
369  }
370 
371  void dump(const std::string& name,
372  const std::string& new_snapshot_dir) override {
373  size_t vnum = adj_lists_.size();
374  bool reuse_nbr_list = true;
375  dump_meta(new_snapshot_dir + "/" + name);
376  mmap_array<int> degree_list;
377  std::vector<int> cap_list;
378  degree_list.open(new_snapshot_dir + "/" + name + ".deg", true);
379  degree_list.resize(vnum);
380  cap_list.resize(vnum);
381  bool need_cap_list = false;
382  size_t offset = 0;
383  for (size_t i = 0; i < vnum; ++i) {
384  if (adj_lists_[i].size() != 0) {
385  if (!(adj_lists_[i].data() == nbr_list_.data() + offset &&
386  offset < nbr_list_.size())) {
387  reuse_nbr_list = false;
388  }
389  }
390  offset += adj_lists_[i].capacity();
391 
392  degree_list[i] = adj_lists_[i].size();
393  cap_list[i] = adj_lists_[i].capacity();
394  if (degree_list[i] != cap_list[i]) {
395  need_cap_list = true;
396  }
397  }
398 
399  if (need_cap_list) {
400  write_file(new_snapshot_dir + "/" + name + ".cap", cap_list.data(),
401  sizeof(int), cap_list.size());
402  }
403 
404  if (reuse_nbr_list && !nbr_list_.filename().empty() &&
405  std::filesystem::exists(nbr_list_.filename())) {
406  std::error_code errorCode;
407  std::filesystem::create_hard_link(nbr_list_.filename(),
408  new_snapshot_dir + "/" + name + ".nbr",
409  errorCode);
410  if (errorCode) {
411  std::stringstream ss;
412  ss << "Failed to create hard link from " << nbr_list_.filename()
413  << " to " << new_snapshot_dir + "/" + name + ".snbr"
414  << ", error code: " << errorCode << " " << errorCode.message();
415  LOG(ERROR) << ss.str();
416  throw std::runtime_error(ss.str());
417  }
418  } else {
419  FILE* fout =
420  fopen((new_snapshot_dir + "/" + name + ".nbr").c_str(), "wb");
421  std::string filename = new_snapshot_dir + "/" + name + ".nbr";
422  if (fout == nullptr) {
423  std::stringstream ss;
424  ss << "Failed to open nbr list " << filename << ", " << strerror(errno);
425  LOG(ERROR) << ss.str();
426  throw std::runtime_error(ss.str());
427  }
428 
429  for (size_t i = 0; i < vnum; ++i) {
430  size_t ret{};
431  if ((ret = fwrite(adj_lists_[i].data(), sizeof(nbr_t),
432  adj_lists_[i].capacity(), fout)) !=
433  static_cast<size_t>(adj_lists_[i].capacity())) {
434  std::stringstream ss;
435  ss << "Failed to write nbr list " << filename << ", expected "
436  << adj_lists_[i].capacity() << ", got " << ret << ", "
437  << strerror(errno);
438  LOG(ERROR) << ss.str();
439  throw std::runtime_error(ss.str());
440  }
441  }
442  int ret = 0;
443  if ((ret = fflush(fout)) != 0) {
444  std::stringstream ss;
445  ss << "Failed to flush nbr list " << filename << ", error code: " << ret
446  << " " << strerror(errno);
447  LOG(ERROR) << ss.str();
448  throw std::runtime_error(ss.str());
449  }
450  if ((ret = fclose(fout)) != 0) {
451  std::stringstream ss;
452  ss << "Failed to close nbr list " << filename << ", error code: " << ret
453  << " " << strerror(errno);
454  LOG(ERROR) << ss.str();
455  throw std::runtime_error(ss.str());
456  }
457  }
458  }
459 
460  void warmup(int thread_num) const override {
461  size_t vnum = adj_lists_.size();
462  std::vector<std::thread> threads;
463  std::atomic<size_t> v_i(0);
464  const size_t chunk = 4096;
465  std::atomic<size_t> output(0);
466  for (int i = 0; i < thread_num; ++i) {
467  threads.emplace_back([&]() {
468  size_t ret = 0;
469  while (true) {
470  size_t begin = std::min(v_i.fetch_add(chunk), vnum);
471  size_t end = std::min(begin + chunk, vnum);
472 
473  if (begin == end) {
474  break;
475  }
476 
477  while (begin < end) {
478  auto adj_list = get_edges(begin);
479  for (auto& nbr : adj_list) {
480  ret += nbr.neighbor;
481  }
482  ++begin;
483  }
484  }
485  output.fetch_add(ret);
486  });
487  }
488  for (auto& thrd : threads) {
489  thrd.join();
490  }
491  (void) output.load();
492  }
493 
494  void resize(vid_t vnum) override {
495  if (vnum > adj_lists_.size()) {
496  size_t old_size = adj_lists_.size();
497  adj_lists_.resize(vnum);
498  for (size_t k = old_size; k != vnum; ++k) {
499  adj_lists_[k].init(NULL, 0, 0);
500  }
501  delete[] locks_;
502  locks_ = new grape::SpinLock[vnum];
503  } else {
504  adj_lists_.resize(vnum);
505  }
506  }
507  size_t size() const override { return adj_lists_.size(); }
508 
509  size_t edge_num() const override {
510  size_t res = 0;
511  for (size_t i = 0; i < adj_lists_.size(); ++i) {
512  res += adj_lists_[i].size();
513  }
514  return res;
515  }
516 
517  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
518  return std::make_shared<MutableCsrConstEdgeIter<EDATA_T>>(get_edges(v));
519  }
522  }
523  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
524  return std::make_shared<MutableCsrEdgeIter<EDATA_T>>(get_edges_mut(v));
525  }
526 
527  void put_edge(vid_t src, vid_t dst, const EDATA_T& data, timestamp_t ts,
528  Allocator& alloc) override {
529  CHECK_LT(src, adj_lists_.size());
530  locks_[src].lock();
531  adj_lists_[src].put_edge(dst, data, ts, alloc);
532  locks_[src].unlock();
533  }
534 
535  slice_t get_edges(vid_t v) const override {
536  return adj_lists_[v].get_edges();
537  }
538 
539  mut_slice_t get_edges_mut(vid_t i) { return adj_lists_[i].get_edges_mut(); }
540 
541  void close() override {
542  if (locks_ != nullptr) {
543  delete[] locks_;
544  locks_ = nullptr;
545  }
546  adj_lists_.reset();
547  nbr_list_.reset();
548  }
549 
550  private:
551  void load_meta(const std::string& prefix) {
552  std::string meta_file_path = prefix + ".meta";
553  if (std::filesystem::exists(meta_file_path)) {
554  read_file(meta_file_path, &unsorted_since_, sizeof(timestamp_t), 1);
555 
556  } else {
557  unsorted_since_ = 0;
558  }
559  }
560 
561  void dump_meta(const std::string& prefix) const {
562  std::string meta_file_path = prefix + ".meta";
563  write_file(meta_file_path, &unsorted_since_, sizeof(timestamp_t), 1);
564  }
565 
566  grape::SpinLock* locks_;
570 };
571 
572 template <>
573 class MutableCsr<std::string_view>
574  : public TypedMutableCsrBase<std::string_view> {
575  public:
580 
581  MutableCsr(StringColumn& column) : column_(column), csr_() {}
583 
584  size_t batch_init(const std::string& name, const std::string& work_dir,
585  const std::vector<int>& degree,
586  double reserve_ratio) override {
587  return csr_.batch_init(name, work_dir, degree, reserve_ratio);
588  }
589 
590  size_t batch_init_in_memory(const std::vector<int>& degree,
591  double reserve) override {
592  return csr_.batch_init_in_memory(degree, reserve);
593  }
594 
595  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
596  timestamp_t ts) override {
597  csr_.batch_put_edge(src, dst, data, ts);
598  }
599 
600  void open(const std::string& name, const std::string& snapshot_dir,
601  const std::string& work_dir) override {
602  csr_.open(name, snapshot_dir, work_dir);
603  }
604 
605  void open_in_memory(const std::string& prefix, size_t v_cap) override {
606  csr_.open_in_memory(prefix, v_cap);
607  }
608 
609  void dump(const std::string& name,
610  const std::string& new_snapshot_dir) override {
611  csr_.dump(name, new_snapshot_dir);
612  }
613 
614  void warmup(int thread_num) const override { csr_.warmup(thread_num); }
615 
616  void resize(vid_t vnum) override { csr_.resize(vnum); }
617 
618  size_t size() const override { return csr_.size(); }
619 
620  size_t edge_num() const override { return csr_.edge_num(); }
621 
622  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
623  return std::make_shared<MutableCsrConstEdgeIter<std::string_view>>(
624  get_edges(v));
625  }
626 
629  }
630  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
631  return std::make_shared<MutableCsrEdgeIter<std::string_view>>(
632  get_edges_mut(v));
633  }
634 
635  void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts,
636  Allocator& alloc) {
637  csr_.put_edge(src, dst, data, ts, alloc);
638  }
639 
640  void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts,
641  Allocator& alloc) override {
642  csr_.put_edge(src, dst, index, ts, alloc);
643  }
644 
645  slice_t get_edges(vid_t i) const override {
646  return slice_t(csr_.get_edges(i), column_);
647  }
648 
650  return mut_slice_t(csr_.get_edges_mut(i), column_);
651  }
652 
653  void close() override { csr_.close(); }
654 
655  private:
658 };
659 
660 template <>
661 class MutableCsr<RecordView> : public TypedMutableCsrBase<RecordView> {
662  public:
667  MutableCsr(Table& table) : table_(table), csr_() {}
669 
670  size_t batch_init(const std::string& name, const std::string& work_dir,
671  const std::vector<int>& degree,
672  double reserve_ratio = 1.2) override {
673  return csr_.batch_init(name, work_dir, degree, reserve_ratio);
674  }
675 
676  size_t batch_init_in_memory(const std::vector<int>& degree,
677  double reserve_ratio = 1.2) override {
678  return csr_.batch_init_in_memory(degree, reserve_ratio);
679  }
680 
681  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
682  timestamp_t ts = 0) override {
683  csr_.batch_put_edge(src, dst, data, ts);
684  }
685 
686  void open(const std::string& name, const std::string& snapshot_dir,
687  const std::string& work_dir) override {
688  csr_.open(name, snapshot_dir, work_dir);
689  }
690 
691  void open_in_memory(const std::string& prefix, size_t v_cap) override {
692  csr_.open_in_memory(prefix, v_cap);
693  }
694 
695  void dump(const std::string& name,
696  const std::string& new_snapshot_dir) override {
697  csr_.dump(name, new_snapshot_dir);
698  }
699 
700  void warmup(int thread_num) const override { csr_.warmup(thread_num); }
701 
702  void resize(vid_t vnum) override { csr_.resize(vnum); }
703 
704  size_t size() const override { return csr_.size(); }
705 
706  size_t edge_num() const override { return csr_.edge_num(); }
707 
708  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
709  return std::make_shared<MutableCsrConstEdgeIter<RecordView>>(get_edges(v));
710  }
711 
714  }
715  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
716  return std::make_shared<MutableCsrEdgeIter<RecordView>>(get_edges_mut(v));
717  }
718 
719  void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts,
720  Allocator& alloc) {
721  csr_.put_edge(src, dst, data, ts, alloc);
722  }
723 
724  void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts,
725  Allocator& alloc) override {
726  csr_.put_edge(src, dst, index, ts, alloc);
727  }
728 
729  slice_t get_edges(vid_t i) const override {
730  return slice_t(csr_.get_edges(i), table_);
731  }
732 
734  return mut_slice_t(csr_.get_edges_mut(i), table_);
735  }
736 
737  void close() override { csr_.close(); }
738 
739  private:
742 };
743 
744 template <typename EDATA_T>
745 class SingleMutableCsr : public TypedMutableCsrBase<EDATA_T> {
746  public:
750 
753 
754  size_t batch_init(const std::string& name, const std::string& work_dir,
755  const std::vector<int>& degree,
756  double reserve_ratio) override {
757  size_t vnum = degree.size();
758  nbr_list_.open(work_dir + "/" + name + ".snbr", true);
759  nbr_list_.resize(vnum);
760  for (size_t k = 0; k != vnum; ++k) {
761  nbr_list_[k].timestamp.store(std::numeric_limits<timestamp_t>::max());
762  }
763  return vnum;
764  }
765 
766  size_t batch_init_in_memory(const std::vector<int>& degree,
767  double reserve_ratio) override {
768  size_t vnum = degree.size();
769  nbr_list_.open("", false);
770  nbr_list_.resize(vnum);
771  for (size_t k = 0; k != vnum; ++k) {
772  nbr_list_[k].timestamp.store(std::numeric_limits<timestamp_t>::max());
773  }
774  return vnum;
775  }
776 
777  void batch_put_edge(vid_t src, vid_t dst, const EDATA_T& data,
778  timestamp_t ts = 0) override {
779  nbr_list_[src].neighbor = dst;
780  nbr_list_[src].data = data;
781  CHECK_EQ(nbr_list_[src].timestamp.load(),
782  std::numeric_limits<timestamp_t>::max());
783  nbr_list_[src].timestamp.store(ts);
784  }
785 
787 
788  timestamp_t unsorted_since() const override {
789  return std::numeric_limits<timestamp_t>::max();
790  }
791 
792  void open(const std::string& name, const std::string& snapshot_dir,
793  const std::string& work_dir) override {
794  if (!std::filesystem::exists(work_dir + "/" + name + ".snbr")) {
795  copy_file(snapshot_dir + "/" + name + ".snbr",
796  work_dir + "/" + name + ".snbr");
797  }
798  nbr_list_.open(work_dir + "/" + name + ".snbr", true);
799  }
800 
801  void open_in_memory(const std::string& prefix, size_t v_cap) override {
802  nbr_list_.open(prefix + ".snbr", false);
803  if (nbr_list_.size() < v_cap) {
804  size_t old_size = nbr_list_.size();
805  nbr_list_.reset();
806  nbr_list_.resize(v_cap);
807  read_file(prefix + ".snbr", nbr_list_.data(), sizeof(nbr_t), old_size);
808  for (size_t k = old_size; k != v_cap; ++k) {
809  nbr_list_[k].timestamp.store(std::numeric_limits<timestamp_t>::max());
810  }
811  }
812  }
813 
814  void open_with_hugepages(const std::string& prefix, size_t v_cap) override {
815  nbr_list_.open_with_hugepages(prefix + ".snbr", v_cap);
816  size_t old_size = nbr_list_.size();
817  if (old_size < v_cap) {
818  nbr_list_.resize(v_cap);
819  for (size_t k = old_size; k != v_cap; ++k) {
820  nbr_list_[k].timestamp.store(std::numeric_limits<timestamp_t>::max());
821  }
822  }
823  }
824 
825  void dump(const std::string& name,
826  const std::string& new_snapshot_dir) override {
827  if ((!nbr_list_.filename().empty() &&
828  std::filesystem::exists(nbr_list_.filename()))) {
829  std::error_code errorCode;
830  std::filesystem::create_hard_link(nbr_list_.filename(),
831  new_snapshot_dir + "/" + name + ".snbr",
832  errorCode);
833  if (errorCode) {
834  std::stringstream ss;
835  ss << "Failed to create hard link from " << nbr_list_.filename()
836  << " to " << new_snapshot_dir + "/" + name + ".snbr"
837  << ", error code: " << errorCode << " " << errorCode.message();
838  LOG(ERROR) << ss.str();
839  throw std::runtime_error(ss.str());
840  }
841  } else {
842  write_file(new_snapshot_dir + "/" + name + ".snbr", nbr_list_.data(),
843  sizeof(nbr_t), nbr_list_.size());
844  }
845  }
846 
847  void warmup(int thread_num) const override {
848  size_t vnum = nbr_list_.size();
849  std::vector<std::thread> threads;
850  std::atomic<size_t> v_i(0);
851  std::atomic<size_t> output(0);
852  const size_t chunk = 4096;
853  for (int i = 0; i < thread_num; ++i) {
854  threads.emplace_back([&]() {
855  size_t ret = 0;
856  while (true) {
857  size_t begin = std::min(v_i.fetch_add(chunk), vnum);
858  size_t end = std::min(begin + chunk, vnum);
859  if (begin == end) {
860  break;
861  }
862  while (begin < end) {
863  auto& nbr = nbr_list_[begin];
864  ret += nbr.neighbor;
865  ++begin;
866  }
867  }
868  output.fetch_add(ret);
869  });
870  }
871  for (auto& thrd : threads) {
872  thrd.join();
873  }
874  (void) output.load();
875  }
876 
877  void resize(vid_t vnum) override {
878  if (vnum > nbr_list_.size()) {
879  size_t old_size = nbr_list_.size();
880  nbr_list_.resize(vnum);
881  for (size_t k = old_size; k != vnum; ++k) {
882  nbr_list_[k].timestamp.store(std::numeric_limits<timestamp_t>::max());
883  }
884  } else {
885  nbr_list_.resize(vnum);
886  }
887  }
888 
889  size_t size() const override { return nbr_list_.size(); }
890 
891  size_t edge_num() const override {
892  size_t cnt = 0;
893  for (size_t k = 0; k != nbr_list_.size(); ++k) {
894  if (nbr_list_[k].timestamp.load() !=
895  std::numeric_limits<timestamp_t>::max()) {
896  ++cnt;
897  }
898  }
899  return cnt;
900  }
901 
902  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
903  return std::make_shared<MutableCsrConstEdgeIter<EDATA_T>>(get_edges(v));
904  }
907  }
908  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
909  return std::make_shared<MutableCsrEdgeIter<EDATA_T>>(get_edges_mut(v));
910  }
911 
912  void put_edge(vid_t src, vid_t dst, const EDATA_T& data, timestamp_t ts,
913  Allocator& alloc) override {
914  CHECK_LT(src, nbr_list_.size());
915  nbr_list_[src].neighbor = dst;
916  nbr_list_[src].data = data;
917  CHECK_EQ(nbr_list_[src].timestamp, std::numeric_limits<timestamp_t>::max());
918  nbr_list_[src].timestamp.store(ts);
919  }
920 
921  slice_t get_edges(vid_t v) const override {
922  slice_t ret;
923  ret.set_size(nbr_list_[v].timestamp.load() ==
924  std::numeric_limits<timestamp_t>::max()
925  ? 0
926  : 1);
927  if (ret.size() != 0) {
928  ret.set_begin(&nbr_list_[v]);
929  }
930  return ret;
931  }
932 
934  mut_slice_t ret;
935  ret.set_size(nbr_list_[i].timestamp.load() ==
936  std::numeric_limits<timestamp_t>::max()
937  ? 0
938  : 1);
939  if (ret.size() != 0) {
940  ret.set_begin(&nbr_list_[i]);
941  }
942  return ret;
943  }
944 
945  const nbr_t& get_edge(vid_t i) const { return nbr_list_[i]; }
946 
947  void close() override { nbr_list_.reset(); }
948 
949  private:
951 };
952 
953 template <>
954 class SingleMutableCsr<std::string_view>
955  : public TypedMutableCsrBase<std::string_view> {
956  public:
960 
961  SingleMutableCsr(StringColumn& column) : column_(column), csr_() {}
963 
964  size_t batch_init(const std::string& name, const std::string& work_dir,
965  const std::vector<int>& degree,
966  double reserve_ratio) override {
967  return csr_.batch_init(name, work_dir, degree, reserve_ratio);
968  }
969 
970  size_t batch_init_in_memory(const std::vector<int>& degree,
971  double reserve_ratio) override {
972  return csr_.batch_init_in_memory(degree, reserve_ratio);
973  }
974 
975  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
976  timestamp_t ts) override {
977  csr_.batch_put_edge(src, dst, data, ts);
978  }
979 
981 
982  timestamp_t unsorted_since() const override {
983  return std::numeric_limits<timestamp_t>::max();
984  }
985 
986  void open(const std::string& name, const std::string& snapshot_dir,
987  const std::string& work_dir) override {
988  csr_.open(name, snapshot_dir, work_dir);
989  }
990 
991  void open_in_memory(const std::string& prefix, size_t v_cap) override {
992  csr_.open_in_memory(prefix, v_cap);
993  }
994 
995  void dump(const std::string& name,
996  const std::string& new_snapshot_dir) override {
997  csr_.dump(name, new_snapshot_dir);
998  }
999 
1000  void warmup(int thread_num) const override { csr_.warmup(thread_num); }
1001 
1002  void resize(vid_t vnum) override { csr_.resize(vnum); }
1003 
1004  size_t size() const override { return csr_.size(); }
1005 
1006  size_t edge_num() const override { return csr_.edge_num(); }
1007 
1008  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
1009  return std::make_shared<MutableCsrConstEdgeIter<std::string_view>>(
1010  get_edges(v));
1011  }
1012 
1015  }
1016 
1017  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
1018  return std::make_shared<MutableCsrEdgeIter<std::string_view>>(
1019  get_edges_mut(v));
1020  }
1021 
1022  void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts,
1023  Allocator& alloc) {
1024  csr_.put_edge(src, dst, data, ts, alloc);
1025  }
1026 
1027  void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts,
1028  Allocator& alloc) override {
1029  put_edge(src, dst, index, ts, alloc);
1030  }
1031 
1032  slice_t get_edges(vid_t i) const override {
1033  auto ret = csr_.get_edges(i);
1034  return slice_t(ret, column_);
1035  }
1036 
1038  auto ret = csr_.get_edges_mut(i);
1039  return mut_slice_t(ret, column_);
1040  }
1041 
1044  auto nbr_tmp = csr_.get_edge(i);
1045  nbr.neighbor = nbr_tmp.neighbor;
1046  nbr.timestamp.store(nbr_tmp.timestamp.load());
1047  nbr.data = column_.get_view(nbr_tmp.data);
1048  return nbr;
1049  }
1050 
1051  void close() override { csr_.close(); }
1052 
1053  private:
1056 };
1057 
1058 template <>
1059 class SingleMutableCsr<RecordView> : public TypedMutableCsrBase<RecordView> {
1060  public:
1064 
1065  SingleMutableCsr(Table& table) : table_(table), csr_() {}
1067 
1068  size_t batch_init(const std::string& name, const std::string& work_dir,
1069  const std::vector<int>& degree,
1070  double reserve_ratio) override {
1071  return csr_.batch_init(name, work_dir, degree, reserve_ratio);
1072  }
1073 
1074  size_t batch_init_in_memory(const std::vector<int>& degree,
1075  double reserve_ratio) override {
1076  return csr_.batch_init_in_memory(degree, reserve_ratio);
1077  }
1078 
1079  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
1080  timestamp_t ts) override {
1081  csr_.batch_put_edge(src, dst, data, ts);
1082  }
1083 
1085 
1086  timestamp_t unsorted_since() const override {
1087  return std::numeric_limits<timestamp_t>::max();
1088  }
1089 
1090  void open(const std::string& name, const std::string& snapshot_dir,
1091  const std::string& work_dir) override {
1092  csr_.open(name, snapshot_dir, work_dir);
1093  }
1094 
1095  void open_in_memory(const std::string& prefix, size_t v_cap) override {
1096  csr_.open_in_memory(prefix, v_cap);
1097  }
1098 
1099  void dump(const std::string& name,
1100  const std::string& new_snapshot_dir) override {
1101  csr_.dump(name, new_snapshot_dir);
1102  }
1103 
1104  void warmup(int thread_num) const override { csr_.warmup(thread_num); }
1105 
1106  void resize(vid_t vnum) override { csr_.resize(vnum); }
1107 
1108  size_t size() const override { return csr_.size(); }
1109 
1110  size_t edge_num() const override { return csr_.edge_num(); }
1111 
1112  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
1113  return std::make_shared<MutableCsrConstEdgeIter<RecordView>>(get_edges(v));
1114  }
1115 
1118  }
1119 
1120  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
1121  return std::make_shared<MutableCsrEdgeIter<RecordView>>(get_edges_mut(v));
1122  }
1123 
1124  void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts,
1125  Allocator& alloc) {
1126  csr_.put_edge(src, dst, data, ts, alloc);
1127  }
1128 
1129  void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts,
1130  Allocator& alloc) override {
1131  put_edge(src, dst, index, ts, alloc);
1132  }
1133 
1134  slice_t get_edges(vid_t i) const override {
1135  auto ret = csr_.get_edges(i);
1136  return slice_t(ret, table_);
1137  }
1138 
1140  auto ret = csr_.get_edges_mut(i);
1141  return mut_slice_t(ret, table_);
1142  }
1143 
1144  struct RecordNbr {
1146  RecordNbr(const nbr_t* ptr, Table& table) : ptr_(ptr), table_(table) {}
1147  vid_t get_neighbor() const { return ptr_->neighbor; }
1148  timestamp_t get_timestamp() const { return ptr_->timestamp.load(); }
1149  size_t get_index() const { return ptr_->data; }
1150  RecordView get_data() const { return RecordView(ptr_->data, &table_); }
1151  const nbr_t* ptr_;
1153  };
1154 
1155  RecordNbr get_edge(vid_t i) const {
1156  auto nbr = csr_.get_edge(i);
1157  return RecordNbr(&nbr, table_);
1158  }
1159 
1160  void close() override { csr_.close(); }
1161 
1162  private:
1165 };
1166 
1167 template <typename EDATA_T>
1168 class EmptyCsr : public TypedMutableCsrBase<EDATA_T> {
1169  public:
1171 
1172  EmptyCsr() = default;
1173  ~EmptyCsr() = default;
1174 
1175  size_t batch_init(const std::string& name, const std::string& work_dir,
1176  const std::vector<int>& degree,
1177  double reserve_ratio) override {
1178  return 0;
1179  }
1180 
1181  size_t batch_init_in_memory(const std::vector<int>& degree,
1182  double reserve_ratio) override {
1183  return 0;
1184  }
1185 
1186  void open(const std::string& name, const std::string& snapshot_dir,
1187  const std::string& work_dir) override {}
1188 
1189  void open_in_memory(const std::string& prefix, size_t v_cap) override {}
1190 
1191  void open_with_hugepages(const std::string& prefix, size_t v_cap) override {}
1192 
1193  void dump(const std::string& name,
1194  const std::string& new_snapshot_dir) override {}
1195 
1196  void warmup(int thread_num) const override {}
1197 
1198  void resize(vid_t vnum) override {}
1199 
1200  size_t size() const override { return 0; }
1201 
1202  size_t edge_num() const override { return 0; }
1203 
1204  void batch_put_edge(vid_t src, vid_t dst, const EDATA_T& data,
1205  timestamp_t ts = 0) override {}
1206  void put_edge(vid_t src, vid_t dst, const EDATA_T& data, timestamp_t ts,
1207  Allocator&) override {}
1208 
1209  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
1210  return std::make_shared<MutableCsrConstEdgeIter<EDATA_T>>(
1212  }
1216  }
1217  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
1218  return std::make_shared<MutableCsrEdgeIter<EDATA_T>>(
1220  }
1221 
1223 
1224  timestamp_t unsorted_since() const override {
1225  return std::numeric_limits<timestamp_t>::max();
1226  }
1227 
1228  slice_t get_edges(vid_t v) const override { return slice_t::empty(); }
1229 
1230  void close() override {}
1231 };
1232 
1233 template <>
1234 class EmptyCsr<std::string_view>
1235  : public TypedMutableCsrBase<std::string_view> {
1236  public:
1238 
1239  EmptyCsr(StringColumn& column) : column_(column) {}
1240  ~EmptyCsr() = default;
1241 
1242  size_t batch_init(const std::string& name, const std::string& work_dir,
1243  const std::vector<int>& degree,
1244  double reserve_ratio) override {
1245  return 0;
1246  }
1247  size_t batch_init_in_memory(const std::vector<int>& degree,
1248  double reserve_ratio) override {
1249  return 0;
1250  }
1251 
1252  void open(const std::string& name, const std::string& snapshot_dir,
1253  const std::string& work_dir) override {}
1254 
1255  void open_in_memory(const std::string& prefix, size_t v_cap) override {}
1256 
1257  void dump(const std::string& name,
1258  const std::string& new_snapshot_dir) override {}
1259 
1260  void warmup(int thread_num) const override {}
1261 
1262  void resize(vid_t vnum) override {}
1263 
1264  size_t size() const override { return 0; }
1265 
1266  size_t edge_num() const override { return 0; }
1267 
1268  void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts,
1269  Allocator& alloc) override {}
1270  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
1271  timestamp_t ts = 0) override {}
1272  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
1273  return std::make_shared<MutableCsrConstEdgeIter<std::string_view>>(
1275  }
1279  }
1280  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
1281  return std::make_shared<MutableCsrEdgeIter<std::string_view>>(
1283  }
1284 
1285  slice_t get_edges(vid_t v) const override { return slice_t::empty(column_); }
1286 
1287  void close() override {}
1288 
1290 };
1291 
1292 template <>
1293 class EmptyCsr<RecordView> : public TypedMutableCsrBase<RecordView> {
1294  public:
1296 
1297  EmptyCsr(Table& table) : table_(table) {}
1298  ~EmptyCsr() = default;
1299 
1300  size_t batch_init(const std::string& name, const std::string& work_dir,
1301  const std::vector<int>& degree,
1302  double reserve_ratio) override {
1303  return 0;
1304  }
1305 
1306  size_t batch_init_in_memory(const std::vector<int>& degree,
1307  double reserve_ratio) override {
1308  return 0;
1309  }
1310 
1311  void open(const std::string& name, const std::string& snapshot_dir,
1312  const std::string& work_dir) override {}
1313 
1314  void open_in_memory(const std::string& prefix, size_t v_cap) override {}
1315 
1316  void dump(const std::string& name,
1317  const std::string& new_snapshot_dir) override {}
1318 
1319  void warmup(int thread_num) const override {}
1320 
1321  void resize(vid_t vnum) override {}
1322 
1323  size_t size() const override { return 0; }
1324 
1325  size_t edge_num() const override { return 0; }
1326 
1327  void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts,
1328  Allocator& alloc) override {}
1329  void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data,
1330  timestamp_t ts = 0) override {}
1331  std::shared_ptr<CsrConstEdgeIterBase> edge_iter(vid_t v) const override {
1332  return std::make_shared<MutableCsrConstEdgeIter<RecordView>>(
1334  }
1338  }
1339  std::shared_ptr<CsrEdgeIterBase> edge_iter_mut(vid_t v) override {
1340  return std::make_shared<MutableCsrEdgeIter<RecordView>>(
1342  }
1343 
1344  slice_t get_edges(vid_t v) const override { return slice_t::empty(table_); }
1345 
1346  void close() override {}
1347 
1348  private:
1350 };
1351 
1352 } // namespace gs
1353 
1354 #endif // STORAGES_RT_MUTABLE_GRAPH_CSR_MUTABLE_CSR_H_
gs::MutableCsrEdgeIter< std::string_view >::get_timestamp
timestamp_t get_timestamp() const override
Definition: mutable_csr.h:117
gs::MutableCsr< std::string_view >::csr_
MutableCsr< size_t > csr_
Definition: mutable_csr.h:657
gs::SingleMutableCsr< RecordView >::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: mutable_csr.h:1084
gs::SingleMutableCsr< std::string_view >::close
void close() override
Definition: mutable_csr.h:1051
gs::MutableCsrEdgeIter::is_valid
bool is_valid() const override
Definition: mutable_csr.h:96
gs::SingleMutableCsr< std::string_view >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:991
gs::SingleMutableCsr< RecordView >::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: mutable_csr.h:1068
gs::MutableCsr< RecordView >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:695
gs::MutableCsr::MutableCsr
MutableCsr()
Definition: mutable_csr.h:190
gs::MutableCsrEdgeIter< std::string_view >::set_timestamp
void set_timestamp(timestamp_t ts)
Definition: mutable_csr.h:123
gs::MutableCsrEdgeIter< std::string_view >::operator+=
CsrEdgeIterBase & operator+=(size_t offset) override
Definition: mutable_csr.h:125
gs::SingleMutableCsr< std::string_view >::~SingleMutableCsr
~SingleMutableCsr()
Definition: mutable_csr.h:962
gs::EmptyCsr::open_with_hugepages
void open_with_hugepages(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:1191
gs::MutableNbrSliceMut::set_size
void set_size(int size)
Definition: nbr.h:438
gs::SingleMutableCsr::~SingleMutableCsr
~SingleMutableCsr()
Definition: mutable_csr.h:752
gs::MutableCsr< std::string_view >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:609
gs::MutableCsr< RecordView >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:724
gs::EmptyCsr< std::string_view >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:1247
gs::MutableCsr< RecordView >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:715
gs::read_file
void read_file(const std::string &filename, void *buffer, size_t size, size_t num)
Definition: mutable_csr.cc:23
gs::SingleMutableCsr::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:905
gs::SingleMutableCsr< std::string_view >::get_edges_mut
mut_slice_t get_edges_mut(vid_t i)
Definition: mutable_csr.h:1037
gs::MutableNbr::get_timestamp
timestamp_t get_timestamp() const
Definition: nbr.h:210
gs::MutableCsr< RecordView >::csr_
MutableCsr< size_t > csr_
Definition: mutable_csr.h:741
gs::MutableCsrEdgeIter< std::string_view >::get_data
Any get_data() const override
Definition: mutable_csr.h:114
gs::MutableCsr< RecordView >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:708
gs::EmptyCsr< std::string_view >::EmptyCsr
EmptyCsr(StringColumn &column)
Definition: mutable_csr.h:1239
gs::EmptyCsr< std::string_view >::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:1262
gs::EmptyCsr< std::string_view >::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:1266
gs::Any
Definition: types.h:383
gs::MutableCsrEdgeIter::cur_
nbr_t * cur_
Definition: mutable_csr.h:100
gs::SingleMutableCsr< RecordView >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:1116
gs::MutableCsr::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: mutable_csr.h:259
gs::MutableCsrEdgeIter< std::string_view >::is_valid
bool is_valid() const override
Definition: mutable_csr.h:134
gs::EmptyCsr::size
size_t size() const override
Definition: mutable_csr.h:1200
gs::MutableCsrConstEdgeIter::get_neighbor
vid_t get_neighbor() const override
Definition: mutable_csr.h:44
gs::SingleMutableCsr< std::string_view >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:1017
gs::MutableCsr< std::string_view >::size
size_t size() const override
Definition: mutable_csr.h:618
gs::MutableNbr::set_data
void set_data(const EDATA_T &val, timestamp_t ts)
Definition: nbr.h:212
gs::MutableCsr< RecordView >::put_edge
void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts, Allocator &alloc)
Definition: mutable_csr.h:719
gs::SingleMutableCsr< std::string_view >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:1008
gs::MutableCsrConstEdgeIter::const_nbr_ptr_t
typename MutableNbrSlice< EDATA_T >::const_nbr_ptr_t const_nbr_ptr_t
Definition: mutable_csr.h:37
gs::MutableCsr< RecordView >::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:700
gs::EmptyCsr< RecordView >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:1306
gs::EmptyCsr< RecordView >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:1327
gs::MutableCsr< std::string_view >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:605
gs::timestamp_t
uint32_t timestamp_t
Definition: types.h:30
gs::EmptyCsr::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: mutable_csr.h:1175
gs::MutableNbrSlice::set_size
void set_size(int size)
Definition: nbr.h:262
gs::MutableCsrEdgeIter< std::string_view >::end_
nbr_ptr_t end_
Definition: mutable_csr.h:139
gs::MutableNbrSliceMut< RecordView >
Definition: nbr.h:533
gs::SingleMutableCsr::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:891
gs::SingleMutableCsr::put_edge
void put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:912
gs::SingleMutableCsr< RecordView >::close
void close() override
Definition: mutable_csr.h:1160
gs::MutableCsr::slice_t
MutableNbrSlice< EDATA_T > slice_t
Definition: mutable_csr.h:187
gs::MutableCsr< 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: mutable_csr.h:584
gs::SingleMutableCsr< 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: mutable_csr.h:964
gs::SingleMutableCsr::unsorted_since
timestamp_t unsorted_since() const override
Definition: mutable_csr.h:788
gs::MutableCsr< RecordView >::size
size_t size() const override
Definition: mutable_csr.h:704
gs::EmptyCsr::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:1186
gs::MutableNbrSlice::set_begin
void set_begin(const_nbr_ptr_t ptr)
Definition: nbr.h:265
gs::MutableCsrEdgeIter< std::string_view >::next
void next() override
Definition: mutable_csr.h:133
gs::MutableCsrEdgeIter::end_
nbr_t * end_
Definition: mutable_csr.h:101
gs::MutableCsr< 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: mutable_csr.h:595
gs::MutableCsr< std::string_view >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:630
gs::SingleMutableCsr::size
size_t size() const override
Definition: mutable_csr.h:889
gs::MutableCsrEdgeIter::operator+=
CsrEdgeIterBase & operator+=(size_t offset) override
Definition: mutable_csr.h:86
nbr.h
gs::MutableCsr< RecordView >::get_edges_mut
mut_slice_t get_edges_mut(vid_t i)
Definition: mutable_csr.h:733
gs::MutableCsr::dump_meta
void dump_meta(const std::string &prefix) const
Definition: mutable_csr.h:561
gs::write_file
void write_file(const std::string &filename, const void *buffer, size_t size, size_t num)
Definition: mutable_csr.cc:50
gs::MutableCsrEdgeIter< RecordView >::get_neighbor
vid_t get_neighbor() const override
Definition: mutable_csr.h:151
gs::SingleMutableCsr::get_edge
const nbr_t & get_edge(vid_t i) const
Definition: mutable_csr.h:945
gs::MutableCsrEdgeIter::MutableCsrEdgeIter
MutableCsrEdgeIter(MutableNbrSliceMut< EDATA_T > slice)
Definition: mutable_csr.h:71
gs::MutableCsrConstEdgeIter::get_data
Any get_data() const override
Definition: mutable_csr.h:45
gs::MutableCsrEdgeIter< std::string_view >::nbr_ptr_t
typename MutableNbrSliceMut< std::string_view >::nbr_ptr_t nbr_ptr_t
Definition: mutable_csr.h:106
gs::vid_t
uint32_t vid_t
Definition: types.h:31
gs::MutableCsrConstEdgeIter
Definition: mutable_csr.h:36
gs::EmptyCsr::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: mutable_csr.h:1222
gs::MutableCsr::mut_slice_t
MutableNbrSliceMut< EDATA_T > mut_slice_t
Definition: mutable_csr.h:188
gs::SingleMutableCsr< RecordView >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:1099
gs::SingleMutableCsr< RecordView >::csr_
SingleMutableCsr< size_t > csr_
Definition: mutable_csr.h:1164
gs::MutableCsr< std::string_view >::close
void close() override
Definition: mutable_csr.h:653
gs::MutableCsr::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:460
gs::EmptyCsr< RecordView >::close
void close() override
Definition: mutable_csr.h:1346
gs::SingleMutableCsr< RecordView >::RecordNbr::table_
Table table_
Definition: mutable_csr.h:1152
gs::mmap_array::resize
void resize(size_t size)
Definition: mmap_array.h:319
gs::SingleMutableCsr::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:792
gs::MutableCsr< RecordView >::batch_put_edge_with_index
void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data, timestamp_t ts=0) override
Definition: mutable_csr.h:681
gs::EmptyCsr< std::string_view >::close
void close() override
Definition: mutable_csr.h:1287
gs::SingleMutableCsr< RecordView >::get_edges
slice_t get_edges(vid_t i) const override
Definition: mutable_csr.h:1134
gs::SingleMutableCsr::SingleMutableCsr
SingleMutableCsr()
Definition: mutable_csr.h:751
gs::EmptyCsr::batch_put_edge
void batch_put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts=0) override
Definition: mutable_csr.h:1204
gs::SingleMutableCsr< std::string_view >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:1027
gs::EmptyCsr::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:1189
gs::MutableNbrSliceMut::size
int size() const
Definition: nbr.h:439
gs::SingleMutableCsr< RecordView >::RecordNbr::ptr_
const nbr_t * ptr_
Definition: mutable_csr.h:1151
gs::CsrEdgeIterBase
Definition: csr_base.h:43
gs::ConvertAny::to
static void to(const Any &value, T &out)
Definition: types.h:799
gs::MutableCsrEdgeIter< RecordView >::is_valid
bool is_valid() const override
Definition: mutable_csr.h:175
gs::MutableCsr< RecordView >::get_edges
slice_t get_edges(vid_t i) const override
Definition: mutable_csr.h:729
gs::MutableCsr::put_edge
void put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:527
gs::EmptyCsr::EmptyCsr
EmptyCsr()=default
gs::SingleMutableCsr< RecordView >::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:1106
gs::MutableAdjlist
Definition: adj_list.h:33
gs
Definition: adj_list.h:23
gs::SingleMutableCsr< std::string_view >::SingleMutableCsr
SingleMutableCsr(StringColumn &column)
Definition: mutable_csr.h:961
gs::SingleMutableCsr< 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: mutable_csr.h:975
gs::SingleMutableCsr< RecordView >::put_edge
void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts, Allocator &alloc)
Definition: mutable_csr.h:1124
gs::MutableCsrEdgeIter< RecordView >::nbr_ptr_t
typename MutableNbrSliceMut< RecordView >::nbr_ptr_t nbr_ptr_t
Definition: mutable_csr.h:144
gs::EmptyCsr< std::string_view >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:1257
gs::MutableNbrSlice< std::string_view >
Definition: nbr.h:356
gs::MutableCsr::get_edges_mut
mut_slice_t get_edges_mut(vid_t i)
Definition: mutable_csr.h:539
gs::MutableNbr
Definition: nbr.h:193
gs::MutableNbr::timestamp
std::atomic< timestamp_t > timestamp
Definition: nbr.h:220
gs::MutableCsrEdgeIter< RecordView >::end_
nbr_ptr_t end_
Definition: mutable_csr.h:180
gs::SingleMutableCsr< RecordView >::RecordNbr::RecordNbr
RecordNbr(const nbr_t *ptr, Table &table)
Definition: mutable_csr.h:1146
gs::MutableCsrConstEdgeIter::cur_
const_nbr_ptr_t cur_
Definition: mutable_csr.h:62
gs::MutableCsr< std::string_view >::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:614
gs::SingleMutableCsr::get_edges
slice_t get_edges(vid_t v) const override
Definition: mutable_csr.h:921
gs::Table
Definition: table.h:30
gs::SingleMutableCsr::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: mutable_csr.h:786
gs::SingleMutableCsr< std::string_view >::size
size_t size() const override
Definition: mutable_csr.h:1004
gs::MutableCsr< RecordView >::table_
Table & table_
Definition: mutable_csr.h:740
gs::mmap_array::open
void open(const std::string &filename, bool sync_to_file=false)
Definition: mmap_array.h:129
gs::MutableCsrEdgeIter< std::string_view >::MutableCsrEdgeIter
MutableCsrEdgeIter(MutableNbrSliceMut< std::string_view > slice)
Definition: mutable_csr.h:109
gs::EmptyCsr< RecordView >::size
size_t size() const override
Definition: mutable_csr.h:1323
gs::ArenaAllocator
Definition: allocators.h:29
gs::EmptyCsr< RecordView >::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:1325
gs::SingleMutableCsr< RecordView >::get_edge
RecordNbr get_edge(vid_t i) const
Definition: mutable_csr.h:1155
gs::SingleMutableCsr< RecordView >::~SingleMutableCsr
~SingleMutableCsr()
Definition: mutable_csr.h:1066
gs::MutableNbr::get_neighbor
vid_t get_neighbor() const
Definition: nbr.h:209
gs::MutableCsr::batch_put_edge
void batch_put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts) override
Definition: mutable_csr.h:254
gs::MutableCsr::nbr_list_
mmap_array< nbr_t > nbr_list_
Definition: mutable_csr.h:568
gs::MutableCsrEdgeIter< std::string_view >::set_data
void set_data(const Any &value, timestamp_t ts) override
Definition: mutable_csr.h:119
gs::SingleMutableCsr::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:908
gs::EmptyCsr::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:1202
gs::EmptyCsr::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:1213
gs::SingleMutableCsr< RecordView >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:1120
gs::SingleMutableCsr::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:877
gs::EmptyCsr< RecordView >::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: mutable_csr.h:1300
gs::EmptyCsr< RecordView >::batch_put_edge_with_index
void batch_put_edge_with_index(vid_t src, vid_t dst, size_t data, timestamp_t ts=0) override
Definition: mutable_csr.h:1329
gs::MutableCsrConstEdgeIter::~MutableCsrConstEdgeIter
~MutableCsrConstEdgeIter()=default
gs::MutableCsr< std::string_view >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:627
gs::MutableCsr< std::string_view >::put_edge
void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts, Allocator &alloc)
Definition: mutable_csr.h:635
gs::SingleMutableCsr< std::string_view >::put_edge
void put_edge(vid_t src, vid_t dst, size_t data, timestamp_t ts, Allocator &alloc)
Definition: mutable_csr.h:1022
gs::MutableCsr< RecordView >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:691
gs::MutableCsr< std::string_view >::MutableCsr
MutableCsr(StringColumn &column)
Definition: mutable_csr.h:581
gs::MutableCsr< std::string_view >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:640
gs::MutableNbr::set_timestamp
void set_timestamp(timestamp_t ts)
Definition: nbr.h:217
gs::SingleMutableCsr< std::string_view >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:1013
gs::SingleMutableCsr< std::string_view >::unsorted_since
timestamp_t unsorted_since() const override
Definition: mutable_csr.h:982
gs::SingleMutableCsr< RecordView >::SingleMutableCsr
SingleMutableCsr(Table &table)
Definition: mutable_csr.h:1065
gs::MutableCsr::locks_
grape::SpinLock * locks_
Definition: mutable_csr.h:566
gs::SingleMutableCsr< RecordView >::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:1104
gs::SingleMutableCsr< std::string_view >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:970
gs::MutableNbr::data
EDATA_T data
Definition: nbr.h:221
gs::MutableCsr::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:520
gs::EmptyCsr::get_edges
slice_t get_edges(vid_t v) const override
Definition: mutable_csr.h:1228
gs::CsrConstEdgeIterBase
Definition: csr_base.h:27
gs::EmptyCsr::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:1181
gs::MutableNbrSlice< RecordView >
Definition: nbr.h:283
gs::SingleMutableCsr< RecordView >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:1129
gs::Record
Definition: types.h:300
gs::SingleMutableCsr::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:902
gs::MutableCsr::load_meta
void load_meta(const std::string &prefix)
Definition: mutable_csr.h:551
gs::MutableCsr::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:517
gs::SingleMutableCsr::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:825
csr_base.h
gs::EmptyCsr< RecordView >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:1311
gs::EmptyCsr::unsorted_since
timestamp_t unsorted_since() const override
Definition: mutable_csr.h:1224
gs::TypedColumn< std::string_view >
Definition: column.h:338
gs::MutableCsr< std::string_view >::get_edges
slice_t get_edges(vid_t i) const override
Definition: mutable_csr.h:645
gs::SingleMutableCsr< RecordView >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:1095
gs::SingleMutableCsr::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: mutable_csr.h:754
gs::MutableCsrEdgeIter< RecordView >::MutableCsrEdgeIter
MutableCsrEdgeIter(MutableNbrSliceMut< RecordView > slice)
Definition: mutable_csr.h:147
gs::SingleMutableCsr< RecordView >::unsorted_since
timestamp_t unsorted_since() const override
Definition: mutable_csr.h:1086
gs::EmptyCsr< std::string_view >::size
size_t size() const override
Definition: mutable_csr.h:1264
gs::EmptyCsr::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:1217
gs::MutableCsrEdgeIter< RecordView >::set_data
void set_data(const Any &value, timestamp_t ts) override
Definition: mutable_csr.h:161
gs::mmap_array::size
size_t size() const
Definition: mmap_array.h:415
gs::MutableCsr< std::string_view >::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:620
gs::MutableCsr< RecordView >::~MutableCsr
~MutableCsr()
Definition: mutable_csr.h:668
gs::EmptyCsr< std::string_view >::column_
StringColumn & column_
Definition: mutable_csr.h:1289
gs::EmptyCsr< RecordView >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:1339
gs::MutableCsr::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:304
gs::EmptyCsr::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:1198
gs::EmptyCsr::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:1196
gs::SingleMutableCsr::nbr_list_
mmap_array< nbr_t > nbr_list_
Definition: mutable_csr.h:950
gs::SingleMutableCsr< std::string_view >::get_edges
slice_t get_edges(vid_t i) const override
Definition: mutable_csr.h:1032
gs::SingleMutableCsr< RecordView >::size
size_t size() const override
Definition: mutable_csr.h:1108
gs::MutableCsrEdgeIter::next
void next() override
Definition: mutable_csr.h:95
gs::MutableCsrConstEdgeIter::operator+=
CsrConstEdgeIterBase & operator+=(size_t offset) override
Definition: mutable_csr.h:51
gs::SingleMutableCsr< RecordView >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:1090
gs::MutableCsr< std::string_view >::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:616
gs::SingleMutableCsr< std::string_view >::batch_sort_by_edge_data
void batch_sort_by_edge_data(timestamp_t ts) override
Definition: mutable_csr.h:980
gs::Any::AsRecord
const Record & AsRecord() const
Definition: types.h:675
gs::MutableCsrConstEdgeIter::MutableCsrConstEdgeIter
MutableCsrConstEdgeIter(const MutableNbrSlice< EDATA_T > &slice)
Definition: mutable_csr.h:40
gs::MutableCsr::open_with_hugepages
void open_with_hugepages(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:337
gs::MutableCsr
Definition: mutable_csr.h:183
gs::SingleMutableCsr< std::string_view >::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:1006
gs::SingleMutableCsr< RecordView >::get_edges_mut
mut_slice_t get_edges_mut(vid_t i)
Definition: mutable_csr.h:1139
gs::MutableCsr< RecordView >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:712
gs::SingleMutableCsr::close
void close() override
Definition: mutable_csr.h:947
gs::SingleMutableCsr< std::string_view >::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:1000
gs::EmptyCsr< RecordView >::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:1321
gs::EmptyCsr< RecordView >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:1316
gs::SingleMutableCsr< std::string_view >::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:1002
gs::EmptyCsr::close
void close() override
Definition: mutable_csr.h:1230
gs::MutableCsrEdgeIter< RecordView >::cur_
nbr_ptr_t cur_
Definition: mutable_csr.h:179
gs::MutableCsrEdgeIter< std::string_view >::get_index
size_t get_index() const
Definition: mutable_csr.h:122
gs::EmptyCsr< RecordView >::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:1319
gs::SingleMutableCsr::mut_slice_t
MutableNbrSliceMut< EDATA_T > mut_slice_t
Definition: mutable_csr.h:749
gs::MutableCsr::size
size_t size() const override
Definition: mutable_csr.h:507
gs::SingleMutableCsr::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:801
gs::MutableCsrConstEdgeIter::get_timestamp
timestamp_t get_timestamp() const override
Definition: mutable_csr.h:48
gs::MutableCsr< RecordView >::batch_init
size_t batch_init(const std::string &name, const std::string &work_dir, const std::vector< int > &degree, double reserve_ratio=1.2) override
Definition: mutable_csr.h:670
gs::MutableCsr::adj_lists_
mmap_array< adjlist_t > adj_lists_
Definition: mutable_csr.h:567
gs::MutableCsr< std::string_view >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:600
gs::EmptyCsr< 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=0) override
Definition: mutable_csr.h:1270
gs::SingleMutableCsr::get_edges_mut
mut_slice_t get_edges_mut(vid_t i)
Definition: mutable_csr.h:933
gs::MutableNbrSliceMut::set_begin
void set_begin(nbr_t *ptr)
Definition: nbr.h:441
gs::MutableCsr::unsorted_since
timestamp_t unsorted_since() const override
Definition: mutable_csr.h:271
gs::MutableCsrEdgeIter< std::string_view >::cur_
nbr_ptr_t cur_
Definition: mutable_csr.h:138
gs::TypedMutableCsrBase
Definition: csr_base.h:135
gs::SingleMutableCsr< RecordView >::RecordNbr::get_index
size_t get_index() const
Definition: mutable_csr.h:1149
gs::MutableCsrEdgeIter::get_neighbor
vid_t get_neighbor() const override
Definition: mutable_csr.h:75
gs::EmptyCsr::~EmptyCsr
~EmptyCsr()=default
gs::SingleMutableCsr< RecordView >::table_
Table & table_
Definition: mutable_csr.h:1163
gs::SingleMutableCsr< RecordView >::RecordNbr::get_timestamp
timestamp_t get_timestamp() const
Definition: mutable_csr.h:1148
gs::MutableCsrConstEdgeIter::next
void next() override
Definition: mutable_csr.h:50
gs::SingleMutableCsr::batch_put_edge
void batch_put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts=0) override
Definition: mutable_csr.h:777
gs::MutableCsr::unsorted_since_
timestamp_t unsorted_since_
Definition: mutable_csr.h:569
gs::MutableNbr::neighbor
vid_t neighbor
Definition: nbr.h:219
gs::MutableCsrEdgeIter< RecordView >::get_timestamp
timestamp_t get_timestamp() const override
Definition: mutable_csr.h:157
gs::MutableCsrConstEdgeIter::is_valid
bool is_valid() const override
Definition: mutable_csr.h:58
gs::MutableCsrEdgeIter::size
size_t size() const override
Definition: mutable_csr.h:97
gs::copy_file
void copy_file(const std::string &src, const std::string &dst)
Definition: file_names.h:80
gs::MutableCsrEdgeIter::~MutableCsrEdgeIter
~MutableCsrEdgeIter()=default
gs::MutableNbrSliceMut
Definition: nbr.h:431
gs::SingleMutableCsr< std::string_view >::column_
StringColumn & column_
Definition: mutable_csr.h:1054
gs::MutableCsr::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:273
gs::EmptyCsr< std::string_view >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:1255
gs::MutableCsr::~MutableCsr
~MutableCsr()
Definition: mutable_csr.h:191
gs::EmptyCsr
Definition: mutable_csr.h:1168
gs::SingleMutableCsr::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:766
gs::MutableCsrEdgeIter< RecordView >::size
size_t size() const override
Definition: mutable_csr.h:176
gs::MutableCsrEdgeIter< std::string_view >::get_neighbor
vid_t get_neighbor() const override
Definition: mutable_csr.h:113
gs::mmap_array< int >
gs::MutableCsr::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:371
gs::SingleMutableCsr< RecordView >::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: mutable_csr.h:1079
gs::snapshot_dir
std::string snapshot_dir(const std::string &work_dir, uint32_t version)
Definition: file_names.h:192
gs::SingleMutableCsr< std::string_view >::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:995
std
Definition: loading_config.h:232
gs::SingleMutableCsr< RecordView >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:1112
adj_list.h
gs::MutableCsr< RecordView >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio=1.2) override
Definition: mutable_csr.h:676
gs::SingleMutableCsr
Definition: mutable_csr.h:745
gs::EmptyCsr::put_edge
void put_edge(vid_t src, vid_t dst, const EDATA_T &data, timestamp_t ts, Allocator &) override
Definition: mutable_csr.h:1206
gs::EmptyCsr< RecordView >::EmptyCsr
EmptyCsr(Table &table)
Definition: mutable_csr.h:1297
gs::EmptyCsr< std::string_view >::put_edge_with_index
void put_edge_with_index(vid_t src, vid_t dst, size_t index, timestamp_t ts, Allocator &alloc) override
Definition: mutable_csr.h:1268
gs::MutableCsrEdgeIter< RecordView >::get_index
size_t get_index() const
Definition: mutable_csr.h:155
gs::EmptyCsr< std::string_view >::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:1280
gs::SingleMutableCsr< RecordView >::RecordNbr::get_neighbor
vid_t get_neighbor() const
Definition: mutable_csr.h:1147
gs::MutableCsrEdgeIter::get_timestamp
timestamp_t get_timestamp() const override
Definition: mutable_csr.h:79
gs::MutableCsr< RecordView >::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:702
gs::EmptyCsr< RecordView >::open_in_memory
void open_in_memory(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:1314
gs::EmptyCsr< RecordView >::table_
Table & table_
Definition: mutable_csr.h:1349
gs::MutableCsrEdgeIter::set_data
void set_data(const Any &value, timestamp_t ts) override
Definition: mutable_csr.h:81
gs::SingleMutableCsr::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:847
gs::MutableCsrConstEdgeIter::size
size_t size() const override
Definition: mutable_csr.h:59
gs::SingleMutableCsr< RecordView >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:1074
gs::EmptyCsr< std::string_view >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:1272
gs::SingleMutableCsr< std::string_view >::get_edge
MutableNbr< std::string_view > get_edge(vid_t i) const
Definition: mutable_csr.h:1042
gs::MutableCsr< std::string_view >::get_edges_mut
mut_slice_t get_edges_mut(vid_t i)
Definition: mutable_csr.h:649
gs::MutableCsrEdgeIter< RecordView >::get_data
Any get_data() const override
Definition: mutable_csr.h:152
gs::MutableNbr::get_data
const EDATA_T & get_data() const
Definition: nbr.h:208
gs::EmptyCsr< RecordView >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:1335
gs::MutableCsrEdgeIter::get_data
Any get_data() const override
Definition: mutable_csr.h:76
gs::AnyConverter
Definition: types.h:381
gs::MutableCsr< RecordView >::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:706
gs::MutableCsr< std::string_view >::~MutableCsr
~MutableCsr()
Definition: mutable_csr.h:582
gs::EmptyCsr< RecordView >::get_edges
slice_t get_edges(vid_t v) const override
Definition: mutable_csr.h:1344
gs::EmptyCsr< 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: mutable_csr.h:1242
gs::MutableCsrEdgeIter< RecordView >::operator+=
CsrEdgeIterBase & operator+=(size_t offset) override
Definition: mutable_csr.h:166
gs::MutableCsr< RecordView >::MutableCsr
MutableCsr(Table &table)
Definition: mutable_csr.h:667
gs::EmptyCsr< std::string_view >::edge_iter_raw
CsrConstEdgeIterBase * edge_iter_raw(vid_t v) const override
Definition: mutable_csr.h:1276
gs::MutableCsr::close
void close() override
Definition: mutable_csr.h:541
gs::SingleMutableCsr< RecordView >::RecordNbr::get_data
RecordView get_data() const
Definition: mutable_csr.h:1150
gs::MutableNbrSliceMut< std::string_view >
Definition: nbr.h:459
gs::EmptyCsr< std::string_view >::get_edges
slice_t get_edges(vid_t v) const override
Definition: mutable_csr.h:1285
gs::MutableCsr::get_edges
slice_t get_edges(vid_t v) const override
Definition: mutable_csr.h:535
gs::MutableCsrConstEdgeIter::end_
const_nbr_ptr_t end_
Definition: mutable_csr.h:63
gs::MutableCsr::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve_ratio) override
Definition: mutable_csr.h:226
gs::MutableCsr::resize
void resize(vid_t vnum) override
Definition: mutable_csr.h:494
gs::MutableNbrSlice::size
int size() const
Definition: nbr.h:263
gs::EmptyCsr< std::string_view >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:1252
gs::MutableCsrEdgeIter< RecordView >::next
void next() override
Definition: mutable_csr.h:174
gs::MutableCsrEdgeIter< RecordView >::set_timestamp
void set_timestamp(timestamp_t ts)
Definition: mutable_csr.h:159
gs::MutableCsr< std::string_view >::column_
StringColumn & column_
Definition: mutable_csr.h:656
gs::MutableNbrSlice::empty
static MutableNbrSlice empty()
Definition: nbr.h:270
gs::SingleMutableCsr< std::string_view >::csr_
SingleMutableCsr< size_t > csr_
Definition: mutable_csr.h:1055
gs::MutableCsr< std::string_view >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:622
gs::MutableNbrSliceMut::empty
static MutableNbrSliceMut empty()
Definition: nbr.h:446
gs::RecordView
Definition: types.h:285
gs::MutableCsr< std::string_view >::batch_init_in_memory
size_t batch_init_in_memory(const std::vector< int > &degree, double reserve) override
Definition: mutable_csr.h:590
gs::EmptyCsr< std::string_view >::warmup
void warmup(int thread_num) const override
Definition: mutable_csr.h:1260
gs::SingleMutableCsr< std::string_view >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:986
gs::EmptyCsr< RecordView >::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:1331
gs::EmptyCsr::edge_iter
std::shared_ptr< CsrConstEdgeIterBase > edge_iter(vid_t v) const override
Definition: mutable_csr.h:1209
gs::MutableCsrEdgeIter
Definition: mutable_csr.h:67
gs::MutableCsr< RecordView >::close
void close() override
Definition: mutable_csr.h:737
gs::MutableCsr::edge_iter_mut
std::shared_ptr< CsrEdgeIterBase > edge_iter_mut(vid_t v) override
Definition: mutable_csr.h:523
gs::MutableCsr::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: mutable_csr.h:197
gs::MutableNbrSlice
Definition: nbr.h:253
gs::EmptyCsr::dump
void dump(const std::string &name, const std::string &new_snapshot_dir) override
Definition: mutable_csr.h:1193
gs::Any::AsStringView
std::string_view AsStringView() const
Definition: types.h:641
gs::SingleMutableCsr::open_with_hugepages
void open_with_hugepages(const std::string &prefix, size_t v_cap) override
Definition: mutable_csr.h:814
gs::MutableCsr< RecordView >::open
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir) override
Definition: mutable_csr.h:686
gs::MutableCsrEdgeIter< std::string_view >::size
size_t size() const override
Definition: mutable_csr.h:135
gs::MutableCsr::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:509
gs::SingleMutableCsr::slice_t
MutableNbrSlice< EDATA_T > slice_t
Definition: mutable_csr.h:748
gs::SingleMutableCsr< RecordView >::edge_num
size_t edge_num() const override
Definition: mutable_csr.h:1110