Skip to content

Commit 7ead437

Browse files
committed
Optimize visited filling
1 parent d6df31a commit 7ead437

1 file changed

Lines changed: 25 additions & 10 deletions

File tree

src/order.jl

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ end
8888
function 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
331335
function 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 π
400415
end

0 commit comments

Comments
 (0)