@@ -27,17 +27,16 @@ function simulate(
27
27
t = t0
28
28
truncated = last_jump < tolerance
29
29
while ! truncated
30
- t += rand (rng, Exponential (one (T) / rate))
31
- xi = one (T) / (β * (exp (t / C) - one (T) ))
32
- prob = (one (T) + β * xi) * exp (- β * xi)
30
+ t += rand (rng, Exponential (1 / rate))
31
+ xi = 1 / (β * (exp (t / C) - 1 ))
32
+ prob = (1 + β * xi) * exp (- β * xi)
33
33
if rand (rng) < prob
34
34
push! (jumps, xi)
35
35
last_jump = xi
36
36
end
37
37
truncated = last_jump < tolerance
38
38
end
39
- times = rand (rng, Uniform (start, finish), length (jumps))
40
- return GammaPath (jumps, times)
39
+ return GammaPath (jumps, rand (rng, Uniform (start, finish), length (jumps)))
41
40
end
42
41
end
43
42
@@ -47,85 +46,67 @@ function integral(times::Array{<:Real}, path::GammaPath)
47
46
end
48
47
end
49
48
50
- struct LangevinDynamics{T}
51
- A:: Matrix{T}
52
- L:: Vector{T}
53
- θ:: T
54
- H:: Vector{T}
55
- σe:: T
49
+ struct LangevinDynamics{AT<: AbstractMatrix ,LT<: AbstractVector ,θT<: Real }
50
+ A:: AT
51
+ L:: LT
52
+ θ:: θT
56
53
end
57
54
58
- struct NormalMeanVariance{T}
59
- μ :: T
60
- σ :: T
55
+ function Base . exp (dyn :: LangevinDynamics , dt)
56
+ f_val = exp (dyn . θ * dt)
57
+ return [ 1 (f_val - 1 ) / dyn . θ; 0 f_val]
61
58
end
62
59
63
- f (dt, θ) = exp (θ * dt)
64
- function Base. exp (dyn:: LangevinDynamics{T} , dt:: T ) where {T<: Real }
65
- let θ = dyn. θ
66
- f_val = f (dt, θ)
67
- return [one (T) (f_val - 1 )/ θ; zero (T) f_val]
68
- end
69
- end
70
-
71
- function meancov (
72
- t:: T , dyn:: LangevinDynamics , path:: GammaPath , nvm:: NormalMeanVariance
73
- ) where {T<: Real }
74
- μ = zeros (T, 2 )
75
- Σ = zeros (T, (2 , 2 ))
76
- let times = path. times, jumps = path. jumps, μw = nvm. μ, σw = nvm. σ
77
- for (v, z) in zip (times, jumps)
78
- ft = exp (dyn, (t - v)) * dyn. L
79
- μ += ft .* μw .* z
80
- Σ += ft * transpose (ft) .* σw^ 2 .* z
81
- end
60
+ function meancov (t, dyn:: LangevinDynamics , path:: GammaPath , dist:: Normal )
61
+ fts = exp .(Ref (dyn), (t .- path. times)) .* Ref (dyn. L)
62
+ μ = sum (@. fts * mean (dist) * path. jumps)
63
+ Σ = sum (@. fts * transpose (fts) * var (dist) * path. jumps)
82
64
83
- # Guarantees positive semi-definiteness
84
- return μ, Σ + T (1e-6 ) * I
85
- end
65
+ # Guarantees positive semi-definiteness
66
+ return μ, Σ + eltype (Σ)(1e-6 ) * I
86
67
end
87
68
88
- struct LevyLangevin{T} <: LatentDynamics{T,Vector{T}}
89
- dt:: T
90
- dyn:: LangevinDynamics{T}
91
- process:: GammaProcess{T}
92
- nvm:: NormalMeanVariance{T}
69
+ struct LevyPrior{XT<: AbstractVector ,ΣT<: AbstractMatrix } <: StatePrior
70
+ μ:: XT
71
+ Σ:: ΣT
93
72
end
94
73
95
- function SSMProblems. distribution (proc:: LevyLangevin{T} ) where {T<: Real }
96
- return MultivariateNormal (zeros (T, 2 ), I)
74
+ SSMProblems. distribution (proc:: LevyPrior ) = MvNormal (proc. μ, proc. Σ)
75
+
76
+ struct LevyLangevin{T<: Real ,LT<: LangevinDynamics ,ΓT<: GammaProcess ,DT<: Normal } < :
77
+ SSMProblems. LatentDynamics
78
+ dt:: T
79
+ dyn:: LT
80
+ process: :ΓT
81
+ dist:: DT
97
82
end
98
83
99
- function SSMProblems. distribution (proc:: LevyLangevin{T} , step:: Int , state) where {T <: Real }
84
+ function SSMProblems. distribution (proc:: LevyLangevin , step:: Int , state)
100
85
dt = proc. dt
101
86
path = simulate (rng, proc. process, dt, (step - 1 ) * dt, step * dt)
102
- μ, Σ = meancov (step * dt, proc. dyn, path, proc. nvm )
103
- return MultivariateNormal (exp (proc. dyn, dt) * state + μ, Σ)
87
+ μ, Σ = meancov (step * dt, proc. dyn, path, proc. dist )
88
+ return MvNormal (exp (proc. dyn, dt) * state + μ, Σ)
104
89
end
105
90
106
- struct LinearGaussianObservation{T <: Real } <: ObservationProcess{T,T}
107
- H:: Vector{T}
108
- R:: T
91
+ struct LinearGaussianObservation{HT <: AbstractVector ,RT <: Real } <: SSMProblems. ObservationProcess
92
+ H:: HT
93
+ R:: RT
109
94
end
110
95
111
- function SSMProblems. distribution (proc:: LinearGaussianObservation , step :: Int , state)
96
+ function SSMProblems. distribution (proc:: LinearGaussianObservation , :: Int , state)
112
97
return Normal (transpose (proc. H) * state, proc. R)
113
98
end
114
99
115
- function LevyModel (dt, θ, σe, C, β, μw, σw; ϵ= 1e-10 )
116
- A = [0.0 1.0 ; 0.0 θ]
117
- L = [0.0 ; 1.0 ]
118
- H = [1.0 , 0 ]
119
-
100
+ function LevyModel (dt, θ, σe, C, β, μw, σw; kwargs... )
120
101
dyn = LevyLangevin (
121
102
dt,
122
- LangevinDynamics (A, L, θ, H, σe ),
123
- GammaProcess (C, β; ϵ ),
124
- NormalMeanVariance (μw, σw),
103
+ LangevinDynamics ([ 0 1 ; 0 θ], [ 0 ; 1 ], θ ),
104
+ GammaProcess (C, β; kwargs ... ),
105
+ Normal (μw, σw),
125
106
)
126
107
127
- obs = LinearGaussianObservation (H , σe)
128
- return StateSpaceModel (dyn, obs)
108
+ obs = LinearGaussianObservation ([ 1 ; 0 ] , σe)
109
+ return SSMProblems . StateSpaceModel (LevyPrior ( zeros (Bool, 2 ), I ( 2 )), dyn, obs)
129
110
end
130
111
131
112
# Levy SSM with Langevin dynamics
@@ -139,15 +120,15 @@ end
139
120
# Simulation parameters
140
121
N = 200
141
122
ts = range (0 , 100 ; length= N)
142
- levyssm = LevyModel (step (ts), θ , 1.0 , 1.0 , 1.0 , 0.0 , 1.0 );
123
+ levyssm = LevyModel (step (ts), - 0.5 , 1 , 1.0 , 1.0 , 0 , 1 );
143
124
144
125
# Simulate data
145
126
rng = Random. MersenneTwister (1234 );
146
127
_, X, Y = sample (rng, levyssm, N);
147
128
148
129
# Run sampler
149
130
pg = AdvancedPS. PGAS (50 );
150
- chains = sample (rng, levyssm ( Y), pg, 100 );
131
+ chains = sample (rng, AdvancedPS . TracedSSM (levyssm, Y), pg, 100 ; progress = false );
151
132
152
133
# Concat all sampled states
153
134
marginal_states = hcat ([chain. trajectory. model. X for chain in chains]. .. )
0 commit comments