Skip to content

Commit bd00bd2

Browse files
committed
hybrid equation tests
1 parent fa5a235 commit bd00bd2

File tree

2 files changed

+440
-6
lines changed

2 files changed

+440
-6
lines changed

src/reactionsystem.jl

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,6 +1615,7 @@ function Base.convert(::Type{<:NonlinearSystem}, rs::ReactionSystem; name = name
16151615
eqs = assemble_drift(fullrs, ispcs; combinatoric_ratelaws, remove_conserved,
16161616
as_odes = false, include_zero_odes)
16171617
eqs, sts, ps, obs, defs = addconstraints!(eqs, fullrs, ists, ispcs; remove_conserved)
1618+
eqs = [remove_diffs(eq.lhs) ~ remove_diffs(eq.rhs) for eq in eqs]
16181619

16191620
NonlinearSystem(eqs, sts, ps;
16201621
name,
@@ -1624,6 +1625,15 @@ function Base.convert(::Type{<:NonlinearSystem}, rs::ReactionSystem; name = name
16241625
kwargs...)
16251626
end
16261627

1628+
# Finds and differentials in an expression, and sets these to 0.
1629+
function remove_diffs(expr)
1630+
(expr isa Number) && (return expr)
1631+
return Symbolics.replace(expr, diff_2_zero)
1632+
end
1633+
diff_2_zero(expr) = (Symbolics.is_derivative(expr) ? 0.0 : expr)
1634+
1635+
1636+
16271637
"""
16281638
```julia
16291639
Base.convert(::Type{<:SDESystem},rs::ReactionSystem)
@@ -1652,7 +1662,7 @@ function Base.convert(::Type{<:SDESystem}, rs::ReactionSystem;
16521662
spatial_convert_err(rs::ReactionSystem, SDESystem)
16531663

16541664
flatrs = Catalyst.flatten(rs)
1655-
error_if_constraints(SDESystem, flatrs)
1665+
#error_if_constraints(SDESystem, flatrs)
16561666

16571667
remove_conserved && conservationlaws(flatrs)
16581668
ists, ispcs = get_indep_sts(flatrs, remove_conserved)
@@ -1740,7 +1750,7 @@ function DiffEqBase.ODEProblem(rs::ReactionSystem, u0, tspan,
17401750
osys = convert(ODESystem, rs; name, combinatoric_ratelaws, include_zero_odes, checks,
17411751
remove_conserved)
17421752

1743-
# Handles potential Differential algebraic equations.
1753+
# Handles potential differential algebraic equations (which requires `structural_simplify`).
17441754
if structural_simplify
17451755
(osys = MT.structural_simplify(osys))
17461756
elseif has_alg_equations(rs)
@@ -1772,13 +1782,22 @@ function DiffEqBase.SDEProblem(rs::ReactionSystem, u0, tspan,
17721782
p = DiffEqBase.NullParameters(), args...;
17731783
name = nameof(rs), combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
17741784
include_zero_odes = true, checks = false, check_length = false,
1775-
remove_conserved = false, kwargs...)
1785+
remove_conserved = false, structural_simplify = false, kwargs...)
17761786

17771787
u0map = symmap_to_varmap(rs, u0)
17781788
pmap = symmap_to_varmap(rs, p)
17791789
sde_sys = convert(SDESystem, rs; name, combinatoric_ratelaws,
17801790
include_zero_odes, checks, remove_conserved)
1781-
sde_sys = complete(sde_sys)
1791+
1792+
# Handles potential differential algebraic equations (which requires `structural_simplify`).
1793+
if structural_simplify
1794+
(sde_sys = MT.structural_simplify(sde_sys))
1795+
elseif has_alg_equations(rs)
1796+
error("The input ReactionSystem has algebraic equations. This requires setting `structural_simplify=true` within `ODEProblem` call.")
1797+
else
1798+
sde_sys = complete(sde_sys)
1799+
end
1800+
17821801
p_matrix = zeros(length(get_unknowns(sde_sys)), numreactions(rs))
17831802
return SDEProblem(sde_sys, u0map, tspan, pmap, args...; check_length,
17841803
noise_rate_prototype = p_matrix, kwargs...)
@@ -1813,12 +1832,21 @@ function DiffEqBase.SteadyStateProblem(rs::ReactionSystem, u0,
18131832
check_length = false, name = nameof(rs),
18141833
combinatoric_ratelaws = get_combinatoric_ratelaws(rs),
18151834
remove_conserved = false, include_zero_odes = true,
1816-
checks = false, kwargs...)
1835+
checks = false, structural_simplify=false, kwargs...)
18171836
u0map = symmap_to_varmap(rs, u0)
18181837
pmap = symmap_to_varmap(rs, p)
18191838
osys = convert(ODESystem, rs; name, combinatoric_ratelaws, include_zero_odes, checks,
18201839
remove_conserved)
1821-
osys = complete(osys)
1840+
1841+
# Handles potential differential algebraic equations (which requires `structural_simplify`).
1842+
if structural_simplify
1843+
(osys = MT.structural_simplify(osys))
1844+
elseif has_alg_equations(rs)
1845+
error("The input ReactionSystem has algebraic equations. This requires setting `structural_simplify=true` within `ODEProblem` call.")
1846+
else
1847+
osys = complete(osys)
1848+
end
1849+
18221850
return SteadyStateProblem(osys, u0map, pmap, args...; check_length, kwargs...)
18231851
end
18241852

0 commit comments

Comments
 (0)