Skip to content

Commit 86b468b

Browse files
committed
macros out of the funs
1 parent 5c234e8 commit 86b468b

File tree

1 file changed

+134
-139
lines changed

1 file changed

+134
-139
lines changed

src/froll.c

Lines changed: 134 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,6 @@
1010
sequentially in memory to compute the rolling statistic.
1111
*/
1212

13-
#undef SUM_WINDOW_STEP_FRONT
14-
#define SUM_WINDOW_STEP_FRONT \
15-
if (R_FINITE(x[i])) { \
16-
w += x[i]; \
17-
} else if (ISNAN(x[i])) { \
18-
nc++; \
19-
} else if (x[i]==R_PosInf) { \
20-
pinf++; \
21-
} else if (x[i]==R_NegInf) { \
22-
ninf++; \
23-
}
24-
#undef SUM_WINDOW_STEP_BACK
25-
#define SUM_WINDOW_STEP_BACK \
26-
if (R_FINITE(x[i-k])) { \
27-
w -= x[i-k]; \
28-
} else if (ISNAN(x[i-k])) { \
29-
nc--; \
30-
} else if (x[i-k]==R_PosInf) { \
31-
pinf--; \
32-
} else if (x[i-k]==R_NegInf) { \
33-
ninf--; \
34-
}
35-
3613
/* rolling fun - router for fun and algo
3714
* early stopping for window bigger than input
3815
* handles 'align' in single place for center or left
@@ -107,6 +84,62 @@ void frollfun(rollfun_t rfun, unsigned int algo, const double *x, uint64_t nx, a
10784
snprintf(end(ans->message[0]), 500, _("%s: processing fun %d algo %u took %.3fs\n"), __func__, rfun, algo, omp_get_wtime()-tic);
10885
}
10986

87+
#undef SUM_WINDOW_STEP_FRONT
88+
#define SUM_WINDOW_STEP_FRONT \
89+
if (R_FINITE(x[i])) { \
90+
w += x[i]; \
91+
} else if (ISNAN(x[i])) { \
92+
nc++; \
93+
} else if (x[i]==R_PosInf) { \
94+
pinf++; \
95+
} else if (x[i]==R_NegInf) { \
96+
ninf++; \
97+
}
98+
#undef SUM_WINDOW_STEP_BACK
99+
#define SUM_WINDOW_STEP_BACK \
100+
if (R_FINITE(x[i-k])) { \
101+
w -= x[i-k]; \
102+
} else if (ISNAN(x[i-k])) { \
103+
nc--; \
104+
} else if (x[i-k]==R_PosInf) { \
105+
pinf--; \
106+
} else if (x[i-k]==R_NegInf) { \
107+
ninf--; \
108+
}
109+
#undef MEAN_WINDOW_STEP_VALUE
110+
#define MEAN_WINDOW_STEP_VALUE \
111+
if (nc == 0) { \
112+
if (pinf == 0) { \
113+
if (ninf == 0) { \
114+
ans->dbl_v[i] = (double) (w / k); \
115+
} else { \
116+
ans->dbl_v[i] = R_NegInf; \
117+
} \
118+
} else if (ninf == 0) { \
119+
ans->dbl_v[i] = R_PosInf; \
120+
} else { \
121+
ans->dbl_v[i] = R_NaN; \
122+
} \
123+
} else if (nc == k) { \
124+
ans->dbl_v[i] = narm ? R_NaN : NA_REAL; \
125+
} else { \
126+
if (narm) { \
127+
if (pinf == 0) { \
128+
if (ninf == 0) { \
129+
ans->dbl_v[i] = (double) (w / (k - nc)); \
130+
} else { \
131+
ans->dbl_v[i] = R_NegInf; \
132+
} \
133+
} else if (ninf == 0) { \
134+
ans->dbl_v[i] = R_PosInf; \
135+
} else { \
136+
ans->dbl_v[i] = R_NaN; \
137+
} \
138+
} else { \
139+
ans->dbl_v[i] = NA_REAL; \
140+
} \
141+
}
142+
110143
/* fast rolling mean - fast
111144
* when no info on NF (has.nf argument) then assume no NFs run faster version
112145
* rollmean implemented as single pass sliding window for align="right"
@@ -157,41 +190,6 @@ void frollmeanFast(const double *x, uint64_t nx, ans_t *ans, int k, double fill,
157190
if (truehasnf) {
158191
int nc = 0, pinf = 0, ninf = 0; // NA counter within sliding window
159192
int i; // iterator declared here because it is being used after for loop
160-
161-
#undef MEAN_WINDOW_STEP_VALUE
162-
#define MEAN_WINDOW_STEP_VALUE \
163-
if (nc == 0) { \
164-
if (pinf == 0) { \
165-
if (ninf == 0) { \
166-
ans->dbl_v[i] = (double) (w / k); \
167-
} else { \
168-
ans->dbl_v[i] = R_NegInf; \
169-
} \
170-
} else if (ninf == 0) { \
171-
ans->dbl_v[i] = R_PosInf; \
172-
} else { \
173-
ans->dbl_v[i] = R_NaN; \
174-
} \
175-
} else if (nc == k) { \
176-
ans->dbl_v[i] = narm ? R_NaN : NA_REAL; \
177-
} else { \
178-
if (narm) { \
179-
if (pinf == 0) { \
180-
if (ninf == 0) { \
181-
ans->dbl_v[i] = (double) (w / (k - nc)); \
182-
} else { \
183-
ans->dbl_v[i] = R_NegInf; \
184-
} \
185-
} else if (ninf == 0) { \
186-
ans->dbl_v[i] = R_PosInf; \
187-
} else { \
188-
ans->dbl_v[i] = R_NaN; \
189-
} \
190-
} else { \
191-
ans->dbl_v[i] = NA_REAL; \
192-
} \
193-
}
194-
195193
for (i=0; i<k-1; i++) { // loop over leading observation, all partial window only; #loop_counter_not_local_scope_ok
196194
SUM_WINDOW_STEP_FRONT
197195
ans->dbl_v[i] = fill; // partial window fill all
@@ -299,6 +297,40 @@ void frollmeanExact(const double *x, uint64_t nx, ans_t *ans, int k, double fill
299297
}
300298
}
301299

300+
#undef SUM_WINDOW_STEP_VALUE
301+
#define SUM_WINDOW_STEP_VALUE \
302+
if (nc == 0) { \
303+
if (pinf == 0) { \
304+
if (ninf == 0) { \
305+
ans->dbl_v[i] = (double) w; \
306+
} else { \
307+
ans->dbl_v[i] = R_NegInf; \
308+
} \
309+
} else if (ninf == 0) { \
310+
ans->dbl_v[i] = R_PosInf; \
311+
} else { \
312+
ans->dbl_v[i] = R_NaN; \
313+
} \
314+
} else if (nc == k) { \
315+
ans->dbl_v[i] = narm ? 0.0 : NA_REAL; \
316+
} else { \
317+
if (narm) { \
318+
if (pinf == 0) { \
319+
if (ninf == 0) { \
320+
ans->dbl_v[i] = (double) w; \
321+
} else { \
322+
ans->dbl_v[i] = R_NegInf; \
323+
} \
324+
} else if (ninf == 0) { \
325+
ans->dbl_v[i] = R_PosInf; \
326+
} else { \
327+
ans->dbl_v[i] = R_NaN; \
328+
} \
329+
} else { \
330+
ans->dbl_v[i] = NA_REAL; \
331+
} \
332+
}
333+
302334
/* fast rolling sum - fast
303335
* same as mean fast
304336
*/
@@ -347,41 +379,6 @@ void frollsumFast(const double *x, uint64_t nx, ans_t *ans, int k, double fill,
347379
if (truehasnf) {
348380
int nc = 0, pinf = 0, ninf = 0; // NA counter within sliding window
349381
int i; // iterator declared here because it is being used after for loop
350-
351-
#undef SUM_WINDOW_STEP_VALUE
352-
#define SUM_WINDOW_STEP_VALUE \
353-
if (nc == 0) { \
354-
if (pinf == 0) { \
355-
if (ninf == 0) { \
356-
ans->dbl_v[i] = (double) w; \
357-
} else { \
358-
ans->dbl_v[i] = R_NegInf; \
359-
} \
360-
} else if (ninf == 0) { \
361-
ans->dbl_v[i] = R_PosInf; \
362-
} else { \
363-
ans->dbl_v[i] = R_NaN; \
364-
} \
365-
} else if (nc == k) { \
366-
ans->dbl_v[i] = narm ? 0.0 : NA_REAL; \
367-
} else { \
368-
if (narm) { \
369-
if (pinf == 0) { \
370-
if (ninf == 0) { \
371-
ans->dbl_v[i] = (double) w; \
372-
} else { \
373-
ans->dbl_v[i] = R_NegInf; \
374-
} \
375-
} else if (ninf == 0) { \
376-
ans->dbl_v[i] = R_PosInf; \
377-
} else { \
378-
ans->dbl_v[i] = R_NaN; \
379-
} \
380-
} else { \
381-
ans->dbl_v[i] = NA_REAL; \
382-
} \
383-
}
384-
385382
for (i=0; i<k-1; i++) { // loop over leading observation, all partial window only; #loop_counter_not_local_scope_ok
386383
SUM_WINDOW_STEP_FRONT
387384
ans->dbl_v[i] = fill; // partial window fill all
@@ -472,7 +469,6 @@ void frollsumExact(const double *x, uint64_t nx, ans_t *ans, int k, double fill,
472469
}
473470
}
474471

475-
476472
static inline void wmax(const double * restrict x, uint64_t o, int k, double * restrict w, uint64_t *iw, bool narm) {
477473
if (narm) {
478474
for (int i=0; i<k; i++) {
@@ -888,6 +884,50 @@ void frollminExact(const double *x, uint64_t nx, ans_t *ans, int k, double fill,
888884
}
889885
}
890886

887+
#undef PROD_WINDOW_STEP_FRONT
888+
#define PROD_WINDOW_STEP_FRONT \
889+
if (R_FINITE(x[i])) { \
890+
w *= x[i]; \
891+
} else if (ISNAN(x[i])) { \
892+
nc++; \
893+
} else if (x[i]==R_PosInf) { \
894+
pinf++; \
895+
} else if (x[i]==R_NegInf) { \
896+
ninf++; \
897+
}
898+
#undef PROD_WINDOW_STEP_BACK
899+
#define PROD_WINDOW_STEP_BACK \
900+
if (R_FINITE(x[i-k])) { \
901+
w /= x[i-k]; \
902+
} else if (ISNAN(x[i-k])) { \
903+
nc--; \
904+
} else if (x[i-k]==R_PosInf) { \
905+
pinf--; \
906+
} else if (x[i-k]==R_NegInf) { \
907+
ninf--; \
908+
}
909+
#undef PROD_WINDOW_STEP_VALUE
910+
#define PROD_WINDOW_STEP_VALUE \
911+
if (nc == 0) { \
912+
if (pinf == 0 && ninf == 0) { \
913+
ans->dbl_v[i] = (double) w; \
914+
} else { \
915+
ans->dbl_v[i] = (ninf+(w<0))%2 ? R_NegInf : R_PosInf; \
916+
} \
917+
} else if (nc == k) { \
918+
ans->dbl_v[i] = narm ? 1.0 : NA_REAL; \
919+
} else { \
920+
if (narm) { \
921+
if (pinf == 0 && ninf == 0) { \
922+
ans->dbl_v[i] = (double) w; \
923+
} else { \
924+
ans->dbl_v[i] = (ninf+(w<0))%2 ? R_NegInf : R_PosInf; \
925+
} \
926+
} else { \
927+
ans->dbl_v[i] = NA_REAL; \
928+
} \
929+
}
930+
891931
/* fast rolling prod - fast
892932
* same as mean fast
893933
*/
@@ -936,51 +976,6 @@ void frollprodFast(const double *x, uint64_t nx, ans_t *ans, int k, double fill,
936976
if (truehasnf) {
937977
int nc = 0, pinf = 0, ninf = 0; // NA counter within sliding window
938978
int i; // iterator declared here because it is being used after for loop
939-
940-
#undef PROD_WINDOW_STEP_FRONT
941-
#define PROD_WINDOW_STEP_FRONT \
942-
if (R_FINITE(x[i])) { \
943-
w *= x[i]; \
944-
} else if (ISNAN(x[i])) { \
945-
nc++; \
946-
} else if (x[i]==R_PosInf) { \
947-
pinf++; \
948-
} else if (x[i]==R_NegInf) { \
949-
ninf++; \
950-
}
951-
#undef PROD_WINDOW_STEP_BACK
952-
#define PROD_WINDOW_STEP_BACK \
953-
if (R_FINITE(x[i-k])) { \
954-
w /= x[i-k]; \
955-
} else if (ISNAN(x[i-k])) { \
956-
nc--; \
957-
} else if (x[i-k]==R_PosInf) { \
958-
pinf--; \
959-
} else if (x[i-k]==R_NegInf) { \
960-
ninf--; \
961-
}
962-
#undef PROD_WINDOW_STEP_VALUE
963-
#define PROD_WINDOW_STEP_VALUE \
964-
if (nc == 0) { \
965-
if (pinf == 0 && ninf == 0) { \
966-
ans->dbl_v[i] = (double) w; \
967-
} else { \
968-
ans->dbl_v[i] = (ninf+(w<0))%2 ? R_NegInf : R_PosInf; \
969-
} \
970-
} else if (nc == k) { \
971-
ans->dbl_v[i] = narm ? 1.0 : NA_REAL; \
972-
} else { \
973-
if (narm) { \
974-
if (pinf == 0 && ninf == 0) { \
975-
ans->dbl_v[i] = (double) w; \
976-
} else { \
977-
ans->dbl_v[i] = (ninf+(w<0))%2 ? R_NegInf : R_PosInf; \
978-
} \
979-
} else { \
980-
ans->dbl_v[i] = NA_REAL; \
981-
} \
982-
}
983-
984979
for (i=0; i<k-1; i++) { // loop over leading observation, all partial window only; #loop_counter_not_local_scope_ok
985980
PROD_WINDOW_STEP_FRONT
986981
ans->dbl_v[i] = fill; // partial window fill all

0 commit comments

Comments
 (0)