Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "StaticArrays"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "0.12.5"
version = "0.12.6"

[deps]
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
Expand Down
4 changes: 0 additions & 4 deletions src/lu.jl
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@ function _first_zero_on_diagonal(A::StaticMatrix{M,N,T}) where {M,N,T}
end
end

function _first_zero_on_diagonal(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix})
_first_zero_on_diagonal(A.data)
end

issuccess(F::LU) = _first_zero_on_diagonal(F.U) == 0

@generated function _lu(A::StaticMatrix{M,N,T}, pivot, check) where {M,N,T}
Expand Down
5 changes: 4 additions & 1 deletion src/traits.jl
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,10 @@ Size(::Type{Transpose{T, A}}) where {T, A <: AbstractVecOrMat{T}} = Size(Size(A)
Size(::Type{Symmetric{T, A}}) where {T, A <: AbstractMatrix{T}} = Size(A)
Size(::Type{Hermitian{T, A}}) where {T, A <: AbstractMatrix{T}} = Size(A)
Size(::Type{Diagonal{T, A}}) where {T, A <: AbstractVector{T}} = Size(Size(A)[1], Size(A)[1])
Size(::Type{<:LinearAlgebra.AbstractTriangular{T, A}}) where {T,A} = Size(A)
Size(::Type{UpperTriangular{T, A}}) where {T,A} = Size(A)
Size(::Type{UnitUpperTriangular{T, A}}) where {T,A} = Size(A)
Size(::Type{LowerTriangular{T, A}}) where {T,A} = Size(A)
Size(::Type{UnitLowerTriangular{T, A}}) where {T,A} = Size(A)

@pure Size(::Type{<:AbstractArray{<:Any, N}}) where {N} = Size(ntuple(_ -> Dynamic(), N))

Expand Down
20 changes: 12 additions & 8 deletions src/triangular.jl
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
const StaticULT = Union{UpperTriangular{<:Any,<:StaticMatrix},LowerTriangular{<:Any,<:StaticMatrix}}
const StaticUULT = Union{StaticULT,UnitUpperTriangular{<:Any,<:StaticMatrix},UnitLowerTriangular{<:Any,<:StaticMatrix}}

@inline transpose(A::LinearAlgebra.LowerTriangular{<:Any,<:StaticMatrix}) =
LinearAlgebra.UpperTriangular(transpose(A.data))
@inline adjoint(A::LinearAlgebra.LowerTriangular{<:Any,<:StaticMatrix}) =
Expand All @@ -6,22 +9,23 @@
LinearAlgebra.LowerTriangular(transpose(A.data))
@inline adjoint(A::LinearAlgebra.UpperTriangular{<:Any,<:StaticMatrix}) =
LinearAlgebra.LowerTriangular(adjoint(A.data))
@inline Base.:*(A::Adjoint{<:Any,<:StaticVecOrMat}, B::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}) =
@inline Base.:*(A::Adjoint{<:Any,<:StaticVecOrMat}, B::StaticUULT) =
adjoint(adjoint(B) * adjoint(A))
@inline Base.:*(A::Transpose{<:Any,<:StaticVecOrMat}, B::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}) =
@inline Base.:*(A::Transpose{<:Any,<:StaticVecOrMat}, B::StaticUULT) =
transpose(transpose(B) * transpose(A))
@inline Base.:*(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}, B::Adjoint{<:Any,<:StaticVecOrMat}) =
@inline Base.:*(A::StaticUULT, B::Adjoint{<:Any,<:StaticVecOrMat}) =
adjoint(adjoint(B) * adjoint(A))
@inline Base.:*(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}, B::Transpose{<:Any,<:StaticVecOrMat}) =
@inline Base.:*(A::StaticUULT, B::Transpose{<:Any,<:StaticVecOrMat}) =
transpose(transpose(B) * transpose(A))

const StaticULT = Union{UpperTriangular{<:Any,<:StaticMatrix},LowerTriangular{<:Any,<:StaticMatrix}}

@inline Base.:*(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}, B::StaticVecOrMat) = _A_mul_B(Size(A), Size(B), A, B)
@inline Base.:*(A::StaticVecOrMat, B::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}) = _A_mul_B(Size(A), Size(B), A, B)
@inline Base.:*(A::StaticUULT, B::StaticVecOrMat) = _A_mul_B(Size(A), Size(B), A, B)
@inline Base.:*(A::StaticVecOrMat, B::StaticUULT) = _A_mul_B(Size(A), Size(B), A, B)
@inline Base.:*(A::StaticULT, B::StaticULT) = _A_mul_B(Size(A), Size(B), A, B)
@inline Base.:\(A::StaticULT, B::StaticVecOrMat) = _A_ldiv_B(Size(A), Size(B), A, B)

function _first_zero_on_diagonal(A::StaticUULT)
_first_zero_on_diagonal(A.data)
end

@generated function _A_mul_B(::Size{sa}, ::Size{sb}, A::UpperTriangular{TA,<:StaticMatrix}, B::StaticVecOrMat{TB}) where {sa,sb,TA,TB}
m = sb[1]
Expand Down