Skip to content

Commit e100f79

Browse files
committed
feat: update metadata dict and kwargs for symbolic arrays
1 parent 9b51671 commit e100f79

File tree

1 file changed

+77
-39
lines changed

1 file changed

+77
-39
lines changed

src/systems/model_parsing.jl

Lines changed: 77 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -239,20 +239,6 @@ end
239239
function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
240240
def = nothing, indices::Union{Vector{UnitRange{Int}}, Nothing} = nothing,
241241
type::Type = Real, meta = Dict{DataType, Expr}())
242-
metatypes = [(:connection_type, VariableConnectType),
243-
(:description, VariableDescription),
244-
(:unit, VariableUnit),
245-
(:bounds, VariableBounds),
246-
(:noise, VariableNoiseType),
247-
(:input, VariableInput),
248-
(:output, VariableOutput),
249-
(:irreducible, VariableIrreducible),
250-
(:state_priority, VariableStatePriority),
251-
(:misc, VariableMisc),
252-
(:disturbance, VariableDisturbance),
253-
(:tunable, VariableTunable),
254-
(:dist, VariableDistribution)]
255-
256242
arg isa LineNumberNode && return
257243
MLStyle.@match arg begin
258244
a::Symbol => begin
@@ -278,27 +264,86 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
278264
varclass, where_types, meta)
279265
return var, def, Dict()
280266
end
267+
Expr(:tuple, Expr(:(::), Expr(:ref, a, indices...), type), meta_val) ||
268+
Expr(:tuple, Expr(:ref, a, indices...), meta_val) => begin
269+
(@isdefined type) || (type = Real)
270+
varname = Meta.isexpr(a, :call) ? a.args[1] : a
271+
push!(kwargs, Expr(:kw, varname, nothing))
272+
meta = parse_metadata(mod, meta_val)
273+
varval = (@isdefined default_val) ? default_val :
274+
unit_handled_variable_value(meta, varname)
275+
if varclass == :parameters
276+
var = :($varname = $first(@parameters ($a[$(indices...)]::$type = $varval),
277+
$meta_val))
278+
else
279+
var = :($varname = $first(@variables ($a[$(indices)]::$type = $varval),
280+
$meta_val))
281+
end
282+
push_array_kwargs_and_metadata!(
283+
dict, indices, meta, type, varclass, varname, varval)
284+
(:($varname...), var), nothing, Dict()
285+
end
286+
Expr(:(=), Expr(:(::), Expr(:ref, a, indices...), type), def_n_meta) ||
287+
Expr(:(=), Expr(:ref, a, indices...), def_n_meta) => begin
288+
(@isdefined type) || (type = Real)
289+
varname = Meta.isexpr(a, :call) ? a.args[1] : a
290+
if Meta.isexpr(def_n_meta, :tuple)
291+
meta = parse_metadata(mod, def_n_meta)
292+
varval = unit_handled_variable_value(meta, varname)
293+
val, def_n_meta = (def_n_meta.args[1], def_n_meta.args[2:end])
294+
push!(kwargs, Expr(:kw, varname, nothing))
295+
if varclass == :parameters
296+
var = :($varname = $varname === nothing ? $val : $varname;
297+
$varname = $first(@parameters ($a[$(indices...)]::$type = $varval),
298+
$(def_n_meta...)))
299+
else
300+
var = :($varname = $varname === nothing ? $val : $varname;
301+
$varname = $first(@variables $a[$(indices...)]::$type = (
302+
$varval),
303+
$(def_n_meta...)))
304+
end
305+
else
306+
push!(kwargs, Expr(:kw, varname, nothing))
307+
if varclass == :parameters
308+
var = :($varname = $varname === nothing ? $def_n_meta : $varname;
309+
$varname = $first(@parameters $a[$(indices...)]::$type = $varname))
310+
else
311+
var = :($varname = $varname === nothing ? $def_n_meta : $varname;
312+
$varname = $first(@variables $a[$(indices...)]::$type = $varname))
313+
end
314+
varval, meta = def_n_meta, nothing
315+
end
316+
push_array_kwargs_and_metadata!(
317+
dict, indices, meta, type, varclass, varname, varval)
318+
(:($varname...), var), nothing, Dict()
319+
end
320+
Expr(:(::), Expr(:ref, a, indices...), type) ||
321+
Expr(:ref, a, indices...) => begin
322+
(@isdefined type) || (type = Real)
323+
varname = a isa Expr && a.head == :call ? a.args[1] : a
324+
push!(kwargs, Expr(:kw, varname, nothing))
325+
if varclass == :parameters
326+
var = :($varname = $first(@parameters $a[$(indices...)]::$type = $varname))
327+
elseif varclass == :variables
328+
var = :($varname = $first(@variables $a[$(indices...)]::$type = $varname))
329+
else
330+
throw("Symbolic array with arbitrary length is not handled for $varclass.
331+
Please open an issue with an example.")
332+
end
333+
push_array_kwargs_and_metadata!(
334+
dict, indices, nothing, type, varclass, varname, nothing)
335+
(:($varname...), var), nothing, Dict()
336+
end
281337
Expr(:(=), a, b) => begin
282338
Base.remove_linenums!(b)
283339
def, meta = parse_default(mod, b)
284340
var, def, _ = parse_variable_def!(
285341
dict, mod, a, varclass, kwargs, where_types; def, type, meta)
286-
if dict[varclass] isa Vector
287-
dict[varclass][1][getname(var)][:default] = def
288-
else
289-
dict[varclass][getname(var)][:default] = def
290-
end
342+
varclass_dict = dict[varclass] isa Vector ? Ref(dict[varclass][1]) :
343+
Ref(dict[varclass])
344+
varclass_dict[][getname(var)][:default] = def
291345
if meta !== nothing
292-
for (type, key) in metatypes
293-
if (mt = get(meta, key, nothing)) !== nothing
294-
key == VariableConnectType && (mt = nameof(mt))
295-
if dict[varclass] isa Vector
296-
dict[varclass][1][getname(var)][type] = mt
297-
else
298-
dict[varclass][getname(var)][type] = mt
299-
end
300-
end
301-
end
346+
update_readable_metadata!(varclass_dict[], meta, getname(var))
302347
var, metadata_with_exprs = set_var_metadata(var, meta)
303348
return var, def, metadata_with_exprs
304349
end
@@ -308,17 +353,10 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
308353
meta = parse_metadata(mod, b)
309354
var, def, _ = parse_variable_def!(
310355
dict, mod, a, varclass, kwargs, where_types; type, meta)
356+
varclass_dict = dict[varclass] isa Vector ? Ref(dict[varclass][1]) :
357+
Ref(dict[varclass])
311358
if meta !== nothing
312-
for (type, key) in metatypes
313-
if (mt = get(meta, key, nothing)) !== nothing
314-
key == VariableConnectType && (mt = nameof(mt))
315-
if dict[varclass] isa Vector
316-
dict[varclass][1][getname(var)][type] = mt
317-
else
318-
dict[varclass][getname(var)][type] = mt
319-
end
320-
end
321-
end
359+
update_readable_metadata!(varclass_dict[], meta, getname(var))
322360
var, metadata_with_exprs = set_var_metadata(var, meta)
323361
return var, def, metadata_with_exprs
324362
end

0 commit comments

Comments
 (0)