|
1 | 1 | using Test
|
2 |
| -using ModelingToolkit, Graphs, JumpProcesses |
| 2 | +using ModelingToolkit, Graphs, JumpProcesses, RecursiveArrayTools |
3 | 3 | using ModelingToolkit: t_nounits as t, D_nounits as D
|
4 | 4 | import ModelingToolkit: value
|
5 | 5 |
|
|
72 | 72 | dg4 = varvar_dependencies(depsbg, deps2)
|
73 | 73 | @test dg == dg4
|
74 | 74 |
|
| 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 | + |
75 | 149 | #####################################
|
76 | 150 | # testing for ODE/SDEs
|
77 | 151 | #####################################
|
|
0 commit comments