Skip to content

Commit 64dc1d8

Browse files
test: fix SII test group
1 parent 03cf231 commit 64dc1d8

File tree

3 files changed

+114
-40
lines changed

3 files changed

+114
-40
lines changed

test/downstream/comprehensive_indexing.jl

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,24 @@ begin
2929
sqrt(k1 + Y)
3030
]
3131
jumps = [
32-
ConstantRateJump(kp, [X ~ X + 1]),
33-
ConstantRateJump(kd * X, [X ~ X - 1]),
34-
ConstantRateJump(k1 * X, [X ~ X - 1, Y ~ Y + 1]),
35-
ConstantRateJump(k2 * Y, [X ~ X + 1, Y ~ Y - 1]),
36-
ConstantRateJump(1, [Y ~ Y + 1]),
37-
ConstantRateJump(Y, [Y ~ Y - 1])
32+
ConstantRateJump(kp, [X ~ Pre(X) + 1]),
33+
ConstantRateJump(kd * X, [X ~ Pre(X) - 1]),
34+
ConstantRateJump(k1 * X, [X ~ Pre(X) - 1, Y ~ Pre(Y) + 1]),
35+
ConstantRateJump(k2 * Y, [X ~ Pre(X) + 1, Y ~ Pre(Y) - 1]),
36+
ConstantRateJump(1, [Y ~ Pre(Y) + 1]),
37+
ConstantRateJump(Y, [Y ~ Pre(Y) - 1])
3838
]
39-
observed = [XY ~ X + Y]
39+
obs = [XY ~ X + Y]
4040
loss = kd * (k1 - X)^2 + k2 * (kp * Y - X^2)^2
4141

4242
# Create systems (without structural_simplify, since that might modify systems to affect intended tests).
43-
osys = complete(System(diff_eqs, t; observed, name = :osys))
43+
osys = complete(System(diff_eqs, t; observed = obs, name = :osys))
4444
ssys = complete(System(
45-
diff_eqs, t, [X, Y], [kp, kd, k1, k2]; noise_eqs, observed, name = :ssys))
46-
jsys = complete(JumpSystem(jumps, t, [X, Y], [kp, kd, k1, k2]; observed, name = :jsys))
47-
nsys = complete(System(alg_eqs; observed, name = :nsys))
45+
diff_eqs, t, [X, Y], [kp, kd, k1, k2]; noise_eqs, observed = obs, name = :ssys))
46+
jsys = complete(JumpSystem(jumps, t, [X, Y], [kp, kd, k1, k2]; observed = obs, name = :jsys))
47+
nsys = complete(System(alg_eqs; observed = obs, name = :nsys))
4848
optsys = complete(OptimizationSystem(
49-
loss, [X, Y], [kp, kd, k1, k2]; observed, name = :optsys))
49+
loss, [X, Y], [kp, kd, k1, k2]; observed = obs, name = :optsys))
5050
end
5151

5252
# Prepares problems, integrators, and solutions.
@@ -59,25 +59,23 @@ begin
5959
# Creates problems.
6060
oprob = ODEProblem(osys, [u0_vals; p_vals], tspan)
6161
sprob = SDEProblem(ssys, [u0_vals; p_vals], tspan)
62-
dprob = DiscreteProblem(jsys, )
6362
jprob = JumpProblem(jsys, [u0_vals; p_vals], tspan; aggregator = Direct(), rng)
6463
nprob = NonlinearProblem(nsys, [u0_vals; p_vals])
6564
hcprob = NonlinearProblem(HomotopyNonlinearFunction(nprob.f), nprob.u0, nprob.p)
6665
ssprob = SteadyStateProblem(osys, [u0_vals; p_vals])
6766
optprob = OptimizationProblem(optsys, [u0_vals; p_vals], grad = true, hess = true)
68-
problems = [oprob, sprob, dprob, jprob, nprob, hcprob, ssprob, optprob]
69-
systems = [osys, ssys, jsys, jsys, nsys, nsys, osys, optsys]
67+
problems = [oprob, sprob, jprob, nprob, hcprob, ssprob, optprob]
68+
systems = [osys, ssys, jsys, nsys, nsys, osys, optsys]
7069

7170
# Creates an `EnsembleProblem` for each problem.
7271
eoprob = EnsembleProblem(oprob)
7372
esprob = EnsembleProblem(sprob)
74-
edprob = EnsembleProblem(dprob)
7573
ejprob = EnsembleProblem(jprob)
7674
enprob = EnsembleProblem(nprob)
7775
essprob = EnsembleProblem(ssprob)
7876
eoptprob = EnsembleProblem(optprob)
79-
eproblems = [eoprob, esprob, edprob, ejprob, enprob, essprob, optprob]
80-
esystems = [osys, ssys, jsys, jsys, nsys, osys, optsys]
77+
eproblems = [eoprob, esprob, ejprob, enprob, essprob, optprob]
78+
esystems = [osys, ssys, jsys, nsys, osys, optsys]
8179

8280
# Creates integrators.
8381
oint = init(oprob, Tsit5(); save_everystep = false)
@@ -912,8 +910,9 @@ end
912910
@testset "Continuous interpolation before discrete save" begin
913911
@variables x(t)
914912
@parameters c(t)
913+
devt = ModelingToolkit.SymbolicDiscreteCallback(1.0, [c ~ Pre(c) + 1]; discrete_parameters = [c], iv = t)
915914
@mtkcompile sys = System(
916-
D(x) ~ c * cos(x), t, [x], [c]; discrete_events = [1.0 => [c ~ Pre(c) + 1]])
915+
D(x) ~ c * cos(x), t, [x], [c]; discrete_events = [devt])
917916
prob = ODEProblem(sys, [x => 0.0, c => 1.0], (0.0, 2pi))
918917
sol = solve(prob, Tsit5())
919918
@test_nowarn sol(-0.1; idxs = sys.x)
@@ -925,7 +924,7 @@ end
925924
@testset "DDEs" begin
926925
function oscillator(; name, k = 1.0, τ = 0.01)
927926
@parameters k=k τ=τ
928-
@variables x(..)=0.1+t y(t)=0.1+t jcn(t)=0.0+t delx(t)
927+
@variables x(..)=0.1+t y(t)=0.1+t jcn(t) delx(t)
929928
eqs = [D(x(t)) ~ y,
930929
D(y) ~ -k * x(t - τ) + jcn,
931930
delx ~ x(t - τ)]
@@ -956,7 +955,7 @@ end
956955
function oscillator(; name, k = 1.0, τ = 0.01)
957956
@parameters k=k τ=τ
958957
@brownian a
959-
@variables x(..)=0.1+t y(t)=0.1+t jcn(t)=0.0+t delx(t)
958+
@variables x(..)=0.1+t y(t)=0.1+t jcn(t) delx(t)
960959
eqs = [D(x(t)) ~ y + a,
961960
D(y) ~ -k * x(t - τ) + jcn,
962961
delx ~ x(t - τ)]
@@ -988,7 +987,7 @@ end
988987
end
989988
db = 1.0 => ModelingToolkit.ImperativeAffect(affect2!; modified = (; k))
990989

991-
@named ssys = System(D(A) ~ k * A, t, [A], [k]; noise_eqs = [0.0] discrete_events = db)
990+
@named ssys = System(D(A) ~ k * A, t, [A], [k]; noise_eqs = [0.0], discrete_events = db)
992991
ssys = complete(ssys)
993992
prob = SDEProblem(ssys, [A => 1.0, k => 1.0], (0.0, 4.0))
994993
sol = solve(prob, RI5())

test/downstream/modelingtoolkit_remake.jl

Lines changed: 90 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ eqs = [D(x) ~ σ * (y - x),
1818
D(y) ~ x *- z) - y,
1919
D(z) ~ x * y - β * z]
2020

21-
@named sys = System(eqs, t; parameter_dependencies = [q ~ 3β])
21+
@named sys = System([eqs; q ~ 3β], t)
2222
sys = complete(sys)
2323
u0 = [x => 1.0,
2424
y => 0.0,
@@ -65,20 +65,7 @@ push!(probs, JumpProblem(js, [u0; p], tspan; aggregator = Direct()))
6565
@named optsys = OptimizationSystem(sum(eq.lhs for eq in eqs), [x, y, z], [σ, ρ, β])
6666
optsys = complete(optsys)
6767
push!(syss, optsys)
68-
push!(probs, OptimizationProblem(optsys, u0, p))
69-
70-
k = ShiftIndex(t)
71-
@mtkcompile discsys = System(
72-
[x ~ x(k - 1) * ρ + y(k - 2), y ~ y(k - 1) * σ - z(k - 2), z ~ z(k - 1) * β + x(k - 2)],
73-
t; defaults = [x => 1.0, y => 1.0, z => 1.0, x(k-1) => 0.0, y(k-1) => 0.0, z(k-1) => 0.0])
74-
# Roundabout method to avoid having to specify values for previous timestep
75-
discprob = DiscreteProblem(discsys, p, (0, 10))
76-
for (var, v) in u0
77-
discprob[var] = v
78-
discprob[var(k - 1)] = 0.0
79-
end
80-
push!(syss, discsys)
81-
push!(probs, discprob)
68+
push!(probs, OptimizationProblem(optsys, [u0; p]))
8269

8370
@mtkcompile sys = System(
8471
[0 ~ x^3 * β + y^3 * ρ - σ, 0 ~ x^2 + 2x * y + y^2, 0 ~ z^2 - 4z + 4],
@@ -167,6 +154,94 @@ for (sys, prob) in zip(syss, probs)
167154
# Not testing `Symbol => expr` since nested substitution doesn't work with that
168155
end
169156

157+
@testset "DiscreteProblem" begin
158+
k = ShiftIndex(t)
159+
@mtkcompile discsys = System(
160+
[x ~ x(k - 1) * ρ + y(k - 2), y ~ y(k - 1) * σ - z(k - 2), z ~ z(k - 1) * β + x(k - 2)],
161+
t; defaults = [x => 1.0, y => 1.0, z => 1.0, x(k-1) => 0.0, y(k-1) => 0.0, z(k-1) => 0.0])
162+
prob = DiscreteProblem(discsys, p, (0, 10))
163+
prob[x(k-1)] = 1.0
164+
prob[y(k-1)] = prob[z(k-1)] = 0.0
165+
166+
@test parameter_values(prob) isa ModelingToolkit.MTKParameters
167+
@inferred typeof(prob) remake(prob)
168+
169+
baseType = Base.typename(typeof(prob)).wrapper
170+
ugetter = getsym(prob, [x(k-1), y(k-1), z(k-1)])
171+
prob2 = @inferred baseType remake(prob; u0 = [x(k-1) => 2.0, y(k-1) => 3.0, z(k-1) => 4.0])
172+
@test ugetter(prob2) == [2.0, 3.0, 4.0]
173+
prob2 = @inferred baseType remake(prob; u0 = [sys.x(k-1) => 2.0, sys.y(k-1) => 3.0, sys.z(k-1) => 4.0])
174+
@test ugetter(prob2) == [2.0, 3.0, 4.0]
175+
prob2 = @inferred baseType remake(prob; u0 = [:xₜ₋₁ => 2.0, :yₜ₋₁ => 3.0, :zₜ₋₁ => 4.0])
176+
@test ugetter(prob2) == [2.0, 3.0, 4.0]
177+
prob2 = @inferred baseType remake(prob; u0 = [x(k-1) => 2.0, sys.y(k-1) => 3.0, :zₜ₋₁ => 4.0])
178+
@test ugetter(prob2) == [2.0, 3.0, 4.0]
179+
180+
prob2 = @inferred baseType remake(prob; u0 = [x(k-1) => 12.0])
181+
@test ugetter(prob2) == [12.0, 0.0, 0.0]
182+
prob2 = @inferred baseType remake(prob; u0 = [sys.x(k-1) => 12.0])
183+
@test ugetter(prob2) == [12.0, 0.0, 0.0]
184+
prob2 = @inferred baseType remake(prob; u0 = [:xₜ₋₁ => 12.0])
185+
@test ugetter(prob2) == [12.0, 0.0, 0.0]
186+
187+
pgetter = getp(prob, [σ, β, ρ])
188+
prob2 = @inferred baseType remake(prob; p ==> 0.1, β => 0.2, ρ => 0.3])
189+
@test pgetter(prob2) == [0.1, 0.2, 0.3]
190+
if prob isa ODEProblem
191+
@test prob2.ps[q] 0.6
192+
end
193+
prob2 = @inferred baseType remake(prob; p = [sys.σ => 0.1, sys.β => 0.2, sys.ρ => 0.3])
194+
@test pgetter(prob2) == [0.1, 0.2, 0.3]
195+
if prob isa ODEProblem
196+
@test prob2.ps[q] 0.6
197+
end
198+
prob2 = @inferred baseType remake(prob; p = [ => 0.1, => 0.2, => 0.3])
199+
@test pgetter(prob2) == [0.1, 0.2, 0.3]
200+
if prob isa ODEProblem
201+
@test prob2.ps[q] 0.6
202+
end
203+
prob2 = @inferred baseType remake(prob; p ==> 0.1, sys.β => 0.2, => 0.3])
204+
@test pgetter(prob2) == [0.1, 0.2, 0.3]
205+
if prob isa ODEProblem
206+
@test prob2.ps[q] 0.6
207+
end
208+
209+
prob2 = @inferred baseType remake(prob; p ==> 0.5])
210+
@test pgetter(prob2) == [0.5, 8 / 3, 10.0]
211+
prob2 = @inferred baseType remake(prob; p = [sys.σ => 0.5])
212+
@test pgetter(prob2) == [0.5, 8 / 3, 10.0]
213+
prob2 = @inferred baseType remake(prob; p = [ => 0.5])
214+
@test pgetter(prob2) == [0.5, 8 / 3, 10.0]
215+
216+
# Test p dependent on u0
217+
@test_broken begin
218+
prob2 = @inferred baseType remake(prob; p ==> 0.5x(k-1) + 1])
219+
@test pgetter(prob2) [1.5, 8 / 3, 10.0]
220+
prob2 = @inferred baseType remake(prob; p = [sys.σ => 0.5x(k-1) + 1])
221+
@test pgetter(prob2) [1.5, 8 / 3, 10.0]
222+
prob2 = @inferred baseType remake(prob; p = [ => 0.5x(k-1) + 1])
223+
@test pgetter(prob2) [1.5, 8 / 3, 10.0]
224+
end
225+
226+
# Test u0 dependent on p
227+
prob2 = @inferred baseType remake(prob; u0 = [x(k-1) => 0.5σ + 1])
228+
@test ugetter(prob2) [15.0, 0.0, 0.0]
229+
prob2 = @inferred baseType remake(prob; u0 = [sys.x(k-1) => 0.5σ + 1])
230+
@test ugetter(prob2) [15.0, 0.0, 0.0]
231+
prob2 = @inferred baseType remake(prob; u0 = [:xₜ₋₁ => 0.5σ + 1])
232+
@test ugetter(prob2) [15.0, 0.0, 0.0]
233+
234+
# Test u0 dependent on p and p dependent on u0
235+
prob2 = @inferred baseType remake(prob; u0 = [x(k-1) => 0.5σ + 1], p ==> 0.5x(k-1) + 1])
236+
@test ugetter(prob2) [15.0, 0.0, 0.0]
237+
@test_broken pgetter(prob2) [28.0, 8.5, 10.0]
238+
prob2 = @inferred baseType remake(
239+
prob; u0 = [sys.x(k-1) => 0.5σ + 1], p = [sys.β => 0.5x(k-1) + 1])
240+
@test ugetter(prob2) [15.0, 0.0, 0.0]
241+
@test_broken pgetter(prob2) [28.0, 8.5, 10.0]
242+
# Not testing `Symbol => expr` since nested substitution doesn't work with that
243+
end
244+
170245
# Optimization
171246
@parameters p
172247
@mtkcompile sys = System([D(x) ~ -p * x], t)

test/downstream/problem_interface.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,12 @@ eqs = [
214214
D(X) ~ p - d * X,
215215
X2 ~ 2 * X
216216
]
217-
@mtkpile osys = System(eqs, t)
217+
@mtkcompile osys = System(eqs, t)
218218

219219
u0 = [X => 0.1]
220220
tspan = (0.0, 10.0)
221221
ps = [p => 1.0, d => 0.2]
222-
oprob = ODEProblem(osys, u0, tspan, ps)
222+
oprob = ODEProblem(osys, [u0; ps], tspan)
223223
eprob = EnsembleProblem(oprob)
224224

225225
@test eprob[X] == 0.1
@@ -345,7 +345,7 @@ end
345345
b[1] = p[3]
346346
b[2] = -8p[2] - p[1]
347347
end
348-
f = SciMLBase.SymbolicLinearInterface(update_A!, update_b!, sys, nothing)
348+
f = SciMLBase.SymbolicLinearInterface(update_A!, update_b!, sys, nothing, nothing)
349349
A = Float64[1 1 1; 6 -4 5; 5 2 2]
350350
b = Float64[2, 31, 13]
351351
p = Float64[1, -4, 2]

0 commit comments

Comments
 (0)