numo-narray 0.9.0.4 → 0.9.0.5
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/README.md +11 -8
- data/Rakefile +9 -0
- data/ext/numo/narray/array.c +178 -47
- data/ext/numo/narray/data.c +105 -97
- data/ext/numo/narray/depend.erb +6 -7
- data/ext/numo/narray/gen/cogen.rb +30 -7
- data/ext/numo/narray/gen/def/bit.rb +17 -14
- data/ext/numo/narray/gen/def/dcomplex.rb +19 -15
- data/ext/numo/narray/gen/def/dfloat.rb +17 -13
- data/ext/numo/narray/gen/def/int16.rb +16 -12
- data/ext/numo/narray/gen/def/int32.rb +16 -12
- data/ext/numo/narray/gen/def/int64.rb +16 -12
- data/ext/numo/narray/gen/def/int8.rb +16 -12
- data/ext/numo/narray/gen/def/robject.rb +18 -14
- data/ext/numo/narray/gen/def/scomplex.rb +19 -15
- data/ext/numo/narray/gen/def/sfloat.rb +17 -13
- data/ext/numo/narray/gen/def/uint16.rb +16 -12
- data/ext/numo/narray/gen/def/uint32.rb +16 -12
- data/ext/numo/narray/gen/def/uint64.rb +16 -12
- data/ext/numo/narray/gen/def/uint8.rb +16 -12
- data/ext/numo/narray/gen/erbpp2.rb +324 -0
- data/ext/numo/narray/gen/narray_def.rb +252 -0
- data/ext/numo/narray/gen/spec.rb +141 -71
- data/ext/numo/narray/gen/tmpl/accum.c +22 -9
- data/ext/numo/narray/gen/tmpl/accum_binary.c +29 -13
- data/ext/numo/narray/gen/tmpl/accum_index.c +38 -16
- data/ext/numo/narray/gen/tmpl/alloc_func.c +107 -0
- data/ext/numo/narray/gen/tmpl/allocate.c +1 -1
- data/ext/numo/narray/gen/tmpl/aref.c +1 -1
- data/ext/numo/narray/gen/tmpl/aset.c +4 -2
- data/ext/numo/narray/gen/tmpl/binary.c +4 -4
- data/ext/numo/narray/gen/tmpl/binary2.c +5 -5
- data/ext/numo/narray/gen/tmpl/binary_s.c +5 -5
- data/ext/numo/narray/gen/tmpl/bincount.c +4 -4
- data/ext/numo/narray/gen/tmpl/cast.c +9 -6
- data/ext/numo/narray/gen/tmpl/cast_array.c +4 -9
- data/ext/numo/narray/gen/tmpl/class.c +9 -0
- data/ext/numo/narray/gen/tmpl/clip.c +118 -0
- data/ext/numo/narray/gen/tmpl/coerce_cast.c +4 -2
- data/ext/numo/narray/gen/tmpl/cond_binary.c +5 -5
- data/ext/numo/narray/gen/tmpl/cond_unary.c +6 -6
- data/ext/numo/narray/gen/tmpl/cum.c +18 -9
- data/ext/numo/narray/gen/tmpl/each.c +2 -2
- data/ext/numo/narray/gen/tmpl/each_with_index.c +2 -2
- data/ext/numo/narray/gen/tmpl/extract.c +2 -2
- data/ext/numo/narray/gen/tmpl/extract_data.c +48 -0
- data/ext/numo/narray/gen/tmpl/eye.c +3 -3
- data/ext/numo/narray/gen/tmpl/fill.c +2 -2
- data/ext/numo/narray/gen/tmpl/format.c +5 -5
- data/ext/numo/narray/gen/tmpl/format_to_a.c +4 -4
- data/ext/numo/narray/gen/tmpl/frexp.c +37 -0
- data/ext/numo/narray/gen/tmpl/init_class.c +20 -0
- data/ext/numo/narray/gen/tmpl/init_module.c +12 -0
- data/ext/numo/narray/gen/tmpl/inspect.c +2 -2
- data/ext/numo/narray/gen/tmpl/lib.c +45 -0
- data/ext/numo/narray/gen/tmpl/logseq.c +1 -1
- data/ext/numo/narray/gen/tmpl/map_with_index.c +2 -2
- data/ext/numo/narray/gen/tmpl/median.c +31 -8
- data/ext/numo/narray/gen/tmpl/minmax.c +24 -24
- data/ext/numo/narray/gen/tmpl/module.c +9 -0
- data/ext/numo/narray/gen/tmpl/new_dim0.c +12 -0
- data/ext/numo/narray/gen/tmpl/poly.c +3 -3
- data/ext/numo/narray/gen/tmpl/pow.c +1 -1
- data/ext/numo/narray/gen/tmpl/powint.c +1 -1
- data/ext/numo/narray/gen/tmpl/qsort.c +10 -3
- data/ext/numo/narray/gen/tmpl/rand.c +1 -1
- data/ext/numo/narray/gen/tmpl/rand_norm.c +1 -1
- data/ext/numo/narray/gen/tmpl/seq.c +1 -1
- data/ext/numo/narray/gen/tmpl/set2.c +5 -5
- data/ext/numo/narray/gen/tmpl/sort.c +29 -14
- data/ext/numo/narray/gen/tmpl/sort_index.c +41 -20
- data/ext/numo/narray/gen/tmpl/store.c +11 -5
- data/ext/numo/narray/gen/tmpl/store_array.c +1 -1
- data/ext/numo/narray/gen/tmpl/store_bit.c +1 -1
- data/ext/numo/narray/gen/tmpl/store_from.c +1 -1
- data/ext/numo/narray/gen/tmpl/store_numeric.c +3 -16
- data/ext/numo/narray/gen/tmpl/to_a.c +2 -2
- data/ext/numo/narray/gen/tmpl/unary.c +7 -7
- data/ext/numo/narray/gen/tmpl/unary2.c +8 -8
- data/ext/numo/narray/gen/tmpl/unary_ret2.c +33 -0
- data/ext/numo/narray/gen/tmpl/unary_s.c +8 -8
- data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -5
- data/ext/numo/narray/gen/tmpl_bit/aref.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/aset.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/binary.c +8 -8
- data/ext/numo/narray/gen/tmpl_bit/bit_count.c +8 -8
- data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +6 -6
- data/ext/numo/narray/gen/tmpl_bit/each.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/each_with_index.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/extract.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/fill.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/format.c +5 -5
- data/ext/numo/narray/gen/tmpl_bit/format_to_a.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/inspect.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/mask.c +5 -5
- data/ext/numo/narray/gen/tmpl_bit/none_p.c +4 -4
- data/ext/numo/narray/gen/tmpl_bit/store_array.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/store_bit.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/store_from.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/to_a.c +2 -2
- data/ext/numo/narray/gen/tmpl_bit/unary.c +9 -9
- data/ext/numo/narray/gen/tmpl_bit/where.c +6 -6
- data/ext/numo/narray/gen/tmpl_bit/where2.c +8 -8
- data/ext/numo/narray/index.c +46 -30
- data/ext/numo/narray/math.c +12 -6
- data/ext/numo/narray/narray.c +242 -218
- data/ext/numo/narray/ndloop.c +17 -24
- data/ext/numo/narray/numo/intern.h +63 -67
- data/ext/numo/narray/numo/narray.h +38 -13
- data/ext/numo/narray/numo/ndloop.h +1 -1
- data/ext/numo/narray/numo/template.h +1 -1
- data/ext/numo/narray/numo/types/complex.h +8 -4
- data/ext/numo/narray/numo/types/complex_macro.h +118 -1
- data/ext/numo/narray/numo/types/float_macro.h +283 -6
- data/ext/numo/narray/numo/types/robj_macro.h +261 -9
- data/ext/numo/narray/numo/types/xint_macro.h +35 -0
- data/ext/numo/narray/struct.c +34 -15
- data/lib/erbpp.rb +5 -1
- data/lib/erbpp/line_number.rb +10 -3
- data/lib/erbpp/narray_def.rb +55 -25
- data/lib/numo/narray/extra.rb +638 -219
- data/numo-narray.gemspec +1 -0
- data/spec/narray_spec.rb +2 -2
- metadata +17 -14
- data/ext/numo/narray/gen/dtype.erb.c +0 -82
- data/ext/numo/narray/gen/tmpl/cast_numeric.c +0 -22
- data/ext/numo/narray/gen/tmpl/robj_allocate.c +0 -32
- data/ext/numo/narray/gen/tmpl_bit/cast.c +0 -37
- data/ext/numo/narray/gen/tmpl_bit/cast_array.c +0 -18
- data/ext/numo/narray/gen/tmpl_bit/cast_numeric.c +0 -22
- data/ext/numo/narray/gen/tmpl_bit/coerce_cast.c +0 -8
- data/ext/numo/narray/gen/tmpl_bit/map_with_index.c +0 -94
- data/ext/numo/narray/gen/tmpl_bit/store.c +0 -32
- data/ext/numo/narray/gen/tmpl_bit/store_numeric.c +0 -22
@@ -39,6 +39,8 @@ EXTERN double pow(double, double);
|
|
39
39
|
#define m_rint(x) rint(x)
|
40
40
|
#define m_sign(x) (((x)==0) ? 0.0:(((x)>0) ? 1.0:(((x)<0) ? -1.0:(x))))
|
41
41
|
#define m_copysign(x,y) copysign(x,y)
|
42
|
+
#define m_signbit(x) signbit(x)
|
43
|
+
#define m_modf(x,y,z) {double d; y=modf(x,&d); z=d;}
|
42
44
|
|
43
45
|
#define m_eq(x,y) ((x)==(y))
|
44
46
|
#define m_ne(x,y) ((x)!=(y))
|
@@ -49,21 +51,35 @@ EXTERN double pow(double, double);
|
|
49
51
|
|
50
52
|
#define m_isnan(x) isnan(x)
|
51
53
|
#define m_isinf(x) isinf(x)
|
54
|
+
#define m_isposinf(x) (isinf(x) && signbit(x)==0)
|
55
|
+
#define m_isneginf(x) (isinf(x) && signbit(x))
|
52
56
|
#define m_isfinite(x) isfinite(x)
|
53
57
|
|
54
|
-
#define m_mulsum(x,y,z) {z += x*y;}
|
55
58
|
#define m_mulsum_init INT2FIX(0)
|
59
|
+
#define m_mulsum(x,y,z) {(z)+=(x)*(y);}
|
60
|
+
#define m_mulsum_nan(x,y,z) {if (isnan(z)) {(z)=(x)*(y);} else if (!isnan(x) && !isnan(y)) {(z)+=(x)*(y);}}
|
61
|
+
#define m_cumsum(x,y) {(x)+=(y);}
|
62
|
+
#define m_cumsum_nan(x,y) {if (isnan(x)) {(x)=(y);} else if (!isnan(y)) {(x)+=(y);}}
|
63
|
+
#define m_cumprod(x,y) {(x)*=(y);}
|
64
|
+
#define m_cumprod_nan(x,y) {if (isnan(x)) {(x)=(y);} else if (!isnan(y)) {(x)*=(y);}}
|
56
65
|
|
57
66
|
#define m_sprintf(s,x) sprintf(s,"%g",x)
|
58
67
|
|
59
|
-
#define
|
60
|
-
(
|
61
|
-
(
|
68
|
+
#define cmp_prnan(a,b) \
|
69
|
+
((qsort_cast(a)==qsort_cast(b)) ? 0 : \
|
70
|
+
(qsort_cast(a) > qsort_cast(b)) ? 1 : -1)
|
71
|
+
|
72
|
+
#define cmp_ignan(a,b) \
|
73
|
+
(m_isnan(qsort_cast(a)) ? (m_isnan(qsort_cast(b)) ? 0 : 1) : \
|
74
|
+
(m_isnan(qsort_cast(b)) ? -1 : \
|
62
75
|
((qsort_cast(a)==qsort_cast(b)) ? 0 : \
|
63
76
|
(qsort_cast(a) > qsort_cast(b)) ? 1 : -1)))
|
64
77
|
|
65
|
-
#define
|
66
|
-
(
|
78
|
+
#define cmpgt_prnan(a,b) \
|
79
|
+
(qsort_cast(a) > qsort_cast(b))
|
80
|
+
|
81
|
+
#define cmpgt_ignan(a,b) \
|
82
|
+
((m_isnan(qsort_cast(a)) && !m_isnan(qsort_cast(b))) || \
|
67
83
|
(qsort_cast(a) > qsort_cast(b)))
|
68
84
|
|
69
85
|
#define m_sqrt(x) sqrt(x)
|
@@ -78,6 +94,9 @@ EXTERN double pow(double, double);
|
|
78
94
|
#else
|
79
95
|
#define m_exp10(x) pow(10, x)
|
80
96
|
#endif
|
97
|
+
#define m_expm1(x) expm1(x)
|
98
|
+
#define m_log1p(x) log1p(x)
|
99
|
+
|
81
100
|
#define m_sin(x) sin(x)
|
82
101
|
#define m_cos(x) cos(x)
|
83
102
|
#define m_tan(x) tan(x)
|
@@ -92,6 +111,7 @@ EXTERN double pow(double, double);
|
|
92
111
|
#define m_atanh(x) atanh(x)
|
93
112
|
#define m_atan2(x,y) atan2(x,y)
|
94
113
|
#define m_hypot(x,y) hypot(x,y)
|
114
|
+
#define m_sinc(x) (sin(x)/(x))
|
95
115
|
|
96
116
|
#define m_erf(x) erf(x)
|
97
117
|
#define m_erfc(x) erfc(x)
|
@@ -119,6 +139,20 @@ static inline dtype pow_int(dtype x, int p)
|
|
119
139
|
}
|
120
140
|
|
121
141
|
|
142
|
+
static inline dtype f_sum_nan(size_t n, char *p, ssize_t stride)
|
143
|
+
{
|
144
|
+
size_t i=n;
|
145
|
+
dtype x,y=0;
|
146
|
+
|
147
|
+
for (; i--;) {
|
148
|
+
x = *(dtype*)p;
|
149
|
+
if (m_isnan(x)) {return x;}
|
150
|
+
y += x;
|
151
|
+
p += stride;
|
152
|
+
}
|
153
|
+
return y;
|
154
|
+
}
|
155
|
+
|
122
156
|
static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
123
157
|
{
|
124
158
|
size_t i=n;
|
@@ -134,6 +168,29 @@ static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
|
134
168
|
return y;
|
135
169
|
}
|
136
170
|
|
171
|
+
static inline dtype f_kahan_sum_nan(size_t n, char *p, ssize_t stride)
|
172
|
+
{
|
173
|
+
size_t i=n;
|
174
|
+
dtype x;
|
175
|
+
volatile dtype y=0;
|
176
|
+
volatile dtype t,r=0;
|
177
|
+
|
178
|
+
for (; i--;) {
|
179
|
+
x = *(dtype*)p;
|
180
|
+
if (m_isnan(x)) {return x;}
|
181
|
+
if (fabs(x) > fabs(y)) {
|
182
|
+
dtype z=x; x=y; y=z;
|
183
|
+
}
|
184
|
+
r += x;
|
185
|
+
t = y;
|
186
|
+
y += r;
|
187
|
+
t = y-t;
|
188
|
+
r -= t;
|
189
|
+
p += stride;
|
190
|
+
}
|
191
|
+
return y;
|
192
|
+
}
|
193
|
+
|
137
194
|
static inline dtype f_kahan_sum(size_t n, char *p, ssize_t stride)
|
138
195
|
{
|
139
196
|
size_t i=n;
|
@@ -158,6 +215,20 @@ static inline dtype f_kahan_sum(size_t n, char *p, ssize_t stride)
|
|
158
215
|
return y;
|
159
216
|
}
|
160
217
|
|
218
|
+
static inline dtype f_prod_nan(size_t n, char *p, ssize_t stride)
|
219
|
+
{
|
220
|
+
size_t i=n;
|
221
|
+
dtype x,y=1;
|
222
|
+
|
223
|
+
for (; i--;) {
|
224
|
+
x = *(dtype*)p;
|
225
|
+
if (m_isnan(x)) {return x;}
|
226
|
+
y *= x;
|
227
|
+
p += stride;
|
228
|
+
}
|
229
|
+
return y;
|
230
|
+
}
|
231
|
+
|
161
232
|
static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
162
233
|
{
|
163
234
|
size_t i=n;
|
@@ -173,6 +244,22 @@ static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
|
173
244
|
return y;
|
174
245
|
}
|
175
246
|
|
247
|
+
static inline dtype f_mean_nan(size_t n, char *p, ssize_t stride)
|
248
|
+
{
|
249
|
+
size_t i=n;
|
250
|
+
size_t count=0;
|
251
|
+
dtype x,y=0;
|
252
|
+
|
253
|
+
for (; i--;) {
|
254
|
+
x = *(dtype*)p;
|
255
|
+
if (m_isnan(x)) {return x;}
|
256
|
+
y += x;
|
257
|
+
count++;
|
258
|
+
p += stride;
|
259
|
+
}
|
260
|
+
return y/count;
|
261
|
+
}
|
262
|
+
|
176
263
|
static inline dtype f_mean(size_t n, char *p, ssize_t stride)
|
177
264
|
{
|
178
265
|
size_t i=n;
|
@@ -190,6 +277,27 @@ static inline dtype f_mean(size_t n, char *p, ssize_t stride)
|
|
190
277
|
return y/count;
|
191
278
|
}
|
192
279
|
|
280
|
+
static inline dtype f_var_nan(size_t n, char *p, ssize_t stride)
|
281
|
+
{
|
282
|
+
size_t i=n;
|
283
|
+
size_t count=0;
|
284
|
+
dtype x,y=0;
|
285
|
+
dtype a,m;
|
286
|
+
|
287
|
+
m = f_mean_nan(n,p,stride);
|
288
|
+
if (m_isnan(m)) {return m;}
|
289
|
+
|
290
|
+
for (; i--;) {
|
291
|
+
x = *(dtype*)p;
|
292
|
+
if (m_isnan(x)) {return x;}
|
293
|
+
a = x - m;
|
294
|
+
y += a*a;
|
295
|
+
count++;
|
296
|
+
p += stride;
|
297
|
+
}
|
298
|
+
return y/(count-1);
|
299
|
+
}
|
300
|
+
|
193
301
|
static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
194
302
|
{
|
195
303
|
size_t i=n;
|
@@ -211,11 +319,32 @@ static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
|
211
319
|
return y/(count-1);
|
212
320
|
}
|
213
321
|
|
322
|
+
static inline dtype f_stddev_nan(size_t n, char *p, ssize_t stride)
|
323
|
+
{
|
324
|
+
return m_sqrt(f_var_nan(n,p,stride));
|
325
|
+
}
|
326
|
+
|
214
327
|
static inline dtype f_stddev(size_t n, char *p, ssize_t stride)
|
215
328
|
{
|
216
329
|
return m_sqrt(f_var(n,p,stride));
|
217
330
|
}
|
218
331
|
|
332
|
+
static inline dtype f_rms_nan(size_t n, char *p, ssize_t stride)
|
333
|
+
{
|
334
|
+
size_t i=n;
|
335
|
+
size_t count=0;
|
336
|
+
dtype x,y=0;
|
337
|
+
|
338
|
+
for (; i--;) {
|
339
|
+
x = *(dtype*)p;
|
340
|
+
if (m_isnan(x)) {return x;}
|
341
|
+
y += x*x;
|
342
|
+
count++;
|
343
|
+
p += stride;
|
344
|
+
}
|
345
|
+
return m_sqrt(y/count);
|
346
|
+
}
|
347
|
+
|
219
348
|
static inline dtype f_rms(size_t n, char *p, ssize_t stride)
|
220
349
|
{
|
221
350
|
size_t i=n;
|
@@ -233,6 +362,26 @@ static inline dtype f_rms(size_t n, char *p, ssize_t stride)
|
|
233
362
|
return m_sqrt(y/count);
|
234
363
|
}
|
235
364
|
|
365
|
+
static inline dtype f_min_nan(size_t n, char *p, ssize_t stride)
|
366
|
+
{
|
367
|
+
dtype x,y;
|
368
|
+
size_t i=n;
|
369
|
+
|
370
|
+
y = *(dtype*)p;
|
371
|
+
if (m_isnan(y)) {return y;}
|
372
|
+
p += stride;
|
373
|
+
i--;
|
374
|
+
for (; i--;) {
|
375
|
+
x = *(dtype*)p;
|
376
|
+
if (m_isnan(x)) {return x;}
|
377
|
+
if (x<y) {
|
378
|
+
y = x;
|
379
|
+
}
|
380
|
+
p += stride;
|
381
|
+
}
|
382
|
+
return y;
|
383
|
+
}
|
384
|
+
|
236
385
|
static inline dtype f_min(size_t n, char *p, ssize_t stride)
|
237
386
|
{
|
238
387
|
dtype x,y;
|
@@ -251,6 +400,26 @@ static inline dtype f_min(size_t n, char *p, ssize_t stride)
|
|
251
400
|
return y;
|
252
401
|
}
|
253
402
|
|
403
|
+
static inline dtype f_max_nan(size_t n, char *p, ssize_t stride)
|
404
|
+
{
|
405
|
+
dtype x,y;
|
406
|
+
size_t i=n;
|
407
|
+
|
408
|
+
y = *(dtype*)p;
|
409
|
+
if (m_isnan(y)) {return y;}
|
410
|
+
p += stride;
|
411
|
+
i--;
|
412
|
+
for (; i--;) {
|
413
|
+
x = *(dtype*)p;
|
414
|
+
if (m_isnan(x)) {return x;}
|
415
|
+
if (x>y) {
|
416
|
+
y = x;
|
417
|
+
}
|
418
|
+
p += stride;
|
419
|
+
}
|
420
|
+
return y;
|
421
|
+
}
|
422
|
+
|
254
423
|
static inline dtype f_max(size_t n, char *p, ssize_t stride)
|
255
424
|
{
|
256
425
|
dtype x,y;
|
@@ -269,6 +438,24 @@ static inline dtype f_max(size_t n, char *p, ssize_t stride)
|
|
269
438
|
return y;
|
270
439
|
}
|
271
440
|
|
441
|
+
static inline size_t f_min_index_nan(size_t n, char *p, ssize_t stride)
|
442
|
+
{
|
443
|
+
dtype x, y;
|
444
|
+
size_t i, j=0;
|
445
|
+
|
446
|
+
y = *(dtype*)p;
|
447
|
+
if (m_isnan(y)) {return j;}
|
448
|
+
for (i=1; i<n; i++) {
|
449
|
+
x = *(dtype*)(p+i*stride);
|
450
|
+
if (m_isnan(x)) {return i;}
|
451
|
+
if (x<y) {
|
452
|
+
y = x;
|
453
|
+
j = i;
|
454
|
+
}
|
455
|
+
}
|
456
|
+
return j;
|
457
|
+
}
|
458
|
+
|
272
459
|
static inline size_t f_min_index(size_t n, char *p, ssize_t stride)
|
273
460
|
{
|
274
461
|
dtype x, y;
|
@@ -285,6 +472,24 @@ static inline size_t f_min_index(size_t n, char *p, ssize_t stride)
|
|
285
472
|
return j;
|
286
473
|
}
|
287
474
|
|
475
|
+
static inline size_t f_max_index_nan(size_t n, char *p, ssize_t stride)
|
476
|
+
{
|
477
|
+
dtype x, y;
|
478
|
+
size_t i, j=0;
|
479
|
+
|
480
|
+
y = *(dtype*)p;
|
481
|
+
if (m_isnan(y)) {return j;}
|
482
|
+
for (i=1; i<n; i++) {
|
483
|
+
x = *(dtype*)(p+i*stride);
|
484
|
+
if (m_isnan(x)) {return i;}
|
485
|
+
if (x>y) {
|
486
|
+
y = x;
|
487
|
+
j = i;
|
488
|
+
}
|
489
|
+
}
|
490
|
+
return j;
|
491
|
+
}
|
492
|
+
|
288
493
|
static inline size_t f_max_index(size_t n, char *p, ssize_t stride)
|
289
494
|
{
|
290
495
|
dtype x, y;
|
@@ -301,6 +506,78 @@ static inline size_t f_max_index(size_t n, char *p, ssize_t stride)
|
|
301
506
|
return j;
|
302
507
|
}
|
303
508
|
|
509
|
+
static inline void
|
510
|
+
f_minmax_nan(size_t n, char *p, ssize_t stride, dtype *amin, dtype *amax)
|
511
|
+
{
|
512
|
+
dtype x,min,max;
|
513
|
+
size_t i=n;
|
514
|
+
|
515
|
+
min = max = *(dtype*)p;
|
516
|
+
if (m_isnan(x)) {
|
517
|
+
*amin = *amax = min;
|
518
|
+
return;
|
519
|
+
}
|
520
|
+
p += stride;
|
521
|
+
i--;
|
522
|
+
for (; i--;) {
|
523
|
+
x = *(dtype*)p;
|
524
|
+
if (m_isnan(x)) {
|
525
|
+
*amin = *amax = x;
|
526
|
+
return;
|
527
|
+
}
|
528
|
+
if (m_lt(x,min)) {
|
529
|
+
min = x;
|
530
|
+
}
|
531
|
+
if (m_gt(x,max)) {
|
532
|
+
max = x;
|
533
|
+
}
|
534
|
+
p += stride;
|
535
|
+
}
|
536
|
+
*amin = min;
|
537
|
+
*amax = max;
|
538
|
+
return;
|
539
|
+
}
|
540
|
+
|
541
|
+
static inline dtype f_ptp_nan(size_t n, char *p, ssize_t stride)
|
542
|
+
{
|
543
|
+
dtype min,max;
|
544
|
+
f_minmax_nan(n,p,stride,&min,&max);
|
545
|
+
return m_sub(max,min);
|
546
|
+
}
|
547
|
+
|
548
|
+
static inline void
|
549
|
+
f_minmax(size_t n, char *p, ssize_t stride, dtype *amin, dtype *amax)
|
550
|
+
{
|
551
|
+
dtype x,min,max;
|
552
|
+
size_t i=n;
|
553
|
+
|
554
|
+
min = max = *(dtype*)p;
|
555
|
+
p += stride;
|
556
|
+
i--;
|
557
|
+
for (; i--;) {
|
558
|
+
x = *(dtype*)p;
|
559
|
+
if (!m_isnan(x)) {
|
560
|
+
if (m_isnan(min) || m_lt(x,min)) {
|
561
|
+
min = x;
|
562
|
+
}
|
563
|
+
if (m_isnan(max) || m_gt(x,max)) {
|
564
|
+
max = x;
|
565
|
+
}
|
566
|
+
}
|
567
|
+
p += stride;
|
568
|
+
}
|
569
|
+
*amin = min;
|
570
|
+
*amax = max;
|
571
|
+
return;
|
572
|
+
}
|
573
|
+
|
574
|
+
static inline dtype f_ptp(size_t n, char *p, ssize_t stride)
|
575
|
+
{
|
576
|
+
dtype min,max;
|
577
|
+
f_minmax(n,p,stride,&min,&max);
|
578
|
+
return m_sub(max,min);
|
579
|
+
}
|
580
|
+
|
304
581
|
static inline dtype f_seq(dtype x, dtype y, double c)
|
305
582
|
{
|
306
583
|
return x + y * c;
|
@@ -26,26 +26,40 @@
|
|
26
26
|
#define m_round(x) rb_funcall(x,id_round,0)
|
27
27
|
#define m_ceil(x) rb_funcall(x,id_ceil,0)
|
28
28
|
#define m_trunc(x) rb_funcall(x,id_truncate,0)
|
29
|
-
#define m_sign(x) rb_funcall(x,
|
29
|
+
#define m_sign(x) rb_funcall(x,id_ufo,1,INT2FIX(0))
|
30
30
|
|
31
|
-
#define m_eq(x,y) RTEST(rb_funcall(x,
|
32
|
-
#define m_ne(x,y) RTEST(rb_funcall(x,
|
33
|
-
#define m_gt(x,y) RTEST(rb_funcall(x,
|
34
|
-
#define m_ge(x,y) RTEST(rb_funcall(x,
|
35
|
-
#define m_lt(x,y) RTEST(rb_funcall(x,
|
36
|
-
#define m_le(x,y) RTEST(rb_funcall(x,
|
31
|
+
#define m_eq(x,y) RTEST(rb_funcall(x,id_eq,1,y))
|
32
|
+
#define m_ne(x,y) RTEST(rb_funcall(x,id_ne,1,y))
|
33
|
+
#define m_gt(x,y) RTEST(rb_funcall(x,id_gt,1,y))
|
34
|
+
#define m_ge(x,y) RTEST(rb_funcall(x,id_ge,1,y))
|
35
|
+
#define m_lt(x,y) RTEST(rb_funcall(x,id_lt,1,y))
|
36
|
+
#define m_le(x,y) RTEST(rb_funcall(x,id_le,1,y))
|
37
37
|
|
38
38
|
#define m_bit_and(x,y) rb_funcall(x,id_bit_and,1,y)
|
39
39
|
#define m_bit_or(x,y) rb_funcall(x,id_bit_or, 1,y)
|
40
40
|
#define m_bit_xor(x,y) rb_funcall(x,id_bit_xor,1,y)
|
41
41
|
#define m_bit_not(x) rb_funcall(x,id_bit_not,0)
|
42
42
|
|
43
|
+
#define m_left_shift(x,y) rb_funcall(x,id_left_shift,1,y)
|
44
|
+
#define m_right_shift(x,y) rb_funcall(x,id_right_shift,1,y)
|
45
|
+
|
43
46
|
#define m_isnan(x) ((rb_respond_to(x,id_nan_p)) ? RTEST(rb_funcall(x,id_nan_p,0)) : 0)
|
44
47
|
#define m_isinf(x) ((rb_respond_to(x,id_infinite_p)) ? RTEST(rb_funcall(x,id_infinite_p,0)) : 0)
|
48
|
+
#define m_isposinf(x) ((rb_respond_to(x,id_infinite_p)) ? \
|
49
|
+
((RTEST(rb_funcall(x,id_infinite_p,0))) ? \
|
50
|
+
m_gt(x,INT2FIX(0)) : 0) : 0)
|
51
|
+
#define m_isneginf(x) ((rb_respond_to(x,id_infinite_p)) ? \
|
52
|
+
((RTEST(rb_funcall(x,id_infinite_p,0))) ? \
|
53
|
+
m_lt(x,INT2FIX(0)) : 0) : 0)
|
45
54
|
#define m_isfinite(x) ((rb_respond_to(x,id_finite_p)) ? RTEST(rb_funcall(x,id_finite_p,0)) : 0)
|
46
55
|
|
47
|
-
#define m_mulsum(x,y,z) {z = m_add(m_mul(x,y),z);}
|
48
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);}}
|
49
63
|
|
50
64
|
#define m_sprintf(s,x) robj_sprintf(s,x)
|
51
65
|
|
@@ -54,6 +68,20 @@ static inline int robj_sprintf(char *s, VALUE x) {
|
|
54
68
|
return sprintf(s,"%s",StringValuePtr(v));
|
55
69
|
}
|
56
70
|
|
71
|
+
static inline dtype f_sum_nan(size_t n, char *p, ssize_t stride)
|
72
|
+
{
|
73
|
+
size_t i=n;
|
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
|
+
|
57
85
|
static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
58
86
|
{
|
59
87
|
size_t i=n;
|
@@ -69,6 +97,20 @@ static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
|
69
97
|
return y;
|
70
98
|
}
|
71
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
|
+
|
72
114
|
static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
73
115
|
{
|
74
116
|
size_t i=n;
|
@@ -84,6 +126,22 @@ static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
|
84
126
|
return y;
|
85
127
|
}
|
86
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
|
+
|
87
145
|
static inline dtype f_mean(size_t n, char *p, ssize_t stride)
|
88
146
|
{
|
89
147
|
size_t i=n;
|
@@ -101,6 +159,26 @@ static inline dtype f_mean(size_t n, char *p, ssize_t stride)
|
|
101
159
|
return m_div(y,DBL2NUM(count));
|
102
160
|
}
|
103
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
|
+
|
104
182
|
static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
105
183
|
{
|
106
184
|
size_t i=n;
|
@@ -108,7 +186,7 @@ static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
|
108
186
|
dtype x,m;
|
109
187
|
dtype y=INT2FIX(0);
|
110
188
|
|
111
|
-
m =
|
189
|
+
m = f_mean_nan(n,p,stride);
|
112
190
|
|
113
191
|
for (; i--;) {
|
114
192
|
x = *(dtype*)p;
|
@@ -121,12 +199,38 @@ static inline dtype f_var(size_t n, char *p, ssize_t stride)
|
|
121
199
|
return m_div(y,DBL2NUM(count-1));
|
122
200
|
}
|
123
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
|
+
|
124
208
|
static inline dtype f_stddev(size_t n, char *p, ssize_t stride)
|
125
209
|
{
|
126
210
|
VALUE m = rb_const_get(rb_mKernel,rb_intern("Math"));
|
127
211
|
return rb_funcall(m,rb_intern("sqrt"),1,f_var(n,p,stride));
|
128
212
|
}
|
129
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
|
+
|
130
234
|
static inline dtype f_rms(size_t n, char *p, ssize_t stride)
|
131
235
|
{
|
132
236
|
size_t i=n;
|
@@ -148,6 +252,26 @@ static inline dtype f_rms(size_t n, char *p, ssize_t stride)
|
|
148
252
|
return rb_funcall(m,rb_intern("sqrt"),1,y);
|
149
253
|
}
|
150
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
|
+
|
151
275
|
static inline dtype f_min(size_t n, char *p, ssize_t stride)
|
152
276
|
{
|
153
277
|
dtype x,y;
|
@@ -166,6 +290,26 @@ static inline dtype f_min(size_t n, char *p, ssize_t stride)
|
|
166
290
|
return y;
|
167
291
|
}
|
168
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
|
+
|
169
313
|
static inline dtype f_max(size_t n, char *p, ssize_t stride)
|
170
314
|
{
|
171
315
|
dtype x,y;
|
@@ -184,6 +328,24 @@ static inline dtype f_max(size_t n, char *p, ssize_t stride)
|
|
184
328
|
return y;
|
185
329
|
}
|
186
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
|
+
|
187
349
|
static inline size_t f_min_index(size_t n, char *p, ssize_t stride)
|
188
350
|
{
|
189
351
|
dtype x, y;
|
@@ -200,6 +362,24 @@ static inline size_t f_min_index(size_t n, char *p, ssize_t stride)
|
|
200
362
|
return j;
|
201
363
|
}
|
202
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
|
+
|
203
383
|
static inline size_t f_max_index(size_t n, char *p, ssize_t stride)
|
204
384
|
{
|
205
385
|
dtype x, y;
|
@@ -216,6 +396,78 @@ static inline size_t f_max_index(size_t n, char *p, ssize_t stride)
|
|
216
396
|
return j;
|
217
397
|
}
|
218
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
|
+
}
|
470
|
+
|
219
471
|
static inline dtype f_seq(dtype x, dtype y, size_t c)
|
220
472
|
{
|
221
473
|
y = m_mul(y,SIZET2NUM(c));
|