Skip to content

Commit 97b73da

Browse files
remove MassActionJump evals -> substitute
1 parent ad15802 commit 97b73da

File tree

1 file changed

+22
-29
lines changed

1 file changed

+22
-29
lines changed

src/systems/jumps/jumpsystem.jl

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@ struct JumpSystem <: AbstractSystem
99
systems::Vector{JumpSystem}
1010
end
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)
1515
end
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)
4343
end
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)
@@ -73,13 +75,13 @@ end
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
8082
Generates 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

Comments
 (0)