Skip to content

Commit ce7a03e

Browse files
committed
make noisetype field a namedtuple
1 parent 5c5e6dc commit ce7a03e

File tree

3 files changed

+25
-37
lines changed

3 files changed

+25
-37
lines changed

src/core_systems/characterise_sde.jl

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ function is_time_independent(g, u, p)
1111
val = map(t -> g(u, p, t), trange) |> unique |> length == 1
1212
length(unique(val)) == 1
1313
end
14-
# isinvertible(x) = applicable(inv, x) && isone(inv(x) * x)
15-
isinvertible(x) = issuccess(lu(x, check = false))
14+
is_invertible(x) = issuccess(lu(x, check = false))
1615

1716
function is_linear(f, x, y, c)
1817
check1 = f(x + y) == f(x) + f(y)
@@ -29,7 +28,10 @@ function find_noise_type(prob::SDEProblem, IIP)
2928
u0 = prob.u0
3029
D = length(u0)
3130

32-
properties = Symbol[]
31+
isadditive = false
32+
isautonomous = false
33+
islinear = false
34+
isinvertible = false
3335

3436
function g(u, p, t)
3537
if IIP
@@ -44,38 +46,24 @@ function find_noise_type(prob::SDEProblem, IIP)
4446
state_independent = is_state_independent(g, u0, param, 1.0)
4547

4648
# additive noise is equal to state independent noise
47-
push!(properties, state_independent ? :additive : :multiplicative)
48-
push!(properties, time_independent ? :autonomous : :non_autonomous)
49-
if !state_independent
50-
linear = is_linear(u -> g(u, param, 1.0), rand(D), rand(D), 2.0)
51-
push!(properties, linear ? :linear : :non_linear)
52-
else
53-
push!(properties, :linear)
54-
end
49+
isadditive = state_independent
50+
isautonomous = time_independent
51+
islinear = !state_independent ?
52+
is_linear(u -> g(u, param, 1.0), rand(D), rand(D), 2.0) : true
5553

5654
if time_independent && state_independent
5755
if noise_rate_size == (D, D) && !isnothing(covariance)
58-
error(
59-
"The diffusion function `g` acts as an covariance matrix but
60-
the noise process W also has a covariance matrix. This is ambiguous.")
56+
error("The diffusion function `g` acts as an covariance matrix but the noise process W also has a covariance matrix. This is ambiguous.")
6157
elseif noise_rate_size == (D, D) && isnothing(covariance)
6258
covariance = g(zeros(D), param, 0.0)
63-
if !isinvertible(covariance)
64-
push!(properties, :non_invertible)
65-
else
66-
push!(properties, :invertible)
67-
end
68-
elseif !isnothing(covariance) && !isinvertible(covariance)
69-
push!(properties, :non_invertible)
59+
isinvertible = is_invertible(covariance)
7060
elseif !isnothing(noise_rate_size) && noise_rate_size != (D, D)
71-
push!(properties, :non_invertible)
61+
isinvertible = false
7262
else
73-
push!(properties, :invertible)
63+
isinvertible = isnothing(covariance) || is_invertible(covariance)
7464
end
7565
end
7666

77-
if !isnothing(noise) && D != length(noise.dW) && length(noise.dW) == 1
78-
push!(properties, :scalar)
79-
end
80-
return properties
67+
return (additive = isadditive, autonomous = isautonomous,
68+
linear = islinear, invertible = isinvertible)
8169
end # function

src/core_systems/continuous_time_sde.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ struct CoupledSDEs{IIP,D,I,P,S} <: ContinuousTimeDynamicalSystem
7878
p0::P
7979
noise_strength
8080
diffeq # isn't parameterized because it is only used for display
81-
noise_type::Vector{Symbol}
81+
noise_type::NamedTuple
8282
end
8383

8484
function CoupledSDEs(

test/stochastic_characterisation.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,57 +9,57 @@ IIP = true
99
W = WienerProcess(0.0, zeros(2), zeros(2))
1010
addit_autom_inv = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ; noise = W)
1111
types = addit_autom_inv.noise_type
12-
@test issetequal(types, [:additive, :autonomous, :linear, :invertible])
12+
@test values(types) == (true, true, true, true)
1313

1414
# Scalar Wiener noise
1515
W = WienerProcess(0.0, 0.0, 0.0)
1616
scalar_a = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ; noise = W)
1717
types = scalar_a.noise_type
18-
@test issetequal(types, [:scalar, :additive, :autonomous, :linear, :invertible])
18+
@test values(types) == (true, true, true, true)
1919

2020
# invertible correlated Wiener noise
2121
W = CorrelatedWienerProcess([1 0.3; 0.3 1], 0.0, zeros(2), zeros(2))
2222
corr_a = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ; noise = W)
2323
types = corr_a.noise_type
24-
@test issetequal(types, [:additive, :autonomous, :linear, :invertible])
24+
@test values(types) == (true, true, true, true)
2525

2626
# invertible correlated Wiener noise
2727
g!(du, u, p, t) = (du .= [1 0.3; 0.3 1]; return nothing)
2828
corr_alt = CoupledSDEs(
2929
f!, g!, zeros(2), nothing, σ, noise_rate_prototype = zeros(2, 2),
3030
diffeq = (alg = EM(), dt = 0.1))
3131
types = corr_alt.noise_type
32-
@test issetequal(types, [:additive, :autonomous, :linear, :invertible])
32+
@test values(types) == (true, true, true, true)
3333

3434
# non-invertible correlated Wiener noise
3535
W = CorrelatedWienerProcess([1 2; 2 4], 0.0, zeros(2), zeros(2))
3636
corr_noninv = CoupledSDEs(f!, idfunc!, zeros(2), nothing, σ; noise = W)
3737
types = corr_noninv.noise_type
38-
@test issetequal(types, [:additive, :autonomous, :linear, :non_invertible])
38+
@test values(types) == (true, true, true, false)
3939

4040
# non-invertible correlated Wiener noise
4141
g!(du, u, p, t) = (du .= [1 0.3 1; 0.3 1 1]; return nothing)
4242
corr_alt = CoupledSDEs(
4343
f!, g!, zeros(2), nothing, σ, noise_rate_prototype = zeros(2, 3),
4444
diffeq = (alg = EM(), dt = 0.1))
4545
types = corr_alt.noise_type
46-
@test issetequal(types, [:additive, :autonomous, :linear, :non_invertible])
46+
@test values(types) == (true, true, true, false)
4747

4848
# multiplicative linear Wiener noise
4949
g!(du, u, p, t) = (du .= u; return nothing)
5050
linear_multipli = CoupledSDEs(f!, g!, rand(2) ./ 10, (), σ)
5151
types = linear_multipli.noise_type
52-
@test issetequal(types, [:multiplicative, :autonomous, :linear])
52+
@test values(types) == (false, true, true, false)
5353

5454
# non-diagonal multiplicative linear Wiener noise
5555
lin_multipli_alt = CoupledSDEs(
5656
f!, g!, rand(2), (), σ, noise_rate_prototype = zeros(2, 3),
5757
diffeq = (alg = EM(), dt = 0.1))
5858
types = lin_multipli_alt.noise_type
59-
@test issetequal(types, [:multiplicative, :autonomous, :linear])
59+
@test values(types) == (false, true, true, false)
6060

6161
# multiplicative nonlinear Wiener noise
6262
g!(du, u, p, t) = (du .= u .^ 2; return nothing)
6363
nonlinear_multiplicative = CoupledSDEs(f!, g!, rand(2), (), σ)
6464
types = nonlinear_multiplicative.noise_type
65-
@test issetequal(types, [:multiplicative, :autonomous, :non_linear])
65+
@test values(types) == (false, true, false, false)

0 commit comments

Comments
 (0)