Skip to content

Commit ac489ba

Browse files
committed
add ODE expansion
1 parent 1e96aa5 commit ac489ba

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

src/reactionsystem_conversions.jl

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ Notes:
2222
`combinatoric_ratelaw=false` then the ratelaw is `k*S^2`, i.e. the scaling
2323
factor is ignored.
2424
"""
25-
function oderatelaw(rx; combinatoric_ratelaw = true)
25+
function oderatelaw(rx; combinatoric_ratelaw = true, expand_catalyst_funs = true)
2626
@unpack rate, substrates, substoich, only_use_rate = rx
2727
rl = rate
28+
expand_catalyst_funs && (rl = expand_registered_functions(rl))
2829

2930
# if the stoichiometric coefficients are not integers error if asking to scale rates
3031
!all(s -> s isa Union{Integer, Symbolic}, substoich) &&
@@ -46,7 +47,8 @@ end
4647
# including non-species variables.
4748
drop_dynamics(s) = isconstant(s) || isbc(s) || (!isspecies(s))
4849

49-
function assemble_oderhs(rs, ispcs; combinatoric_ratelaws = true, remove_conserved = false)
50+
function assemble_oderhs(rs, ispcs; combinatoric_ratelaws = true,
51+
remove_conserved = false, expand_catalyst_funs = true)
5052
nps = get_networkproperties(rs)
5153
species_to_idx = Dict(x => i for (i, x) in enumerate(ispcs))
5254
rhsvec = Any[0 for _ in ispcs]
@@ -57,7 +59,8 @@ function assemble_oderhs(rs, ispcs; combinatoric_ratelaws = true, remove_conserv
5759
end
5860

5961
for rx in get_rxs(rs)
60-
rl = oderatelaw(rx; combinatoric_ratelaw = combinatoric_ratelaws)
62+
rl = oderatelaw(rx; combinatoric_ratelaw = combinatoric_ratelaws,
63+
expand_catalyst_funs)
6164
remove_conserved && (rl = substitute(rl, depspec_submap))
6265
for (spec, stoich) in rx.netstoich
6366
# dependent species don't get an ODE, so are skipped
@@ -90,8 +93,9 @@ function assemble_oderhs(rs, ispcs; combinatoric_ratelaws = true, remove_conserv
9093
end
9194

9295
function assemble_drift(rs, ispcs; combinatoric_ratelaws = true, as_odes = true,
93-
include_zero_odes = true, remove_conserved = false)
94-
rhsvec = assemble_oderhs(rs, ispcs; combinatoric_ratelaws, remove_conserved)
96+
include_zero_odes = true, remove_conserved = false, expand_catalyst_funs = true)
97+
rhsvec = assemble_oderhs(rs, ispcs; combinatoric_ratelaws, remove_conserved,
98+
expand_catalyst_funs)
9599
if as_odes
96100
D = Differential(get_iv(rs))
97101
eqs = [Equation(D(x), rhs)
@@ -484,9 +488,9 @@ Keyword args and default values:
484488
"""
485489
function Base.convert(::Type{<:ODESystem}, rs::ReactionSystem; name = nameof(rs),
486490
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
487-
include_zero_odes = true, remove_conserved = false,
488-
checks = false, default_u0 = Dict(), default_p = Dict(),
489-
defaults = _merge(Dict(default_u0), Dict(default_p)),
491+
include_zero_odes = true, remove_conserved = false, checks = false,
492+
default_u0 = Dict(), default_p = Dict(),
493+
defaults = _merge(Dict(default_u0), Dict(default_p)), expand_catalyst_funs = true,
490494
kwargs...)
491495
# Error checks.
492496
iscomplete(rs) || error(COMPLETENESS_ERROR)
@@ -496,7 +500,7 @@ function Base.convert(::Type{<:ODESystem}, rs::ReactionSystem; name = nameof(rs)
496500
remove_conserved && conservationlaws(fullrs)
497501
ists, ispcs = get_indep_sts(fullrs, remove_conserved)
498502
eqs = assemble_drift(fullrs, ispcs; combinatoric_ratelaws, remove_conserved,
499-
include_zero_odes)
503+
include_zero_odes, expand_catalyst_funs)
500504
eqs, us, ps, obs, defs = addconstraints!(eqs, fullrs, ists, ispcs; remove_conserved)
501505

502506
ODESystem(eqs, get_iv(fullrs), us, ps;
@@ -553,7 +557,7 @@ function Base.convert(::Type{<:NonlinearSystem}, rs::ReactionSystem; name = name
553557
remove_conserved = false, conseqs_remake_warn = true, checks = false,
554558
default_u0 = Dict(), default_p = Dict(),
555559
defaults = _merge(Dict(default_u0), Dict(default_p)),
556-
all_differentials_permitted = false, kwargs...)
560+
all_differentials_permitted = false, expand_catalyst_funs = true, kwargs...)
557561
# Error checks.
558562
iscomplete(rs) || error(COMPLETENESS_ERROR)
559563
spatial_convert_err(rs::ReactionSystem, NonlinearSystem)
@@ -631,7 +635,9 @@ Notes:
631635
function Base.convert(::Type{<:SDESystem}, rs::ReactionSystem;
632636
name = nameof(rs), combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
633637
include_zero_odes = true, checks = false, remove_conserved = false,
634-
default_u0 = Dict(), default_p = Dict(), defaults = _merge(Dict(default_u0), Dict(default_p)),
638+
default_u0 = Dict(), default_p = Dict(),
639+
defaults = _merge(Dict(default_u0), Dict(default_p)),
640+
expand_catalyst_funs = true,
635641
kwargs...)
636642
# Error checks.
637643
iscomplete(rs) || error(COMPLETENESS_ERROR)
@@ -681,9 +687,8 @@ Notes:
681687
"""
682688
function Base.convert(::Type{<:JumpSystem}, rs::ReactionSystem; name = nameof(rs),
683689
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
684-
remove_conserved = nothing, checks = false,
685-
default_u0 = Dict(), default_p = Dict(),
686-
defaults = _merge(Dict(default_u0), Dict(default_p)),
690+
remove_conserved = nothing, checks = false, default_u0 = Dict(), default_p = Dict(),
691+
defaults = _merge(Dict(default_u0), Dict(default_p)), expand_catalyst_funs = true,
687692
kwargs...)
688693
iscomplete(rs) || error(COMPLETENESS_ERROR)
689694
spatial_convert_err(rs::ReactionSystem, JumpSystem)
@@ -720,9 +725,9 @@ function DiffEqBase.ODEProblem(rs::ReactionSystem, u0, tspan,
720725
check_length = false, name = nameof(rs),
721726
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
722727
include_zero_odes = true, remove_conserved = false, checks = false,
723-
structural_simplify = false, kwargs...)
728+
expand_catalyst_funs = true, structural_simplify = false, kwargs...)
724729
osys = convert(ODESystem, rs; name, combinatoric_ratelaws, include_zero_odes, checks,
725-
remove_conserved)
730+
remove_conserved, expand_catalyst_funs)
726731

727732
# Handles potential differential algebraic equations (which requires `structural_simplify`).
728733
if structural_simplify
@@ -768,10 +773,12 @@ Keyword args and default values:
768773
function DiffEqBase.NonlinearProblem(rs::ReactionSystem, u0,
769774
p = DiffEqBase.NullParameters(), args...;
770775
name = nameof(rs), combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
771-
remove_conserved = false, conseqs_remake_warn = true, checks = false, check_length = false,
776+
remove_conserved = false, conseqs_remake_warn = true, checks = false,
777+
check_length = false, expand_catalyst_funs = true,
772778
structural_simplify = false, all_differentials_permitted = false, kwargs...)
773779
nlsys = convert(NonlinearSystem, rs; name, combinatoric_ratelaws, checks,
774-
all_differentials_permitted, remove_conserved, conseqs_remake_warn)
780+
all_differentials_permitted, remove_conserved, conseqs_remake_warn,
781+
expand_catalyst_funs)
775782
nlsys = structural_simplify ? MT.structural_simplify(nlsys) : complete(nlsys)
776783
return NonlinearProblem(nlsys, u0, p, args...; check_length,
777784
kwargs...)
@@ -781,9 +788,10 @@ end
781788
function DiffEqBase.SDEProblem(rs::ReactionSystem, u0, tspan,
782789
p = DiffEqBase.NullParameters(), args...;
783790
name = nameof(rs), combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
784-
include_zero_odes = true, checks = false, check_length = false, remove_conserved = false,
785-
structural_simplify = false, kwargs...)
786-
sde_sys = convert(SDESystem, rs; name, combinatoric_ratelaws,
791+
include_zero_odes = true, checks = false, check_length = false,
792+
remove_conserved = false, structural_simplify = false,
793+
expand_catalyst_funs = true, kwargs...)
794+
sde_sys = convert(SDESystem, rs; name, combinatoric_ratelaws, expand_catalyst_funs,
787795
include_zero_odes, checks, remove_conserved)
788796

789797
# Handles potential differential algebraic equations (which requires `structural_simplify`).
@@ -848,8 +856,9 @@ plot(sol, idxs = :A)
848856
"""
849857
function JumpInputs(rs::ReactionSystem, u0, tspan, p = DiffEqBase.NullParameters();
850858
name = nameof(rs), combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
851-
checks = false, kwargs...)
852-
jsys = complete(convert(JumpSystem, rs; name, combinatoric_ratelaws, checks))
859+
expand_catalyst_funs = true, checks = false, kwargs...)
860+
jsys = complete(convert(JumpSystem, rs; name, combinatoric_ratelaws,
861+
expand_catalyst_funs, checks))
853862
if MT.has_variableratejumps(jsys)
854863
prob = ODEProblem(jsys, u0, tspan, p; kwargs...)
855864
else
@@ -873,11 +882,11 @@ end
873882

874883
# DiscreteProblem from AbstractReactionNetwork
875884
function DiffEqBase.DiscreteProblem(rs::ReactionSystem, u0, tspan::Tuple,
876-
p = DiffEqBase.NullParameters(), args...;
877-
name = nameof(rs),
878-
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
879-
checks = false, kwargs...)
880-
jsys = convert(JumpSystem, rs; name, combinatoric_ratelaws, checks)
885+
p = DiffEqBase.NullParameters(), args...; name = nameof(rs),
886+
combinatoric_ratelaws = get_combinatoric_ratelaws(rs), checks = false,
887+
expand_catalyst_funs = true, kwargs...)
888+
jsys = convert(JumpSystem, rs; name, combinatoric_ratelaws, checks,
889+
expand_catalyst_funs)
881890
jsys = complete(jsys)
882891
return DiscreteProblem(jsys, u0, tspan, p, args...; kwargs...)
883892
end
@@ -886,8 +895,9 @@ end
886895
function JumpProcesses.JumpProblem(rs::ReactionSystem, prob,
887896
aggregator = JumpProcesses.NullAggregator(); name = nameof(rs),
888897
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
889-
checks = false, kwargs...)
890-
jsys = convert(JumpSystem, rs; name, combinatoric_ratelaws, checks)
898+
expand_catalyst_funs = true, checks = false, kwargs...)
899+
jsys = convert(JumpSystem, rs; name, combinatoric_ratelaws,
900+
expand_catalyst_funs, checks)
891901
jsys = complete(jsys)
892902
return JumpProblem(jsys, prob, aggregator; kwargs...)
893903
end
@@ -905,9 +915,9 @@ function DiffEqBase.SteadyStateProblem(rs::ReactionSystem, u0,
905915
check_length = false, name = nameof(rs),
906916
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
907917
remove_conserved = false, include_zero_odes = true, checks = false,
908-
structural_simplify = false, kwargs...)
918+
expand_catalyst_funs = true, structural_simplify = false, kwargs...)
909919
osys = convert(ODESystem, rs; name, combinatoric_ratelaws, include_zero_odes, checks,
910-
remove_conserved)
920+
remove_conserved, expand_catalyst_funs)
911921

912922
# Handles potential differential algebraic equations (which requires `structural_simplify`).
913923
if structural_simplify

0 commit comments

Comments
 (0)