|
118 | 118 | end |
119 | 119 | end |
120 | 120 |
|
121 | | -# Perform SDE simulations (singular and ensemble). |
122 | | -let |
123 | | - # Creates normal and ensemble problems. |
124 | | - base_sprob = SDEProblem(ssys, u0_alts[1], tspan, p_alts[1]) |
125 | | - base_sol = solve(base_sprob, ImplicitEM(); seed, saveat = 1.0) |
126 | | - base_eprob = EnsembleProblem(base_sprob) |
127 | | - base_esol = solve(base_eprob, ImplicitEM(); seed, trajectories = 2, saveat = 1.0) |
128 | | - |
129 | | - # Simulates problems for all input types, checking that identical solutions are found. |
130 | | - @test_broken false # first remake in subsequent test yields a `ERROR: type Nothing has no field portion`. |
131 | | - for u0 in u0_alts, p in p_alts |
132 | | - # sprob = remake(base_sprob; u0, p) |
133 | | - # @test base_sol == solve(sprob, ImplicitEM(); seed, saveat = 1.0) |
134 | | - # eprob = remake(base_eprob; u0, p) |
135 | | - # @test base_esol == solve(eprob, ImplicitEM(); seed, trajectories = 2, saveat = 1.0) |
136 | | - end |
137 | | -end |
138 | | - |
139 | | -# Perform jump simulations (singular and ensemble). |
140 | | -let |
141 | | - # Creates normal and ensemble problems. |
142 | | - base_dprob = DiscreteProblem(jsys, u0_alts[1], tspan, p_alts[1]) |
143 | | - base_jprob = JumpProblem(jsys, base_dprob, Direct(); rng) |
144 | | - base_sol = solve(base_jprob, SSAStepper(); seed, saveat = 1.0) |
145 | | - base_eprob = EnsembleProblem(base_jprob) |
146 | | - base_esol = solve(base_eprob, SSAStepper(); seed, trajectories = 2, saveat = 1.0) |
147 | | - |
148 | | - # Simulates problems for all input types, checking that identical solutions are found. |
149 | | - @test_broken false # first remake in subsequent test yields a `ERROR: type Nothing has no field portion`. |
150 | | - for u0 in u0_alts, p in p_alts |
151 | | - # jprob = remake(base_jprob; u0, p) |
152 | | - # @test base_sol == solve(base_jprob, SSAStepper(); seed, saveat = 1.0) |
153 | | - # eprob = remake(base_eprob; u0, p) |
154 | | - # @test base_esol == solve(eprob, SSAStepper(); seed, trajectories = 2, saveat = 1.0) |
155 | | - end |
156 | | -end |
157 | | - |
158 | 121 | # Solves a nonlinear problem (EnsembleProblems are not possible for these). |
159 | 122 | let |
160 | 123 | base_nlprob = NonlinearProblem(nsys, u0_alts[1], p_alts[1]) |
@@ -183,298 +146,3 @@ let |
183 | 146 | @test base_esol == solve(eprob, DynamicSS(Tsit5()); trajectories = 2) |
184 | 147 | end |
185 | 148 | end |
186 | | - |
187 | | -### Checks Errors On Faulty Inputs ### |
188 | | - |
189 | | -# Checks various erroneous problem inputs, ensuring that these throw errors. |
190 | | -let |
191 | | - # Prepare system components. |
192 | | - @parameters k1 k2 k3 |
193 | | - @variables X1(t) X2(t) X3(t) |
194 | | - alg_eqs = [ |
195 | | - 0 ~ -k1 * X1 + k2 * X2, |
196 | | - 0 ~ k1 * X1 - k2 * X2 |
197 | | - ] |
198 | | - diff_eqs = [ |
199 | | - D(X1) ~ -k1 * X1 + k2 * X2, |
200 | | - D(X2) ~ k1 * X1 - k2 * X2 |
201 | | - ] |
202 | | - noise_eqs = fill(0.01, 2, 2) |
203 | | - jumps = [ |
204 | | - MassActionJump(k1, [X1 => 1], [X1 => -1, X2 => 1]), |
205 | | - MassActionJump(k2, [X2 => 1], [X1 => 1, X2 => -1]) |
206 | | - ] |
207 | | - |
208 | | - # Create systems (without structural_simplify, since that might modify systems to affect intended tests). |
209 | | - osys = complete(ODESystem(diff_eqs, t; name = :osys)) |
210 | | - ssys = complete(SDESystem(diff_eqs, noise_eqs, t, [X1, X2], [k1, k2]; name = :ssys)) |
211 | | - jsys = complete(JumpSystem(jumps, t, [X1, X2], [k1, k2]; name = :jsys)) |
212 | | - nsys = complete(NonlinearSystem(alg_eqs; name = :nsys)) |
213 | | - |
214 | | - # Declares valid initial conditions and parameter values |
215 | | - u0_valid = [X1 => 1, X2 => 2] |
216 | | - ps_valid = [k1 => 0.5, k2 => 0.1] |
217 | | - |
218 | | - # Declares invalid initial conditions and parameters. This includes both cases where values are |
219 | | - # missing, or additional ones are given. Includes vector/Tuple/Dict forms. |
220 | | - u0s_invalid = [ |
221 | | - # Missing a value. |
222 | | - [X1 => 1], |
223 | | - [osys.X1 => 1], |
224 | | - SA[X1 => 1], |
225 | | - SA[osys.X1 => 1], |
226 | | - Dict([X1 => 1]), |
227 | | - Dict([osys.X1 => 1]), |
228 | | - (X1 => 1), |
229 | | - (osys.X1 => 1), |
230 | | - # Contain an additional value. |
231 | | - [X1 => 1, X2 => 2, X3 => 3], |
232 | | - SA[X1 => 1, X2 => 2, X3 => 3], |
233 | | - Dict([X1 => 1, X2 => 2, X3 => 3]), |
234 | | - (X1 => 1, X2 => 2, X3 => 3) |
235 | | - ] |
236 | | - ps_invalid = [ |
237 | | - # Missing a value. |
238 | | - [k1 => 1.0], |
239 | | - [osys.k1 => 1.0], |
240 | | - SA[k1 => 1.0], |
241 | | - SA[osys.k1 => 1.0], |
242 | | - Dict([k1 => 1.0]), |
243 | | - Dict([osys.k1 => 1.0]), |
244 | | - (k1 => 1.0), |
245 | | - (osys.k1 => 1.0), |
246 | | - # Contain an additional value. |
247 | | - [k1 => 1.0, k2 => 2.0, k3 => 3.0], |
248 | | - SA[k1 => 1.0, k2 => 2.0, k3 => 3.0], |
249 | | - Dict([k1 => 1.0, k2 => 2.0, k3 => 3.0]), |
250 | | - (k1 => 1.0, k2 => 2.0, k3 => 3.0) |
251 | | - ] |
252 | | - |
253 | | - # Loops through all potential parameter sets, checking their inputs yield errors. |
254 | | - # Broken tests are due to this issue: https://github.com/SciML/ModelingToolkit.jl/issues/2779 |
255 | | - for ps in [[ps_valid]; ps_invalid], u0 in [[u0_valid]; u0s_invalid] |
256 | | - # Handles problems with/without tspan separately. Special check ensuring that valid inputs passes. |
257 | | - for (xsys, XProblem) in zip([osys, ssys, jsys], |
258 | | - [ODEProblem, SDEProblem, DiscreteProblem]) |
259 | | - if isequal(ps, ps_valid) && isequal(u0, u0_valid) |
260 | | - XProblem(xsys, u0, (0.0, 1.0), ps) |
261 | | - @test true |
262 | | - else |
263 | | - @test_broken false |
264 | | - continue |
265 | | - @test_throws Exception XProblem(xsys, u0, (0.0, 1.0), ps) |
266 | | - end |
267 | | - end |
268 | | - for (xsys, XProblem) in zip([nsys, osys], [NonlinearProblem, SteadyStateProblem]) |
269 | | - if isequal(ps, ps_valid) && isequal(u0, u0_valid) |
270 | | - XProblem(xsys, u0, ps) |
271 | | - @test true |
272 | | - else |
273 | | - @test_broken false |
274 | | - continue |
275 | | - @test_throws Exception XProblem(xsys, u0, ps) |
276 | | - end |
277 | | - end |
278 | | - end |
279 | | -end |
280 | | - |
281 | | -### Vector Parameter/Variable Inputs ### |
282 | | - |
283 | | -begin |
284 | | - # Declares the model (with vector species/parameters, with/without default values, and observables). |
285 | | - @variables X(t)[1:2] Y(t)[1:2]=[10.0, 20.0] XY(t)[1:2] |
286 | | - @parameters p[1:2] d[1:2]=[0.2, 0.5] |
287 | | - alg_eqs = [ |
288 | | - 0 ~ p[1] - d[1] * X[1], |
289 | | - 0 ~ p[2] - d[2] * X[2], |
290 | | - 0 ~ p[1] - d[1] * Y[1], |
291 | | - 0 ~ p[2] - d[2] * Y[2] |
292 | | - ] |
293 | | - diff_eqs = [ |
294 | | - D(X[1]) ~ p[1] - d[1] * X[1], |
295 | | - D(X[2]) ~ p[2] - d[2] * X[2], |
296 | | - D(Y[1]) ~ p[1] - d[1] * Y[1], |
297 | | - D(Y[2]) ~ p[2] - d[2] * Y[2] |
298 | | - ] |
299 | | - noise_eqs = fill(0.01, 4, 8) |
300 | | - jumps = [ |
301 | | - MassActionJump(p[1], Pair{Symbolics.BasicSymbolic{Real}, Int64}[], [X[1] => 1]), |
302 | | - MassActionJump(p[2], Pair{Symbolics.BasicSymbolic{Real}, Int64}[], [X[2] => 1]), |
303 | | - MassActionJump(d[1], [X[1] => 1], [X[1] => -1]), |
304 | | - MassActionJump(d[2], [X[2] => 1], [X[2] => -1]), |
305 | | - MassActionJump(p[1], Pair{Symbolics.BasicSymbolic{Real}, Int64}[], [Y[1] => 1]), |
306 | | - MassActionJump(p[2], Pair{Symbolics.BasicSymbolic{Real}, Int64}[], [Y[2] => 1]), |
307 | | - MassActionJump(d[1], [Y[1] => 1], [Y[1] => -1]), |
308 | | - MassActionJump(d[2], [Y[2] => 1], [Y[2] => -1]) |
309 | | - ] |
310 | | - observed = [XY[1] ~ X[1] + Y[1], XY[2] ~ X[2] + Y[2]] |
311 | | - |
312 | | - # Create systems (without structural_simplify, since that might modify systems to affect intended tests). |
313 | | - osys = complete(ODESystem(diff_eqs, t; observed, name = :osys)) |
314 | | - ssys = complete(SDESystem( |
315 | | - diff_eqs, noise_eqs, t, [X[1], X[2], Y[1], Y[2]], [p, d]; observed, name = :ssys)) |
316 | | - jsys = complete(JumpSystem( |
317 | | - jumps, t, [X[1], X[2], Y[1], Y[2]], [p, d]; observed, name = :jsys)) |
318 | | - nsys = complete(NonlinearSystem(alg_eqs; observed, name = :nsys)) |
319 | | - |
320 | | - # Declares various u0 versions (scalarised and vector forms). |
321 | | - u0_alts_vec = [ |
322 | | - # Vectors not providing default values. |
323 | | - [X => [1.0, 2.0]], |
324 | | - [X[1] => 1.0, X[2] => 2.0], |
325 | | - [osys.X => [1.0, 2.0]], |
326 | | - [osys.X[1] => 1.0, osys.X[2] => 2.0], |
327 | | - # Vectors providing default values. |
328 | | - [X => [1.0, 2.0], Y => [10.0, 20.0]], |
329 | | - [X[1] => 1.0, X[2] => 2.0, Y[1] => 10.0, Y[2] => 20.0], |
330 | | - [osys.X => [1.0, 2.0], osys.Y => [10.0, 20.0]], |
331 | | - [osys.X[1] => 1.0, osys.X[2] => 2.0, osys.Y[1] => 10.0, osys.Y[2] => 20.0], |
332 | | - # Static vectors not providing default values. |
333 | | - SA[X => [1.0, 2.0]], |
334 | | - SA[X[1] => 1.0, X[2] => 2.0], |
335 | | - SA[osys.X => [1.0, 2.0]], |
336 | | - SA[osys.X[1] => 1.0, osys.X[2] => 2.0], |
337 | | - # Static vectors providing default values. |
338 | | - SA[X => [1.0, 2.0], Y => [10.0, 20.0]], |
339 | | - SA[X[1] => 1.0, X[2] => 2.0, Y[1] => 10.0, Y[2] => 20.0], |
340 | | - SA[osys.X => [1.0, 2.0], osys.Y => [10.0, 20.0]], |
341 | | - SA[osys.X[1] => 1.0, osys.X[2] => 2.0, osys.Y[1] => 10.0, osys.Y[2] => 20.0], |
342 | | - # Dicts not providing default values. |
343 | | - Dict([X => [1.0, 2.0]]), |
344 | | - Dict([X[1] => 1.0, X[2] => 2.0]), |
345 | | - Dict([osys.X => [1.0, 2.0]]), |
346 | | - Dict([osys.X[1] => 1.0, osys.X[2] => 2.0]), |
347 | | - # Dicts providing default values. |
348 | | - Dict([X => [1.0, 2.0], Y => [10.0, 20.0]]), |
349 | | - Dict([X[1] => 1.0, X[2] => 2.0, Y[1] => 10.0, Y[2] => 20.0]), |
350 | | - Dict([osys.X => [1.0, 2.0], osys.Y => [10.0, 20.0]]), |
351 | | - Dict([osys.X[1] => 1.0, osys.X[2] => 2.0, osys.Y[1] => 10.0, osys.Y[2] => 20.0]), |
352 | | - # Tuples not providing default values. |
353 | | - (X => [1.0, 2.0]), |
354 | | - (X[1] => 1.0, X[2] => 2.0), |
355 | | - (osys.X => [1.0, 2.0]), |
356 | | - (osys.X[1] => 1.0, osys.X[2] => 2.0), |
357 | | - # Tuples providing default values. |
358 | | - (X => [1.0, 2.0], Y => [10.0, 20.0]), |
359 | | - (X[1] => 1.0, X[2] => 2.0, Y[1] => 10.0, Y[2] => 20.0), |
360 | | - (osys.X => [1.0, 2.0], osys.Y => [10.0, 20.0]), |
361 | | - (osys.X[1] => 1.0, osys.X[2] => 2.0, osys.Y[1] => 10.0, osys.Y[2] => 20.0) |
362 | | - ] |
363 | | - |
364 | | - # Declares various ps versions (vector forms only). |
365 | | - p_alts_vec = [ |
366 | | - # Vectors not providing default values. |
367 | | - [p => [1.0, 2.0]], |
368 | | - [osys.p => [1.0, 2.0]], |
369 | | - # Vectors providing default values. |
370 | | - [p => [4.0, 5.0], d => [0.2, 0.5]], |
371 | | - [osys.p => [4.0, 5.0], osys.d => [0.2, 0.5]], |
372 | | - # Static vectors not providing default values. |
373 | | - SA[p => [1.0, 2.0]], |
374 | | - SA[osys.p => [1.0, 2.0]], |
375 | | - # Static vectors providing default values. |
376 | | - SA[p => [4.0, 5.0], d => [0.2, 0.5]], |
377 | | - SA[osys.p => [4.0, 5.0], osys.d => [0.2, 0.5]], |
378 | | - # Dicts not providing default values. |
379 | | - Dict([p => [1.0, 2.0]]), |
380 | | - Dict([osys.p => [1.0, 2.0]]), |
381 | | - # Dicts providing default values. |
382 | | - Dict([p => [4.0, 5.0], d => [0.2, 0.5]]), |
383 | | - Dict([osys.p => [4.0, 5.0], osys.d => [0.2, 0.5]]), |
384 | | - # Tuples not providing default values. |
385 | | - (p => [1.0, 2.0]), |
386 | | - (osys.p => [1.0, 2.0]), |
387 | | - # Tuples providing default values. |
388 | | - (p => [4.0, 5.0], d => [0.2, 0.5]), |
389 | | - (osys.p => [4.0, 5.0], osys.d => [0.2, 0.5]) |
390 | | - ] |
391 | | - |
392 | | - # Declares a timespan. |
393 | | - tspan = (0.0, 10.0) |
394 | | -end |
395 | | - |
396 | | -# Perform ODE simulations (singular and ensemble). |
397 | | -let |
398 | | - # Creates normal and ensemble problems. |
399 | | - base_oprob = ODEProblem(osys, u0_alts_vec[1], tspan, p_alts_vec[1]) |
400 | | - base_sol = solve(base_oprob, Tsit5(); saveat = 1.0) |
401 | | - base_eprob = EnsembleProblem(base_oprob) |
402 | | - base_esol = solve(base_eprob, Tsit5(); trajectories = 2, saveat = 1.0) |
403 | | - |
404 | | - # Simulates problems for all input types, checking that identical solutions are found. |
405 | | - @test_broken false # Does not work for certain inputs, likely related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
406 | | - for u0 in u0_alts_vec, p in p_alts_vec |
407 | | - oprob = remake(base_oprob; u0, p) |
408 | | - # @test base_sol == solve(oprob, Tsit5(); saveat = 1.0) |
409 | | - eprob = remake(base_eprob; u0, p) |
410 | | - # @test base_esol == solve(eprob, Tsit5(); trajectories = 2, saveat = 1.0) |
411 | | - end |
412 | | -end |
413 | | - |
414 | | -# Perform SDE simulations (singular and ensemble). |
415 | | -let |
416 | | - # Creates normal and ensemble problems. |
417 | | - base_sprob = SDEProblem(ssys, u0_alts_vec[1], tspan, p_alts_vec[1]) |
418 | | - base_sol = solve(base_sprob, ImplicitEM(); seed, saveat = 1.0) |
419 | | - base_eprob = EnsembleProblem(base_sprob) |
420 | | - base_esol = solve(base_eprob, ImplicitEM(); seed, trajectories = 2, saveat = 1.0) |
421 | | - |
422 | | - # Simulates problems for all input types, checking that identical solutions are found. |
423 | | - @test_broken false # Does not work for certain inputs, likely related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
424 | | - for u0 in u0_alts_vec, p in p_alts_vec |
425 | | - sprob = remake(base_sprob; u0, p) |
426 | | - # @test base_sol == solve(sprob, ImplicitEM(); seed, saveat = 1.0) |
427 | | - eprob = remake(base_eprob; u0, p) |
428 | | - # @test base_esol == solve(eprob, ImplicitEM(); seed, trajectories = 2, saveat = 1.0) |
429 | | - end |
430 | | -end |
431 | | - |
432 | | -# Perform jump simulations (singular and ensemble). |
433 | | -# Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
434 | | -@test_broken let |
435 | | - # Creates normal and ensemble problems. |
436 | | - base_dprob = DiscreteProblem(jsys, u0_alts_vec[1], tspan, p_alts_vec[1]) |
437 | | - base_jprob = JumpProblem(jsys, base_dprob, Direct(); rng) |
438 | | - base_sol = solve(base_jprob, SSAStepper(); seed, saveat = 1.0) |
439 | | - base_eprob = EnsembleProblem(base_jprob) |
440 | | - base_esol = solve(base_eprob, SSAStepper(); seed, trajectories = 2, saveat = 1.0) |
441 | | - |
442 | | - # Simulates problems for all input types, checking that identical solutions are found. |
443 | | - @test_broken false # Does not work for certain inputs, likely related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
444 | | - for u0 in u0_alts_vec, p in p_alts_vec |
445 | | - jprob = remake(base_jprob; u0, p) |
446 | | - # @test base_sol == solve(base_jprob, SSAStepper(); seed, saveat = 1.0) |
447 | | - eprob = remake(base_eprob; u0, p) |
448 | | - # @test base_esol == solve(eprob, SSAStepper(); seed, trajectories = 2, saveat = 1.0) |
449 | | - end |
450 | | -end |
451 | | - |
452 | | -# Solves a nonlinear problem (EnsembleProblems are not possible for these). |
453 | | -let |
454 | | - base_nlprob = NonlinearProblem(nsys, u0_alts_vec[1], p_alts_vec[1]) |
455 | | - base_sol = solve(base_nlprob, NewtonRaphson()) |
456 | | - @test_broken false # Does not work for certain inputs, likely related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
457 | | - for u0 in u0_alts_vec, p in p_alts_vec |
458 | | - nlprob = remake(base_nlprob; u0, p) |
459 | | - # @test base_sol == solve(nlprob, NewtonRaphson()) |
460 | | - end |
461 | | -end |
462 | | - |
463 | | -# Perform steady state simulations (singular and ensemble). |
464 | | -# Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
465 | | -let |
466 | | - # Creates normal and ensemble problems. |
467 | | - base_ssprob = SteadyStateProblem(osys, u0_alts_vec[1], p_alts_vec[1]) |
468 | | - base_sol = solve(base_ssprob, DynamicSS(Tsit5())) |
469 | | - base_eprob = EnsembleProblem(base_ssprob) |
470 | | - base_esol = solve(base_eprob, DynamicSS(Tsit5()); trajectories = 2) |
471 | | - |
472 | | - # Simulates problems for all input types, checking that identical solutions are found. |
473 | | - @test_broken false # Does not work for certain inputs, likely related to https://github.com/SciML/ModelingToolkit.jl/issues/2804. |
474 | | - for u0 in u0_alts_vec, p in p_alts_vec |
475 | | - ssprob = remake(base_ssprob; u0, p) |
476 | | - # @test base_sol == solve(ssprob, DynamicSS(Tsit5())) |
477 | | - eprob = remake(base_eprob; u0, p) |
478 | | - # @test base_esol == solve(eprob, DynamicSS(Tsit5()); trajectories = 2) |
479 | | - end |
480 | | -end |
0 commit comments