@@ -180,16 +180,6 @@ function update_kwargs_and_metadata!(dict, kwargs, a, def, indices, type, var,
180180 end
181181end
182182
183- function unit_handled_variable_value (mod, y, varname)
184- meta = parse_metadata (mod, y)
185- varval = if meta isa Nothing || get (meta, VariableUnit, nothing ) isa Nothing
186- varname
187- else
188- :($ convert_units ($ (meta[VariableUnit]), $ varname))
189- end
190- return varval
191- end
192-
193183function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
194184 def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
195185 type:: Type = Real, meta = Dict {DataType, Expr} ())
@@ -232,66 +222,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
232222 varclass, where_types, meta)
233223 return var, def, Dict ()
234224 end
235- Expr (:tuple , Expr (:(:: ), Expr (:ref , a, b... ), type), y) || Expr (:tuple , Expr (:ref , a, b... ), y) => begin
236- (@isdefined type) || (type = Real)
237- varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
238- push! (kwargs, Expr (:kw , varname, nothing ))
239- varval = unit_handled_variable_value (mod, y, varname)
240- if varclass == :parameters
241- var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $type = ($ varval, $ y)))
242- else
243- var = :($ varname = $ first (@variables $ a[$ (b... )]:: $type = ($ varval, $ y)))
244- end
245- # TODO : update `dict` aka `Model.structure` with the metadata
246- (:($ varname... ), var), nothing , Dict ()
247- end
248- Expr (:(= ), Expr (:(:: ), Expr (:ref , a, b... ), type), y) || Expr (:(= ), Expr (:ref , a, b... ), y) => begin
249- (@isdefined type) || (type = Real)
250- varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
251- if Meta. isexpr (y, :tuple )
252- varval = unit_handled_variable_value (mod, y, varname)
253- val, y = (y. args[1 ], y. args[2 : end ])
254- push! (kwargs, Expr (:kw , varname, nothing ))
255- if varclass == :parameters
256- var = :($ varname = $ varname === nothing ? $ val : $ varname;
257- $ varname = $ first (@parameters $ a[$ (b... )]:: $type = (
258- $ varval, $ (y... ))))
259- else
260- var = :($ varname = $ varname === nothing ? $ val : $ varname;
261- $ varname = $ first (@variables $ a[$ (b... )]:: $type = (
262- $ varval, $ (y... ))))
263- end
264- else
265- push! (kwargs, Expr (:kw , varname, nothing ))
266- if varclass == :parameters
267- var = :($ varname = $ varname === nothing ? $ y : $ varname;
268- $ varname = $ first (@parameters $ a[$ (b... )]:: $type = $ varname))
269- else
270- var = :($ varname = $ varname === nothing ? $ y : $ varname;
271- $ varname = $ first (@variables $ a[$ (b... )]:: $type = $ varname))
272- end
273- end
274- # TODO : update `dict`` aka `Model.structure` with the metadata
275- (:($ varname... ), var), nothing , Dict ()
276- end
277- Expr (:(:: ), Expr (:ref , a, b... ), type) || Expr (:ref , a, b... ) => begin
278- (@isdefined type) || (type = Real)
279- varname = a isa Expr && a. head == :call ? a. args[1 ] : a
280- push! (kwargs, Expr (:kw , varname, nothing ))
281- if varclass == :parameters
282- var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $type = $ varname))
283- elseif varclass == :variables
284- var = :($ varname = $ first (@variables $ a[$ (b... )]:: $type = $ varname))
285- else
286- throw (" Symbolic array with arbitrary length is not handled for $varclass .
287- Please open an issue with an example." )
288- end
289- dict[varclass] = get! (dict, varclass) do
290- Dict {Symbol, Dict{Symbol, Any}} ()
291- end
292- # dict[:kwargs][varname] = dict[varclass][varname] = Dict(:size => b)
293- (:($ varname... ), var), nothing , Dict ()
294- end
295225 Expr (:(= ), a, b) => begin
296226 Base. remove_linenums! (b)
297227 def, meta = parse_default (mod, b)
@@ -338,6 +268,11 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
338268 end
339269 return var, def, Dict ()
340270 end
271+ Expr (:ref , a, b... ) => begin
272+ indices = map (i -> UnitRange (i. args[2 ], i. args[end ]), b)
273+ parse_variable_def! (dict, mod, a, varclass, kwargs, where_types;
274+ def, indices, type, meta)
275+ end
341276 _ => error (" $arg cannot be parsed" )
342277 end
343278end
@@ -445,23 +380,14 @@ function parse_default(mod, a)
445380 end
446381end
447382
448- function parse_metadata (mod, a:: Expr )
383+ function parse_metadata (mod, a)
449384 MLStyle. @match a begin
450- Expr (:vect , b... ) => Dict (parse_metadata (mod, m) for m in b)
451- Expr (:tuple , a, b... ) => parse_metadata (mod, b)
385+ Expr (:vect , eles... ) => Dict (parse_metadata (mod, e) for e in eles)
452386 Expr (:(= ), a, b) => Symbolics. option_to_metadata_type (Val (a)) => get_var (mod, b)
453387 _ => error (" Cannot parse metadata $a " )
454388 end
455389end
456390
457- function parse_metadata (mod, metadata:: AbstractArray )
458- ret = Dict ()
459- for m in metadata
460- merge! (ret, parse_metadata (mod, m))
461- end
462- ret
463- end
464-
465391function _set_var_metadata! (metadata_with_exprs, a, m, v:: Expr )
466392 push! (metadata_with_exprs, m => v)
467393 a
@@ -719,7 +645,6 @@ function parse_variable_arg!(exprs, vs, dict, mod, arg, varclass, kwargs, where_
719645end
720646
721647function convert_units (varunits:: DynamicQuantities.Quantity , value)
722- value isa Nothing && return nothing
723648 DynamicQuantities. ustrip (DynamicQuantities. uconvert (
724649 DynamicQuantities. SymbolicUnits. as_quantity (varunits), value))
725650end
@@ -731,7 +656,6 @@ function convert_units(
731656end
732657
733658function convert_units (varunits:: Unitful.FreeUnits , value)
734- value isa Nothing && return nothing
735659 Unitful. ustrip (varunits, value)
736660end
737661
@@ -750,50 +674,47 @@ end
750674function parse_variable_arg (dict, mod, arg, varclass, kwargs, where_types)
751675 vv, def, metadata_with_exprs = parse_variable_def! (
752676 dict, mod, arg, varclass, kwargs, where_types)
753- if ! (vv isa Tuple)
754- name = getname (vv)
755- varexpr = if haskey (metadata_with_exprs, VariableUnit)
756- unit = metadata_with_exprs[VariableUnit]
757- quote
758- $ name = if $ name === nothing
759- $ setdefault ($ vv, $ def)
760- else
761- try
762- $ setdefault ($ vv, $ convert_units ($ unit, $ name))
763- catch e
764- if isa (e, $ (DynamicQuantities. DimensionError)) ||
765- isa (e, $ (Unitful. DimensionError))
766- error (" Unable to convert units for \' " * string (:($$ vv)) * " \' " )
767- elseif isa (e, MethodError)
768- error (" No or invalid units provided for \' " * string (:($$ vv)) *
769- " \' " )
770- else
771- rethrow (e)
772- end
677+ name = getname (vv)
678+
679+ varexpr = if haskey (metadata_with_exprs, VariableUnit)
680+ unit = metadata_with_exprs[VariableUnit]
681+ quote
682+ $ name = if $ name === nothing
683+ $ setdefault ($ vv, $ def)
684+ else
685+ try
686+ $ setdefault ($ vv, $ convert_units ($ unit, $ name))
687+ catch e
688+ if isa (e, $ (DynamicQuantities. DimensionError)) ||
689+ isa (e, $ (Unitful. DimensionError))
690+ error (" Unable to convert units for \' " * string (:($$ vv)) * " \' " )
691+ elseif isa (e, MethodError)
692+ error (" No or invalid units provided for \' " * string (:($$ vv)) *
693+ " \' " )
694+ else
695+ rethrow (e)
773696 end
774697 end
775698 end
776- else
777- quote
778- $ name = if $ name === nothing
779- $ setdefault ($ vv, $ def)
780- else
781- $ setdefault ($ vv, $ name)
782- end
783- end
784699 end
785-
786- metadata_expr = Expr (:block )
787- for (k, v) in metadata_with_exprs
788- push! (metadata_expr. args,
789- :($ name = $ wrap ($ set_scalar_metadata ($ unwrap ($ name), $ k, $ v))))
700+ else
701+ quote
702+ $ name = if $ name === nothing
703+ $ setdefault ($ vv, $ def)
704+ else
705+ $ setdefault ($ vv, $ name)
706+ end
790707 end
708+ end
791709
792- push! (varexpr . args, metadata_expr )
793- return vv isa Num ? name : :( $ name ... ), varexpr
794- else
795- return vv
710+ metadata_expr = Expr ( :block )
711+ for (k, v) in metadata_with_exprs
712+ push! (metadata_expr . args,
713+ :( $ name = $ wrap ( $ set_scalar_metadata ( $ unwrap ( $ name), $ k, $ v))))
796714 end
715+
716+ push! (varexpr. args, metadata_expr)
717+ return vv isa Num ? name : :($ name... ), varexpr
797718end
798719
799720function handle_conditional_vars! (
0 commit comments