Open
Description
Ref. discussion between @martinholters and @tkelman starting at #16740 (comment). How should fill!
behave for storage types with structural constraints such as Bidiagonal
and SparseMatrixCSC
? Brief illustration:
julia> fill!(Diagonal(rand(4)), 1) # fills within structural constraints
4×4 Diagonal{Float64}:
1.0 ⋅ ⋅ ⋅
⋅ 1.0 ⋅ ⋅
⋅ ⋅ 1.0 ⋅
⋅ ⋅ ⋅ 1.0
julia> fill!(Bidiagonal(rand(4), rand(3), true), 1) # fails noting structural constraints
ERROR: ArgumentError: Array A of type Bidiagonal{Float64} and size (4,4) can
not be filled with x=1, since some of its entries are constrained.
in fill!(::Bidiagonal{Float64}, ::Int64) at ./linalg/bidiag.jl:553
julia> spfoo = sprand(4, 4, 0.5)
4×4 sparse matrix with 7 Float64 nonzero entries:
[2, 1] = 0.403982
[3, 1] = 0.521604
[4, 1] = 0.857491
[1, 2] = 0.318858
[3, 3] = 0.893084
[2, 4] = 0.646681
[4, 4] = 0.601919
julia> fill!(spfoo, 1) # fills without respecting structural constraints
4×4 sparse matrix with 16 Float64 nonzero entries:
[1, 1] = 1.0
[2, 1] = 1.0
[3, 1] = 1.0
[4, 1] = 1.0
[1, 2] = 1.0
[2, 2] = 1.0
[3, 2] = 1.0
[4, 2] = 1.0
[1, 3] = 1.0
[2, 3] = 1.0
[3, 3] = 1.0
[4, 3] = 1.0
[1, 4] = 1.0
[2, 4] = 1.0
[3, 4] = 1.0
[4, 4] = 1.0
In other words, does fill!
mean 'fill every addressable entry in the provided AbstractArray
', or 'fill every stored entry in the provided AbstractArray
'? Should fill!
bifurcate into, e.g., fillall!
and fillstored!
? Best!