MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{DifferentiationInterface.FixTail{…}, Float64}, Float64, 3})

Hi, I’m trying to find the steady states of a ODE system by FindSteadyStates.jl.

using OrdinaryDiffEq, ODEInterfaceDiffEq, DifferentialEquations
using ModelingToolkit, NonlinearSolve, FindSteadyStates

@kwdef mutable struct Param1_dt
    k = [0.0, 50.0, 0.0, 50.0, 0.0, 50.0]
    n = [4.0,4.0,4.0]
    K = [100.0,100.0,100.0]
    kd = [0.2,0.2,0.2]
end

function motif1_dt!(dx,x,p,t)

    #Parameters
    k=p.k
    K=p.K
    kd=p.kd
    n=p.n
    #Reactions
    V = zeros(9)
    V[1] = k[1]
    V[2] = (k[2]*K[1]^n[1])/(K[1]^n[1]+x[3]^n[1])
    V[3] = k[3]
    V[4] = (k[4]*K[2]^n[2])/(K[2]^n[2]+x[1]^n[2])
    V[5] = k[5]
    V[6] = (k[6]*K[3]^n[3])/(K[3]^n[3]+x[2]^n[3])
    V[7] = kd[1]*x[1]
    V[8] = kd[2]*x[2]
    V[9] = kd[3]*x[3]
    #ODE
    dx[1] = V[1] + V[2] - V[7]
    dx[2] = V[3] + V[4] - V[8]
    dx[3] = V[5] + V[6] - V[9]

end

param=Param1_dt()
de = DEsteady(func = motif1_dt!, p =  param, u0 = [0.0,1.0,2.0], method = SSRootfind())

param_grid=ParameterGrid([[0,100,5],[0,100,5],[0,100,5]])

sol = solve(de,param_grid)

And the error from solve function is:

ERROR: MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{DifferentiationInterface.FixTail{…}, Float64}, Float64, 3})
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(::IrrationalConstants.Log4π)
   @ IrrationalConstants C:\Users\emman\.julia\packages\IrrationalConstants\lWTip\src\macro.jl:131
  ...

Stacktrace:
  [1] convert(::Type{Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{DifferentiationInterface.FixTail{…}, Float64}, Float64, 3})
    @ Base .\number.jl:7
  [2] setindex!(A::Vector{Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{…}, Float64, 3}, i::Int64)
    @ Base .\array.jl:976
  [3] motif1_dt!(dx::Vector{ForwardDiff.Dual{…}}, x::Vector{ForwardDiff.Dual{…}}, p::Param1_dt, t::Float64)
    @ Main p:\Public Folder\Project_Osc_vs_Swi\Osc_vs_Swi\Test.jl:75
  [4] #46
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\scimlfunctions.jl:2742 [inlined]
  [5] NonlinearFunction
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\scimlfunctions.jl:2469 [inlined]
  [6] FixTail
    @ C:\Users\emman\.julia\packages\DifferentiationInterface\qrWdQ\src\utils\context.jl:7 [inlined]
  [7] vector_mode_dual_eval!
    @ C:\Users\emman\.julia\packages\ForwardDiff\UBbGT\src\apiutils.jl:31 [inlined]
  [8] vector_mode_jacobian(f!::DifferentiationInterface.FixTail{…}, y::Vector{…}, x::Vector{…}, cfg::ForwardDiff.JacobianConfig{…})
    @ ForwardDiff C:\Users\emman\.julia\packages\ForwardDiff\UBbGT\src\jacobian.jl:139
  [9] jacobian
    @ C:\Users\emman\.julia\packages\ForwardDiff\UBbGT\src\jacobian.jl:40 [inlined]
 [10] jacobian(f!::NonlinearFunction{…}, y::Vector{…}, prep::DifferentiationInterfaceForwardDiffExt.ForwardDiffTwoArgJacobianPrep{…}, backend::AutoForwardDiff{…}, x::Vector{…}, contexts::DifferentiationInterface.Constant{…})
    @ DifferentiationInterfaceForwardDiffExt C:\Users\emman\.julia\packages\DifferentiationInterface\qrWdQ\ext\DifferentiationInterfaceForwardDiffExt\twoarg.jl:433
 [11] NonlinearSolve.JacobianCache(prob::NonlinearProblem{…}, alg::GeneralizedFirstOrderAlgorithm{…}, f::NonlinearFunction{…}, fu_::Vector{…}, u::Vector{…}, p::Param1_dt; stats::SciMLBase.NLStats, autodiff::Nothing, vjp_autodiff::Nothing, jvp_autodiff::Nothing, linsolve::Nothing)
    @ NonlinearSolve C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\internal\jacobian.jl:89
 [12] JacobianCache
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\internal\jacobian.jl:47 [inlined]
 [13] __init(::NonlinearProblem{…}, ::GeneralizedFirstOrderAlgorithm{…}; stats::SciMLBase.NLStats, alias_u0::Bool, maxiters::Int64, abstol::Nothing, reltol::Nothing, maxtime::Nothing, termination_condition::Nothing, internalnorm::Function, linsolve_kwargs::@NamedTuple{}, kwargs::@Kwargs{…})
    @ NonlinearSolve C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\core\generalized_first_order.jl:175
 [14] __init
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\core\generalized_first_order.jl:156 [inlined]
 [15] __solve(::NonlinearProblem{…}, ::GeneralizedFirstOrderAlgorithm{…}; stats::SciMLBase.NLStats, kwargs::@Kwargs{…})
    @ NonlinearSolve C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\core\generic.jl:3
 [16] __solve
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\core\generic.jl:1 [inlined]
 [17] macro expansion
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\default.jl:282 [inlined]
 [18] __solve(::NonlinearProblem{…}, ::NonlinearSolvePolyAlgorithm{…}; stats::SciMLBase.NLStats, alias_u0::Bool, verbose::Bool, kwargs::@Kwargs{})
    @ NonlinearSolve C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\default.jl:255
 [19] __solve
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\default.jl:255 [inlined]
 [20] #__solve#251
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\default.jl:527 [inlined]
 [21] __solve
    @ C:\Users\emman\.julia\packages\NonlinearSolve\sBl1H\src\default.jl:524 [inlined]
 [22] #__solve#2
    @ C:\Users\emman\.julia\packages\SteadyStateDiffEq\jdIWC\src\solve.jl:4 [inlined]
 [23] __solve
    @ C:\Users\emman\.julia\packages\SteadyStateDiffEq\jdIWC\src\solve.jl:1 [inlined]
 [24] #solve_call#35
    @ C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:635 [inlined]
 [25] solve_call
    @ C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:592 [inlined]
 [26] solve_up(prob::SteadyStateProblem{…}, sensealg::Nothing, u0::Vector{…}, p::Param1_dt, args::SSRootfind{…}; kwargs::@Kwargs{})
    @ DiffEqBase C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:1128
 [27] solve_up
    @ C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:1106 [inlined]
 [28] #solve#42
    @ C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:1043 [inlined]
 [29] solve(prob::SteadyStateProblem{Vector{…}, true, Param1_dt, ODEFunction{…}, @Kwargs{}}, args::SSRootfind{Nothing})
    @ DiffEqBase C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:1033
 [30] batch_func(i::Int64, prob::EnsembleProblem{…}, alg::SSRootfind{…}; kwargs::@Kwargs{})
    @ SciMLBase C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:193
 [31] batch_func
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:180 [inlined]
 [32] #712
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:252 [inlined]
 [33] responsible_map
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:245 [inlined]
 [34] solve_batch(prob::EnsembleProblem{…}, alg::SSRootfind{…}, ::EnsembleSerial, II::UnitRange{…}, pmap_batch_size::Int64; kwargs::@Kwargs{})
    @ SciMLBase C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:251
 [35] solve_batch
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:250 [inlined]
 [36] solve_batch(prob::EnsembleProblem{…}, alg::SSRootfind{…}, ensemblealg::EnsembleThreads, II::UnitRange{…}, pmap_batch_size::Int64; kwargs::@Kwargs{})
    @ SciMLBase C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:261
 [37] solve_batch
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:257 [inlined]
 [38] macro expansion
    @ .\timing.jl:421 [inlined]
 [39] (::SciMLBase.var"#701#702"{Int64, Int64, Int64, @Kwargs{}, EnsembleProblem{…}, SSRootfind{…}, EnsembleThreads})()
    @ SciMLBase C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:146
 [40] with_logstate(f::SciMLBase.var"#701#702"{…}, logstate::Base.CoreLogging.LogState)
    @ Base.CoreLogging .\logging\logging.jl:522
 [41] with_logger
    @ .\logging\logging.jl:632 [inlined]
 [42] __solve(prob::EnsembleProblem{…}, alg::SSRootfind{…}, ensemblealg::EnsembleThreads; trajectories::Int64, batch_size::Int64, progress_aggregate::Bool, pmap_batch_size::Int64, kwargs::@Kwargs{})        
    @ SciMLBase C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:130
 [43] __solve
    @ C:\Users\emman\.julia\packages\SciMLBase\sYmAV\src\ensemble\basic_ensemble_solve.jl:122 [inlined]
 [44] #solve#46
    @ C:\Users\emman\.julia\packages\DiffEqBase\PbBEl\src\solve.jl:1144 [inlined]
 [45] solve(ode_func::DEsteady, us::ParameterGrid; ensemble_method::EnsembleThreads)
    @ FindSteadyStates C:\Users\emman\.julia\packages\FindSteadyStates\uFRqi\src\solve.jl:46
 [46] solve(ode_func::DEsteady, us::ParameterGrid)
    @ FindSteadyStates C:\Users\emman\.julia\packages\FindSteadyStates\uFRqi\src\solve.jl:34

Welcome to the Julia Discourse!

This error occurs when you are trying to autodiff a function that has not been written in a way that autodiff can use. In this case, the error should be arising from one of the V[i] = ... lines. This happens because V = zeros(9)::Vector{Float64}. ForwardDiff works by replacing real numbers (like Float64) with ForwardDiff.Dual numbers. The assignment of a Dual to a Float64 fails and so you get this error.

In this case, I would suggest you try replacing the array V with V = zeros(eltype(dx), 9)so that the array has an appropriate element type. Even better (in this case), you might replace V with individual variables (i.e., V1 = k[1], V2 = (k[2]*K[1]^n[1])/(K[1]^n[1]+x[3]^n[1]), …) since there’s no need for these to be an array.

4 Likes

Thanks, it works.