@@ -9,24 +9,24 @@ struct JumpSystem <: AbstractSystem
99 systems:: Vector{JumpSystem}
1010end
1111
12- function JumpSystem (eqs, iv, states, ps; systems = JumpSystem[],
12+ function JumpSystem (eqs, iv, states, ps; systems = JumpSystem[],
1313 name = gensym (:JumpSystem ))
1414 JumpSystem (eqs, iv, convert .(Variable, states), convert .(Variable, ps), name, systems)
1515end
1616
1717
1818
19- generate_rate_function (js, rate) = build_function (rate, states (js), parameters (js),
20- independent_variable (js),
19+ generate_rate_function (js, rate) = build_function (rate, states (js), parameters (js),
20+ independent_variable (js),
2121 expression= Val{false })
2222
23- generate_affect_function (js, affect, outputidxs) = build_function (affect, states (js),
24- parameters (js),
23+ generate_affect_function (js, affect, outputidxs) = build_function (affect, states (js),
24+ parameters (js),
2525 independent_variable (js),
2626 expression= Val{false },
27- headerfun= add_integrator_header,
27+ headerfun= add_integrator_header,
2828 outputidxs= outputidxs)[2 ]
29- function assemble_vrj (js, vrj, statetoid)
29+ function assemble_vrj (js, vrj, statetoid)
3030 rate = generate_rate_function (js, vrj. rate)
3131 outputvars = (convert (Variable,affect. lhs) for affect in vrj. affect!)
3232 outputidxs = ((statetoid[var] for var in outputvars). .. ,)
@@ -42,18 +42,20 @@ function assemble_crj(js, crj, statetoid)
4242 ConstantRateJump (rate, affect)
4343end
4444
45- function assemble_maj (js, maj:: MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2,W2}}} ,
46- statetoid, ptoid, p, pcontext ) where {U,V,W,V2,W2}
45+ function assemble_maj (js, maj:: MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2,W2}}} ,
46+ statetoid, ptoid, parammap ) where {U,V,W,V2,W2}
4747 sr = maj. scaled_rates
48- if sr isa Operation || sr isa Variable
49- pval = Base. eval (pcontext, Expr (maj. scaled_rates))
50- else
48+ if sr isa Operation
49+ pval = substitute (sr,parammap)
50+ elseif sr isa Variable
51+ pval = Dict (parammap)[sr ()]
52+ else
5153 pval = maj. scaled_rates
5254 end
53-
55+
5456 rs = Vector {Pair{Int,W}} ()
5557 for (spec,stoich) in maj. reactant_stoch
56- if iszero (spec)
58+ if iszero (spec)
5759 push! (rs, 0 => stoich)
5860 else
5961 push! (rs, statetoid[convert (Variable,spec)] => stoich)
7375
7476"""
7577```julia
76- function DiffEqBase.DiscreteProblem(sys::AbstractSystem, u0map, tspan,
78+ function DiffEqBase.DiscreteProblem(sys::AbstractSystem, u0map, tspan,
7779 parammap=DiffEqBase.NullParameters; kwargs...)
7880```
7981
8082Generates a DiscreteProblem from an AbstractSystem
8183"""
82- function DiffEqBase. DiscreteProblem (sys:: AbstractSystem , u0map, tspan:: Tuple ,
84+ function DiffEqBase. DiscreteProblem (sys:: AbstractSystem , u0map, tspan:: Tuple ,
8385 parammap= DiffEqBase. NullParameters (); kwargs... )
8486 u0 = varmap_to_vars (u0map, states (sys))
8587 p = varmap_to_vars (parammap, parameters (sys))
@@ -99,29 +101,20 @@ function DiffEqJump.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
99101 majs = Vector {MassActionJump} ()
100102 pvars = parameters (js)
101103 statetoid = Dict (convert (Variable,state) => i for (i,state) in enumerate (states (js)))
102- ptoid = Dict (convert (Variable,par) => i for (i,par) in enumerate (parameters (js)))
103-
104- # for mass action jumps might need to evaluate parameter expressions
105- # populate dummy module with params as local variables
106- # (for eval-ing parameter expressions)
107- param_context = Module ()
108- for (i, pval) in enumerate (prob. p)
109- psym = Symbol (pvars[i])
110- Base. eval (param_context, :($ psym = $ pval))
111- end
104+ parammap = map (Pair,pvars,prob. p)
112105
113106 for j in equations (js)
114107 if j isa ConstantRateJump
115108 push! (crjs, assemble_crj (js, j, statetoid))
116109 elseif j isa VariableRateJump
117110 push! (vrjs, assemble_vrj (js, j, statetoid))
118111 elseif j isa MassActionJump
119- push! (majs, assemble_maj (js, j, statetoid, ptoid, prob . p, param_context ))
112+ push! (majs, assemble_maj (js, j, statetoid, parammap ))
120113 else
121114 error (" JumpSystems should only contain Constant, Variable or Mass Action Jumps." )
122115 end
123116 end
124- ((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
117+ ((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
125118 jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , isempty (majs) ? nothing : majs)
126119 JumpProblem (prob, aggregator, jset)
127- end
120+ end
0 commit comments