Skip to content

Commit afa83c0

Browse files
committed
removed some duplicate sorts
1 parent d6d71d1 commit afa83c0

File tree

3 files changed

+29
-26
lines changed

3 files changed

+29
-26
lines changed

include/return_types.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ class ConnectedComponents {
2828
// This class defines a spanning forest of a graph
2929
class SpanningForest {
3030
private:
31-
std::vector<Edge> edges;
3231
node_id_t num_vertices;
32+
std::vector<Edge> edges;
33+
std::vector<Edge> sorted_adjacency;
34+
bool has_adjacency = false;
3335
public:
3436
SpanningForest(node_id_t num_vertices, const std::unordered_set<node_id_t> *spanning_forest);
3537

3638
const std::vector<Edge>& get_edges() const { return edges; }
39+
const std::vector<Edge>& get_sorted_adjacency();
3740
};

src/cc_sketch_alg.cpp

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ SpanningForest CCSketchAlg::calc_spanning_forest() {
561561
connected_components();
562562

563563
SpanningForest ret(num_vertices, spanning_forest);
564+
564565
#ifdef VERIFY_SAMPLES_F
565566
verifier->verify_spanning_forests(std::vector<SpanningForest>{ret});
566567
#endif
@@ -573,24 +574,7 @@ void CCSketchAlg::filter_sf_edges(SpanningForest &sf) {
573574
dsu_valid = false;
574575
shared_dsu_valid = false;
575576

576-
auto edges = sf.get_edges();
577-
size_t num = edges.size();
578-
edges.resize(2 * edges.size());
579-
580-
#pragma omp parallel for
581-
for (size_t i = 0; i < num; i++) {
582-
edges[i + num] = edges[i];
583-
std::swap(edges[i + num].src, edges[i + num].dst);
584-
}
585-
586-
auto setup = std::chrono::steady_clock::now();
587-
std::cout << "Setup time = " << std::chrono::duration<double>(setup - start).count() << std::endl;
588-
589-
// sort the edges
590-
std::sort(edges.begin(), edges.end());
591-
592-
auto sort = std::chrono::steady_clock::now();
593-
std::cout << "Sort time = " << std::chrono::duration<double>(sort - setup).count() << std::endl;
577+
const std::vector<Edge> &edges = sf.get_sorted_adjacency();
594578

595579
#pragma omp parallel
596580
{
@@ -632,8 +616,6 @@ void CCSketchAlg::filter_sf_edges(SpanningForest &sf) {
632616
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
633617
}
634618
}
635-
auto del = std::chrono::steady_clock::now();
636-
std::cout << "Delete time = " << std::chrono::duration<double>(del - sort).count() << std::endl;
637619

638620
delete_time += std::chrono::steady_clock::now() - start;
639621
}
@@ -644,20 +626,17 @@ std::vector<SpanningForest> CCSketchAlg::calc_disjoint_spanning_forests(size_t k
644626

645627
for (size_t i = 0; i < k; i++) {
646628
start = std::chrono::steady_clock::now();
647-
SpanningForest sf = calc_spanning_forest();
648-
SFs.push_back(sf);
629+
SFs.push_back(calc_spanning_forest());
649630
query_time += std::chrono::steady_clock::now() - start;
650631

651-
filter_sf_edges(sf);
632+
filter_sf_edges(SFs[SFs.size() - 1]);
652633
}
653634

654635
// revert the state of the sketches to remove all deletions
655636
for (auto &sf : SFs) {
656637
filter_sf_edges(sf);
657638
}
658639

659-
std::cout << "Number of SFs: " << SFs.size() << std::endl;
660-
661640
#ifdef VERIFY_SAMPLES_F
662641
verifier->verify_spanning_forests(SFs);
663642
#endif

src/return_types.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "return_types.h"
22

33
#include <map>
4+
#include <algorithm>
45

56
ConnectedComponents::ConnectedComponents(node_id_t num_vertices,
67
DisjointSetUnion_MT<node_id_t> &dsu)
@@ -39,3 +40,23 @@ SpanningForest::SpanningForest(node_id_t num_vertices,
3940
}
4041
}
4142
}
43+
44+
const std::vector<Edge> &SpanningForest::get_sorted_adjacency() {
45+
if (has_adjacency) return sorted_adjacency;
46+
47+
size_t num = edges.size();
48+
sorted_adjacency.resize(edges.size() * 2);
49+
50+
#pragma omp parallel for
51+
for (size_t i = 0; i < num; i++) {
52+
sorted_adjacency[i] = edges[i];
53+
sorted_adjacency[i + num] = sorted_adjacency[i];
54+
std::swap(sorted_adjacency[i + num].src, sorted_adjacency[i + num].dst);
55+
}
56+
57+
// sort the edges
58+
std::sort(sorted_adjacency.begin(), sorted_adjacency.end());
59+
60+
has_adjacency = true;
61+
return sorted_adjacency;
62+
}

0 commit comments

Comments
 (0)