Skip to content

Commit 5c8b76c

Browse files
committed
Add kwarg points_active to update! and initialize!
1 parent b7a96e9 commit 5c8b76c

File tree

4 files changed

+42
-32
lines changed

4 files changed

+42
-32
lines changed

src/neighborhood_search.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ See also [`update!`](@ref).
3535
"""
3636
@inline function initialize!(search::AbstractNeighborhoodSearch, x, y;
3737
parallelization_backend = default_backend(x),
38-
eachindex_y = axes(y, 2))
38+
eachindex_y = axes(y, 2), points_active = nothing)
3939
return search
4040
end
4141

@@ -73,7 +73,7 @@ See also [`initialize!`](@ref).
7373
@inline function update!(search::AbstractNeighborhoodSearch, x, y;
7474
points_moving = (true, true),
7575
parallelization_backend = default_backend(x),
76-
eachindex_y = axes(y, 2))
76+
eachindex_y = axes(y, 2), points_active = nothing)
7777
return search
7878
end
7979

src/nhs_grid.jl

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ end
201201

202202
function initialize_grid!(neighborhood_search::GridNeighborhoodSearch, y::AbstractMatrix;
203203
parallelization_backend = default_backend(y),
204-
eachindex_y = axes(y, 2))
204+
eachindex_y = axes(y, 2), points_active = nothing)
205205
(; cell_list) = neighborhood_search
206206

207207
empty!(cell_list)
@@ -216,12 +216,15 @@ function initialize_grid!(neighborhood_search::GridNeighborhoodSearch, y::Abstra
216216

217217
# Ignore the parallelization backend here. This cannot be parallelized.
218218
for point in eachindex_y
219-
# Get cell index of the point's cell
220-
point_coords = @inbounds extract_svector(y, Val(ndims(neighborhood_search)), point)
221-
cell = cell_coords(point_coords, neighborhood_search)
222-
223-
# Add point to corresponding cell
224-
push_cell!(cell_list, cell, point)
219+
# This check is optimized away when `points_active` is `nothing`
220+
if point_active(points_active, point)
221+
# Get cell index of the point's cell
222+
point_coords = @inbounds extract_svector(y, Val(ndims(neighborhood_search)), point)
223+
cell = cell_coords(point_coords, neighborhood_search)
224+
225+
# Add point to corresponding cell
226+
push_cell!(cell_list, cell, point)
227+
end
225228
end
226229

227230
return neighborhood_search
@@ -230,7 +233,7 @@ end
230233
function initialize_grid!(neighborhood_search::GridNeighborhoodSearch{<:Any,
231234
ParallelUpdate},
232235
y::AbstractMatrix; parallelization_backend = default_backend(y),
233-
eachindex_y = axes(y, 2))
236+
eachindex_y = axes(y, 2), points_active = nothing)
234237
(; cell_list) = neighborhood_search
235238

236239
empty!(cell_list)
@@ -244,12 +247,15 @@ function initialize_grid!(neighborhood_search::GridNeighborhoodSearch{<:Any,
244247
@boundscheck checkbounds(y, eachindex_y)
245248

246249
@threaded parallelization_backend for point in eachindex_y
247-
# Get cell index of the point's cell
248-
point_coords = @inbounds extract_svector(y, Val(ndims(neighborhood_search)), point)
249-
cell = cell_coords(point_coords, neighborhood_search)
250-
251-
# Add point to corresponding cell
252-
push_cell_atomic!(cell_list, cell, point)
250+
# This check is optimized away when `points_active` is `nothing`
251+
if point_active(points_active, point)
252+
# Get cell index of the point's cell
253+
point_coords = @inbounds extract_svector(y, Val(ndims(neighborhood_search)), point)
254+
cell = cell_coords(point_coords, neighborhood_search)
255+
256+
# Add point to corresponding cell
257+
push_cell_atomic!(cell_list, cell, point)
258+
end
253259
end
254260

255261
return neighborhood_search
@@ -258,12 +264,13 @@ end
258264
function update!(neighborhood_search::GridNeighborhoodSearch,
259265
x::AbstractMatrix, y::AbstractMatrix;
260266
points_moving = (true, true), parallelization_backend = default_backend(x),
261-
eachindex_y = axes(y, 2))
267+
eachindex_y = axes(y, 2), points_active = nothing)
262268
# The coordinates of the first set of points are irrelevant for this NHS.
263269
# Only update when the second set is moving.
264270
points_moving[2] || return neighborhood_search
265271

266-
update_grid!(neighborhood_search, y; eachindex_y, parallelization_backend)
272+
update_grid!(neighborhood_search, y; eachindex_y, points_active,
273+
parallelization_backend)
267274
end
268275

269276
# Update only with neighbor coordinates
@@ -273,10 +280,10 @@ function update_grid!(neighborhood_search::Union{GridNeighborhoodSearch{<:Any,
273280
SemiParallelUpdate}},
274281
y::AbstractMatrix;
275282
parallelization_backend = default_backend(y),
276-
eachindex_y = axes(y, 2))
283+
eachindex_y = axes(y, 2), points_active = nothing)
277284
(; cell_list, update_buffer) = neighborhood_search
278285

279-
if eachindex_y != axes(y, 2)
286+
if eachindex_y != axes(y, 2) || points_active !== nothing
280287
# Incremental update doesn't support inactive points
281288
error("this neighborhood search/update strategy does not support inactive points")
282289
end
@@ -381,10 +388,10 @@ end
381388
function update_grid!(neighborhood_search::GridNeighborhoodSearch{<:Any,
382389
ParallelIncrementalUpdate},
383390
y::AbstractMatrix; parallelization_backend = default_backend(y),
384-
eachindex_y = axes(y, 2))
391+
eachindex_y = axes(y, 2), points_active = nothing)
385392
(; cell_list, update_buffer) = neighborhood_search
386393

387-
if eachindex_y != axes(y, 2)
394+
if eachindex_y != axes(y, 2) || points_active !== nothing
388395
# Incremental update doesn't support inactive points
389396
error("this neighborhood search/update strategy does not support inactive points")
390397
end
@@ -445,8 +452,9 @@ function update_grid!(neighborhood_search::Union{GridNeighborhoodSearch{<:Any,
445452
GridNeighborhoodSearch{<:Any,
446453
SerialUpdate}},
447454
y::AbstractMatrix; parallelization_backend = default_backend(y),
448-
eachindex_y = axes(y, 2))
449-
initialize_grid!(neighborhood_search, y; parallelization_backend, eachindex_y)
455+
eachindex_y = axes(y, 2), points_active = nothing)
456+
initialize_grid!(neighborhood_search, y; parallelization_backend,
457+
eachindex_y, points_active)
450458
end
451459

452460
# Specialized version of the function in `neighborhood_search.jl`, which is faster

src/nhs_precomputed.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,22 @@ end
7272
function update!(search::PrecomputedNeighborhoodSearch,
7373
x::AbstractMatrix, y::AbstractMatrix;
7474
points_moving = (true, true), parallelization_backend = default_backend(x),
75-
eachindex_y = axes(y, 2))
75+
eachindex_y = axes(y, 2), points_active = nothing)
7676
(; neighborhood_search, neighbor_lists) = search
7777

7878
# Update grid NHS
79-
update!(neighborhood_search, x, y; eachindex_y, points_moving, parallelization_backend)
79+
update!(neighborhood_search, x, y; eachindex_y, points_moving, points_active,
80+
parallelization_backend)
8081

8182
# Skip update if both point sets are static
8283
if any(points_moving)
8384
initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y,
84-
parallelization_backend, eachindex_y)
85+
parallelization_backend, eachindex_y, points_active)
8586
end
8687
end
8788

8889
function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y,
89-
parallelization_backend, eachindex_y)
90+
parallelization_backend, eachindex_y, points_active)
9091
# Initialize neighbor lists
9192
empty!(neighbor_lists)
9293
resize!(neighbor_lists, size(x, 2))
@@ -95,8 +96,9 @@ function initialize_neighbor_lists!(neighbor_lists, neighborhood_search, x, y,
9596
end
9697

9798
# Fill neighbor lists
98-
foreach_point_neighbor(x, y, neighborhood_search; parallelization_backend,
99-
points = eachindex_y) do point, neighbor, _, _
99+
foreach_point_neighbor(x, y, neighborhood_search;
100+
parallelization_backend, points = eachindex_y,
101+
points_active) do point, neighbor, _, _
100102
push!(neighbor_lists[point], neighbor)
101103
end
102104
end

src/nhs_trivial.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ end
3434

3535
@inline function initialize!(search::TrivialNeighborhoodSearch, x, y;
3636
parallelization_backend = default_backend(x),
37-
eachindex_y = axes(y, 2))
37+
eachindex_y = axes(y, 2), points_active = nothing)
3838
return search
3939
end
4040

4141
@inline function update!(search::TrivialNeighborhoodSearch, x, y;
4242
points_moving = (true, true),
4343
parallelization_backend = default_backend(x),
44-
eachindex_y = axes(y, 2))
44+
eachindex_y = axes(y, 2), points_active = nothing)
4545
return search
4646
end
4747

0 commit comments

Comments
 (0)