Skip to content

dbscan does not work using StaticArrays < 1.4.6 #221

@fhagemann

Description

@fhagemann

I spotted this using Clustering, but the underlying is NearestNeighbors using setindex on a StaticArray with index of type UInt16.

MWE:

# running in julia-1.10
import Pkg
Pkg.add("Clustering")
Pkg.add("NearestNeighbors")
Pkg.add(Pkg.PackageSpec(name = "StaticArrays", version = "1.0.0")) # every version until "1.4.5"

using Clustering
Clustering.dbscan([ 1 1 1 ; 1 2 3. ], 1, leafsize = 1)
MethodError: no method matching setindex(::StaticArrays.SVector{3, Float64}, ::Float64, ::UInt16)
The function `setindex` exists, but no method is defined for this combination of argument types.

Closest candidates are:
  setindex(::StaticArrays.StaticArray, ::Any, ::Int64)
   @ StaticArrays ~/.julia/packages/StaticArrays/WNOVH/src/deque.jl:185
  setindex(::StaticArrays.StaticArray, ::Any, ::Int64...)
   @ StaticArrays ~/.julia/packages/StaticArrays/WNOVH/src/deque.jl:198
  setindex(::CartesianIndex, ::Any, ::Any)
   @ Base multidimensional.jl:106
  ...

Stacktrace:
 [1] inrange_kernel!(tree::NearestNeighbors.KDTree{StaticArrays.SVector{3, Float64}, Distances.Euclidean, Float64, StaticArrays.SVector{3, Float64}}, index::Int64, point::SubArray{Float64, 1, LinearAlgebra.Adjoint{Float64, Matrix{Float64}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, false}, r::Int64, idx_in_ball::Vector{Int64}, hyper_rec::NearestNeighbors.HyperRectangle{StaticArrays.SVector{3, Float64}}, min_dist::Float64, max_dist_contribs::StaticArrays.SVector{3, Float64}, max_dist::Float64)
   @ NearestNeighbors ~/.julia/packages/NearestNeighbors/3NRL1/src/kd_tree.jl:254
 [2] _inrange(tree::NearestNeighbors.KDTree{StaticArrays.SVector{3, Float64}, Distances.Euclidean, Float64, StaticArrays.SVector{3, Float64}}, point::SubArray{Float64, 1, LinearAlgebra.Adjoint{Float64, Matrix{Float64}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, false}, radius::Int64, idx_in_ball::Vector{Int64})
   @ NearestNeighbors ~/.julia/packages/NearestNeighbors/3NRL1/src/kd_tree.jl:207
 [3] inrange_point!(tree::NearestNeighbors.KDTree{StaticArrays.SVector{3, Float64}, Distances.Euclidean, Float64, StaticArrays.SVector{3, Float64}}, point::SubArray{Float64, 1, LinearAlgebra.Adjoint{Float64, Matrix{Float64}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, false}, radius::Int64, sortres::Bool, idx::Vector{Int64})
   @ NearestNeighbors ~/.julia/packages/NearestNeighbors/3NRL1/src/inrange.jl:34
 [4] inrange!(idxs::Vector{Int64}, tree::NearestNeighbors.KDTree{StaticArrays.SVector{3, Float64}, Distances.Euclidean, Float64, StaticArrays.SVector{3, Float64}}, point::SubArray{Float64, 1, LinearAlgebra.Adjoint{Float64, Matrix{Float64}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, false}, radius::Int64, sortres::Bool)
   @ NearestNeighbors ~/.julia/packages/NearestNeighbors/3NRL1/src/inrange.jl:64
 [5] inrange (repeats 2 times)
   @ ~/.julia/packages/NearestNeighbors/3NRL1/src/inrange.jl:69 [inlined]
 [6] _dbscan_region_query!(neighbors::Vector{Int64}, nntree_and_points::Tuple{NearestNeighbors.KDTree{StaticArrays.SVector{3, Float64}, Distances.Euclidean, Float64, StaticArrays.SVector{3, Float64}}, LinearAlgebra.Adjoint{Float64, Matrix{Float64}}}, point::Int64, radius::Int64)
   @ Clustering ~/.julia/packages/Clustering/M6mjF/src/dbscan.jl:185
 [7] _dbscan(data::Tuple{NearestNeighbors.KDTree{StaticArrays.SVector{3, Float64}, Distances.Euclidean, Float64, StaticArrays.SVector{3, Float64}}, LinearAlgebra.Adjoint{Float64, Matrix{Float64}}}, num_points::Int64, radius::Int64, min_neighbors::Int64, min_cluster_size::Int64)
   @ Clustering ~/.julia/packages/Clustering/M6mjF/src/dbscan.jl:141
 [8] dbscan(points::LinearAlgebra.Adjoint{Float64, Matrix{Float64}}, radius::Int64; metric::Distances.Euclidean, min_neighbors::Int64, min_cluster_size::Int64, nntree_kwargs::@Kwargs{leafsize::Int64})
   @ Clustering ~/.julia/packages/Clustering/M6mjF/src/dbscan.jl:113
 [9] top-level scope
   @ REPL[3]:1

This behavior seems to have been introduced in #166, when going from split_dim::Int to split_dim::Int16 in NearestNeighbors ≥ 0.4.14

NearestNeighbors allows for StaticArrays versions down to 0.9.0, even though it should only allow for StaticArrays ≥ 0.14.6 since /NearestNeighbors@0.4.14.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions