|
1 |
| -### Fetch Packages and Set Global Variables ### |
2 |
| -using DiffEqBase, Catalyst, Random, Symbolics, Test |
3 |
| -using ModelingToolkit: get_unknowns, get_ps |
4 |
| -t = default_t() |
| 1 | +### Prepares Tests ### |
| 2 | + |
| 3 | +# Fetch packages. |
| 4 | +using Catalyst, Test |
| 5 | +import Symbolics: derivative |
5 | 6 |
|
| 7 | +# Sets stable rng number. |
6 | 8 | using StableRNGs
|
7 | 9 | rng = StableRNG(12345)
|
8 | 10 |
|
| 11 | +# Sets the default `t` to use. |
| 12 | +t = default_t() |
| 13 | + |
9 | 14 | # Fetch test functions.
|
10 | 15 | include("../test_functions.jl")
|
11 | 16 |
|
12 |
| -### Tests Custom Functions ### |
| 17 | + |
| 18 | +### Basic Tests ### |
| 19 | + |
| 20 | +# Compares network written with and without special functions. |
13 | 21 | let
|
14 | 22 | new_hill(x, v, k, n) = v * x^n / (k^n + x^n)
|
15 | 23 | new_poly(x, p1, p2) = 0.5 * p1 * x^2
|
|
45 | 53 | end
|
46 | 54 | end
|
47 | 55 |
|
48 |
| -### Tests that the various notations gives identical results ### |
49 |
| - |
50 |
| -# Michaelis-Menten function. |
51 |
| -let |
52 |
| - mm_network = @reaction_network begin |
53 |
| - (1.0, 1.0), 0 ↔ X |
54 |
| - mm(X, v, K), 0 --> X1 |
55 |
| - mm(X, v, K), 0 --> X2 |
56 |
| - mm(X, v, K), 0 --> X3 |
57 |
| - end |
58 |
| - f_mm = ODEFunction(complete(convert(ODESystem, mm_network)), jac = true) |
59 |
| - |
60 |
| - u0 = 10 * rand(rng, length(get_unknowns(mm_network))) |
61 |
| - p = 10 * rand(rng, length(get_ps(mm_network))) |
62 |
| - t = 10 * rand(rng) |
63 |
| - |
64 |
| - f_mm_output = f_mm(u0, p, t)[2:end] |
65 |
| - f_mm_jac_output = f_mm.jac(u0, p, t)[2:end, 1] |
66 |
| - @test (maximum(f_mm_output) - minimum(f_mm_output)) .< 100 * eps() |
67 |
| - @test (maximum(f_mm_jac_output) - minimum(f_mm_jac_output)) .< 100 * eps() |
68 |
| -end |
69 |
| - |
70 |
| -# Repressing Michaelis-Menten function. |
71 |
| -let |
72 |
| - mmr_network = @reaction_network begin |
73 |
| - (1.0, 1.0), 0 ↔ X |
74 |
| - mmr(X, v, K), 0 --> X1 |
75 |
| - mmr(X, v, K), 0 --> X2 |
76 |
| - mmr(X, v, K), 0 --> X3 |
77 |
| - end |
78 |
| - f_mmr = ODEFunction(complete(convert(ODESystem, mmr_network)), jac = true) |
79 |
| - |
80 |
| - u0 = 10 * rand(rng, length(get_unknowns(mmr_network))) |
81 |
| - p = 10 * rand(rng, length(get_ps(mmr_network))) |
82 |
| - t = 10 * rand(rng) |
83 |
| - |
84 |
| - f_mmr_output = f_mmr(u0, p, t)[2:end] |
85 |
| - f_mmr_jac_output = f_mmr.jac(u0, p, t)[2:end, 1] |
86 |
| - @test (maximum(f_mmr_output) - minimum(f_mmr_output)) .< 100 * eps() |
87 |
| - @test (maximum(f_mmr_jac_output) - minimum(f_mmr_jac_output)) .< 100 * eps() |
88 |
| -end |
89 |
| - |
90 |
| -# Hill function. |
91 |
| -let |
92 |
| - hill_network = @reaction_network begin |
93 |
| - (1.0, 1.0), 0 ↔ X |
94 |
| - hill(X, v, K, 2), 0 --> X1 |
95 |
| - hill(X, v, K, 2), 0 --> X2 |
96 |
| - end |
97 |
| - f_hill = ODEFunction(complete(convert(ODESystem, hill_network)), jac = true) |
98 |
| - |
99 |
| - u0 = 10 * rand(rng, length(get_unknowns(hill_network))) |
100 |
| - p = 10 * rand(rng, length(get_ps(hill_network))) |
101 |
| - t = 10 * rand(rng) |
102 |
| - |
103 |
| - f_hill_output = f_hill(u0, p, t)[2:end] |
104 |
| - f_hill_jac_output = f_hill.jac(u0, p, t)[2:end, 1] |
105 |
| - @test (maximum(f_hill_output) - minimum(f_hill_output)) .< 100 * eps() |
106 |
| - @test (maximum(f_hill_jac_output) - minimum(f_hill_jac_output)) .< 100 * eps() |
107 |
| -end |
108 |
| - |
109 |
| -# Repressing Hill function. |
110 |
| -let |
111 |
| - hillr_network = @reaction_network begin |
112 |
| - (1.0, 1.0), 0 ↔ X |
113 |
| - hillr(X, v, K, 2), 0 --> X1 |
114 |
| - hillr(X, v, K, 2), 0 --> X2 |
115 |
| - end |
116 |
| - f_hillr = ODEFunction(complete(convert(ODESystem, hillr_network)), jac = true) |
117 |
| - |
118 |
| - u0 = 10 * rand(rng, length(get_unknowns(hillr_network))) |
119 |
| - p = 10 * rand(rng, length(get_ps(hillr_network))) |
120 |
| - t = 10 * rand(rng) |
121 |
| - |
122 |
| - f_hillr_output = f_hillr(u0, p, t)[2:end] |
123 |
| - f_hillr_jac_output = f_hillr.jac(u0, p, t)[2:end, 1] |
124 |
| - @test (maximum(f_hillr_output) - minimum(f_hillr_output)) .< 100 * eps() |
125 |
| - @test (maximum(f_hillr_jac_output) - minimum(f_hillr_jac_output)) .< 100 * eps() |
126 |
| -end |
127 |
| - |
128 |
| -# Activation/repressing Hill function. |
129 |
| -let |
130 |
| - hillar_network = @reaction_network begin |
131 |
| - (1.0, 1.0), 0 ↔ (X, Y) |
132 |
| - hillar(X, Y, v, K, 2), 0 --> X1 |
133 |
| - hillar(X, Y, v, K, 2), 0 --> X2 |
134 |
| - hillar(X, Y, v, K, 2), 0 --> X3 |
135 |
| - hillar(X, Y, v, K, 2), 0 --> X4 |
136 |
| - end |
137 |
| - f_hillar = ODEFunction(complete(convert(ODESystem, hillar_network)), jac = true) |
138 |
| - |
139 |
| - u0 = 10 * rand(rng, length(get_unknowns(hillar_network))) |
140 |
| - p = 10 * rand(rng, length(get_ps(hillar_network))) |
141 |
| - t = 10 * rand(rng) |
142 |
| - |
143 |
| - f_hillar_output = f_hillar(u0, p, t)[3:end] |
144 |
| - f_hillar_jac_output = f_hillar.jac(u0, p, t)[3:end, 1] |
145 |
| - @test (maximum(f_hillar_output) - minimum(f_hillar_output)) .< 100 * eps() |
146 |
| - @test (maximum(f_hillar_jac_output) - minimum(f_hillar_jac_output)) .< 100 * eps() |
147 |
| -end |
148 |
| - |
149 |
| -### Test Symbolic Derivatives ### |
150 |
| - |
| 56 | +# Compares the symbolic derivatives with their manually computed forms. |
151 | 57 | let
|
152 | 58 | @variables X Y
|
153 | 59 | @parameters v K n
|
154 | 60 |
|
155 |
| - @test isequal(Symbolics.derivative(Catalyst.mm(X, v, K), X), v * K / (K + X)^2) |
156 |
| - @test isequal(Symbolics.derivative(Catalyst.mm(X, v, K), v), X / (K + X)) |
157 |
| - @test isequal(Symbolics.derivative(Catalyst.mm(X, v, K), K), -v * X / (K + X)^2) |
| 61 | + @test isequal(derivative(Catalyst.mm(X, v, K), X), v * K / (K + X)^2) |
| 62 | + @test isequal(derivative(Catalyst.mm(X, v, K), v), X / (K + X)) |
| 63 | + @test isequal(derivative(Catalyst.mm(X, v, K), K), -v * X / (K + X)^2) |
158 | 64 |
|
159 |
| - @test isequal(Symbolics.derivative(Catalyst.mmr(X, v, K), X), -v * K / (K + X)^2) |
160 |
| - @test isequal(Symbolics.derivative(Catalyst.mmr(X, v, K), v), K / (K + X)) |
161 |
| - @test isequal(Symbolics.derivative(Catalyst.mmr(X, v, K), K), v * X / (K + X)^2) |
| 65 | + @test isequal(derivative(Catalyst.mmr(X, v, K), X), -v * K / (K + X)^2) |
| 66 | + @test isequal(derivative(Catalyst.mmr(X, v, K), v), K / (K + X)) |
| 67 | + @test isequal(derivative(Catalyst.mmr(X, v, K), K), v * X / (K + X)^2) |
162 | 68 |
|
163 |
| - @test isequal(Symbolics.derivative(Catalyst.hill(X, v, K, n), X), |
| 69 | + @test isequal(derivative(Catalyst.hill(X, v, K, n), X), |
164 | 70 | n * v * (K^n) * (X^(n - 1)) / (K^n + X^n)^2)
|
165 |
| - @test isequal(Symbolics.derivative(Catalyst.hill(X, v, K, n), v), X^n / (K^n + X^n)) |
166 |
| - @test isequal(Symbolics.derivative(Catalyst.hill(X, v, K, n), K), |
| 71 | + @test isequal(derivative(Catalyst.hill(X, v, K, n), v), X^n / (K^n + X^n)) |
| 72 | + @test isequal(derivative(Catalyst.hill(X, v, K, n), K), |
167 | 73 | -n * v * (K^(n - 1)) * (X^n) / (K^n + X^n)^2)
|
168 |
| - @test isequal(Symbolics.derivative(Catalyst.hill(X, v, K, n), n), |
| 74 | + @test isequal(derivative(Catalyst.hill(X, v, K, n), n), |
169 | 75 | v * (X^n) * (K^n) * (log(X) - log(K)) / (K^n + X^n)^2)
|
170 | 76 |
|
171 |
| - @test isequal(Symbolics.derivative(Catalyst.hillr(X, v, K, n), X), |
| 77 | + @test isequal(derivative(Catalyst.hillr(X, v, K, n), X), |
172 | 78 | -n * v * (K^n) * (X^(n - 1)) / (K^n + X^n)^2)
|
173 |
| - @test isequal(Symbolics.derivative(Catalyst.hillr(X, v, K, n), v), K^n / (K^n + X^n)) |
174 |
| - @test isequal(Symbolics.derivative(Catalyst.hillr(X, v, K, n), K), |
| 79 | + @test isequal(derivative(Catalyst.hillr(X, v, K, n), v), K^n / (K^n + X^n)) |
| 80 | + @test isequal(derivative(Catalyst.hillr(X, v, K, n), K), |
175 | 81 | n * v * (K^(n - 1)) * (X^n) / (K^n + X^n)^2)
|
176 |
| - @test isequal(Symbolics.derivative(Catalyst.hillr(X, v, K, n), n), |
| 82 | + @test isequal(derivative(Catalyst.hillr(X, v, K, n), n), |
177 | 83 | v * (X^n) * (K^n) * (log(K) - log(X)) / (K^n + X^n)^2)
|
178 | 84 |
|
179 |
| - @test isequal(Symbolics.derivative(Catalyst.hillar(X, Y, v, K, n), X), |
| 85 | + @test isequal(derivative(Catalyst.hillar(X, Y, v, K, n), X), |
180 | 86 | n * v * (K^n + Y^n) * (X^(n - 1)) / (K^n + X^n + Y^n)^2)
|
181 |
| - @test isequal(Symbolics.derivative(Catalyst.hillar(X, Y, v, K, n), Y), |
| 87 | + @test isequal(derivative(Catalyst.hillar(X, Y, v, K, n), Y), |
182 | 88 | -n * v * (Y^(n - 1)) * (X^n) / (K^n + X^n + Y^n)^2)
|
183 |
| - @test isequal(Symbolics.derivative(Catalyst.hillar(X, Y, v, K, n), v), |
| 89 | + @test isequal(derivative(Catalyst.hillar(X, Y, v, K, n), v), |
184 | 90 | X^n / (K^n + X^n + Y^n))
|
185 |
| - @test isequal(Symbolics.derivative(Catalyst.hillar(X, Y, v, K, n), K), |
| 91 | + @test isequal(derivative(Catalyst.hillar(X, Y, v, K, n), K), |
186 | 92 | -n * v * (v^(n - 1)) * (X^n) / (K^n + X^n + Y^n)^2)
|
187 |
| - @test isequal(Symbolics.derivative(Catalyst.hillar(X, Y, v, K, n), n), |
| 93 | + @test isequal(derivative(Catalyst.hillar(X, Y, v, K, n), n), |
188 | 94 | v * (X^n) * ((K^n + Y^n) * log(X) - (K^n) * log(K) - (Y^n) * log(Y)) /
|
189 | 95 | (K^n + X^n + Y^n)^2)
|
190 | 96 | end
|
191 | 97 |
|
192 |
| -### Tests Current Function Expansion ### |
| 98 | +### Tests Function Expansion ### |
193 | 99 |
|
194 | 100 | # Tests `ReactionSystem`s.
|
195 | 101 | let
|
|
233 | 139 |
|
234 | 140 | # Tests `Equation`s.
|
235 | 141 | let
|
236 |
| - @variables T X(T) Y(T) |
| 142 | + @variables X(t) Y(t) |
237 | 143 | @parameters K V N
|
238 | 144 |
|
239 | 145 | eq1 = 0 ~ mm(X, V, K)
|
|
0 commit comments