Skip to content

Commit f2eb60f

Browse files
committed
revert back to using a parameter eval module
1 parent 098cef4 commit f2eb60f

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

src/systems/jumps/jumpsystem.jl

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,18 @@ function assemble_crj(js, crj, statetoid)
9191
end
9292

9393
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+
9596
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
98103
elseif sr isa Variable
99-
pval = Dict(parammap)[sr()]
100-
else
104+
pval = parammap[sr]
105+
else
101106
pval = maj.scaled_rates
102107
end
103108

@@ -164,10 +169,20 @@ sol = solve(jprob, SSAStepper())
164169
function DiffEqJump.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
165170

166171
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)))
168173
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
169184

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]]
171186
crjs = ConstantRateJump[assemble_crj(js, j, statetoid) for j in eqs.x[2]]
172187
vrjs = VariableRateJump[assemble_vrj(js, j, statetoid) for j in eqs.x[3]]
173188
((prob isa DiscreteProblem) && !isempty(vrjs)) && error("Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps")

0 commit comments

Comments
 (0)