Skip to content

Commit 402e10b

Browse files
Merge branch 'master' into W2Ito1
2 parents e4abed8 + 2930ba8 commit 402e10b

17 files changed

+207
-100
lines changed

.github/workflows/CI.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ jobs:
2121
- AlgConvergence3
2222
- WeakConvergence1
2323
version:
24+
- 'lts'
2425
- '1'
25-
- '1.6'
26+
- 'pre'
2627
steps:
2728
- uses: actions/checkout@v4
2829
- uses: julia-actions/setup-julia@v2

Project.toml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "StochasticDiffEq"
22
uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
33
authors = ["Chris Rackauckas <[email protected]>"]
4-
version = "6.65.1"
4+
version = "6.70.0"
55

66
[deps]
77
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
@@ -10,6 +10,7 @@ DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
1010
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
1111
DiffEqNoiseProcess = "77a26b50-5914-5dd7-bc55-306e6241c503"
1212
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
13+
FastPower = "a4df4552-cc26-4903-aec0-212e50a0e84b"
1314
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
1415
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
1516
JumpProcesses = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5"
@@ -34,9 +35,10 @@ UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
3435
Adapt = "3, 4"
3536
ArrayInterface = "6, 7"
3637
DataStructures = "0.18"
37-
DiffEqBase = "6.130.1"
38+
DiffEqBase = "6.154"
3839
DiffEqNoiseProcess = "5.13"
3940
DocStringExtensions = "0.8, 0.9"
41+
FastPower = "1"
4042
FiniteDiff = "2"
4143
ForwardDiff = "0.10.3"
4244
JumpProcesses = "9"
@@ -45,18 +47,18 @@ LinearAlgebra = "1.6"
4547
Logging = "1.6"
4648
MuladdMacro = "0.2.1"
4749
NLsolve = "4"
48-
OrdinaryDiffEq = "6.52"
50+
OrdinaryDiffEq = "6.87"
4951
Random = "1.6"
5052
RandomNumbers = "1.5.3"
5153
RecursiveArrayTools = "2, 3"
5254
Reexport = "0.2, 1.0"
53-
SciMLBase = "2.0.6"
55+
SciMLBase = "2.51"
5456
SciMLOperators = "0.2.9, 0.3"
5557
SparseArrays = "1.6"
5658
SparseDiffTools = "2"
5759
StaticArrays = "0.11, 0.12, 1.0"
5860
UnPack = "0.1, 1.0"
59-
julia = "1.6"
61+
julia = "1.10"
6062

6163
[extras]
6264
DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def"

src/StochasticDiffEq.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ using DocStringExtensions
1414
beta2_default, beta1_default, gamma_default,
1515
qmin_default, qmax_default, qsteady_min_default, qsteady_max_default,
1616
stepsize_controller!, accept_step_controller, step_accept_controller!,
17-
step_reject_controller!, PIController, DummyController
17+
step_reject_controller!, PIController, DummyController, issplit
1818

1919
using UnPack, RecursiveArrayTools, DataStructures
2020
using DiffEqNoiseProcess, Random, ArrayInterface
@@ -35,6 +35,8 @@ using DocStringExtensions
3535
using LinearAlgebra, Random
3636

3737
import ForwardDiff.Dual
38+
39+
import FastPower
3840

3941
import DiffEqBase: step!, initialize!, DEAlgorithm,
4042
AbstractSDEAlgorithm, AbstractRODEAlgorithm, DEIntegrator, AbstractDiffEqInterpolation,
@@ -47,7 +49,8 @@ using DocStringExtensions
4749
resize_non_user_cache!,deleteat_non_user_cache!,addat_non_user_cache!,
4850
terminate!,get_du, get_dt,get_proposed_dt,set_proposed_dt!,
4951
u_modified!,savevalues!,add_tstop!,add_saveat!,set_reltol!,
50-
set_abstol!, postamble!, last_step_failed, has_Wfact, has_jac
52+
set_abstol!, postamble!, last_step_failed, has_Wfact, has_jac,
53+
get_tstops, get_tstops_array, get_tstops_max
5154

5255
using DiffEqBase: check_error!, is_diagonal_noise, @..
5356

src/alg_utils.jl

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -134,22 +134,22 @@ beta1_default(alg::Union{StochasticDiffEqAlgorithm,StochasticDiffEqRODEAlgorithm
134134

135135
isdtchangeable(alg::Union{StochasticDiffEqAlgorithm,StochasticDiffEqRODEAlgorithm}) = true
136136

137-
alg_interpretation(alg::StochasticDiffEqAlgorithm) = :Ito
138-
alg_interpretation(alg::EulerHeun) = :Stratonovich
139-
alg_interpretation(alg::LambaEulerHeun) = :Stratonovich
140-
alg_interpretation(alg::KomBurSROCK2) = :Stratonovich
141-
alg_interpretation(alg::RKMil{interpretation}) where {interpretation} = interpretation
142-
alg_interpretation(alg::SROCK1{interpretation,E}) where {interpretation,E} = interpretation
143-
alg_interpretation(alg::RKMilCommute) = alg.interpretation
144-
alg_interpretation(alg::RKMilGeneral) = alg.interpretation
145-
alg_interpretation(alg::ImplicitRKMil{CS,AD,F,P,FDT,ST,CJ,N,T2,Controller,interpretation}) where {CS,AD,F,P,FDT,ST,CJ,N,T2,Controller,interpretation} = interpretation
146-
147-
alg_interpretation(alg::RS1) = :Stratonovich
148-
alg_interpretation(alg::RS2) = :Stratonovich
149-
150-
alg_interpretation(alg::NON) = :Stratonovich
151-
alg_interpretation(alg::COM) = :Stratonovich
152-
alg_interpretation(alg::NON2) = :Stratonovich
137+
SciMLBase.alg_interpretation(alg::StochasticDiffEqAlgorithm) = SciMLBase.AlgorithmInterpretation.Ito
138+
SciMLBase.alg_interpretation(alg::EulerHeun) = SciMLBase.AlgorithmInterpretation.Stratonovich
139+
SciMLBase.alg_interpretation(alg::LambaEulerHeun) = SciMLBase.AlgorithmInterpretation.Stratonovich
140+
SciMLBase.alg_interpretation(alg::KomBurSROCK2) = SciMLBase.AlgorithmInterpretation.Stratonovich
141+
SciMLBase.alg_interpretation(alg::RKMil{interpretation}) where {interpretation} = interpretation
142+
SciMLBase.alg_interpretation(alg::SROCK1{interpretation,E}) where {interpretation,E} = interpretation
143+
SciMLBase.alg_interpretation(alg::RKMilCommute) = alg.interpretation
144+
SciMLBase.alg_interpretation(alg::RKMilGeneral) = alg.interpretation
145+
SciMLBase.alg_interpretation(alg::ImplicitRKMil{CS,AD,F,P,FDT,ST,CJ,N,T2,Controller,interpretation}) where {CS,AD,F,P,FDT,ST,CJ,N,T2,Controller,interpretation} = interpretation
146+
147+
SciMLBase.alg_interpretation(alg::RS1) = SciMLBase.AlgorithmInterpretation.Stratonovich
148+
SciMLBase.alg_interpretation(alg::RS2) = SciMLBase.AlgorithmInterpretation.Stratonovich
149+
150+
SciMLBase.alg_interpretation(alg::NON) = SciMLBase.AlgorithmInterpretation.Stratonovich
151+
SciMLBase.alg_interpretation(alg::COM) = SciMLBase.AlgorithmInterpretation.Stratonovich
152+
SciMLBase.alg_interpretation(alg::NON2) = SciMLBase.AlgorithmInterpretation.Stratonovich
153153

154154
alg_compatible(prob, alg::Union{StochasticDiffEqAlgorithm,StochasticDiffEqRODEAlgorithm}) = true
155155
alg_compatible(prob, alg::StochasticDiffEqAlgorithm) = false

src/algorithms.jl

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,49 +77,49 @@ Springer. Berlin Heidelberg (2011)
7777
7878
RKMil: Nonstiff Method
7979
An explicit Runge-Kutta discretization of the strong order 1.0 Milstein method.
80-
Defaults to solving the Ito problem, but RKMil(interpretation=:Stratonovich) makes it solve the Stratonovich problem.
80+
Defaults to solving the Ito problem, but RKMil(interpretation=SciMLBase.AlgorithmInterpretation.Stratonovich) makes it solve the Stratonovich problem.
8181
Only handles scalar and diagonal noise.
8282
"""
8383
struct RKMil{interpretation} <: StochasticDiffEqAdaptiveAlgorithm end
84-
RKMil(;interpretation=:Ito) = RKMil{interpretation}()
84+
RKMil(;interpretation=SciMLBase.AlgorithmInterpretation.Ito) = RKMil{interpretation}()
8585

8686
"""
8787
Kloeden, P.E., Platen, E., Numerical Solution of Stochastic Differential Equations.
8888
Springer. Berlin Heidelberg (2011)
8989
9090
RKMilCommute: Nonstiff Method
9191
An explicit Runge-Kutta discretization of the strong order 1.0 Milstein method for commutative noise problems.
92-
Defaults to solving the Ito problem, but RKMilCommute(interpretation=:Stratonovich) makes it solve the Stratonovich problem.
92+
Defaults to solving the Ito problem, but RKMilCommute(interpretation=SciMLBase.AlgorithmInterpretation.Stratonovich) makes it solve the Stratonovich problem.
9393
Uses a 1.5/2.0 error estimate for adaptive time stepping.
9494
Default: ii_approx=IICommutative() does not approximate the Levy area.
9595
"""
96-
struct RKMilCommute{T} <: StochasticDiffEqAdaptiveAlgorithm
97-
interpretation::Symbol
96+
struct RKMilCommute{T} <: StochasticDiffEqAdaptiveAlgorithm
97+
interpretation::SciMLBase.AlgorithmInterpretation.T
9898
ii_approx::T
9999
end
100-
RKMilCommute(;interpretation=:Ito, ii_approx=IICommutative()) = RKMilCommute(interpretation,ii_approx)
100+
RKMilCommute(;interpretation=SciMLBase.AlgorithmInterpretation.Ito, ii_approx=IICommutative()) = RKMilCommute(interpretation,ii_approx)
101101

102102
"""
103103
Kloeden, P.E., Platen, E., Numerical Solution of Stochastic Differential Equations.
104104
Springer. Berlin Heidelberg (2011)
105105
106106
RKMilGeneral: Nonstiff Method
107-
RKMilGeneral(;interpretation=:Ito, ii_approx=IILevyArea()
107+
RKMilGeneral(;interpretation=SciMLBase.AlgorithmInterpretation.Ito, ii_approx=IILevyArea()
108108
An explicit Runge-Kutta discretization of the strong order 1.0 Milstein method for general non-commutative noise problems.
109-
Allows for a choice of interpretation between :Ito and :Stratonovich.
109+
Allows for a choice of interpretation between SciMLBase.AlgorithmInterpretation.Ito and SciMLBase.AlgorithmInterpretation.Stratonovich.
110110
Allows for a choice of iterated integral approximation.
111111
Default: ii_approx=IILevyArea() uses LevyArea.jl to choose optimal algorithm. See
112112
Kastner, F. and Rößler, A., arXiv: 2201.08424
113113
Kastner, F. and Rößler, A., LevyArea.jl, 10.5281/ZENODO.5883748, https://github.com/stochastics-uni-luebeck/LevyArea.jl
114114
"""
115115
struct RKMilGeneral{T, TruncationType} <: StochasticDiffEqAdaptiveAlgorithm
116-
interpretation::Symbol
116+
interpretation::SciMLBase.AlgorithmInterpretation.T
117117
ii_approx::T
118118
c::Int
119119
p::TruncationType
120120
end
121121

122-
function RKMilGeneral(;interpretation=:Ito,ii_approx=IILevyArea(), c=1, p=nothing, dt=nothing)
122+
function RKMilGeneral(;interpretation=SciMLBase.AlgorithmInterpretation.Ito,ii_approx=IILevyArea(), c=1, p=nothing, dt=nothing)
123123
γ = 1//1
124124
p==true && (p = Int(floor(c*dt^(1//1-2//1*γ)) + 1))
125125
RKMilGeneral{typeof(ii_approx), typeof(p)}(interpretation, ii_approx, c, p)
@@ -160,13 +160,13 @@ struct WangLi3SMil_F <: StochasticDiffEqAlgorithm end
160160
"""
161161
SROCK1: S-ROCK Method
162162
Is a fixed step size stabilized explicit method for stiff problems.
163-
Defaults to solving th Ito problem but SROCK1(interpretation=:Stratonovich) can make it solve the Stratonovich problem.
163+
Defaults to solving th Ito problem but SROCK1(interpretation=SciMLBase.AlgorithmInterpretation.Stratonovich) can make it solve the Stratonovich problem.
164164
Strong order of convergence is 0.5 and weak order 1, but is optimised to get order 1 in case os scalar/diagonal noise.
165165
"""
166166
struct SROCK1{interpretation,E} <: StochasticDiffEqAlgorithm
167167
eigen_est::E
168168
end
169-
SROCK1(;interpretation=:Ito,eigen_est=nothing) = SROCK1{interpretation,typeof(eigen_est)}(eigen_est)
169+
SROCK1(;interpretation=SciMLBase.AlgorithmInterpretation.Ito,eigen_est=nothing) = SROCK1{interpretation,typeof(eigen_est)}(eigen_est)
170170

171171
# Weak Order 2
172172
for Alg in [:SROCK2, :KomBurSROCK2, :SROCKC2]
@@ -714,7 +714,7 @@ ImplicitEulerHeun(;chunk_size=0,autodiff=true,diff_type=Val{:central},
714714
ImplicitRKMil: Stiff Method
715715
An order 1.0 drift-implicit method.
716716
This is a theta method which defaults to theta=1 or the Trapezoid method on the drift term.
717-
Defaults to solving the Ito problem, but ImplicitRKMil(interpretation=:Stratonovich) makes it solve the Stratonovich problem.
717+
Defaults to solving the Ito problem, but ImplicitRKMil(interpretation=SciMLBase.AlgorithmInterpretation.Stratonovich) makes it solve the Stratonovich problem.
718718
This method defaults to symplectic=false, but when true and theta=1/2 this is the implicit Midpoint method on the drift term and is symplectic in distribution.
719719
Handles diagonal and scalar noise. Uses a 1.5/2.0 heuristic for adaptive time stepping.
720720
"""
@@ -734,7 +734,7 @@ ImplicitRKMil(;chunk_size=0,autodiff=true,diff_type=Val{:central},
734734
extrapolant=:constant,
735735
theta = 1,symplectic = false,
736736
new_jac_conv_bound = 1e-3,
737-
controller = :Predictive,interpretation=:Ito) =
737+
controller = :Predictive,interpretation=SciMLBase.AlgorithmInterpretation.Ito) =
738738
ImplicitRKMil{chunk_size,autodiff,
739739
typeof(linsolve),typeof(precs),diff_type,
740740
OrdinaryDiffEq._unwrap_val(standardtag),

src/integrators/integrator_interface.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,7 @@ function DiffEqBase.set_u!(integrator::SDEIntegrator, u)
390390
integrator.u = u
391391
u_modified!(integrator, true)
392392
end
393+
394+
DiffEqBase.get_tstops(integ::SDEIntegrator) = integ.opts.tstops
395+
DiffEqBase.get_tstops_array(integ::SDEIntegrator) = get_tstops(integ).valtree
396+
DiffEqBase.get_tstops_max(integ::SDEIntegrator) = maximum(get_tstops_array(integ))

src/integrators/stepsize_controllers.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
function stepsize_controller!(integrator::SDEIntegrator, controller::PIController, alg)
3-
integrator.q11 = DiffEqBase.value(DiffEqBase.fastpow(integrator.EEst,controller.beta1))
4-
integrator.q = DiffEqBase.value(integrator.q11/DiffEqBase.fastpow(integrator.qold,controller.beta2))
3+
integrator.q11 = DiffEqBase.value(FastPower.fastpower(integrator.EEst,controller.beta1))
4+
integrator.q = DiffEqBase.value(integrator.q11/FastPower.fastpower(integrator.qold,controller.beta2))
55
@fastmath integrator.q = DiffEqBase.value(max(inv(integrator.opts.qmax),min(inv(integrator.opts.qmin),integrator.q/integrator.opts.gamma)))
66
end
77

src/perform_step/SROCK_perform_step.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
cosh_inv = log(ω₀ + Sqrt_ω) # arcosh(ω₀)
1515
ω₁ = (Sqrt_ω*cosh(mdeg*cosh_inv))/(mdeg*sinh(mdeg*cosh_inv))
1616

17-
if alg_interpretation(integrator.alg) == :Stratonovich
17+
if SciMLBase.alg_interpretation(integrator.alg) == SciMLBase.AlgorithmInterpretation.Stratonovich
1818
α = cosh(mdeg*cosh_inv)/(2*ω₀*cosh((mdeg-1)*cosh_inv))
1919
γ = 1/(2*α)
2020
β = -γ
@@ -42,7 +42,7 @@
4242
k = integrator.f(uᵢ₋₁,p,tᵢ₋₁)
4343

4444
u = dt*μ*k + ν*uᵢ₋₁ + κ*uᵢ₋₂
45-
if (i > mdeg - 2) && alg_interpretation(integrator.alg) == :Stratonovich
45+
if (i > mdeg - 2) && SciMLBase.alg_interpretation(integrator.alg) == SciMLBase.AlgorithmInterpretation.Stratonovich
4646
if i == mdeg - 1
4747
gₘ₋₂ = integrator.g(uᵢ₋₁,p,tᵢ₋₁)
4848
if W.dW isa Number || !is_diagonal_noise(integrator.sol.prob)
@@ -58,7 +58,7 @@
5858
u .+=.* gₘ₋₂ .+ γ .* gₘ₋₁) .* W.dW
5959
end
6060
end
61-
elseif (i == mdeg) && alg_interpretation(integrator.alg) == :Ito
61+
elseif (i == mdeg) && SciMLBase.alg_interpretation(integrator.alg) == SciMLBase.AlgorithmInterpretation.Ito
6262
if W.dW isa Number
6363
gₘ₋₂ = integrator.g(uᵢ₋₁,p,tᵢ₋₁)
6464
uᵢ₋₂ = uᵢ₋₁ + sqrt(abs(dt))*gₘ₋₂
@@ -105,7 +105,7 @@ end
105105
cosh_inv = log(ω₀ + Sqrt_ω) # arcosh(ω₀)
106106
ω₁ = (Sqrt_ω*cosh(mdeg*cosh_inv))/(mdeg*sinh(mdeg*cosh_inv))
107107

108-
if alg_interpretation(integrator.alg) == :Stratonovich
108+
if SciMLBase.alg_interpretation(integrator.alg) == SciMLBase.AlgorithmInterpretation.Stratonovich
109109
α = cosh(mdeg*cosh_inv)/(2*ω₀*cosh((mdeg-1)*cosh_inv))
110110
γ = 1/(2*α)
111111
β = -γ
@@ -132,7 +132,7 @@ end
132132
κ = - Tᵢ₋₂/Tᵢ
133133
integrator.f(k,uᵢ₋₁,p,tᵢ₋₁)
134134
@.. u = dt*μ*k + ν*uᵢ₋₁ + κ*uᵢ₋₂
135-
if (i > mdeg - 2) && alg_interpretation(integrator.alg) == :Stratonovich
135+
if (i > mdeg - 2) && SciMLBase.alg_interpretation(integrator.alg) == SciMLBase.AlgorithmInterpretation.Stratonovich
136136
if i == mdeg - 1
137137
integrator.g(gₘ₋₂,uᵢ₋₁,p,tᵢ₋₁)
138138
if W.dW isa Number || is_diagonal_noise(integrator.sol.prob)
@@ -152,7 +152,7 @@ end
152152
@.. u += γ*k
153153
end
154154
end
155-
elseif (i == mdeg) && alg_interpretation(integrator.alg) == :Ito
155+
elseif (i == mdeg) && SciMLBase.alg_interpretation(integrator.alg) == SciMLBase.AlgorithmInterpretation.Ito
156156
if W.dW isa Number || is_diagonal_noise(integrator.sol.prob)
157157
integrator.g(gₘ₋₂,uᵢ₋₁,p,tᵢ₋₁)
158158
@.. uᵢ₋₂ = uᵢ₋₁ + sqrt(abs(dt))*gₘ₋₂

0 commit comments

Comments
 (0)