@@ -422,9 +422,8 @@ function push_reactions!(reactions::Vector{DSLReaction}, subs::ExprValues,
422
422
# This finds these tuples' lengths (or 1 for non-tuple forms). Inconsistent lengths yield error.
423
423
lengs = (tup_leng (subs), tup_leng (prods), tup_leng (rate), tup_leng (metadata))
424
424
maxl = maximum (lengs)
425
- if any (! (leng == 1 || leng == maxl) for leng in lengs)
425
+ any (! (leng == 1 || leng == maxl) for leng in lengs) &&
426
426
error (" Malformed reaction, rate: $rate , subs: $subs , prods: $prods , metadata: $metadata ." )
427
- end
428
427
429
428
# Loops through each reaction encoded by the reaction's different components.
430
429
# Creates a `DSLReaction` representation and adds it to `reactions`.
@@ -492,7 +491,7 @@ function extract_sps_and_ps(reactions, excluded_syms; requiredec = false)
492
491
collect (species), collect (parameters)
493
492
end
494
493
495
- # Function called by extract_sps_and_ps, recursively loops through an
494
+ # Function called by ` extract_sps_and_ps` , recursively loops through an
496
495
# expression and find symbols (adding them to the push_symbols vector).
497
496
function add_syms_from_expr! (push_symbols:: AbstractSet , expr:: ExprValues , excluded_syms)
498
497
# If we have encountered a Symbol in the recursion, we can try extracting it.
@@ -541,29 +540,6 @@ function get_psexpr(parameters_extracted, options)
541
540
pexprs
542
541
end
543
542
544
- # Takes a ModelingToolkit declaration macro (like @parameters ...) and return and expression:
545
- # That calls the macro and then scalarizes all the symbols created into a vector of Nums.
546
- # stores the created symbolic variables in a variable (which name is generated from `name`).
547
- # It will also return the name used for the variable that stores the symbolic variables.
548
- function scalarize_macro (expr_init, name)
549
- # Generates a random variable name which (in generated code) will store the produced
550
- # symbolic variables (e.g. `var"##ps#384"`).
551
- namesym = gensym (name)
552
-
553
- # If the input expression is non-empty, wraps it with additional information.
554
- if expr_init != :(())
555
- symvec = gensym ()
556
- expr = quote
557
- $ symvec = $ expr_init
558
- $ namesym = reduce (vcat, Symbolics. scalarize ($ symvec))
559
- end
560
- else
561
- expr = :($ namesym = Num[])
562
- end
563
-
564
- return expr, namesym
565
- end
566
-
567
543
# From the system reactions (as `DSLReaction`s) and equations (as expressions),
568
544
# creates the expressions that evaluates to the reaction (+ equations) vector.
569
545
function get_rxexprs (reactions, equations, all_syms)
@@ -598,6 +574,29 @@ function get_rxexpr(rx::DSLReaction)
598
574
return rx_constructor
599
575
end
600
576
577
+ # Takes a ModelingToolkit declaration macro (like @parameters ...) and return and expression:
578
+ # That calls the macro and then scalarizes all the symbols created into a vector of Nums.
579
+ # stores the created symbolic variables in a variable (which name is generated from `name`).
580
+ # It will also return the name used for the variable that stores the symbolic variables.
581
+ function scalarize_macro (expr_init, name)
582
+ # Generates a random variable name which (in generated code) will store the produced
583
+ # symbolic variables (e.g. `var"##ps#384"`).
584
+ namesym = gensym (name)
585
+
586
+ # If the input expression is non-empty, wraps it with additional information.
587
+ if expr_init != :(())
588
+ symvec = gensym ()
589
+ expr = quote
590
+ $ symvec = $ expr_init
591
+ $ namesym = reduce (vcat, Symbolics. scalarize ($ symvec))
592
+ end
593
+ else
594
+ expr = :($ namesym = Num[])
595
+ end
596
+
597
+ return expr, namesym
598
+ end
599
+
601
600
# Recursively escape functions within equations of an equation written using user-defined functions.
602
601
# Does not escape special function calls like "hill(...)" and differential operators. Does
603
602
# also not escape stuff corresponding to e.g. species or parameters (required for good error
610
609
611
610
# ## DSL Option Handling ###
612
611
613
- # Finds the time independent variable, and any potential spatial independent variables.
614
- # Returns these (individually and combined), as well as an expression for declaring them.
615
- function read_ivs_option (options)
616
- # Creates the independent variables expressions (depends on whether the `ivs` option was used).
617
- if haskey (options, :ivs )
618
- ivs = Tuple (extract_syms (options, :ivs ))
619
- ivsexpr = copy (options[:ivs ])
620
- ivsexpr. args[1 ] = Symbol (" @" , " parameters" )
621
- else
622
- ivs = (DEFAULT_IV_SYM,)
623
- ivsexpr = :($ (DEFAULT_IV_SYM) = default_t ())
624
- end
625
-
626
- # Extracts the independent variables symbols (time and spatial), and returns the output.
627
- tiv = ivs[1 ]
628
- sivs = (length (ivs) > 1 ) ? Expr (:vect , ivs[2 : end ]. .. ) : nothing
629
- return tiv, sivs, ivs, ivsexpr
630
- end
631
-
632
612
# Returns the `default_reaction_metadata` output. Technically Catalyst's code could have been made
633
613
# more generic to account for other default reaction metadata. Practically, this will likely
634
614
# be the only relevant reaction metadata to have a default value via the DSL. If another becomes
@@ -871,6 +851,25 @@ function read_combinatoric_ratelaws_option(options)
871
851
get_block_option (options[:combinatoric_ratelaws ]) : true
872
852
end
873
853
854
+ # Finds the time independent variable, and any potential spatial independent variables.
855
+ # Returns these (individually and combined), as well as an expression for declaring them.
856
+ function read_ivs_option (options)
857
+ # Creates the independent variables expressions (depends on whether the `ivs` option was used).
858
+ if haskey (options, :ivs )
859
+ ivs = Tuple (extract_syms (options, :ivs ))
860
+ ivsexpr = copy (options[:ivs ])
861
+ ivsexpr. args[1 ] = Symbol (" @" , " parameters" )
862
+ else
863
+ ivs = (DEFAULT_IV_SYM,)
864
+ ivsexpr = :($ (DEFAULT_IV_SYM) = default_t ())
865
+ end
866
+
867
+ # Extracts the independent variables symbols (time and spatial), and returns the output.
868
+ tiv = ivs[1 ]
869
+ sivs = (length (ivs) > 1 ) ? Expr (:vect , ivs[2 : end ]. .. ) : nothing
870
+ return tiv, sivs, ivs, ivsexpr
871
+ end
872
+
874
873
# ## `@reaction` Macro & its Internals ###
875
874
876
875
"""
0 commit comments