Skip to content

Commit 25c8128

Browse files
authored
Aggressive constprop in istriu/istril for structured matrices (#54437)
This makes the following evaluate at compile-time: ```julia julia> U = UpperTriangular(rand(2,2)); julia> @code_typed istriu(U) CodeInfo( 1 ─ return true ) => Bool ``` Also, this reduces latency in this operation: ```julia julia> @time (U -> istriu(U))(U) 0.069995 seconds (158.88 k allocations: 8.715 MiB, 83.72% compilation time) # nightly 0.035610 seconds (156.62 k allocations: 8.594 MiB, 68.18% compilation time) # This PR ``` Similar methods are annotated for other structured matrix types, where the results may be trivially obtained from the structure for certain values of the band index `k`.
1 parent d01d256 commit 25c8128

File tree

5 files changed

+11
-11
lines changed

5 files changed

+11
-11
lines changed

stdlib/LinearAlgebra/src/bidiag.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ end
309309

310310
iszero(M::Bidiagonal) = iszero(M.dv) && iszero(M.ev)
311311
isone(M::Bidiagonal) = all(isone, M.dv) && iszero(M.ev)
312-
function istriu(M::Bidiagonal, k::Integer=0)
312+
Base.@constprop :aggressive function istriu(M::Bidiagonal, k::Integer=0)
313313
if M.uplo == 'U'
314314
if k <= 0
315315
return true
@@ -328,7 +328,7 @@ function istriu(M::Bidiagonal, k::Integer=0)
328328
end
329329
end
330330
end
331-
function istril(M::Bidiagonal, k::Integer=0)
331+
Base.@constprop :aggressive function istril(M::Bidiagonal, k::Integer=0)
332332
if M.uplo == 'U'
333333
if k >= 1
334334
return true

stdlib/LinearAlgebra/src/diagonal.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ iszero(D::Diagonal) = all(iszero, D.diag)
223223
isone(D::Diagonal) = all(isone, D.diag)
224224
isdiag(D::Diagonal) = all(isdiag, D.diag)
225225
isdiag(D::Diagonal{<:Number}) = true
226-
istriu(D::Diagonal, k::Integer=0) = k <= 0 || iszero(D.diag) ? true : false
227-
istril(D::Diagonal, k::Integer=0) = k >= 0 || iszero(D.diag) ? true : false
226+
Base.@constprop :aggressive istriu(D::Diagonal, k::Integer=0) = k <= 0 || iszero(D.diag) ? true : false
227+
Base.@constprop :aggressive istril(D::Diagonal, k::Integer=0) = k >= 0 || iszero(D.diag) ? true : false
228228
function triu!(D::Diagonal{T}, k::Integer=0) where T
229229
n = size(D,1)
230230
if !(-n + 1 <= k <= n + 1)

stdlib/LinearAlgebra/src/hessenberg.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ real(H::UpperHessenberg{<:Real}) = H
7474
real(H::UpperHessenberg{<:Complex}) = UpperHessenberg(triu!(real(H.data),-1))
7575
imag(H::UpperHessenberg) = UpperHessenberg(triu!(imag(H.data),-1))
7676

77-
function istriu(A::UpperHessenberg, k::Integer=0)
77+
Base.@constprop :aggressive function istriu(A::UpperHessenberg, k::Integer=0)
7878
k <= -1 && return true
7979
return _istriu(A, k)
8080
end

stdlib/LinearAlgebra/src/triangular.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,11 @@ function Base.replace_in_print_matrix(A::Union{LowerTriangular,UnitLowerTriangul
351351
return i >= j ? s : Base.replace_with_centered_mark(s)
352352
end
353353

354-
function istril(A::Union{LowerTriangular,UnitLowerTriangular}, k::Integer=0)
354+
Base.@constprop :aggressive function istril(A::Union{LowerTriangular,UnitLowerTriangular}, k::Integer=0)
355355
k >= 0 && return true
356356
return _istril(A, k)
357357
end
358-
function istriu(A::Union{UpperTriangular,UnitUpperTriangular}, k::Integer=0)
358+
Base.@constprop :aggressive function istriu(A::Union{UpperTriangular,UnitUpperTriangular}, k::Integer=0)
359359
k <= 0 && return true
360360
return _istriu(A, k)
361361
end

stdlib/LinearAlgebra/src/tridiag.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ end
332332

333333
# tril and triu
334334

335-
function istriu(M::SymTridiagonal, k::Integer=0)
335+
Base.@constprop :aggressive function istriu(M::SymTridiagonal, k::Integer=0)
336336
if k <= -1
337337
return true
338338
elseif k == 0
@@ -341,7 +341,7 @@ function istriu(M::SymTridiagonal, k::Integer=0)
341341
return iszero(_evview(M)) && iszero(M.dv)
342342
end
343343
end
344-
istril(M::SymTridiagonal, k::Integer) = istriu(M, -k)
344+
Base.@constprop :aggressive istril(M::SymTridiagonal, k::Integer) = istriu(M, -k)
345345
iszero(M::SymTridiagonal) = iszero(_evview(M)) && iszero(M.dv)
346346
isone(M::SymTridiagonal) = iszero(_evview(M)) && all(isone, M.dv)
347347
isdiag(M::SymTridiagonal) = iszero(_evview(M))
@@ -718,7 +718,7 @@ end
718718

719719
iszero(M::Tridiagonal) = iszero(M.dl) && iszero(M.d) && iszero(M.du)
720720
isone(M::Tridiagonal) = iszero(M.dl) && all(isone, M.d) && iszero(M.du)
721-
function istriu(M::Tridiagonal, k::Integer=0)
721+
Base.@constprop :aggressive function istriu(M::Tridiagonal, k::Integer=0)
722722
if k <= -1
723723
return true
724724
elseif k == 0
@@ -729,7 +729,7 @@ function istriu(M::Tridiagonal, k::Integer=0)
729729
return iszero(M.dl) && iszero(M.d) && iszero(M.du)
730730
end
731731
end
732-
function istril(M::Tridiagonal, k::Integer=0)
732+
Base.@constprop :aggressive function istril(M::Tridiagonal, k::Integer=0)
733733
if k >= 1
734734
return true
735735
elseif k == 0

0 commit comments

Comments
 (0)