@@ -475,54 +475,72 @@ void dpnp_rng_logistic_c(void* result, const double loc, const double scale, con
475
475
template <typename _DataType>
476
476
void dpnp_rng_lognormal_c (void * result, const _DataType mean, const _DataType stddev, const size_t size)
477
477
{
478
- if (!size)
478
+ if (!size || !result )
479
479
{
480
480
return ;
481
481
}
482
482
_DataType* result1 = reinterpret_cast <_DataType*>(result);
483
483
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 );
487
495
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 ;
492
501
}
493
502
494
503
template <typename _DataType>
495
504
void dpnp_rng_multinomial_c (
496
505
void * result, const int ntrial, const double * p_vector, const size_t p_vector_size, const size_t size)
497
506
{
498
- if (!size)
507
+ if (!size || !result )
499
508
{
500
509
return ;
501
510
}
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 ();
509
511
510
- if (dpnp_queue_is_cpu_c () )
512
+ if (ntrial == 0 )
511
513
{
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);
516
515
}
517
516
else
518
517
{
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 ())
522
527
{
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
+ }
524
541
}
525
542
}
543
+ return ;
526
544
}
527
545
528
546
template <typename _DataType>
0 commit comments