Skip to content

Commit 3878ad7

Browse files
committed
Simplify distribution definitions and add testing
1 parent 59d75a4 commit 3878ad7

File tree

5 files changed

+120
-172
lines changed

5 files changed

+120
-172
lines changed

doc/modules/random.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ normal_distribution
7676

7777
Fill the given array with Gaussian-distributed numbers generated using the
7878
given random number engine about the given mean value with the given standard
79-
deviation, which defaults to 1.
79+
deviation.
8080

8181
uniform_int_distribution
8282
------------------------

include/flc_random.i

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -43,45 +43,53 @@ class GENERATOR
4343
* RNG distribution routines
4444
* ------------------------------------------------------------------------- */
4545

46-
%define %flc_random_dist1(NAME, TYPE, GENERATOR, ARG1)
47-
%inline {
48-
static void NAME##_distribution(TYPE ARG1,
49-
std::GENERATOR& g,
50-
TYPE *DATA, size_t DATASIZE) {
51-
std::NAME##_distribution<TYPE> dist(ARG1);
52-
TYPE *end = DATA + DATASIZE;
53-
while (DATA != end) {
54-
*DATA++ = dist(g);
55-
}
46+
%{
47+
template<class D, class G, class T>
48+
static inline void flc_generate(D dist, G& g, T* data, size_t size) {
49+
T* const end = data + size;
50+
while (data != end) {
51+
*data++ = dist(g);
52+
}
5653
}
54+
%}
55+
56+
%apply (const SWIGTYPE *DATA, size_t SIZE) {
57+
(SWIGTYPE const *WEIGHTS, size_t WEIGHTSIZE) };
58+
59+
%inline %{
60+
template<class T, class G>
61+
static void uniform_int_distribution(T left, T right,
62+
G& engine, T* DATA, size_t DATASIZE) {
63+
flc_generate(std::uniform_int_distribution<T>(left, right),
64+
engine, DATA, DATASIZE);
5765
}
58-
%enddef
5966

60-
%define %flc_random_dist2(NAME, TYPE, GENERATOR, ARG1, ARG2)
61-
%inline {
62-
static void NAME##_distribution(TYPE ARG1, TYPE ARG2,
63-
std::GENERATOR& g,
64-
TYPE *DATA, size_t DATASIZE) {
65-
std::NAME##_distribution<TYPE> dist(ARG1, ARG2);
66-
TYPE *end = DATA + DATASIZE;
67-
while (DATA != end) {
68-
*DATA++ = dist(g);
69-
}
67+
template<class T, class G>
68+
static void uniform_real_distribution(T left, T right,
69+
G& engine, T* DATA, size_t DATASIZE) {
70+
flc_generate(std::uniform_real_distribution<T>(left, right),
71+
engine, DATA, DATASIZE);
7072
}
73+
74+
template<class T, class G>
75+
static void normal_distribution(T mean, T stddev,
76+
G& engine, T* DATA, size_t DATASIZE) {
77+
flc_generate(std::normal_distribution<T>(mean, stddev),
78+
engine, DATA, DATASIZE);
7179
}
72-
%enddef
80+
%}
7381

74-
#define FLC_DEFAULT_ENGINE mt19937
82+
%define %flc_distribution(NAME, STDENGINE, TYPE)
83+
%template(NAME##_distribution) NAME##_distribution< TYPE, std::STDENGINE >;
84+
%enddef
7585

7686
// Engines
7787
%flc_random_engine(MersenneEngine4, mt19937, int32_t)
7888
%flc_random_engine(MersenneEngine8, mt19937_64, int64_t)
7989

80-
// Uniform distributions
81-
%flc_random_dist2(uniform_int, int32_t, FLC_DEFAULT_ENGINE, left, right)
82-
%flc_random_dist2(uniform_int, int64_t, FLC_DEFAULT_ENGINE, left, right)
83-
%flc_random_dist2(uniform_real, double, FLC_DEFAULT_ENGINE, left, right)
90+
#define FLC_DEFAULT_ENGINE mt19937
91+
%flc_distribution(uniform_int, FLC_DEFAULT_ENGINE, int32_t)
92+
%flc_distribution(uniform_int, FLC_DEFAULT_ENGINE, int64_t)
93+
%flc_distribution(uniform_real, FLC_DEFAULT_ENGINE, double)
8494

85-
// Gaussian distribution
86-
%flc_random_dist1(normal, double, FLC_DEFAULT_ENGINE, mean)
87-
%flc_random_dist2(normal, double, FLC_DEFAULT_ENGINE, mean, stddev)
95+
%flc_distribution(normal, FLC_DEFAULT_ENGINE, double)

src/flc_random.f90

Lines changed: 23 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,11 @@ module flc_random
5757
integer(C_SIZE_T), public :: size = 0
5858
end type
5959
public :: uniform_real_distribution
60+
public :: normal_distribution
6061
interface uniform_int_distribution
61-
module procedure swigf_uniform_int_distribution__SWIG_0, swigf_uniform_int_distribution__SWIG_1
62+
module procedure swigf_uniform_int_distribution__SWIG_1, swigf_uniform_int_distribution__SWIG_2
6263
end interface
6364
public :: uniform_int_distribution
64-
interface normal_distribution
65-
module procedure swigf_normal_distribution__SWIG_0, swigf_normal_distribution__SWIG_1
66-
end interface
67-
public :: normal_distribution
6865

6966
! WRAPPER DECLARATIONS
7067
interface
@@ -182,8 +179,8 @@ subroutine swigc_MersenneEngine8_op_assign__(farg1, farg2) &
182179
type(SwigClassWrapper) :: farg2
183180
end subroutine
184181

185-
subroutine swigc_uniform_int_distribution__SWIG_0(farg1, farg2, farg3, farg4) &
186-
bind(C, name="_wrap_uniform_int_distribution__SWIG_0")
182+
subroutine swigc_uniform_int_distribution__SWIG_1(farg1, farg2, farg3, farg4) &
183+
bind(C, name="_wrap_uniform_int_distribution__SWIG_1")
187184
use, intrinsic :: ISO_C_BINDING
188185
import :: swigclasswrapper
189186
import :: swigarraywrapper
@@ -193,8 +190,8 @@ subroutine swigc_uniform_int_distribution__SWIG_0(farg1, farg2, farg3, farg4) &
193190
type(SwigArrayWrapper) :: farg4
194191
end subroutine
195192

196-
subroutine swigc_uniform_int_distribution__SWIG_1(farg1, farg2, farg3, farg4) &
197-
bind(C, name="_wrap_uniform_int_distribution__SWIG_1")
193+
subroutine swigc_uniform_int_distribution__SWIG_2(farg1, farg2, farg3, farg4) &
194+
bind(C, name="_wrap_uniform_int_distribution__SWIG_2")
198195
use, intrinsic :: ISO_C_BINDING
199196
import :: swigclasswrapper
200197
import :: swigarraywrapper
@@ -215,18 +212,8 @@ subroutine swigc_uniform_real_distribution(farg1, farg2, farg3, farg4) &
215212
type(SwigArrayWrapper) :: farg4
216213
end subroutine
217214

218-
subroutine swigc_normal_distribution__SWIG_0(farg1, farg2, farg3) &
219-
bind(C, name="_wrap_normal_distribution__SWIG_0")
220-
use, intrinsic :: ISO_C_BINDING
221-
import :: swigclasswrapper
222-
import :: swigarraywrapper
223-
real(C_DOUBLE), intent(in) :: farg1
224-
type(SwigClassWrapper) :: farg2
225-
type(SwigArrayWrapper) :: farg3
226-
end subroutine
227-
228-
subroutine swigc_normal_distribution__SWIG_1(farg1, farg2, farg3, farg4) &
229-
bind(C, name="_wrap_normal_distribution__SWIG_1")
215+
subroutine swigc_normal_distribution(farg1, farg2, farg3, farg4) &
216+
bind(C, name="_wrap_normal_distribution")
230217
use, intrinsic :: ISO_C_BINDING
231218
import :: swigclasswrapper
232219
import :: swigarraywrapper
@@ -431,11 +418,11 @@ subroutine SWIGTM_fin_int32_t_Sb__SB_(finp, iminp)
431418
end if
432419
iminp%size = sz
433420
end subroutine
434-
subroutine swigf_uniform_int_distribution__SWIG_0(left, right, g, data)
421+
subroutine swigf_uniform_int_distribution__SWIG_1(left, right, engine, data)
435422
use, intrinsic :: ISO_C_BINDING
436423
integer(C_INT32_T), intent(in) :: left
437424
integer(C_INT32_T), intent(in) :: right
438-
class(MersenneEngine4), intent(in) :: g
425+
class(MersenneEngine4), intent(in) :: engine
439426
integer(C_INT32_T), dimension(:), target :: data
440427
integer(C_INT32_T) :: farg1
441428
integer(C_INT32_T) :: farg2
@@ -444,9 +431,9 @@ subroutine swigf_uniform_int_distribution__SWIG_0(left, right, g, data)
444431

445432
farg1 = left
446433
farg2 = right
447-
farg3 = g%swigdata
434+
farg3 = engine%swigdata
448435
call SWIGTM_fin_int32_t_Sb__SB_(data, farg4)
449-
call swigc_uniform_int_distribution__SWIG_0(farg1, farg2, farg3, farg4)
436+
call swigc_uniform_int_distribution__SWIG_1(farg1, farg2, farg3, farg4)
450437
end subroutine
451438

452439
subroutine SWIGTM_fin_int64_t_Sb__SB_(finp, iminp)
@@ -465,11 +452,11 @@ subroutine SWIGTM_fin_int64_t_Sb__SB_(finp, iminp)
465452
end if
466453
iminp%size = sz
467454
end subroutine
468-
subroutine swigf_uniform_int_distribution__SWIG_1(left, right, g, data)
455+
subroutine swigf_uniform_int_distribution__SWIG_2(left, right, engine, data)
469456
use, intrinsic :: ISO_C_BINDING
470457
integer(C_INT64_T), intent(in) :: left
471458
integer(C_INT64_T), intent(in) :: right
472-
class(MersenneEngine4), intent(in) :: g
459+
class(MersenneEngine4), intent(in) :: engine
473460
integer(C_INT64_T), dimension(:), target :: data
474461
integer(C_INT64_T) :: farg1
475462
integer(C_INT64_T) :: farg2
@@ -478,9 +465,9 @@ subroutine swigf_uniform_int_distribution__SWIG_1(left, right, g, data)
478465

479466
farg1 = left
480467
farg2 = right
481-
farg3 = g%swigdata
468+
farg3 = engine%swigdata
482469
call SWIGTM_fin_int64_t_Sb__SB_(data, farg4)
483-
call swigc_uniform_int_distribution__SWIG_1(farg1, farg2, farg3, farg4)
470+
call swigc_uniform_int_distribution__SWIG_2(farg1, farg2, farg3, farg4)
484471
end subroutine
485472

486473
subroutine SWIGTM_fin_double_Sb__SB_(finp, iminp)
@@ -499,11 +486,11 @@ subroutine SWIGTM_fin_double_Sb__SB_(finp, iminp)
499486
end if
500487
iminp%size = sz
501488
end subroutine
502-
subroutine uniform_real_distribution(left, right, g, data)
489+
subroutine uniform_real_distribution(left, right, engine, data)
503490
use, intrinsic :: ISO_C_BINDING
504491
real(C_DOUBLE), intent(in) :: left
505492
real(C_DOUBLE), intent(in) :: right
506-
class(MersenneEngine4), intent(in) :: g
493+
class(MersenneEngine4), intent(in) :: engine
507494
real(C_DOUBLE), dimension(:), target :: data
508495
real(C_DOUBLE) :: farg1
509496
real(C_DOUBLE) :: farg2
@@ -512,31 +499,16 @@ subroutine uniform_real_distribution(left, right, g, data)
512499

513500
farg1 = left
514501
farg2 = right
515-
farg3 = g%swigdata
502+
farg3 = engine%swigdata
516503
call SWIGTM_fin_double_Sb__SB_(data, farg4)
517504
call swigc_uniform_real_distribution(farg1, farg2, farg3, farg4)
518505
end subroutine
519506

520-
subroutine swigf_normal_distribution__SWIG_0(mean, g, data)
521-
use, intrinsic :: ISO_C_BINDING
522-
real(C_DOUBLE), intent(in) :: mean
523-
class(MersenneEngine4), intent(in) :: g
524-
real(C_DOUBLE), dimension(:), target :: data
525-
real(C_DOUBLE) :: farg1
526-
type(SwigClassWrapper) :: farg2
527-
type(SwigArrayWrapper) :: farg3
528-
529-
farg1 = mean
530-
farg2 = g%swigdata
531-
call SWIGTM_fin_double_Sb__SB_(data, farg3)
532-
call swigc_normal_distribution__SWIG_0(farg1, farg2, farg3)
533-
end subroutine
534-
535-
subroutine swigf_normal_distribution__SWIG_1(mean, stddev, g, data)
507+
subroutine normal_distribution(mean, stddev, engine, data)
536508
use, intrinsic :: ISO_C_BINDING
537509
real(C_DOUBLE), intent(in) :: mean
538510
real(C_DOUBLE), intent(in) :: stddev
539-
class(MersenneEngine4), intent(in) :: g
511+
class(MersenneEngine4), intent(in) :: engine
540512
real(C_DOUBLE), dimension(:), target :: data
541513
real(C_DOUBLE) :: farg1
542514
real(C_DOUBLE) :: farg2
@@ -545,9 +517,9 @@ subroutine swigf_normal_distribution__SWIG_1(mean, stddev, g, data)
545517

546518
farg1 = mean
547519
farg2 = stddev
548-
farg3 = g%swigdata
520+
farg3 = engine%swigdata
549521
call SWIGTM_fin_double_Sb__SB_(data, farg4)
550-
call swigc_normal_distribution__SWIG_1(farg1, farg2, farg3, farg4)
522+
call swigc_normal_distribution(farg1, farg2, farg3, farg4)
551523
end subroutine
552524

553525

0 commit comments

Comments
 (0)