@@ -763,6 +763,76 @@ void dpnp_rng_standard_t_c(void* result, const _DataType df, const size_t size)
763763 }
764764}
765765
766+ template <typename _KernelNameSpecialization>
767+ class dpnp_rng_triangular_ration_acceptance_c_kernel ;
768+
769+ template <typename _DataType>
770+ void dpnp_rng_triangular_c (
771+ void * result, const _DataType x_min, const _DataType x_mode, const _DataType x_max, const size_t size)
772+ {
773+ if (!size)
774+ {
775+ return ;
776+ }
777+ _DataType* result1 = reinterpret_cast <_DataType*>(result);
778+ const _DataType d_zero = (_DataType (0 ));
779+ const _DataType d_one = (_DataType (1 ));
780+
781+ _DataType ratio, lpr, rpr;
782+
783+ mkl_rng::uniform<_DataType> uniform_distribution (d_zero, d_one);
784+ auto event_out = mkl_rng::generate (uniform_distribution, DPNP_RNG_ENGINE, size, result1);
785+ event_out.wait ();
786+
787+ {
788+ _DataType wtot, wl, wr;
789+
790+ wtot = x_max - x_min;
791+ wl = x_mode - x_min;
792+ wr = x_max - x_mode;
793+
794+ ratio = wl / wtot;
795+ lpr = wl * wtot;
796+ rpr = wr * wtot;
797+ }
798+
799+ if (!(0 <= ratio && ratio <= 1 ))
800+ {
801+ throw std::runtime_error (" DPNP RNG Error: dpnp_rng_triangular_c() failed." );
802+ }
803+
804+ cl::sycl::range<1 > gws (size);
805+ auto kernel_parallel_for_func = [=](cl::sycl::id<1 > global_id) {
806+ size_t i = global_id[0 ];
807+ if (ratio <= 0 )
808+ {
809+ result1[i] = x_max - cl::sycl::sqrt (result1[i] * rpr);
810+ }
811+ else if (ratio >= 1 )
812+ {
813+ result1[i] = x_min + cl::sycl::sqrt (result1[i] * lpr);
814+ }
815+ else
816+ {
817+ _DataType ui = result1[i];
818+ if (ui > ratio)
819+ {
820+ result1[i] = x_max - cl::sycl::sqrt ((1.0 - ui) * rpr);
821+ }
822+ else
823+ {
824+ result1[i] = x_min + cl::sycl::sqrt (ui * lpr);
825+ }
826+ }
827+ };
828+ auto kernel_func = [&](cl::sycl::handler& cgh) {
829+ cgh.parallel_for <class dpnp_rng_triangular_ration_acceptance_c_kernel <_DataType>>(gws,
830+ kernel_parallel_for_func);
831+ };
832+ event_out = DPNP_QUEUE.submit (kernel_func);
833+ event_out.wait ();
834+ }
835+
766836template <typename _DataType>
767837void dpnp_rng_uniform_c (void * result, const long low, const long high, const size_t size)
768838{
@@ -867,6 +937,8 @@ void func_map_init_random(func_map_t& fmap)
867937 (void *)dpnp_rng_standard_normal_c<double >};
868938 fmap[DPNPFuncName::DPNP_FN_RNG_STANDARD_T][eft_DBL][eft_DBL] = {eft_DBL, (void *)dpnp_rng_standard_t_c<double >};
869939
940+ fmap[DPNPFuncName::DPNP_FN_RNG_TRIANGULAR][eft_DBL][eft_DBL] = {eft_DBL, (void *)dpnp_rng_triangular_c<double >};
941+
870942 fmap[DPNPFuncName::DPNP_FN_RNG_UNIFORM][eft_DBL][eft_DBL] = {eft_DBL, (void *)dpnp_rng_uniform_c<double >};
871943 fmap[DPNPFuncName::DPNP_FN_RNG_UNIFORM][eft_FLT][eft_FLT] = {eft_FLT, (void *)dpnp_rng_uniform_c<float >};
872944 fmap[DPNPFuncName::DPNP_FN_RNG_UNIFORM][eft_INT][eft_INT] = {eft_INT, (void *)dpnp_rng_uniform_c<int >};
0 commit comments