@@ -160,13 +160,40 @@ function JumpSystem(eqs, iv, unknowns, ps;
160160 metadata = nothing ,
161161 gui_metadata = nothing ,
162162 kwargs... )
163+
164+ # variable processing, similar to ODESystem
163165 name === nothing &&
164166 throw (ArgumentError (" The `name` keyword must be provided. Please consider using the `@named` macro" ))
165- eqs = scalarize .(eqs)
167+ iv′ = value (iv)
168+ us′ = value .(unknowns)
169+ ps′ = value .(ps)
170+ parameter_dependencies, ps′ = process_parameter_dependencies (
171+ parameter_dependencies, ps′)
172+ if ! (isempty (default_u0) && isempty (default_p))
173+ Base. depwarn (
174+ " `default_u0` and `default_p` are deprecated. Use `defaults` instead." ,
175+ :JumpSystem , force = true )
176+ end
177+ defaults = Dict {Any, Any} (todict (defaults))
178+ var_to_name = Dict ()
179+ process_variables! (var_to_name, defaults, us′)
180+ process_variables! (var_to_name, defaults, ps′)
181+ process_variables! (var_to_name, defaults, [eq. lhs for eq in parameter_dependencies])
182+ process_variables! (var_to_name, defaults, [eq. rhs for eq in parameter_dependencies])
183+ # ! format: off
184+ defaults = Dict {Any, Any} (value (k) => value (v) for (k, v) in pairs (defaults) if value (v) != = nothing )
185+ # ! format: on
186+ isempty (observed) || collect_var_to_name! (var_to_name, (eq. lhs for eq in observed))
187+
166188 sysnames = nameof .(systems)
167189 if length (unique (sysnames)) != length (sysnames)
168190 throw (ArgumentError (" System names must be unique." ))
169191 end
192+
193+ # equation processing
194+ # this and the treatment of continuous events are the only part
195+ # unique to JumpSystems
196+ eqs = scalarize .(eqs)
170197 ap = ArrayPartition (MassActionJump[], ConstantRateJump[], VariableRateJump[])
171198 for eq in eqs
172199 if eq isa MassActionJump
@@ -179,30 +206,42 @@ function JumpSystem(eqs, iv, unknowns, ps;
179206 error (" JumpSystem equations must contain MassActionJumps, ConstantRateJumps, or VariableRateJumps." )
180207 end
181208 end
182- if ! (isempty (default_u0) && isempty (default_p))
183- Base. depwarn (
184- " `default_u0` and `default_p` are deprecated. Use `defaults` instead." ,
185- :JumpSystem , force = true )
186- end
187- defaults = todict (defaults)
188- defaults = Dict (value (k) => value (v)
189- for (k, v) in pairs (defaults) if value (v) != = nothing )
190209
191- unknowns, ps = value .(unknowns), value .(ps)
192- var_to_name = Dict ()
193- process_variables! (var_to_name, defaults, unknowns)
194- process_variables! (var_to_name, defaults, ps)
195- isempty (observed) || collect_var_to_name! (var_to_name, (eq. lhs for eq in observed))
196210 (continuous_events === nothing ) ||
197211 error (" JumpSystems currently only support discrete events." )
198212 disc_callbacks = SymbolicDiscreteCallbacks (discrete_events)
199- parameter_dependencies, ps = process_parameter_dependencies (parameter_dependencies, ps)
213+
200214 JumpSystem {typeof(ap)} (Threads. atomic_add! (SYSTEM_COUNT, UInt (1 )),
201- ap, value (iv), unknowns , ps, var_to_name, observed, name, description, systems,
215+ ap, iv′, us′ , ps′ , var_to_name, observed, name, description, systems,
202216 defaults, connector_type, disc_callbacks, parameter_dependencies,
203217 metadata, gui_metadata, checks = checks)
204218end
205219
220+ # #### MTK dispatches for JumpSystems #####
221+ eqtype_supports_collect_vars (j:: MassActionJump ) = true
222+ function collect_vars! (unknowns, parameters, j:: MassActionJump , iv; depth = 0 ,
223+ op = Differential)
224+ collect_vars! (unknowns, parameters, j. scaled_rates, iv; depth, op)
225+ for field in (j. reactant_stoch, j. net_stoch)
226+ for el in field
227+ collect_vars! (unknowns, parameters, el, iv; depth, op)
228+ end
229+ end
230+ return nothing
231+ end
232+
233+ eqtype_supports_collect_vars (j:: Union{ConstantRateJump, VariableRateJump} ) = true
234+ function collect_vars! (unknowns, parameters, j:: Union{ConstantRateJump, VariableRateJump} ,
235+ iv; depth = 0 , op = Differential)
236+ collect_vars! (unknowns, parameters, j. rate, iv; depth, op)
237+ for eq in j. affect!
238+ (eq isa Equation) && collect_vars! (unknowns, parameters, eq, iv; depth, op)
239+ end
240+ return nothing
241+ end
242+
243+ # #########################################
244+
206245has_massactionjumps (js:: JumpSystem ) = ! isempty (equations (js). x[1 ])
207246has_constantratejumps (js:: JumpSystem ) = ! isempty (equations (js). x[2 ])
208247has_variableratejumps (js:: JumpSystem ) = ! isempty (equations (js). x[3 ])
@@ -240,9 +279,8 @@ function assemble_vrj(
240279
241280 outputvars = (value (affect. lhs) for affect in vrj. affect!)
242281 outputidxs = [unknowntoid[var] for var in outputvars]
243- affect = eval_or_rgf (
244- generate_affect_function (js, vrj. affect!,
245- outputidxs); eval_expression, eval_module)
282+ affect = eval_or_rgf (generate_affect_function (js, vrj. affect!, outputidxs);
283+ eval_expression, eval_module)
246284 VariableRateJump (rate, affect)
247285end
248286
@@ -269,9 +307,8 @@ function assemble_crj(
269307
270308 outputvars = (value (affect. lhs) for affect in crj. affect!)
271309 outputidxs = [unknowntoid[var] for var in outputvars]
272- affect = eval_or_rgf (
273- generate_affect_function (js, crj. affect!,
274- outputidxs); eval_expression, eval_module)
310+ affect = eval_or_rgf (generate_affect_function (js, crj. affect!, outputidxs);
311+ eval_expression, eval_module)
275312 ConstantRateJump (rate, affect)
276313end
277314
0 commit comments