@@ -53,7 +53,6 @@ function _model_macro(mod, fullname::Union{Expr, Symbol}, expr, isconnector)
53
53
end
54
54
exprs = Expr (:block )
55
55
dict = Dict {Symbol, Any} (
56
- :constants => Dict {Symbol, Dict} (),
57
56
:defaults => Dict {Symbol, Any} (),
58
57
:kwargs => Dict {Symbol, Dict} (),
59
58
:structural_parameters => Dict {Symbol, Dict} ()
@@ -125,7 +124,7 @@ function _model_macro(mod, fullname::Union{Expr, Symbol}, expr, isconnector)
125
124
description = get (dict, :description , " " )
126
125
127
126
@inline pop_structure_dict! .(
128
- Ref (dict), [:constants , : defaults , :kwargs , :structural_parameters ])
127
+ Ref (dict), [:defaults , :kwargs , :structural_parameters ])
129
128
130
129
sys = :($ type ($ (flatten_equations)(equations), $ iv, variables, parameters;
131
130
name, description = $ description, systems, gui_metadata = $ gui_metadata,
@@ -320,6 +319,10 @@ Base.@nospecializeinfer function parse_variable_def!(
320
319
Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
321
320
var = :($ varname = $ first (@parameters ($ a[$ (indices... )]:: $type = $ varval),
322
321
$ meta_val))
322
+ elseif varclass == :constants
323
+ Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
324
+ var = :($ varname = $ first (@constants ($ a[$ (indices... )]:: $type = $ varval),
325
+ $ meta_val))
323
326
else
324
327
Meta. isexpr (a, :call ) ||
325
328
throw (" $a is not a variable of the independent variable" )
@@ -351,6 +354,12 @@ Base.@nospecializeinfer function parse_variable_def!(
351
354
var = :($ varname = $ varname === $ NO_VALUE ? $ val : $ varname;
352
355
$ varname = $ first (@parameters ($ a[$ (indices... )]:: $type = $ varval),
353
356
$ (def_n_meta... )))
357
+ elseif varclass == :constants
358
+ Meta. isexpr (a, :call ) &&
359
+ assert_unique_independent_var (dict, a. args[end ])
360
+ var = :($ varname = $ varname === $ NO_VALUE ? $ val : $ varname;
361
+ $ varname = $ first (@constants ($ a[$ (indices... )]:: $type = $ varval),
362
+ $ (def_n_meta... )))
354
363
else
355
364
Meta. isexpr (a, :call ) ||
356
365
throw (" $a is not a variable of the independent variable" )
@@ -366,6 +375,11 @@ Base.@nospecializeinfer function parse_variable_def!(
366
375
assert_unique_independent_var (dict, a. args[end ])
367
376
var = :($ varname = $ varname === $ NO_VALUE ? $ def_n_meta : $ varname;
368
377
$ varname = $ first (@parameters $ a[$ (indices... )]:: $type = $ varname))
378
+ elseif varclass == :constants
379
+ Meta. isexpr (a, :call ) &&
380
+ assert_unique_independent_var (dict, a. args[end ])
381
+ var = :($ varname = $ varname === $ NO_VALUE ? $ def_n_meta : $ varname;
382
+ $ varname = $ first (@constants $ a[$ (indices... )]:: $type = $ varname))
369
383
else
370
384
Meta. isexpr (a, :call ) ||
371
385
throw (" $a is not a variable of the independent variable" )
@@ -393,6 +407,9 @@ Base.@nospecializeinfer function parse_variable_def!(
393
407
if varclass == :parameters
394
408
Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
395
409
var = :($ varname = $ first (@parameters $ a[$ (indices... )]:: $type = $ varname))
410
+ elseif varclass == :constants
411
+ Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
412
+ var = :($ varname = $ first (@constants $ a[$ (indices... )]:: $type = $ varname))
396
413
elseif varclass == :variables
397
414
Meta. isexpr (a, :call ) ||
398
415
throw (" $a is not a variable of the independent variable" )
@@ -453,6 +470,8 @@ function generate_var(a, varclass; type = Real)
453
470
var = Symbolics. variable (a; T = type)
454
471
if varclass == :parameters
455
472
var = toparam (var)
473
+ elseif varclass == :constants
474
+ var = toconstant (var)
456
475
elseif varclass == :independent_variables
457
476
var = toiv (var)
458
477
end
@@ -513,6 +532,8 @@ function generate_var!(dict, a, b, varclass, mod;
513
532
end
514
533
if varclass == :parameters
515
534
var = toparam (var)
535
+ elseif varclass == :constants
536
+ var = toconstant (var)
516
537
end
517
538
var
518
539
end
@@ -622,7 +643,7 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, sps, c_evts, d_evts,
622
643
elseif mname == Symbol (" @equations" )
623
644
parse_equations! (exprs, eqs, dict, body)
624
645
elseif mname == Symbol (" @constants" )
625
- parse_constants ! (exprs, dict, body, mod )
646
+ parse_variables ! (exprs, ps, dict, mod, body, :constants , kwargs, where_types )
626
647
elseif mname == Symbol (" @continuous_events" )
627
648
parse_continuous_events! (c_evts, dict, body)
628
649
elseif mname == Symbol (" @discrete_events" )
@@ -643,49 +664,6 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, sps, c_evts, d_evts,
643
664
end
644
665
end
645
666
646
- function parse_constants! (exprs, dict, body, mod)
647
- Base. remove_linenums! (body)
648
- for arg in body. args
649
- MLStyle. @match arg begin
650
- Expr (:(= ), Expr (:(:: ), a, type), Expr (:tuple , b, metadata)) || Expr (:(= ), Expr (:(:: ), a, type), b) => begin
651
- type = getfield (mod, type)
652
- b = _type_check! (get_var (mod, b), a, type, :constants )
653
- push! (exprs,
654
- :($ (Symbolics. _parse_vars (
655
- :constants , type, [:($ a = $ b), metadata], toconstant))))
656
- dict[:constants ][a] = Dict (:value => b, :type => type)
657
- if @isdefined metadata
658
- for data in metadata. args
659
- dict[:constants ][a][data. args[1 ]] = data. args[2 ]
660
- end
661
- end
662
- end
663
- Expr (:(= ), a, Expr (:tuple , b, metadata)) => begin
664
- push! (exprs,
665
- :($ (Symbolics. _parse_vars (
666
- :constants , Real, [:($ a = $ b), metadata], toconstant))))
667
- dict[:constants ][a] = Dict {Symbol, Any} (:value => get_var (mod, b))
668
- for data in metadata. args
669
- dict[:constants ][a][data. args[1 ]] = data. args[2 ]
670
- end
671
- end
672
- Expr (:(= ), a, b) => begin
673
- push! (exprs,
674
- :($ (Symbolics. _parse_vars (
675
- :constants , Real, [:($ a = $ b)], toconstant))))
676
- dict[:constants ][a] = Dict (:value => get_var (mod, b))
677
- end
678
- _ => error (""" Malformed constant definition `$arg `. Please use the following syntax:
679
- ```
680
- @constants begin
681
- var = value, [description = "This is an example constant."]
682
- end
683
- ```
684
- """ )
685
- end
686
- end
687
- end
688
-
689
667
push_additional_defaults! (dict, a, b:: Number ) = dict[:defaults ][a] = b
690
668
push_additional_defaults! (dict, a, b:: QuoteNode ) = dict[:defaults ][a] = b. value
691
669
function push_additional_defaults! (dict, a, b:: Expr )
@@ -950,6 +928,7 @@ function handle_conditional_vars!(
950
928
arg, conditional_branch, mod, varclass, kwargs, where_types)
951
929
conditional_dict = Dict (:kwargs => Dict (),
952
930
:parameters => Any[Dict {Symbol, Dict{Symbol, Any}} ()],
931
+ :constants => Any[Dict {Symbol, Dict{Symbol, Any}} ()],
953
932
:variables => Any[Dict {Symbol, Dict{Symbol, Any}} ()])
954
933
for _arg in arg. args
955
934
name, ex = parse_variable_arg (
@@ -964,7 +943,7 @@ function prune_conditional_dict!(conditional_tuple::Tuple)
964
943
prune_conditional_dict! .(collect (conditional_tuple))
965
944
end
966
945
function prune_conditional_dict! (conditional_dict:: Dict )
967
- for k in [:parameters , :variables ]
946
+ for k in [:parameters , :variables , :constants ]
968
947
length (conditional_dict[k]) == 1 && isempty (first (conditional_dict[k])) &&
969
948
delete! (conditional_dict, k)
970
949
end
981
960
982
961
function get_conditional_dict! (conditional_dict:: Dict , conditional_y_tuple:: Dict )
983
962
merge! (conditional_dict[:kwargs ], conditional_y_tuple[:kwargs ])
984
- for key in [:parameters , :variables ]
963
+ for key in [:parameters , :variables , :constants ]
985
964
merge! (conditional_dict[key][1 ], conditional_y_tuple[key][1 ])
986
965
end
987
966
conditional_dict
@@ -1000,6 +979,7 @@ function push_conditional_dict!(dict, condition, conditional_dict,
1000
979
end
1001
980
conditional_y_dict = Dict (:kwargs => Dict (),
1002
981
:parameters => Any[Dict {Symbol, Dict{Symbol, Any}} ()],
982
+ :constants => Any[Dict {Symbol, Dict{Symbol, Any}} ()],
1003
983
:variables => Any[Dict {Symbol, Dict{Symbol, Any}} ()])
1004
984
get_conditional_dict! (conditional_y_dict, conditional_y_tuple)
1005
985
0 commit comments