@@ -252,4 +252,185 @@ let
252252 end
253253 end
254254 end
255+ end
256+
257+ # ## Vector Parameter/Variable Inputs ###
258+
259+ begin
260+ # Declares the model (with vector species/parameters, with/without default values, and observables).
261+ @variables X (t)[1 : 2 ] Y (t)[1 : 2 ] = [10.0 , 20.0 ] XY (t)[1 : 2 ]
262+ @parameters p[1 : 2 ] d[1 : 2 ] = [0.2 , 0.5 ]
263+ alg_eqs = [
264+ 0 ~ p[1 ] - d[1 ]* X[1 ],
265+ 0 ~ p[2 ] - d[2 ]* X[2 ],
266+ 0 ~ p[1 ] - d[1 ]* Y[1 ],
267+ 0 ~ p[2 ] - d[2 ]* Y[2 ],
268+ ]
269+ diff_eqs = [
270+ D (X[1 ]) ~ p[1 ] - d[1 ]* X[1 ],
271+ D (X[2 ]) ~ p[2 ] - d[2 ]* X[2 ],
272+ D (Y[1 ]) ~ p[1 ] - d[1 ]* Y[1 ],
273+ D (Y[2 ]) ~ p[2 ] - d[2 ]* Y[2 ],
274+ ]
275+ noise_eqs = fill (0.01 , 4 , 8 )
276+ jumps = [
277+ MassActionJump (p[1 ], Pair{Symbolics. BasicSymbolic{Real}, Int64}[], [X[1 ] => 1 ]),
278+ MassActionJump (p[2 ], Pair{Symbolics. BasicSymbolic{Real}, Int64}[], [X[2 ] => 1 ]),
279+ MassActionJump (d[1 ], [X[1 ] => 1 ], [X[1 ] => - 1 ]),
280+ MassActionJump (d[2 ], [X[2 ] => 1 ], [X[2 ] => - 1 ]),
281+ MassActionJump (p[1 ], Pair{Symbolics. BasicSymbolic{Real}, Int64}[], [Y[1 ] => 1 ]),
282+ MassActionJump (p[2 ], Pair{Symbolics. BasicSymbolic{Real}, Int64}[], [Y[2 ] => 1 ]),
283+ MassActionJump (d[1 ], [Y[1 ] => 1 ], [Y[1 ] => - 1 ]),
284+ MassActionJump (d[2 ], [Y[2 ] => 1 ], [Y[2 ] => - 1 ])
285+ ]
286+ observed = [XY[1 ] ~ X[1 ] + Y[1 ], XY[2 ] ~ X[2 ] + Y[2 ]]
287+
288+ # Create systems (without structural_simplify, since that might modify systems to affect intended tests).
289+ osys = complete (ODESystem (diff_eqs, t; observed, name = :osys ))
290+ ssys = complete (SDESystem (diff_eqs, noise_eqs, t, [X[1 ], X[2 ], Y[1 ], Y[2 ]], [p, d]; observed, name = :ssys ))
291+ jsys = complete (JumpSystem (jumps, t, [X[1 ], X[2 ], Y[1 ], Y[2 ]], [p, d]; observed, name = :jsys ))
292+ nsys = complete (NonlinearSystem (alg_eqs; observed, name = :nsys ))
293+
294+ # Declares various u0 versions (scalarised and vector forms).
295+ u0_alts_vec = [
296+ # Vectors not providing default values.
297+ [X => [1.0 , 2.0 ]],
298+ [X[1 ] => 1.0 , X[2 ] => 2.0 ],
299+ [osys. X => [1.0 , 2.0 ]],
300+ [osys. X[1 ] => 1.0 , osys. X[2 ] => 2.0 ],
301+ # Vectors providing default values.
302+ [X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]],
303+ [X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ],
304+ [osys. X => [1.0 , 2.0 ], osys. Y => [10.0 , 20.0 ]],
305+ [osys. X[1 ] => 1.0 , osys. X[2 ] => 2.0 , osys. Y[1 ] => 10.0 , osys. Y[2 ] => 20.0 ],
306+ # Dicts not providing default values.
307+ Dict ([X => [1.0 , 2.0 ]]),
308+ Dict ([X[1 ] => 1.0 , X[2 ] => 2.0 ]),
309+ Dict ([osys. X => [1.0 , 2.0 ]]),
310+ Dict ([osys. X[1 ] => 1.0 , osys. X[2 ] => 2.0 ]),
311+ # Dicts providing default values.
312+ Dict ([X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]]),
313+ Dict ([X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ]),
314+ Dict ([osys. X => [1.0 , 2.0 ], osys. Y => [10.0 , 20.0 ]]),
315+ Dict ([osys. X[1 ] => 1.0 , osys. X[2 ] => 2.0 , osys. Y[1 ] => 10.0 , osys. Y[2 ] => 20.0 ]),
316+ # Tuples not providing default values.
317+ (X => [1.0 , 2.0 ]),
318+ (X[1 ] => 1.0 , X[2 ] => 2.0 ),
319+ (osys. X => [1.0 , 2.0 ]),
320+ (osys. X[1 ] => 1.0 , osys. X[2 ] => 2.0 ),
321+ # Tuples providing default values.
322+ (X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]),
323+ (X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ),
324+ (osys. X => [1.0 , 2.0 ], osys. Y => [10.0 , 20.0 ]),
325+ (osys. X[1 ] => 1.0 , osys. X[2 ] => 2.0 , osys. Y[1 ] => 10.0 , osys. Y[2 ] => 20.0 )
326+ ]
327+
328+ # Declares various ps versions (vector forms only).
329+ p_alts_vec = [
330+ # Vectors not providing default values.
331+ [p => [1.0 , 2.0 ]],
332+ [osys. p => [1.0 , 2.0 ]],
333+ # Vectors providing default values.
334+ [p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]],
335+ [osys. p => [4.0 , 5.0 ], osys. d => [0.2 , 0.5 ]],
336+ # Dicts not providing default values.
337+ Dict ([p => [1.0 , 2.0 ]]),
338+ Dict ([osys. p => [1.0 , 2.0 ]]),
339+ # Dicts providing default values.
340+ Dict ([p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]]),
341+ Dict ([osys. p => [4.0 , 5.0 ], osys. d => [0.2 , 0.5 ]]),
342+ # Tuples not providing default values.
343+ (p => [1.0 , 2.0 ]),
344+ (osys. p => [1.0 , 2.0 ]),
345+ # Tuples providing default values.
346+ (p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]),
347+ (osys. p => [4.0 , 5.0 ], osys. d => [0.2 , 0.5 ])
348+ ]
349+
350+ # Declares a timespan.
351+ tspan = (0.0 , 10.0 )
352+ end
353+
354+ # Perform ODE simulations (singular and ensemble).
355+ # Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804.
356+ @test_broken let
357+ # Creates normal and ensemble problems.
358+ base_oprob = ODEProblem (osys, u0_alts_vec[1 ], tspan, p_alts_vec[1 ])
359+ base_sol = solve (base_oprob, Tsit5 (); saveat = 1.0 )
360+ base_eprob = EnsembleProblem (base_oprob)
361+ base_esol = solve (base_eprob, Tsit5 (); trajectories = 2 , saveat = 1.0 )
362+
363+ # Simulates problems for all input types, checking that identical solutions are found.
364+ for u0 in u0_alts_vec, p in p_alts_vec
365+ oprob = remake (base_oprob; u0, p)
366+ @test base_sol == solve (oprob, Tsit5 (); saveat = 1.0 )
367+ eprob = remake (base_eprob; u0, p)
368+ @test base_esol == solve (eprob, Tsit5 (); trajectories = 2 , saveat = 1.0 )
369+ end
370+ end
371+
372+ # Perform SDE simulations (singular and ensemble).
373+ # Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804.
374+ @test_broken let
375+ # Creates normal and ensemble problems.
376+ base_sprob = SDEProblem (ssys, u0_alts_vec[1 ], tspan, p_alts_vec[1 ])
377+ base_sol = solve (base_sprob, ImplicitEM (); seed, saveat = 1.0 )
378+ base_eprob = EnsembleProblem (base_sprob)
379+ base_esol = solve (base_eprob, ImplicitEM (); seed, trajectories = 2 , saveat = 1.0 )
380+
381+ # Simulates problems for all input types, checking that identical solutions are found.
382+ for u0 in u0_alts_vec, p in p_alts_vec
383+ sprob = remake (base_sprob; u0, p)
384+ @test base_sol == solve (sprob, ImplicitEM (); seed, saveat = 1.0 )
385+ eprob = remake (base_eprob; u0, p)
386+ @test base_esol == solve (eprob, ImplicitEM (); seed, trajectories = 2 , saveat = 1.0 )
387+ end
388+ end
389+
390+ # Perform jump simulations (singular and ensemble).
391+ # Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804.
392+ @test_broken let
393+ # Creates normal and ensemble problems.
394+ base_dprob = DiscreteProblem (jsys, u0_alts_vec[1 ], tspan, p_alts_vec[1 ])
395+ base_jprob = JumpProblem (jsys, base_dprob, Direct (); rng)
396+ base_sol = solve (base_jprob, SSAStepper (); seed, saveat = 1.0 )
397+ base_eprob = EnsembleProblem (base_jprob)
398+ base_esol = solve (base_eprob, SSAStepper (); seed, trajectories = 2 , saveat = 1.0 )
399+
400+ # Simulates problems for all input types, checking that identical solutions are found.
401+ for u0 in u0_alts_vec, p in p_alts_vec
402+ jprob = remake (base_jprob; u0, p)
403+ @test base_sol == solve (base_jprob, SSAStepper (); seed, saveat = 1.0 )
404+ eprob = remake (base_eprob; u0, p)
405+ @test base_esol == solve (eprob, SSAStepper (); seed, trajectories = 2 , saveat = 1.0 )
406+ end
407+ end
408+
409+ # Solves a nonlinear problem (EnsembleProblems are not possible for these).
410+ # Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804.
411+ @test_broken let
412+ base_nlprob = NonlinearProblem (nsys, u0_alts_vec[1 ], p_alts_vec[1 ])
413+ base_sol = solve (base_nlprob, NewtonRaphson ())
414+ for u0 in u0_alts_vec, p in p_alts_vec
415+ nlprob = remake (base_nlprob; u0, p)
416+ @test base_sol == solve (nlprob, NewtonRaphson ())
417+ end
418+ end
419+
420+ # Perform steady state simulations (singular and ensemble).
421+ # Fails. At least partially related to https://github.com/SciML/ModelingToolkit.jl/issues/2804.
422+ @test_broken let
423+ # Creates normal and ensemble problems.
424+ base_ssprob = SteadyStateProblem (osys, u0_alts_vec[1 ], p_alts_vec[1 ])
425+ base_sol = solve (base_ssprob, DynamicSS (Tsit5 ()))
426+ base_eprob = EnsembleProblem (base_ssprob)
427+ base_esol = solve (base_eprob, DynamicSS (Tsit5 ()); trajectories = 2 )
428+
429+ # Simulates problems for all input types, checking that identical solutions are found.
430+ for u0 in u0_alts_vec, p in p_alts_vec
431+ ssprob = remake (base_ssprob; u0, p)
432+ @test base_sol == solve (ssprob, DynamicSS (Tsit5 ()))
433+ eprob = remake (base_eprob; u0, p)
434+ @test base_esol == solve (eprob, DynamicSS (Tsit5 ()); trajectories = 2 )
435+ end
255436end
0 commit comments