@@ -194,12 +194,14 @@ end
194194
195195function initialize! (neighborhood_search:: GridNeighborhoodSearch ,
196196 x:: AbstractMatrix , y:: AbstractMatrix ;
197- parallelization_backend = default_backend (x))
198- initialize_grid! (neighborhood_search, y; parallelization_backend)
197+ parallelization_backend = default_backend (x),
198+ eachindex_y = axes (y, 2 ))
199+ initialize_grid! (neighborhood_search, y; parallelization_backend, eachindex_y)
199200end
200201
201202function initialize_grid! (neighborhood_search:: GridNeighborhoodSearch , y:: AbstractMatrix ;
202- parallelization_backend = default_backend (y))
203+ parallelization_backend = default_backend (y),
204+ eachindex_y = axes (y, 2 ))
203205 (; cell_list) = neighborhood_search
204206
205207 empty! (cell_list)
@@ -210,8 +212,10 @@ function initialize_grid!(neighborhood_search::GridNeighborhoodSearch, y::Abstra
210212 return neighborhood_search
211213 end
212214
215+ @boundscheck checkbounds (y, eachindex_y)
216+
213217 # Ignore the parallelization backend here. This cannot be parallelized.
214- for point in axes (y, 2 )
218+ for point in eachindex_y
215219 # Get cell index of the point's cell
216220 point_coords = @inbounds extract_svector (y, Val (ndims (neighborhood_search)), point)
217221 cell = cell_coords (point_coords, neighborhood_search)
225229
226230function initialize_grid! (neighborhood_search:: GridNeighborhoodSearch {<: Any ,
227231 ParallelUpdate},
228- y:: AbstractMatrix ; parallelization_backend = default_backend (y))
232+ y:: AbstractMatrix ; parallelization_backend = default_backend (y),
233+ eachindex_y = axes (y, 2 ))
229234 (; cell_list) = neighborhood_search
230235
231236 empty! (cell_list)
@@ -236,7 +241,9 @@ function initialize_grid!(neighborhood_search::GridNeighborhoodSearch{<:Any,
236241 return neighborhood_search
237242 end
238243
239- @threaded parallelization_backend for point in axes (y, 2 )
244+ @boundscheck checkbounds (y, eachindex_y)
245+
246+ @threaded parallelization_backend for point in eachindex_y
240247 # Get cell index of the point's cell
241248 point_coords = @inbounds extract_svector (y, Val (ndims (neighborhood_search)), point)
242249 cell = cell_coords (point_coords, neighborhood_search)
@@ -250,19 +257,30 @@ end
250257
251258function update! (neighborhood_search:: GridNeighborhoodSearch ,
252259 x:: AbstractMatrix , y:: AbstractMatrix ;
253- points_moving = (true , true ), parallelization_backend = default_backend (x))
260+ points_moving = (true , true ), parallelization_backend = default_backend (x),
261+ eachindex_y = axes (y, 2 ))
254262 # The coordinates of the first set of points are irrelevant for this NHS.
255263 # Only update when the second set is moving.
256264 points_moving[2 ] || return neighborhood_search
257265
258- update_grid! (neighborhood_search, y; parallelization_backend)
266+ update_grid! (neighborhood_search, y; eachindex_y, parallelization_backend)
259267end
260268
261269# Update only with neighbor coordinates
262- function update_grid! (neighborhood_search:: GridNeighborhoodSearch , y:: AbstractMatrix ;
263- parallelization_backend = default_backend (y))
270+ function update_grid! (neighborhood_search:: Union {GridNeighborhoodSearch{<: Any ,
271+ SerialIncrementalUpdate},
272+ GridNeighborhoodSearch{<: Any ,
273+ SemiParallelUpdate}},
274+ y:: AbstractMatrix ;
275+ parallelization_backend = default_backend (y),
276+ eachindex_y = axes (y, 2 ))
264277 (; cell_list, update_buffer) = neighborhood_search
265278
279+ if eachindex_y != axes (y, 2 )
280+ # Incremental update doesn't support inactive points
281+ error (" this neighborhood search/update strategy does not support inactive points" )
282+ end
283+
266284 # Empty each thread's list
267285 @threaded parallelization_backend for i in eachindex (update_buffer)
268286 emptyat! (update_buffer, i)
362380# Fully parallel incremental update with atomic push.
363381function update_grid! (neighborhood_search:: GridNeighborhoodSearch {<: Any ,
364382 ParallelIncrementalUpdate},
365- y:: AbstractMatrix ; parallelization_backend = default_backend (y))
383+ y:: AbstractMatrix ; parallelization_backend = default_backend (y),
384+ eachindex_y = axes (y, 2 ))
366385 (; cell_list, update_buffer) = neighborhood_search
367386
387+ if eachindex_y != axes (y, 2 )
388+ # Incremental update doesn't support inactive points
389+ error (" this neighborhood search/update strategy does not support inactive points" )
390+ end
391+
368392 # Note that we need two separate loops for adding and removing points.
369393 # `push_cell_atomic!` only guarantees thread-safety when different threads push
370394 # simultaneously, but it does not work when `deleteat_cell!` is called at the same time.
@@ -420,8 +444,9 @@ function update_grid!(neighborhood_search::Union{GridNeighborhoodSearch{<:Any,
420444 ParallelUpdate},
421445 GridNeighborhoodSearch{<: Any ,
422446 SerialUpdate}},
423- y:: AbstractMatrix ; parallelization_backend = default_backend (y))
424- initialize_grid! (neighborhood_search, y; parallelization_backend)
447+ y:: AbstractMatrix ; parallelization_backend = default_backend (y),
448+ eachindex_y = axes (y, 2 ))
449+ initialize_grid! (neighborhood_search, y; parallelization_backend, eachindex_y)
425450end
426451
427452# Specialized version of the function in `neighborhood_search.jl`, which is faster
0 commit comments