Skip to content

Commit b72cd06

Browse files
authored
Optimize ordering for bipartite graphs (#174)
1 parent 750be07 commit b72cd06

1 file changed

Lines changed: 17 additions & 4 deletions

File tree

src/order.jl

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,28 @@ function vertices(
219219
g::BipartiteGraph, ::Val{side}, ::DynamicDegreeBasedOrder{degtype,direction}
220220
) where {side,degtype,direction}
221221
other_side = 3 - side
222+
# compute dist-2 degrees in an optimized way
223+
n = nb_vertices(g, Val(side))
224+
degrees_dist2 = zeros(Int, n)
225+
dist2_neighbor = falses(n)
226+
for v in vertices(g, Val(side))
227+
fill!(dist2_neighbor, false)
228+
for w1 in neighbors(g, Val(side), v)
229+
for w2 in neighbors(g, Val(other_side), w1)
230+
dist2_neighbor[w2] = true
231+
end
232+
end
233+
degrees_dist2[v] = sum(dist2_neighbor)
234+
end
222235
if degree_increasing(; degtype, direction)
223-
degrees = zeros(Int, nb_vertices(g, Val(side)))
236+
degrees = zeros(Int, n)
224237
else
225-
degrees = [degree_dist2(g, Val(side), v) for v in vertices(g, Val(side))] # TODO: optimize
238+
degrees = degrees_dist2
226239
end
227-
maxd2 = maximum(v -> degree_dist2(g, Val(side), v), vertices(g, Val(side))) # TODO: optimize
240+
maxd2 = maximum(degrees_dist2)
228241
db = DegreeBuckets(degrees, maxd2)
229242
π = Int[]
230-
visited = falses(nb_vertices(g, Val(side)))
243+
visited = falses(n)
231244
for _ in 1:nb_vertices(g, Val(side))
232245
u = pop_next_candidate!(db; direction)
233246
direction == :low2high ? push!(π, u) : pushfirst!(π, u)

0 commit comments

Comments
 (0)