Skip to content

Commit 978ba6c

Browse files
Merge pull request #442 from TorkelE/ReactionSystem_2_SteadyStateProblem
Enable creation of Steady State Problems from Reaction Systems.
2 parents fc98fc4 + 01af3e4 commit 978ba6c

File tree

6 files changed

+66
-4
lines changed

6 files changed

+66
-4
lines changed

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ julia = "1.2"
5151

5252
[extras]
5353
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
54+
SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f"
5455
StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
5556
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
5657

5758
[targets]
58-
test = ["OrdinaryDiffEq", "Test", "StochasticDiffEq"]
59+
test = ["OrdinaryDiffEq", "SteadyStateDiffEq", "Test", "StochasticDiffEq"]

src/ModelingToolkit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ include("build_function.jl")
112112
export ODESystem, ODEFunction
113113
export SDESystem, SDEFunction
114114
export JumpSystem
115-
export ODEProblem, SDEProblem, NonlinearProblem, OptimizationProblem
115+
export ODEProblem, SDEProblem, NonlinearProblem, OptimizationProblem, SteadyStateProblem
116116
export JumpProblem, DiscreteProblem
117117
export NonlinearSystem, OptimizationSystem
118118
export ode_order_lowering

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,39 @@ function DiffEqBase.ODEProblem{iip}(sys::AbstractODESystem,u0map,tspan,
223223
sparse=sparse)
224224
ODEProblem{iip}(f,u0,tspan,p;kwargs...)
225225
end
226+
227+
228+
### Enables Steady State Problems ###
229+
function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem, args...; kwargs...)
230+
SteadyStateProblem{true}(sys, args...; kwargs...)
231+
end
232+
233+
"""
234+
```julia
235+
function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem,u0map,tspan,
236+
parammap=DiffEqBase.NullParameters();
237+
version = nothing, tgrad=false,
238+
jac = false, Wfact = false,
239+
checkbounds = false, sparse = false,
240+
linenumbers = true, parallel=SerialForm(),
241+
kwargs...) where iip
242+
```
243+
Generates an SteadyStateProblem from an ODESystem and allows for automatically
244+
symbolically calculating numerical enhancements.
245+
"""
246+
function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem,u0map,
247+
parammap=DiffEqBase.NullParameters();
248+
version = nothing, tgrad=false,
249+
jac = false, Wfact = false,
250+
checkbounds = false, sparse = false,
251+
linenumbers = true, parallel=SerialForm(),
252+
kwargs...) where iip
253+
dvs = states(sys)
254+
ps = parameters(sys)
255+
u0 = varmap_to_vars(u0map,dvs)
256+
p = varmap_to_vars(parammap,ps)
257+
f = ODEFunction(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,Wfact=Wfact,checkbounds=checkbounds,
258+
linenumbers=linenumbers,parallel=parallel,
259+
sparse=sparse)
260+
SteadyStateProblem(f,u0,p;kwargs...)
261+
end

src/systems/reaction/reactionsystem.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ explicitly on the independent variable (usually time).
236236
function ismassaction(rx, rs; rxvars = get_variables(rx.rate),
237237
haveivdep = any(var -> isequal(rs.iv,convert(Variable,var)), rxvars))
238238
# if no dependencies must be zero order
239-
if isempty(rxvars)
239+
if isempty(rxvars)
240240
return true
241241
else
242242
return !(haveivdep || rx.only_use_rate || any(convert(Variable,rxv) in states(rs) for rxv in rxvars))
@@ -246,7 +246,7 @@ end
246246
function assemble_jumps(rs)
247247
eqs = Vector{Union{ConstantRateJump, MassActionJump, VariableRateJump}}()
248248

249-
for rx in equations(rs)
249+
for rx in equations(rs)
250250
rxvars = (rx.rate isa Operation) ? get_variables(rx.rate) : Operation[]
251251
haveivdep = any(var -> isequal(rs.iv,convert(Variable,var)), rxvars)
252252
if ismassaction(rx, rs; rxvars=rxvars, haveivdep=haveivdep)
@@ -366,3 +366,10 @@ end
366366
function DiffEqJump.JumpProblem(rs::ReactionSystem, prob, aggregator, args...; kwargs...)
367367
return JumpProblem(convert(JumpSystem,rs), prob, aggregator, args...; kwargs...)
368368
end
369+
370+
# SteadyStateProblem from AbstractReactionNetwork
371+
function DiffEqBase.SteadyStateProblem(rs::ReactionSystem, u0::Union{AbstractArray, Number}, p, args...; kwargs...)
372+
#u0 = typeof(u0) <: Array{<:Pair} ? u0 : Pair.(rs.states,u0)
373+
#p = typeof(p) <: Array{<:Pair} ? p : Pair.(rs.ps,p)
374+
return SteadyStateProblem(ODEFunction(convert(ODESystem,rs)),u0,p, args...; kwargs...)
375+
end

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ using SafeTestsets, Test
88
@safetestset "Build Function Test" begin include("build_function.jl") end
99
@safetestset "ODESystem Test" begin include("odesystem.jl") end
1010
@safetestset "Mass Matrix Test" begin include("mass_matrix.jl") end
11+
@safetestset "SteadyStateSystem Test" begin include("steadystatesystems.jl") end
1112
@safetestset "SDESystem Test" begin include("sdesystem.jl") end
1213
@safetestset "NonlinearSystem Test" begin include("nonlinearsystem.jl") end
1314
@safetestset "OptimizationSystem Test" begin include("optimizationsystem.jl") end

test/steadystatesystems.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using ModelingToolkit
2+
using SteadyStateDiffEq
3+
using Test
4+
5+
@parameters t r
6+
@variables x(t)
7+
@derivatives D'~t
8+
eqs = [D(x) ~ x^2-r]
9+
de = ODESystem(eqs)
10+
11+
for factor in [1e-1, 1e0, 1e10], u0_p in [(2.34,2.676),(22.34,1.632),(.3,15.676),(0.3,0.006)]
12+
u0 = [x => factor*u0_p[1]]
13+
p = [r => factor*u0_p[2]]
14+
ss_prob = SteadyStateProblem(de,u0,p)
15+
sol = solve(ss_prob,SSRootfind()).u[1]
16+
@test abs(sol^2 - factor*u0_p[2]) < 1e-8
17+
end

0 commit comments

Comments
 (0)