Skip to content

Commit 3eca9b9

Browse files
committed
Fix bugs relating to array arguments to callbacks
1 parent 4f928ae commit 3eca9b9

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/systems/callbacks.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -958,9 +958,10 @@ function invalid_variables(sys, expr)
958958
filter(x -> !any(isequal(x), all_symbols(sys)), reduce(vcat, vars(expr); init = []))
959959
end
960960
function unassignable_variables(sys, expr)
961-
assignable_syms = vcat(unknowns(sys), parameters(sys))
961+
assignable_syms = reduce(vcat, Symbolics.scalarize.(vcat(unknowns(sys), parameters(sys))); init=[])
962+
written = reduce(vcat, Symbolics.scalarize.(vars(expr)); init = [])
962963
return filter(
963-
x -> !any(isequal(x), assignable_syms), reduce(vcat, vars(expr); init = []))
964+
x -> !any(isequal(x), assignable_syms), written)
964965
end
965966

966967
function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps; kwargs...)
@@ -1000,7 +1001,10 @@ function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps;
10001001

10011002
mod_exprs = modified(affect)
10021003
for mexpr in mod_exprs
1003-
if !is_observed(sys, mexpr) && parameter_index(sys, mexpr) === nothing && !affect.skip_checks
1004+
if affect.skip_checks
1005+
continue
1006+
end
1007+
if !is_variable(sys, mexpr) && parameter_index(sys, mexpr) === nothing && !affect.skip_checks
10041008
@warn ("Expression $mexpr cannot be assigned to; currently only unknowns and parameters may be updated by an affect.")
10051009
end
10061010
invalid_vars = unassignable_variables(sys, mexpr)
@@ -1036,7 +1040,7 @@ function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps;
10361040
mod_param_pairs = filter(v -> is_parameter(sys, v[1]), mod_pairs)
10371041
mod_unk_pairs = filter(v -> !is_parameter(sys, v[1]), mod_pairs)
10381042
_, mod_og_val_fun = build_explicit_observed_function(
1039-
sys, reduce(vcat, [first.(mod_param_pairs); first.(mod_unk_pairs)]; init = []);
1043+
sys, reduce(vcat, Symbolics.scalarize.([first.(mod_param_pairs); first.(mod_unk_pairs)]); init = []);
10401044
return_inplace = true)
10411045
upd_params_fun = setu(
10421046
sys, reduce(vcat, Symbolics.scalarize.(first.(mod_param_pairs)); init = []))

0 commit comments

Comments
 (0)