@@ -92,6 +92,14 @@ function Reaction(rate, subs, prods; kwargs...)
92
92
Reaction (rate, subs, prods, sstoich, pstoich; kwargs... )
93
93
end
94
94
95
+ function namespace_equation (rx:: Reaction , name, iv)
96
+ Reaction (namespace_expr (rx. rate, name, iv),
97
+ namespace_expr (rx. substrates, name, iv),
98
+ namespace_expr (rx. products, name, iv),
99
+ rx. substoich, rx. prodstoich,
100
+ [namespace_expr (n[1 ],name,iv) => n[2 ] for n in rx. netstoich], rx. only_use_rate)
101
+ end
102
+
95
103
# calculates the net stoichiometry of a reaction as a vector of pairs (sub,substoich)
96
104
function get_netstoich (subs, prods, sstoich, pstoich)
97
105
# stoichiometry as a Dictionary
@@ -134,7 +142,7 @@ struct ReactionSystem <: AbstractSystem
134
142
""" The name of the system"""
135
143
name:: Symbol
136
144
""" systems: The internal systems"""
137
- systems:: Vector{ReactionSystem}
145
+ systems:: Vector
138
146
139
147
function ReactionSystem (eqs, iv, states, ps, observed, name, systems)
140
148
new (eqs, value (iv), value .(states), value .(ps), observed, name, systems)
@@ -143,13 +151,31 @@ end
143
151
144
152
function ReactionSystem (eqs, iv, species, params;
145
153
observed = [],
146
- systems = ReactionSystem [],
154
+ systems = [],
147
155
name = gensym (:ReactionSystem ))
148
156
149
- isempty (species) && error (" ReactionSystems require at least one species." )
157
+ # isempty(species) && error("ReactionSystems require at least one species.")
150
158
ReactionSystem (eqs, iv, species, params, observed, name, systems)
151
159
end
152
160
161
+ function ReactionSystem (iv; kwargs... )
162
+ ReactionSystem (Reaction[], iv, [], []; kwargs... )
163
+ end
164
+
165
+ function equations (sys:: ModelingToolkit.ReactionSystem )
166
+ eqs = get_eqs (sys)
167
+ systems = get_systems (sys)
168
+ if isempty (systems)
169
+ return eqs
170
+ else
171
+ eqs = [eqs;
172
+ reduce (vcat,
173
+ namespace_equations .(get_systems (sys));
174
+ init= [])]
175
+ return eqs
176
+ end
177
+ end
178
+
153
179
"""
154
180
oderatelaw(rx; combinatoric_ratelaw=true)
155
181
@@ -191,7 +217,7 @@ function assemble_oderhs(rs; combinatoric_ratelaws=true)
191
217
species_to_idx = Dict ((x => i for (i,x) in enumerate (sts)))
192
218
rhsvec = Any[0 for i in eachindex (sts)]
193
219
194
- for rx in equations (rs)
220
+ for rx in get_eqs (rs)
195
221
rl = oderatelaw (rx; combinatoric_ratelaw= combinatoric_ratelaws)
196
222
for (spec,stoich) in rx. netstoich
197
223
i = species_to_idx[spec]
@@ -212,9 +238,9 @@ function assemble_drift(rs; combinatoric_ratelaws=true, as_odes=true)
212
238
rhsvec = assemble_oderhs (rs; combinatoric_ratelaws= combinatoric_ratelaws)
213
239
if as_odes
214
240
D = Differential (get_iv (rs))
215
- eqs = [Equation (D (x),rhs) for (x,rhs) in zip (get_states (rs),rhsvec)]
241
+ eqs = [Equation (D (x),rhs) for (x,rhs) in zip (get_states (rs),rhsvec) if ( ! _iszero (rhs)) ]
216
242
else
217
- eqs = [Equation (0 ,rhs) for rhs in rhsvec]
243
+ eqs = [Equation (0 ,rhs) for rhs in rhsvec if ( ! _iszero (rhs)) ]
218
244
end
219
245
eqs
220
246
end
@@ -381,7 +407,7 @@ ignored.
381
407
function Base. convert (:: Type{<:ODESystem} , rs:: ReactionSystem ;
382
408
name= nameof (rs), combinatoric_ratelaws= true , kwargs... )
383
409
eqs = assemble_drift (rs; combinatoric_ratelaws= combinatoric_ratelaws)
384
- systems = convert . (ODESystem, get_systems (rs))
410
+ systems = map (sys -> (sys isa ODESystem) ? sys : convert (ODESystem, sys) , get_systems (rs))
385
411
ODESystem (eqs, get_iv (rs), get_states (rs), get_ps (rs), name= name, systems= systems)
386
412
end
387
413
0 commit comments