@@ -475,54 +475,72 @@ void dpnp_rng_logistic_c(void* result, const double loc, const double scale, con
475475template <typename _DataType>
476476void dpnp_rng_lognormal_c (void * result, const _DataType mean, const _DataType stddev, const size_t size)
477477{
478- if (!size)
478+ if (!size || !result )
479479 {
480480 return ;
481481 }
482482 _DataType* result1 = reinterpret_cast <_DataType*>(result);
483483
484- const _DataType displacement = _DataType (0.0 );
485-
486- const _DataType scalefactor = _DataType (1.0 );
484+ if (stddev == 0.0 )
485+ {
486+ _DataType* fill_value = reinterpret_cast <_DataType*>(dpnp_memory_alloc_c (sizeof (_DataType)));
487+ fill_value[0 ] = static_cast <_DataType>(std::exp (mean + (stddev * stddev) / 2 ));
488+ dpnp_initval_c<_DataType>(result, fill_value, size);
489+ dpnp_memory_free_c (fill_value);
490+ }
491+ else
492+ {
493+ const _DataType displacement = _DataType (0.0 );
494+ const _DataType scalefactor = _DataType (1.0 );
487495
488- mkl_rng::lognormal<_DataType> distribution (mean, stddev, displacement, scalefactor);
489- // perform generation
490- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
491- event_out.wait ();
496+ mkl_rng::lognormal<_DataType> distribution (mean, stddev, displacement, scalefactor);
497+ auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
498+ event_out.wait ();
499+ }
500+ return ;
492501}
493502
494503template <typename _DataType>
495504void dpnp_rng_multinomial_c (
496505 void * result, const int ntrial, const double * p_vector, const size_t p_vector_size, const size_t size)
497506{
498- if (!size)
507+ if (!size || !result )
499508 {
500509 return ;
501510 }
502- std::int32_t * result1 = reinterpret_cast <std::int32_t *>(result);
503- std::vector<double > p (p_vector, p_vector + p_vector_size);
504- // size = size
505- // `result` is a array for random numbers
506- // `size` is a `result`'s len. `size = n * p.size()`
507- // `n` is a number of random values to be generated.
508- size_t n = size / p.size ();
509511
510- if (dpnp_queue_is_cpu_c () )
512+ if (ntrial == 0 )
511513 {
512- mkl_rng::multinomial<std::int32_t > distribution (ntrial, p);
513- // perform generation
514- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, n, result1);
515- event_out.wait ();
514+ dpnp_zeros_c<_DataType>(result, size);
516515 }
517516 else
518517 {
519- int errcode = viRngMultinomial (
520- VSL_RNG_METHOD_MULTINOMIAL_MULTPOISSON, get_rng_stream (), n, result1, ntrial, p_vector_size, p_vector);
521- if (errcode != VSL_STATUS_OK)
518+ std::int32_t * result1 = reinterpret_cast <std::int32_t *>(result);
519+ std::vector<double > p (p_vector, p_vector + p_vector_size);
520+ // size = size
521+ // `result` is a array for random numbers
522+ // `size` is a `result`'s len. `size = n * p.size()`
523+ // `n` is a number of random values to be generated.
524+ size_t n = size / p.size ();
525+
526+ if (dpnp_queue_is_cpu_c ())
522527 {
523- throw std::runtime_error (" DPNP RNG Error: dpnp_rng_multinomial_c() failed." );
528+ mkl_rng::multinomial<std::int32_t > distribution (ntrial, p);
529+ // perform generation
530+ auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, n, result1);
531+ event_out.wait ();
532+ }
533+ else
534+ {
535+ int errcode = viRngMultinomial (
536+ VSL_RNG_METHOD_MULTINOMIAL_MULTPOISSON, get_rng_stream (), n, result1, ntrial, p_vector_size, p_vector);
537+ if (errcode != VSL_STATUS_OK)
538+ {
539+ throw std::runtime_error (" DPNP RNG Error: dpnp_rng_multinomial_c() failed." );
540+ }
524541 }
525542 }
543+ return ;
526544}
527545
528546template <typename _DataType>
0 commit comments