@@ -56,7 +56,7 @@ class SparseSketch {
5656 // Allocated buckets
5757 Bucket* buckets;
5858
59- static constexpr size_t min_num_dense_rows = 4 ;
59+ static constexpr size_t min_num_dense_rows = 5 ;
6060 size_t num_dense_rows = min_num_dense_rows;
6161
6262 // Variables for sparse representation of lower levels of bucket Matrix
@@ -81,6 +81,47 @@ class SparseSketch {
8181 void update_sparse (uint8_t col, SparseBucket to_add, bool realloc_if_needed = true );
8282 SketchSample sample_sparse (size_t first_col, size_t end_col);
8383
84+ inline uint8_t remove_ll_head (size_t col) {
85+ uint8_t temp = ll_metadata[col];
86+ ll_metadata[col] = sparse_buckets[ll_metadata[col]].next ;
87+ return temp;
88+ }
89+ inline uint8_t claim_free_bucket () {
90+ assert (ll_metadata[num_columns] != uint8_t (-1 ));
91+ return remove_ll_head (num_columns);
92+ }
93+ inline void insert_to_ll_head (size_t col, uint8_t add_idx) {
94+ sparse_buckets[add_idx].next = ll_metadata[col];
95+ ll_metadata[col] = add_idx;
96+ }
97+ inline void free_bucket (uint8_t bkt_idx) {
98+ sparse_buckets[bkt_idx].row = 0 ;
99+ sparse_buckets[bkt_idx].bkt = {0 , 0 };
100+ insert_to_ll_head (num_columns, bkt_idx);
101+ }
102+ inline void insert_to_ll (uint8_t add_idx, SparseBucket &prev) {
103+ sparse_buckets[add_idx].next = prev.next ;
104+ prev.next = add_idx;
105+ }
106+ inline void remove_from_ll (SparseBucket& bkt_to_remove, SparseBucket &prev) {
107+ prev.next = bkt_to_remove.next ;
108+ }
109+ inline bool merge_sparse_bkt (uint8_t our_idx, SparseBucket& oth, uint8_t prev_idx, size_t col) {
110+ SparseBucket &ours = sparse_buckets[our_idx];
111+ ours.bkt .alpha ^= oth.bkt .alpha ;
112+ ours.bkt .gamma ^= oth.bkt .gamma ;
113+ if (Bucket_Boruvka::is_empty (ours.bkt )) {
114+ if (prev_idx == uint8_t (-1 ))
115+ remove_ll_head (col);
116+ else
117+ remove_from_ll (ours, sparse_buckets[prev_idx]);
118+
119+ free_bucket (our_idx);
120+ return true ;
121+ }
122+ return false ;
123+ }
124+
84125 inline Bucket& deterministic_bucket () {
85126 return buckets[0 ];
86127 }
@@ -119,6 +160,11 @@ class SparseSketch {
119160 ll_metadata = (uint8_t *) &buckets[calc_metadata_index (num_dense_rows)];
120161 }
121162
163+ // given another SparseSketch column, merge it into ours
164+ void merge_sparse_column (SparseBucket *oth_sparse_buckets, uint8_t *oth_ll_metadata, size_t col);
165+
166+ void validate ();
167+
122168 public:
123169 /* *
124170 * The below constructors use vector length as their input. However, in graph sketching our input
0 commit comments