Skip to content

Commit 577d20f

Browse files
committed
fix: fix model parsing for events
1 parent b4c55bf commit 577d20f

File tree

3 files changed

+47
-13
lines changed

3 files changed

+47
-13
lines changed

src/systems/callbacks.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ make_affect(affect::Tuple; kwargs...) = FunctionalAffect(affect...)
255255
make_affect(affect::NamedTuple; kwargs...) = FunctionalAffect(; affect...)
256256
make_affect(affect::Affect; kwargs...) = affect
257257

258-
function make_affect(affect::Vector{Equation}; discrete_parameters::AbstractVector = Any[],
258+
function make_affect(affect::Vector{Equation}; discrete_parameters = Any[],
259259
iv = nothing, alg_eqs::Vector{Equation} = Equation[])
260260
isempty(affect) && return nothing
261261
isempty(alg_eqs) &&

src/systems/model_parsing.jl

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,23 @@ function _model_macro(mod, name, expr, isconnector)
127127
isconnector && push!(exprs.args,
128128
:($Setfield.@set!(var"#___sys___".connector_type=$connector_type(var"#___sys___"))))
129129

130-
!isempty(c_evts) && push!(exprs.args,
131-
:($Setfield.@set!(var"#___sys___".continuous_events=$SymbolicContinuousCallback.([
132-
$(c_evts...)
133-
]))))
130+
push!(exprs.args, :(alg_eqs = $(alg_equations)(var"#___sys___")))
131+
d_evt_exs = map(d_evts) do evt
132+
length(evt.args) == 2 ?
133+
:($SymbolicDiscreteCallback($(evt.args[1]); iv = $iv, alg_eqs, $(evt.args[2]...))) :
134+
:($SymbolicDiscreteCallback($(evt.args[1]); iv = $iv, alg_eqs))
135+
end
134136

135137
!isempty(d_evts) && push!(exprs.args,
136-
:($Setfield.@set!(var"#___sys___".discrete_events=$SymbolicDiscreteCallback.([
137-
$(d_evts...)
138-
]))))
138+
:($Setfield.@set!(var"#___sys___".discrete_events=[$(d_evt_exs...)])))
139+
140+
c_evt_exs = map(c_evts) do evt
141+
length(evt.args) == 2 ?
142+
:($SymbolicContinuousCallback($(evt.args[1]); iv = $iv, alg_eqs, $(evt.args[2]...))) :
143+
:($SymbolicContinuousCallback($(evt.args[1]); iv = $iv, alg_eqs))
144+
end
145+
!isempty(c_evts) && push!(exprs.args,
146+
:($Setfield.@set!(var"#___sys___".continuous_events=[$(c_evt_exs...)])))
139147

140148
f = if length(where_types) == 0
141149
:($(Symbol(:__, name, :__))(; name, $(kwargs...)) = $exprs)
@@ -1124,21 +1132,47 @@ end
11241132
function parse_continuous_events!(c_evts, dict, body)
11251133
dict[:continuous_events] = []
11261134
Base.remove_linenums!(body)
1127-
for arg in body.args
1128-
push!(c_evts, arg)
1135+
for line in body.args
1136+
if length(line.args) == 3 && line.args[1] == :(=>)
1137+
push!(c_evts, :(($line,)))
1138+
elseif length(line.args) == 2
1139+
event = line.args[1]
1140+
kwargs = parse_event_kwargs(line.args[2])
1141+
push!(c_evts, :(($event, $kwargs)))
1142+
else
1143+
error("Malformed continuous event $line.")
1144+
end
11291145
push!(dict[:continuous_events], readable_code.(c_evts)...)
11301146
end
11311147
end
11321148

11331149
function parse_discrete_events!(d_evts, dict, body)
11341150
dict[:discrete_events] = []
11351151
Base.remove_linenums!(body)
1136-
for arg in body.args
1137-
push!(d_evts, arg)
1152+
for line in body.args
1153+
if length(line.args) == 3 && line.args[1] == :(=>)
1154+
push!(d_evts, :(($line,)))
1155+
elseif length(line.args) == 2
1156+
event = line.args[1]
1157+
kwargs = parse_event_kwargs(line.args[2])
1158+
push!(d_evts, :(($event, $kwargs)))
1159+
else
1160+
error("Malformed discrete event $line.")
1161+
end
11381162
push!(dict[:discrete_events], readable_code.(d_evts)...)
11391163
end
11401164
end
11411165

1166+
function parse_event_kwargs(disc_expr)
1167+
kwargs = :([])
1168+
for arg in disc_expr.args
1169+
(arg.head != :(=)) && error("Malformed event kwarg $arg.")
1170+
(arg.args[1] isa Symbol) || error("Invalid keyword argument name $(arg.args[1]).")
1171+
push!(kwargs.args, arg)
1172+
end
1173+
kwargs
1174+
end
1175+
11421176
function parse_icon!(body::String, dict, icon, mod)
11431177
icon_dir = get(ENV, "MTK_ICONS_DIR", joinpath(DEPOT_PATH[1], "mtk_icons"))
11441178
dict[:icon] = icon[] = if isfile(body)

test/symbolic_events.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,7 @@ end
12131213
D(x) ~ -k * x
12141214
end
12151215
@discrete_events begin
1216-
(t == 1.0) => [k ~ 1.0]#, discrete_parameters = [k]
1216+
(t == 1.0) => [k ~ 1.0], [discrete_parameters = k]
12171217
end
12181218
end
12191219
@mtkbuild decay = DECAY()

0 commit comments

Comments
 (0)