Skip to content

Commit 737490d

Browse files
authoredJul 27, 2024··
Merge pull request #2806 from TorkelE/add_indexing_tests
Add tests of various features
2 parents 39d2828 + 81ce97e commit 737490d

File tree

2 files changed

+149
-0
lines changed

2 files changed

+149
-0
lines changed
 

‎test/runtests.jl

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ end
4343
@safetestset "PDE Construction Test" include("pde.jl")
4444
@safetestset "JumpSystem Test" include("jumpsystem.jl")
4545
@safetestset "Constraints Test" include("constraints.jl")
46+
@safetestset "SciML Problem Input Test" include("sciml_problem_inputs.jl")
4647
@safetestset "Reduction Test" include("reduction.jl")
4748
@safetestset "Split Parameters Test" include("split_parameters.jl")
4849
@safetestset "StaticArrays Test" include("static_arrays.jl")

‎test/sciml_problem_inputs.jl

+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
### Prepares Tests ###
2+
3+
# Fetch packages
4+
using ModelingToolkit, JumpProcesses, NonlinearSolve, OrdinaryDiffEq, StaticArrays,
5+
SteadyStateDiffEq, StochasticDiffEq, Test
6+
using ModelingToolkit: t_nounits as t, D_nounits as D
7+
8+
# Sets rnd number.
9+
using StableRNGs
10+
rng = StableRNG(12345)
11+
seed = rand(rng, 1:100)
12+
13+
### Basic Tests ###
14+
15+
# Prepares a models and initial conditions/parameters (of different forms) to be used as problem inputs.
16+
begin
17+
# Prepare system components.
18+
@parameters kp kd k1 k2=0.5 Z0
19+
@variables X(t) Y(t) Z(t)=Z0
20+
alg_eqs = [
21+
0 ~ kp - k1 * X + k2 * Y - kd * X,
22+
0 ~ -k1 * Y + k1 * X - k2 * Y + k2 * Z,
23+
0 ~ k1 * Y - k2 * Z
24+
]
25+
diff_eqs = [
26+
D(X) ~ kp - k1 * X + k2 * Y - kd * X,
27+
D(Y) ~ -k1 * Y + k1 * X - k2 * Y + k2 * Z,
28+
D(Z) ~ k1 * Y - k2 * Z
29+
]
30+
noise_eqs = fill(0.01, 3, 6)
31+
jumps = [
32+
MassActionJump(kp, Pair{Symbolics.BasicSymbolic{Real}, Int64}[], [X => 1]),
33+
MassActionJump(kd, [X => 1], [X => -1]),
34+
MassActionJump(k1, [X => 1], [X => -1, Y => 1]),
35+
MassActionJump(k2, [Y => 1], [X => 1, Y => -1]),
36+
MassActionJump(k1, [Y => 1], [Y => -1, Z => 1]),
37+
MassActionJump(k2, [Z => 1], [Y => 1, Z => -1])
38+
]
39+
40+
# Create systems (without structural_simplify, since that might modify systems to affect intended tests).
41+
osys = complete(ODESystem(diff_eqs, t; name = :osys))
42+
ssys = complete(SDESystem(
43+
diff_eqs, noise_eqs, t, [X, Y, Z], [kp, kd, k1, k2]; name = :ssys))
44+
jsys = complete(JumpSystem(jumps, t, [X, Y, Z], [kp, kd, k1, k2]; name = :jsys))
45+
nsys = complete(NonlinearSystem(alg_eqs; name = :nsys))
46+
47+
u0_alts = [
48+
# Vectors not providing default values.
49+
[X => 4, Y => 5],
50+
[osys.X => 4, osys.Y => 5],
51+
# Vectors providing default values.
52+
[X => 4, Y => 5, Z => 10],
53+
[osys.X => 4, osys.Y => 5, osys.Z => 10],
54+
# Static vectors not providing default values.
55+
SA[X => 4, Y => 5],
56+
SA[osys.X => 4, osys.Y => 5],
57+
# Static vectors providing default values.
58+
SA[X => 4, Y => 5, Z => 10],
59+
SA[osys.X => 4, osys.Y => 5, osys.Z => 10],
60+
# Dicts not providing default values.
61+
Dict([X => 4, Y => 5]),
62+
Dict([osys.X => 4, osys.Y => 5]),
63+
# Dicts providing default values.
64+
Dict([X => 4, Y => 5, Z => 10]),
65+
Dict([osys.X => 4, osys.Y => 5, osys.Z => 10]),
66+
# Tuples not providing default values.
67+
(X => 4, Y => 5),
68+
(osys.X => 4, osys.Y => 5),
69+
# Tuples providing default values.
70+
(X => 4, Y => 5, Z => 10),
71+
(osys.X => 4, osys.Y => 5, osys.Z => 10)
72+
]
73+
tspan = (0.0, 10.0)
74+
p_alts = [
75+
# Vectors not providing default values.
76+
[kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10],
77+
[osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10],
78+
# Vectors providing default values.
79+
[kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10],
80+
[osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.k2 => 0.5, osys.Z0 => 10],
81+
# Static vectors not providing default values.
82+
SA[kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10],
83+
SA[osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10],
84+
# Static vectors providing default values.
85+
SA[kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10],
86+
SA[osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.k2 => 0.5, osys.Z0 => 10],
87+
# Dicts not providing default values.
88+
Dict([kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10]),
89+
Dict([osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10]),
90+
# Dicts providing default values.
91+
Dict([kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10]),
92+
Dict([osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25,
93+
osys.k2 => 0.5, osys.Z0 => 10]),
94+
# Tuples not providing default values.
95+
(kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10),
96+
(osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10),
97+
# Tuples providing default values.
98+
(kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10),
99+
(osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.k2 => 0.5, osys.Z0 => 10)
100+
]
101+
end
102+
103+
# Perform ODE simulations (singular and ensemble).
104+
let
105+
# Creates normal and ensemble problems.
106+
base_oprob = ODEProblem(osys, u0_alts[1], tspan, p_alts[1])
107+
base_sol = solve(base_oprob, Tsit5(); saveat = 1.0)
108+
base_eprob = EnsembleProblem(base_oprob)
109+
base_esol = solve(base_eprob, Tsit5(); trajectories = 2, saveat = 1.0)
110+
111+
# Simulates problems for all input types, checking that identical solutions are found.
112+
# test failure.
113+
for u0 in u0_alts, p in p_alts
114+
oprob = remake(base_oprob; u0, p)
115+
@test base_sol == solve(oprob, Tsit5(); saveat = 1.0)
116+
eprob = remake(base_eprob; u0, p)
117+
@test base_esol == solve(eprob, Tsit5(); trajectories = 2, saveat = 1.0)
118+
end
119+
end
120+
121+
# Solves a nonlinear problem (EnsembleProblems are not possible for these).
122+
let
123+
base_nlprob = NonlinearProblem(nsys, u0_alts[1], p_alts[1])
124+
base_sol = solve(base_nlprob, NewtonRaphson())
125+
# Solves problems for all input types, checking that identical solutions are found.
126+
for u0 in u0_alts, p in p_alts
127+
nlprob = remake(base_nlprob; u0, p)
128+
@test base_sol == solve(nlprob, NewtonRaphson())
129+
end
130+
end
131+
132+
# Perform steady state simulations (singular and ensemble).
133+
let
134+
# Creates normal and ensemble problems.
135+
base_ssprob = SteadyStateProblem(osys, u0_alts[1], p_alts[1])
136+
base_sol = solve(base_ssprob, DynamicSS(Tsit5()))
137+
base_eprob = EnsembleProblem(base_ssprob)
138+
base_esol = solve(base_eprob, DynamicSS(Tsit5()); trajectories = 2)
139+
140+
# Simulates problems for all input types, checking that identical solutions are found.
141+
# test failure.
142+
for u0 in u0_alts, p in p_alts
143+
ssprob = remake(base_ssprob; u0, p)
144+
@test base_sol == solve(ssprob, DynamicSS(Tsit5()))
145+
eprob = remake(base_eprob; u0, p)
146+
@test base_esol == solve(eprob, DynamicSS(Tsit5()); trajectories = 2)
147+
end
148+
end

0 commit comments

Comments
 (0)
Please sign in to comment.