@@ -63,33 +63,55 @@ function JumpSystem(eqs, iv, states, ps; systems = JumpSystem[],
63
63
end
64
64
65
65
66
- generate_rate_function (js, rate) = ModelingToolkit. eval (
67
- build_function (rate, states (js), parameters (js),
66
+ generate_rate_function (js, rate) = build_function (rate, states (js), parameters (js),
68
67
independent_variable (js),
69
- expression= Val{true }))
68
+ expression= Val{true })
70
69
71
- generate_affect_function (js, affect, outputidxs) = ModelingToolkit. eval (
72
- build_function (affect, states (js),
70
+ generate_affect_function (js, affect, outputidxs) = build_function (affect, states (js),
73
71
parameters (js),
74
72
independent_variable (js),
75
73
expression= Val{true },
76
74
headerfun= add_integrator_header,
77
- outputidxs= outputidxs)[2 ])
75
+ outputidxs= outputidxs)[2 ]
78
76
79
77
function assemble_vrj (js, vrj, statetoid)
78
+ rate = eval (generate_rate_function (js, vrj. rate))
79
+ outputvars = (convert (Variable,affect. lhs) for affect in vrj. affect!)
80
+ outputidxs = ((statetoid[var] for var in outputvars). .. ,)
81
+ affect = eval (generate_affect_function (js, vrj. affect!, outputidxs))
82
+ VariableRateJump (rate, affect)
83
+ end
84
+
85
+ function assemble_vrj_expr (js, vrj, statetoid)
80
86
rate = generate_rate_function (js, vrj. rate)
81
87
outputvars = (convert (Variable,affect. lhs) for affect in vrj. affect!)
82
88
outputidxs = ((statetoid[var] for var in outputvars). .. ,)
83
89
affect = generate_affect_function (js, vrj. affect!, outputidxs)
84
- VariableRateJump (rate, affect)
90
+ quote
91
+ rate = $ rate
92
+ affect = $ affect
93
+ VariableRateJump (rate, affect)
94
+ end
85
95
end
86
96
87
97
function assemble_crj (js, crj, statetoid)
98
+ rate = eval (generate_rate_function (js, crj. rate))
99
+ outputvars = (convert (Variable,affect. lhs) for affect in crj. affect!)
100
+ outputidxs = ((statetoid[var] for var in outputvars). .. ,)
101
+ affect = eval (generate_affect_function (js, crj. affect!, outputidxs))
102
+ ConstantRateJump (rate, affect)
103
+ end
104
+
105
+ function assemble_crj_expr (js, crj, statetoid)
88
106
rate = generate_rate_function (js, crj. rate)
89
107
outputvars = (convert (Variable,affect. lhs) for affect in crj. affect!)
90
108
outputidxs = ((statetoid[var] for var in outputvars). .. ,)
91
109
affect = generate_affect_function (js, crj. affect!, outputidxs)
92
- ConstantRateJump (rate, affect)
110
+ quote
111
+ rate = $ rate
112
+ affect = $ affect
113
+ ConstantRateJump (rate, affect)
114
+ end
93
115
end
94
116
95
117
function assemble_maj (js, maj:: MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2,W2}}} ,
@@ -124,6 +146,38 @@ function assemble_maj(js, maj::MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2
124
146
return maj
125
147
end
126
148
149
+ function assemble_maj_expr (js, maj:: MassActionJump{U,Vector{Pair{V,W}},Vector{Pair{V2,W2}}} ,
150
+ statetoid, subber, invttype) where {U,V,W,V2,W2}
151
+ sr = maj. scaled_rates
152
+ if sr isa Operation
153
+ pval = subber (sr). value
154
+ elseif sr isa Variable
155
+ pval = subber (sr ()). value
156
+ else
157
+ pval = maj. scaled_rates
158
+ end
159
+
160
+ rs = Vector {Pair{Int,W}} ()
161
+ for (spec,stoich) in maj. reactant_stoch
162
+ if iszero (spec)
163
+ push! (rs, 0 => stoich)
164
+ else
165
+ push! (rs, statetoid[convert (Variable,spec)] => stoich)
166
+ end
167
+ end
168
+ sort! (rs)
169
+
170
+ ns = Vector {Pair{Int,W2}} ()
171
+ for (spec,stoich) in maj. net_stoch
172
+ iszero (spec) && error (" Net stoichiometry can not have a species labelled 0." )
173
+ push! (ns, statetoid[convert (Variable,spec)] => stoich)
174
+ end
175
+ sort! (ns)
176
+
177
+ maj = MassActionJump (convert (invttype, pval), rs, ns, scale_rates = false )
178
+ return maj
179
+ end
180
+
127
181
"""
128
182
```julia
129
183
function DiffEqBase.DiscreteProblem(sys::JumpSystem, u0map, tspan,
@@ -154,6 +208,40 @@ function DiffEqBase.DiscreteProblem(sys::JumpSystem, u0map, tspan::Tuple,
154
208
DiscreteProblem (df, u0, tspan, p; kwargs... )
155
209
end
156
210
211
+ """
212
+ ```julia
213
+ function DiffEqBase.DiscreteProblemExpr(sys::JumpSystem, u0map, tspan,
214
+ parammap=DiffEqBase.NullParameters; kwargs...)
215
+ ```
216
+
217
+ Generates a black DiscreteProblem for a JumpSystem to utilize as its
218
+ solving `prob.prob`. This is used in the case where there are no ODEs
219
+ and no SDEs associated with the system.
220
+
221
+ Continuing the example from the [`JumpSystem`](@ref) definition:
222
+ ```julia
223
+ using DiffEqBase, DiffEqJump
224
+ u₀map = [S => 999, I => 1, R => 0]
225
+ parammap = [β => .1/1000, γ => .01]
226
+ tspan = (0.0, 250.0)
227
+ dprob = DiscreteProblem(js, u₀map, tspan, parammap)
228
+ ```
229
+ """
230
+ function DiffEqBase. DiscreteProblemExpr (sys:: JumpSystem , u0map, tspan:: Tuple ,
231
+ parammap= DiffEqBase. NullParameters (); kwargs... )
232
+ u0 = varmap_to_vars (u0map, states (sys))
233
+ p = varmap_to_vars (parammap, parameters (sys))
234
+ # identity function to make syms works
235
+ # EvalFunc because we know that the jump functions are generated via eval
236
+ quote
237
+ f = DiffEqBase. EvalFunc (DiffEqBase. DISCRETE_INPLACE_DEFAULT)
238
+ u0 = $ u0
239
+ p = $ p
240
+ tspan = $ tspan
241
+ df = DiscreteFunction (f, syms= $ (Symbol .(states (sys))))
242
+ DiscreteProblem (df, u0, tspan, p; kwargs... )
243
+ end
244
+ end
157
245
158
246
"""
159
247
```julia
0 commit comments