@@ -27,17 +27,16 @@ function simulate(
2727 t = t0
2828 truncated = last_jump < tolerance
2929 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)
3333 if rand (rng) < prob
3434 push! (jumps, xi)
3535 last_jump = xi
3636 end
3737 truncated = last_jump < tolerance
3838 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)))
4140 end
4241end
4342
@@ -47,85 +46,67 @@ function integral(times::Array{<:Real}, path::GammaPath)
4746 end
4847end
4948
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
5653end
5754
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]
6158end
6259
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)
8264
83- # Guarantees positive semi-definiteness
84- return μ, Σ + T (1e-6 ) * I
85- end
65+ # Guarantees positive semi-definiteness
66+ return μ, Σ + eltype (Σ)(1e-6 ) * I
8667end
8768
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
9372end
9473
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
9782end
9883
99- function SSMProblems. distribution (proc:: LevyLangevin{T} , step:: Int , state) where {T <: Real }
84+ function SSMProblems. distribution (proc:: LevyLangevin , step:: Int , state)
10085 dt = proc. dt
10186 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 + μ, Σ)
10489end
10590
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
10994end
11095
111- function SSMProblems. distribution (proc:: LinearGaussianObservation , step :: Int , state)
96+ function SSMProblems. distribution (proc:: LinearGaussianObservation , :: Int , state)
11297 return Normal (transpose (proc. H) * state, proc. R)
11398end
11499
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... )
120101 dyn = LevyLangevin (
121102 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),
125106 )
126107
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)
129110end
130111
131112# Levy SSM with Langevin dynamics
@@ -139,15 +120,15 @@ end
139120# Simulation parameters
140121N = 200
141122ts = 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 );
143124
144125# Simulate data
145126rng = Random. MersenneTwister (1234 );
146127_, X, Y = sample (rng, levyssm, N);
147128
148129# Run sampler
149130pg = AdvancedPS. PGAS (50 );
150- chains = sample (rng, levyssm ( Y), pg, 100 );
131+ chains = sample (rng, AdvancedPS . TracedSSM (levyssm, Y), pg, 100 ; progress = false );
151132
152133# Concat all sampled states
153134marginal_states = hcat ([chain. trajectory. model. X for chain in chains]. .. )
0 commit comments