@@ -91,18 +91,13 @@ function assemble_crj(js, crj, statetoid)
9191end
9292
9393function assemble_maj (js, maj:: MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2,W2}}} ,
94- statetoid, parammap, pcontext) where {U,V,W,V2,W2}
95-
94+ statetoid, subber) where {U,V,W,V2,W2}
9695 sr = maj. scaled_rates
97- if sr isa Operation
98- if isempty (sr. args)
99- pval = parammap[sr. op]
100- else
101- pval = Base. eval (pcontext, Expr (maj. scaled_rates))
102- end
96+ if sr isa Operation
97+ pval = subber (sr). value
10398 elseif sr isa Variable
104- pval = parammap[sr]
105- else
99+ pval = subber ( sr ()) . value
100+ else
106101 pval = maj. scaled_rates
107102 end
108103
@@ -169,20 +164,11 @@ sol = solve(jprob, SSAStepper())
169164function DiffEqJump. JumpProblem (js:: JumpSystem , prob, aggregator; kwargs... )
170165
171166 statetoid = Dict (convert (Variable,state) => i for (i,state) in enumerate (states (js)))
172- parammap = Dict ( convert (Variable,param) => prob . p[i] for (i,param) in enumerate ( parameters (js)) )
167+ parammap = map ((x,y) -> Pair ( x (),y), parameters (js), prob . p )
173168 eqs = equations (js)
174-
175- # for mass action jumps might need to evaluate parameter expressions
176- # populate dummy module with params as local variables
177- # (for eval-ing parameter expressions)
178- pvars = parameters (js)
179- param_context = Module ()
180- for (i, pval) in enumerate (prob. p)
181- psym = Symbol (pvars[i])
182- Base. eval (param_context, :($ psym = $ pval))
183- end
184169
185- majs = MassActionJump[assemble_maj (js, j, statetoid, parammap, param_context) for j in eqs. x[1 ]]
170+ subber = substituter (first .(parammap), last .(parammap))
171+ majs = MassActionJump[assemble_maj (js, j, statetoid, subber) for j in eqs. x[1 ]]
186172 crjs = ConstantRateJump[assemble_crj (js, j, statetoid) for j in eqs. x[2 ]]
187173 vrjs = VariableRateJump[assemble_vrj (js, j, statetoid) for j in eqs. x[3 ]]
188174 ((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
@@ -225,4 +211,4 @@ function modified_states!(mstates, jump::MassActionJump, sts)
225211 for (state,stoich) in jump. net_stoch
226212 (state. op in sts) && push! (mstates, state)
227213 end
228- end
214+ end
0 commit comments