@@ -588,43 +588,45 @@ void CCSketchAlg::filter_sf_edges(SpanningForest &sf) {
588588 size_t start = partition.first ;
589589 size_t end = partition.second ;
590590
591- // check if we collide with previous thread. If so lock and apply those updates.
592- if (start > 0 && edges[start].src == edges[start - 1 ].src ) {
593- sketches[edges[start].src ]->mutex .lock ();
594- size_t orig_start = start;
595- while (start < end && edges[start].src == edges[orig_start].src ) {
596- Edge edge = edges[start];
597- sketches[edge.src ]->update (static_cast <vec_t >(concat_pairing_fn (edge.src , edge.dst )));
598- ++start;
591+ if (start != end) {
592+ // check if we collide with previous thread. If so lock and apply those updates.
593+ if (start > 0 && edges[start].src == edges[start - 1 ].src ) {
594+ sketches[edges[start].src ]->mutex .lock ();
595+ size_t orig_start = start;
596+ while (start < end && edges[start].src == edges[orig_start].src ) {
597+ Edge edge = edges[start];
598+ sketches[edge.src ]->update (static_cast <vec_t >(concat_pairing_fn (edge.src , edge.dst )));
599+ ++start;
600+ }
601+
602+ sketches[edges[orig_start].src ]->mutex .unlock ();
599603 }
600604
601- sketches[edges[orig_start].src ]->mutex .unlock ();
602- }
605+ // check if we collide with next thread. If so lock and apply those updates.
606+ if (end > start && end < edges.size () && edges[end - 1 ].src == edges[end].src ) {
607+ sketches[edges[end - 1 ].src ]->mutex .lock ();
608+ size_t orig_end = end;
609+ while (end > start && edges[end - 1 ].src == edges[orig_end - 1 ].src ) {
610+ Edge edge = edges[end - 1 ];
611+ sketches[edge.src ]->update (static_cast <vec_t >(concat_pairing_fn (edge.src , edge.dst )));
612+ --end;
613+ }
603614
604- // check if we collide with next thread. If so lock and apply those updates.
605- if (end > start && end < edges.size () && edges[end - 1 ].src == edges[end].src ) {
606- sketches[edges[end - 1 ].src ]->mutex .lock ();
607- size_t orig_end = end;
608- while (edges[end - 1 ].src == edges[orig_end - 1 ].src ) {
609- Edge edge = edges[end - 1 ];
610- sketches[edge.src ]->update (static_cast <vec_t >(concat_pairing_fn (edge.src , edge.dst )));
611- --end;
615+ sketches[edges[orig_end].src ]->mutex .unlock ();
612616 }
613617
614- sketches[edges[orig_end].src ]->mutex .unlock ();
615- }
616-
617- for (size_t i = start; i < end; i++) {
618- Edge edge = edges[i];
619- sketches[edge.src ]->update (static_cast <vec_t >(concat_pairing_fn (edge.src , edge.dst )));
618+ for (size_t i = start; i < end; i++) {
619+ Edge edge = edges[i];
620+ sketches[edge.src ]->update (static_cast <vec_t >(concat_pairing_fn (edge.src , edge.dst )));
621+ }
620622 }
621623 }
622624
623625 // delete_time += std::chrono::steady_clock::now() - start;
624626}
625627
626628std::vector<SpanningForest> CCSketchAlg::calc_disjoint_spanning_forests (size_t k) {
627- std::cout << " Spanning forests query begins . Number of updates = " << num_updates.load () << std::endl;
629+ std::cout << " Spanning forests query. Number of updates = " << num_updates.load () << std::endl;
628630
629631 // sf_query_start = std::chrono::steady_clock::now();
630632 std::vector<SpanningForest> SFs;
0 commit comments