8888function vertices (bg:: BipartiteGraph{T} , :: Val{side} , :: LargestFirst ) where {T,side}
8989 other_side = 3 - side
9090 n = nb_vertices (bg, Val (side))
91- visited = falses ( n) # necessary for distance-2 neighborhoods
91+ visited = fill ( false , n) # necessary for distance-2 neighborhoods
9292 degrees_dist2 = zeros (T, n)
9393 for v in vertices (bg, Val (side))
94- fill! (visited, false )
9594 for u in neighbors (bg, Val (side), v)
9695 for w in neighbors (bg, Val (other_side), u)
9796 if w != v && ! visited[w]
@@ -100,6 +99,11 @@ function vertices(bg::BipartiteGraph{T}, ::Val{side}, ::LargestFirst) where {T,s
10099 end
101100 end
102101 end
102+ for u in neighbors (bg, Val (side), v)
103+ for w in neighbors (bg, Val (other_side), u)
104+ visited[w] = false # reset only the toggled ones to false
105+ end
106+ end
103107 end
104108 criterion (v) = degrees_dist2[v]
105109 return sort (vertices (bg, Val (side)); by= criterion, rev= true )
@@ -331,13 +335,14 @@ end
331335function vertices (
332336 g:: AdjacencyGraph{T} , order:: DynamicDegreeBasedOrder{degtype,direction}
333337) where {T<: Integer ,degtype,direction}
338+ true_degrees = degrees = T[degree (g, v) for v in vertices (g)]
334339 if degree_increasing (; degtype, direction)
335340 degrees = zeros (T, nb_vertices (g))
336341 else
337- degrees = T[ degree (g, v) for v in vertices (g)]
342+ degrees = true_degrees
338343 end
339344 db = DegreeBuckets (
340- T, degrees, maximum_degree (g ); reproduce_colpack= order. reproduce_colpack
345+ T, degrees, maximum (true_degrees ); reproduce_colpack= order. reproduce_colpack
341346 )
342347 π = T[]
343348 sizehint! (π, nb_vertices (g))
@@ -360,15 +365,21 @@ function vertices(
360365 # compute dist-2 degrees in an optimized way
361366 n = nb_vertices (g, Val (side))
362367 degrees_dist2 = zeros (T, n)
363- dist2_neighbor = falses ( n)
368+ visited = fill ( false , n)
364369 for v in vertices (g, Val (side))
365- fill! (dist2_neighbor, false )
366370 for w1 in neighbors (g, Val (side), v)
367371 for w2 in neighbors (g, Val (other_side), w1)
368- dist2_neighbor[w2] = true
372+ if w != v && ! visited[w]
373+ degrees_dist2[v] += 1
374+ visited[w2] = true
375+ end
376+ end
377+ end
378+ for w1 in neighbors (g, Val (side), v)
379+ for w2 in neighbors (g, Val (other_side), w1)
380+ visited[w2] = false
369381 end
370382 end
371- degrees_dist2[v] = sum (dist2_neighbor)
372383 end
373384 if degree_increasing (; degtype, direction)
374385 degrees = zeros (T, n)
@@ -379,7 +390,7 @@ function vertices(
379390 db = DegreeBuckets (T, degrees, maxd2; reproduce_colpack= order. reproduce_colpack)
380391 π = T[]
381392 sizehint! (π, n)
382- visited = falses (n )
393+ fill! ( visited, false )
383394 for _ in 1 : nb_vertices (g, Val (side))
384395 u = pop_next_candidate! (db; direction)
385396 direction == :low2high ? push! (π, u) : pushfirst! (π, u)
@@ -394,7 +405,11 @@ function vertices(
394405 update_bucket! (db, v; degtype, direction)
395406 end
396407 end
397- fill! (visited, false )
408+ for w in neighbors (g, Val (side), u)
409+ for v in neighbors (g, Val (other_side), w)
410+ visited[v] = false # reset only the toggled ones to false
411+ end
412+ end
398413 end
399414 return π
400415end
0 commit comments