@@ -180,6 +180,16 @@ 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+
183193function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
184194 def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
185195 type:: Type = Real, meta = Dict {DataType, Expr} ())
@@ -225,27 +235,29 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
225235 Expr (:tuple , Expr (:ref , a, b... ), y) => begin
226236 varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
227237 push! (kwargs, Expr (:kw , varname, nothing ))
238+ varval = unit_handled_variable_value (mod, y, varname)
228239 if varclass == :parameters
229- var = :($ varname = $ first (@parameters $ a[$ (b... )] = ($ varname , $ y)))
240+ var = :($ varname = $ first (@parameters $ a[$ (b... )] = ($ varval , $ y)))
230241 else
231- var = :($ varname = $ first (@variables $ a[$ (b... )] = ($ varname , $ y)))
242+ var = :($ varname = $ first (@variables $ a[$ (b... )] = ($ varval , $ y)))
232243 end
233244 # TODO : update `dict` aka `Model.structure` with the metadata
234245 (:($ varname... ), var), nothing , Dict ()
235246 end
236247 Expr (:(= ), Expr (:ref , a, b... ), y) => begin
237248 varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
238249 if Meta. isexpr (y, :tuple )
250+ varval = unit_handled_variable_value (mod, y, varname)
239251 val, y = (y. args[1 ], y. args[2 : end ])
240252 push! (kwargs, Expr (:kw , varname, nothing ))
241253 if varclass == :parameters
242254 var = :($ varname = $ varname === nothing ? $ val : $ varname;
243255 $ varname = $ first (@parameters $ a[$ (b... )] = (
244- $ varname , $ (y... ))))
256+ $ varval , $ (y... ))))
245257 else
246258 var = :($ varname = $ varname === nothing ? $ val : $ varname;
247259 $ varname = $ first (@variables $ a[$ (b... )] = (
248- $ varname , $ (y... ))))
260+ $ varval , $ (y... ))))
249261 end
250262 else
251263 push! (kwargs, Expr (:kw , varname, nothing ))
@@ -260,37 +272,37 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
260272 end
261273 Expr (:(= ), Expr (:(:: ), Expr (:ref , a, b... ), n), y) => begin
262274 varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
275+ varval = unit_handled_variable_value (mod, y, varname)
263276 if Meta. isexpr (y, :tuple )
264277 val, y = (y. args[1 ], y. args[2 : end ])
265278 push! (kwargs, Expr (:kw , varname, nothing ))
266279 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... ))))
271282 else
272283 var = :($ varname = $ varname === nothing ? $ val : $ varname;
273284 $ varname = $ first (@variables $ a[$ (b... )]:: $n = (
274- $ varname , $ (y... ))))
285+ $ varval , $ (y... ))))
275286 end
276287 else
277288 push! (kwargs, Expr (:kw , varname, y))
278289 if varclass == :parameters
279- var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = $ varname ))
290+ var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = $ varval ))
280291 else
281- var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = $ varname ))
292+ var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = $ varval ))
282293 end
283294 end
284295 # TODO : update `dict`` aka `Model.structure` with the metadata
285296 (:($ varname... ), var), nothing , Dict ()
286297 end
287298 Expr (:tuple , Expr (:(:: ), Expr (:ref , a, b... ), n), y) => begin
288299 varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
300+ varval = unit_handled_variable_value (mod, y, varname)
289301 push! (kwargs, Expr (:kw , varname, nothing ))
290302 if varclass == :parameters
291- var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varname , $ y)))
303+ var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varval , $ y)))
292304 else
293- var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = ($ varname , $ y)))
305+ var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = ($ varval , $ y)))
294306 end
295307 # TODO : update `dict` aka `Model.structure` with the metadata
296308 (:($ varname... ), var), nothing , Dict ()
@@ -465,14 +477,24 @@ function parse_default(mod, a)
465477 end
466478end
467479
468- function parse_metadata (mod, a)
480+ function parse_metadata (mod, a:: Expr )
481+ @info a typeof (a)
469482 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)
471485 Expr (:(= ), a, b) => Symbolics. option_to_metadata_type (Val (a)) => get_var (mod, b)
472486 _ => error (" Cannot parse metadata $a " )
473487 end
474488end
475489
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+
476498function _set_var_metadata! (metadata_with_exprs, a, m, v:: Expr )
477499 push! (metadata_with_exprs, m => v)
478500 a
@@ -730,6 +752,7 @@ function parse_variable_arg!(exprs, vs, dict, mod, arg, varclass, kwargs, where_
730752end
731753
732754function convert_units (varunits:: DynamicQuantities.Quantity , value)
755+ value isa Nothing && return nothing
733756 DynamicQuantities. ustrip (DynamicQuantities. uconvert (
734757 DynamicQuantities. SymbolicUnits. as_quantity (varunits), value))
735758end
@@ -741,6 +764,7 @@ function convert_units(
741764end
742765
743766function convert_units (varunits:: Unitful.FreeUnits , value)
767+ value isa Nothing && return nothing
744768 Unitful. ustrip (varunits, value)
745769end
746770
0 commit comments