Skip to content

Commit 8937143

Browse files
authored
Merge pull request #828 from isaacsas/add_combinatoric_ratelaws_to_dsl
Add `@combinatoric_ratelaws` to DSL
2 parents 8a604c4 + a04b527 commit 8937143

File tree

2 files changed

+62
-19
lines changed

2 files changed

+62
-19
lines changed

src/reaction_network.jl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,9 @@ const forbidden_variables_error = let
8282
end
8383

8484
# Declares the keys used for various options.
85-
const option_keys = (:species, :parameters, :variables, :ivs, :compounds, :observables, :default_noise_scaling,
86-
:differentials, :equations, :continuous_events, :discrete_events)
85+
const option_keys = (:species, :parameters, :variables, :ivs, :compounds, :observables,
86+
:default_noise_scaling, :differentials, :equations,
87+
:continuous_events, :discrete_events, :combinatoric_ratelaws)
8788

8889
### The @species macro, basically a copy of the @variables macro. ###
8990
macro species(ex...)
@@ -364,6 +365,12 @@ function make_reaction_system(ex::Expr; name = :(gensym(:ReactionSystem)))
364365
sivs = (length(ivs) > 1) ? Expr(:vect, ivs[2:end]...) : nothing
365366
all_ivs = (isnothing(sivs) ? [tiv] : [tiv; sivs.args])
366367

368+
if haskey(options, :combinatoric_ratelaws)
369+
combinatoric_ratelaws = options[:combinatoric_ratelaws].args[end]
370+
else
371+
combinatoric_ratelaws = true
372+
end
373+
367374
# Reads more options.
368375
observed_vars, observed_eqs, obs_syms = read_observed_options(options, [species_declared; variables], all_ivs)
369376

@@ -415,7 +422,9 @@ function make_reaction_system(ex::Expr; name = :(gensym(:ReactionSystem)))
415422
Catalyst.make_ReactionSystem_internal(
416423
$rxexprs, $tiv, setdiff(union($spssym, $varssym, $compssym), $obs_syms),
417424
$pssym; name = $name, spatial_ivs = $sivs, observed = $observed_eqs,
418-
continuous_events = $continuous_events_expr, discrete_events = $discrete_events_expr);
425+
continuous_events = $continuous_events_expr,
426+
discrete_events = $discrete_events_expr,
427+
combinatoric_ratelaws = $combinatoric_ratelaws);
419428
default_reaction_metadata = $default_reaction_metadata
420429
)
421430
end

test/dsl/dsl_options.jl

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ end
398398

399399
# Test basic functionality.
400400
# Tests various types of indexing.
401-
let
401+
let
402402
rn = @reaction_network begin
403403
@observables begin
404404
X ~ Xi + Xa
@@ -489,23 +489,23 @@ end
489489
# Tests using a single observable (without begin/end statement).
490490
# Tests using observable component not part of reaction.
491491
# Tests using parameters in observables formula.
492-
let
492+
let
493493
rn = @reaction_network begin
494494
@parameters op_1 op_2
495495
@species X4(t)
496-
@observables X ~ X1^2 + op_1*(X2 + 2X3) + X1*X4/op_2 + p
496+
@observables X ~ X1^2 + op_1*(X2 + 2X3) + X1*X4/op_2 + p
497497
(p,d), 0 <--> X1
498498
(k1,k2), X1 <--> X2
499499
(k3,k4), X2 <--> X3
500500
end
501-
501+
502502
u0 = Dict([:X1 => 1.0, :X2 => 2.0, :X3 => 3.0, :X4 => 4.0])
503503
ps = Dict([:p => 1.0, :d => 0.2, :k1 => 1.5, :k2 => 1.5, :k3 => 5.0, :k4 => 5.0, :op_1 => 1.5, :op_2 => 1.5])
504504

505505
oprob = ODEProblem(rn, u0, (0.0, 1000.0), ps)
506506
sol = solve(oprob, Tsit5())
507507

508-
@test sol[:X][1] == u0[:X1]^2 + ps[:op_1]*(u0[:X2] + 2*u0[:X3]) + u0[:X1]*u0[:X4]/ps[:op_2] + ps[:p]
508+
@test sol[:X][1] == u0[:X1]^2 + ps[:op_1]*(u0[:X2] + 2*u0[:X3]) + u0[:X1]*u0[:X4]/ps[:op_2] + ps[:p]
509509
end
510510

511511
# Checks that ivs are correctly found.
@@ -535,7 +535,7 @@ end
535535
# Declares observables implicitly/explicitly.
536536
# Cannot test `isequal(rn1, rn2)` because the two sets of observables have some obscure Symbolics
537537
# substructure that is different.
538-
let
538+
let
539539
# Basic case.
540540
rn1 = @reaction_network rn_observed begin
541541
@observables X ~ X1 + X2
@@ -609,14 +609,14 @@ let
609609
(kB,kD), 2X <--> X2
610610
(k1,k2), Y1 <--> Y2
611611
end
612-
612+
613613
@test isspecies(rn.X)
614614
@test !isspecies(rn.Y)
615615
@test !isspecies(rn.Z)
616616
end
617617

618618
# Tests various erroneous declarations throw errors.
619-
let
619+
let
620620
# Independent variable in @observables.
621621
@test_throws Exception @eval @reaction_network begin
622622
@observables X(t) ~ X1 + X2
@@ -699,7 +699,7 @@ let
699699
@equations begin
700700
X + 5 ~ k*S
701701
3Y + X ~ S + X*d
702-
end
702+
end
703703
(p,d), 0 <--> S
704704
end
705705

@@ -747,7 +747,7 @@ let
747747
rn2 = @reaction_network rn begin
748748
@parameters k
749749
@variables X(t)
750-
@equations begin
750+
@equations begin
751751
X + 2 ~ k*S
752752
end
753753
(p,d), 0 <--> S
@@ -759,7 +759,7 @@ end
759759
# Tries with interpolating a value into an equation.
760760
# Tries using rn.X notation for designating variables.
761761
# Tries for empty parameter vector.
762-
let
762+
let
763763
c = 6.0
764764
rn = complete(@reaction_network begin
765765
@variables X(t)
@@ -774,12 +774,12 @@ let
774774
end
775775

776776
# Checks hierarchical model.
777-
let
777+
let
778778
base_rn = @network_component begin
779779
@variables V1(t)
780780
@equations begin
781781
X*3V1 ~ X - 2
782-
end
782+
end
783783
(p,d), 0 <--> X
784784
end
785785
@unpack X, V1, p, d = base_rn
@@ -788,7 +788,7 @@ let
788788
@variables V2(t)
789789
@equations begin
790790
X*4V2 ~ X - 3
791-
end
791+
end
792792
(p,d), 0 <--> X
793793
end
794794

@@ -813,7 +813,7 @@ let
813813
@equations begin
814814
X + 5 ~ k*S
815815
D(Y) ~ X + S - 5*Y
816-
end
816+
end
817817
(p,d), 0 <--> S
818818
end
819819
@unpack X, Y, S, p, d, k = rn
@@ -848,7 +848,7 @@ let
848848
end
849849

850850
# Tests that various erroneous declarations throw errors.
851-
let
851+
let
852852
# Using = instead of ~ (for equation).
853853
@test_throws Exception @eval @reaction_network begin
854854
@variables X(t)
@@ -861,4 +861,38 @@ let
861861
@equations X ~ p - S
862862
(P,D), 0 <--> S
863863
end
864+
end
865+
866+
# test combinatoric_ratelaws DSL option
867+
let
868+
rn = @reaction_network begin
869+
@combinatoric_ratelaws false
870+
(k1,k2), 2A <--> B
871+
end
872+
combinatoric_ratelaw = Catalyst.get_combinatoric_ratelaws(rn)
873+
@test combinatoric_ratelaw == false
874+
rl = oderatelaw(reactions(rn)[1]; combinatoric_ratelaw)
875+
@unpack k1, A = rn
876+
@test isequal(rl, k1*A^2)
877+
878+
rn2 = @reaction_network begin
879+
@combinatoric_ratelaws true
880+
(k1,k2), 2A <--> B
881+
end
882+
combinatoric_ratelaw = Catalyst.get_combinatoric_ratelaws(rn2)
883+
@test combinatoric_ratelaw == true
884+
rl = oderatelaw(reactions(rn2)[1]; combinatoric_ratelaw)
885+
@unpack k1, A = rn2
886+
@test isequal(rl, k1*A^2/2)
887+
888+
crl = false
889+
rn3 = @reaction_network begin
890+
@combinatoric_ratelaws $crl
891+
(k1,k2), 2A <--> B
892+
end
893+
combinatoric_ratelaw = Catalyst.get_combinatoric_ratelaws(rn3)
894+
@test combinatoric_ratelaw == crl
895+
rl = oderatelaw(reactions(rn3)[1]; combinatoric_ratelaw)
896+
@unpack k1, A = rn3
897+
@test isequal(rl, k1*A^2)
864898
end

0 commit comments

Comments
 (0)