@@ -10,7 +10,7 @@ import Base: size, getindex, setindex!, IndexStyle, checkbounds, convert,
1010
1111import LinearAlgebra: rank, svdvals!, tril, triu, tril!, triu!, diag, transpose, adjoint, fill!,
1212 dot, norm2, norm1, normInf, normMinusInf, normp, lmul!, rmul!, diagzero, AbstractTriangular, AdjointAbsVec, TransposeAbsVec,
13- issymmetric, ishermitian, AdjOrTransAbsVec, checksquare
13+ issymmetric, ishermitian, AdjOrTransAbsVec
1414
1515import Base. Broadcast: broadcasted, DefaultArrayStyle, broadcast_shape
1616
@@ -148,9 +148,18 @@ Fill{T,0}(x::T, ::Tuple{}) where T = Fill{T,0,Tuple{}}(x, ()) # ambiguity fix
148148
149149@inline getindex_value (F:: Fill ) = F. value
150150
151+ AbstractArray {T} (F:: Fill{T} ) where T = F
152+ AbstractArray {T,N} (F:: Fill{T,N} ) where {T,N} = F
151153AbstractArray {T} (F:: Fill{V,N} ) where {T,V,N} = Fill {T} (convert (T, F. value):: T , F. axes)
152154AbstractArray {T,N} (F:: Fill{V,N} ) where {T,V,N} = Fill {T} (convert (T, F. value):: T , F. axes)
153- AbstractFill {T} (F:: AbstractFill ) where T = AbstractArray {T} (F)
155+
156+ convert (:: Type{AbstractArray{T}} , F:: Fill{T} ) where T = F
157+ convert (:: Type{AbstractArray{T,N}} , F:: Fill{T,N} ) where {T,N} = F
158+ convert (:: Type{AbstractArray{T}} , F:: Fill ) where {T} = AbstractArray {T} (F)
159+ convert (:: Type{AbstractArray{T,N}} , F:: Fill ) where {T,N} = AbstractArray {T,N} (F)
160+ convert (:: Type{AbstractFill} , F:: AbstractFill ) = F
161+ convert (:: Type{AbstractFill{T}} , F:: AbstractFill ) where T = convert (AbstractArray{T}, F)
162+ convert (:: Type{AbstractFill{T,N}} , F:: AbstractFill ) where {T,N} = convert (AbstractArray{T,N}, F)
154163
155164copy (F:: Fill ) = Fill (F. value, F. axes)
156165
@@ -295,23 +304,21 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
295304 @inline size (Z:: $Typ ) = length .(Z. axes)
296305 @inline getindex_value (Z:: $Typ{T} ) where T = $ func (T)
297306
307+ AbstractArray {T} (F:: $Typ{T} ) where T = F
308+ AbstractArray {T,N} (F:: $Typ{T,N} ) where {T,N} = F
298309 AbstractArray {T} (F:: $Typ ) where T = $ Typ {T} (F. axes)
299310 AbstractArray {T,N} (F:: $Typ{V,N} ) where {T,V,N} = $ Typ {T} (F. axes)
311+ convert (:: Type{AbstractArray{T}} , F:: $Typ{T} ) where T = AbstractArray {T} (F)
312+ convert (:: Type{AbstractArray{T,N}} , F:: $Typ{T,N} ) where {T,N} = AbstractArray {T,N} (F)
313+ convert (:: Type{AbstractArray{T}} , F:: $Typ ) where T = AbstractArray {T} (F)
314+ convert (:: Type{AbstractArray{T,N}} , F:: $Typ ) where {T,N} = AbstractArray {T,N} (F)
300315
301316 copy (F:: $Typ ) = F
302317
303318 getindex (F:: $Typ{T,0} ) where T = getindex_value (F)
304319 end
305320end
306321
307- # conversions
308- for TYPE in (:Fill , :AbstractFill , :Ones , :Zeros ), STYPE in (:AbstractArray , :AbstractFill )
309- @eval begin
310- @inline $ STYPE {T} (F:: $TYPE{T} ) where T = F
311- @inline $ STYPE {T,N} (F:: $TYPE{T,N} ) where {T,N} = F
312- end
313- end
314-
315322"""
316323 fillsimilar(a::AbstractFill, axes)
317324
@@ -460,22 +467,32 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
460467 end
461468end
462469
463- # temporary patch. should be a PR(#48895) to LinearAlgebra
464- Diagonal {T} (A:: AbstractMatrix ) where T = Diagonal {T} (diag (A))
465- function convert (:: Type{T} , A:: AbstractMatrix ) where T<: Diagonal
466- checksquare (A)
467- isdiag (A) ? T (A) : throw (InexactError (:convert , T, A))
470+ function convert (:: Type{Diagonal} , Z:: ZerosMatrix{T} ) where T
471+ n,m = size (Z)
472+ n ≠ m && throw (BoundsError (Z))
473+ Diagonal (zeros (T, n))
474+ end
475+
476+ function convert (:: Type{Diagonal{T}} , Z:: ZerosMatrix ) where T
477+ n,m = size (Z)
478+ n ≠ m && throw (BoundsError (Z))
479+ Diagonal (zeros (T, n))
468480end
469481
470482# # Sparse arrays
471- SparseVector {T} (Z:: ZerosVector ) where T = spzeros (T, length (Z))
472- SparseVector {Tv,Ti} (Z:: ZerosVector ) where {Tv,Ti} = spzeros (Tv, Ti, length (Z))
483+
484+ convert (:: Type{SparseVector} , Z:: ZerosVector{T} ) where T = spzeros (T, length (Z))
485+ convert (:: Type{SparseVector{T}} , Z:: ZerosVector ) where T = spzeros (T, length (Z))
486+ convert (:: Type{SparseVector{Tv,Ti}} , Z:: ZerosVector ) where {Tv,Ti} = spzeros (Tv, Ti, length (Z))
473487
474488convert (:: Type{AbstractSparseVector} , Z:: ZerosVector{T} ) where T = spzeros (T, length (Z))
475489convert (:: Type{AbstractSparseVector{T}} , Z:: ZerosVector ) where T= spzeros (T, length (Z))
476490
477- SparseMatrixCSC {T} (Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
478- SparseMatrixCSC {Tv,Ti} (Z:: Zeros{T,2,Axes} ) where {Tv,Ti<: Integer ,T,Axes} = spzeros (Tv, Ti, size (Z)... )
491+ convert (:: Type{SparseMatrixCSC} , Z:: ZerosMatrix{T} ) where T = spzeros (T, size (Z)... )
492+ convert (:: Type{SparseMatrixCSC{T}} , Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
493+ convert (:: Type{SparseMatrixCSC{Tv,Ti}} , Z:: ZerosMatrix ) where {Tv,Ti} = spzeros (Tv, Ti, size (Z)... )
494+ convert (:: Type{SparseMatrixCSC{Tv,Ti}} , Z:: Zeros{T,2,Axes} ) where {Tv,Ti<: Integer ,T,Axes} =
495+ spzeros (Tv, Ti, size (Z)... )
479496
480497convert (:: Type{AbstractSparseMatrix} , Z:: ZerosMatrix{T} ) where T = spzeros (T, size (Z)... )
481498convert (:: Type{AbstractSparseMatrix{T}} , Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
@@ -485,9 +502,11 @@ convert(::Type{AbstractSparseArray{Tv}}, Z::Zeros{T}) where {T,Tv} = spzeros(Tv,
485502convert (:: Type{AbstractSparseArray{Tv,Ti}} , Z:: Zeros{T} ) where {T,Tv,Ti} = spzeros (Tv, Ti, size (Z)... )
486503convert (:: Type{AbstractSparseArray{Tv,Ti,N}} , Z:: Zeros{T,N} ) where {T,Tv,Ti,N} = spzeros (Tv, Ti, size (Z)... )
487504
488- SparseMatrixCSC {Tv} (Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
505+
506+ convert (:: Type{SparseMatrixCSC} , Z:: Eye{T} ) where T = SparseMatrixCSC {T} (I, size (Z)... )
507+ convert (:: Type{SparseMatrixCSC{Tv}} , Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
489508# works around missing `speye`:
490- SparseMatrixCSC {Tv,Ti} ( Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
509+ convert ( :: Type{ SparseMatrixCSC{Tv,Ti}} , Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
491510 convert (SparseMatrixCSC{Tv,Ti}, SparseMatrixCSC {Tv} (I, size (Z)... ))
492511
493512convert (:: Type{AbstractSparseMatrix} , Z:: Eye{T} ) where {T} = SparseMatrixCSC {T} (I, size (Z)... )
@@ -528,7 +547,7 @@ cumsum(x::ZerosVector) = x
528547cumsum (x:: ZerosVector{Bool} ) = x
529548cumsum (x:: OnesVector{II} ) where II<: Integer = convert (AbstractVector{II}, oneto (length (x)))
530549cumsum (x:: OnesVector{Bool} ) = oneto (length (x))
531- cumsum (x:: AbstractFillVector{Bool} ) = cumsum (AbstractFill {Int} ( x))
550+ cumsum (x:: AbstractFillVector{Bool} ) = cumsum (convert ( AbstractFill{Int}, x))
532551
533552
534553# ########
0 commit comments