In the MixedModels package the bulk of the work fitting a model consists of updating a blocked Cholesky factor to new parameter values. The matrix being factored consists of a square set of blocks of possibly different types (e.g. SparseMatrixCSC
, Diagonal
, Matrix
). All of the blocks have the same element type, usually Float64
.
It appears that the way I am writing methods does not allow the compiler to infer the type of the return value from methods like
sqrtpwrss(m::LinearMixedModel{T}) where {T} = T(first(m.L.blocks[end, end]))
Applying @code_warntype
returns
julia> @code_warntype MixedModels.sqrtpwrss(m1)
Variables
#self#::Core.Compiler.Const(MixedModels.sqrtpwrss, false)
m::LinearMixedModel{Float64}
Body::Any
1 ─ %1 = Base.getproperty(m, :L)::BlockArrays.BlockArray{Float64,2,R} where R<:AbstractArray{Float64,2}
│ %2 = Base.getproperty(%1, :blocks)::Array{R,2} where R<:AbstractArray{Float64,2}
│ %3 = Base.lastindex(%2, 1)::Int64
│ %4 = Base.lastindex(%2, 2)::Int64
│ %5 = Base.getindex(%2, %3, %4)::AbstractArray{Float64,2}
│ %6 = MixedModels.first(%5)::Any
│ %7 = ($(Expr(:static_parameter, 1)))(%6)::Any
└── return %7
Is there a way I could write this to aid the type inference to produce a concrete type? Functions like this are called a lot.