@@ -80,17 +80,17 @@ Instance of [`AbstractOrder`](@ref) which sorts vertices using their degree in t
8080struct LargestFirst <: AbstractOrder end
8181
8282function vertices (g:: AdjacencyGraph , :: LargestFirst )
83- criterion (v) = degree (g, v)
83+ degrees = map (Base. Fix1 (degree, g), vertices (g))
84+ criterion (v) = degrees[v]
8485 return sort (vertices (g); by= criterion, rev= true )
8586end
8687
8788function vertices (bg:: BipartiteGraph{T} , :: Val{side} , :: LargestFirst ) where {T,side}
8889 other_side = 3 - side
8990 n = nb_vertices (bg, Val (side))
90- visited = falses ( n) # necessary for distance-2 neighborhoods
91+ visited = fill ( false , n) # necessary for distance-2 neighborhoods
9192 degrees_dist2 = zeros (T, n)
9293 for v in vertices (bg, Val (side))
93- fill! (visited, false )
9494 for u in neighbors (bg, Val (side), v)
9595 for w in neighbors (bg, Val (other_side), u)
9696 if w != v && ! visited[w]
@@ -99,6 +99,11 @@ function vertices(bg::BipartiteGraph{T}, ::Val{side}, ::LargestFirst) where {T,s
9999 end
100100 end
101101 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
102107 end
103108 criterion (v) = degrees_dist2[v]
104109 return sort (vertices (bg, Val (side)); by= criterion, rev= true )
@@ -330,13 +335,14 @@ end
330335function vertices (
331336 g:: AdjacencyGraph{T} , order:: DynamicDegreeBasedOrder{degtype,direction}
332337) where {T<: Integer ,degtype,direction}
338+ true_degrees = degrees = T[degree (g, v) for v in vertices (g)]
333339 if degree_increasing (; degtype, direction)
334340 degrees = zeros (T, nb_vertices (g))
335341 else
336- degrees = T[ degree (g, v) for v in vertices (g)]
342+ degrees = true_degrees
337343 end
338344 db = DegreeBuckets (
339- T, degrees, maximum_degree (g ); reproduce_colpack= order. reproduce_colpack
345+ T, degrees, maximum (true_degrees ); reproduce_colpack= order. reproduce_colpack
340346 )
341347 π = T[]
342348 sizehint! (π, nb_vertices (g))
@@ -359,15 +365,21 @@ function vertices(
359365 # compute dist-2 degrees in an optimized way
360366 n = nb_vertices (g, Val (side))
361367 degrees_dist2 = zeros (T, n)
362- dist2_neighbor = falses ( n)
368+ visited = fill ( false , n)
363369 for v in vertices (g, Val (side))
364- fill! (dist2_neighbor, false )
365370 for w1 in neighbors (g, Val (side), v)
366371 for w2 in neighbors (g, Val (other_side), w1)
367- dist2_neighbor[w2] = true
372+ if w2 != v && ! visited[w2]
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
368381 end
369382 end
370- degrees_dist2[v] = sum (dist2_neighbor)
371383 end
372384 if degree_increasing (; degtype, direction)
373385 degrees = zeros (T, n)
@@ -378,7 +390,7 @@ function vertices(
378390 db = DegreeBuckets (T, degrees, maxd2; reproduce_colpack= order. reproduce_colpack)
379391 π = T[]
380392 sizehint! (π, n)
381- visited = falses (n )
393+ fill! ( visited, false )
382394 for _ in 1 : nb_vertices (g, Val (side))
383395 u = pop_next_candidate! (db; direction)
384396 direction == :low2high ? push! (π, u) : pushfirst! (π, u)
@@ -393,7 +405,11 @@ function vertices(
393405 update_bucket! (db, v; degtype, direction)
394406 end
395407 end
396- 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
397413 end
398414 return π
399415end
0 commit comments