Skip to content

Modia with Measurements gives promote_rule ambiguity #821

@MartinOtter

Description

@MartinOtter

Running Modia with Julia 1.8.0 gives an error, if Measurement is used as floating point type (error: promote_rule is ambiguous). The reason is most likely that a new version of DiffEqBase.jl (6.100.1) is used where newly introduced promote rules introduce this ambiguity (this error does not appear with DiffEqBase version 6.95.2). This issue can be reproduced with:

using Modia
include("$(Modia.path)/test/TestPendulum.jl")

resulting in the following output

[...]
Instantiating model PendulumWithUncertainties
  in module: Main.TestPendulum
  in file: home\.julia\dev\Modia\test\TestPendulum.jl:35
ERROR: LoadError: MethodError: promote_rule(::Type{Measurements.Measurement{Float64}}, ::Type{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Measurements.Measurement{Float64}}, Measurements.Measurement{Float64}, 1}}) is ambiguous. Candidates:
  promote_rule(::Type{R}, ::Type{ForwardDiff.Dual{T, V, N}}) where {R<:Real, T, V, N} in ForwardDiff at home\.julia\packages\ForwardDiff\pDtsf\src\dual.jl:425
  promote_rule(::Type{Measurements.Measurement{T}}, ::Type{S}) where {T<:AbstractFloat, S<:Real} in Measurements at home\.julia\packages\Measurements\PwGjt\src\conversions.jl:58
Possible fix, define
  promote_rule(::Type{Measurements.Measurement{T}}, ::Type{ForwardDiff.Dual{T, V, N}}) where {T<:AbstractFloat, T, V, N}
Stacktrace:
  [1] promote_type(#unused#::Type{Measurements.Measurement{Float64}}, #unused#::Type{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Measurements.Measurement{Float64}}, Measurements.Measurement{Float64}, 1}})
    @ Base .\promotion.jl:298
  [2] promote_eltype(#unused#::Type{Vector{Measurements.Measurement{Float64}}}, #unused#::Type{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Measurements.Measurement{Float64}}, Measurements.Measurement{Float64}, 1}})
    @ ArrayInterfaceCore home\.julia\packages\ArrayInterfaceCore\j22dF\src\ArrayInterfaceCore.jl:143
  [3] wrapfun_iip(ff::Any, inputs::Tuple{Vector{Measurements.Measurement{Float64}}, Vector{Measurements.Measurement{Float64}}, SimulationModel{Measurements.Measurement{Float64}, Float64}, Float64})
    @ DiffEqBase home\.julia\packages\DiffEqBase\iK5G7\src\norecompile.jl:58
  [4] promote_f(f::ODEFunction{true, SciMLBase.AutoSpecialize, typeof(Modia.derivatives!), LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing}, #unused#::Val{SciMLBase.AutoSpecialize}, u0::Vector{Measurements.Measurement{Float64}}, p::SimulationModel{Measurements.Measurement{Float64}, Float64}, t::Float64)
    @ DiffEqBase home\.julia\packages\DiffEqBase\iK5G7\src\solve.jl:974
  [5] get_concrete_problem(prob::ODEProblem{Vector{Measurements.Measurement{Float64}}, Tuple{Float64, Float64}, true, SimulationModel{Measurements.Measurement{Float64}, Float64}, ODEFunction{true, SciMLBase.AutoSpecialize, typeof(Modia.derivatives!), LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, isadapt::Bool; kwargs::Base.Pairs{Symbol, Any, NTuple{13, Symbol}, NamedTuple{(:u0, :p, :reltol, :abstol, :save_everystep, :callback, :adaptive, :saveat, :dt, :dtmax, :maxiters, :tstops, :initializealg), Tuple{Vector{Measurements.Measurement{Float64}}, SimulationModel{Measurements.Measurement{Float64}, Float64}, Float64, Float64, Bool, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#27#28", DiffEqCallbacks.FunctionCallingAffect{typeof(Modia.outputs!), DataStructures.BinaryMinHeap{Float64}, Vector{Float64}}, typeof(DiffEqCallbacks.functioncalling_initialize), typeof(SciMLBase.FINALIZE_DEFAULT)}, DiscreteCallback{typeof(Modia.timeEventCondition!), typeof(Modia.affectTimeEvent!), typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(SciMLBase.FINALIZE_DEFAULT)}}}, Bool, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Float64, Float64, Int64, Tuple{Float64}, NoInit}}})
    @ DiffEqBase home\.julia\packages\DiffEqBase\iK5G7\src\solve.jl:907
  [6] solve_up(prob::ODEProblem{Vector{Measurements.Measurement{Float64}}, Tuple{Float64, Float64}, true, SimulationModel{Measurements.Measurement{Float64}, Float64}, ODEFunction{true, SciMLBase.AutoSpecialize, typeof(Modia.derivatives!), LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, sensealg::Nothing, u0::Vector{Measurements.Measurement{Float64}}, p::SimulationModel{Measurements.Measurement{Float64}, Float64}, args::Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}; kwargs::Base.Pairs{Symbol, Any, NTuple{11, Symbol}, NamedTuple{(:reltol, :abstol, :save_everystep, :callback, :adaptive, :saveat, :dt, :dtmax, :maxiters, :tstops, :initializealg), Tuple{Float64, Float64, Bool, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#27#28", DiffEqCallbacks.FunctionCallingAffect{typeof(Modia.outputs!), DataStructures.BinaryMinHeap{Float64}, Vector{Float64}}, typeof(DiffEqCallbacks.functioncalling_initialize), typeof(SciMLBase.FINALIZE_DEFAULT)}, DiscreteCallback{typeof(Modia.timeEventCondition!), typeof(Modia.affectTimeEvent!), typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(SciMLBase.FINALIZE_DEFAULT)}}}, Bool, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Float64, Float64, Int64, Tuple{Float64}, NoInit}}})
    @ DiffEqBase home\.julia\packages\DiffEqBase\iK5G7\src\solve.jl:822
  [7] solve(prob::ODEProblem{Vector{Measurements.Measurement{Float64}}, Tuple{Float64, Float64}, true, SimulationModel{Measurements.Measurement{Float64}, Float64}, ODEFunction{true, SciMLBase.AutoSpecialize, typeof(Modia.derivatives!), LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, args::Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}; sensealg::Nothing, u0::Nothing, p::Nothing, kwargs::Base.Pairs{Symbol, Any, NTuple{11, Symbol}, NamedTuple{(:reltol, :abstol, :save_everystep, :callback, :adaptive, :saveat, :dt, :dtmax, :maxiters, :tstops, :initializealg), Tuple{Float64, Float64, Bool, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#27#28", DiffEqCallbacks.FunctionCallingAffect{typeof(Modia.outputs!), DataStructures.BinaryMinHeap{Float64}, Vector{Float64}}, typeof(DiffEqCallbacks.functioncalling_initialize), typeof(SciMLBase.FINALIZE_DEFAULT)}, DiscreteCallback{typeof(Modia.timeEventCondition!), typeof(Modia.affectTimeEvent!), typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(SciMLBase.FINALIZE_DEFAULT)}}}, Bool, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Float64, Float64, Int64, Tuple{Float64}, NoInit}}})
    @ DiffEqBase home\.julia\packages\DiffEqBase\iK5G7\src\solve.jl:795
  [8] macro expansion
    @ home\.julia\packages\TimerOutputs\4yHI4\src\TimerOutput.jl:237 [inlined]
  [9] simulateSegment!(m::SimulationModel{Measurements.Measurement{Float64}, Float64}, algorithm::Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}; kwargs::Base.Pairs{Symbol, Quantity{Float64, 𝐓, Unitful.FreeUnits{(s,), 𝐓, nothing}}, Tuple{Symbol}, NamedTuple{(:st  opTime,), Tuple{Quantity{Float64, 𝐓, Unitful.FreeUnits
{(s,), 𝐓, nothing}}}}} )
    @ Modia home\.julia\dev\Modia\src\SimulateAndPlot.jl:549
 [10] macro expansion
    @ home\.julia\dev\Modia\src\SimulateAndPlot.jl:235 [inlined]
 [11] macro expansion
    @ home\.julia\packages\TimerOutputs\4yHI4\src\TimerOutput.jl:237 [inlined]
 [12] simulate!(m::SimulationModel{Measurements.Measurement{Float64}, Float64}, algorithm::Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}; merge::Nothing, kwargs::Base.Pairs{Symbol, Quantity{Float64, 𝐓, Unitful.FreeUnits{(s,), 𝐓, nothing}}, Tuple{Symbol}, NamedTuple{(:st  opTime,), Tuple{Quantity{Float64, 𝐓, Unitful.
FreeUnits{(s,), 𝐓, nothing}}}}} )
    @ Modia home\.julia\dev\Modia\src\SimulateAndPlot.jl:234
 [13] top-level scope
    @ home\.julia\dev\Modia\test\TestPendulum.jl:38
 [14] include(fname::String)
    @ Base.MainInclude .\client.jl:476
 [15] top-level scope
    @ REPL[11]:1
in expression starting at home\.julia\dev\Modia\test\TestPendulum.jl:1

The advice given in the error message

Possible fix, define
  promote_rule(::Type{Measurements.Measurement{T}}, ::Type{ForwardDiff.Dual{T, V, N}}) where {T<:AbstractFloat, T, V, N}

does not fix this issue.

Help is appreciated.

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