numo-narray 0.9.0.5 → 0.9.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +10 -9
- data/ext/numo/narray/array.c +278 -287
- data/ext/numo/narray/gen/narray_def.rb +6 -6
- data/ext/numo/narray/gen/tmpl/accum.c +14 -15
- data/ext/numo/narray/gen/tmpl/accum_binary.c +11 -12
- data/ext/numo/narray/gen/tmpl/accum_index.c +11 -20
- data/ext/numo/narray/gen/tmpl/cum.c +6 -8
- data/ext/numo/narray/gen/tmpl/median.c +11 -14
- data/ext/numo/narray/gen/tmpl/minmax.c +10 -11
- data/ext/numo/narray/gen/tmpl/set2.c +1 -1
- data/ext/numo/narray/gen/tmpl/sort.c +6 -10
- data/ext/numo/narray/gen/tmpl/sort_index.c +16 -21
- data/ext/numo/narray/gen/tmpl/unary2.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/bit_count.c +4 -3
- data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +4 -3
- data/ext/numo/narray/narray.c +19 -8
- data/ext/numo/narray/numo/intern.h +2 -1
- data/ext/numo/narray/numo/narray.h +2 -2
- data/ext/numo/narray/numo/types/complex_macro.h +25 -11
- data/ext/numo/narray/numo/types/float_macro.h +7 -405
- data/ext/numo/narray/numo/types/real_accum.h +440 -0
- data/ext/numo/narray/numo/types/robj_macro.h +5 -405
- data/lib/numo/narray/extra.rb +50 -0
- metadata +4 -3
@@ -0,0 +1,440 @@
|
|
1
|
+
|
2
|
+
#define m_mulsum(x,y,z) {z = m_add(m_mul(x,y),z);}
|
3
|
+
#define m_mulsum_nan(x,y,z) { \
|
4
|
+
if(!m_isnan(x) && !m_isnan(y)) { \
|
5
|
+
z = m_add(m_mul(x,y),z); \
|
6
|
+
}}
|
7
|
+
|
8
|
+
#define m_cumsum(x,y) {(x)=m_add(x,y);}
|
9
|
+
#define m_cumsum_nan(x,y) { \
|
10
|
+
if (m_isnan(x)) { \
|
11
|
+
(x) = (y); \
|
12
|
+
} else if (!m_isnan(y)) { \
|
13
|
+
(x) = m_add(x,y); \
|
14
|
+
}}
|
15
|
+
|
16
|
+
#define m_cumprod(x,y) {(x)=m_mul(x,y);}
|
17
|
+
#define m_cumprod_nan(x,y) { \
|
18
|
+
if (m_isnan(x)) { \
|
19
|
+
(x) = (y); \
|
20
|
+
} else if (!m_isnan(y)) { \
|
21
|
+
(x) = m_mul(x,y); \
|
22
|
+
}}
|
23
|
+
|
24
|
+
static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
25
|
+
{
|
26
|
+
size_t i=n;
|
27
|
+
dtype x,y=m_zero;
|
28
|
+
|
29
|
+
for (; i--;) {
|
30
|
+
x = *(dtype*)p;
|
31
|
+
p += stride;
|
32
|
+
y = m_add(x,y);
|
33
|
+
}
|
34
|
+
return y;
|
35
|
+
}
|
36
|
+
|
37
|
+
static inline dtype f_sum_nan(size_t n, char *p, ssize_t stride)
|
38
|
+
{
|
39
|
+
size_t i=n;
|
40
|
+
dtype x,y=m_zero;
|
41
|
+
|
42
|
+
for (; i--;) {
|
43
|
+
x = *(dtype*)p;
|
44
|
+
p += stride;
|
45
|
+
if (!m_isnan(x)) {
|
46
|
+
y = m_add(x,y);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
return y;
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
54
|
+
{
|
55
|
+
size_t i=n;
|
56
|
+
dtype x,y=m_one;
|
57
|
+
|
58
|
+
for (; i--;) {
|
59
|
+
x = *(dtype*)p;
|
60
|
+
p += stride;
|
61
|
+
y = m_mul(x,y);
|
62
|
+
}
|
63
|
+
return y;
|
64
|
+
}
|
65
|
+
|
66
|
+
static inline dtype f_prod_nan(size_t n, char *p, ssize_t stride)
|
67
|
+
{
|
68
|
+
size_t i=n;
|
69
|
+
dtype x,y=m_one;
|
70
|
+
|
71
|
+
for (; i--;) {
|
72
|
+
x = *(dtype*)p;
|
73
|
+
p += stride;
|
74
|
+
if (!m_isnan(x)) {
|
75
|
+
y = m_mul(x,y);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
return y;
|
79
|
+
}
|
80
|
+
|
81
|
+
static inline dtype f_mean(size_t n, char *p, ssize_t stride)
|
82
|
+
{
|
83
|
+
size_t i=n;
|
84
|
+
size_t count=0;
|
85
|
+
dtype x,y=m_zero;
|
86
|
+
|
87
|
+
for (; i--;) {
|
88
|
+
x = *(dtype*)p;
|
89
|
+
p += stride;
|
90
|
+
y = m_add(x,y);
|
91
|
+
count++;
|
92
|
+
}
|
93
|
+
return m_div(y,m_from_real(count));
|
94
|
+
}
|
95
|
+
|
96
|
+
static inline dtype f_mean_nan(size_t n, char *p, ssize_t stride)
|
97
|
+
{
|
98
|
+
size_t i=n;
|
99
|
+
size_t count=0;
|
100
|
+
dtype x,y=m_zero;
|
101
|
+
|
102
|
+
for (; i--;) {
|
103
|
+
x = *(dtype*)p;
|
104
|
+
p += stride;
|
105
|
+
if (!m_isnan(x)) {
|
106
|
+
y = m_add(x,y);
|
107
|
+
count++;
|
108
|
+
}
|
109
|
+
}
|
110
|
+
return m_div(y,m_from_real(count));
|
111
|
+
}
|
112
|
+
|
113
|
+
static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
114
|
+
{
|
115
|
+
size_t i=n;
|
116
|
+
size_t count=0;
|
117
|
+
dtype x,y=m_zero;
|
118
|
+
dtype a,m;
|
119
|
+
|
120
|
+
m = f_mean(n,p,stride);
|
121
|
+
|
122
|
+
for (; i--;) {
|
123
|
+
x = *(dtype*)p;
|
124
|
+
p += stride;
|
125
|
+
a = m_abs(m_sub(x,m));
|
126
|
+
y = m_add(y,m_square(a));
|
127
|
+
count++;
|
128
|
+
}
|
129
|
+
return m_div(y,m_from_real(count-1));
|
130
|
+
}
|
131
|
+
|
132
|
+
static inline dtype f_var_nan(size_t n, char *p, ssize_t stride)
|
133
|
+
{
|
134
|
+
size_t i=n;
|
135
|
+
size_t count=0;
|
136
|
+
dtype x,y=m_zero;
|
137
|
+
dtype a,m;
|
138
|
+
|
139
|
+
m = f_mean_nan(n,p,stride);
|
140
|
+
|
141
|
+
for (; i--;) {
|
142
|
+
x = *(dtype*)p;
|
143
|
+
p += stride;
|
144
|
+
if (!m_isnan(x)) {
|
145
|
+
a = m_abs(m_sub(x,m));
|
146
|
+
y = m_add(y,m_square(a));
|
147
|
+
count++;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
return m_div(y,m_from_real(count-1));
|
151
|
+
}
|
152
|
+
|
153
|
+
static inline dtype f_stddev(size_t n, char *p, ssize_t stride)
|
154
|
+
{
|
155
|
+
return m_sqrt(f_var(n,p,stride));
|
156
|
+
}
|
157
|
+
|
158
|
+
static inline dtype f_stddev_nan(size_t n, char *p, ssize_t stride)
|
159
|
+
{
|
160
|
+
return m_sqrt(f_var_nan(n,p,stride));
|
161
|
+
}
|
162
|
+
|
163
|
+
static inline dtype f_rms(size_t n, char *p, ssize_t stride)
|
164
|
+
{
|
165
|
+
size_t i=n;
|
166
|
+
size_t count=0;
|
167
|
+
dtype x,y=m_zero;
|
168
|
+
|
169
|
+
for (; i--;) {
|
170
|
+
x = *(dtype*)p;
|
171
|
+
p += stride;
|
172
|
+
y = m_add(y,m_square(m_abs(x)));
|
173
|
+
count++;
|
174
|
+
}
|
175
|
+
return m_sqrt(m_div(y,m_from_real(count)));
|
176
|
+
}
|
177
|
+
|
178
|
+
static inline dtype f_rms_nan(size_t n, char *p, ssize_t stride)
|
179
|
+
{
|
180
|
+
size_t i=n;
|
181
|
+
size_t count=0;
|
182
|
+
dtype x,y=m_zero;
|
183
|
+
|
184
|
+
for (; i--;) {
|
185
|
+
x = *(dtype*)p;
|
186
|
+
p += stride;
|
187
|
+
if (!m_isnan(x)) {
|
188
|
+
y = m_add(y,m_square(m_abs(x)));
|
189
|
+
count++;
|
190
|
+
}
|
191
|
+
}
|
192
|
+
return m_sqrt(m_div(y,m_from_real(count)));
|
193
|
+
}
|
194
|
+
|
195
|
+
// ---------------------------------------------------------
|
196
|
+
|
197
|
+
static inline dtype f_min_nan(size_t n, char *p, ssize_t stride)
|
198
|
+
{
|
199
|
+
dtype x,y;
|
200
|
+
size_t i=n;
|
201
|
+
|
202
|
+
y = *(dtype*)p;
|
203
|
+
p += stride;
|
204
|
+
if (m_isnan(y)) {return y;}
|
205
|
+
for (i--; i--;) {
|
206
|
+
x = *(dtype*)p;
|
207
|
+
p += stride;
|
208
|
+
if (m_isnan(x)) {return x;}
|
209
|
+
if (m_lt(x,y)) {
|
210
|
+
y = x;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
return y;
|
214
|
+
}
|
215
|
+
|
216
|
+
static inline dtype f_min(size_t n, char *p, ssize_t stride)
|
217
|
+
{
|
218
|
+
dtype x,y=m_zero;
|
219
|
+
size_t i=n;
|
220
|
+
|
221
|
+
for (; i--; ) {
|
222
|
+
y = *(dtype*)p;
|
223
|
+
p += stride;
|
224
|
+
if (!m_isnan(y)) {
|
225
|
+
for (; i--;) {
|
226
|
+
x = *(dtype*)p;
|
227
|
+
p += stride;
|
228
|
+
if (m_lt(x,y)) {
|
229
|
+
y = x;
|
230
|
+
}
|
231
|
+
}
|
232
|
+
break;
|
233
|
+
}
|
234
|
+
}
|
235
|
+
return y;
|
236
|
+
}
|
237
|
+
|
238
|
+
static inline dtype f_max_nan(size_t n, char *p, ssize_t stride)
|
239
|
+
{
|
240
|
+
dtype x,y;
|
241
|
+
size_t i=n;
|
242
|
+
|
243
|
+
y = *(dtype*)p;
|
244
|
+
p += stride;
|
245
|
+
if (m_isnan(y)) {return y;}
|
246
|
+
for (i--; i--;) {
|
247
|
+
x = *(dtype*)p;
|
248
|
+
p += stride;
|
249
|
+
if (m_isnan(x)) {return x;}
|
250
|
+
if (m_gt(x,y)) {
|
251
|
+
y = x;
|
252
|
+
}
|
253
|
+
}
|
254
|
+
return y;
|
255
|
+
}
|
256
|
+
|
257
|
+
static inline dtype f_max(size_t n, char *p, ssize_t stride)
|
258
|
+
{
|
259
|
+
dtype x,y=m_zero;
|
260
|
+
size_t i=n;
|
261
|
+
|
262
|
+
for (; i--; ) {
|
263
|
+
y = *(dtype*)p;
|
264
|
+
p += stride;
|
265
|
+
if (!m_isnan(y)) {
|
266
|
+
for (; i--;) {
|
267
|
+
x = *(dtype*)p;
|
268
|
+
p += stride;
|
269
|
+
if (m_gt(x,y)) {
|
270
|
+
y = x;
|
271
|
+
}
|
272
|
+
}
|
273
|
+
break;
|
274
|
+
}
|
275
|
+
}
|
276
|
+
return y;
|
277
|
+
}
|
278
|
+
|
279
|
+
static inline size_t f_min_index_nan(size_t n, char *p, ssize_t stride)
|
280
|
+
{
|
281
|
+
dtype x, y;
|
282
|
+
size_t i, j=0;
|
283
|
+
|
284
|
+
y = *(dtype*)p;
|
285
|
+
p += stride;
|
286
|
+
if (m_isnan(y)) {return j;}
|
287
|
+
for (i=1; i<n; i++) {
|
288
|
+
x = *(dtype*)p;
|
289
|
+
p += stride;
|
290
|
+
if (m_isnan(x)) {return i;}
|
291
|
+
if (m_lt(x,y)) {
|
292
|
+
y = x;
|
293
|
+
j = i;
|
294
|
+
}
|
295
|
+
}
|
296
|
+
return j;
|
297
|
+
}
|
298
|
+
|
299
|
+
static inline size_t f_min_index(size_t n, char *p, ssize_t stride)
|
300
|
+
{
|
301
|
+
dtype x, y;
|
302
|
+
size_t i, j=0;
|
303
|
+
|
304
|
+
for (i=0; i<n; i++) {
|
305
|
+
y = *(dtype*)p;
|
306
|
+
p += stride;
|
307
|
+
if (!m_isnan(y)) {
|
308
|
+
j = i;
|
309
|
+
for (; i<n; i++) {
|
310
|
+
x = *(dtype*)p;
|
311
|
+
p += stride;
|
312
|
+
if (m_lt(x,y)) {
|
313
|
+
y = x;
|
314
|
+
j = i;
|
315
|
+
}
|
316
|
+
}
|
317
|
+
break;
|
318
|
+
}
|
319
|
+
}
|
320
|
+
return j;
|
321
|
+
}
|
322
|
+
|
323
|
+
static inline size_t f_max_index_nan(size_t n, char *p, ssize_t stride)
|
324
|
+
{
|
325
|
+
dtype x, y;
|
326
|
+
size_t i, j=0;
|
327
|
+
|
328
|
+
y = *(dtype*)p;
|
329
|
+
p += stride;
|
330
|
+
if (m_isnan(y)) {return j;}
|
331
|
+
for (i=1; i<n; i++) {
|
332
|
+
x = *(dtype*)p;
|
333
|
+
p += stride;
|
334
|
+
if (m_isnan(x)) {return i;}
|
335
|
+
if (m_gt(x,y)) {
|
336
|
+
y = x;
|
337
|
+
j = i;
|
338
|
+
}
|
339
|
+
}
|
340
|
+
return j;
|
341
|
+
}
|
342
|
+
|
343
|
+
static inline size_t f_max_index(size_t n, char *p, ssize_t stride)
|
344
|
+
{
|
345
|
+
dtype x, y;
|
346
|
+
size_t i, j=0;
|
347
|
+
|
348
|
+
for (i=0; i<n; i++) {
|
349
|
+
y = *(dtype*)p;
|
350
|
+
p += stride;
|
351
|
+
if (!m_isnan(y)) {
|
352
|
+
j = i;
|
353
|
+
for (; i<n; i++) {
|
354
|
+
x = *(dtype*)p;
|
355
|
+
p += stride;
|
356
|
+
if (m_gt(x,y)) {
|
357
|
+
y = x;
|
358
|
+
j = i;
|
359
|
+
}
|
360
|
+
}
|
361
|
+
break;
|
362
|
+
}
|
363
|
+
}
|
364
|
+
return j;
|
365
|
+
}
|
366
|
+
|
367
|
+
static inline void
|
368
|
+
f_minmax_nan(size_t n, char *p, ssize_t stride, dtype *amin, dtype *amax)
|
369
|
+
{
|
370
|
+
dtype x,min,max;
|
371
|
+
size_t i=n;
|
372
|
+
|
373
|
+
min = max = *(dtype*)p;
|
374
|
+
p += stride;
|
375
|
+
if (m_isnan(min)) {
|
376
|
+
*amin = *amax = min;
|
377
|
+
return;
|
378
|
+
}
|
379
|
+
for (i--; i--;) {
|
380
|
+
x = *(dtype*)p;
|
381
|
+
p += stride;
|
382
|
+
if (m_isnan(x)) {
|
383
|
+
*amin = *amax = x;
|
384
|
+
return;
|
385
|
+
}
|
386
|
+
if (m_lt(x,min)) {
|
387
|
+
min = x;
|
388
|
+
}
|
389
|
+
if (m_gt(x,max)) {
|
390
|
+
max = x;
|
391
|
+
}
|
392
|
+
}
|
393
|
+
*amin = min;
|
394
|
+
*amax = max;
|
395
|
+
return;
|
396
|
+
}
|
397
|
+
|
398
|
+
static inline dtype f_ptp_nan(size_t n, char *p, ssize_t stride)
|
399
|
+
{
|
400
|
+
dtype min,max;
|
401
|
+
f_minmax_nan(n,p,stride,&min,&max);
|
402
|
+
return m_sub(max,min);
|
403
|
+
}
|
404
|
+
|
405
|
+
static inline void
|
406
|
+
f_minmax(size_t n, char *p, ssize_t stride, dtype *amin, dtype *amax)
|
407
|
+
{
|
408
|
+
dtype x,min,max;
|
409
|
+
size_t i=n;
|
410
|
+
|
411
|
+
min = max = m_zero;
|
412
|
+
for (; i--; ) {
|
413
|
+
min = *(dtype*)p;
|
414
|
+
p += stride;
|
415
|
+
if (!m_isnan(min)) {
|
416
|
+
max = min;
|
417
|
+
for (; i--;) {
|
418
|
+
x = *(dtype*)p;
|
419
|
+
p += stride;
|
420
|
+
if (m_lt(x,min)) {
|
421
|
+
min = x;
|
422
|
+
}
|
423
|
+
if (m_gt(x,max)) {
|
424
|
+
max = x;
|
425
|
+
}
|
426
|
+
}
|
427
|
+
break;
|
428
|
+
}
|
429
|
+
}
|
430
|
+
*amin = min;
|
431
|
+
*amax = max;
|
432
|
+
return;
|
433
|
+
}
|
434
|
+
|
435
|
+
static inline dtype f_ptp(size_t n, char *p, ssize_t stride)
|
436
|
+
{
|
437
|
+
dtype min,max;
|
438
|
+
f_minmax(n,p,stride,&min,&max);
|
439
|
+
return m_sub(max,min);
|
440
|
+
}
|
@@ -54,12 +54,6 @@
|
|
54
54
|
#define m_isfinite(x) ((rb_respond_to(x,id_finite_p)) ? RTEST(rb_funcall(x,id_finite_p,0)) : 0)
|
55
55
|
|
56
56
|
#define m_mulsum_init INT2FIX(0)
|
57
|
-
#define m_mulsum_nan(x,y,z) {z = m_add(m_mul(x,y),z);}
|
58
|
-
#define m_mulsum(x,y,z) {if(!m_isnan(x) && !m_isnan(y)){z = m_add(m_mul(x,y),z);}}
|
59
|
-
#define m_cumsum_nan(x,y) {(x)=m_add(x,y);}
|
60
|
-
#define m_cumsum(x,y) {if (m_isnan(x)) {(x)=(y);} else if (!m_isnan(y)) {(x)=m_add(x,y);}}
|
61
|
-
#define m_cumprod_nan(x,y) {(x)=m_mul(x,y);}
|
62
|
-
#define m_cumprod(x,y) {if (m_isnan(x)) {(x)=(y);} else if (!m_isnan(y)) {(x)=m_mul(x,y);}}
|
63
57
|
|
64
58
|
#define m_sprintf(s,x) robj_sprintf(s,x)
|
65
59
|
|
@@ -68,408 +62,14 @@ static inline int robj_sprintf(char *s, VALUE x) {
|
|
68
62
|
return sprintf(s,"%s",StringValuePtr(v));
|
69
63
|
}
|
70
64
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
dtype x,y=INT2FIX(0);
|
75
|
-
|
76
|
-
for (; i--;) {
|
77
|
-
x = *(dtype*)p;
|
78
|
-
if (m_isnan(x)) {return x;}
|
79
|
-
y = m_add(x,y);
|
80
|
-
p += stride;
|
81
|
-
}
|
82
|
-
return y;
|
83
|
-
}
|
84
|
-
|
85
|
-
static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
86
|
-
{
|
87
|
-
size_t i=n;
|
88
|
-
dtype x,y=INT2FIX(0);
|
89
|
-
|
90
|
-
for (; i--;) {
|
91
|
-
x = *(dtype*)p;
|
92
|
-
if (!m_isnan(x)) {
|
93
|
-
y = m_add(x,y);
|
94
|
-
}
|
95
|
-
p += stride;
|
96
|
-
}
|
97
|
-
return y;
|
98
|
-
}
|
99
|
-
|
100
|
-
static inline dtype f_prod_nan(size_t n, char *p, ssize_t stride)
|
101
|
-
{
|
102
|
-
size_t i=n;
|
103
|
-
dtype x,y=INT2FIX(1);
|
104
|
-
|
105
|
-
for (; i--;) {
|
106
|
-
x = *(dtype*)p;
|
107
|
-
if (m_isnan(x)) {return x;}
|
108
|
-
y = m_mul(x,y);
|
109
|
-
p += stride;
|
110
|
-
}
|
111
|
-
return y;
|
112
|
-
}
|
113
|
-
|
114
|
-
static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
115
|
-
{
|
116
|
-
size_t i=n;
|
117
|
-
dtype x,y=INT2FIX(1);
|
118
|
-
|
119
|
-
for (; i--;) {
|
120
|
-
x = *(dtype*)p;
|
121
|
-
if (!m_isnan(x)) {
|
122
|
-
y = m_mul(x,y);
|
123
|
-
}
|
124
|
-
p += stride;
|
125
|
-
}
|
126
|
-
return y;
|
127
|
-
}
|
128
|
-
|
129
|
-
static inline dtype f_mean_nan(size_t n, char *p, ssize_t stride)
|
130
|
-
{
|
131
|
-
size_t i=n;
|
132
|
-
size_t count=0;
|
133
|
-
dtype x,y=INT2FIX(0);
|
134
|
-
|
135
|
-
for (; i--;) {
|
136
|
-
x = *(dtype*)p;
|
137
|
-
if (m_isnan(x)) {return x;}
|
138
|
-
y = m_add(x,y);
|
139
|
-
count++;
|
140
|
-
p += stride;
|
141
|
-
}
|
142
|
-
return m_div(y,DBL2NUM(count));
|
143
|
-
}
|
144
|
-
|
145
|
-
static inline dtype f_mean(size_t n, char *p, ssize_t stride)
|
146
|
-
{
|
147
|
-
size_t i=n;
|
148
|
-
size_t count=0;
|
149
|
-
dtype x,y=INT2FIX(0);
|
150
|
-
|
151
|
-
for (; i--;) {
|
152
|
-
x = *(dtype*)p;
|
153
|
-
if (!m_isnan(x)) {
|
154
|
-
y = m_add(x,y);
|
155
|
-
count++;
|
156
|
-
}
|
157
|
-
p += stride;
|
158
|
-
}
|
159
|
-
return m_div(y,DBL2NUM(count));
|
160
|
-
}
|
161
|
-
|
162
|
-
static inline dtype f_var_nan(size_t n, char *p, ssize_t stride)
|
163
|
-
{
|
164
|
-
size_t i=n;
|
165
|
-
size_t count=0;
|
166
|
-
dtype x,m;
|
167
|
-
dtype y=INT2FIX(0);
|
168
|
-
|
169
|
-
m = f_mean_nan(n,p,stride);
|
170
|
-
if (m_isnan(m)) {return m;}
|
171
|
-
|
172
|
-
for (; i--;) {
|
173
|
-
x = *(dtype*)p;
|
174
|
-
if (m_isnan(x)) {return x;}
|
175
|
-
y = m_add(y,m_square(m_abs(m_sub(x,m))));
|
176
|
-
count++;
|
177
|
-
p += stride;
|
178
|
-
}
|
179
|
-
return m_div(y,DBL2NUM(count-1));
|
180
|
-
}
|
181
|
-
|
182
|
-
static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
183
|
-
{
|
184
|
-
size_t i=n;
|
185
|
-
size_t count=0;
|
186
|
-
dtype x,m;
|
187
|
-
dtype y=INT2FIX(0);
|
188
|
-
|
189
|
-
m = f_mean_nan(n,p,stride);
|
190
|
-
|
191
|
-
for (; i--;) {
|
192
|
-
x = *(dtype*)p;
|
193
|
-
if (!m_isnan(x)) {
|
194
|
-
y = m_add(y,m_square(m_abs(m_sub(x,m))));
|
195
|
-
count++;
|
196
|
-
}
|
197
|
-
p += stride;
|
198
|
-
}
|
199
|
-
return m_div(y,DBL2NUM(count-1));
|
200
|
-
}
|
201
|
-
|
202
|
-
static inline dtype f_stddev_nan(size_t n, char *p, ssize_t stride)
|
203
|
-
{
|
204
|
-
VALUE m = rb_const_get(rb_mKernel,rb_intern("Math"));
|
205
|
-
return rb_funcall(m,rb_intern("sqrt"),1,f_var_nan(n,p,stride));
|
206
|
-
}
|
207
|
-
|
208
|
-
static inline dtype f_stddev(size_t n, char *p, ssize_t stride)
|
209
|
-
{
|
210
|
-
VALUE m = rb_const_get(rb_mKernel,rb_intern("Math"));
|
211
|
-
return rb_funcall(m,rb_intern("sqrt"),1,f_var(n,p,stride));
|
212
|
-
}
|
213
|
-
|
214
|
-
static inline dtype f_rms_nan(size_t n, char *p, ssize_t stride)
|
215
|
-
{
|
216
|
-
size_t i=n;
|
217
|
-
size_t count=0;
|
218
|
-
dtype x;
|
219
|
-
dtype y=INT2FIX(0);
|
220
|
-
VALUE m;
|
221
|
-
|
222
|
-
for (; i--;) {
|
223
|
-
x = *(dtype*)p;
|
224
|
-
if (m_isnan(x)) {return x;}
|
225
|
-
y = m_add(y,m_square(m_abs(x)));
|
226
|
-
count++;
|
227
|
-
p += stride;
|
228
|
-
}
|
229
|
-
y = m_div(y,DBL2NUM(count));
|
230
|
-
m = rb_const_get(rb_mKernel,rb_intern("Math"));
|
231
|
-
return rb_funcall(m,rb_intern("sqrt"),1,y);
|
232
|
-
}
|
233
|
-
|
234
|
-
static inline dtype f_rms(size_t n, char *p, ssize_t stride)
|
235
|
-
{
|
236
|
-
size_t i=n;
|
237
|
-
size_t count=0;
|
238
|
-
dtype x;
|
239
|
-
dtype y=INT2FIX(0);
|
240
|
-
VALUE m;
|
241
|
-
|
242
|
-
for (; i--;) {
|
243
|
-
x = *(dtype*)p;
|
244
|
-
if (!m_isnan(x)) {
|
245
|
-
y = m_add(y,m_square(m_abs(x)));
|
246
|
-
count++;
|
247
|
-
}
|
248
|
-
p += stride;
|
249
|
-
}
|
250
|
-
y = m_div(y,DBL2NUM(count));
|
251
|
-
m = rb_const_get(rb_mKernel,rb_intern("Math"));
|
252
|
-
return rb_funcall(m,rb_intern("sqrt"),1,y);
|
253
|
-
}
|
254
|
-
|
255
|
-
static inline dtype f_min_nan(size_t n, char *p, ssize_t stride)
|
256
|
-
{
|
257
|
-
dtype x,y;
|
258
|
-
size_t i=n;
|
259
|
-
|
260
|
-
y = *(dtype*)p;
|
261
|
-
if (m_isnan(y)) {return y;}
|
262
|
-
p += stride;
|
263
|
-
i--;
|
264
|
-
for (; i--;) {
|
265
|
-
x = *(dtype*)p;
|
266
|
-
if (m_isnan(x)) {return x;}
|
267
|
-
if (m_lt(x,y)) {
|
268
|
-
y = x;
|
269
|
-
}
|
270
|
-
p += stride;
|
271
|
-
}
|
272
|
-
return y;
|
273
|
-
}
|
274
|
-
|
275
|
-
static inline dtype f_min(size_t n, char *p, ssize_t stride)
|
276
|
-
{
|
277
|
-
dtype x,y;
|
278
|
-
size_t i=n;
|
279
|
-
|
280
|
-
y = *(dtype*)p;
|
281
|
-
p += stride;
|
282
|
-
i--;
|
283
|
-
for (; i--;) {
|
284
|
-
x = *(dtype*)p;
|
285
|
-
if (!m_isnan(x) && (m_isnan(y) || m_lt(x,y))) {
|
286
|
-
y = x;
|
287
|
-
}
|
288
|
-
p += stride;
|
289
|
-
}
|
290
|
-
return y;
|
291
|
-
}
|
292
|
-
|
293
|
-
static inline dtype f_max_nan(size_t n, char *p, ssize_t stride)
|
294
|
-
{
|
295
|
-
dtype x,y;
|
296
|
-
size_t i=n;
|
297
|
-
|
298
|
-
y = *(dtype*)p;
|
299
|
-
if (m_isnan(y)) {return y;}
|
300
|
-
p += stride;
|
301
|
-
i--;
|
302
|
-
for (; i--;) {
|
303
|
-
x = *(dtype*)p;
|
304
|
-
if (m_isnan(x)) {return x;}
|
305
|
-
if (m_gt(x,y)) {
|
306
|
-
y = x;
|
307
|
-
}
|
308
|
-
p += stride;
|
309
|
-
}
|
310
|
-
return y;
|
311
|
-
}
|
312
|
-
|
313
|
-
static inline dtype f_max(size_t n, char *p, ssize_t stride)
|
314
|
-
{
|
315
|
-
dtype x,y;
|
316
|
-
size_t i=n;
|
317
|
-
|
318
|
-
y = *(dtype*)p;
|
319
|
-
p += stride;
|
320
|
-
i--;
|
321
|
-
for (; i--;) {
|
322
|
-
x = *(dtype*)p;
|
323
|
-
if (!m_isnan(x) && (m_isnan(y) || m_gt(x,y))) {
|
324
|
-
y = x;
|
325
|
-
}
|
326
|
-
p += stride;
|
327
|
-
}
|
328
|
-
return y;
|
329
|
-
}
|
330
|
-
|
331
|
-
static inline size_t f_min_index_nan(size_t n, char *p, ssize_t stride)
|
332
|
-
{
|
333
|
-
dtype x, y;
|
334
|
-
size_t i, j=0;
|
335
|
-
|
336
|
-
y = *(dtype*)p;
|
337
|
-
if (m_isnan(y)) {return y;}
|
338
|
-
for (i=1; i<n; i++) {
|
339
|
-
x = *(dtype*)(p+i*stride);
|
340
|
-
if (m_isnan(x)) {return x;}
|
341
|
-
if (m_lt(x,y)) {
|
342
|
-
y = x;
|
343
|
-
j = i;
|
344
|
-
}
|
345
|
-
}
|
346
|
-
return j;
|
347
|
-
}
|
348
|
-
|
349
|
-
static inline size_t f_min_index(size_t n, char *p, ssize_t stride)
|
350
|
-
{
|
351
|
-
dtype x, y;
|
352
|
-
size_t i, j=0;
|
353
|
-
|
354
|
-
y = *(dtype*)p;
|
355
|
-
for (i=1; i<n; i++) {
|
356
|
-
x = *(dtype*)(p+i*stride);
|
357
|
-
if (!m_isnan(x) && (m_isnan(y) || m_lt(x,y))) {
|
358
|
-
y = x;
|
359
|
-
j = i;
|
360
|
-
}
|
361
|
-
}
|
362
|
-
return j;
|
363
|
-
}
|
364
|
-
|
365
|
-
static inline size_t f_max_index_nan(size_t n, char *p, ssize_t stride)
|
366
|
-
{
|
367
|
-
dtype x, y;
|
368
|
-
size_t i, j=0;
|
369
|
-
|
370
|
-
y = *(dtype*)p;
|
371
|
-
if (m_isnan(y)) {return y;}
|
372
|
-
for (i=1; i<n; i++) {
|
373
|
-
x = *(dtype*)(p+i*stride);
|
374
|
-
if (m_isnan(x)) {return x;}
|
375
|
-
if (m_gt(x,y)) {
|
376
|
-
y = x;
|
377
|
-
j = i;
|
378
|
-
}
|
379
|
-
}
|
380
|
-
return j;
|
381
|
-
}
|
382
|
-
|
383
|
-
static inline size_t f_max_index(size_t n, char *p, ssize_t stride)
|
384
|
-
{
|
385
|
-
dtype x, y;
|
386
|
-
size_t i, j=0;
|
387
|
-
|
388
|
-
y = *(dtype*)p;
|
389
|
-
for (i=1; i<n; i++) {
|
390
|
-
x = *(dtype*)(p+i*stride);
|
391
|
-
if (!m_isnan(x) && (m_isnan(y) || m_gt(x,y))) {
|
392
|
-
y = x;
|
393
|
-
j = i;
|
394
|
-
}
|
395
|
-
}
|
396
|
-
return j;
|
397
|
-
}
|
398
|
-
|
399
|
-
static inline void
|
400
|
-
f_minmax_nan(size_t n, char *p, ssize_t stride, dtype *amin, dtype *amax)
|
401
|
-
{
|
402
|
-
dtype x,min,max;
|
403
|
-
size_t i=n;
|
404
|
-
|
405
|
-
min = max = *(dtype*)p;
|
406
|
-
if (m_isnan(min)) {
|
407
|
-
*amin = *amax = min;
|
408
|
-
return;
|
409
|
-
}
|
410
|
-
p += stride;
|
411
|
-
i--;
|
412
|
-
for (; i--;) {
|
413
|
-
x = *(dtype*)p;
|
414
|
-
if (m_isnan(x)) {
|
415
|
-
*amin = *amax = x;
|
416
|
-
return;
|
417
|
-
}
|
418
|
-
if (m_lt(x,min)) {
|
419
|
-
min = x;
|
420
|
-
}
|
421
|
-
if (m_gt(x,max)) {
|
422
|
-
max = x;
|
423
|
-
}
|
424
|
-
p += stride;
|
425
|
-
}
|
426
|
-
*amin = min;
|
427
|
-
*amax = max;
|
428
|
-
return;
|
429
|
-
}
|
430
|
-
|
431
|
-
static inline dtype f_ptp_nan(size_t n, char *p, ssize_t stride)
|
432
|
-
{
|
433
|
-
dtype min,max;
|
434
|
-
f_minmax_nan(n,p,stride,&min,&max);
|
435
|
-
return m_sub(max,min);
|
436
|
-
}
|
437
|
-
|
438
|
-
static inline void
|
439
|
-
f_minmax(size_t n, char *p, ssize_t stride, dtype *amin, dtype *amax)
|
440
|
-
{
|
441
|
-
dtype x,min,max;
|
442
|
-
size_t i=n;
|
443
|
-
|
444
|
-
min = max = *(dtype*)p;
|
445
|
-
p += stride;
|
446
|
-
i--;
|
447
|
-
for (; i--;) {
|
448
|
-
x = *(dtype*)p;
|
449
|
-
if (!m_isnan(x)) {
|
450
|
-
if (m_isnan(min) || m_lt(x,min)) {
|
451
|
-
min = x;
|
452
|
-
}
|
453
|
-
if (m_isnan(max) || m_gt(x,max)) {
|
454
|
-
max = x;
|
455
|
-
}
|
456
|
-
}
|
457
|
-
p += stride;
|
458
|
-
}
|
459
|
-
*amin = min;
|
460
|
-
*amax = max;
|
461
|
-
return;
|
462
|
-
}
|
463
|
-
|
464
|
-
static inline dtype f_ptp(size_t n, char *p, ssize_t stride)
|
465
|
-
{
|
466
|
-
dtype min,max;
|
467
|
-
f_minmax(n,p,stride,&min,&max);
|
468
|
-
return m_sub(max,min);
|
469
|
-
}
|
65
|
+
#define m_sqrt(x) \
|
66
|
+
rb_funcall(rb_const_get(rb_mKernel,rb_intern("Math")), \
|
67
|
+
rb_intern("sqrt"),1,x);
|
470
68
|
|
471
69
|
static inline dtype f_seq(dtype x, dtype y, size_t c)
|
472
70
|
{
|
473
71
|
y = m_mul(y,SIZET2NUM(c));
|
474
72
|
return m_add(x,y);
|
475
73
|
}
|
74
|
+
|
75
|
+
#include "real_accum.h"
|