Skip to content

Commit 9b25993

Browse files
committed
refactor: setdefault value while executing Model.f whenever def is a kwarg
1 parent 057baf9 commit 9b25993

File tree

1 file changed

+30
-62
lines changed

1 file changed

+30
-62
lines changed

src/systems/model_parsing.jl

Lines changed: 30 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -48,70 +48,38 @@ function connector_macro(mod, name, body)
4848
end
4949

5050
function parse_variable_def!(dict, mod, arg, varclass)
51+
arg isa LineNumberNode && return
5152
MLStyle.@match arg begin
52-
::Symbol => generate_var!(dict, arg, varclass)
53-
Expr(:call, a, b) => generate_var!(dict, a, b, varclass)
53+
::Symbol => (generate_var!(dict, arg, varclass), nothing)
54+
Expr(:call, a, b) => (generate_var!(dict, a, b, varclass), nothing)
5455
Expr(:(=), a, b) => begin
55-
var = parse_variable_def!(dict, mod, a, varclass)
56+
var, _ = parse_variable_def!(dict, mod, a, varclass)
5657
def, meta = parse_default(mod, b)
5758
dict[varclass][getname(var)][:default] = def
58-
var = setdefault(var, def)
59+
if typeof(def) != Symbol
60+
var = setdefault(var, def)
61+
def = nothing
62+
end
5963
if !isnothing(meta)
6064
if (ct = get(meta, VariableConnectType, nothing)) !== nothing
6165
dict[varclass][getname(var)][:connection_type] = nameof(ct)
6266
end
6367
var = set_var_metadata(var, meta)
6468
end
65-
var
69+
(var, def)
6670
end
6771
Expr(:tuple, a, b) => begin
68-
var = parse_variable_def!(dict, mod, a, varclass)
72+
var, _ = parse_variable_def!(dict, mod, a, varclass)
6973
meta = parse_metadata(mod, b)
7074
if (ct = get(meta, VariableConnectType, nothing)) !== nothing
7175
dict[varclass][getname(var)][:connection_type] = nameof(ct)
7276
end
73-
set_var_metadata(var, meta)
77+
(set_var_metadata(var, meta), nothing)
7478
end
7579
_ => error("$arg cannot be parsed")
7680
end
7781
end
7882

79-
function parse_variables_with_kw!(exprs, var, dict, mod, body, varexpr, varclass, kwargs)
80-
for arg in body.args
81-
arg isa LineNumberNode && continue
82-
MLStyle.@match arg begin
83-
::Symbol || Expr(:tuple, a, b) || Expr(:call, a, b) || Expr(:(=), a, b::Number) => begin
84-
parse_variables!(exprs, var, dict, mod, arg, varclass)
85-
end
86-
Expr(:(=), a, b::Symbol) => begin
87-
isdefined(mod, b) ?
88-
parse_variables!(exprs, var, dict, mod, arg, varclass) :
89-
push!(varexpr.args[end].args[end].args, arg)
90-
end
91-
Expr(:(=), a, b) => begin
92-
def = Base.remove_linenums!(b)
93-
MLStyle.@match def begin
94-
Expr(:tuple, x::Symbol, y) => begin
95-
isdefined(mod, x) ?
96-
parse_variables!(exprs, var, dict, mod, arg, varclass) :
97-
push!(varexpr.args[end].args[end].args, arg)
98-
end
99-
::Symbol => push!(varexpr.args[end].args[end].args,
100-
:($a = $(def.args[end])))
101-
::Number || Expr(:tuple, x::Number, y) => begin
102-
parse_variables!(exprs, var, dict, mod, arg, varclass)
103-
end
104-
::Expr => push!(varexpr.args[end].args[end].args,
105-
:($a = $(def.args[end])))
106-
_ => error("Got $def")
107-
end
108-
end
109-
_ => error("Could not parse this $varclass definition $arg")
110-
end
111-
end
112-
dict[:kwargs] = kwargs
113-
end
114-
11583
function generate_var(a, varclass)
11684
var = Symbolics.variable(a)
11785
if varclass == :parameters
@@ -155,8 +123,7 @@ function parse_default(mod, a)
155123
meta = parse_metadata(mod, y)
156124
(def, meta)
157125
end
158-
::Symbol => (get_var(mod, a), nothing)
159-
::Number => (a, nothing)
126+
::Symbol || ::Number => (a, nothing)
160127
_ => error("Cannot parse default $a")
161128
end
162129
end
@@ -208,14 +175,12 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
208175
icon = Ref{Union{String, URI}}()
209176
vs = []
210177
ps = []
211-
parexpr = :(pss = @parameters begin end)
212-
varexpr = :(vss = @variables begin end)
213178

214179
for arg in expr.args
215180
arg isa LineNumberNode && continue
216181
if arg.head == :macrocall
217-
parse_model!(exprs.args, comps, ext, eqs, icon, vs, varexpr, ps,
218-
parexpr, dict, mod, arg, kwargs)
182+
parse_model!(exprs.args, comps, ext, eqs, icon, vs, ps,
183+
dict, mod, arg, kwargs)
219184
elseif arg.head == :block
220185
push!(exprs.args, arg)
221186
else
@@ -227,13 +192,10 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
227192
iv = dict[:independent_variable] = variable(:t)
228193
end
229194

230-
push!(exprs.args, varexpr)
231-
push!(exprs.args, parexpr)
232-
233195
gui_metadata = isassigned(icon) > 0 ? GUIMetadata(GlobalRef(mod, name), icon[]) :
234196
nothing
235197

236-
sys = :($ODESystem($Equation[$(eqs...)], $iv, [$(vs...), vss...], [$(ps...), pss...];
198+
sys = :($ODESystem($Equation[$(eqs...)], $iv, [$(vs...)], [$(ps...)];
237199
systems = [$(comps...)], name, gui_metadata = $gui_metadata))
238200
if ext[] === nothing
239201
push!(exprs.args, sys)
@@ -244,7 +206,7 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
244206
:($name = $Model(($(arglist...); name, $(kwargs...)) -> $exprs, $dict))
245207
end
246208

247-
function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, dict,
209+
function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, dict,
248210
mod, arg, kwargs)
249211
mname = arg.args[1]
250212
body = arg.args[end]
@@ -253,9 +215,9 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, di
253215
elseif mname == Symbol("@extend")
254216
parse_extend!(exprs, ext, dict, body)
255217
elseif mname == Symbol("@variables")
256-
parse_variables_with_kw!(exprs, vs, dict, mod, body, varexpr, :variables, kwargs)
218+
parse_variables!(exprs, vs, dict, mod, body, :variables)
257219
elseif mname == Symbol("@parameters")
258-
parse_variables_with_kw!(exprs, ps, dict, mod, body, parexpr, :parameters, kwargs)
220+
parse_variables!(exprs, ps, dict, mod, body, :parameters)
259221
elseif mname == Symbol("@equations")
260222
parse_equations!(exprs, eqs, dict, body)
261223
elseif mname == Symbol("@icon")
@@ -357,15 +319,21 @@ function parse_extend!(exprs, ext, dict, body)
357319
end
358320
end
359321

360-
function parse_variables!(exprs, vs, dict, mod, arg, varclass)
361-
expr = Expr(:block)
362-
push!(exprs, expr)
363-
arg isa LineNumberNode && return
364-
vv = parse_variable_def!(dict, mod, arg, varclass)
322+
function parse_variable_arg!(expr, vs, dict, mod, arg, varclass)
323+
vv, def = parse_variable_def!(dict, mod, arg, varclass)
365324
v = Num(vv)
366325
name = getname(v)
367326
push!(vs, name)
368-
push!(expr.args, :($name = $v))
327+
def === nothing ? push!(expr.args, :($name = $v)) : push!(expr.args, :($name = $setdefault($v, $def)))
328+
end
329+
330+
function parse_variables!(exprs, vs, dict, mod, body, varclass)
331+
expr = Expr(:block)
332+
push!(exprs, expr)
333+
for arg in body.args
334+
arg isa LineNumberNode && continue
335+
parse_variable_arg!(expr, vs, dict, mod, arg, varclass)
336+
end
369337
end
370338

371339
function parse_equations!(exprs, eqs, dict, body)

0 commit comments

Comments
 (0)