Skip to content

Commit a40879a

Browse files
committed
start adding JumpSystem features
1 parent 924b1fe commit a40879a

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ version = "3.0.2"
66
[deps]
77
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
88
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
9+
DiffEqJump = "c894b116-72e5-5b58-be3c-e6d8d4ac2b12"
910
DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
1011
Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
1112
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"

src/ModelingToolkit.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ using StaticArrays, LinearAlgebra, SparseArrays
55
using Latexify, Unitful, ArrayInterface
66
using MacroTools
77
using UnPack: @unpack
8+
using DiffEqJump: VariableRateJump, ConstantRateJump, MassActionJump
89

910
using Base.Threads
1011
import MacroTools: splitdef, combinedef, postwalk, striplines
@@ -87,6 +88,8 @@ include("systems/diffeqs/index_reduction.jl")
8788
include("systems/diffeqs/modelingtoolkitize.jl")
8889
include("systems/diffeqs/validation.jl")
8990

91+
include("systems/jumps/jumpsystem.jl")
92+
9093
include("systems/nonlinear/nonlinearsystem.jl")
9194

9295
include("systems/optimization/optimizationsystem.jl")

src/systems/jumps/jumpsystem.jl

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
JumpType = Union{VariableRateJump, ConstantRateJump, MassActionJump}
2+
3+
struct JumpSystem <: AbstractSystem
4+
eqs::Vector{JumpType}
5+
iv::Variable
6+
states::Vector{Variable}
7+
ps::Vector{Variable}
8+
name::Symbol
9+
systems::Vector{JumpSystem}
10+
end
11+
12+
function JumpSystem(eqs, iv, states, ps; systems = JumpSystem[],
13+
name = gensym(:JumpSystem))
14+
JumpSystem(eqs, iv, convert.(Variable, states), convert.(Variable, ps), name, systems)
15+
end
16+
17+
function generate_rate_function(js, rate)
18+
f = striplines(build_function(rate, states(js), parameters(js), independent_variable(js)))
19+
end
20+
21+
function generate_affect_function(js, affect)
22+
# waiting on integrator build_function form
23+
end
24+
25+
function assemble_vrj(js, vrj)
26+
rate = generate_rate_function(js, vrj.rate)
27+
affect = generate_affect_function(js, vrj.affect)
28+
VariableRateJump(rate, affect)
29+
end
30+
31+
function assemble_crj(js, crj)
32+
rate = generate_rate_function(js, vrj.rate)
33+
affect = generate_affect_function(js, vrj.affect)
34+
ConstantRateJump(rate, affect)
35+
end
36+
37+
function assemble_maj(maj, states_to_idxs, ps_to_idxs; scale_rate=false)
38+
39+
# mass action scaled_rates need to be a Number, but
40+
# operations are numbers, so can't check the type directly
41+
@assert !isa(maj.scaled_rates, Union{Operation,Variable})
42+
43+
rstype = fieldtypes(eltype(maj.reactant_stoch))[2]
44+
rs = Vector{Pair{valtype(states_to_idxs),rstype}}()
45+
for (spec,stoich) in maj.reactant_stoch
46+
push!(rs, states_to_idxs[spec] => stoich)
47+
end
48+
49+
nstype = fieldtypes(eltype(maj.net_stoch))[2]
50+
ns = Vector{Pair{valtype(states_to_idxs),nstype}}()
51+
for (spec,stoich) in maj.net_stoch
52+
push!(ns, states_to_idxs[spec] => stoich)
53+
end
54+
55+
MassActionJump(maj.scaled_rates, rs, ns, scale_rates=scale_rate)
56+
end

0 commit comments

Comments
 (0)