@@ -180,6 +180,16 @@ 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
+
183
193
function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
184
194
def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
185
195
type:: Type = Real, meta = Dict {DataType, Expr} ())
@@ -225,27 +235,29 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
225
235
Expr (:tuple , Expr (:ref , a, b... ), y) => begin
226
236
varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
227
237
push! (kwargs, Expr (:kw , varname, nothing ))
238
+ varval = unit_handled_variable_value (mod, y, varname)
228
239
if varclass == :parameters
229
- var = :($ varname = $ first (@parameters $ a[$ (b... )] = ($ varname , $ y)))
240
+ var = :($ varname = $ first (@parameters $ a[$ (b... )] = ($ varval , $ y)))
230
241
else
231
- var = :($ varname = $ first (@variables $ a[$ (b... )] = ($ varname , $ y)))
242
+ var = :($ varname = $ first (@variables $ a[$ (b... )] = ($ varval , $ y)))
232
243
end
233
244
# TODO : update `dict` aka `Model.structure` with the metadata
234
245
(:($ varname... ), var), nothing , Dict ()
235
246
end
236
247
Expr (:(= ), Expr (:ref , a, b... ), y) => begin
237
248
varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
238
249
if Meta. isexpr (y, :tuple )
250
+ varval = unit_handled_variable_value (mod, y, varname)
239
251
val, y = (y. args[1 ], y. args[2 : end ])
240
252
push! (kwargs, Expr (:kw , varname, nothing ))
241
253
if varclass == :parameters
242
254
var = :($ varname = $ varname === nothing ? $ val : $ varname;
243
255
$ varname = $ first (@parameters $ a[$ (b... )] = (
244
- $ varname , $ (y... ))))
256
+ $ varval , $ (y... ))))
245
257
else
246
258
var = :($ varname = $ varname === nothing ? $ val : $ varname;
247
259
$ varname = $ first (@variables $ a[$ (b... )] = (
248
- $ varname , $ (y... ))))
260
+ $ varval , $ (y... ))))
249
261
end
250
262
else
251
263
push! (kwargs, Expr (:kw , varname, nothing ))
@@ -260,37 +272,37 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
260
272
end
261
273
Expr (:(= ), Expr (:(:: ), Expr (:ref , a, b... ), n), y) => begin
262
274
varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
275
+ varval = unit_handled_variable_value (mod, y, varname)
263
276
if Meta. isexpr (y, :tuple )
264
277
val, y = (y. args[1 ], y. args[2 : end ])
265
278
push! (kwargs, Expr (:kw , varname, nothing ))
266
279
if varclass == :parameters
267
- var = :(
268
- $ varname = $ varname = $ varname === nothing ? $ val : $ varname;
269
- $ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varname, $ (y... )))
270
- )
280
+ var = :($ varname = $ varname = $ varname === nothing ? $ val : $ varname;
281
+ $ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varval, $ (y... ))))
271
282
else
272
283
var = :($ varname = $ varname === nothing ? $ val : $ varname;
273
284
$ varname = $ first (@variables $ a[$ (b... )]:: $n = (
274
- $ varname , $ (y... ))))
285
+ $ varval , $ (y... ))))
275
286
end
276
287
else
277
288
push! (kwargs, Expr (:kw , varname, y))
278
289
if varclass == :parameters
279
- var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = $ varname ))
290
+ var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = $ varval ))
280
291
else
281
- var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = $ varname ))
292
+ var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = $ varval ))
282
293
end
283
294
end
284
295
# TODO : update `dict`` aka `Model.structure` with the metadata
285
296
(:($ varname... ), var), nothing , Dict ()
286
297
end
287
298
Expr (:tuple , Expr (:(:: ), Expr (:ref , a, b... ), n), y) => begin
288
299
varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
300
+ varval = unit_handled_variable_value (mod, y, varname)
289
301
push! (kwargs, Expr (:kw , varname, nothing ))
290
302
if varclass == :parameters
291
- var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varname , $ y)))
303
+ var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varval , $ y)))
292
304
else
293
- var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = ($ varname , $ y)))
305
+ var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = ($ varval , $ y)))
294
306
end
295
307
# TODO : update `dict` aka `Model.structure` with the metadata
296
308
(:($ varname... ), var), nothing , Dict ()
@@ -465,14 +477,24 @@ function parse_default(mod, a)
465
477
end
466
478
end
467
479
468
- function parse_metadata (mod, a)
480
+ function parse_metadata (mod, a:: Expr )
481
+ @info a typeof (a)
469
482
MLStyle. @match a begin
470
- Expr (:vect , eles... ) => Dict (parse_metadata (mod, e) for e in eles)
483
+ Expr (:vect , b... ) => Dict (parse_metadata (mod, m) for m in b)
484
+ Expr (:tuple , a, b... ) => parse_metadata (mod, b)
471
485
Expr (:(= ), a, b) => Symbolics. option_to_metadata_type (Val (a)) => get_var (mod, b)
472
486
_ => error (" Cannot parse metadata $a " )
473
487
end
474
488
end
475
489
490
+ function parse_metadata (mod, metadata:: AbstractArray )
491
+ ret = Dict ()
492
+ for m in metadata
493
+ merge! (ret, parse_metadata (mod, m))
494
+ end
495
+ ret
496
+ end
497
+
476
498
function _set_var_metadata! (metadata_with_exprs, a, m, v:: Expr )
477
499
push! (metadata_with_exprs, m => v)
478
500
a
@@ -730,6 +752,7 @@ function parse_variable_arg!(exprs, vs, dict, mod, arg, varclass, kwargs, where_
730
752
end
731
753
732
754
function convert_units (varunits:: DynamicQuantities.Quantity , value)
755
+ value isa Nothing && return nothing
733
756
DynamicQuantities. ustrip (DynamicQuantities. uconvert (
734
757
DynamicQuantities. SymbolicUnits. as_quantity (varunits), value))
735
758
end
@@ -741,6 +764,7 @@ function convert_units(
741
764
end
742
765
743
766
function convert_units (varunits:: Unitful.FreeUnits , value)
767
+ value isa Nothing && return nothing
744
768
Unitful. ustrip (varunits, value)
745
769
end
746
770
0 commit comments