Skip to content

Commit b7b1a97

Browse files
add a lot of expr construction pieces
1 parent e8a5739 commit b7b1a97

File tree

1 file changed

+96
-8
lines changed

1 file changed

+96
-8
lines changed

src/systems/jumps/jumpsystem.jl

Lines changed: 96 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,33 +63,55 @@ function JumpSystem(eqs, iv, states, ps; systems = JumpSystem[],
6363
end
6464

6565

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),
6867
independent_variable(js),
69-
expression=Val{true}))
68+
expression=Val{true})
7069

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),
7371
parameters(js),
7472
independent_variable(js),
7573
expression=Val{true},
7674
headerfun=add_integrator_header,
77-
outputidxs=outputidxs)[2])
75+
outputidxs=outputidxs)[2]
7876

7977
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)
8086
rate = generate_rate_function(js, vrj.rate)
8187
outputvars = (convert(Variable,affect.lhs) for affect in vrj.affect!)
8288
outputidxs = ((statetoid[var] for var in outputvars)...,)
8389
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
8595
end
8696

8797
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)
88106
rate = generate_rate_function(js, crj.rate)
89107
outputvars = (convert(Variable,affect.lhs) for affect in crj.affect!)
90108
outputidxs = ((statetoid[var] for var in outputvars)...,)
91109
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
93115
end
94116

95117
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
124146
return maj
125147
end
126148

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+
127181
"""
128182
```julia
129183
function DiffEqBase.DiscreteProblem(sys::JumpSystem, u0map, tspan,
@@ -154,6 +208,40 @@ function DiffEqBase.DiscreteProblem(sys::JumpSystem, u0map, tspan::Tuple,
154208
DiscreteProblem(df, u0, tspan, p; kwargs...)
155209
end
156210

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
157245

158246
"""
159247
```julia

0 commit comments

Comments
 (0)