Skip to content

Commit 7c30056

Browse files
author
Juan Fiol
committed
Added support and test for mean of complex arrays
1 parent 9436248 commit 7c30056

5 files changed

+143
-57
lines changed

src/stdlib_experimental_stats.fypp

+46-27
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#:include "common.fypp"
2-
32
#:set RANKS = range(1, MAXRANK + 1)
4-
5-
3+
#:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
64
module stdlib_experimental_stats
75
use stdlib_experimental_kinds, only: sp, dp, qp, &
86
int8, int16, int32, int64
@@ -12,92 +10,113 @@ module stdlib_experimental_stats
1210
public :: mean
1311

1412
interface mean
15-
16-
#:for k1, t1 in REAL_KINDS_TYPES
13+
#:def name(Rank, Type, Kind)
14+
$:"mean_{0}_all_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
15+
#:enddef
16+
#:for k1, t1 in RC_KINDS_TYPES
1717
#:for rank in RANKS
18-
module function mean_${rank}$_all_${k1}$_${k1}$(x, mask) result(res)
18+
module function ${name(rank, t1, k1)}$ (x, mask) result(res)
1919
${t1}$, intent(in) :: x${ranksuffix(rank)}$
2020
logical, intent(in), optional :: mask
2121
${t1}$ :: res
22-
end function mean_${rank}$_all_${k1}$_${k1}$
22+
end function ${name(rank, t1, k1)}$
2323
#:endfor
2424
#:endfor
2525

26+
#:def name(Rank, Type, Kind)
27+
$:"mean_{0}_all_{1}{2}_rdp".format(Rank, Type[0], Kind)
28+
#:enddef
2629
#:for k1, t1 in INT_KINDS_TYPES
2730
#:for rank in RANKS
28-
module function mean_${rank}$_all_${k1}$_dp(x, mask) result(res)
31+
module function ${name(rank, t1, k1)}$ (x, mask) result(res)
2932
${t1}$, intent(in) :: x${ranksuffix(rank)}$
3033
logical, intent(in), optional :: mask
3134
real(dp) :: res
32-
end function mean_${rank}$_all_${k1}$_dp
35+
end function ${name(rank, t1, k1)}$
3336
#:endfor
3437
#:endfor
3538

36-
#:for k1, t1 in REAL_KINDS_TYPES
39+
#:def name(Rank, Type, Kind)
40+
$:"mean_{0}_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
41+
#:enddef
42+
#:for k1, t1 in RC_KINDS_TYPES
3743
#:for rank in RANKS
38-
module function mean_${rank}$_${k1}$_${k1}$(x, dim, mask) result(res)
44+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
3945
${t1}$, intent(in) :: x${ranksuffix(rank)}$
4046
integer, intent(in) :: dim
4147
logical, intent(in), optional :: mask
4248
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
43-
end function mean_${rank}$_${k1}$_${k1}$
49+
end function ${name(rank, t1, k1)}$
4450
#:endfor
4551
#:endfor
4652

53+
#:def name(Rank, Type, Kind)
54+
$:"mean_{0}_{1}{2}_rdp".format(Rank, Type[0], Kind)
55+
#:enddef
4756
#:for k1, t1 in INT_KINDS_TYPES
4857
#:for rank in RANKS
49-
module function mean_${rank}$_${k1}$_dp(x, dim, mask) result(res)
58+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
5059
${t1}$, intent(in) :: x${ranksuffix(rank)}$
5160
integer, intent(in) :: dim
5261
logical, intent(in), optional :: mask
5362
real(dp) :: res${reduced_shape('x', rank, 'dim')}$
54-
end function mean_${rank}$_${k1}$_dp
63+
end function ${name(rank, t1, k1)}$
5564
#:endfor
5665
#:endfor
5766

58-
59-
#:for k1, t1 in REAL_KINDS_TYPES
67+
#:def name(Rank, Type, Kind)
68+
$:"mean_{0}_mask_all_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
69+
#:enddef
70+
#:for k1, t1 in RC_KINDS_TYPES
6071
#:for rank in RANKS
61-
module function mean_${rank}$_mask_all_${k1}$_${k1}$(x, mask) result(res)
72+
module function ${name(rank, t1, k1)}$(x, mask) result(res)
6273
${t1}$, intent(in) :: x${ranksuffix(rank)}$
6374
logical, intent(in) :: mask${ranksuffix(rank)}$
6475
${t1}$ :: res
65-
end function mean_${rank}$_mask_all_${k1}$_${k1}$
76+
end function ${name(rank, t1, k1)}$
77+
6678
#:endfor
6779
#:endfor
6880

69-
81+
#:def name(Rank, Type, Kind)
82+
$:"mean_{0}_mask_all_{1}{2}_rdp".format(Rank, Type[0], Kind)
83+
#:enddef
7084
#:for k1, t1 in INT_KINDS_TYPES
7185
#:for rank in RANKS
72-
module function mean_${rank}$_mask_all_${k1}$_dp(x, mask) result(res)
86+
module function ${name(rank, t1, k1)}$(x, mask) result(res)
7387
${t1}$, intent(in) :: x${ranksuffix(rank)}$
7488
logical, intent(in) :: mask${ranksuffix(rank)}$
7589
real(dp) :: res
76-
end function mean_${rank}$_mask_all_${k1}$_dp
90+
end function ${name(rank, t1, k1)}$
7791
#:endfor
7892
#:endfor
7993

8094

81-
#:for k1, t1 in REAL_KINDS_TYPES
95+
#:def name(Rank, Type, Kind)
96+
$:"mean_{0}_mask_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
97+
#:enddef
98+
#:for k1, t1 in RC_KINDS_TYPES
8299
#:for rank in RANKS
83-
module function mean_${rank}$_mask_${k1}$_${k1}$(x, dim, mask) result(res)
100+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
84101
${t1}$, intent(in) :: x${ranksuffix(rank)}$
85102
integer, intent(in) :: dim
86103
logical, intent(in) :: mask${ranksuffix(rank)}$
87104
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
88-
end function mean_${rank}$_mask_${k1}$_${k1}$
105+
end function ${name(rank, t1, k1)}$
89106
#:endfor
90107
#:endfor
91108

92-
109+
#:def name(Rank, Type, Kind)
110+
$:"mean_{0}_mask_{1}{2}_rdp".format(Rank, Type[0], Kind)
111+
#:enddef
93112
#:for k1, t1 in INT_KINDS_TYPES
94113
#:for rank in RANKS
95-
module function mean_${rank}$_mask_${k1}$_dp(x, dim, mask) result(res)
114+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
96115
${t1}$, intent(in) :: x${ranksuffix(rank)}$
97116
integer, intent(in) :: dim
98117
logical, intent(in) :: mask${ranksuffix(rank)}$
99118
real(dp) :: res${reduced_shape('x', rank, 'dim')}$
100-
end function mean_${rank}$_mask_${k1}$_dp
119+
end function ${name(rank, t1, k1)}$
101120
#:endfor
102121
#:endfor
103122

src/stdlib_experimental_stats.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ Returns the mean of all the elements of `array`, or of the elements of `array` a
1818

1919
### Arguments
2020

21-
`array`: Shall be an array of type `integer`, or `real`.
21+
`array`: Shall be an array of type `integer`, `real`, or `complex`.
2222

2323
`dim`: Shall be a scalar of type `integer` with a value in the range from 1 to n, where n is the rank of `array`.
2424

2525
`mask` (optional): Shall be of type `logical` and either by a scalar or an array of the same shape as `array`.
2626

2727
### Return value
2828

29-
If `array` is of type `real`, the result is of the same type as `array`.
29+
If `array` is of type `real` or `complex`, the result is of the same type as `array`.
3030
If `array` is of type `integer`, the result is of type `double precision`.
3131

3232
If `dim` is absent, a scalar with the mean of all elements in `array` is returned. Otherwise, an array of rank n-1, where n equals the rank of `array`, and a shape similar to that of `array` with dimension `dim` dropped is returned.

src/stdlib_experimental_stats_mean.fypp

+47-28
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#:include "common.fypp"
2-
32
#:set RANKS = range(1, MAXRANK + 1)
4-
5-
3+
#:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
64
submodule (stdlib_experimental_stats) stdlib_experimental_stats_mean
75

86
use, intrinsic:: ieee_arithmetic, only: ieee_value, ieee_quiet_nan
@@ -12,28 +10,33 @@ submodule (stdlib_experimental_stats) stdlib_experimental_stats_mean
1210

1311
contains
1412

15-
#:for k1, t1 in REAL_KINDS_TYPES
13+
#:def name(Rank, Type, Kind)
14+
$:"mean_{0}_all_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
15+
#:enddef
16+
#:for k1, t1 in RC_KINDS_TYPES
1617
#:for rank in RANKS
17-
module function mean_${rank}$_all_${k1}$_${k1}$(x, mask) result(res)
18+
module function ${name(rank, t1, k1)}$ (x, mask) result(res)
1819
${t1}$, intent(in) :: x${ranksuffix(rank)}$
1920
logical, intent(in), optional :: mask
2021
${t1}$ :: res
2122

2223
if (.not.optval(mask, .true.)) then
23-
res = ieee_value(res, ieee_quiet_nan)
24+
res = ieee_value(real(res, kind=${k1}$), ieee_quiet_nan)
2425
return
2526
end if
2627

2728
res = sum(x) / real(size(x, kind = int64), ${k1}$)
2829

29-
end function mean_${rank}$_all_${k1}$_${k1}$
30+
end function ${name(rank, t1, k1)}$
3031
#:endfor
3132
#:endfor
3233

33-
34+
#:def name(Rank, Type, Kind)
35+
$:"mean_{0}_all_{1}{2}_rdp".format(Rank, Type[0], Kind)
36+
#:enddef
3437
#:for k1, t1 in INT_KINDS_TYPES
3538
#:for rank in RANKS
36-
module function mean_${rank}$_all_${k1}$_dp(x, mask) result(res)
39+
module function ${name(rank, t1, k1)}$(x, mask) result(res)
3740
${t1}$, intent(in) :: x${ranksuffix(rank)}$
3841
logical, intent(in), optional :: mask
3942
real(dp) :: res
@@ -45,21 +48,24 @@ contains
4548

4649
res = sum(real(x, dp)) / real(size(x, kind = int64), dp)
4750

48-
end function mean_${rank}$_all_${k1}$_dp
51+
end function ${name(rank, t1, k1)}$
4952
#:endfor
5053
#:endfor
5154

5255

53-
#:for k1, t1 in REAL_KINDS_TYPES
56+
#:def name(Rank, Type, Kind)
57+
$:"mean_{0}_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
58+
#:enddef
59+
#:for k1, t1 in RC_KINDS_TYPES
5460
#:for rank in RANKS
55-
module function mean_${rank}$_${k1}$_${k1}$(x, dim, mask) result(res)
61+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
5662
${t1}$, intent(in) :: x${ranksuffix(rank)}$
5763
integer, intent(in) :: dim
5864
logical, intent(in), optional :: mask
5965
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
6066

6167
if (.not.optval(mask, .true.)) then
62-
res = ieee_value(res, ieee_quiet_nan)
68+
res = ieee_value(real(res, kind=${k1}$), ieee_quiet_nan)
6369
return
6470
end if
6571

@@ -69,14 +75,17 @@ contains
6975
call error_stop("ERROR (mean): wrong dimension")
7076
end if
7177

72-
end function mean_${rank}$_${k1}$_${k1}$
78+
end function ${name(rank, t1, k1)}$
7379
#:endfor
7480
#:endfor
7581

7682

83+
#:def name(Rank, Type, Kind)
84+
$:"mean_{0}_{1}{2}_rdp".format(Rank, Type[0], Kind)
85+
#:enddef
7786
#:for k1, t1 in INT_KINDS_TYPES
7887
#:for rank in RANKS
79-
module function mean_${rank}$_${k1}$_dp(x, dim, mask) result(res)
88+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
8089
${t1}$, intent(in) :: x${ranksuffix(rank)}$
8190
integer, intent(in) :: dim
8291
logical, intent(in), optional :: mask
@@ -93,42 +102,49 @@ contains
93102
call error_stop("ERROR (mean): wrong dimension")
94103
end if
95104

96-
end function mean_${rank}$_${k1}$_dp
105+
end function ${name(rank, t1, k1)}$
97106
#:endfor
98107
#:endfor
99108

100-
101-
#:for k1, t1 in REAL_KINDS_TYPES
109+
#:def name(Rank, Type, Kind)
110+
$:"mean_{0}_mask_all_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
111+
#:enddef
112+
#:for k1, t1 in RC_KINDS_TYPES
102113
#:for rank in RANKS
103-
module function mean_${rank}$_mask_all_${k1}$_${k1}$(x, mask) result(res)
114+
module function ${name(rank, t1, k1)}$(x, mask) result(res)
104115
${t1}$, intent(in) :: x${ranksuffix(rank)}$
105116
logical, intent(in) :: mask${ranksuffix(rank)}$
106117
${t1}$ :: res
107118

108119
res = sum(x, mask) / real(count(mask, kind = int64), ${k1}$)
109120

110-
end function mean_${rank}$_mask_all_${k1}$_${k1}$
121+
end function ${name(rank, t1, k1)}$
111122
#:endfor
112123
#:endfor
113124

114125

126+
#:def name(Rank, Type, Kind)
127+
$:"mean_{0}_mask_all_{1}{2}_rdp".format(Rank, Type[0], Kind)
128+
#:enddef
115129
#:for k1, t1 in INT_KINDS_TYPES
116130
#:for rank in RANKS
117-
module function mean_${rank}$_mask_all_${k1}$_dp(x, mask) result(res)
131+
module function ${name(rank, t1, k1)}$(x, mask) result(res)
118132
${t1}$, intent(in) :: x${ranksuffix(rank)}$
119133
logical, intent(in) :: mask${ranksuffix(rank)}$
120134
real(dp) :: res
121135

122136
res = sum(real(x, dp), mask) / real(count(mask, kind = int64), dp)
123137

124-
end function mean_${rank}$_mask_all_${k1}$_dp
138+
end function ${name(rank, t1, k1)}$
125139
#:endfor
126140
#:endfor
127141

128-
129-
#:for k1, t1 in REAL_KINDS_TYPES
142+
#:def name(Rank, Type, Kind)
143+
$:"mean_{0}_mask_{1}{2}_{1}{2}".format(Rank, Type[0], Kind)
144+
#:enddef
145+
#:for k1, t1 in RC_KINDS_TYPES
130146
#:for rank in RANKS
131-
module function mean_${rank}$_mask_${k1}$_${k1}$(x, dim, mask) result(res)
147+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
132148
${t1}$, intent(in) :: x${ranksuffix(rank)}$
133149
integer, intent(in) :: dim
134150
logical, intent(in) :: mask${ranksuffix(rank)}$
@@ -140,14 +156,17 @@ contains
140156
call error_stop("ERROR (mean): wrong dimension")
141157
end if
142158

143-
end function mean_${rank}$_mask_${k1}$_${k1}$
159+
end function ${name(rank, t1, k1)}$
144160
#:endfor
145161
#:endfor
146162

147163

164+
#:def name(Rank, Type, Kind)
165+
$:"mean_{0}_mask_{1}{2}_rdp".format(Rank, Type[0], Kind)
166+
#:enddef
148167
#:for k1, t1 in INT_KINDS_TYPES
149168
#:for rank in RANKS
150-
module function mean_${rank}$_mask_${k1}$_dp(x, dim, mask) result(res)
169+
module function ${name(rank, t1, k1)}$(x, dim, mask) result(res)
151170
${t1}$, intent(in) :: x${ranksuffix(rank)}$
152171
integer, intent(in) :: dim
153172
logical, intent(in) :: mask${ranksuffix(rank)}$
@@ -159,7 +178,7 @@ contains
159178
call error_stop("ERROR (mean): wrong dimension")
160179
end if
161180

162-
end function mean_${rank}$_mask_${k1}$_dp
181+
end function ${name(rank, t1, k1)}$
163182
#:endfor
164183
#:endfor
165184

0 commit comments

Comments
 (0)