Skip to content

Commit c75ca6d

Browse files
fix: bug fixes in initialization of MTKParameters
1 parent d114048 commit c75ca6d

File tree

2 files changed

+34
-29
lines changed

2 files changed

+34
-29
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -876,31 +876,34 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
876876
parammap = Dict(unwrap.(parameters(sys)) .=> parammap)
877877
end
878878
end
879-
clockedparammap = Dict()
880-
defs = ModelingToolkit.get_defaults(sys)
881-
for v in ps
882-
v = unwrap(v)
883-
is_discrete_domain(v) || continue
884-
op = operation(v)
885-
if !isa(op, Symbolics.Operator) && parammap != SciMLBase.NullParameters() &&
886-
haskey(parammap, v)
887-
error("Initial conditions for discrete variables must be for the past state of the unknown. Instead of providing the condition for $v, provide the condition for $(Shift(iv, -1)(v)).")
879+
880+
if has_discrete_subsystems(sys) && get_discrete_subsystems(sys) !== nothing
881+
clockedparammap = Dict()
882+
defs = ModelingToolkit.get_defaults(sys)
883+
for v in ps
884+
v = unwrap(v)
885+
is_discrete_domain(v) || continue
886+
op = operation(v)
887+
if !isa(op, Symbolics.Operator) && parammap != SciMLBase.NullParameters() &&
888+
haskey(parammap, v)
889+
error("Initial conditions for discrete variables must be for the past state of the unknown. Instead of providing the condition for $v, provide the condition for $(Shift(iv, -1)(v)).")
890+
end
891+
shiftedv = StructuralTransformations.simplify_shifts(Shift(iv, -1)(v))
892+
if parammap != SciMLBase.NullParameters() &&
893+
(val = get(parammap, shiftedv, nothing)) !== nothing
894+
clockedparammap[v] = val
895+
elseif op isa Shift
896+
root = arguments(v)[1]
897+
haskey(defs, root) || error("Initial condition for $v not provided.")
898+
clockedparammap[v] = defs[root]
899+
end
888900
end
889-
shiftedv = StructuralTransformations.simplify_shifts(Shift(iv, -1)(v))
890-
if parammap != SciMLBase.NullParameters() &&
891-
(val = get(parammap, shiftedv, nothing)) !== nothing
892-
clockedparammap[v] = val
893-
elseif op isa Shift
894-
root = arguments(v)[1]
895-
haskey(defs, root) || error("Initial condition for $v not provided.")
896-
clockedparammap[v] = defs[root]
901+
parammap = if parammap == SciMLBase.NullParameters()
902+
clockedparammap
903+
else
904+
merge(parammap, clockedparammap)
897905
end
898906
end
899-
parammap = if parammap == SciMLBase.NullParameters()
900-
clockedparammap
901-
else
902-
merge(parammap, clockedparammap)
903-
end
904907
# TODO: make it work with clocks
905908
# ModelingToolkit.get_tearing_state(sys) !== nothing => Requires structural_simplify first
906909
if sys isa ODESystem && build_initializeprob &&
@@ -931,7 +934,12 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
931934
if has_index_cache(sys) && get_index_cache(sys) !== nothing
932935
u0, defs = get_u0(sys, trueinit, parammap; symbolic_u0)
933936
check_eqs_u0(eqs, dvs, u0; kwargs...)
934-
p = MTKParameters(sys, parammap, trueinit)
937+
p = if parammap === nothing ||
938+
parammap == SciMLBase.NullParameters() && isempty(defs)
939+
nothing
940+
else
941+
MTKParameters(sys, parammap, trueinit)
942+
end
935943
else
936944
u0, p, defs = get_u0_p(sys,
937945
trueinit,
@@ -1592,7 +1600,6 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
15921600
if !iscomplete(sys)
15931601
error("A completed system is required. Call `complete` or `structural_simplify` on the system before creating an `ODEProblem`")
15941602
end
1595-
15961603
if isempty(u0map) && get_initializesystem(sys) !== nothing
15971604
isys = get_initializesystem(sys)
15981605
elseif isempty(u0map) && get_initializesystem(sys) === nothing
@@ -1620,9 +1627,9 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
16201627
@warn "Initialization system is underdetermined. $neqs equations for $nunknown unknowns. Initialization will default to using least squares. To suppress this warning pass warn_initialize_determined = false."
16211628
end
16221629

1623-
parammap isa DiffEqBase.NullParameters || isempty(parammap) ?
1624-
[get_iv(sys) => t] :
1625-
merge(todict(parammap), Dict(get_iv(sys) => t))
1630+
parammap = parammap isa DiffEqBase.NullParameters || isempty(parammap) ?
1631+
[get_iv(sys) => t] :
1632+
merge(todict(parammap), Dict(get_iv(sys) => t))
16261633

16271634
if neqs == nunknown
16281635
NonlinearProblem(isys, guesses, parammap)

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,6 @@ function generate_function(
241241
pre, sol_states = get_substitutions_and_solved_unknowns(sys)
242242

243243
p = reorder_parameters(sys, value.(ps))
244-
@show p ps
245244
return build_function(rhss, value.(dvs), p...; postprocess_fbody = pre,
246245
states = sol_states, kwargs...)
247246
end
@@ -395,7 +394,6 @@ function process_NonlinearProblem(constructor, sys::NonlinearSystem, u0map, para
395394
eqs = equations(sys)
396395
dvs = unknowns(sys)
397396
ps = full_parameters(sys)
398-
399397
if has_index_cache(sys) && get_index_cache(sys) !== nothing
400398
u0, defs = get_u0(sys, u0map, parammap)
401399
check_eqs_u0(eqs, dvs, u0; kwargs...)

0 commit comments

Comments
 (0)