@@ -91,13 +91,18 @@ function assemble_crj(js, crj, statetoid)
91
91
end
92
92
93
93
function assemble_maj (js, maj:: MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2,W2}}} ,
94
- statetoid, parammap) where {U,V,W,V2,W2}
94
+ statetoid, parammap, pcontext) where {U,V,W,V2,W2}
95
+
95
96
sr = maj. scaled_rates
96
- if sr isa Operation
97
- pval = simplify (substitute (sr,parammap)). value
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
98
103
elseif sr isa Variable
99
- pval = Dict ( parammap) [sr () ]
100
- else
104
+ pval = parammap[sr]
105
+ else
101
106
pval = maj. scaled_rates
102
107
end
103
108
@@ -164,10 +169,20 @@ sol = solve(jprob, SSAStepper())
164
169
function DiffEqJump. JumpProblem (js:: JumpSystem , prob, aggregator; kwargs... )
165
170
166
171
statetoid = Dict (convert (Variable,state) => i for (i,state) in enumerate (states (js)))
167
- parammap = map ((x,y) -> Pair ( x (),y), parameters (js), prob . p )
172
+ parammap = Dict ( convert (Variable,param) => prob . p[i] for (i,param) in enumerate ( parameters (js)) )
168
173
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
169
184
170
- majs = MassActionJump[assemble_maj (js, j, statetoid, parammap) for j in eqs. x[1 ]]
185
+ majs = MassActionJump[assemble_maj (js, j, statetoid, parammap, param_context ) for j in eqs. x[1 ]]
171
186
crjs = ConstantRateJump[assemble_crj (js, j, statetoid) for j in eqs. x[2 ]]
172
187
vrjs = VariableRateJump[assemble_vrj (js, j, statetoid) for j in eqs. x[3 ]]
173
188
((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
0 commit comments