@@ -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, AdjointAbsVec, TransposeAbsVec,
13- issymmetric, ishermitian, AdjOrTransAbsVec
13+ issymmetric, ishermitian, AdjOrTransAbsVec, checksquare
1414
1515
1616import Base. Broadcast: broadcasted, DefaultArrayStyle, broadcast_shape
@@ -149,18 +149,9 @@ Fill{T,0}(x::T, ::Tuple{}) where T = Fill{T,0,Tuple{}}(x, ()) # ambiguity fix
149149
150150@inline getindex_value (F:: Fill ) = F. value
151151
152- AbstractArray {T} (F:: Fill{T} ) where T = F
153- AbstractArray {T,N} (F:: Fill{T,N} ) where {T,N} = F
154152AbstractArray {T} (F:: Fill{V,N} ) where {T,V,N} = Fill {T} (convert (T, F. value):: T , F. axes)
155153AbstractArray {T,N} (F:: Fill{V,N} ) where {T,V,N} = Fill {T} (convert (T, F. value):: T , F. axes)
156-
157- convert (:: Type{AbstractArray{T}} , F:: Fill{T} ) where T = F
158- convert (:: Type{AbstractArray{T,N}} , F:: Fill{T,N} ) where {T,N} = F
159- convert (:: Type{AbstractArray{T}} , F:: Fill ) where {T} = AbstractArray {T} (F)
160- convert (:: Type{AbstractArray{T,N}} , F:: Fill ) where {T,N} = AbstractArray {T,N} (F)
161- convert (:: Type{AbstractFill} , F:: AbstractFill ) = F
162- convert (:: Type{AbstractFill{T}} , F:: AbstractFill ) where T = convert (AbstractArray{T}, F)
163- convert (:: Type{AbstractFill{T,N}} , F:: AbstractFill ) where {T,N} = convert (AbstractArray{T,N}, F)
154+ AbstractFill {T} (F:: AbstractFill ) where T = AbstractArray {T} (F)
164155
165156copy (F:: Fill ) = Fill (F. value, F. axes)
166157
@@ -305,21 +296,23 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
305296 @inline size (Z:: $Typ ) = length .(Z. axes)
306297 @inline getindex_value (Z:: $Typ{T} ) where T = $ func (T)
307298
308- AbstractArray {T} (F:: $Typ{T} ) where T = F
309- AbstractArray {T,N} (F:: $Typ{T,N} ) where {T,N} = F
310299 AbstractArray {T} (F:: $Typ ) where T = $ Typ {T} (F. axes)
311300 AbstractArray {T,N} (F:: $Typ{V,N} ) where {T,V,N} = $ Typ {T} (F. axes)
312- convert (:: Type{AbstractArray{T}} , F:: $Typ{T} ) where T = AbstractArray {T} (F)
313- convert (:: Type{AbstractArray{T,N}} , F:: $Typ{T,N} ) where {T,N} = AbstractArray {T,N} (F)
314- convert (:: Type{AbstractArray{T}} , F:: $Typ ) where T = AbstractArray {T} (F)
315- convert (:: Type{AbstractArray{T,N}} , F:: $Typ ) where {T,N} = AbstractArray {T,N} (F)
316301
317302 copy (F:: $Typ ) = F
318303
319304 getindex (F:: $Typ{T,0} ) where T = getindex_value (F)
320305 end
321306end
322307
308+ # conversions
309+ for TYPE in (:Fill , :AbstractFill , :Ones , :Zeros ), STYPE in (:AbstractArray , :AbstractFill )
310+ @eval begin
311+ @inline $ STYPE {T} (F:: $TYPE{T} ) where T = F
312+ @inline $ STYPE {T,N} (F:: $TYPE{T,N} ) where {T,N} = F
313+ end
314+ end
315+
323316"""
324317 fillsimilar(a::AbstractFill, axes)
325318
@@ -471,32 +464,22 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
471464 end
472465end
473466
474- function convert (:: Type{Diagonal} , Z:: ZerosMatrix{T} ) where T
475- n,m = size (Z)
476- n ≠ m && throw (BoundsError (Z))
477- Diagonal (zeros (T, n))
478- end
479-
480- function convert (:: Type{Diagonal{T}} , Z:: ZerosMatrix ) where T
481- n,m = size (Z)
482- n ≠ m && throw (BoundsError (Z))
483- Diagonal (zeros (T, n))
467+ # temporary patch. should be a PR(#48895) to LinearAlgebra
468+ Diagonal {T} (A:: AbstractFillMatrix ) where T = Diagonal {T} (diag (A))
469+ function convert (:: Type{T} , A:: AbstractFillMatrix ) where T<: Diagonal
470+ checksquare (A)
471+ isdiag (A) ? T (A) : throw (InexactError (:convert , T, A))
484472end
485473
486474# # Sparse arrays
487-
488- convert (:: Type{SparseVector} , Z:: ZerosVector{T} ) where T = spzeros (T, length (Z))
489- convert (:: Type{SparseVector{T}} , Z:: ZerosVector ) where T = spzeros (T, length (Z))
490- convert (:: Type{SparseVector{Tv,Ti}} , Z:: ZerosVector ) where {Tv,Ti} = spzeros (Tv, Ti, length (Z))
475+ SparseVector {T} (Z:: ZerosVector ) where T = spzeros (T, length (Z))
476+ SparseVector {Tv,Ti} (Z:: ZerosVector ) where {Tv,Ti} = spzeros (Tv, Ti, length (Z))
491477
492478convert (:: Type{AbstractSparseVector} , Z:: ZerosVector{T} ) where T = spzeros (T, length (Z))
493479convert (:: Type{AbstractSparseVector{T}} , Z:: ZerosVector ) where T= spzeros (T, length (Z))
494480
495- convert (:: Type{SparseMatrixCSC} , Z:: ZerosMatrix{T} ) where T = spzeros (T, size (Z)... )
496- convert (:: Type{SparseMatrixCSC{T}} , Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
497- convert (:: Type{SparseMatrixCSC{Tv,Ti}} , Z:: ZerosMatrix ) where {Tv,Ti} = spzeros (Tv, Ti, size (Z)... )
498- convert (:: Type{SparseMatrixCSC{Tv,Ti}} , Z:: Zeros{T,2,Axes} ) where {Tv,Ti<: Integer ,T,Axes} =
499- spzeros (Tv, Ti, size (Z)... )
481+ SparseMatrixCSC {T} (Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
482+ SparseMatrixCSC {Tv,Ti} (Z:: Zeros{T,2,Axes} ) where {Tv,Ti<: Integer ,T,Axes} = spzeros (Tv, Ti, size (Z)... )
500483
501484convert (:: Type{AbstractSparseMatrix} , Z:: ZerosMatrix{T} ) where T = spzeros (T, size (Z)... )
502485convert (:: Type{AbstractSparseMatrix{T}} , Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
@@ -506,11 +489,9 @@ convert(::Type{AbstractSparseArray{Tv}}, Z::Zeros{T}) where {T,Tv} = spzeros(Tv,
506489convert (:: Type{AbstractSparseArray{Tv,Ti}} , Z:: Zeros{T} ) where {T,Tv,Ti} = spzeros (Tv, Ti, size (Z)... )
507490convert (:: Type{AbstractSparseArray{Tv,Ti,N}} , Z:: Zeros{T,N} ) where {T,Tv,Ti,N} = spzeros (Tv, Ti, size (Z)... )
508491
509-
510- convert (:: Type{SparseMatrixCSC} , Z:: Eye{T} ) where T = SparseMatrixCSC {T} (I, size (Z)... )
511- convert (:: Type{SparseMatrixCSC{Tv}} , Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
492+ SparseMatrixCSC {Tv} (Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
512493# works around missing `speye`:
513- convert ( :: Type{ SparseMatrixCSC{Tv,Ti}} , Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
494+ SparseMatrixCSC {Tv,Ti} ( Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
514495 convert (SparseMatrixCSC{Tv,Ti}, SparseMatrixCSC {Tv} (I, size (Z)... ))
515496
516497convert (:: Type{AbstractSparseMatrix} , Z:: Eye{T} ) where {T} = SparseMatrixCSC {T} (I, size (Z)... )
@@ -551,7 +532,7 @@ cumsum(x::ZerosVector) = x
551532cumsum (x:: ZerosVector{Bool} ) = x
552533cumsum (x:: OnesVector{II} ) where II<: Integer = convert (AbstractVector{II}, oneto (length (x)))
553534cumsum (x:: OnesVector{Bool} ) = oneto (length (x))
554- cumsum (x:: AbstractFillVector{Bool} ) = cumsum (convert ( AbstractFill{Int}, x))
535+ cumsum (x:: AbstractFillVector{Bool} ) = cumsum (AbstractFill {Int} ( x))
555536
556537
557538# ########
0 commit comments