@@ -185,24 +185,13 @@ function numericnstoich(mtrs::Vector{Pair{V,W}}, statetoid) where {V,W}
185
185
sort! (ns)
186
186
end
187
187
188
- # assemble a numeric MassActionJump from a MT MassActionJump representing one rx.
189
- function assemble_maj (maj:: MassActionJump , statetoid, subber, invttype)
190
- rval = subber (maj. scaled_rates)
191
- rs = numericrstoich (maj. reactant_stoch, statetoid)
192
- ns = numericnstoich (maj. net_stoch, statetoid)
193
- maj = MassActionJump (convert (invttype, value (rval)), rs, ns, scale_rates = false )
194
- maj
188
+ # assemble a numeric MassActionJump from a MT symbolics MassActionJumps
189
+ function assemble_maj (majv:: Vector{U} , statetoid, pmapper) where {U <: MassActionJump }
190
+ rs = [numericrstoich (maj. reactant_stoch, statetoid) for maj in majv]
191
+ ns = [numericnstoich (maj. net_stoch, statetoid) for maj in majv]
192
+ MassActionJump (rs, ns; param_mapper= pmapper, nocopy= true )
195
193
end
196
194
197
- # For MassActionJumps that contain many reactions
198
- # function assemble_maj(maj::MassActionJump{U,V,W}, statetoid, subber,
199
- # invttype) where {U <: AbstractVector,V,W}
200
- # rval = [convert(invttype,numericrate(sr, subber)) for sr in maj.scaled_rates]
201
- # rs = [numericrstoich(rs, statetoid) for rs in maj.reactant_stoch]
202
- # ns = [numericnstoich(ns, statetoid) for ns in maj.net_stoch]
203
- # maj = MassActionJump(rval, rs, ns, scale_rates = false)
204
- # maj
205
- # end
206
195
"""
207
196
```julia
208
197
function DiffEqBase.DiscreteProblem(sys::JumpSystem, u0map, tspan,
@@ -287,14 +276,13 @@ function DiffEqJump.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
287
276
288
277
# handling parameter substition and empty param vecs
289
278
p = (prob. p isa DiffEqBase. NullParameters || prob. p === nothing ) ? Num[] : prob. p
290
- parammap = map ((x,y)-> Pair (x,y), parameters (js), p)
291
- subber = substituter (parammap)
292
279
293
- majs = MassActionJump[assemble_maj (j, statetoid, subber, invttype) for j in eqs. x[1 ]]
280
+ majpmapper = JumpSysMajParamMapper (js, p; jseqs= eqs, rateconsttype= invttype)
281
+ majs = isempty (eqs. x[1 ]) ? nothing : assemble_maj (eqs. x[1 ], statetoid, majpmapper)
294
282
crjs = ConstantRateJump[assemble_crj (js, j, statetoid) for j in eqs. x[2 ]]
295
283
vrjs = VariableRateJump[assemble_vrj (js, j, statetoid) for j in eqs. x[3 ]]
296
284
((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
297
- jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , isempty (majs) ? nothing : majs)
285
+ jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , majs)
298
286
299
287
if needs_vartojumps_map (aggregator) || needs_depgraph (aggregator)
300
288
jdeps = asgraph (js)
@@ -306,7 +294,8 @@ function DiffEqJump.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
306
294
vtoj = nothing ; jtov = nothing ; jtoj = nothing
307
295
end
308
296
309
- JumpProblem (prob, aggregator, jset; dep_graph= jtoj, vartojumps_map= vtoj, jumptovars_map= jtov, kwargs... )
297
+ JumpProblem (prob, aggregator, jset; dep_graph= jtoj, vartojumps_map= vtoj, jumptovars_map= jtov,
298
+ scale_rates= false , nocopy= true , kwargs... )
310
299
end
311
300
312
301
@@ -338,3 +327,49 @@ function modified_states!(mstates, jump::MassActionJump, sts)
338
327
any (isequal (state), sts) && push! (mstates, state)
339
328
end
340
329
end
330
+
331
+
332
+
333
+ # ##################### parameter mapper ###########################
334
+ struct JumpSysMajParamMapper{U,V,W}
335
+ paramexprs:: U # the parameter expressions to use for each jump rate constant
336
+ sympars:: V # parameters(sys) from the underlying JumpSystem
337
+ subdict # mapping from an element of parameters(sys) to its current numerical value
338
+ end
339
+
340
+ function JumpSysMajParamMapper (js:: JumpSystem , p; jseqs= nothing , rateconsttype= Float64)
341
+ eqs = (jseqs === nothing ) ? equations (js) : jseqs
342
+ paramexprs = [maj. scaled_rates for maj in eqs. x[1 ]]
343
+ psyms = parameters (js)
344
+ paramdict = Dict (value (k) => value (v) for (k, v) in zip (psyms,p))
345
+ JumpSysMajParamMapper {typeof(paramexprs),typeof(psyms),rateconsttype} (paramexprs, psyms, paramdict)
346
+ end
347
+
348
+ function updateparams! (ratemap:: JumpSysMajParamMapper{U,V,W} , params) where {U <: AbstractArray , V <: AbstractArray , W}
349
+ for (i,p) in enumerate (params)
350
+ sympar = ratemap. sympars[i]
351
+ ratemap. subdict[sympar] = p
352
+ end
353
+ nothing
354
+ end
355
+
356
+ function updateparams! (:: JumpSysMajParamMapper{U,V,W} , params:: Nothing ) where {U <: AbstractArray , V <: AbstractArray , W}
357
+ nothing
358
+ end
359
+
360
+
361
+ # create the initial parameter vector for use in a MassActionJump
362
+ function (ratemap:: JumpSysMajParamMapper{U,V,W} )(params) where {U <: AbstractArray , V <: AbstractArray , W}
363
+ updateparams! (ratemap, params)
364
+ [convert (W,value (substitute (paramexpr, ratemap. subdict))) for paramexpr in ratemap. paramexprs]
365
+ end
366
+
367
+ # update a maj with parameter vectors
368
+ function (ratemap:: JumpSysMajParamMapper{U,V,W} )(maj:: MassActionJump , newparams; scale_rates, kwargs... ) where {U <: AbstractArray , V <: AbstractArray , W}
369
+ updateparams! (ratemap, newparams)
370
+ for i in 1 : get_num_majumps (maj)
371
+ maj. scaled_rates[i] = convert (W,value (substitute (ratemap. paramexprs[i], ratemap. subdict)))
372
+ end
373
+ scale_rates && DiffEqJump. scalerates! (maj. scaled_rates, maj. reactant_stoch)
374
+ nothing
375
+ end
0 commit comments