Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions lib/ModelingToolkitBase/src/problems/jumpproblem.jl
Original file line number Diff line number Diff line change
Expand Up @@ -254,19 +254,21 @@ function collect_vars!(
end

### Functions to determine which unknowns a jump depends on
function SU.search_variables!(dep, jump::Union{ConstantRateJump, VariableRateJump}; kw...)
_get_variables!(dep, expr, variables) = get_variables!(dep, expr, variables)

function _get_variables!(dep, jump::Union{ConstantRateJump, VariableRateJump}, variables)
jr = unwrap(jump.rate)
(jr isa SymbolicT) && SU.search_variables!(dep, jr; kw...)
(jr isa SymbolicT) && get_variables!(dep, jr, variables)
return dep
end

function SU.search_variables!(dep, jump::MassActionJump; is_atomic = SU.default_is_atomic, kw...)
function _get_variables!(dep, jump::MassActionJump, variables)
sr = unwrap(jump.scaled_rates)
(sr isa SymbolicT) && SU.search_variables!(dep, sr; is_atomic, kw...)
(sr isa SymbolicT) && get_variables!(dep, sr, variables)
for varasop in jump.reactant_stoch
var = unwrap(varasop[1])
var isa SymbolicT || continue
is_atomic(var) && push!(dep, var)
get_variables!(dep, var, variables)
end
return dep
end
Expand Down
4 changes: 2 additions & 2 deletions lib/ModelingToolkitBase/src/systems/dependency_graphs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ function equation_dependencies(

for (i, eq) in enumerate(eqs)
# For Equations, only examine RHS (dependencies, not what's modified).
# For jumps, use the whole object (specialized search_variables! handles it).
# For jumps, use the whole object so the local traversal handles their rate fields.
target = eq isa Equation ? eq.rhs : eq
get_variables!(deps, target, variables)
_get_variables!(deps, target, variables)
depeqs_to_vars[i] = [value(v) for v in deps]
empty!(deps)
end
Expand Down
13 changes: 13 additions & 0 deletions lib/ModelingToolkitBase/test/dep_graphs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,21 @@ using Test
using ModelingToolkitBase, Graphs, JumpProcesses, RecursiveArrayTools
using ModelingToolkitBase: t_nounits as t, D_nounits as D
import ModelingToolkitBase: value
import SymbolicUtils
using Symbolics: SymbolicT

@testset "Jump dependency search does not pirate SymbolicUtils" begin
jump_types = (ConstantRateJump, VariableRateJump, MassActionJump)
@test all(methods(SymbolicUtils.search_variables!)) do method
method.module !== ModelingToolkitBase || all(jump_types) do jump_type
typeintersect(
method.sig,
Tuple{typeof(SymbolicUtils.search_variables!), Any, jump_type}
) === Union{}
end
end
end

#################################
# testing for Jumps / all dgs
#################################
Expand Down
Loading