|
153 | 153 | @test issetequal(parameters(rn5), @parameters k B X) |
154 | 154 | end |
155 | 155 |
|
156 | | -# Test whether user-defined functions are properly expanded in equations. |
157 | | -let |
158 | | - f(A, t) = 2*A*t |
159 | | - |
160 | | - # Test user-defined function |
161 | | - rn = @reaction_network begin |
162 | | - @equations D(A) ~ f(A, t) |
163 | | - end |
164 | | - @test length(equations(rn)) == 1 |
165 | | - @test equations(rn)[1] isa Equation |
166 | | - @species A(t) |
167 | | - @test isequal(equations(rn)[1], D(A) ~ 2*A*t) |
168 | | - |
169 | | - |
170 | | - hill_unregistered(A, v, K, n) = v*(A^n) / (A^n + K^n) |
171 | | - rn2 = @reaction_network begin |
172 | | - @parameters v K n |
173 | | - @equations D(A) ~ hill_unregistered(A, v, K, n) |
174 | | - end |
175 | | - @test length(equations(rn2)) == 1 |
176 | | - @test equations(rn2)[1] isa Equation |
177 | | - @parameters v K n |
178 | | - @test isequal(equations(rn2)[1], D(A) ~ v*(A^n) / (A^n + K^n)) |
179 | | - |
180 | | - hill2(A, v, K, n) = v*(A^n) / (A^n + K^n) |
181 | | - @register_symbolic hill2(A, v, K, n) |
182 | | - # Test Catalyst function |
183 | | - rn2r = @reaction_network begin |
184 | | - @parameters v K n |
185 | | - @equations D(A) ~ hill2(A, v, K, n) |
186 | | - end |
187 | | - @test length(equations(rn2r)) == 1 |
188 | | - @test equations(rn2r)[1] isa Equation |
189 | | - @parameters v K n |
190 | | - @test isequal(equations(rn2r)[1], D(A) ~ hill2(A, v, K, n)) |
191 | | - |
192 | | - |
193 | | - rn3 = @reaction_network begin |
194 | | - @species Iapp(t) |
195 | | - @equations begin |
196 | | - D(A) ~ Iapp |
197 | | - Iapp ~ f(A,t) |
198 | | - end |
199 | | - end |
200 | | - @test length(equations(rn3)) == 2 |
201 | | - @test equations(rn3)[1] isa Equation |
202 | | - @test equations(rn3)[2] isa Equation |
203 | | - @variables Iapp(t) |
204 | | - @test isequal(equations(rn3)[1], D(A) ~ Iapp) |
205 | | - @test isequal(equations(rn3)[2], Iapp ~ 2*A*t) |
206 | | - |
207 | | - @species Iapp(t) A(t) |
208 | | - eq = [D(A) ~ Iapp, Iapp ~ f(A, t)] |
209 | | - @named rn3_sym = ReactionSystem(eq, t) |
210 | | - rn3_sym = complete(rn3_sym) |
211 | | - @test isequivalent(rn3, rn3_sym) |
212 | | - |
213 | | - |
214 | | - |
215 | | - |
216 | | - g(A, K, n) = A^n + K^n |
217 | | - rn4 = @reaction_network begin |
218 | | - @parameters v K n |
219 | | - @equations D(A) ~ hill(A, v, K, n)*g(A, K, n) |
220 | | - end |
221 | | - @test length(equations(rn4)) == 1 |
222 | | - @test equations(rn4)[1] isa Equation |
223 | | - @parameters v n |
224 | | - @test isequal(Catalyst.expand_registered_functions(equations(rn4)[1]), D(A) ~ v*(A^n)) |
225 | | -end |
226 | | - |
227 | 156 | # Test inferring with stoichiometry symbols and interpolation. |
228 | 157 | let |
229 | 158 | @parameters k g h gg X y [isconstantspecies = true] |
@@ -1024,3 +953,76 @@ let |
1024 | 953 | @unpack k1, A = rn3 |
1025 | 954 | @test isequal(rl, k1*A^2) |
1026 | 955 | end |
| 956 | + |
| 957 | +# Test whether user-defined functions are properly expanded in equations. |
| 958 | +let |
| 959 | + f(A, t) = 2*A*t |
| 960 | + |
| 961 | + # Test user-defined function |
| 962 | + rn = @reaction_network begin |
| 963 | + @equations D(A) ~ f(A, t) |
| 964 | + end |
| 965 | + @test length(equations(rn)) == 1 |
| 966 | + @test equations(rn)[1] isa Equation |
| 967 | + @species A(t) |
| 968 | + @test isequal(equations(rn)[1], D(A) ~ 2*A*t) |
| 969 | + |
| 970 | + |
| 971 | + # Test whether expansion happens properly for unregistered/registered functions. |
| 972 | + hill_unregistered(A, v, K, n) = v*(A^n) / (A^n + K^n) |
| 973 | + rn2 = @reaction_network begin |
| 974 | + @parameters v K n |
| 975 | + @equations D(A) ~ hill_unregistered(A, v, K, n) |
| 976 | + end |
| 977 | + @test length(equations(rn2)) == 1 |
| 978 | + @test equations(rn2)[1] isa Equation |
| 979 | + @parameters v K n |
| 980 | + @test isequal(equations(rn2)[1], D(A) ~ v*(A^n) / (A^n + K^n)) |
| 981 | + |
| 982 | + hill2(A, v, K, n) = v*(A^n) / (A^n + K^n) |
| 983 | + @register_symbolic hill2(A, v, K, n) |
| 984 | + # Registered symbolic function should not expand. |
| 985 | + rn2r = @reaction_network begin |
| 986 | + @parameters v K n |
| 987 | + @equations D(A) ~ hill2(A, v, K, n) |
| 988 | + end |
| 989 | + @test length(equations(rn2r)) == 1 |
| 990 | + @test equations(rn2r)[1] isa Equation |
| 991 | + @parameters v K n |
| 992 | + @test isequal(equations(rn2r)[1], D(A) ~ hill2(A, v, K, n)) |
| 993 | + |
| 994 | + |
| 995 | + rn3 = @reaction_network begin |
| 996 | + @species Iapp(t) |
| 997 | + @equations begin |
| 998 | + D(A) ~ Iapp |
| 999 | + Iapp ~ f(A,t) |
| 1000 | + end |
| 1001 | + end |
| 1002 | + @test length(equations(rn3)) == 2 |
| 1003 | + @test equations(rn3)[1] isa Equation |
| 1004 | + @test equations(rn3)[2] isa Equation |
| 1005 | + @variables Iapp(t) |
| 1006 | + @test isequal(equations(rn3)[1], D(A) ~ Iapp) |
| 1007 | + @test isequal(equations(rn3)[2], Iapp ~ 2*A*t) |
| 1008 | + |
| 1009 | + # Test whether the DSL and symbolic ways of creating the network generate the same system |
| 1010 | + @species Iapp(t) A(t) |
| 1011 | + eq = [D(A) ~ Iapp, Iapp ~ f(A, t)] |
| 1012 | + @named rn3_sym = ReactionSystem(eq, t) |
| 1013 | + rn3_sym = complete(rn3_sym) |
| 1014 | + @test isequivalent(rn3, rn3_sym) |
| 1015 | + |
| 1016 | + |
| 1017 | + # Test more complicated expression involving both registered function and a user-defined function. |
| 1018 | + g(A, K, n) = A^n + K^n |
| 1019 | + rn4 = @reaction_network begin |
| 1020 | + @parameters v K n |
| 1021 | + @equations D(A) ~ hill(A, v, K, n)*g(A, K, n) |
| 1022 | + end |
| 1023 | + @test length(equations(rn4)) == 1 |
| 1024 | + @test equations(rn4)[1] isa Equation |
| 1025 | + @parameters v n |
| 1026 | + @test isequal(Catalyst.expand_registered_functions(equations(rn4)[1]), D(A) ~ v*(A^n)) |
| 1027 | +end |
| 1028 | + |
0 commit comments