@@ -252,4 +252,185 @@ let
252
252
end
253
253
end
254
254
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
255
436
end
0 commit comments