diff --git a/src/sparsematrix.jl b/src/sparsematrix.jl index fced1b28..56ee216a 100644 --- a/src/sparsematrix.jl +++ b/src/sparsematrix.jl @@ -2402,7 +2402,7 @@ function Base.reducedim_initarray(A::AbstractSparseMatrixCSC, region, v0, ::Type end # General mapreduce -function _mapreducezeros(f, op, ::Type{T}, nzeros::Integer, v0) where T +function _mapreducezeros(f::F, op::G, ::Type{T}, nzeros::Integer, v0) where {F,G,T} nzeros == 0 && return v0 # Reduce over first zero @@ -2421,7 +2421,7 @@ function _mapreducezeros(f, op, ::Type{T}, nzeros::Integer, v0) where T v end -function Base._mapreduce(f, op, ::Base.IndexCartesian, A::AbstractSparseMatrixCSC{T}) where T +function Base._mapreduce(f::F, op::G, ::Base.IndexCartesian, A::AbstractSparseMatrixCSC{T}) where {F,G,T} z = nnz(A) n = widelength(A) if z == 0 @@ -2436,11 +2436,11 @@ function Base._mapreduce(f, op, ::Base.IndexCartesian, A::AbstractSparseMatrixCS end # Specialized mapreduce for +/*/min/max/_extrema_rf -_mapreducezeros(f, op::Union{typeof(Base.add_sum),typeof(+)}, ::Type{T}, nzeros::Integer, v0) where {T} = +_mapreducezeros(f::F, op::Union{typeof(Base.add_sum),typeof(+)}, ::Type{T}, nzeros::Integer, v0) where {F,T} = nzeros == 0 ? op(zero(v0), v0) : op(f(zero(T))*nzeros, v0) -_mapreducezeros(f, op::Union{typeof(Base.mul_prod),typeof(*)},::Type{T}, nzeros::Integer, v0) where {T} = +_mapreducezeros(f::F, op::Union{typeof(Base.mul_prod),typeof(*)},::Type{T}, nzeros::Integer, v0) where {F,T} = nzeros == 0 ? op(one(v0), v0) : op(f(zero(T))^nzeros, v0) -_mapreducezeros(f, op::Union{typeof(min),typeof(max)}, ::Type{T}, nzeros::Integer, v0) where {T} = +_mapreducezeros(f::F, op::Union{typeof(min),typeof(max)}, ::Type{T}, nzeros::Integer, v0) where {F,T} = nzeros == 0 ? v0 : op(v0, f(zero(T))) _mapreducezeros(f::Base.ExtremaMap, op::typeof(Base._extrema_rf), ::Type{T}, nzeros::Integer, v0) where {T} = nzeros == 0 ? v0 : op(v0, f(zero(T))) @@ -2451,7 +2451,7 @@ Base._any(f, A::AbstractSparseMatrixCSC, ::Colon) = Base._all(f, A::AbstractSparseMatrixCSC, ::Colon) = iszero(widelength(A)) ? true : Base._mapreduce(f, &, IndexCartesian(), A) -function Base._mapreduce(f, op::Union{typeof(Base.mul_prod),typeof(*)}, ::Base.IndexCartesian, A::AbstractSparseMatrixCSC{T}) where T +function Base._mapreduce(f::F, op::Union{typeof(Base.mul_prod),typeof(*)}, ::Base.IndexCartesian, A::AbstractSparseMatrixCSC{T}) where {F,T} nnzA = nnz(A) nzeros = widelength(A) - nnzA if nzeros == 0 @@ -2501,7 +2501,7 @@ function _mapreducecols!(f, op, R::AbstractArray, A::AbstractSparseMatrixCSC{Tv, R end -function Base._mapreducedim!(f, op, R::AbstractArray, A::AbstractSparseMatrixCSC{T}) where T +function Base._mapreducedim!(f::F, op::G, R::AbstractArray, A::AbstractSparseMatrixCSC{T}) where {F,G,T} require_one_based_indexing(A, R) lsiz = Base.check_reducedims(R,A) isempty(A) && return R diff --git a/src/sparsevector.jl b/src/sparsevector.jl index 375d66bc..d6f83fd6 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -324,7 +324,7 @@ julia> sparsevec([1, 3, 1, 2, 2], [true, true, false, false, false]) [3] = 1 ``` """ -function sparsevec(I::AbstractVector{<:Integer}, V::AbstractVector, combine::Function) +function sparsevec(I::AbstractVector{<:Integer}, V::AbstractVector, combine::F) where {F<:Function} require_one_based_indexing(I, V) length(I) == length(V) || throw(ArgumentError("index and value vectors must be the same length")) @@ -338,7 +338,7 @@ function sparsevec(I::AbstractVector{<:Integer}, V::AbstractVector, combine::Fun _sparsevector!(Vector(I), Vector(V), len, combine) end -function sparsevec(I::AbstractVector{<:Integer}, V::AbstractVector, len::Integer, combine::Function) +function sparsevec(I::AbstractVector{<:Integer}, V::AbstractVector, len::Integer, combine::F) where {F<:Function} require_one_based_indexing(I, V) length(I) == length(V) || throw(ArgumentError("index and value vectors must be the same length")) @@ -363,10 +363,10 @@ sparsevec(I::AbstractVector, V::Union{Bool, AbstractVector{Bool}}) = sparsevec(I::AbstractVector, V::Union{Bool, AbstractVector{Bool}}, len::Integer) = sparsevec(I, V, len, |) -sparsevec(I::AbstractVector, v::Number, combine::Function) = +sparsevec(I::AbstractVector, v::Number, combine::F) where {F<:Function} = sparsevec(I, fill(v, length(I)), combine) -sparsevec(I::AbstractVector, v::Number, len::Integer, combine::Function) = +sparsevec(I::AbstractVector, v::Number, len::Integer, combine::F) where {F<:Function} = sparsevec(I, fill(v, length(I)), len, combine) @@ -1669,7 +1669,7 @@ end Base.reducedim_initarray(A::SparseVectorUnion, region, v0, ::Type{R}) where {R} = fill!(Array{R}(undef, Base.to_shape(Base.reduced_indices(A, region))), v0) -function Base._mapreduce(f, op, ::IndexCartesian, A::SparseVectorUnion) +function Base._mapreduce(f::F, op::G, ::IndexCartesian, A::SparseVectorUnion) where {F,G} T = eltype(A) isempty(A) && return Base.mapreduce_empty(f, op, T) z = nnz(A) @@ -1686,7 +1686,7 @@ Base._any(f, A::SparseVectorUnion, ::Colon) = Base._all(f, A::SparseVectorUnion, ::Colon) = iszero(length(A)) ? true : Base._mapreduce(f, &, IndexCartesian(), A) -function Base.mapreducedim!(f, op, R::AbstractVector, A::SparseVectorUnion) +function Base.mapreducedim!(f::F, op::G, R::AbstractVector, A::SparseVectorUnion) where {F,G} # dim1 reduction could be safely replaced with a mapreduce if length(R) == 1 I = firstindex(R)