Skip to content

Commit 98dcd4e

Browse files
committed
Improve detection of writeback values
1 parent 2206425 commit 98dcd4e

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

src/systems/callbacks.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,18 @@ end
999999
return :(begin $(setter_exprs...) end)
10001000
end
10011001

1002+
function check_assignable(sys, sym)
1003+
if symbolic_type(sym) == ScalarSymbolic()
1004+
is_variable(sys, sym) || is_parameter(sys, sym)
1005+
elseif symbolic_type(sym) == ArraySymbolic()
1006+
is_variable(sys, sym) || is_parameter(sys, sym) || all(x -> check_assignable(sys, x), collect(sym))
1007+
elseif sym isa Union{AbstractArray, Tuple}
1008+
all(x -> check_assignable(sys, x), sym)
1009+
else
1010+
false
1011+
end
1012+
end
1013+
10021014
function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps; kwargs...)
10031015
#=
10041016
Implementation sketch:
@@ -1038,7 +1050,7 @@ function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps;
10381050
mod_exprs = modified(affect)
10391051
if !affect.skip_checks
10401052
for mexpr in mod_exprs
1041-
if !is_variable(sys, mexpr) && parameter_index(sys, mexpr) === nothing
1053+
if !check_assignable(sys, mexpr)
10421054
@warn ("Expression $mexpr cannot be assigned to; currently only unknowns and parameters may be updated by an affect.")
10431055
end
10441056
invalid_vars = unassignable_variables(sys, mexpr)

0 commit comments

Comments
 (0)