@@ -305,11 +305,11 @@ BOOST_AUTO_TEST_CASE(testReplayFlowError) {
305305 }
306306}
307307
308- BOOST_AUTO_TEST_CASE (testRngGenerationTmp ) {
308+ BOOST_AUTO_TEST_CASE (testRngGenerationMt19937 ) {
309309 ComputeEnvironmentFixture fixture;
310310 const std::size_t n = 1500 ;
311311 for (auto const & d : ComputeEnvironment::instance ().getAvailableDevices ()) {
312- BOOST_TEST_MESSAGE (" testing rng generation on device '" << d << " '." );
312+ BOOST_TEST_MESSAGE (" testing rng generation mt19937 against QL on device '" << d << " '." );
313313 ComputeEnvironment::instance ().selectContext (d);
314314 auto & c = ComputeEnvironment::instance ().context ();
315315 ComputeContext::Settings settings;
@@ -318,12 +318,12 @@ BOOST_AUTO_TEST_CASE(testRngGenerationTmp) {
318318 BOOST_TEST_MESSAGE (" using double precision = " << std::boolalpha << settings.useDoublePrecision );
319319 c.initiateCalculation (n, 0 , 0 , settings);
320320 auto vs = c.createInputVariates (1 , 1 );
321+ auto vs2 = c.createInputVariates (1 , 1 );
321322 for (auto const & d : vs) {
322323 for (auto const & r : d) {
323324 c.declareOutputVariable (r);
324325 }
325326 }
326- auto vs2 = c.createInputVariates (1 , 1 );
327327 for (auto const & d : vs2) {
328328 for (auto const & r : d) {
329329 c.declareOutputVariable (r);
@@ -357,6 +357,55 @@ BOOST_AUTO_TEST_CASE(testRngGenerationTmp) {
357357 BOOST_CHECK (true );
358358}
359359
360+ BOOST_AUTO_TEST_CASE (testConditionalExpectation) {
361+ ComputeEnvironmentFixture fixture;
362+ const std::size_t n = 100 ;
363+ for (auto const & d : ComputeEnvironment::instance ().getAvailableDevices ()) {
364+ BOOST_TEST_MESSAGE (" testing conditional expectation on device '" << d << " '." );
365+ ComputeEnvironment::instance ().selectContext (d);
366+ auto & c = ComputeEnvironment::instance ().context ();
367+ ComputeContext::Settings settings;
368+ settings.useDoublePrecision = c.supportsDoublePrecision ();
369+ BOOST_TEST_MESSAGE (" using double precision = " << std::boolalpha << settings.useDoublePrecision );
370+
371+ c.initiateCalculation (n, 0 , 0 , settings);
372+
373+ auto one = c.createInputVariable (1.0 );
374+ auto vs = c.createInputVariates (1 , 2 );
375+ auto ce = c.applyOperation (RandomVariableOpCode::ConditionalExpectation, {vs[0 ][0 ], one, vs[0 ][1 ]});
376+
377+ for (auto const & d : vs) {
378+ for (auto const & r : d) {
379+ c.declareOutputVariable (r);
380+ }
381+ }
382+ c.declareOutputVariable (ce);
383+
384+ std::vector<std::vector<double >> output (3 , std::vector<double >(n));
385+ c.finalizeCalculation (output);
386+
387+ RandomVariable y (output[0 ]);
388+ RandomVariable x (output[1 ]);
389+ RandomVariable z = conditionalExpectation (
390+ y, {&x}, multiPathBasisSystem (1 , settings.regressionOrder , QuantLib::LsmBasisSystem::Monomial, x.size ()));
391+
392+ double tol = settings.useDoublePrecision ? 1E-12 : 1E-4 ;
393+ Size noErrors = 0 , errorThreshold = 10 ;
394+
395+ for (Size i = 0 ; i < n; ++i) {
396+ Real err = std::abs (output[2 ][i] - z[i]);
397+ if (std::abs (z[i]) > 1E-10 )
398+ err /= std::abs (z[i]);
399+ if (err > tol && noErrors < errorThreshold) {
400+ BOOST_ERROR (" gpu value (" << output[2 ][i] << " ) at i=" << i << " does not match reference cpu value ("
401+ << z[i] << " ), error " << err << " , tol " << tol);
402+ noErrors++;
403+ }
404+ }
405+ }
406+ BOOST_CHECK (true );
407+ }
408+
360409BOOST_AUTO_TEST_SUITE_END ()
361410
362411BOOST_AUTO_TEST_SUITE_END()
0 commit comments