Skip to content

Commit f16f92b

Browse files
Recurse on concrete initialization parameters
Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
1 parent de2ae29 commit f16f92b

2 files changed

Lines changed: 29 additions & 2 deletions

File tree

lib/ModelingToolkitBase/src/systems/nonlinear/initializesystem.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,8 +877,15 @@ function DiffEqBase.get_updated_symbolic_problem(
877877
t0 = is_time_dependent(prob) ? current_time(prob) : nothing
878878

879879
unwrapped_p = _unwrap_mtk_parameters(p)
880-
if unwrapped_p isa MTKParameters
881-
buffer = unwrapped_p.initials
880+
if unwrapped_p !== p
881+
updated_prob = DiffEqBase.get_updated_symbolic_problem(
882+
sys, prob; u0, p = unwrapped_p, kw...
883+
)
884+
return @set updated_prob.p = p
885+
end
886+
887+
if p isa MTKParameters
888+
buffer = p.initials
882889
else
883890
buffer = p
884891
end

lib/ModelingToolkitBase/test/despecialized_parameters.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
using ModelingToolkitBase
22
using ModelingToolkitBase: t_nounits as t, D_nounits as D, MTKParameters
33
using DiffEqBase
4+
using ForwardDiff
45
using OrdinaryDiffEq
56
using Random
7+
using SciMLBase
68
using SciMLStructures
79
using SymbolicIndexingInterface
810
using Test
911

12+
struct _OpaqueParameterWrapper end
13+
const _opaque_parameters = Ref{Any}()
14+
SciMLBase.unwrap_parameters(::_OpaqueParameterWrapper) = _opaque_parameters[]
15+
1016
@testset "AutoDespecialize parameters" begin
1117
@parameters a = 2.0
1218
@variables x(t) = 1.0 z(t)
@@ -63,6 +69,20 @@ using Test
6369
@test SciMLStructures.isscimlstructure(concrete_prob.p)
6470
@test SciMLStructures.ismutablescimlstructure(concrete_prob.p)
6571

72+
dual_initials = map(
73+
value -> ForwardDiff.Dual{Nothing}(value, one(value)), concrete_parameters.initials
74+
)
75+
dual_parameters = SciMLStructures.replace(
76+
SciMLStructures.Initials(), concrete_parameters, dual_initials
77+
)
78+
_opaque_parameters[] = SciMLBase.DespecializedParameters(dual_parameters)
79+
opaque_parameters = _OpaqueParameterWrapper()
80+
updated_prob = DiffEqBase.get_updated_symbolic_problem(
81+
sys, concrete_prob; u0 = concrete_prob.u0, p = opaque_parameters
82+
)
83+
@test eltype(updated_prob.u0) <: ForwardDiff.Dual
84+
@test updated_prob.p === opaque_parameters
85+
6686
seen_parameter_type = Ref{DataType}()
6787
gfw = ModelingToolkitBase.GeneratedFunctionWrapper{Tuple{2, 3, false}}(
6888
(u, p, t) -> (seen_parameter_type[] = typeof(p); u),

0 commit comments

Comments
 (0)