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