Skip to content

Commit 7e1e3e3

Browse files
committed
add vrj dep graph tests
1 parent f0719fb commit 7e1e3e3

File tree

3 files changed

+88
-11
lines changed

3 files changed

+88
-11
lines changed

src/systems/dependency_graphs.jl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ equation_dependencies(jumpsys)
3636
equation_dependencies(jumpsys, variables = parameters(jumpsys))
3737
```
3838
"""
39-
function equation_dependencies(sys::AbstractSystem; variables = unknowns(sys))
40-
eqs = equations(sys)
39+
function equation_dependencies(sys::AbstractSystem; variables = unknowns(sys),
40+
eqs = equations(sys))
4141
deps = Set()
4242
depeqs_to_vars = Vector{Vector}(undef, length(eqs))
4343

@@ -114,8 +114,9 @@ digr = asgraph(jumpsys)
114114
```
115115
"""
116116
function asgraph(sys::AbstractSystem; variables = unknowns(sys),
117-
variablestoids = Dict(v => i for (i, v) in enumerate(variables)))
118-
asgraph(equation_dependencies(sys, variables = variables), variablestoids)
117+
variablestoids = Dict(v => i for (i, v) in enumerate(variables)),
118+
eqs = equations(sys))
119+
asgraph(equation_dependencies(sys; variables, eqs), variablestoids)
119120
end
120121

121122
"""
@@ -141,8 +142,8 @@ variable_dependencies(jumpsys)
141142
```
142143
"""
143144
function variable_dependencies(sys::AbstractSystem; variables = unknowns(sys),
144-
variablestoids = nothing)
145-
eqs = equations(sys)
145+
variablestoids = nothing, eqs = equations(sys))
146+
146147
vtois = isnothing(variablestoids) ? Dict(v => i for (i, v) in enumerate(variables)) :
147148
variablestoids
148149

@@ -193,8 +194,8 @@ dg = asdigraph(digr, jumpsys)
193194
```
194195
"""
195196
function asdigraph(g::BipartiteGraph, sys::AbstractSystem; variables = unknowns(sys),
196-
equationsfirst = true)
197-
neqs = length(equations(sys))
197+
equationsfirst = true, eqs = equations(sys))
198+
neqs = length(eqs)
198199
nvars = length(variables)
199200
fadjlist = deepcopy(g.fadjlist)
200201
badjlist = deepcopy(g.badjlist)

src/systems/jumps/jumpsystem.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,10 +502,12 @@ function JumpProcesses.JumpProblem(js::JumpSystem, prob,
502502
error("Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps")
503503
jset = JumpSet(Tuple(vrjs), Tuple(crjs), nothing, majs)
504504

505+
# dep graphs are only for constant rate jumps
506+
nonvrjs = ArrayPartition(eqs.x[1], eqs.x[2])
505507
if needs_vartojumps_map(aggregator) || needs_depgraph(aggregator) ||
506508
(aggregator isa JumpProcesses.NullAggregator)
507-
jdeps = asgraph(js)
508-
vdeps = variable_dependencies(js)
509+
jdeps = asgraph(js; eqs = nonvrjs)
510+
vdeps = variable_dependencies(js; eqs = nonvrjs)
509511
vtoj = jdeps.badjlist
510512
jtov = vdeps.badjlist
511513
jtoj = needs_depgraph(aggregator) ? eqeq_dependencies(jdeps, vdeps).fadjlist :

test/dep_graphs.jl

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using Test
2-
using ModelingToolkit, Graphs, JumpProcesses
2+
using ModelingToolkit, Graphs, JumpProcesses, RecursiveArrayTools
33
using ModelingToolkit: t_nounits as t, D_nounits as D
44
import ModelingToolkit: value
55

@@ -72,6 +72,80 @@ end
7272
dg4 = varvar_dependencies(depsbg, deps2)
7373
@test dg == dg4
7474

75+
# testing when ignoring VariableRateJumps
76+
let
77+
@parameters k1 k2
78+
@variables S(t) I(t) R(t)
79+
j₁ = MassActionJump(k1, [0 => 1], [S => 1])
80+
j₂ = MassActionJump(k1, [S => 1], [S => -1])
81+
j₃ = MassActionJump(k2, [S => 1, I => 1], [S => -1, I => 1])
82+
j₄ = MassActionJump(k2, [S => 2, R => 1], [R => -1])
83+
j₅ = ConstantRateJump(k1 * I, [R ~ R + 1])
84+
j₆ = VariableRateJump(k1 * k2 / (1 + t) * S, [S ~ S - 1, R ~ R + 1])
85+
eqs = [j₁, j₂, j₃, j₄, j₅, j₆]
86+
@named js = JumpSystem(eqs, t, [S, I, R], [k1, k2])
87+
S = value(S);
88+
I = value(I);
89+
R = value(R);
90+
k1 = value(k1);
91+
k2 = value(k2);
92+
# eq to vars they depend on
93+
eq_sdeps = [Variable[], [S], [S, I], [S, R], [I]]
94+
eq_sidepsf = [Int[], [1], [1, 2], [1, 3], [2]]
95+
eq_sidepsb = [[2, 3, 4], [3, 5], [4]]
96+
97+
# filter out vrjs in making graphs
98+
eqs = ArrayPartition(equations(js).x[1], equations(js).x[2])
99+
deps = equation_dependencies(js; eqs)
100+
@test length(deps) == length(eq_sdeps)
101+
@test all(i -> isequal(Set(eq_sdeps[i]), Set(deps[i])), 1:length(eqs))
102+
depsbg = asgraph(js; eqs)
103+
@test depsbg.fadjlist == eq_sidepsf
104+
@test depsbg.badjlist == eq_sidepsb
105+
106+
# eq to params they depend on
107+
eq_pdeps = [[k1], [k1], [k2], [k2], [k1]]
108+
eq_pidepsf = [[1], [1], [2], [2], [1]]
109+
eq_pidepsb = [[1, 2, 5], [3, 4]]
110+
deps = equation_dependencies(js; variables = parameters(js), eqs)
111+
@test length(deps) == length(eq_pdeps)
112+
@test all(i -> isequal(Set(eq_pdeps[i]), Set(deps[i])), 1:length(eqs))
113+
depsbg2 = asgraph(js; variables = parameters(js), eqs)
114+
@test depsbg2.fadjlist == eq_pidepsf
115+
@test depsbg2.badjlist == eq_pidepsb
116+
117+
# var to eqs that modify them
118+
s_eqdepsf = [[1, 2, 3], [3], [4, 5]]
119+
s_eqdepsb = [[1], [1], [1, 2], [3], [3]]
120+
ne = 6
121+
bg = BipartiteGraph(ne, s_eqdepsf, s_eqdepsb)
122+
deps2 = variable_dependencies(js; eqs)
123+
@test isequal(bg, deps2)
124+
125+
# eq to eqs that depend on them
126+
eq_eqdeps = [[2, 3, 4], [2, 3, 4], [2, 3, 4, 5], [4], [4], [2, 3, 4]]
127+
dg = SimpleDiGraph(5)
128+
for (eqidx, eqdeps) in enumerate(eq_eqdeps)
129+
for eqdepidx in eqdeps
130+
add_edge!(dg, eqidx, eqdepidx)
131+
end
132+
end
133+
dg3 = eqeq_dependencies(depsbg, deps2)
134+
@test dg == dg3
135+
136+
# var to vars that depend on them
137+
var_vardeps = [[1, 2, 3], [1, 2, 3], [3]]
138+
ne = 7
139+
dg = SimpleDiGraph(3)
140+
for (vidx, vdeps) in enumerate(var_vardeps)
141+
for vdepidx in vdeps
142+
add_edge!(dg, vidx, vdepidx)
143+
end
144+
end
145+
dg4 = varvar_dependencies(depsbg, deps2)
146+
@test dg == dg4
147+
end
148+
75149
#####################################
76150
# testing for ODE/SDEs
77151
#####################################

0 commit comments

Comments
 (0)