Skip to content

Tracers in new versions of ADNLPModels trigger errors with DifferentialEquations #342

@nathanemac

Description

@nathanemac

When defining an ADNLPModel with DifferentialEquations

using ADNLPModels   # default version
using DifferentialEquations

function FH_ODE(dx, x, p, t)
  V, W = x
  I, μ, a, b, c = p
  dx[1] = (V - V^3 / 3 - W + I) / μ
  dx[2] = μ * (a * V - b * W + c)
end

function simulate(p)
  temp_prob = DifferentialEquations.remake(prob_FH, p=p)
  sol = DifferentialEquations.solve(
    temp_prob,
    DifferentialEquations.Vern9(),
  )
  return vec(sol)
end

function residual(p)
  F = simulate(p)
  F .-= data
  return F
end

function misfit(p)
  F = residual(p)
  return dot(F, F) / 2
end

u0 = [2.0; 0.0]
tspan = (0.0, 20.0)
savetime = 0.2
pars_FH = [0.5, 0.08, 1.0, 0.8, 0.7]
prob_FH = DifferentialEquations.ODEProblem(FH_ODE, u0, tspan, pars_FH)

The following line will fail if ADNLPModels is > 0.7.2

ADNLPModels.ADNLPModel(misfit, ones(5))

gives :

ERROR: TypeError: in typeassert, expected Float64, got a value of type SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{Int64, BitSet, Dict{Int64, BitSet}, SparseConnectivityTracer.NotShared}}

And this line:

nequ = 202
ADNLPModels.ADNLSModel(residual, ones(5), nequ)

also fails:

ERROR: TypeError: in typeassert, expected Float64, got a value of type SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{Int64, BitSet, Dict{Int64, BitSet}, SparseConnectivityTracer.NotShared}}

In both cases, the line causing the error is line 7 in my code:

function FH_ODE(dx, x, p, t)

Here is the complete error report for the ADNLPModel

ERROR: TypeError: in typeassert, expected Float64, got a value of type SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{Int64, BitSet, Dict{Int64, BitSet}, SparseConnectivityTracer.NotShared}}
Stacktrace:
  [1] setindex!(A::Vector{…}, x::SparseConnectivityTracer.HessianTracer{…}, i::Int64)
    @ Base ./array.jl:987
  [2] FH_ODE(dx::Vector{Float64}, x::Vector{Float64}, p::Vector{SparseConnectivityTracer.HessianTracer{…}}, t::Float64)
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:7
  [3] (::SciMLBase.Void{typeof(FH_ODE)})(::Vector{Float64}, ::Vararg{Any})
    @ SciMLBase ~/.julia/packages/SciMLBase/Zrnkf/src/utils.jl:486
  [4] (::FunctionWrappers.CallWrapper{…})(f::SciMLBase.Void{…}, arg1::Vector{…}, arg2::Vector{…}, arg3::Vector{…}, arg4::Float64)
    @ FunctionWrappers ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:65
  [5] macro expansion
    @ ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:137 [inlined]
  [6] do_ccall
    @ ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:125 [inlined]
  [7] FunctionWrapper
    @ ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:144 [inlined]
  [8] _call
    @ ~/.julia/packages/FunctionWrappersWrappers/9XR0m/src/FunctionWrappersWrappers.jl:12 [inlined]
  [9] FunctionWrappersWrapper
    @ ~/.julia/packages/FunctionWrappersWrappers/9XR0m/src/FunctionWrappersWrappers.jl:10 [inlined]
 [10] ODEFunction
    @ ~/.julia/packages/SciMLBase/Zrnkf/src/scimlfunctions.jl:2470 [inlined]
 [11] ode_determine_initdt(u0::Vector{…}, t::Float64, tdir::Float64, dtmax::Float64, abstol::Float64, reltol::Float64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), prob::ODEProblem{…}, integrator::OrdinaryDiffEqCore.ODEIntegrator{…})
    @ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/initdt.jl:53
 [12] auto_dt_reset!
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/integrators/integrator_interface.jl:450 [inlined]
 [13] handle_dt!(integrator::OrdinaryDiffEqCore.ODEIntegrator{…})
    @ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:647
 [14] __init(prob::ODEProblem{…}, alg::Vern9{…}, timeseries_init::Tuple{}, ts_init::Tuple{}, ks_init::Tuple{}, recompile::Type{…}; saveat::Tuple{}, tstops::Tuple{}, d_discontinuities::Tuple{}, save_idxs::Nothing, save_everystep::Bool, save_on::Bool, save_start::Bool, save_end::Nothing, callback::Nothing, dense::Bool, calck::Bool, dt::Float64, dtmin::Float64, dtmax::Float64, force_dtmin::Bool, adaptive::Bool, gamma::Rational{…}, abstol::Nothing, reltol::Nothing, qmin::Rational{…}, qmax::Int64, qsteady_min::Int64, qsteady_max::Int64, beta1::Nothing, beta2::Nothing, qoldinit::Rational{…}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, maxiters::Int64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), internalopnorm::typeof(LinearAlgebra.opnorm), isoutofdomain::typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), unstable_check::typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), verbose::Bool, timeseries_errors::Bool, dense_errors::Bool, advance_to_tstop::Bool, stop_at_next_tstop::Bool, initialize_save::Bool, progress::Bool, progress_steps::Int64, progress_name::String, progress_message::typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), progress_id::Symbol, userdata::Nothing, allow_extrapolation::Bool, initialize_integrator::Bool, alias::ODEAliasSpecifier, initializealg::OrdinaryDiffEqCore.DefaultInit, kwargs::@Kwargs{})
    @ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:609
 [15] __init (repeats 5 times)
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:11 [inlined]
 [16] #__solve#62
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:6 [inlined]
 [17] __solve
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:1 [inlined]
 [18] #solve_call#35
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:635 [inlined]
 [19] solve_call
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:592 [inlined]
 [20] #solve_up#44
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1142 [inlined]
 [21] solve_up
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1120 [inlined]
 [22] #solve#42
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1057 [inlined]
 [23] solve(prob::ODEProblem{…}, args::Vern9{…})
    @ DiffEqBase ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1047
 [24] simulate(p::Vector{SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{…}}})
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:13
 [25] residual(p::Vector{SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{…}}})
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:21
 [26] misfit(p::Vector{SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{…}}})
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:27
 [27] (::ADNLPModels.var"#lagrangian#55"{})(x::Vector{…})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/sparsity_pattern.jl:44
 [28] trace_function(::Type{…}, f::ADNLPModels.var"#lagrangian#55"{}, x::Vector{…})
    @ SparseConnectivityTracer ~/.julia/packages/SparseConnectivityTracer/yg6Dn/src/trace_functions.jl:48
 [29] _hessian_sparsity(f::Function, x::Vector{Float64}, ::Type{SparseConnectivityTracer.HessianTracer{…}})
    @ SparseConnectivityTracer ~/.julia/packages/SparseConnectivityTracer/yg6Dn/src/trace_functions.jl:115
 [30] hessian_sparsity
    @ ~/.julia/packages/SparseConnectivityTracer/yg6Dn/src/adtypes_interface.jl:64 [inlined]
 [31] #compute_hessian_sparsity#54
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/sparsity_pattern.jl:54 [inlined]
 [32] compute_hessian_sparsity
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/sparsity_pattern.jl:35 [inlined]
 [33] macro expansion
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/sparse_hessian.jl:31 [inlined]
 [34] macro expansion
    @ ./timing.jl:421 [inlined]
 [35] ADNLPModels.SparseADHessian(nvar::Int64, f::Function, ncon::Int64, c!::ADNLPModels.var"#2#3"; x0::Vector{…}, coloring_algorithm::SparseMatrixColorings.GreedyColoringAlgorithm{…}, detector::SparseConnectivityTracer.TracerSparsityDetector{…}, show_time::Bool, kwargs::@Kwargs{})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/sparse_hessian.jl:30
 [36] macro expansion
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:90 [inlined]
 [37] macro expansion
    @ ./timing.jl:421 [inlined]
 [38] ADNLPModels.ADModelBackend(nvar::Int64, f::typeof(misfit); backend::Symbol, matrix_free::Bool, show_time::Bool, gradient_backend::Type, hprod_backend::Type, hessian_backend::Type, kwargs::@Kwargs{})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:86
 [39] ADNLPModel(f::Function, x0::Vector{Float64}; name::String, minimize::Bool, kwargs::@Kwargs{})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/nlp.jl:124
 [40] ADNLPModel(f::Function, x0::Vector{Float64})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/nlp.jl:119
 [41] top-level scope
    @ ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:37

And for ADNSLModel:

ERROR: TypeError: in typeassert, expected Float64, got a value of type SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{Int64, BitSet, Dict{Int64, BitSet}, SparseConnectivityTracer.NotShared}}
Stacktrace:
  [1] setindex!(A::Vector{…}, x::SparseConnectivityTracer.HessianTracer{…}, i::Int64)
    @ Base ./array.jl:987
  [2] FH_ODE(dx::Vector{Float64}, x::Vector{Float64}, p::Vector{SparseConnectivityTracer.HessianTracer{…}}, t::Float64)
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:7
  [3] (::SciMLBase.Void{typeof(FH_ODE)})(::Vector{Float64}, ::Vararg{Any})
    @ SciMLBase ~/.julia/packages/SciMLBase/Zrnkf/src/utils.jl:486
  [4] (::FunctionWrappers.CallWrapper{…})(f::SciMLBase.Void{…}, arg1::Vector{…}, arg2::Vector{…}, arg3::Vector{…}, arg4::Float64)
    @ FunctionWrappers ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:65
  [5] macro expansion
    @ ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:137 [inlined]
  [6] do_ccall
    @ ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:125 [inlined]
  [7] FunctionWrapper
    @ ~/.julia/packages/FunctionWrappers/Q5cBx/src/FunctionWrappers.jl:144 [inlined]
  [8] _call
    @ ~/.julia/packages/FunctionWrappersWrappers/9XR0m/src/FunctionWrappersWrappers.jl:12 [inlined]
  [9] FunctionWrappersWrapper
    @ ~/.julia/packages/FunctionWrappersWrappers/9XR0m/src/FunctionWrappersWrappers.jl:10 [inlined]
 [10] ODEFunction
    @ ~/.julia/packages/SciMLBase/Zrnkf/src/scimlfunctions.jl:2470 [inlined]
 [11] ode_determine_initdt(u0::Vector{…}, t::Float64, tdir::Float64, dtmax::Float64, abstol::Float64, reltol::Float64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), prob::ODEProblem{…}, integrator::OrdinaryDiffEqCore.ODEIntegrator{…})
    @ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/initdt.jl:53
 [12] auto_dt_reset!
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/integrators/integrator_interface.jl:450 [inlined]
 [13] handle_dt!(integrator::OrdinaryDiffEqCore.ODEIntegrator{…})
    @ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:647
 [14] __init(prob::ODEProblem{…}, alg::Vern9{…}, timeseries_init::Tuple{}, ts_init::Tuple{}, ks_init::Tuple{}, recompile::Type{…}; saveat::Tuple{}, tstops::Tuple{}, d_discontinuities::Tuple{}, save_idxs::Nothing, save_everystep::Bool, save_on::Bool, save_start::Bool, save_end::Nothing, callback::Nothing, dense::Bool, calck::Bool, dt::Float64, dtmin::Float64, dtmax::Float64, force_dtmin::Bool, adaptive::Bool, gamma::Rational{…}, abstol::Nothing, reltol::Nothing, qmin::Rational{…}, qmax::Int64, qsteady_min::Int64, qsteady_max::Int64, beta1::Nothing, beta2::Nothing, qoldinit::Rational{…}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, maxiters::Int64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), internalopnorm::typeof(LinearAlgebra.opnorm), isoutofdomain::typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), unstable_check::typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), verbose::Bool, timeseries_errors::Bool, dense_errors::Bool, advance_to_tstop::Bool, stop_at_next_tstop::Bool, initialize_save::Bool, progress::Bool, progress_steps::Int64, progress_name::String, progress_message::typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), progress_id::Symbol, userdata::Nothing, allow_extrapolation::Bool, initialize_integrator::Bool, alias::ODEAliasSpecifier, initializealg::OrdinaryDiffEqCore.DefaultInit, kwargs::@Kwargs{})
    @ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:609
 [15] __init (repeats 5 times)
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:11 [inlined]
 [16] #__solve#62
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:6 [inlined]
 [17] __solve
    @ ~/.julia/packages/OrdinaryDiffEqCore/bMOsj/src/solve.jl:1 [inlined]
 [18] #solve_call#35
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:635 [inlined]
 [19] solve_call
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:592 [inlined]
 [20] #solve_up#44
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1142 [inlined]
 [21] solve_up
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1120 [inlined]
 [22] #solve#42
    @ ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1057 [inlined]
 [23] solve(prob::ODEProblem{…}, args::Vern9{…})
    @ DiffEqBase ~/.julia/packages/DiffEqBase/zYZst/src/solve.jl:1047
 [24] simulate(p::Vector{SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{…}}})
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:13
 [25] residual(p::Vector{SparseConnectivityTracer.HessianTracer{SparseConnectivityTracer.DictHessianPattern{…}}})
    @ Main ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:21
 [26] (::ADNLPModels.var"#F!#432"{})(output::Vector{…}, x::Vector{…})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/nls.jl:141
 [27] F
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:233 [inlined]
 [28] (::ADNLPModels.var"#F#15"{Int64, ADNLPModels.var"#F#6#16"{}})(x::Vector{SparseConnectivityTracer.HessianTracer{…}})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:231
 [29] (::ADNLPModels.var"#7#17")(x::Vector{SparseConnectivityTracer.HessianTracer{…}})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:236
 [30] (::ADNLPModels.var"#lagrangian#55"{})(x::Vector{…})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/sparsity_pattern.jl:44
 [31] trace_function(::Type{…}, f::ADNLPModels.var"#lagrangian#55"{}, x::Vector{…})
    @ SparseConnectivityTracer ~/.julia/packages/SparseConnectivityTracer/yg6Dn/src/trace_functions.jl:48
 [32] _hessian_sparsity(f::Function, x::Vector{Float64}, ::Type{SparseConnectivityTracer.HessianTracer{…}})
    @ SparseConnectivityTracer ~/.julia/packages/SparseConnectivityTracer/yg6Dn/src/trace_functions.jl:115
 [33] hessian_sparsity
    @ ~/.julia/packages/SparseConnectivityTracer/yg6Dn/src/adtypes_interface.jl:64 [inlined]
 [34] #compute_hessian_sparsity#54
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/sparsity_pattern.jl:54 [inlined]
 [35] compute_hessian_sparsity
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/sparsity_pattern.jl:35 [inlined]
 [36] macro expansion
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/sparse_hessian.jl:31 [inlined]
 [37] macro expansion
    @ ./timing.jl:421 [inlined]
 [38] ADNLPModels.SparseADHessian(nvar::Int64, f::Function, ncon::Int64, c!::ADNLPModels.var"#9#19"; x0::Vector{…}, coloring_algorithm::SparseMatrixColorings.GreedyColoringAlgorithm{…}, detector::SparseConnectivityTracer.TracerSparsityDetector{…}, show_time::Bool, kwargs::@Kwargs{})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/sparse_hessian.jl:30
 [39] macro expansion
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:266 [inlined]
 [40] macro expansion
    @ ./timing.jl:421 [inlined]
 [41] ADModelNLSBackend(nvar::Int64, F!::ADNLPModels.var"#F!#432"{}, nequ::Int64; backend::Symbol, matrix_free::Bool, show_time::Bool, gradient_backend::Type, hprod_backend::Type, hessian_backend::Type, hprod_residual_backend::Type, jprod_residual_backend::Type, jtprod_residual_backend::Type, jacobian_residual_backend::Type, hessian_residual_backend::Type, kwargs::@Kwargs{})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/ad.jl:262
 [42] ADNLSModel!(F!::Function, x0::Vector{…}, nequ::Int64; linequ::Vector{…}, name::String, minimize::Bool, kwargs::@Kwargs{})
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/nls.jl:163
 [43] ADNLSModel!
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/nls.jl:151 [inlined]
 [44] #ADNLSModel#431
    @ ~/.julia/packages/ADNLPModels/nR2jK/src/nls.jl:148 [inlined]
 [45] ADNLSModel(F::Function, x0::Vector{Float64}, nequ::Int64)
    @ ADNLPModels ~/.julia/packages/ADNLPModels/nR2jK/src/nls.jl:139
 [46] top-level scope
    @ ~/Desktop/PhD/Recherche/iR2N/Coding/debug/debug RegularizedProblems/test_patch.jl:40

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions