@@ -98,25 +98,26 @@ function threaded_betweenness_centrality(
9898 k = length (vs)
9999 isdir = is_directed (g)
100100
101- local_betweenness = [zeros (n_v) for i in 1 : nthreads ()]
102101 vs_active = findall ((x) -> degree (g, x) > 0 , vs) # 0 might be 1?
102+ k_active = length (vs_active)
103+ d, r = divrem (k_active, Threads. nthreads ())
104+ ntasks = d == 0 ? r : Threads. nthreads ()
105+ local_betweenness = [zeros (n_v) for _ in 1 : ntasks]
106+ task_size = cld (k_active, ntasks)
103107
104- Base. Threads. @threads for s in vs_active
105- state = Graphs. dijkstra_shortest_paths (
106- g, s, distmx; allpaths= true , trackvertices= true
107- )
108- if endpoints
109- Graphs. _accumulate_endpoints! (
110- local_betweenness[Base. Threads. threadid ()], state, g, s
111- )
112- else
113- Graphs. _accumulate_basic! (
114- local_betweenness[Base. Threads. threadid ()], state, g, s
108+ @sync for (t, task_range) in enumerate (Iterators. partition (1 : k_active, task_size))
109+ Threads. @spawn for s in @view (vs_active[task_range])
110+ state = Graphs. dijkstra_shortest_paths (
111+ g, s, distmx; allpaths= true , trackvertices= true
115112 )
113+ if endpoints
114+ Graphs. _accumulate_endpoints! (local_betweenness[t], state, g, s)
115+ else
116+ Graphs. _accumulate_basic! (local_betweenness[t], state, g, s)
117+ end
116118 end
117119 end
118120 betweenness = reduce (+ , local_betweenness)
119-
120121 Graphs. _rescale! (betweenness, n_v, normalize, isdir, k)
121122
122123 return betweenness
0 commit comments