diff --git a/src/linalg.jl b/src/linalg.jl index 87bdc9a0..07fc5e6f 100644 --- a/src/linalg.jl +++ b/src/linalg.jl @@ -7,26 +7,19 @@ using Random: rand! const tilebufsize = 10800 # Approximately 32k/3 # In matrix-vector multiplication, the correct orientation of the vector is assumed. +const BiTriSym = Union{Bidiagonal,Tridiagonal,SymTridiagonal} const DenseMatrixUnion = Union{StridedMatrix, BitMatrix} const DenseTriangular = UpperOrLowerTriangular{<:Any,<:DenseMatrixUnion} const DenseInputVector = Union{StridedVector, BitVector} const DenseVecOrMat = Union{DenseMatrixUnion, DenseInputVector} - -matprod_dest(A::SparseMatrixCSCUnion2, B::DenseTriangular, TS) = - similar(B, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::AdjOrTrans{<:Any,<:SparseMatrixCSCUnion2}, B::DenseTriangular, TS) = - similar(B, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::StridedMaybeAdjOrTransMat, B::SparseMatrixCSCUnion2, TS) = - similar(A, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::Union{BitMatrix,AdjOrTrans{<:Any,BitMatrix}}, B::SparseMatrixCSCUnion2, TS) = - similar(A, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::DenseTriangular, B::SparseMatrixCSCUnion2, TS) = - similar(A, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::StridedMaybeAdjOrTransMat, B::AdjOrTrans{<:Any,<:SparseMatrixCSCUnion2}, TS) = - similar(A, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::Union{BitMatrix,AdjOrTrans{<:Any,BitMatrix}}, B::AdjOrTrans{<:Any,<:SparseMatrixCSCUnion2}, TS) = - similar(A, TS, (size(A, 1), size(B, 2))) -matprod_dest(A::DenseTriangular, B::AdjOrTrans{<:Any,<:SparseMatrixCSCUnion2}, TS) = +const DenseViewWrappers{T,S} = Union{AdjOrTrans{T,S}, HermOrSym{T,S}, UpperOrLowerTriangular{T,S}, UpperHessenberg{T,S}} +const QuasiSparseMatrix = Union{SparseMatrixCSCUnion2, DenseViewWrappers{<:Any,<:SparseMatrixCSCUnion2}} + +matprod_dest(A, B::QuasiSparseMatrix, TS) = similar(A, TS, (size(A, 1), size(B, 2))) +# sparse products with banded matrices should return sparse arrays (Diagonal is handled by fallback) +matprod_dest(::BiTriSym, B::QuasiSparseMatrix, TS) = similar(B, TS, size(B)) +matprod_dest(::Diagonal, B::QuasiSparseMatrix, TS) = similar(B, TS, size(B)) # disambiguation with LinearAlgebra +matprod_dest(A::QuasiSparseMatrix, B::BiTriSym, TS) = similar(A, TS, (size(A, 1), size(B, 2))) for op ∈ (:+, :-), Wrapper ∈ (:Hermitian, :Symmetric)