Skip to content

Commit 02a0f01

Browse files
committed
Reduce compilation load by splitting stdlib_stats_moment
- max rank 15 and one ninja job result in ~7 GB peak memory usage
1 parent b0ab3bb commit 02a0f01

5 files changed

+239
-208
lines changed

src/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ set(fppFiles
1414
stdlib_stats_cov.fypp
1515
stdlib_stats_mean.fypp
1616
stdlib_stats_moment.fypp
17+
stdlib_stats_moment_all.fypp
18+
stdlib_stats_moment_scalar.fypp
1719
stdlib_stats_var.fypp
1820
stdlib_quadrature.fypp
1921
stdlib_quadrature_trapz.fypp

src/Makefile.manual

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ SRC = f18estop.f90 \
1515
stdlib_stats.f90 \
1616
stdlib_stats_mean.f90 \
1717
stdlib_stats_moment.f90 \
18+
stdlib_stats_moment_all.f90 \
19+
stdlib_stats_moment_scalar.f90 \
1820
stdlib_stats_var.f90
1921

2022
LIB = libstdlib.a
@@ -79,4 +81,6 @@ stdlib_quadrature.f90: stdlib_quadrature.fypp
7981
stdlib_stats.f90: stdlib_stats.fypp
8082
stdlib_stats_mean.f90: stdlib_stats_mean.fypp
8183
stdlib_stats_moment.f90: stdlib_stats_moment.fypp
84+
stdlib_stats_moment_all.f90: stdlib_stats_moment_all.fypp
85+
stdlib_stats_moment_scalar.f90: stdlib_stats_moment_scalar.fypp
8286
stdlib_stats_var.f90: stdlib_stats_var.fypp

src/stdlib_stats_moment.fypp

-208
Original file line numberDiff line numberDiff line change
@@ -11,93 +11,6 @@ submodule (stdlib_stats) stdlib_stats_moment
1111

1212
contains
1313

14-
#:for k1, t1 in RC_KINDS_TYPES
15-
#:for rank in RANKS
16-
#:set RName = rname("moment_all",rank, t1, k1)
17-
module function ${RName}$(x, order, center, mask) result(res)
18-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
19-
integer, intent(in) :: order
20-
${t1}$, intent(in), optional :: center
21-
logical, intent(in), optional :: mask
22-
${t1}$ :: res
23-
24-
real(${k1}$) :: n
25-
26-
if (.not.optval(mask, .true.)) then
27-
res = ieee_value(1._${k1}$, ieee_quiet_nan)
28-
return
29-
end if
30-
31-
n = real(size(x, kind = int64), ${k1}$)
32-
33-
if (present(center)) then
34-
res = sum((x - center)**order) / n
35-
else
36-
res = sum((x - mean(x))**order) / n
37-
end if
38-
39-
end function ${RName}$
40-
#:endfor
41-
#:endfor
42-
43-
44-
#:for k1, t1 in INT_KINDS_TYPES
45-
#:for rank in RANKS
46-
#:set RName = rname("moment_all",rank, t1, k1, 'dp')
47-
module function ${RName}$(x, order, center, mask) result(res)
48-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
49-
integer, intent(in) :: order
50-
real(dp), intent(in), optional :: center
51-
logical, intent(in), optional :: mask
52-
real(dp) :: res
53-
54-
real(dp) :: n
55-
56-
if (.not.optval(mask, .true.)) then
57-
res = ieee_value(1._dp, ieee_quiet_nan)
58-
return
59-
end if
60-
61-
n = real(size(x, kind = int64), dp)
62-
63-
if (present(center)) then
64-
res = sum((real(x, dp) - center)**order) / n
65-
else
66-
res = sum((real(x, dp) - mean(x))**order) / n
67-
end if
68-
69-
end function ${RName}$
70-
#:endfor
71-
#:endfor
72-
73-
74-
#:for k1, t1 in RC_KINDS_TYPES
75-
#:for rank in REDRANKS
76-
#:set RName = rname("moment_scalar",rank, t1, k1)
77-
module function ${RName}$(x, order, dim, center, mask) result(res)
78-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
79-
integer, intent(in) :: order
80-
integer, intent(in) :: dim
81-
${t1}$, intent(in) :: center
82-
logical, intent(in), optional :: mask
83-
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
84-
85-
if (.not.optval(mask, .true.)) then
86-
res = ieee_value(1._${k1}$, ieee_quiet_nan)
87-
return
88-
end if
89-
90-
if (dim >= 1 .and. dim <= ${rank}$) then
91-
res = sum((x - center)**order, dim) / size(x, dim)
92-
else
93-
call error_stop("ERROR (moment): wrong dimension")
94-
end if
95-
96-
end function ${RName}$
97-
#:endfor
98-
#:endfor
99-
100-
10114
#:for k1, t1 in RC_KINDS_TYPES
10215
#:for rank in RANKS
10316
#:set RName = rname("moment",rank, t1, k1)
@@ -146,33 +59,6 @@ contains
14659
#:endfor
14760

14861

149-
#:for k1, t1 in INT_KINDS_TYPES
150-
#:for rank in REDRANKS
151-
#:set RName = rname("moment_scalar",rank, t1, k1, 'dp')
152-
module function ${RName}$(x, order, dim, center, mask) result(res)
153-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
154-
integer, intent(in) :: order
155-
integer, intent(in) :: dim
156-
real(dp),intent(in) :: center
157-
logical, intent(in), optional :: mask
158-
real(dp) :: res${reduced_shape('x', rank, 'dim')}$
159-
160-
if (.not.optval(mask, .true.)) then
161-
res = ieee_value(1._dp, ieee_quiet_nan)
162-
return
163-
end if
164-
165-
if (dim >= 1 .and. dim <= ${rank}$) then
166-
res = sum( (real(x, dp) - center)**order, dim) / size(x, dim)
167-
else
168-
call error_stop("ERROR (moment): wrong dimension")
169-
end if
170-
171-
end function ${RName}$
172-
#:endfor
173-
#:endfor
174-
175-
17662
#:for k1, t1 in INT_KINDS_TYPES
17763
#:for rank in RANKS
17864
#:set RName = rname("moment",rank, t1, k1, 'dp')
@@ -222,78 +108,6 @@ contains
222108
#:endfor
223109

224110

225-
#:for k1, t1 in RC_KINDS_TYPES
226-
#:for rank in RANKS
227-
#:set RName = rname("moment_mask_all",rank, t1, k1)
228-
module function ${RName}$(x, order, center, mask) result(res)
229-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
230-
integer, intent(in) :: order
231-
${t1}$, intent(in), optional :: center
232-
logical, intent(in) :: mask${ranksuffix(rank)}$
233-
${t1}$ :: res
234-
235-
real(${k1}$) :: n
236-
237-
n = real(count(mask, kind = int64), ${k1}$)
238-
239-
if (present(center)) then
240-
res = sum((x - center)**order, mask) / n
241-
else
242-
res = sum((x - mean(x, mask))**order, mask) / n
243-
end if
244-
245-
end function ${RName}$
246-
#:endfor
247-
#:endfor
248-
249-
250-
#:for k1, t1 in INT_KINDS_TYPES
251-
#:for rank in RANKS
252-
#:set RName = rname("moment_mask_all",rank, t1, k1, 'dp')
253-
module function ${RName}$(x, order, center, mask) result(res)
254-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
255-
integer, intent(in) :: order
256-
real(dp),intent(in), optional :: center
257-
logical, intent(in) :: mask${ranksuffix(rank)}$
258-
real(dp) :: res
259-
260-
real(dp) :: n
261-
262-
n = real(count(mask, kind = int64), dp)
263-
264-
if (present(center)) then
265-
res = sum((real(x, dp) - center)**order, mask) / n
266-
else
267-
res = sum((real(x, dp) - mean(x,mask))**order, mask) / n
268-
end if
269-
270-
end function ${RName}$
271-
#:endfor
272-
#:endfor
273-
274-
275-
#:for k1, t1 in RC_KINDS_TYPES
276-
#:for rank in REDRANKS
277-
#:set RName = rname("moment_mask_scalar",rank, t1, k1)
278-
module function ${RName}$(x, order, dim, center, mask) result(res)
279-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
280-
integer, intent(in) :: order
281-
integer, intent(in) :: dim
282-
${t1}$, intent(in) :: center
283-
logical, intent(in) :: mask${ranksuffix(rank)}$
284-
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
285-
286-
if (dim >= 1 .and. dim <= ${rank}$) then
287-
res = sum((x - center)**order, dim, mask) / count(mask, dim)
288-
else
289-
call error_stop("ERROR (moment): wrong dimension")
290-
end if
291-
292-
end function ${RName}$
293-
#:endfor
294-
#:endfor
295-
296-
297111
#:for k1, t1 in RC_KINDS_TYPES
298112
#:for rank in RANKS
299113
#:set RName = rname("moment_mask",rank, t1, k1)
@@ -350,28 +164,6 @@ contains
350164
#:endfor
351165

352166

353-
#:for k1, t1 in INT_KINDS_TYPES
354-
#:for rank in REDRANKS
355-
#:set RName = rname("moment_mask_scalar",rank, t1, k1, 'dp')
356-
module function ${RName}$(x, order, dim, center, mask) result(res)
357-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
358-
integer, intent(in) :: order
359-
integer, intent(in) :: dim
360-
real(dp), intent(in) :: center
361-
logical, intent(in) :: mask${ranksuffix(rank)}$
362-
real(dp) :: res${reduced_shape('x', rank, 'dim')}$
363-
364-
if (dim >= 1 .and. dim <= ${rank}$) then
365-
res = sum(( real(x, dp) - center)**order, dim, mask) / count(mask, dim)
366-
else
367-
call error_stop("ERROR (moment): wrong dimension")
368-
end if
369-
370-
end function ${RName}$
371-
#:endfor
372-
#:endfor
373-
374-
375167
#:for k1, t1 in INT_KINDS_TYPES
376168
#:for rank in RANKS
377169
#:set RName = rname("moment_mask",rank, t1, k1, 'dp')

src/stdlib_stats_moment_all.fypp

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#:include "common.fypp"
2+
#:set RANKS = range(1, MAXRANK + 1)
3+
#:set REDRANKS = range(2, MAXRANK + 1)
4+
#:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
5+
submodule (stdlib_stats) stdlib_stats_moment_all
6+
7+
use, intrinsic:: ieee_arithmetic, only: ieee_value, ieee_quiet_nan
8+
use stdlib_error, only: error_stop
9+
use stdlib_optval, only: optval
10+
implicit none
11+
12+
contains
13+
14+
#:for k1, t1 in RC_KINDS_TYPES
15+
#:for rank in RANKS
16+
#:set RName = rname("moment_all",rank, t1, k1)
17+
module function ${RName}$(x, order, center, mask) result(res)
18+
${t1}$, intent(in) :: x${ranksuffix(rank)}$
19+
integer, intent(in) :: order
20+
${t1}$, intent(in), optional :: center
21+
logical, intent(in), optional :: mask
22+
${t1}$ :: res
23+
24+
real(${k1}$) :: n
25+
26+
if (.not.optval(mask, .true.)) then
27+
res = ieee_value(1._${k1}$, ieee_quiet_nan)
28+
return
29+
end if
30+
31+
n = real(size(x, kind = int64), ${k1}$)
32+
33+
if (present(center)) then
34+
res = sum((x - center)**order) / n
35+
else
36+
res = sum((x - mean(x))**order) / n
37+
end if
38+
39+
end function ${RName}$
40+
#:endfor
41+
#:endfor
42+
43+
44+
#:for k1, t1 in INT_KINDS_TYPES
45+
#:for rank in RANKS
46+
#:set RName = rname("moment_all",rank, t1, k1, 'dp')
47+
module function ${RName}$(x, order, center, mask) result(res)
48+
${t1}$, intent(in) :: x${ranksuffix(rank)}$
49+
integer, intent(in) :: order
50+
real(dp), intent(in), optional :: center
51+
logical, intent(in), optional :: mask
52+
real(dp) :: res
53+
54+
real(dp) :: n
55+
56+
if (.not.optval(mask, .true.)) then
57+
res = ieee_value(1._dp, ieee_quiet_nan)
58+
return
59+
end if
60+
61+
n = real(size(x, kind = int64), dp)
62+
63+
if (present(center)) then
64+
res = sum((real(x, dp) - center)**order) / n
65+
else
66+
res = sum((real(x, dp) - mean(x))**order) / n
67+
end if
68+
69+
end function ${RName}$
70+
#:endfor
71+
#:endfor
72+
73+
74+
#:for k1, t1 in RC_KINDS_TYPES
75+
#:for rank in RANKS
76+
#:set RName = rname("moment_mask_all",rank, t1, k1)
77+
module function ${RName}$(x, order, center, mask) result(res)
78+
${t1}$, intent(in) :: x${ranksuffix(rank)}$
79+
integer, intent(in) :: order
80+
${t1}$, intent(in), optional :: center
81+
logical, intent(in) :: mask${ranksuffix(rank)}$
82+
${t1}$ :: res
83+
84+
real(${k1}$) :: n
85+
86+
n = real(count(mask, kind = int64), ${k1}$)
87+
88+
if (present(center)) then
89+
res = sum((x - center)**order, mask) / n
90+
else
91+
res = sum((x - mean(x, mask))**order, mask) / n
92+
end if
93+
94+
end function ${RName}$
95+
#:endfor
96+
#:endfor
97+
98+
99+
#:for k1, t1 in INT_KINDS_TYPES
100+
#:for rank in RANKS
101+
#:set RName = rname("moment_mask_all",rank, t1, k1, 'dp')
102+
module function ${RName}$(x, order, center, mask) result(res)
103+
${t1}$, intent(in) :: x${ranksuffix(rank)}$
104+
integer, intent(in) :: order
105+
real(dp),intent(in), optional :: center
106+
logical, intent(in) :: mask${ranksuffix(rank)}$
107+
real(dp) :: res
108+
109+
real(dp) :: n
110+
111+
n = real(count(mask, kind = int64), dp)
112+
113+
if (present(center)) then
114+
res = sum((real(x, dp) - center)**order, mask) / n
115+
else
116+
res = sum((real(x, dp) - mean(x,mask))**order, mask) / n
117+
end if
118+
119+
end function ${RName}$
120+
#:endfor
121+
#:endfor
122+
123+
end submodule

0 commit comments

Comments
 (0)