Skip to content

Commit 3c12489

Browse files
authored
Remove some converters (2) (#218)
* Update FillArrays.jl * Update fillalgebra.jl * Update runtests.jl * Update FillArrays.jl * Update fillalgebra.jl * Update fillalgebra.jl * 98% coverage * 648/660 coverage * 648/657 coverage * remove type piracy * fix
1 parent 193a641 commit 3c12489

File tree

3 files changed

+30
-49
lines changed

3 files changed

+30
-49
lines changed

src/FillArrays.jl

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Base: size, getindex, setindex!, IndexStyle, checkbounds, convert,
1010

1111
import 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

1515
import 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
153151
AbstractArray{T}(F::Fill{V,N}) where {T,V,N} = Fill{T}(convert(T, F.value)::T, F.axes)
154152
AbstractArray{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

164155
copy(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
320305
end
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
468461
end
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))
480468
end
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

488474
convert(::Type{AbstractSparseVector}, Z::ZerosVector{T}) where T = spzeros(T, length(Z))
489475
convert(::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

497480
convert(::Type{AbstractSparseMatrix}, Z::ZerosMatrix{T}) where T = spzeros(T, size(Z)...)
498481
convert(::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,
502485
convert(::Type{AbstractSparseArray{Tv,Ti}}, Z::Zeros{T}) where {T,Tv,Ti} = spzeros(Tv, Ti, size(Z)...)
503486
convert(::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

512493
convert(::Type{AbstractSparseMatrix}, Z::Eye{T}) where {T} = SparseMatrixCSC{T}(I, size(Z)...)
@@ -547,7 +528,7 @@ cumsum(x::ZerosVector) = x
547528
cumsum(x::ZerosVector{Bool}) = x
548529
cumsum(x::OnesVector{II}) where II<:Integer = convert(AbstractVector{II}, oneto(length(x)))
549530
cumsum(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
#########

src/fillalgebra.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ end
225225
# Zeros +/- Fill and Fill +/- Zeros
226226
function +(a::AbstractFill{T}, b::Zeros{V}) where {T, V}
227227
size(a) size(b) && throw(DimensionMismatch("dimensions must match."))
228-
return convert(AbstractFill{promote_type(T, V)}, a)
228+
return AbstractFill{promote_type(T, V)}(a)
229229
end
230230
+(a::Zeros, b::AbstractFill) = b + a
231231
-(a::AbstractFill, b::Zeros) = a + b
@@ -253,12 +253,12 @@ end
253253
function +(a::ZerosVector{T}, b::AbstractRange) where {T}
254254
size(a) size(b) && throw(DimensionMismatch("dimensions must match."))
255255
Tout = promote_type(T, eltype(b))
256-
return convert(Tout, first(b)):convert(Tout, step(b)):convert(Tout, last(b))
256+
return Tout(first(b)):Tout(step(b)):Tout(last(b))
257257
end
258-
function +(a::ZerosVector{T}, b::UnitRange) where {T}
258+
function +(a::ZerosVector{T}, b::UnitRange) where {T<:Integer}
259259
size(a) size(b) && throw(DimensionMismatch("dimensions must match."))
260260
Tout = promote_type(T, eltype(b))
261-
return convert(Tout, first(b)):convert(Tout, last(b))
261+
return AbstractUnitRange{Tout}(b)
262262
end
263263

264264
function -(a::ZerosVector, b::AbstractRange)
@@ -267,8 +267,6 @@ function -(a::ZerosVector, b::AbstractRange)
267267
end
268268
-(a::AbstractRange, b::ZerosVector) = a + b
269269

270-
271-
272270
####
273271
# norm
274272
####

test/runtests.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,10 @@ end
392392

393393
@test Diagonal(Zeros(8,5)) == Diagonal(zeros(5))
394394
@test convert(Diagonal, Zeros(5,5)) == Diagonal(zeros(5))
395-
@test_throws BoundsError convert(Diagonal, Zeros(8,5))
395+
@test_throws DimensionMismatch convert(Diagonal, Zeros(8,5))
396396

397397
@test convert(Diagonal{Int}, Zeros(5,5)) == Diagonal(zeros(Int,5))
398-
@test_throws BoundsError convert(Diagonal{Int}, Zeros(8,5))
398+
@test_throws DimensionMismatch convert(Diagonal{Int}, Zeros(8,5))
399399

400400

401401
@test Diagonal(Eye(8,5)) == Diagonal(ones(5))
@@ -414,6 +414,7 @@ end
414414

415415
@testset "Sparse vectors and matrices" begin
416416
@test SparseVector(Zeros(5)) ==
417+
SparseVector{Int}(Zeros(5)) ==
417418
SparseVector{Float64}(Zeros(5)) ==
418419
SparseVector{Float64,Int}(Zeros(5)) ==
419420
convert(AbstractSparseArray,Zeros(5)) ==
@@ -426,6 +427,7 @@ end
426427
for (Mat, SMat) in ((Zeros(5,5), spzeros(5,5)), (Zeros(6,5), spzeros(6,5)),
427428
(Eye(5), sparse(I,5,5)), (Eye(6,5), sparse(I,6,5)))
428429
@test SparseMatrixCSC(Mat) ==
430+
SparseMatrixCSC{Int}(Mat) ==
429431
SparseMatrixCSC{Float64}(Mat) ==
430432
SparseMatrixCSC{Float64,Int}(Mat) ==
431433
convert(AbstractSparseArray,Mat) ==

0 commit comments

Comments
 (0)