From 1253b66a129bc32af0bef9b6016153b79066d59d Mon Sep 17 00:00:00 2001 From: Tianyi Pu <44583944+putianyi889@users.noreply.github.com> Date: Thu, 9 Mar 2023 20:55:17 +0000 Subject: [PATCH 01/11] Update FillArrays.jl --- src/FillArrays.jl | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/FillArrays.jl b/src/FillArrays.jl index 6a5a8949..ef69d7f3 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -152,14 +152,7 @@ AbstractArray{T}(F::Fill{T}) where T = F AbstractArray{T,N}(F::Fill{T,N}) where {T,N} = F AbstractArray{T}(F::Fill{V,N}) where {T,V,N} = Fill{T}(convert(T, F.value)::T, F.axes) AbstractArray{T,N}(F::Fill{V,N}) where {T,V,N} = Fill{T}(convert(T, F.value)::T, F.axes) - -convert(::Type{AbstractArray{T}}, F::Fill{T}) where T = F -convert(::Type{AbstractArray{T,N}}, F::Fill{T,N}) where {T,N} = F -convert(::Type{AbstractArray{T}}, F::Fill) where {T} = AbstractArray{T}(F) -convert(::Type{AbstractArray{T,N}}, F::Fill) where {T,N} = AbstractArray{T,N}(F) -convert(::Type{AbstractFill}, F::AbstractFill) = F -convert(::Type{AbstractFill{T}}, F::AbstractFill) where T = convert(AbstractArray{T}, F) -convert(::Type{AbstractFill{T,N}}, F::AbstractFill) where {T,N} = convert(AbstractArray{T,N}, F) +AbstractFill{T}(F::AbstractFill) where T = AbstractArray{T}(F) copy(F::Fill) = Fill(F.value, F.axes) @@ -308,16 +301,20 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one)) AbstractArray{T,N}(F::$Typ{T,N}) where {T,N} = F AbstractArray{T}(F::$Typ) where T = $Typ{T}(F.axes) AbstractArray{T,N}(F::$Typ{V,N}) where {T,V,N} = $Typ{T}(F.axes) - convert(::Type{AbstractArray{T}}, F::$Typ{T}) where T = AbstractArray{T}(F) - convert(::Type{AbstractArray{T,N}}, F::$Typ{T,N}) where {T,N} = AbstractArray{T,N}(F) - convert(::Type{AbstractArray{T}}, F::$Typ) where T = AbstractArray{T}(F) - convert(::Type{AbstractArray{T,N}}, F::$Typ) where {T,N} = AbstractArray{T,N}(F) copy(F::$Typ) = F getindex(F::$Typ{T,0}) where T = getindex_value(F) end end + +for TYPE in (:Fill, :AbstractFill, :Ones, :Zeros) + @eval begin + @inline AbstractFill{T}(F::$TYPE{T}) where T = F + @inline AbstractFill{T,N}(F::$TYPE{T,N}) where {T,N} = F + @inline AbstractFill{T,N,Axes}(F::$TYPE{T,N,Axes}) where {T,N,Axes} = F + end +end """ fillsimilar(a::AbstractFill, axes) @@ -467,16 +464,11 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one)) end end -function convert(::Type{Diagonal}, Z::ZerosMatrix{T}) where T - n,m = size(Z) - n ≠ m && throw(BoundsError(Z)) - Diagonal(zeros(T, n)) -end - -function convert(::Type{Diagonal{T}}, Z::ZerosMatrix) where T - n,m = size(Z) - n ≠ m && throw(BoundsError(Z)) - Diagonal(zeros(T, n)) +# temporary patch. should be a PR(#48895) to LinearAlgebra +Diagonal{T}(A::AbstractMatrix) where T = Diagonal{T}(diag(A)) +function convert(::Type{T}, A::AbstractMatrix) where T<:Diagonal + checksquare(A) + isdiag(A) ? T(A) : throw(InexactError(:convert, T, A)) end ## Sparse arrays @@ -547,7 +539,7 @@ cumsum(x::ZerosVector) = x cumsum(x::ZerosVector{Bool}) = x cumsum(x::OnesVector{II}) where II<:Integer = convert(AbstractVector{II}, oneto(length(x))) cumsum(x::OnesVector{Bool}) = oneto(length(x)) -cumsum(x::AbstractFillVector{Bool}) = cumsum(convert(AbstractFill{Int}, x)) +cumsum(x::AbstractFillVector{Bool}) = cumsum(AbstractFill{Int}(x)) ######### From f9c3f0f9120797bacf0ae8c3a98647fb5d4299ed Mon Sep 17 00:00:00 2001 From: Tianyi Pu <44583944+putianyi889@users.noreply.github.com> Date: Thu, 9 Mar 2023 20:57:21 +0000 Subject: [PATCH 02/11] Update fillalgebra.jl --- src/fillalgebra.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index 98026a1e..a3b0b6bc 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -267,7 +267,9 @@ function -(a::ZerosVector, b::AbstractRange) end -(a::AbstractRange, b::ZerosVector) = a + b - +# temporary patch. should be a PR(#48894) to julia base. +AbstractRange{T}(r::AbstractUnitRange) where {T<:Integer} = AbstractUnitRange{T}(r) +AbstractRange{T}(r::AbstractRange) where T = T(first(r)):T(step(r)):T(last(r)) #### # norm From 67866830e17dbe6197fb0ad4039223d55026a208 Mon Sep 17 00:00:00 2001 From: Tianyi Pu <44583944+putianyi889@users.noreply.github.com> Date: Thu, 9 Mar 2023 20:58:42 +0000 Subject: [PATCH 03/11] Update runtests.jl --- test/runtests.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 46272a80..a5106fd3 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -392,10 +392,10 @@ end @test Diagonal(Zeros(8,5)) == Diagonal(zeros(5)) @test convert(Diagonal, Zeros(5,5)) == Diagonal(zeros(5)) - @test_throws BoundsError convert(Diagonal, Zeros(8,5)) + @test_throws DimensionMismatch convert(Diagonal, Zeros(8,5)) @test convert(Diagonal{Int}, Zeros(5,5)) == Diagonal(zeros(Int,5)) - @test_throws BoundsError convert(Diagonal{Int}, Zeros(8,5)) + @test_throws DimensionMismatch convert(Diagonal{Int}, Zeros(8,5)) @test Diagonal(Eye(8,5)) == Diagonal(ones(5)) From 6a3229ed39c9eb9fe686b6cf1bf768b9ae38dc11 Mon Sep 17 00:00:00 2001 From: Tianyi Pu <44583944+putianyi889@users.noreply.github.com> Date: Thu, 9 Mar 2023 23:15:02 +0000 Subject: [PATCH 04/11] Update FillArrays.jl --- src/FillArrays.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FillArrays.jl b/src/FillArrays.jl index ef69d7f3..b42c89c0 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -10,7 +10,7 @@ import Base: size, getindex, setindex!, IndexStyle, checkbounds, convert, import LinearAlgebra: rank, svdvals!, tril, triu, tril!, triu!, diag, transpose, adjoint, fill!, dot, norm2, norm1, normInf, normMinusInf, normp, lmul!, rmul!, diagzero, AbstractTriangular, AdjointAbsVec, TransposeAbsVec, - issymmetric, ishermitian, AdjOrTransAbsVec + issymmetric, ishermitian, AdjOrTransAbsVec, checksquare import Base.Broadcast: broadcasted, DefaultArrayStyle, broadcast_shape From 03e8b2c398979ca5cb3a579c845b09a7e6d57b91 Mon Sep 17 00:00:00 2001 From: Tianyi Pu <44583944+putianyi889@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:24:05 +0000 Subject: [PATCH 05/11] Update fillalgebra.jl --- src/fillalgebra.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index a3b0b6bc..a2f03587 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -225,7 +225,7 @@ end # Zeros +/- Fill and Fill +/- Zeros function +(a::AbstractFill{T}, b::Zeros{V}) where {T, V} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) - return convert(AbstractFill{promote_type(T, V)}, a) + return AbstractFill{promote_type(T, V)}(a) end +(a::Zeros, b::AbstractFill) = b + a -(a::AbstractFill, b::Zeros) = a + b From 2008415ff2153e14e2efc4059e4b308b3cb5ba90 Mon Sep 17 00:00:00 2001 From: Tianyi Pu <44583944+putianyi889@users.noreply.github.com> Date: Tue, 14 Mar 2023 08:46:01 +0000 Subject: [PATCH 06/11] Update fillalgebra.jl --- src/fillalgebra.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index a2f03587..f05f2481 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -253,12 +253,12 @@ end function +(a::ZerosVector{T}, b::AbstractRange) where {T} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) Tout = promote_type(T, eltype(b)) - return convert(Tout, first(b)):convert(Tout, step(b)):convert(Tout, last(b)) + return AbstractRange{Tout}(b) end function +(a::ZerosVector{T}, b::UnitRange) where {T} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) Tout = promote_type(T, eltype(b)) - return convert(Tout, first(b)):convert(Tout, last(b)) + return AbstractRange{Tout}(b) end function -(a::ZerosVector, b::AbstractRange) From 95f3ffa03d791be92d4971e2bf889821ce5988cc Mon Sep 17 00:00:00 2001 From: Tianyi Pu <912396513@qq.com> Date: Tue, 14 Mar 2023 10:27:17 +0000 Subject: [PATCH 07/11] 98% coverage --- src/FillArrays.jl | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/FillArrays.jl b/src/FillArrays.jl index b42c89c0..304f7e03 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -148,8 +148,6 @@ Fill{T,0}(x::T, ::Tuple{}) where T = Fill{T,0,Tuple{}}(x, ()) # ambiguity fix @inline getindex_value(F::Fill) = F.value -AbstractArray{T}(F::Fill{T}) where T = F -AbstractArray{T,N}(F::Fill{T,N}) where {T,N} = F AbstractArray{T}(F::Fill{V,N}) where {T,V,N} = Fill{T}(convert(T, F.value)::T, F.axes) AbstractArray{T,N}(F::Fill{V,N}) where {T,V,N} = Fill{T}(convert(T, F.value)::T, F.axes) AbstractFill{T}(F::AbstractFill) where T = AbstractArray{T}(F) @@ -297,8 +295,6 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one)) @inline size(Z::$Typ) = length.(Z.axes) @inline getindex_value(Z::$Typ{T}) where T = $func(T) - AbstractArray{T}(F::$Typ{T}) where T = F - AbstractArray{T,N}(F::$Typ{T,N}) where {T,N} = F AbstractArray{T}(F::$Typ) where T = $Typ{T}(F.axes) AbstractArray{T,N}(F::$Typ{V,N}) where {T,V,N} = $Typ{T}(F.axes) @@ -307,12 +303,12 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one)) getindex(F::$Typ{T,0}) where T = getindex_value(F) end end - -for TYPE in (:Fill, :AbstractFill, :Ones, :Zeros) + +# conversions +for TYPE in (:Fill, :AbstractFill, :Ones, :Zeros), STYPE in (:AbstractArray, :AbstractFill) @eval begin - @inline AbstractFill{T}(F::$TYPE{T}) where T = F - @inline AbstractFill{T,N}(F::$TYPE{T,N}) where {T,N} = F - @inline AbstractFill{T,N,Axes}(F::$TYPE{T,N,Axes}) where {T,N,Axes} = F + @inline $STYPE{T}(F::$TYPE{T}) where T = F + @inline $STYPE{T,N}(F::$TYPE{T,N}) where {T,N} = F end end From dec5988dd311e7921552be953e78d99557087045 Mon Sep 17 00:00:00 2001 From: Tianyi Pu <912396513@qq.com> Date: Tue, 14 Mar 2023 11:48:43 +0000 Subject: [PATCH 08/11] 648/660 coverage --- src/FillArrays.jl | 15 +++++++-------- test/runtests.jl | 2 ++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/FillArrays.jl b/src/FillArrays.jl index 304f7e03..3b53328a 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -470,17 +470,16 @@ end ## Sparse arrays convert(::Type{SparseVector}, Z::ZerosVector{T}) where T = spzeros(T, length(Z)) -convert(::Type{SparseVector{T}}, Z::ZerosVector) where T = spzeros(T, length(Z)) -convert(::Type{SparseVector{Tv,Ti}}, Z::ZerosVector) where {Tv,Ti} = spzeros(Tv, Ti, length(Z)) +SparseVector{T}(Z::ZerosVector) where T = spzeros(T, length(Z)) +SparseVector{Tv,Ti}(Z::ZerosVector) where {Tv,Ti} = spzeros(Tv, Ti, length(Z)) convert(::Type{AbstractSparseVector}, Z::ZerosVector{T}) where T = spzeros(T, length(Z)) convert(::Type{AbstractSparseVector{T}}, Z::ZerosVector) where T= spzeros(T, length(Z)) +#SparseMatrixCSC(Z::ZerosMatrix) = spzeros(eltype(Z), size(Z)...) convert(::Type{SparseMatrixCSC}, Z::ZerosMatrix{T}) where T = spzeros(T, size(Z)...) -convert(::Type{SparseMatrixCSC{T}}, Z::ZerosMatrix) where T = spzeros(T, size(Z)...) -convert(::Type{SparseMatrixCSC{Tv,Ti}}, Z::ZerosMatrix) where {Tv,Ti} = spzeros(Tv, Ti, size(Z)...) -convert(::Type{SparseMatrixCSC{Tv,Ti}}, Z::Zeros{T,2,Axes}) where {Tv,Ti<:Integer,T,Axes} = - spzeros(Tv, Ti, size(Z)...) +SparseMatrixCSC{T}(Z::ZerosMatrix) where T = spzeros(T, size(Z)...) +SparseMatrixCSC{Tv,Ti}(Z::Zeros{T,2,Axes}) where {Tv,Ti<:Integer,T,Axes} = spzeros(Tv, Ti, size(Z)...) convert(::Type{AbstractSparseMatrix}, Z::ZerosMatrix{T}) where T = spzeros(T, size(Z)...) convert(::Type{AbstractSparseMatrix{T}}, Z::ZerosMatrix) where T = spzeros(T, size(Z)...) @@ -492,9 +491,9 @@ convert(::Type{AbstractSparseArray{Tv,Ti,N}}, Z::Zeros{T,N}) where {T,Tv,Ti,N} = convert(::Type{SparseMatrixCSC}, Z::Eye{T}) where T = SparseMatrixCSC{T}(I, size(Z)...) -convert(::Type{SparseMatrixCSC{Tv}}, Z::Eye{T}) where {T,Tv} = SparseMatrixCSC{Tv}(I, size(Z)...) +SparseMatrixCSC{Tv}(Z::Eye{T}) where {T,Tv} = SparseMatrixCSC{Tv}(I, size(Z)...) # works around missing `speye`: -convert(::Type{SparseMatrixCSC{Tv,Ti}}, Z::Eye{T}) where {T,Tv,Ti<:Integer} = +SparseMatrixCSC{Tv,Ti}(Z::Eye{T}) where {T,Tv,Ti<:Integer} = convert(SparseMatrixCSC{Tv,Ti}, SparseMatrixCSC{Tv}(I, size(Z)...)) convert(::Type{AbstractSparseMatrix}, Z::Eye{T}) where {T} = SparseMatrixCSC{T}(I, size(Z)...) diff --git a/test/runtests.jl b/test/runtests.jl index a5106fd3..abb4cbdf 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -414,6 +414,7 @@ end @testset "Sparse vectors and matrices" begin @test SparseVector(Zeros(5)) == + SparseVector{Int}(Zeros(5)) == SparseVector{Float64}(Zeros(5)) == SparseVector{Float64,Int}(Zeros(5)) == convert(AbstractSparseArray,Zeros(5)) == @@ -426,6 +427,7 @@ end for (Mat, SMat) in ((Zeros(5,5), spzeros(5,5)), (Zeros(6,5), spzeros(6,5)), (Eye(5), sparse(I,5,5)), (Eye(6,5), sparse(I,6,5))) @test SparseMatrixCSC(Mat) == + SparseMatrixCSC{Int}(Mat) == SparseMatrixCSC{Float64}(Mat) == SparseMatrixCSC{Float64,Int}(Mat) == convert(AbstractSparseArray,Mat) == From c62df6305f57c5c7d38c1241282aeeba9d784bec Mon Sep 17 00:00:00 2001 From: Tianyi Pu <912396513@qq.com> Date: Tue, 14 Mar 2023 12:03:04 +0000 Subject: [PATCH 09/11] 648/657 coverage --- src/FillArrays.jl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/FillArrays.jl b/src/FillArrays.jl index 3b53328a..f3d36d80 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -468,16 +468,12 @@ function convert(::Type{T}, A::AbstractMatrix) where T<:Diagonal end ## Sparse arrays - -convert(::Type{SparseVector}, Z::ZerosVector{T}) where T = spzeros(T, length(Z)) SparseVector{T}(Z::ZerosVector) where T = spzeros(T, length(Z)) SparseVector{Tv,Ti}(Z::ZerosVector) where {Tv,Ti} = spzeros(Tv, Ti, length(Z)) convert(::Type{AbstractSparseVector}, Z::ZerosVector{T}) where T = spzeros(T, length(Z)) convert(::Type{AbstractSparseVector{T}}, Z::ZerosVector) where T= spzeros(T, length(Z)) -#SparseMatrixCSC(Z::ZerosMatrix) = spzeros(eltype(Z), size(Z)...) -convert(::Type{SparseMatrixCSC}, Z::ZerosMatrix{T}) where T = spzeros(T, size(Z)...) SparseMatrixCSC{T}(Z::ZerosMatrix) where T = spzeros(T, size(Z)...) SparseMatrixCSC{Tv,Ti}(Z::Zeros{T,2,Axes}) where {Tv,Ti<:Integer,T,Axes} = spzeros(Tv, Ti, size(Z)...) @@ -489,8 +485,6 @@ convert(::Type{AbstractSparseArray{Tv}}, Z::Zeros{T}) where {T,Tv} = spzeros(Tv, convert(::Type{AbstractSparseArray{Tv,Ti}}, Z::Zeros{T}) where {T,Tv,Ti} = spzeros(Tv, Ti, size(Z)...) convert(::Type{AbstractSparseArray{Tv,Ti,N}}, Z::Zeros{T,N}) where {T,Tv,Ti,N} = spzeros(Tv, Ti, size(Z)...) - -convert(::Type{SparseMatrixCSC}, Z::Eye{T}) where T = SparseMatrixCSC{T}(I, size(Z)...) SparseMatrixCSC{Tv}(Z::Eye{T}) where {T,Tv} = SparseMatrixCSC{Tv}(I, size(Z)...) # works around missing `speye`: SparseMatrixCSC{Tv,Ti}(Z::Eye{T}) where {T,Tv,Ti<:Integer} = From 2ad12d1f7c8caaec7cf71672084bbf9c4c8dd198 Mon Sep 17 00:00:00 2001 From: Tianyi Pu <912396513@qq.com> Date: Tue, 14 Mar 2023 17:24:49 +0000 Subject: [PATCH 10/11] remove type piracy --- src/FillArrays.jl | 4 ++-- src/fillalgebra.jl | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/FillArrays.jl b/src/FillArrays.jl index f3d36d80..ebb4616a 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -461,8 +461,8 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one)) end # temporary patch. should be a PR(#48895) to LinearAlgebra -Diagonal{T}(A::AbstractMatrix) where T = Diagonal{T}(diag(A)) -function convert(::Type{T}, A::AbstractMatrix) where T<:Diagonal +Diagonal{T}(A::AbstractFillMatrix) where T = Diagonal{T}(diag(A)) +function convert(::Type{T}, A::AbstractFillMatrix) where T<:Diagonal checksquare(A) isdiag(A) ? T(A) : throw(InexactError(:convert, T, A)) end diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index f05f2481..d53e6c14 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -253,12 +253,12 @@ end function +(a::ZerosVector{T}, b::AbstractRange) where {T} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) Tout = promote_type(T, eltype(b)) - return AbstractRange{Tout}(b) + return T(first(b)):T(step(b)):T(last(b)) end -function +(a::ZerosVector{T}, b::UnitRange) where {T} +function +(a::ZerosVector{T}, b::UnitRange) where {T<:Integer} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) Tout = promote_type(T, eltype(b)) - return AbstractRange{Tout}(b) + return AbstractUnitRange{T}(b) end function -(a::ZerosVector, b::AbstractRange) @@ -267,10 +267,6 @@ function -(a::ZerosVector, b::AbstractRange) end -(a::AbstractRange, b::ZerosVector) = a + b -# temporary patch. should be a PR(#48894) to julia base. -AbstractRange{T}(r::AbstractUnitRange) where {T<:Integer} = AbstractUnitRange{T}(r) -AbstractRange{T}(r::AbstractRange) where T = T(first(r)):T(step(r)):T(last(r)) - #### # norm #### From c76284712cf3c92f7dee918b2f372308a55a706d Mon Sep 17 00:00:00 2001 From: Tianyi Pu <912396513@qq.com> Date: Tue, 14 Mar 2023 17:44:30 +0000 Subject: [PATCH 11/11] fix --- src/fillalgebra.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index d53e6c14..8bd08e4d 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -253,12 +253,12 @@ end function +(a::ZerosVector{T}, b::AbstractRange) where {T} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) Tout = promote_type(T, eltype(b)) - return T(first(b)):T(step(b)):T(last(b)) + return Tout(first(b)):Tout(step(b)):Tout(last(b)) end function +(a::ZerosVector{T}, b::UnitRange) where {T<:Integer} size(a) ≠ size(b) && throw(DimensionMismatch("dimensions must match.")) Tout = promote_type(T, eltype(b)) - return AbstractUnitRange{T}(b) + return AbstractUnitRange{Tout}(b) end function -(a::ZerosVector, b::AbstractRange)