Error in Using DataInterpolations.jl and Enzyme.jl for Real-Time Interpolation and Gradient Computation in ODE Problems

Hello, I currently have an ODE problem where I need to use DataInterpolations.jl to interpolate and obtain real-time values, which are then used for computing du. Next, I need to use Enzyme.jl to compute the gradients of parameters during the computation process. Below is an MWE:

using DifferentiationInterface, Enzyme
using DifferentialEquations, DataInterpolations, SciMLSensitivity
using ComponentArrays

t_data = collect(0.0:1.0:11.0)
alpha_values = rand(length(t_data))

function loss_function(params, config)

    interpolator = config.interpolator_type(
        alpha_values,
        config.t_data,
    )

    function my_ode!(du, u, p, t)
        alpha_t = interpolator(t)
        du[1] = -alpha_t * u[1] * p[1] + p[2]
        return nothing
    end

    u0 = [10.0]
    tspan = (1.0, 10.0)

    prob = ODEProblem(my_ode!, u0, tspan, params, sensealg=GaussAdjoint(autojacvec=EnzymeVJP()))
    sol = solve(prob, Tsit5(), save_everystep=false, save_start=false)
    return Array(sol) |> sum
end

config = (
    interpolator_type=ConstantInterpolation,
    t_data=t_data,
)

initial_alpha_values = rand(length(t_data))
params = [1.0, 2.0]
target_func(p) = loss_function(p, config)
target_func(params)
ad_backend = AutoEnzyme(mode=Enzyme.set_runtime_activity(Enzyme.Reverse),)
val, grad = value_and_gradient(target_func, ad_backend, params)

I tried using ConstantInterpolation or LinearInterpolation for interpolation, but both resulted in the following issues:

Please submit a bug report with steps to reproduce this fault, and any error messages that follow (in their entirety). Thanks.
Exception: EXCEPTION_ACCESS_VIOLATION at 0x7ffc3391e40d -- gc_try_setmark_tag at C:/workdir/src\gc.c:826 [inlined]
gc_try_claim_and_push at C:/workdir/src\gc.c:2094 [inlined]
gc_mark_obj16 at C:/workdir/src\gc.c:2146
in expression starting at e:\JlCode\HydroModels\dev\tmp2.jl:39
gc_try_setmark_tag at C:/workdir/src\gc.c:826 [inlined]
gc_try_claim_and_push at C:/workdir/src\gc.c:2094 [inlined]
gc_mark_obj16 at C:/workdir/src\gc.c:2146
gc_mark_outrefs at C:/workdir/src\gc.c:2895 [inlined]
gc_mark_loop_serial_ at C:/workdir/src\gc.c:2938
gc_mark_loop_serial at C:/workdir/src\gc.c:2961
gc_mark_loop at C:/workdir/src\gc.c:3143 [inlined]
_jl_gc_collect at C:/workdir/src\gc.c:3532
ijl_gc_collect at C:/workdir/src\gc.c:3893
maybe_collect at C:/workdir/src\gc.c:926 [inlined]
jl_gc_pool_alloc_inner at C:/workdir/src\gc.c:1319
jl_gc_pool_alloc_noinline at C:/workdir/src\gc.c:1386 [inlined]
jl_gc_alloc_ at C:/workdir/src\julia_internal.h:523 [inlined]
jl_gc_alloc at C:/workdir/src\gc.c:3946
_new_genericmemory_ at C:/workdir/src\genericmemory.c:56 [inlined]
jl_alloc_genericmemory at C:/workdir/src\genericmemory.c:99
GenericMemory at .\boot.jl:516 [inlined]
array_new_memory at .\array.jl:1058 [inlined]
#134 at .\array.jl:1129
_growend! at .\array.jl:1116 [inlined]
push! at .\array.jl:1261 [inlined]
compute_basic_blocks at .\compiler/ssair\ir.jl:144
InferenceState at .\compiler\inferencestate.jl:288
InferenceState at .\compiler\inferencestate.jl:500
typeinf_edge at .\compiler\typeinfer.jl:913
abstract_call_method at .\compiler\abstractinterpretation.jl:660
abstract_call_gf_by_type at .\compiler\abstractinterpretation.jl:102
abstract_call_known at .\compiler\abstractinterpretation.jl:2200
abstract_call at .\compiler\abstractinterpretation.jl:2282
abstract_call at .\compiler\abstractinterpretation.jl:2275
abstract_call at .\compiler\abstractinterpretation.jl:2423
abstract_eval_call at .\compiler\abstractinterpretation.jl:2438
abstract_eval_statement_expr at .\compiler\abstractinterpretation.jl:2454
abstract_eval_statement at .\compiler\abstractinterpretation.jl:2752
abstract_eval_basic_statement at .\compiler\abstractinterpretation.jl:3068
typeinf_local at .\compiler\abstractinterpretation.jl:3331
typeinf_nocycle at .\compiler\abstractinterpretation.jl:3413
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:215
typeinf_edge at .\compiler\typeinfer.jl:923
abstract_call_method at .\compiler\abstractinterpretation.jl:660
abstract_call_gf_by_type at .\compiler\abstractinterpretation.jl:102
abstract_call_known at .\compiler\abstractinterpretation.jl:2200
abstract_call at .\compiler\abstractinterpretation.jl:2282
abstract_call at .\compiler\abstractinterpretation.jl:2275
abstract_call at .\compiler\abstractinterpretation.jl:2423
abstract_eval_call at .\compiler\abstractinterpretation.jl:2438
abstract_eval_statement_expr at .\compiler\abstractinterpretation.jl:2454
abstract_eval_statement at .\compiler\abstractinterpretation.jl:2752
abstract_eval_basic_statement at .\compiler\abstractinterpretation.jl:3044
typeinf_local at .\compiler\abstractinterpretation.jl:3331
typeinf_nocycle at .\compiler\abstractinterpretation.jl:3413
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:215
typeinf_edge at .\compiler\typeinfer.jl:923
abstract_call_method at .\compiler\abstractinterpretation.jl:660
abstract_call_gf_by_type at .\compiler\abstractinterpretation.jl:102
abstract_call_unknown at .\compiler\abstractinterpretation.jl:2269
abstract_call at .\compiler\abstractinterpretation.jl:2279
abstract_call at .\compiler\abstractinterpretation.jl:2275
abstract_call at .\compiler\abstractinterpretation.jl:2423
abstract_eval_call at .\compiler\abstractinterpretation.jl:2438
abstract_eval_statement_expr at .\compiler\abstractinterpretation.jl:2454
abstract_eval_statement at .\compiler\abstractinterpretation.jl:2752
abstract_eval_basic_statement at .\compiler\abstractinterpretation.jl:3068
typeinf_local at .\compiler\abstractinterpretation.jl:3331
typeinf_nocycle at .\compiler\abstractinterpretation.jl:3413
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:215
typeinf_ext at .\compiler\typeinfer.jl:1101
typeinf_ext_toplevel at .\compiler\typeinfer.jl:1139
typeinf_ext_toplevel at .\compiler\typeinfer.jl:1135
jfptr_typeinf_ext_toplevel_41140.1 at C:\Users\OMEN\.julia\juliaup\julia-1.11.5+0.x64.w64.mingw32\lib\julia\sys.dll (unknown line)
_jl_invoke at C:/workdir/src\gf.c:2948 [inlined]
ijl_apply_generic at C:/workdir/src\gf.c:3125 [inlined]
jl_apply at C:/workdir/src\julia.h:2157 [inlined]
jl_type_infer at C:/workdir/src\gf.c:390
jl_generate_fptr_impl at C:/workdir/src\jitlayers.cpp:519
jl_compile_method_internal at C:/workdir/src\gf.c:2536
jl_compile_method_internal at C:/workdir/src\gf.c:2946 [inlined]
_jl_invoke at C:/workdir/src\gf.c:2940 [inlined]
ijl_invoke at C:/workdir/src\gf.c:2955
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:447
unknown function (ip: 00000204b273f9b0)
unknown function (ip: 00000204b273f34d)
unknown function (ip: 00000204b273efb1)
Merger at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:35 [inlined]
macro expansion at .\ntuple.jl:72 [inlined]
ntuple at .\ntuple.jl:69 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:447
unknown function (ip: 00000204b273eee0)
unknown function (ip: 00000204b273e60d)
unknown function (ip: 00000204b273e5a1)
Merger at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:35 [inlined]
ntuple at .\ntuple.jl:48 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:447
unknown function (ip: 00000204b273e4d0)
unknown function (ip: 00000204b273dc7d)
unknown function (ip: 00000204b273db01)
Merger at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:35 [inlined]
macro expansion at .\ntuple.jl:72 [inlined]
ntuple at .\ntuple.jl:69 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:447
unknown function (ip: 00000204b273da30)
unknown function (ip: 00000204b273b15d)
unknown function (ip: 00000204b273aed1)
Merger at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:35 [inlined]
macro expansion at .\ntuple.jl:72 [inlined]
ntuple at .\ntuple.jl:69 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:447
unknown function (ip: 00000204b273ae00)
unknown function (ip: 00000204b27397ed)
unknown function (ip: 00000204b2739561)
Merger at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:35 [inlined]
macro expansion at .\ntuple.jl:72 [inlined]
ntuple at .\ntuple.jl:69 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:447
unknown function (ip: 00000204b27391f0)
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:206 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:206 [inlined]
active_reg_inner at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:206 [inlined]
guaranteed_const_nongen at D:\Julia\packages\packages\Enzyme\lmg7D\src\analyses\activity.jl:487 [inlined]
thunkbase at D:\Julia\packages\packages\Enzyme\lmg7D\src\compiler.jl:5885
thunk_generator at D:\Julia\packages\packages\Enzyme\lmg7D\src\compiler.jl:6122
jfptr_thunk_generator_36804 at D:\Julia\packages\compiled\v1.11\Enzyme\G1p5n_WkAWM.dll (unknown line)
jl_call_staged at C:/workdir/src\method.c:601
ijl_code_for_staged at C:/workdir/src\method.c:656
get_staged at .\compiler\utilities.jl:123
retrieve_code_info at .\compiler\utilities.jl:135 [inlined]
InferenceState at .\compiler\inferencestate.jl:497
typeinf_edge at .\compiler\typeinfer.jl:913
abstract_call_method at .\compiler\abstractinterpretation.jl:660
abstract_call_gf_by_type at .\compiler\abstractinterpretation.jl:102
abstract_call_known at .\compiler\abstractinterpretation.jl:2200
abstract_call at .\compiler\abstractinterpretation.jl:2282
abstract_call at .\compiler\abstractinterpretation.jl:2275
abstract_call at .\compiler\abstractinterpretation.jl:2423
abstract_eval_call at .\compiler\abstractinterpretation.jl:2438
abstract_eval_statement_expr at .\compiler\abstractinterpretation.jl:2454
abstract_eval_statement at .\compiler\abstractinterpretation.jl:2752
abstract_eval_basic_statement at .\compiler\abstractinterpretation.jl:3068
typeinf_local at .\compiler\abstractinterpretation.jl:3331
typeinf_nocycle at .\compiler\abstractinterpretation.jl:3413
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:215
typeinf_ext at .\compiler\typeinfer.jl:1101
typeinf_ext_toplevel at .\compiler\typeinfer.jl:1139
typeinf_ext_toplevel at .\compiler\typeinfer.jl:1135
jfptr_typeinf_ext_toplevel_41140.1 at C:\Users\OMEN\.julia\juliaup\julia-1.11.5+0.x64.w64.mingw32\lib\julia\sys.dll (unknown line)
_jl_invoke at C:/workdir/src\gf.c:2948 [inlined]
ijl_apply_generic at C:/workdir/src\gf.c:3125 [inlined]
jl_apply at C:/workdir/src\julia.h:2157 [inlined]
jl_type_infer at C:/workdir/src\gf.c:390
jl_generate_fptr_impl at C:/workdir/src\jitlayers.cpp:519
jl_compile_method_internal at C:/workdir/src\gf.c:2536
jl_compile_method_internal at C:/workdir/src\gf.c:2946 [inlined]
_jl_invoke at C:/workdir/src\gf.c:2940 [inlined]
ijl_apply_generic at C:/workdir/src\gf.c:3125
#solve#43 at D:\Julia\packages\packages\DiffEqBase\AfBQT\src\solve.jl:1083
Allocations: 225954686 (Pool: 225949721; Big: 4965); GC: 72

However, when I use AutoForwardDiff, this issue does not occur. So, I would like to get help to compute this gradient using Enzyme. The package versions are as follows:

(tmp) pkg> st DifferentiationInterface Enzyme DifferentialEquations DataInterpolations SciMLSensitivity
Status `E:\JlCode\HydroModels\tmp\Project.toml`
  [82cc6244] DataInterpolations v8.6.0
  [0c46a032] DifferentialEquations v7.16.1
  [a0c0ee7d] DifferentiationInterface v0.7.7
  [7da242da] Enzyme v0.13.73
  [1ed8b502] SciMLSensitivity v7.89.0

I assume that’s because it can’t handle the FindFirstFunctions.jl stuff. Can you open an issue?