Skip to content

Commit 4edaf7e

Browse files
authored
improve cat design / performance (#49322)
This used to make a lot of references to design issues with the SparseArrays package (JuliaLang/julia#2326 / JuliaLang/julia#20815), which result in a non-sensical dispatch arrangement, and contribute to a slow loading experience do to the nonsense Unions that must be checked by subtyping.
1 parent 4746761 commit 4edaf7e

File tree

2 files changed

+11
-29
lines changed

2 files changed

+11
-29
lines changed

src/special.jl

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -330,27 +330,11 @@ end
330330
==(A::Bidiagonal, B::SymTridiagonal) = iszero(_evview(B)) && iszero(A.ev) && A.dv == B.dv
331331
==(B::SymTridiagonal, A::Bidiagonal) = A == B
332332

333-
# concatenation
334-
const _SpecialArrays = Union{Diagonal, Bidiagonal, Tridiagonal, SymTridiagonal}
335-
const _Symmetric_DenseArrays{T,A<:Matrix} = Symmetric{T,A}
336-
const _Hermitian_DenseArrays{T,A<:Matrix} = Hermitian{T,A}
337-
const _Triangular_DenseArrays{T,A<:Matrix} = UpperOrLowerTriangular{T,A}
338-
const _Annotated_DenseArrays = Union{_SpecialArrays, _Triangular_DenseArrays, _Symmetric_DenseArrays, _Hermitian_DenseArrays}
339-
const _Annotated_Typed_DenseArrays{T} = Union{_Triangular_DenseArrays{T}, _Symmetric_DenseArrays{T}, _Hermitian_DenseArrays{T}}
340-
const _DenseConcatGroup = Union{Number, Vector, Adjoint{<:Any,<:Vector}, Transpose{<:Any,<:Vector}, Matrix, _Annotated_DenseArrays}
341-
const _TypedDenseConcatGroup{T} = Union{Vector{T}, Adjoint{T,Vector{T}}, Transpose{T,Vector{T}}, Matrix{T}, _Annotated_Typed_DenseArrays{T}}
342-
343-
promote_to_array_type(::Tuple{Vararg{Union{_DenseConcatGroup,UniformScaling}}}) = Matrix
344-
345-
Base._cat(dims, xs::_DenseConcatGroup...) = Base._cat_t(dims, promote_eltype(xs...), xs...)
346-
vcat(A::_DenseConcatGroup...) = Base.typed_vcat(promote_eltype(A...), A...)
347-
hcat(A::_DenseConcatGroup...) = Base.typed_hcat(promote_eltype(A...), A...)
348-
hvcat(rows::Tuple{Vararg{Int}}, xs::_DenseConcatGroup...) = Base.typed_hvcat(promote_eltype(xs...), rows, xs...)
349-
# For performance, specially handle the case where the matrices/vectors have homogeneous eltype
350-
Base._cat(dims, xs::_TypedDenseConcatGroup{T}...) where {T} = Base._cat_t(dims, T, xs...)
351-
vcat(A::_TypedDenseConcatGroup{T}...) where {T} = Base.typed_vcat(T, A...)
352-
hcat(A::_TypedDenseConcatGroup{T}...) where {T} = Base.typed_hcat(T, A...)
353-
hvcat(rows::Tuple{Vararg{Int}}, xs::_TypedDenseConcatGroup{T}...) where {T} = Base.typed_hvcat(T, rows, xs...)
333+
# TODO: remove these deprecations (used by SparseArrays in the past)
334+
const _DenseConcatGroup = Union{}
335+
const _SpecialArrays = Union{}
336+
337+
promote_to_array_type(::Tuple) = Matrix
354338

355339
# factorizations
356340
function cholesky(S::RealHermSymComplexHerm{<:Real,<:SymTridiagonal}, ::NoPivot = NoPivot(); check::Bool = true)

src/uniformscaling.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ end
408408
# so that we can re-use this code for sparse-matrix hcat etcetera.
409409
promote_to_arrays_(n::Int, ::Type, a::Number) = a
410410
promote_to_arrays_(n::Int, ::Type{Matrix}, J::UniformScaling{T}) where {T} = Matrix(J, n, n)
411-
promote_to_arrays_(n::Int, ::Type, A::AbstractVecOrMat) = A
411+
promote_to_arrays_(n::Int, ::Type, A::AbstractArray) = A
412412
promote_to_arrays(n,k, ::Type) = ()
413413
promote_to_arrays(n,k, ::Type{T}, A) where {T} = (promote_to_arrays_(n[k], T, A),)
414414
promote_to_arrays(n,k, ::Type{T}, A, B) where {T} =
@@ -417,17 +417,16 @@ promote_to_arrays(n,k, ::Type{T}, A, B, C) where {T} =
417417
(promote_to_arrays_(n[k], T, A), promote_to_arrays_(n[k+1], T, B), promote_to_arrays_(n[k+2], T, C))
418418
promote_to_arrays(n,k, ::Type{T}, A, B, Cs...) where {T} =
419419
(promote_to_arrays_(n[k], T, A), promote_to_arrays_(n[k+1], T, B), promote_to_arrays(n,k+2, T, Cs...)...)
420-
promote_to_array_type(A::Tuple{Vararg{Union{AbstractVecOrMat,UniformScaling,Number}}}) = Matrix
421420

422421
_us2number(A) = A
423422
_us2number(J::UniformScaling) = J.λ
424423

425424
for (f, _f, dim, name) in ((:hcat, :_hcat, 1, "rows"), (:vcat, :_vcat, 2, "cols"))
426425
@eval begin
427-
@inline $f(A::Union{AbstractVecOrMat,UniformScaling}...) = $_f(A...)
426+
@inline $f(A::Union{AbstractArray,UniformScaling}...) = $_f(A...)
428427
# if there's a Number present, J::UniformScaling must be 1x1-dimensional
429-
@inline $f(A::Union{AbstractVecOrMat,UniformScaling,Number}...) = $f(map(_us2number, A)...)
430-
function $_f(A::Union{AbstractVecOrMat,UniformScaling,Number}...; array_type = promote_to_array_type(A))
428+
@inline $f(A::Union{AbstractArray,UniformScaling,Number}...) = $f(map(_us2number, A)...)
429+
function $_f(A::Union{AbstractArray,UniformScaling,Number}...; array_type = promote_to_array_type(A))
431430
n = -1
432431
for a in A
433432
if !isa(a, UniformScaling)
@@ -445,9 +444,8 @@ for (f, _f, dim, name) in ((:hcat, :_hcat, 1, "rows"), (:vcat, :_vcat, 2, "cols"
445444
end
446445
end
447446

448-
hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractVecOrMat,UniformScaling}...) = _hvcat(rows, A...)
449-
hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractVecOrMat,UniformScaling,Number}...) = _hvcat(rows, A...)
450-
function _hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractVecOrMat,UniformScaling,Number}...; array_type = promote_to_array_type(A))
447+
hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractArray,UniformScaling,Number}...) = _hvcat(rows, A...)
448+
function _hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractArray,UniformScaling,Number}...; array_type = promote_to_array_type(A))
451449
require_one_based_indexing(A...)
452450
nr = length(rows)
453451
sum(rows) == length(A) || throw(ArgumentError("mismatch between row sizes and number of arguments"))

0 commit comments

Comments
 (0)