201201
202202function 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
230233function 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
258264function 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)
267274end
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
381388function 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)
450458end
451459
452460# Specialized version of the function in `neighborhood_search.jl`, which is faster
0 commit comments