@@ -42,6 +42,29 @@ 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}
47
+ pval = Base. eval (pcontext, Expr (maj. scaled_rates))
48
+
49
+ rs = Vector {Pair{Int,W}} ()
50
+ for (spec,stoich) in maj. reactant_stoch
51
+ if iszero (spec)
52
+ push! (rs, 0 => stoich)
53
+ else
54
+ push! (rs, statetoid[convert (Variable,spec)] => stoich)
55
+ end
56
+ end
57
+ sort! (rs)
58
+
59
+ ns = Vector {Pair{Int,W2}} ()
60
+ for (spec,stoich) in maj. net_stoch
61
+ iszero (spec) && error (" Net stoichiometry can not have a species labelled 0." )
62
+ push! (ns, statetoid[convert (Variable,spec)] => stoich)
63
+ end
64
+ sort! (ns)
65
+
66
+ MassActionJump (pval, rs, ns, scale_rates = false )
67
+ end
45
68
46
69
"""
47
70
```julia
@@ -68,17 +91,32 @@ Generates a JumpProblem from a JumpSystem.
68
91
function DiffEqJump. JumpProblem (js:: JumpSystem , prob, aggregator; kwargs... )
69
92
vrjs = Vector {VariableRateJump} ()
70
93
crjs = Vector {ConstantRateJump} ()
94
+ majs = Vector {MassActionJump} ()
95
+ pvars = parameters (js)
71
96
statetoid = Dict (convert (Variable,state) => i for (i,state) in enumerate (states (js)))
97
+ ptoid = Dict (convert (Variable,par) => i for (i,par) in enumerate (parameters (js)))
98
+
99
+ # for mass action jumps might need to evaluate parameter expressions
100
+ # populate dummy module with params as local variables
101
+ # (for eval-ing parameter expressions)
102
+ param_context = Module ()
103
+ for (i, pval) in enumerate (prob. p)
104
+ psym = Symbol (pvars[i])
105
+ Base. eval (param_context, :($ psym = $ pval))
106
+ end
107
+
72
108
for j in equations (js)
73
109
if j isa ConstantRateJump
74
110
push! (crjs, assemble_crj (js, j, statetoid))
75
111
elseif j isa VariableRateJump
76
112
push! (vrjs, assemble_vrj (js, j, statetoid))
113
+ elseif j isa MassActionJump
114
+ push! (majs, assemble_maj (js, j, statetoid, ptoid, prob. p, param_context))
77
115
else
78
- (j isa MassActionJump) && error (" Generation of JumpProblems with MassActionJumps is not yet supported ." )
116
+ error (" JumpSystems should only contain Constant, Variable or Mass Action Jumps ." )
79
117
end
80
118
end
81
119
((prob isa DiscreteProblem) && ! isempty (vrjs)) && error (" Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps" )
82
- jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , nothing )
120
+ jset = JumpSet (Tuple (vrjs), Tuple (crjs), nothing , isempty (majs) ? nothing : majs )
83
121
JumpProblem (prob, aggregator, jset)
84
122
end
0 commit comments