Closed
Description
I've run into a problem that affects Interpolations.jl. Type inference (or more likely constant propagation?) in Julia 1.7.0 gives up earlier than in previous versions of Julia.
Fairly minimal example:
using Interpolations
nx = 10
f1(x) = sin((x-3)*2pi/(nx-1) - 1)
A = Float64[f1(x) for x in 1:nx]
itp = interpolate(A, BSpline(Constant()))
etp = extrapolate(itp, 0.0)
@code_warntype ndims(etp)
With the result:
julia> @code_warntype ndims(etp)
MethodInstance for ndims(::Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64})
from ndims(itp::AbstractInterpolation) in Interpolations at /home/mateusz/.julia/dev/Interpolations/src/Interpolations.jl:158
Arguments
#self#::Core.Const(ndims)
itp::Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64}
Body::Any
1 ─ %1 = Interpolations.typeof(itp)::Core.Const(Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64})
│ %2 = Interpolations.ndims(%1)::Any
└── return %2
While for example using Julia 1.6.1:
julia> @code_warntype ndims(etp)
Variables
#self#::Core.Const(ndims)
itp::Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64}
Body::Int64
1 ─ %1 = Interpolations.typeof(itp)::Core.Const(Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64})
│ %2 = Interpolations.ndims(%1)::Core.Const(1)
└── return %2
Forcing specialization for one more method of ndims
solves the problem but I don't know if this is the right solution.
Versioninfo for reference:
julia> versioninfo()
Julia Version 1.7.0
Commit 3bf9d17731 (2021-11-30 12:12 UTC)
Platform Info:
OS: Linux (x86_64-pc-linux-gnu)
CPU: Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, haswell)
Environment:
JULIA_EDITOR = code
JULIA_NUM_THREADS =