Skip to content

Commit 3224c33

Browse files
fix: handle unscalarized observed variable defaults in initialization
1 parent 44857dd commit 3224c33

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
6161
isempty(trueobs) || filter_delay_equations_variables!(sys, trueobs)
6262
vars = unique([unknowns(sys); getfield.(trueobs, :lhs)])
6363
vars_set = Set(vars) # for efficient in-lookup
64+
arrvars = Set()
65+
for var in vars
66+
if iscall(var) && operation(var) === getindex
67+
push!(arrvars, first(arguments(var)))
68+
end
69+
end
6470

6571
eqs_ics = Equation[]
6672
defs = copy(defaults(sys)) # copy so we don't modify sys.defaults
@@ -74,6 +80,7 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
7480
if isempty(op)
7581
op = copy(defs)
7682
end
83+
scalarize_vars_in_varmap!(op, arrvars)
7784
u0map = anydict()
7885
pmap = anydict()
7986
build_operating_point!(sys, op, u0map, pmap, Dict(), unknowns(sys),

src/systems/problem_utils.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,24 @@ function scalarize_varmap!(varmap::AbstractDict)
523523
return varmap
524524
end
525525

526+
"""
527+
$(TYPEDSIGNATURES)
528+
529+
For each array variable in `vars`, scalarize the corresponding entry in `varmap`.
530+
If a scalarized entry already exists, it is not overridden.
531+
"""
532+
function scalarize_vars_in_varmap!(varmap::AbstractDict, vars)
533+
for var in vars
534+
symbolic_type(var) == ArraySymbolic() || continue
535+
is_sized_array_symbolic(var) || continue
536+
haskey(varmap, var) || continue
537+
for i in eachindex(var)
538+
haskey(varmap, var[i]) && continue
539+
varmap[var[i]] = varmap[var][i]
540+
end
541+
end
542+
end
543+
526544
function get_temporary_value(p, floatT = Float64)
527545
stype = symtype(unwrap(p))
528546
return if stype == Real

0 commit comments

Comments
 (0)