@@ -175,6 +175,202 @@ let
175
175
end
176
176
end
177
177
178
+ # ## Vector Species/Parameters Tests ###
179
+
180
+ begin
181
+ # Declares the model (with vector species/parameters, with/without default values, and observables).
182
+ t = default_t ()
183
+ @species X (t)[1 : 2 ] Y (t)[1 : 2 ] = [10.0 , 20.0 ] XY (t)[1 : 2 ]
184
+ @parameters p[1 : 2 ] d[1 : 2 ] = [0.2 , 0.5 ]
185
+ rxs = [
186
+ Reaction (p[1 ], [], [X[1 ]]),
187
+ Reaction (p[2 ], [], [X[2 ]]),
188
+ Reaction (d[1 ], [X[1 ]], []),
189
+ Reaction (d[2 ], [X[2 ]], []),
190
+ Reaction (p[1 ], [], [Y[1 ]]),
191
+ Reaction (p[2 ], [], [Y[2 ]]),
192
+ Reaction (d[1 ], [Y[1 ]], []),
193
+ Reaction (d[2 ], [Y[2 ]], [])
194
+ ]
195
+ observed = [XY[1 ] ~ X[1 ] + Y[1 ], XY[2 ] ~ X[2 ] + Y[2 ]]
196
+ @named model_vec = ReactionSystem (rxs, t; observed)
197
+ model_vec = complete (model_vec)
198
+
199
+ # Declares various u0 versions (scalarised and vector forms).
200
+ u0_alts_vec = [
201
+ # Vectors not providing default values.
202
+ [X => [1.0 , 2.0 ]],
203
+ [X[1 ] => 1.0 , X[2 ] => 2.0 ],
204
+ [model_vec. X => [1.0 , 2.0 ]],
205
+ [model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 ],
206
+ [:X => [1.0 , 2.0 ]],
207
+ # Vectors providing default values.
208
+ [X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]],
209
+ [X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ],
210
+ [model_vec. X => [1.0 , 2.0 ], model_vec. Y => [10.0 , 20.0 ]],
211
+ [model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 , model_vec. Y[1 ] => 10.0 , model_vec. Y[2 ] => 20.0 ],
212
+ [:X => [1.0 , 2.0 ], :Y => [10.0 , 20.0 ]],
213
+ # Static vectors not providing default values.
214
+ SA[X => [1.0 , 2.0 ]],
215
+ SA[X[1 ] => 1.0 , X[2 ] => 2.0 ],
216
+ SA[model_vec. X => [1.0 , 2.0 ]],
217
+ SA[model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 ],
218
+ SA[:X => [1.0 , 2.0 ]],
219
+ # Static vectors providing default values.
220
+ SA[X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]],
221
+ SA[X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ],
222
+ SA[model_vec. X => [1.0 , 2.0 ], model_vec. Y => [10.0 , 20.0 ]],
223
+ SA[model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 , model_vec. Y[1 ] => 10.0 , model_vec. Y[2 ] => 20.0 ],
224
+ SA[:X => [1.0 , 2.0 ], :Y => [10.0 , 20.0 ]],
225
+ # Dicts not providing default values.
226
+ Dict ([X => [1.0 , 2.0 ]]),
227
+ Dict ([X[1 ] => 1.0 , X[2 ] => 2.0 ]),
228
+ Dict ([model_vec. X => [1.0 , 2.0 ]]),
229
+ Dict ([model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 ]),
230
+ Dict ([:X => [1.0 , 2.0 ]]),
231
+ # Dicts providing default values.
232
+ Dict ([X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]]),
233
+ Dict ([X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ]),
234
+ Dict ([model_vec. X => [1.0 , 2.0 ], model_vec. Y => [10.0 , 20.0 ]]),
235
+ Dict ([model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 , model_vec. Y[1 ] => 10.0 , model_vec. Y[2 ] => 20.0 ]),
236
+ Dict ([:X => [1.0 , 2.0 ], :Y => [10.0 , 20.0 ]]),
237
+ # Tuples not providing default values.
238
+ (X => [1.0 , 2.0 ]),
239
+ (X[1 ] => 1.0 , X[2 ] => 2.0 ),
240
+ (model_vec. X => [1.0 , 2.0 ]),
241
+ (model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 ),
242
+ (:X => [1.0 , 2.0 ]),
243
+ # Tuples providing default values.
244
+ (X => [1.0 , 2.0 ], Y => [10.0 , 20.0 ]),
245
+ (X[1 ] => 1.0 , X[2 ] => 2.0 , Y[1 ] => 10.0 , Y[2 ] => 20.0 ),
246
+ (model_vec. X => [1.0 , 2.0 ], model_vec. Y => [10.0 , 20.0 ]),
247
+ (model_vec. X[1 ] => 1.0 , model_vec. X[2 ] => 2.0 , model_vec. Y[1 ] => 10.0 , model_vec. Y[2 ] => 20.0 ),
248
+ (:X => [1.0 , 2.0 ], :Y => [10.0 , 20.0 ]),
249
+ ]
250
+
251
+ # Declares various ps versions (vector forms only).
252
+ p_alts_vec = [
253
+ # Vectors not providing default values.
254
+ [p => [1.0 , 2.0 ]],
255
+ [model_vec. p => [1.0 , 2.0 ]],
256
+ [:p => [1.0 , 2.0 ]],
257
+ # Vectors providing default values.
258
+ [p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]],
259
+ [model_vec. p => [4.0 , 5.0 ], model_vec. d => [0.2 , 0.5 ]],
260
+ [:p => [4.0 , 5.0 ], :d => [0.2 , 0.5 ]],
261
+ # Static vectors not providing default values.
262
+ SA[p => [1.0 , 2.0 ]],
263
+ SA[model_vec. p => [1.0 , 2.0 ]],
264
+ SA[:p => [1.0 , 2.0 ]],
265
+ # Static vectors providing default values.
266
+ SA[p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]],
267
+ SA[model_vec. p => [4.0 , 5.0 ], model_vec. d => [0.2 , 0.5 ]],
268
+ SA[:p => [4.0 , 5.0 ], :d => [0.2 , 0.5 ]],
269
+ # Dicts not providing default values.
270
+ Dict ([p => [1.0 , 2.0 ]]),
271
+ Dict ([model_vec. p => [1.0 , 2.0 ]]),
272
+ Dict ([:p => [1.0 , 2.0 ]]),
273
+ # Dicts providing default values.
274
+ Dict ([p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]]),
275
+ Dict ([model_vec. p => [4.0 , 5.0 ], model_vec. d => [0.2 , 0.5 ]]),
276
+ Dict ([:p => [4.0 , 5.0 ], :d => [0.2 , 0.5 ]]),
277
+ # Tuples not providing default values.
278
+ (p => [1.0 , 2.0 ]),
279
+ (model_vec. p => [1.0 , 2.0 ]),
280
+ (:p => [1.0 , 2.0 ]),
281
+ # Tuples providing default values.
282
+ (p => [4.0 , 5.0 ], d => [0.2 , 0.5 ]),
283
+ (model_vec. p => [4.0 , 5.0 ], model_vec. d => [0.2 , 0.5 ]),
284
+ (:p => [4.0 , 5.0 ], :d => [0.2 , 0.5 ]),
285
+ ]
286
+
287
+ # Declares a timespan.
288
+ tspan = (0.0 , 10.0 )
289
+ end
290
+
291
+ # Perform ODE simulations (singular and ensemble).
292
+ let
293
+ # Creates normal and ensemble problems.
294
+ base_oprob = ODEProblem (model_vec, u0_alts_vec[1 ], tspan, p_alts_vec[1 ])
295
+ base_sol = solve (base_oprob, Tsit5 (); saveat = 1.0 )
296
+ base_eprob = EnsembleProblem (base_oprob)
297
+ base_esol = solve (base_eprob, Tsit5 (); trajectories = 2 , saveat = 1.0 )
298
+
299
+ # Simulates problems for all input types, checking that identical solutions are found.
300
+ @test_broken false # Cannot remake problem (https://github.com/SciML/ModelingToolkit.jl/issues/2804).
301
+ # for u0 in u0_alts_vec, p in p_alts_vec
302
+ # oprob = remake(base_oprob; u0, p)
303
+ # @test base_sol == solve(oprob, Tsit5(); saveat = 1.0)
304
+ # eprob = remake(base_eprob; u0, p)
305
+ # @test base_esol == solve(eprob, Tsit5(); trajectories = 2, saveat = 1.0)
306
+ # end
307
+ end
308
+
309
+ # Perform SDE simulations (singular and ensemble).
310
+ let
311
+ # Creates normal and ensemble problems.
312
+ base_sprob = SDEProblem (model_vec, u0_alts_vec[1 ], tspan, p_alts_vec[1 ])
313
+ base_sol = solve (base_sprob, ImplicitEM (); seed, saveat = 1.0 )
314
+ base_eprob = EnsembleProblem (base_sprob)
315
+ base_esol = solve (base_eprob, ImplicitEM (); seed, trajectories = 2 , saveat = 1.0 )
316
+
317
+ # Simulates problems for all input types, checking that identical solutions are found.
318
+ @test_broken false # Cannot remake problem (https://github.com/SciML/ModelingToolkit.jl/issues/2804).
319
+ # for u0 in u0_alts_vec, p in p_alts_vec
320
+ # sprob = remake(base_sprob; u0, p)
321
+ # @test base_sol == solve(sprob, ImplicitEM(); seed, saveat = 1.0)
322
+ # eprob = remake(base_eprob; u0, p)
323
+ # @test base_esol == solve(eprob, ImplicitEM(); seed, trajectories = 2, saveat = 1.0)
324
+ # end
325
+ end
326
+
327
+ # Perform jump simulations (singular and ensemble).
328
+ let
329
+ # Creates normal and ensemble problems.
330
+ base_dprob = DiscreteProblem (model_vec, u0_alts_vec[1 ], tspan, p_alts_vec[1 ])
331
+ base_jprob = JumpProblem (model_vec, base_dprob, Direct (); rng)
332
+ base_sol = solve (base_jprob, SSAStepper (); seed, saveat = 1.0 )
333
+ base_eprob = EnsembleProblem (base_jprob)
334
+ base_esol = solve (base_eprob, SSAStepper (); seed, trajectories = 2 , saveat = 1.0 )
335
+
336
+ # Simulates problems for all input types, checking that identical solutions are found.
337
+ @test_broken false # Cannot remake problem (https://github.com/SciML/ModelingToolkit.jl/issues/2804).
338
+ # for u0 in u0_alts_vec, p in p_alts_vec
339
+ # jprob = remake(base_jprob; u0, p)
340
+ # @test base_sol == solve(base_jprob, SSAStepper(); seed, saveat = 1.0)
341
+ # eprob = remake(base_eprob; u0, p)
342
+ # @test base_esol == solve(eprob, SSAStepper(); seed, trajectories = 2, saveat = 1.0)
343
+ # end
344
+ end
345
+
346
+ # Solves a nonlinear problem (EnsembleProblems are not possible for these).
347
+ let
348
+ base_nlprob = NonlinearProblem (model_vec, u0_alts_vec[1 ], p_alts_vec[1 ])
349
+ base_sol = solve (base_nlprob, NewtonRaphson ())
350
+ @test_broken false # Cannot remake problem (https://github.com/SciML/ModelingToolkit.jl/issues/2804).
351
+ # for u0 in u0_alts_vec, p in p_alts_vec
352
+ # nlprob = remake(base_nlprob; u0, p)
353
+ # @test base_sol == solve(nlprob, NewtonRaphson())
354
+ # end
355
+ end
356
+
357
+ # Perform steady state simulations (singular and ensemble).
358
+ let
359
+ # Creates normal and ensemble problems.
360
+ base_ssprob = SteadyStateProblem (model_vec, u0_alts_vec[1 ], p_alts_vec[1 ])
361
+ base_sol = solve (base_ssprob, DynamicSS (Tsit5 ()))
362
+ base_eprob = EnsembleProblem (base_ssprob)
363
+ base_esol = solve (base_eprob, DynamicSS (Tsit5 ()); trajectories = 2 )
364
+
365
+ # Simulates problems for all input types, checking that identical solutions are found.
366
+ @test_broken false # Cannot remake problem (https://github.com/SciML/ModelingToolkit.jl/issues/2804).
367
+ # for u0 in u0_alts_vec, p in p_alts_vec
368
+ # ssprob = remake(base_ssprob; u0, p)
369
+ # @test base_sol == solve(ssprob, DynamicSS(Tsit5()))
370
+ # eprob = remake(base_eprob; u0, p)
371
+ # @test base_esol == solve(eprob, DynamicSS(Tsit5()); trajectories = 2)
372
+ # end
373
+ end
178
374
179
375
# ## Checks Errors On Faulty Inputs ###
180
376
0 commit comments