@@ -9,24 +9,24 @@ struct JumpSystem <: AbstractSystem
9
9
systems:: Vector{JumpSystem}
10
10
end
11
11
12
- function JumpSystem (eqs, iv, states, ps; systems = JumpSystem[],
12
+ function JumpSystem (eqs, iv, states, ps; systems = JumpSystem[],
13
13
name = gensym (:JumpSystem ))
14
14
JumpSystem (eqs, iv, convert .(Variable, states), convert .(Variable, ps), name, systems)
15
15
end
16
16
17
17
18
18
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),
21
21
expression= Val{false })
22
22
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),
25
25
independent_variable (js),
26
26
expression= Val{false },
27
- headerfun= add_integrator_header,
27
+ headerfun= add_integrator_header,
28
28
outputidxs= outputidxs)[2 ]
29
- function assemble_vrj (js, vrj, statetoid)
29
+ function assemble_vrj (js, vrj, statetoid)
30
30
rate = generate_rate_function (js, vrj. rate)
31
31
outputvars = (convert (Variable,affect. lhs) for affect in vrj. affect!)
32
32
outputidxs = ((statetoid[var] for var in outputvars). .. ,)
@@ -42,18 +42,20 @@ function assemble_crj(js, crj, statetoid)
42
42
ConstantRateJump (rate, affect)
43
43
end
44
44
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}
47
47
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
51
53
pval = maj. scaled_rates
52
54
end
53
-
55
+
54
56
rs = Vector {Pair{Int,W}} ()
55
57
for (spec,stoich) in maj. reactant_stoch
56
- if iszero (spec)
58
+ if iszero (spec)
57
59
push! (rs, 0 => stoich)
58
60
else
59
61
push! (rs, statetoid[convert (Variable,spec)] => stoich)
73
75
74
76
"""
75
77
```julia
76
- function DiffEqBase.DiscreteProblem(sys::AbstractSystem, u0map, tspan,
78
+ function DiffEqBase.DiscreteProblem(sys::AbstractSystem, u0map, tspan,
77
79
parammap=DiffEqBase.NullParameters; kwargs...)
78
80
```
79
81
80
82
Generates a DiscreteProblem from an AbstractSystem
81
83
"""
82
- function DiffEqBase. DiscreteProblem (sys:: AbstractSystem , u0map, tspan:: Tuple ,
84
+ function DiffEqBase. DiscreteProblem (sys:: AbstractSystem , u0map, tspan:: Tuple ,
83
85
parammap= DiffEqBase. NullParameters (); kwargs... )
84
86
u0 = varmap_to_vars (u0map, states (sys))
85
87
p = varmap_to_vars (parammap, parameters (sys))
@@ -99,29 +101,20 @@ function DiffEqJump.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
99
101
majs = Vector {MassActionJump} ()
100
102
pvars = parameters (js)
101
103
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)
112
105
113
106
for j in equations (js)
114
107
if j isa ConstantRateJump
115
108
push! (crjs, assemble_crj (js, j, statetoid))
116
109
elseif j isa VariableRateJump
117
110
push! (vrjs, assemble_vrj (js, j, statetoid))
118
111
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 ))
120
113
else
121
114
error (" JumpSystems should only contain Constant, Variable or Mass Action Jumps." )
122
115
end
123
116
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" )
125
118
jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , isempty (majs) ? nothing : majs)
126
119
JumpProblem (prob, aggregator, jset)
127
- end
120
+ end
0 commit comments