11JumpType = Union{VariableRateJump, ConstantRateJump, MassActionJump}
22
3- struct JumpSystem <: AbstractSystem
4- eqs:: Vector{JumpType}
3+ struct JumpSystem{U <: ArrayPartition } <: AbstractSystem
4+ eqs:: U
55 iv:: Variable
66 states:: Vector{Variable}
77 ps:: Vector{Variable}
1111
1212function JumpSystem (eqs, iv, states, ps; systems = JumpSystem[],
1313 name = gensym (:JumpSystem ))
14- JumpSystem (eqs, iv, convert .(Variable, states), convert .(Variable, ps), name, systems)
15- end
1614
15+ ap = ArrayPartition (MassActionJump[], ConstantRateJump[], VariableRateJump[])
16+ for eq in eqs
17+ if eq isa MassActionJump
18+ push! (ap. x[1 ], eq)
19+ elseif eq isa ConstantRateJump
20+ push! (ap. x[2 ], eq)
21+ elseif eq isa VariableRateJump
22+ push! (ap. x[3 ], eq)
23+ else
24+ error (" JumpSystem equations must contain MassActionJumps, ConstantRateJumps, or VariableRateJumps." )
25+ end
26+ end
27+
28+ JumpSystem {typeof(ap)} (ap, convert (Variable,iv), convert .(Variable, states), convert .(Variable, ps), name, systems)
29+ end
1730
1831
1932generate_rate_function (js, rate) = build_function (rate, states (js), parameters (js),
@@ -26,6 +39,7 @@ generate_affect_function(js, affect, outputidxs) = build_function(affect, states
2639 expression= Val{false },
2740 headerfun= add_integrator_header,
2841 outputidxs= outputidxs)[2 ]
42+
2943function assemble_vrj (js, vrj, statetoid)
3044 rate = generate_rate_function (js, vrj. rate)
3145 outputvars = (convert (Variable,affect. lhs) for affect in vrj. affect!)
@@ -84,10 +98,13 @@ Generates a DiscreteProblem from an AbstractSystem
8498function DiffEqBase. DiscreteProblem (sys:: AbstractSystem , u0map, tspan:: Tuple ,
8599 parammap= DiffEqBase. NullParameters (); kwargs... )
86100 u0 = varmap_to_vars (u0map, states (sys))
87- p = varmap_to_vars (parammap, parameters (sys))
88- DiscreteProblem (u0, tspan, p; kwargs... )
101+ p = varmap_to_vars (parammap, parameters (sys))
102+ f = (du,u,p,t) -> du.= u # identity function to make syms works
103+ df = DiscreteFunction (f, syms= Symbol .(states (sys)))
104+ DiscreteProblem (df, u0, tspan, p; kwargs... )
89105end
90106
107+
91108"""
92109```julia
93110function DiffEqBase.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
@@ -96,25 +113,65 @@ function DiffEqBase.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
96113Generates a JumpProblem from a JumpSystem.
97114"""
98115function DiffEqJump. JumpProblem (js:: JumpSystem , prob, aggregator; kwargs... )
99- vrjs = Vector {VariableRateJump} ()
100- crjs = Vector {ConstantRateJump} ()
101- majs = Vector {MassActionJump} ()
102- pvars = parameters (js)
116+
103117 statetoid = Dict (convert (Variable,state) => i for (i,state) in enumerate (states (js)))
104- parammap = map ((x,y)-> Pair (x (),y),pvars,prob. p)
105-
106- for j in equations (js)
107- if j isa ConstantRateJump
108- push! (crjs, assemble_crj (js, j, statetoid))
109- elseif j isa VariableRateJump
110- push! (vrjs, assemble_vrj (js, j, statetoid))
111- elseif j isa MassActionJump
112- push! (majs, assemble_maj (js, j, statetoid, parammap))
113- else
114- error (" JumpSystems should only contain Constant, Variable or Mass Action Jumps." )
115- end
116- end
117- ((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
118+ parammap = map ((x,y)-> Pair (x (),y), parameters (js), prob. p)
119+ eqs = equations (js)
120+
121+ majs = MassActionJump[assemble_maj (js, j, statetoid, parammap) for j in eqs. x[1 ]]
122+ crjs = ConstantRateJump[assemble_crj (js, j, statetoid) for j in eqs. x[2 ]]
123+ vrjs = VariableRateJump[assemble_vrj (js, j, statetoid) for j in eqs. x[3 ]]
124+ ((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
118125 jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , isempty (majs) ? nothing : majs)
119- JumpProblem (prob, aggregator, jset)
126+
127+ if needs_vartojumps_map (aggregator) || needs_depgraph (aggregator)
128+ jdeps = asgraph (js)
129+ vdeps = variable_dependencies (js)
130+ vtoj = jdeps. badjlist
131+ jtov = vdeps. badjlist
132+ jtoj = needs_depgraph (aggregator) ? eqeq_dependencies (jdeps, vdeps). fadjlist : nothing
133+ else
134+ vtoj = nothing ; jtov = nothing ; jtoj = nothing
135+ end
136+
137+ JumpProblem (prob, aggregator, jset; dep_graph= jtoj, vartojumps_map= vtoj, jumptovars_map= jtov)
120138end
139+
140+
141+ # ## Functions to determine which states a jump depends on
142+ function get_variables! (dep, jump:: Union{ConstantRateJump,VariableRateJump} , variables)
143+ foreach (var -> (var in variables) && push! (dep, var), vars (jump. rate))
144+ dep
145+ end
146+
147+ function get_variables! (dep, jump:: MassActionJump , variables)
148+ jsr = jump. scaled_rates
149+
150+ if jsr isa Variable
151+ (jsr in variables) && push! (dep, jsr)
152+ elseif jsr isa Operation
153+ foreach (var -> (var in variables) && push! (dep, var), vars (jsr))
154+ end
155+
156+ for varasop in jump. reactant_stoch
157+ var = convert (Variable, varasop[1 ])
158+ (var in variables) && push! (dep, var)
159+ end
160+
161+ dep
162+ end
163+
164+ # ## Functions to determine which states are modified by a given jump
165+ function modified_states! (mstates, jump:: Union{ConstantRateJump,VariableRateJump} , sts)
166+ for eq in jump. affect!
167+ st = convert (Variable, eq. lhs)
168+ (st in sts) && push! (mstates, st)
169+ end
170+ end
171+
172+ function modified_states! (mstates, jump:: MassActionJump , sts)
173+ for (state,stoich) in jump. net_stoch
174+ st = convert (Variable, state)
175+ (st in sts) && push! (mstates, st)
176+ end
177+ end
0 commit comments