Skip to content

Commit 1adfc4c

Browse files
committed
vector valued inputs
1 parent aed4a9c commit 1adfc4c

File tree

1 file changed

+181
-0
lines changed

1 file changed

+181
-0
lines changed

test/sciml_problem_inputs.jl

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
255436
end

0 commit comments

Comments
 (0)