Skip to content

Commit

Permalink
Flesh out similar methods operating on SparseMatrixCSCs and make …
Browse files Browse the repository at this point in the history
…them more consistent both among themselves and with other `similar` methods in Base.
  • Loading branch information
Sacha0 committed Jul 20, 2016
1 parent 3647de6 commit 2ee5664
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions base/sparse/sparsematrix.jl
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,30 @@ function copy!(A::SparseMatrixCSC, B::SparseMatrixCSC)
return A
end

similar(S::SparseMatrixCSC, Tv::Type=eltype(S)) = SparseMatrixCSC(S.m, S.n, copy(S.colptr), copy(S.rowval), Array{Tv}(length(S.nzval)))
similar{Tv,Ti,TvNew,TiNew}(S::SparseMatrixCSC{Tv,Ti}, ::Type{TvNew}, ::Type{TiNew}) = SparseMatrixCSC(S.m, S.n, convert(Array{TiNew},S.colptr), convert(Array{TiNew}, S.rowval), Array{TvNew}(length(S.nzval)))
@inline similar{Tv}(S::SparseMatrixCSC, ::Type{Tv}, d::Dims) = spzeros(Tv, d...)
# similar with dims specifications only
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, dims::Dims) = similar(S, Tv, Ti, dims...)
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, m::Integer) = similar(S, Tv, Ti, m)
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, m::Integer, n::Integer) = similar(S, Tv, Ti, m, n)
# similar with entry type and dims specifications
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, TvNew::Type, dims::Dims) = similar(S, TvNew, Ti, dims...)
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, TvNew::Type, m::Integer) = similar(S, TvNew, Ti, m)
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, TvNew::Type, m::Integer, n::Integer) = similar(S, TvNew, Ti, m, n)
# similar with entry type, index type, and dims specifications
similar(S::SparseMatrixCSC, TvNew::Type, TiNew::Type, dims::Dims) = similar(S, TvNew, TiNew, dims...)
similar(S::SparseMatrixCSC, TvNew::Type, TiNew::Type, m::Integer) = SparseVector(m, similar(S.rowval, TiNew, 0), similar(S.nzval, TvNew, 0))
similar(S::SparseMatrixCSC, TvNew::Type, TiNew::Type, m::Integer, n::Integer) = _preservestorage_similar(S, TvNew, TiNew, m, n)
# parent method for similar that only preserves storage (for when new and old dims differ)
function _preservestorage_similar(S::SparseMatrixCSC, TvNew::Type, TiNew::Type, m::Integer, n::Integer)
return SparseMatrixCSC(m, n, ones(TiNew, n+1), similar(S.rowval, TiNew), similar(S.nzval, TvNew))
end
# similar without specifications or with type specifications only
similar{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti}, TvNew::Type = Tv, TiNew::Type = Ti) = _preservenzstruc_similar(S, TvNew, TiNew)
# parent method for similar that preserves nonzero structure (for when new and old dims match)
function _preservenzstruc_similar(S::SparseMatrixCSC, TvNew::Type, TiNew::Type)
newcolptr = copy!(similar(S.colptr, TiNew), S.colptr)
newrowval = copy!(similar(S.rowval, TiNew), S.rowval)
return SparseMatrixCSC(S.m, S.n, newcolptr, newrowval, similar(S.nzval, TvNew))
end

function convert{Tv,Ti,TvS,TiS}(::Type{SparseMatrixCSC{Tv,Ti}}, S::SparseMatrixCSC{TvS,TiS})
if Tv == TvS && Ti == TiS
Expand Down

0 comments on commit 2ee5664

Please sign in to comment.