Skip to content

Commit 579b87f

Browse files
Harsh SinghHarsh Singh
authored andcommitted
Fixes
1 parent 887a34f commit 579b87f

5 files changed

Lines changed: 86 additions & 8 deletions

File tree

lib/StochasticDiffEqROCK/Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ StochasticDiffEqCore = "19c5a474-6cd1-4a5f-be79-46dc34e54d7f"
1717

1818
[extras]
1919
DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d"
20+
DiffEqNoiseProcess = "77a26b50-5914-5dd7-bc55-306e6241c503"
2021
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
2122
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
2223
SDEProblemLibrary = "c72e72a9-a271-4b2b-8966-303ed956772e"
@@ -45,7 +46,7 @@ SafeTestsets = "0.1.0"
4546
julia = "1.10"
4647

4748
[targets]
48-
test = ["Test", "Pkg", "SafeTestsets", "DiffEqDevTools", "SDEProblemLibrary", "Random"]
49+
test = ["Test", "Pkg", "SafeTestsets", "DiffEqDevTools", "DiffEqNoiseProcess", "SDEProblemLibrary", "Random"]
4950

5051
[sources.OrdinaryDiffEqCore]
5152
path = "../OrdinaryDiffEqCore"

lib/StochasticDiffEqROCK/src/perform_step/SROCK_perform_step.jl

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@ end
14261426
@muladd function perform_step!(integrator, cache::KomBurSROCK2Cache)
14271427
(;
14281428
utmp, uᵢ₋₁, uᵢ₋₂, k, yₛ₋₁, yₛ₋₂, yₛ₋₃, SXₛ₋₁, SXₛ₋₂,
1429-
SXₛ₋₃, Gₛ, Xₛ₋₁, Xₛ₋₂, Xₛ₋₃, vec_χ,
1429+
SXₛ₋₃, Gₛ, Xₛ₋₁, Xₛ₋₂, Xₛ₋₃, vec_χ, WikRange,
14301430
) = cache
14311431
(; t, dt, uprev, u, W, p, f) = integrator
14321432
(; recf, mσ, mτ, mδ) = cache.constantcache
@@ -1566,8 +1566,7 @@ end
15661566
ttmp = tᵢ₋₂ + C₁
15671567
integrator.f.g(Gₛ, utmp, p, ttmp)
15681568
WikRange .= 1 .* (1:length(W.dW) .== i)
1569-
# @.. @view(Xₛ₋₂[:,i]) = @view(Gₛ[:,i])
1570-
@.. Xₛ₋₂ = Gₛ * W.dW
1569+
@view(Xₛ₋₂[:, i]) .= @view(Gₛ[:, i])
15711570
end
15721571
mul!(SXₛ₋₂, Xₛ₋₂, W.dW)
15731572
@.. u += μₛ₋₂ * yₛ₋₂ + 3 // 8 * SXₛ₋₂
@@ -1581,14 +1580,13 @@ end
15811580
# @.. utmp = uᵢ₋₁ + μₛ₋₃*yₛ₋₃ + δ₁*yₛ₋₂ - 1//6*W.dW[i]*@view(Xₛ₋₃[:,i]) - 1//2*W.dW[i]*@view(Xₛ₋₂[:,i]) + 1//4*SXₛ₋₃ + 3//4*SXₛ₋₂
15821581
@.. utmp = uᵢ₋₁ + μₛ₋₃ * yₛ₋₃ + δ₁ * yₛ₋₂ + 1 // 4 * SXₛ₋₃ + 3 // 4 * SXₛ₋₂
15831582
mul!(SXₛ₋₁, Xₛ₋₃, WikRange)
1584-
@.. utmp += 1 // 6 * SXₛ₋₁
1583+
@.. utmp -= 1 // 6 * SXₛ₋₁
15851584
mul!(SXₛ₋₁, Xₛ₋₂, WikRange)
1586-
@.. utmp += 1 // 2 * SXₛ₋₁
1585+
@.. utmp -= 1 // 2 * SXₛ₋₁
15871586
ttmp = tᵢ₋₁ + μₛ₋₃ + δ₁
15881587
integrator.f.g(Gₛ, utmp, p, ttmp)
15891588
WikRange .= 1 .* (1:length(W.dW) .== i)
1590-
# @.. @view(Xₛ₋₁[:,i]) = @view(Gₛ[:,i])
1591-
@.. Xₛ₋₁ = Gₛ * WikRange
1589+
@view(Xₛ₋₁[:, i]) .= @view(Gₛ[:, i])
15921590
end
15931591
mul!(SXₛ₋₁, Xₛ₋₁, W.dW)
15941592
@.. u +=- τ) * dt * yₛ₋₁ + 3 // 8 * SXₛ₋₁
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using StochasticDiffEqROCK, DiffEqDevTools, DiffEqNoiseProcess, Test, Random
2+
3+
# Non-diagonal SDE: 2-component system driven by 1 Brownian motion (n=2, m=1)
4+
# du_i = μ u_i dt + σ u_i dW (same scalar Brownian motion for both components)
5+
# Weak solution: E[u_i(T)] = u_i(0) exp(μ T)
6+
7+
const μ_test = -0.5
8+
const σ_test = 0.1
9+
10+
f_nd_oop(u, p, t) = μ_test .* u
11+
g_nd_oop(u, p, t) = σ_test .* reshape(u, length(u), 1)
12+
13+
f_nd_iip!(du, u, p, t) = (du .= μ_test .* u)
14+
function g_nd_iip!(du, u, p, t)
15+
for i in axes(du, 1)
16+
du[i, 1] = σ_test * u[i]
17+
end
18+
end
19+
20+
# Analytic (Itô): u_i(t) = u_i(0) exp((μ - σ²/2)t + σ W(t))
21+
analytic_nd(u0, p, t, W) = u0 .* exp.((μ_test - σ_test^2 / 2) * t .+ σ_test .* W[1])
22+
23+
u0 = [1.0, 1.0]
24+
tspan = (0.0, 1.0)
25+
26+
prob_oop = SDEProblem(
27+
SDEFunction(f_nd_oop, g_nd_oop; analytic = analytic_nd),
28+
u0, tspan;
29+
noise_rate_prototype = zeros(2, 1)
30+
)
31+
prob_iip = SDEProblem(
32+
SDEFunction(f_nd_iip!, g_nd_iip!; analytic = analytic_nd),
33+
u0, tspan;
34+
noise_rate_prototype = zeros(2, 1)
35+
)
36+
37+
Random.seed!(100)
38+
dts = 1 .// 2 .^ (6:-1:2)
39+
40+
@testset "SROCK2 non-diagonal OOP weak convergence (order ~2)" begin
41+
sim = test_convergence(dts, prob_oop, SROCK2(), trajectories = Int(5e4),
42+
save_everystep = false, weak_timeseries_errors = false)
43+
@test abs(sim.𝒪est[:weak_final] - 2.0) < 0.5
44+
end
45+
46+
@testset "SROCK2 non-diagonal IIP weak convergence (order ~2)" begin
47+
sim = test_convergence(dts, prob_iip, SROCK2(), trajectories = Int(5e4),
48+
save_everystep = false, weak_timeseries_errors = false)
49+
@test abs(sim.𝒪est[:weak_final] - 2.0) < 0.5
50+
end
51+
52+
# KomBurSROCK2 smoke test: non-diagonal noise must not crash with DimensionMismatch
53+
@testset "KomBurSROCK2 non-diagonal IIP does not crash" begin
54+
prob_smoke = SDEProblem(f_nd_iip!, g_nd_iip!, u0, tspan;
55+
noise_rate_prototype = zeros(2, 1))
56+
sol = solve(prob_smoke, KomBurSROCK2(), dt = 0.01)
57+
@test sol.retcode == ReturnCode.Success
58+
end
59+
60+
# Smoke test: NoiseWrapper must not crash
61+
@testset "SROCK2 NoiseWrapper does not crash" begin
62+
prob_base = SDEProblem(f_nd_iip!, g_nd_iip!, u0, tspan;
63+
noise_rate_prototype = zeros(2, 1))
64+
sol_base = solve(prob_base, SROCK2(), dt = 0.01, save_noise = true)
65+
W_wrap = NoiseWrapper(sol_base.W)
66+
prob_wrap = SDEProblem(f_nd_iip!, g_nd_iip!, u0, tspan;
67+
noise = W_wrap, noise_rate_prototype = zeros(2, 1))
68+
sol_wrap = solve(prob_wrap, SROCK2(), dt = 0.01)
69+
@test sol_wrap.retcode == ReturnCode.Success
70+
end

lib/StochasticDiffEqROCK/test/runtests.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,9 @@ if TEST_GROUP == "ALL" || TEST_GROUP == "SROCKC2WeakConvergence"
2222
include("weak_convergence/weak_srockc2.jl")
2323
end
2424
end
25+
26+
if TEST_GROUP == "ALL" || TEST_GROUP == "NonDiagonalConvergence"
27+
@time @safetestset "Non-Diagonal Noise Convergence Tests (SROCK2, #3188, #3170)" begin
28+
include("convergence/nondiagonal_convergence.jl")
29+
end
30+
end

lib/StochasticDiffEqROCK/test/test_groups.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@ versions = ["1"]
66
runner = ["self-hosted", "Linux", "X64", "high-memory"]
77
timeout = 240
88

9+
[NonDiagonalConvergence]
10+
versions = ["1"]
11+
912
[QA]
1013
versions = ["1"]

0 commit comments

Comments
 (0)