Skip to content

Commit efa68af

Browse files
fix: handle edge case with MTK symbolic indexing
1 parent f9c500f commit efa68af

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/parameter_indexing.jl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,15 +507,25 @@ function (atw::AsParameterTupleWrapper)(
507507
atw.getter(buffer, ts, prob, args...)
508508
end
509509

510+
is_observed_getter(_) = false
511+
is_observed_getter(::GetParameterObserved) = true
512+
is_observed_getter(::GetParameterObservedNoTime) = true
513+
is_observed_getter(mpg::MultipleParametersGetter) = any(is_observed_getter, mpg.getters)
514+
510515
for (t1, t2) in [
511516
(ArraySymbolic, Any),
512517
(ScalarSymbolic, Any),
513518
(NotSymbolic, Union{<:Tuple, <:AbstractArray})
514519
]
515520
@eval function _getp(sys, ::NotSymbolic, ::$t1, p::$t2)
516-
num_observed = count(x -> is_observed(sys, x), p)
521+
# We need to do it this way because if an `ODESystem` has `p[1], p[2], p[3]` as
522+
# parameters (all scalarized) then `is_observed(sys, p[2:3]) == true`. Then,
523+
# `getp` errors on older MTK that doesn't support `parameter_observed`.
524+
getters = getp.((sys,), p)
525+
num_observed = count(is_observed_getter, getters)
526+
517527
if num_observed == 0
518-
return MultipleParametersGetter(getp.((sys,), p))
528+
return MultipleParametersGetter(getters)
519529
else
520530
pofn = parameter_observed(sys, p isa Tuple ? collect(p) : p)
521531
if is_time_dependent(sys)

0 commit comments

Comments
 (0)