Skip to content

Commit 4535feb

Browse files
committed
more or less give up and just force things to be type stable
1 parent d8af318 commit 4535feb

4 files changed

Lines changed: 13 additions & 10 deletions

File tree

src/algorithms.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ Finally, the same behavior is obtained when the keyword arguments are
100100
passed as the third positional argument in the form of a `NamedTuple`.
101101
""" select_algorithm
102102

103-
@inline function select_algorithm(f::F, A, alg::Alg = nothing; kwargs...) where {F, Alg}
103+
# WARNING: In order to keep everything type stable, this function is marked as foldable.
104+
# This mostly means that the `default_algorithm` implementation must be foldable as well
105+
Base.@assume_effects :foldable function select_algorithm(f::F, A, alg::Alg = nothing; kwargs...) where {F, Alg}
104106
if isnothing(alg)
105107
return default_algorithm(f, A; kwargs...)
106108
elseif alg isa Symbol
@@ -129,8 +131,10 @@ In general, this is called by [`select_algorithm`](@ref) if no algorithm is spec
129131
explicitly.
130132
New types should prefer to register their default algorithms in the type domain.
131133
""" default_algorithm
132-
default_algorithm(f::F, A; kwargs...) where {F} = default_algorithm(f, typeof(A); kwargs...)
133-
default_algorithm(f::F, A, B; kwargs...) where {F} = default_algorithm(f, typeof(A), typeof(B); kwargs...)
134+
@inline default_algorithm(f::F, A; kwargs...) where {F} =
135+
default_algorithm(f, typeof(A); kwargs...)
136+
@inline default_algorithm(f::F, A, B; kwargs...) where {F} =
137+
default_algorithm(f, typeof(A), typeof(B); kwargs...)
134138
# avoid infinite recursion:
135139
function default_algorithm(f::F, ::Type{T}; kwargs...) where {F, T}
136140
throw(MethodError(default_algorithm, (f, T)))

src/interface/decompositions.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,11 @@ The optional `driver` symbol can be used to choose between different implementat
7979
Depending on the driver, various other keywords may be (un)available to customize the implementation.
8080
"""
8181
@algdef Householder
82-
8382
function Householder(;
84-
driver::Driver = DefaultDriver(), blocksize::Int = 0,
83+
blocksize::Int = 0, driver::Driver = DefaultDriver(),
8584
pivoted::Bool = false, positive::Bool = true
8685
)
87-
return Householder((; driver, blocksize, pivoted, positive))
86+
return Householder((; blocksize, driver, pivoted, positive))
8887
end
8988

9089
default_householder_driver(A) = default_householder_driver(typeof(A))

src/interface/lq.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ See also [`qr_full(!)`](@ref lq_full) and [`qr_compact(!)`](@ref lq_compact).
7171
default_lq_algorithm(A; kwargs...) = default_lq_algorithm(typeof(A); kwargs...)
7272

7373
default_lq_algorithm(T::Type; kwargs...) = throw(MethodError(default_lq_algorithm, (T,)))
74-
default_lq_algorithm(::Type{T}; driver = default_householder_driver(T), kwargs...) where {T <: AbstractMatrix} =
75-
Householder(; driver, kwargs...)
74+
default_lq_algorithm(::Type{T}; kwargs...) where {T <: AbstractMatrix} =
75+
Householder(; kwargs...)
7676
default_lq_algorithm(::Type{T}; kwargs...) where {T <: Diagonal} =
7777
DiagonalAlgorithm(; kwargs...)
7878
default_lq_algorithm(::Type{<:Base.ReshapedArray{T, N, A}}) where {T, N, A} =

src/interface/qr.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ See also [`lq_full(!)`](@ref lq_full) and [`lq_compact(!)`](@ref lq_compact).
7171
default_qr_algorithm(A; kwargs...) = default_qr_algorithm(typeof(A); kwargs...)
7272

7373
default_qr_algorithm(T::Type; kwargs...) = throw(MethodError(default_qr_algorithm, (T,)))
74-
default_qr_algorithm(::Type{T}; driver = default_householder_driver(T), kwargs...) where {T <: AbstractMatrix} =
75-
Householder(; driver, kwargs...)
74+
default_qr_algorithm(::Type{T}; kwargs...) where {T <: AbstractMatrix} =
75+
Householder(; kwargs...)
7676
default_qr_algorithm(::Type{T}; kwargs...) where {T <: Diagonal} =
7777
DiagonalAlgorithm(; kwargs...)
7878
default_qr_algorithm(::Type{<:Base.ReshapedArray{T, N, A}}) where {T, N, A} =

0 commit comments

Comments
 (0)