@@ -37,10 +37,10 @@ class BlackScholesModel {
3737 gS [0 ] = sigma * S[0 ];
3838 };
3939
40- auto problem = diffeq::factory::make_sde_problem<std::vector<double >, double >(
41- drift_func, diffusion_func, diffeq::NoiseType::DIAGONAL_NOISE);
40+ auto problem = diffeq::sde:: factory::make_sde_problem<std::vector<double >>(
41+ drift_func, diffusion_func, diffeq::sde:: NoiseType::DIAGONAL_NOISE);
4242
43- auto wiener = diffeq::factory::make_wiener_process<std::vector<double >, double >(1 , 12345 );
43+ auto wiener = diffeq::sde:: factory::make_wiener_process<std::vector<double >>(1 , 12345 );
4444
4545 double S0 = 100.0 ; // Initial stock price
4646 double T = 1.0 ; // Time to maturity
@@ -57,7 +57,7 @@ class BlackScholesModel {
5757
5858 // Euler-Maruyama
5959 {
60- diffeq::EulerMaruyamaIntegrator<std::vector<double >, double > integrator (problem, wiener);
60+ diffeq::EulerMaruyamaIntegrator<std::vector<double >> integrator (problem, wiener);
6161 std::vector<double > S = {S0};
6262 integrator.set_time (0.0 );
6363 wiener->set_seed (12345 );
@@ -68,9 +68,13 @@ class BlackScholesModel {
6868 results.push_back (S[0 ]);
6969 }
7070
71- // Milstein
71+ // Milstein (with diffusion derivative)
7272 {
73- diffeq::MilsteinIntegrator<std::vector<double >, double > integrator (problem, wiener);
73+ auto diffusion_derivative = [this ](double /* t*/ , const std::vector<double >& S, std::vector<double >& dgdS) {
74+ // For GBM: g(S) = σS, so g'(S) = σ
75+ dgdS[0 ] = sigma;
76+ };
77+ diffeq::MilsteinIntegrator<std::vector<double >> integrator (problem, diffusion_derivative, wiener);
7478 std::vector<double > S = {S0};
7579 integrator.set_time (0.0 );
7680 wiener->set_seed (12345 );
@@ -83,7 +87,7 @@ class BlackScholesModel {
8387
8488 // SRA1
8589 {
86- diffeq::SRA1Integrator<std::vector<double >, double > integrator (problem, wiener);
90+ diffeq::SRA1Integrator<std::vector<double >> integrator (problem, wiener);
8791 std::vector<double > S = {S0};
8892 integrator.set_time (0.0 );
8993 wiener->set_seed (12345 );
@@ -96,7 +100,7 @@ class BlackScholesModel {
96100
97101 // SOSRA
98102 {
99- diffeq::SOSRAIntegrator<std::vector<double >, double > integrator (problem, wiener);
103+ diffeq::SOSRAIntegrator<std::vector<double >> integrator (problem, wiener);
100104 std::vector<double > S = {S0};
101105 integrator.set_time (0.0 );
102106 wiener->set_seed (12345 );
@@ -109,7 +113,7 @@ class BlackScholesModel {
109113
110114 // SRIW1
111115 {
112- diffeq::SRIW1Integrator<std::vector<double >, double > integrator (problem, wiener);
116+ diffeq::SRIW1Integrator<std::vector<double >> integrator (problem, wiener);
113117 std::vector<double > S = {S0};
114118 integrator.set_time (0.0 );
115119 wiener->set_seed (12345 );
@@ -122,7 +126,7 @@ class BlackScholesModel {
122126
123127 // SOSRI
124128 {
125- diffeq::SOSRIIntegrator<std::vector<double >, double > integrator (problem, wiener);
129+ diffeq::SOSRIIntegrator<std::vector<double >> integrator (problem, wiener);
126130 std::vector<double > S = {S0};
127131 integrator.set_time (0.0 );
128132 wiener->set_seed (12345 );
@@ -174,10 +178,10 @@ class HestonModel {
174178 gx[1 ] = sigma * std::sqrt (V);
175179 };
176180
177- auto problem = diffeq::factory::make_sde_problem<std::vector<double >, double >(
178- drift_func, diffusion_func, diffeq::NoiseType::GENERAL_NOISE);
181+ auto problem = diffeq::sde:: factory::make_sde_problem<std::vector<double >>(
182+ drift_func, diffusion_func, diffeq::sde:: NoiseType::GENERAL_NOISE);
179183
180- auto wiener = diffeq::factory::make_wiener_process<std::vector<double >, double >(2 , 54321 );
184+ auto wiener = diffeq::sde:: factory::make_wiener_process<std::vector<double >>(2 , 54321 );
181185
182186 // Set correlated noise
183187 auto correlated_noise_func = [this ](double /* t*/ , const std::vector<double >& /* x*/ ,
@@ -198,7 +202,7 @@ class HestonModel {
198202 int steps = static_cast <int >(T / dt);
199203
200204 // Use high-order SDE integrator for better accuracy
201- diffeq::SOSRAIntegrator<std::vector<double >, double > integrator (problem, wiener);
205+ diffeq::SOSRAIntegrator<std::vector<double >> integrator (problem, wiener);
202206 integrator.set_time (0.0 );
203207
204208 std::cout << " Initial state: S = " << x[0 ] << " , V = " << x[1 ] << std::endl;
@@ -266,11 +270,18 @@ class NoisyOscillator {
266270 gstate[1 ] = sigma; // Noise in velocity (acceleration)
267271 };
268272
269- auto problem = diffeq::factory::make_sde_problem<std::vector<double >, double >(
270- drift_func, diffusion_func, diffeq::NoiseType::DIAGONAL_NOISE);
273+ auto problem = diffeq::sde:: factory::make_sde_problem<std::vector<double >>(
274+ drift_func, diffusion_func, diffeq::sde:: NoiseType::DIAGONAL_NOISE);
271275
272- auto wiener = diffeq::factory::make_wiener_process<std::vector<double >, double >(1 , 67890 );
273- diffeq::MilsteinIntegrator<std::vector<double >, double > integrator (problem, wiener);
276+ auto wiener = diffeq::sde::factory::make_wiener_process<std::vector<double >>(1 , 67890 );
277+
278+ // For this problem, diffusion g = [0, σ], so derivative g' = [0, 0]
279+ auto diffusion_derivative = [this ](double /* t*/ , const std::vector<double >& /* state*/ , std::vector<double >& dgd_state) {
280+ dgd_state[0 ] = 0.0 ; // d/dx(0) = 0
281+ dgd_state[1 ] = 0.0 ; // d/dx(σ) = 0 since σ is constant
282+ };
283+
284+ diffeq::MilsteinIntegrator<std::vector<double >> integrator (problem, diffusion_derivative, wiener);
274285
275286 std::vector<double > state = {0.0 , 0.0 }; // Initial [x, xdot]
276287 double dt = 0.01 ;
@@ -352,11 +363,11 @@ class StochasticLotkaVolterra {
352363 gpop[1 ] = sigma2 * y; // Multiplicative noise for predator
353364 };
354365
355- auto problem = diffeq::factory::make_sde_problem<std::vector<double >, double >(
356- drift_func, diffusion_func, diffeq::NoiseType::DIAGONAL_NOISE);
366+ auto problem = diffeq::sde:: factory::make_sde_problem<std::vector<double >>(
367+ drift_func, diffusion_func, diffeq::sde:: NoiseType::DIAGONAL_NOISE);
357368
358- auto wiener = diffeq::factory::make_wiener_process<std::vector<double >, double >(2 , 11111 );
359- diffeq::SRA1Integrator<std::vector<double >, double > integrator (problem, wiener);
369+ auto wiener = diffeq::sde:: factory::make_wiener_process<std::vector<double >>(2 , 11111 );
370+ diffeq::SRA1Integrator<std::vector<double >> integrator (problem, wiener);
360371
361372 std::vector<double > population = {2.0 , 1.0 }; // Initial [prey, predator]
362373 double dt = 0.01 ;
@@ -419,11 +430,11 @@ void demonstrate_async_sde_integration() {
419430 gx[1 ] = 0.05 * x[1 ];
420431 };
421432
422- auto problem = diffeq::factory::make_sde_problem<std::vector<double >, double >(
423- drift_func, diffusion_func, diffeq::NoiseType::DIAGONAL_NOISE);
433+ auto problem = diffeq::sde:: factory::make_sde_problem<std::vector<double >>(
434+ drift_func, diffusion_func, diffeq::sde:: NoiseType::DIAGONAL_NOISE);
424435
425- auto wiener = diffeq::factory::make_wiener_process<std::vector<double >, double >(2 , 22222 );
426- diffeq::EulerMaruyamaIntegrator<std::vector<double >, double > integrator (problem, wiener);
436+ auto wiener = diffeq::sde:: factory::make_wiener_process<std::vector<double >>(2 , 22222 );
437+ diffeq::EulerMaruyamaIntegrator<std::vector<double >> integrator (problem, wiener);
427438
428439 // Note: Async integrator functionality is not currently available
429440 // For now, we'll use the regular integrator
0 commit comments