-
-
Notifications
You must be signed in to change notification settings - Fork 120
Closed
Description
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
Labels
No labels