Skip to content

Attempt at ForwardDiff Jacobian preparation when explicit Jacobian is provided yields error #2671

Open
@SouthEndMusic

Description

@SouthEndMusic

I isolated this M(N)WE:

using DifferentialEquations
using LinearAlgebra

function f!(du, u, p, t)
    du .= u
end

N = 10
jac_prototype = Matrix{Float64}(I, N, N)
function jac(J, u, p, t)
    J .= 0
    for i = 1:N
        J[i, i] = 1
    end
end

u0 = ones(N)
timespan = (0, 10)

RHS = ODEFunction(f!; jac_prototype, jac)
prob = ODEProblem(RHS, u0, timespan)
solve(
    prob,
    QNDF(;
        nlsolve = NonlinearSolveAlg(
            OrdinaryDiffEq.OrdinaryDiffEqNonlinearSolve.NewtonRaphson(;),
        ),
    ),
)

Stack trace:

ERROR: MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{NonlinearFunction{…}, Float64}, Float64, 10})
The type `Float64` exists, but no method is defined for this combination of argument types when trying to construct it. 

Closest candidates are:
  (::Type{T})(::Real, ::RoundingMode) where T<:AbstractFloat
   @ Base rounding.jl:265
  (::Type{T})(::T) where T<:Number
   @ Core boot.jl:900
  Float64(::Float32)
   @ Base float.jl:341
  ...

Stacktrace:
  [1] convert(::Type{Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{NonlinearFunction{…}, Float64}, Float64, 10})        
    @ Base .\number.jl:7
  [2] setindex!(A::Vector{Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{…}, Float64, 10}, i::Int64)
    @ Base .\array.jl:987
  [3] macro expansion
    @ C:\Users\konin_bt\.julia\packages\FastBroadcast\wfdTr\src\FastBroadcast.jl:163 [inlined]
  [4] macro expansion
    @ .\simdloop.jl:77 [inlined]
  [5] __fast_materialize!
    @ C:\Users\konin_bt\.julia\packages\FastBroadcast\wfdTr\src\FastBroadcast.jl:162 [inlined]
  [6] _fast_materialize!
    @ C:\Users\konin_bt\.julia\packages\FastBroadcast\wfdTr\src\FastBroadcast.jl:196 [inlined]
  [7] fast_materialize!
    @ C:\Users\konin_bt\.julia\packages\FastBroadcast\wfdTr\src\FastBroadcast.jl:277 [inlined]
  [8] compute_ustep!
    @ C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqNonlinearSolve\e4hoO\src\newton.jl:296 [inlined]
  [9] _compute_rhs!(tmp::Vector{…}, ztmp::Vector{…}, ustep::Vector{…}, γ::Rational{…}, α::Float64, tstep::Float64, k::Vector{…}, invγdt::Float64, method::OrdinaryDiffEqCore.MethodType, p::SciMLBase.NullParameters, dt::Float64, f::ODEFunction{…}, z::Vector{…})
    @ OrdinaryDiffEqNonlinearSolve C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqNonlinearSolve\e4hoO\src\newton.jl:373
 [10] (::OrdinaryDiffEqNonlinearSolve.var"#6#9")(ztmp::Vector{…}, z::Vector{…}, p::Tuple{…})
    @ OrdinaryDiffEqNonlinearSolve C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqNonlinearSolve\e4hoO\src\utils.jl:227
 [11] NonlinearFunction
    @ C:\Users\konin_bt\.julia\packages\SciMLBase\2TYas\src\scimlfunctions.jl:2471 [inlined]
 [12] FixTail
    @ C:\Users\konin_bt\.julia\packages\DifferentiationInterface\7eD1K\src\utils\context.jl:169 [inlined]
 [13] vector_mode_dual_eval!
    @ C:\Users\konin_bt\.julia\packages\ForwardDiff\UBbGT\src\apiutils.jl:31 [inlined]
 [14] vector_mode_jacobian(f!::DifferentiationInterface.FixTail{…}, y::Vector{…}, x::Vector{…}, cfg::ForwardDiff.JacobianConfig{…})
    @ ForwardDiff C:\Users\konin_bt\.julia\packages\ForwardDiff\UBbGT\src\jacobian.jl:139
 [15] jacobian
    @ C:\Users\konin_bt\.julia\packages\ForwardDiff\UBbGT\src\jacobian.jl:40 [inlined]
 [16] jacobian(f!::NonlinearFunction{…}, y::Vector{…}, prep::DifferentiationInterfaceForwardDiffExt.ForwardDiffTwoArgJacobianPrep{…}, backend::AutoForwardDiff{…}, x::Vector{…}, contexts::DifferentiationInterface.Constant{…})
    @ DifferentiationInterfaceForwardDiffExt C:\Users\konin_bt\.julia\packages\DifferentiationInterface\7eD1K\ext\DifferentiationInterfaceForwardDiffExt\twoarg.jl:470
 [17] construct_jacobian_cache(prob::NonlinearProblem{…}, alg::NonlinearSolveFirstOrder.GeneralizedFirstOrderAlgorithm{…}, f::NonlinearFunction{…}, fu::Vector{…}, u::Vector{…}, p::Tuple{…}; stats::SciMLBase.NLStats, autodiff::AutoForwardDiff{…}, vjp_autodiff::AutoFiniteDiff{…}, jvp_autodiff::AutoForwardDiff{…}, linsolve::Nothing)
    @ NonlinearSolveBase C:\Users\konin_bt\.julia\packages\NonlinearSolveBase\xDyV6\src\jacobian.jl:76
 [18] construct_jacobian_cache
    @ C:\Users\konin_bt\.julia\packages\NonlinearSolveBase\xDyV6\src\jacobian.jl:34 [inlined]
 [19] __init(::NonlinearProblem{…}, ::NonlinearSolveFirstOrder.GeneralizedFirstOrderAlgorithm{…}; stats::SciMLBase.NLStats, alias_u0::Bool, maxiters::Int64, abstol::Nothing, reltol::Nothing, maxtime::Nothing, termination_condition::Nothing, internalnorm::Function, linsolve_kwargs::@NamedTuple{}, initializealg::NonlinearSolveBase.NonlinearSolveDefaultInit, kwargs::@Kwargs{})
    @ NonlinearSolveFirstOrder C:\Users\konin_bt\.julia\packages\NonlinearSolveFirstOrder\o91ZE\src\solve.jl:161        
 [20] __init
    @ C:\Users\konin_bt\.julia\packages\NonlinearSolveFirstOrder\o91ZE\src\solve.jl:121 [inlined]
 [21] #init_call#31
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:545 [inlined]
 [22] init_call
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:518 [inlined]
 [23] #init_up#34
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:571 [inlined]
 [24] init_up
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:566 [inlined]
 [25] #init#32
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:559 [inlined]
 [26] init(prob::NonlinearProblem{…}, args::NonlinearSolveFirstOrder.GeneralizedFirstOrderAlgorithm{…})
    @ DiffEqBase C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:549
 [27] build_nlsolver(alg::QNDF{…}, nlalg::NonlinearSolveAlg{…}, u::Vector{…}, uprev::Vector{…}, p::SciMLBase.NullParameters, t::Float64, dt::Float64, f::ODEFunction{…}, rate_prototype::Vector{…}, ::Type{…}, ::Type{…}, ::Type{…}, γ::Rational{…}, c::Int64, α::Int64, ::Val{…})
    @ OrdinaryDiffEqNonlinearSolve C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqNonlinearSolve\e4hoO\src\utils.jl:233
 [28] build_nlsolver
    @ C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqNonlinearSolve\e4hoO\src\utils.jl:152 [inlined]
 [29] build_nlsolver
    @ C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqNonlinearSolve\e4hoO\src\utils.jl:142 [inlined]
 [30] alg_cache(alg::QNDF{…}, u::Vector{…}, rate_prototype::Vector{…}, ::Type{…}, ::Type{…}, ::Type{…}, uprev::Vector{…}, uprev2::Vector{…}, f::ODEFunction{…}, t::Float64, dt::Float64, reltol::Float64, p::SciMLBase.NullParameters, calck::Bool, ::Val{…})
    @ OrdinaryDiffEqBDF C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqBDF\Ga8aD\src\bdf_caches.jl:430
 [31] __init(prob::ODEProblem{…}, alg::QNDF{…}, 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::Rational{…}, beta1::Nothing, beta2::Nothing, qoldinit::Rational{…}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, maxiters::Int64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), internalopnorm::typeof(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 C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqCore\bMOsj\src\solve.jl:409
 [32] __init (repeats 5 times)
    @ C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqCore\bMOsj\src\solve.jl:11 [inlined]
 [33] __solve(::ODEProblem{…}, ::QNDF{…}; kwargs::@Kwargs{})
    @ OrdinaryDiffEqCore C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqCore\bMOsj\src\solve.jl:6
 [34] __solve
    @ C:\Users\konin_bt\.julia\packages\OrdinaryDiffEqCore\bMOsj\src\solve.jl:1 [inlined]
 [35] #solve_call#35
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:635 [inlined]
 [36] solve_call(_prob::ODEProblem{…}, args::QNDF{…})
    @ DiffEqBase C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:592
 [37] solve_up(prob::ODEProblem{…}, sensealg::Nothing, u0::Vector{…}, p::SciMLBase.NullParameters, args::QNDF{…}; kwargs::@Kwargs{})
    @ DiffEqBase C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:1142
 [38] solve_up
    @ C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:1120 [inlined]
 [39] solve(prob::ODEProblem{…}, args::QNDF{…}; sensealg::Nothing, u0::Nothing, p::Nothing, wrap::Val{…}, kwargs::@Kwargs{})
    @ DiffEqBase C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:1057
 [40] solve(prob::ODEProblem{…}, args::QNDF{…})
    @ DiffEqBase C:\Users\konin_bt\.julia\packages\DiffEqBase\zYZst\src\solve.jl:1047
 [41] top-level scope
    @ c:\Users\konin_bt\OneDrive - Stichting Deltares\Documents\Ribasim_development\runners\runner.jl:38
Some type information was truncated. Use `show(err)` to see complete types.

I presume this problem was introduced by #2567.

Ping @gdalle @jClugstor

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions