@@ -32,6 +32,25 @@ impl SamplingExt<f64> for OU {
3232 ou
3333 }
3434
35+ #[ cfg( feature = "simd" ) ]
36+ // TODO: experimental
37+ fn sample_simd ( & self ) -> Array1 < f64 > {
38+ use crate :: stats:: distr:: normal:: SimdNormal ;
39+
40+ let dt = self . t . unwrap_or ( 1.0 ) as f32 / ( self . n - 1 ) as f32 ;
41+ let gn = Array1 :: random ( self . n , SimdNormal :: new ( 0.0 , dt. sqrt ( ) ) ) ;
42+
43+ let mut ou = Array1 :: < f64 > :: zeros ( self . n ) ;
44+ ou[ 0 ] = self . x0 . unwrap_or ( 0.0 ) ;
45+
46+ for i in 1 ..self . n {
47+ ou[ i] =
48+ ou[ i - 1 ] + self . theta * ( self . mu - ou[ i - 1 ] ) * dt as f64 + self . sigma * gn[ i - 1 ] as f64
49+ }
50+
51+ ou
52+ }
53+
3554 /// Number of time steps
3655 fn n ( & self ) -> usize {
3756 self . n
@@ -73,6 +92,32 @@ mod tests {
7392 plot_1d ! ( ou. sample( ) , "Fractional Ornstein-Uhlenbeck (FOU) Process" ) ;
7493 }
7594
95+ #[ cfg( feature = "simd" ) ]
96+ #[ test]
97+ fn sample_simd ( ) {
98+ use std:: time:: Instant ;
99+
100+ let start = Instant :: now ( ) ;
101+ let ou = OU :: new ( 2.0 , 1.0 , 0.8 , N , Some ( X0 ) , Some ( 1.0 ) , None ) ;
102+
103+ for _ in 0 ..100_000 {
104+ ou. sample_simd ( ) ;
105+ }
106+
107+ let elapsed = start. elapsed ( ) ;
108+ println ! ( "Elapsed time for sample_simd: {:?}" , elapsed) ;
109+
110+ let start = Instant :: now ( ) ;
111+ let ou = OU :: new ( 2.0 , 1.0 , 0.8 , N , Some ( X0 ) , Some ( 1.0 ) , None ) ;
112+
113+ for _ in 0 ..100_000 {
114+ ou. sample ( ) ;
115+ }
116+
117+ let elapsed = start. elapsed ( ) ;
118+ println ! ( "Elapsed time for sample: {:?}" , elapsed) ;
119+ }
120+
76121 #[ test]
77122 #[ ignore = "Not implemented" ]
78123 #[ cfg( feature = "malliavin" ) ]
0 commit comments