@@ -180,16 +180,6 @@ function update_kwargs_and_metadata!(dict, kwargs, a, def, indices, type, var,
180
180
end
181
181
end
182
182
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
-
193
183
function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
194
184
def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
195
185
type:: Type = Real, meta = Dict {DataType, Expr} ())
@@ -232,66 +222,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
232
222
varclass, where_types, meta)
233
223
return var, def, Dict ()
234
224
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
295
225
Expr (:(= ), a, b) => begin
296
226
Base. remove_linenums! (b)
297
227
def, meta = parse_default (mod, b)
@@ -338,6 +268,11 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
338
268
end
339
269
return var, def, Dict ()
340
270
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
341
276
_ => error (" $arg cannot be parsed" )
342
277
end
343
278
end
@@ -445,23 +380,14 @@ function parse_default(mod, a)
445
380
end
446
381
end
447
382
448
- function parse_metadata (mod, a:: Expr )
383
+ function parse_metadata (mod, a)
449
384
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)
452
386
Expr (:(= ), a, b) => Symbolics. option_to_metadata_type (Val (a)) => get_var (mod, b)
453
387
_ => error (" Cannot parse metadata $a " )
454
388
end
455
389
end
456
390
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
-
465
391
function _set_var_metadata! (metadata_with_exprs, a, m, v:: Expr )
466
392
push! (metadata_with_exprs, m => v)
467
393
a
@@ -719,7 +645,6 @@ function parse_variable_arg!(exprs, vs, dict, mod, arg, varclass, kwargs, where_
719
645
end
720
646
721
647
function convert_units (varunits:: DynamicQuantities.Quantity , value)
722
- value isa Nothing && return nothing
723
648
DynamicQuantities. ustrip (DynamicQuantities. uconvert (
724
649
DynamicQuantities. SymbolicUnits. as_quantity (varunits), value))
725
650
end
@@ -731,7 +656,6 @@ function convert_units(
731
656
end
732
657
733
658
function convert_units (varunits:: Unitful.FreeUnits , value)
734
- value isa Nothing && return nothing
735
659
Unitful. ustrip (varunits, value)
736
660
end
737
661
@@ -750,50 +674,47 @@ end
750
674
function parse_variable_arg (dict, mod, arg, varclass, kwargs, where_types)
751
675
vv, def, metadata_with_exprs = parse_variable_def! (
752
676
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)
773
696
end
774
697
end
775
698
end
776
- else
777
- quote
778
- $ name = if $ name === nothing
779
- $ setdefault ($ vv, $ def)
780
- else
781
- $ setdefault ($ vv, $ name)
782
- end
783
- end
784
699
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
790
707
end
708
+ end
791
709
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))))
796
714
end
715
+
716
+ push! (varexpr. args, metadata_expr)
717
+ return vv isa Num ? name : :($ name... ), varexpr
797
718
end
798
719
799
720
function handle_conditional_vars! (
0 commit comments