@@ -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
13+ issymmetric, ishermitian, AdjOrTransAbsVec, checksquare
1414
1515import Base. Broadcast: broadcasted, DefaultArrayStyle, broadcast_shape
1616
@@ -148,18 +148,9 @@ 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
153151AbstractArray {T} (F:: Fill{V,N} ) where {T,V,N} = Fill {T} (convert (T, F. value):: T , F. axes)
154152AbstractArray {T,N} (F:: Fill{V,N} ) where {T,V,N} = Fill {T} (convert (T, F. value):: T , F. axes)
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)
153+ AbstractFill {T} (F:: AbstractFill ) where T = AbstractArray {T} (F)
163154
164155copy (F:: Fill ) = Fill (F. value, F. axes)
165156
@@ -304,21 +295,23 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
304295 @inline size (Z:: $Typ ) = length .(Z. axes)
305296 @inline getindex_value (Z:: $Typ{T} ) where T = $ func (T)
306297
307- AbstractArray {T} (F:: $Typ{T} ) where T = F
308- AbstractArray {T,N} (F:: $Typ{T,N} ) where {T,N} = F
309298 AbstractArray {T} (F:: $Typ ) where T = $ Typ {T} (F. axes)
310299 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)
315300
316301 copy (F:: $Typ ) = F
317302
318303 getindex (F:: $Typ{T,0} ) where T = getindex_value (F)
319304 end
320305end
321306
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+
322315"""
323316 fillsimilar(a::AbstractFill, axes)
324317
@@ -467,32 +460,22 @@ for (Typ, funcs, func) in ((:Zeros, :zeros, :zero), (:Ones, :ones, :one))
467460 end
468461end
469462
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))
463+ # temporary patch. should be a PR(#48895) to LinearAlgebra
464+ Diagonal {T} (A:: AbstractFillMatrix ) where T = Diagonal {T} (diag (A))
465+ function convert (:: Type{T} , A:: AbstractFillMatrix ) where T<: Diagonal
466+ checksquare (A)
467+ isdiag (A) ? T (A) : throw (InexactError (:convert , T, A))
480468end
481469
482470# # Sparse arrays
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))
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))
487473
488474convert (:: Type{AbstractSparseVector} , Z:: ZerosVector{T} ) where T = spzeros (T, length (Z))
489475convert (:: Type{AbstractSparseVector{T}} , Z:: ZerosVector ) where T= spzeros (T, length (Z))
490476
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)... )
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)... )
496479
497480convert (:: Type{AbstractSparseMatrix} , Z:: ZerosMatrix{T} ) where T = spzeros (T, size (Z)... )
498481convert (:: Type{AbstractSparseMatrix{T}} , Z:: ZerosMatrix ) where T = spzeros (T, size (Z)... )
@@ -502,11 +485,9 @@ convert(::Type{AbstractSparseArray{Tv}}, Z::Zeros{T}) where {T,Tv} = spzeros(Tv,
502485convert (:: Type{AbstractSparseArray{Tv,Ti}} , Z:: Zeros{T} ) where {T,Tv,Ti} = spzeros (Tv, Ti, size (Z)... )
503486convert (:: Type{AbstractSparseArray{Tv,Ti,N}} , Z:: Zeros{T,N} ) where {T,Tv,Ti,N} = spzeros (Tv, Ti, size (Z)... )
504487
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)... )
488+ SparseMatrixCSC {Tv} (Z:: Eye{T} ) where {T,Tv} = SparseMatrixCSC {Tv} (I, size (Z)... )
508489# works around missing `speye`:
509- convert ( :: Type{ SparseMatrixCSC{Tv,Ti}} , Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
490+ SparseMatrixCSC {Tv,Ti} ( Z:: Eye{T} ) where {T,Tv,Ti<: Integer } =
510491 convert (SparseMatrixCSC{Tv,Ti}, SparseMatrixCSC {Tv} (I, size (Z)... ))
511492
512493convert (:: Type{AbstractSparseMatrix} , Z:: Eye{T} ) where {T} = SparseMatrixCSC {T} (I, size (Z)... )
@@ -547,7 +528,7 @@ cumsum(x::ZerosVector) = x
547528cumsum (x:: ZerosVector{Bool} ) = x
548529cumsum (x:: OnesVector{II} ) where II<: Integer = convert (AbstractVector{II}, oneto (length (x)))
549530cumsum (x:: OnesVector{Bool} ) = oneto (length (x))
550- cumsum (x:: AbstractFillVector{Bool} ) = cumsum (convert ( AbstractFill{Int}, x))
531+ cumsum (x:: AbstractFillVector{Bool} ) = cumsum (AbstractFill {Int} ( x))
551532
552533
553534# ########
0 commit comments