Skip to content

Commit 193a641

Browse files
committed
Revert "Remove some converters (#213)"
This reverts commit 5ee8beb.
1 parent 5ee8beb commit 193a641

File tree

3 files changed

+47
-32
lines changed

3 files changed

+47
-32
lines changed

src/FillArrays.jl

Lines changed: 41 additions & 22 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, checksquare
13+
issymmetric, ishermitian, AdjOrTransAbsVec
1414

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

155164
copy(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
305320
end
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
461468
end
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))
468480
end
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

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

480497
convert(::Type{AbstractSparseMatrix}, Z::ZerosMatrix{T}) where T = spzeros(T, size(Z)...)
481498
convert(::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,
485502
convert(::Type{AbstractSparseArray{Tv,Ti}}, Z::Zeros{T}) where {T,Tv,Ti} = spzeros(Tv, Ti, size(Z)...)
486503
convert(::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

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

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 AbstractFill{promote_type(T, V)}(a)
228+
return convert(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 AbstractRange{Tout}(b)
256+
return convert(Tout, first(b)):convert(Tout, step(b)):convert(Tout, last(b))
257257
end
258258
function +(a::ZerosVector{T}, b::UnitRange) where {T}
259259
size(a) size(b) && throw(DimensionMismatch("dimensions must match."))
260260
Tout = promote_type(T, eltype(b))
261-
return AbstractRange{Tout}(b)
261+
return convert(Tout, first(b)):convert(Tout, last(b))
262262
end
263263

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

270-
# temporary patch. should be a PR(#48894) to julia base.
271-
AbstractRange{T}(r::AbstractUnitRange) where {T<:Integer} = AbstractUnitRange{T}(r)
272-
AbstractRange{T}(r::AbstractRange) where T = T(first(r)):T(step(r)):T(last(r))
270+
273271

274272
####
275273
# norm

test/runtests.jl

Lines changed: 2 additions & 4 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 DimensionMismatch convert(Diagonal, Zeros(8,5))
395+
@test_throws BoundsError convert(Diagonal, Zeros(8,5))
396396

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

400400

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

415415
@testset "Sparse vectors and matrices" begin
416416
@test SparseVector(Zeros(5)) ==
417-
SparseVector{Int}(Zeros(5)) ==
418417
SparseVector{Float64}(Zeros(5)) ==
419418
SparseVector{Float64,Int}(Zeros(5)) ==
420419
convert(AbstractSparseArray,Zeros(5)) ==
@@ -427,7 +426,6 @@ end
427426
for (Mat, SMat) in ((Zeros(5,5), spzeros(5,5)), (Zeros(6,5), spzeros(6,5)),
428427
(Eye(5), sparse(I,5,5)), (Eye(6,5), sparse(I,6,5)))
429428
@test SparseMatrixCSC(Mat) ==
430-
SparseMatrixCSC{Int}(Mat) ==
431429
SparseMatrixCSC{Float64}(Mat) ==
432430
SparseMatrixCSC{Float64,Int}(Mat) ==
433431
convert(AbstractSparseArray,Mat) ==

0 commit comments

Comments
 (0)