@@ -17,6 +17,7 @@ module stdlib_stats_distribution_uniform
1717 public :: uniform_distribution_cdf
1818 public :: shuffle
1919
20+
2021 interface uniform_distribution_rvs
2122 !! Version experimental
2223 !!
@@ -39,10 +40,12 @@ module stdlib_stats_distribution_uniform
3940 #:endfor
4041 end interface uniform_distribution_rvs
4142
43+
4244 interface uniform_distribution_pdf
4345 !! Version experiment
4446 !!
45- !! Get uniform distribution probability density (pdf) for integer, real and complex variables
47+ !! Get uniform distribution probability density (pdf) for integer, real and
48+ !! complex variables.
4649 !! ([Specification](../page/specs/stdlib_stats_distribution_uniform.html#
4750 !! description))
4851
@@ -51,10 +54,12 @@ module stdlib_stats_distribution_uniform
5154 #:endfor
5255 end interface uniform_distribution_pdf
5356
57+
5458 interface uniform_distribution_cdf
5559 !! Version experimental
5660 !!
57- !! Get uniform distribution cumulative distribution function (cdf) for integer, real and complex variables
61+ !! Get uniform distribution cumulative distribution function (cdf) for integer,
62+ !! real and complex variables.
5863 !! ([Specification](../page/specs/stdlib_stats_distribution_uniform.html#
5964 !! description))
6065 !!
@@ -63,10 +68,12 @@ module stdlib_stats_distribution_uniform
6368 #:endfor
6469 end interface uniform_distribution_cdf
6570
71+
6672 interface shuffle
6773 !! Version experimental
6874 !!
69- !! Fisher-Yates shuffle algorithm for a rank one array of integer, real and complex variables
75+ !! Fisher-Yates shuffle algorithm for a rank one array of integer, real and
76+ !! complex variables
7077 !! ([Specification](../page/specs/stdlib_stats_distribution_uniform.html#
7178 !! description))
7279 !!
@@ -76,20 +83,25 @@ module stdlib_stats_distribution_uniform
7683 end interface shuffle
7784
7885
79- contains
86+
87+
88+ contains
89+
8090
8191 #:for k1, t1 in INT_KINDS_TYPES
8292 impure elemental function unif_dist_rvs_1_${t1[0]}$${k1}$(scale) result(res)
93+ !
8394 ! Uniformly distributed integer in [0, scale]
8495 ! Bitmask with rejection
8596 ! https://www.pcg-random.org/posts/bounded-rands.html
8697 !
8798 ! Fortran 90 translated from c by Jim-215-fisher
99+ !
88100 ${t1}$, intent(in) :: scale
89101 ${t1}$ :: res, u, mask
90102 integer :: zeros, bits_left, bits
91103
92- if(scale <= 0_${k1}$) call error_stop("Error(unif_dist_rvs_1): Uniform" &
104+ if(scale <= 0_${k1}$) call error_stop("Error(unif_dist_rvs_1): Uniform" &
93105 //" distribution scale parameter must be positive")
94106 zeros = leadz(scale)
95107 bits = bit_size(scale) - zeros
@@ -111,9 +123,12 @@ module stdlib_stats_distribution_uniform
111123
112124 #:endfor
113125
126+
127+
114128 #:for k1, t1 in INT_KINDS_TYPES
115129 impure elemental function unif_dist_rvs_${t1[0]}$${k1}$(loc, scale) &
116- result( res )
130+ result( res )
131+ !
117132 ! Uniformly distributed integer in [loc, loc + scale]
118133 !
119134 ${t1}$, intent(in) :: loc, scale
@@ -126,8 +141,11 @@ module stdlib_stats_distribution_uniform
126141
127142 #:endfor
128143
144+
145+
129146 #:for k1, t1 in REAL_KINDS_TYPES
130147 impure elemental function unif_dist_rvs_0_${t1[0]}$${k1}$( ) result(res)
148+ !
131149 ! Uniformly distributed float in [0,1]
132150 ! Based on the paper by Frederic Goualard, "Generating Random Floating-
133151 ! Point Numbers By Dividing Integers: a Case Study", Proceedings of
@@ -142,8 +160,11 @@ module stdlib_stats_distribution_uniform
142160
143161 #:endfor
144162
163+
164+
145165 #:for k1, t1 in REAL_KINDS_TYPES
146166 impure elemental function unif_dist_rvs_1_${t1[0]}$${k1}$(scale) result(res)
167+ !
147168 ! Uniformly distributed float in [0, scale]
148169 !
149170 ${t1}$, intent(in) :: scale
@@ -156,9 +177,12 @@ module stdlib_stats_distribution_uniform
156177
157178 #:endfor
158179
180+
181+
159182 #:for k1, t1 in REAL_KINDS_TYPES
160183 impure elemental function unif_dist_rvs_${t1[0]}$${k1}$(loc, scale) &
161- result(res)
184+ result(res)
185+ !
162186 ! Uniformly distributed float in [loc, loc + scale]
163187 !
164188 ${t1}$, intent(in) :: loc, scale
@@ -171,11 +195,14 @@ module stdlib_stats_distribution_uniform
171195
172196 #:endfor
173197
198+
199+
174200 #:for k1, t1 in CMPLX_KINDS_TYPES
175201 impure elemental function unif_dist_rvs_1_${t1[0]}$${k1}$(scale) result(res)
176- ! Uniformly distributed complex in [(0,0i), (scale, i(scale)]
202+ !
203+ ! Uniformly distributed complex in [(0,0i), (scale, i(scale))]
177204 ! The real part and imaginary part are independent of each other, so that
178- ! the joint distribution is on an unit square [(0,0i), scale,i(scale)]
205+ ! the joint distribution is on an unit square [(0,0i), ( scale,i(scale) )]
179206 !
180207 ${t1}$, intent(in) :: scale
181208 ${t1}$ :: res
@@ -191,7 +218,7 @@ module stdlib_stats_distribution_uniform
191218 tr = scale % re * r1
192219 ti = 0.0_${k1}$
193220 else
194- tr = scale % re * r1
221+ tr = scale % re * r1
195222 r1 = unif_dist_rvs_0_r${k1}$( )
196223 ti = scale % im * r1
197224 endif
@@ -200,9 +227,12 @@ module stdlib_stats_distribution_uniform
200227
201228 #:endfor
202229
230+
231+
203232 #:for k1, t1 in CMPLX_KINDS_TYPES
204233 impure elemental function unif_dist_rvs_${t1[0]}$${k1}$(loc, scale) &
205- result(res)
234+ result(res)
235+ !
206236 ! Uniformly distributed complex in [(loc,iloc), (loc + scale, i(loc + scale))]
207237 ! The real part and imaginary part are independent of each other, so that
208238 ! the joint distribution is on an unit square [(loc,iloc), (loc + scale,
@@ -231,9 +261,12 @@ module stdlib_stats_distribution_uniform
231261
232262 #:endfor
233263
264+
265+
234266 #:for k1, t1 in INT_KINDS_TYPES
235267 function unif_dist_rvs_array_${t1[0]}$${k1}$(loc, scale, array_size) &
236- result(res)
268+ result(res)
269+
237270 integer, intent(in) :: array_size
238271 ${t1}$, intent(in) :: loc, scale
239272 ${t1}$ :: res(array_size)
@@ -265,9 +298,12 @@ module stdlib_stats_distribution_uniform
265298
266299 #:endfor
267300
301+
302+
268303 #:for k1, t1 in REAL_KINDS_TYPES
269304 function unif_dist_rvs_array_${t1[0]}$${k1}$(loc, scale, array_size) &
270- result(res)
305+ result(res)
306+
271307 integer, intent(in) :: array_size
272308 ${t1}$, intent(in) :: loc, scale
273309 ${t1}$ :: res(array_size)
@@ -287,9 +323,12 @@ module stdlib_stats_distribution_uniform
287323
288324 #:endfor
289325
326+
327+
290328 #:for k1, t1 in CMPLX_KINDS_TYPES
291329 function unif_dist_rvs_array_${t1[0]}$${k1}$(loc, scale, array_size) &
292- result(res)
330+ result(res)
331+
293332 integer, intent(in) :: array_size
294333 ${t1}$, intent(in) :: loc, scale
295334 ${t1}$ :: res(array_size)
@@ -321,8 +360,11 @@ module stdlib_stats_distribution_uniform
321360
322361 #:endfor
323362
363+
364+
324365 #:for k1, t1 in INT_KINDS_TYPES
325366 elemental function unif_dist_pdf_${t1[0]}$${k1}$(x, loc, scale) result(res)
367+
326368 ${t1}$, intent(in) :: x, loc, scale
327369 real :: res
328370
@@ -337,8 +379,11 @@ module stdlib_stats_distribution_uniform
337379
338380 #:endfor
339381
382+
383+
340384 #:for k1, t1 in REAL_KINDS_TYPES
341385 elemental function unif_dist_pdf_${t1[0]}$${k1}$(x, loc, scale) result(res)
386+
342387 ${t1}$, intent(in) :: x, loc, scale
343388 real :: res
344389
@@ -353,8 +398,11 @@ module stdlib_stats_distribution_uniform
353398
354399 #:endfor
355400
401+
402+
356403 #:for k1, t1 in CMPLX_KINDS_TYPES
357404 elemental function unif_dist_pdf_${t1[0]}$${k1}$(x, loc, scale) result(res)
405+
358406 ${t1}$, intent(in) :: x, loc, scale
359407 real :: res
360408 real(${k1}$) :: tr, ti
@@ -372,8 +420,11 @@ module stdlib_stats_distribution_uniform
372420
373421 #:endfor
374422
423+
424+
375425 #:for k1, t1 in INT_KINDS_TYPES
376426 elemental function unif_dist_cdf_${t1[0]}$${k1}$(x, loc, scale) result(res)
427+
377428 ${t1}$, intent(in) :: x, loc, scale
378429 real :: res
379430
@@ -390,8 +441,11 @@ module stdlib_stats_distribution_uniform
390441
391442 #:endfor
392443
444+
445+
393446 #:for k1, t1 in REAL_KINDS_TYPES
394447 elemental function unif_dist_cdf_${t1[0]}$${k1}$(x, loc, scale) result(res)
448+
395449 ${t1}$, intent(in) :: x, loc, scale
396450 real :: res
397451
@@ -408,8 +462,11 @@ module stdlib_stats_distribution_uniform
408462
409463 #:endfor
410464
465+
466+
411467 #:for k1, t1 in CMPLX_KINDS_TYPES
412468 elemental function unif_dist_cdf_${t1[0]}$${k1}$(x, loc, scale) result(res)
469+
413470 ${t1}$, intent(in) :: x, loc, scale
414471 real :: res
415472 logical :: r1, r2, i1, i2
@@ -430,7 +487,7 @@ module stdlib_stats_distribution_uniform
430487 res = (x % im - loc % im) / scale % im
431488 elseif((.not. r1) .and. (.not. r2) .and. (.not. i1) .and. (.not. i2)) &
432489 then
433- res = (x % re - loc % re) * (x % im - loc % im) / &
490+ res = (x % re - loc % re) * (x % im - loc % im) / &
434491 (scale % re * scale % im)
435492 elseif(r2 .and. i2)then
436493 res = 1.0
@@ -439,8 +496,11 @@ module stdlib_stats_distribution_uniform
439496
440497 #:endfor
441498
499+
500+
442501 #:for k1, t1 in ALL_KINDS_TYPES
443502 function shuffle_${t1[0]}$${k1}$( list ) result(res)
503+
444504 ${t1}$, intent(in) :: list(:)
445505 ${t1}$ :: res(size(list))
446506 ${t1}$ :: tmp
0 commit comments