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.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -8
  3. data/Rakefile +9 -0
  4. data/ext/numo/narray/array.c +178 -47
  5. data/ext/numo/narray/data.c +105 -97
  6. data/ext/numo/narray/depend.erb +6 -7
  7. data/ext/numo/narray/gen/cogen.rb +30 -7
  8. data/ext/numo/narray/gen/def/bit.rb +17 -14
  9. data/ext/numo/narray/gen/def/dcomplex.rb +19 -15
  10. data/ext/numo/narray/gen/def/dfloat.rb +17 -13
  11. data/ext/numo/narray/gen/def/int16.rb +16 -12
  12. data/ext/numo/narray/gen/def/int32.rb +16 -12
  13. data/ext/numo/narray/gen/def/int64.rb +16 -12
  14. data/ext/numo/narray/gen/def/int8.rb +16 -12
  15. data/ext/numo/narray/gen/def/robject.rb +18 -14
  16. data/ext/numo/narray/gen/def/scomplex.rb +19 -15
  17. data/ext/numo/narray/gen/def/sfloat.rb +17 -13
  18. data/ext/numo/narray/gen/def/uint16.rb +16 -12
  19. data/ext/numo/narray/gen/def/uint32.rb +16 -12
  20. data/ext/numo/narray/gen/def/uint64.rb +16 -12
  21. data/ext/numo/narray/gen/def/uint8.rb +16 -12
  22. data/ext/numo/narray/gen/erbpp2.rb +324 -0
  23. data/ext/numo/narray/gen/narray_def.rb +252 -0
  24. data/ext/numo/narray/gen/spec.rb +141 -71
  25. data/ext/numo/narray/gen/tmpl/accum.c +22 -9
  26. data/ext/numo/narray/gen/tmpl/accum_binary.c +29 -13
  27. data/ext/numo/narray/gen/tmpl/accum_index.c +38 -16
  28. data/ext/numo/narray/gen/tmpl/alloc_func.c +107 -0
  29. data/ext/numo/narray/gen/tmpl/allocate.c +1 -1
  30. data/ext/numo/narray/gen/tmpl/aref.c +1 -1
  31. data/ext/numo/narray/gen/tmpl/aset.c +4 -2
  32. data/ext/numo/narray/gen/tmpl/binary.c +4 -4
  33. data/ext/numo/narray/gen/tmpl/binary2.c +5 -5
  34. data/ext/numo/narray/gen/tmpl/binary_s.c +5 -5
  35. data/ext/numo/narray/gen/tmpl/bincount.c +4 -4
  36. data/ext/numo/narray/gen/tmpl/cast.c +9 -6
  37. data/ext/numo/narray/gen/tmpl/cast_array.c +4 -9
  38. data/ext/numo/narray/gen/tmpl/class.c +9 -0
  39. data/ext/numo/narray/gen/tmpl/clip.c +118 -0
  40. data/ext/numo/narray/gen/tmpl/coerce_cast.c +4 -2
  41. data/ext/numo/narray/gen/tmpl/cond_binary.c +5 -5
  42. data/ext/numo/narray/gen/tmpl/cond_unary.c +6 -6
  43. data/ext/numo/narray/gen/tmpl/cum.c +18 -9
  44. data/ext/numo/narray/gen/tmpl/each.c +2 -2
  45. data/ext/numo/narray/gen/tmpl/each_with_index.c +2 -2
  46. data/ext/numo/narray/gen/tmpl/extract.c +2 -2
  47. data/ext/numo/narray/gen/tmpl/extract_data.c +48 -0
  48. data/ext/numo/narray/gen/tmpl/eye.c +3 -3
  49. data/ext/numo/narray/gen/tmpl/fill.c +2 -2
  50. data/ext/numo/narray/gen/tmpl/format.c +5 -5
  51. data/ext/numo/narray/gen/tmpl/format_to_a.c +4 -4
  52. data/ext/numo/narray/gen/tmpl/frexp.c +37 -0
  53. data/ext/numo/narray/gen/tmpl/init_class.c +20 -0
  54. data/ext/numo/narray/gen/tmpl/init_module.c +12 -0
  55. data/ext/numo/narray/gen/tmpl/inspect.c +2 -2
  56. data/ext/numo/narray/gen/tmpl/lib.c +45 -0
  57. data/ext/numo/narray/gen/tmpl/logseq.c +1 -1
  58. data/ext/numo/narray/gen/tmpl/map_with_index.c +2 -2
  59. data/ext/numo/narray/gen/tmpl/median.c +31 -8
  60. data/ext/numo/narray/gen/tmpl/minmax.c +24 -24
  61. data/ext/numo/narray/gen/tmpl/module.c +9 -0
  62. data/ext/numo/narray/gen/tmpl/new_dim0.c +12 -0
  63. data/ext/numo/narray/gen/tmpl/poly.c +3 -3
  64. data/ext/numo/narray/gen/tmpl/pow.c +1 -1
  65. data/ext/numo/narray/gen/tmpl/powint.c +1 -1
  66. data/ext/numo/narray/gen/tmpl/qsort.c +10 -3
  67. data/ext/numo/narray/gen/tmpl/rand.c +1 -1
  68. data/ext/numo/narray/gen/tmpl/rand_norm.c +1 -1
  69. data/ext/numo/narray/gen/tmpl/seq.c +1 -1
  70. data/ext/numo/narray/gen/tmpl/set2.c +5 -5
  71. data/ext/numo/narray/gen/tmpl/sort.c +29 -14
  72. data/ext/numo/narray/gen/tmpl/sort_index.c +41 -20
  73. data/ext/numo/narray/gen/tmpl/store.c +11 -5
  74. data/ext/numo/narray/gen/tmpl/store_array.c +1 -1
  75. data/ext/numo/narray/gen/tmpl/store_bit.c +1 -1
  76. data/ext/numo/narray/gen/tmpl/store_from.c +1 -1
  77. data/ext/numo/narray/gen/tmpl/store_numeric.c +3 -16
  78. data/ext/numo/narray/gen/tmpl/to_a.c +2 -2
  79. data/ext/numo/narray/gen/tmpl/unary.c +7 -7
  80. data/ext/numo/narray/gen/tmpl/unary2.c +8 -8
  81. data/ext/numo/narray/gen/tmpl/unary_ret2.c +33 -0
  82. data/ext/numo/narray/gen/tmpl/unary_s.c +8 -8
  83. data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -5
  84. data/ext/numo/narray/gen/tmpl_bit/aref.c +1 -1
  85. data/ext/numo/narray/gen/tmpl_bit/aset.c +2 -2
  86. data/ext/numo/narray/gen/tmpl_bit/binary.c +8 -8
  87. data/ext/numo/narray/gen/tmpl_bit/bit_count.c +8 -8
  88. data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +6 -6
  89. data/ext/numo/narray/gen/tmpl_bit/each.c +2 -2
  90. data/ext/numo/narray/gen/tmpl_bit/each_with_index.c +2 -2
  91. data/ext/numo/narray/gen/tmpl_bit/extract.c +1 -1
  92. data/ext/numo/narray/gen/tmpl_bit/fill.c +2 -2
  93. data/ext/numo/narray/gen/tmpl_bit/format.c +5 -5
  94. data/ext/numo/narray/gen/tmpl_bit/format_to_a.c +2 -2
  95. data/ext/numo/narray/gen/tmpl_bit/inspect.c +2 -2
  96. data/ext/numo/narray/gen/tmpl_bit/mask.c +5 -5
  97. data/ext/numo/narray/gen/tmpl_bit/none_p.c +4 -4
  98. data/ext/numo/narray/gen/tmpl_bit/store_array.c +2 -2
  99. data/ext/numo/narray/gen/tmpl_bit/store_bit.c +1 -1
  100. data/ext/numo/narray/gen/tmpl_bit/store_from.c +1 -1
  101. data/ext/numo/narray/gen/tmpl_bit/to_a.c +2 -2
  102. data/ext/numo/narray/gen/tmpl_bit/unary.c +9 -9
  103. data/ext/numo/narray/gen/tmpl_bit/where.c +6 -6
  104. data/ext/numo/narray/gen/tmpl_bit/where2.c +8 -8
  105. data/ext/numo/narray/index.c +46 -30
  106. data/ext/numo/narray/math.c +12 -6
  107. data/ext/numo/narray/narray.c +242 -218
  108. data/ext/numo/narray/ndloop.c +17 -24
  109. data/ext/numo/narray/numo/intern.h +63 -67
  110. data/ext/numo/narray/numo/narray.h +38 -13
  111. data/ext/numo/narray/numo/ndloop.h +1 -1
  112. data/ext/numo/narray/numo/template.h +1 -1
  113. data/ext/numo/narray/numo/types/complex.h +8 -4
  114. data/ext/numo/narray/numo/types/complex_macro.h +118 -1
  115. data/ext/numo/narray/numo/types/float_macro.h +283 -6
  116. data/ext/numo/narray/numo/types/robj_macro.h +261 -9
  117. data/ext/numo/narray/numo/types/xint_macro.h +35 -0
  118. data/ext/numo/narray/struct.c +34 -15
  119. data/lib/erbpp.rb +5 -1
  120. data/lib/erbpp/line_number.rb +10 -3
  121. data/lib/erbpp/narray_def.rb +55 -25
  122. data/lib/numo/narray/extra.rb +638 -219
  123. data/numo-narray.gemspec +1 -0
  124. data/spec/narray_spec.rb +2 -2
  125. metadata +17 -14
  126. data/ext/numo/narray/gen/dtype.erb.c +0 -82
  127. data/ext/numo/narray/gen/tmpl/cast_numeric.c +0 -22
  128. data/ext/numo/narray/gen/tmpl/robj_allocate.c +0 -32
  129. data/ext/numo/narray/gen/tmpl_bit/cast.c +0 -37
  130. data/ext/numo/narray/gen/tmpl_bit/cast_array.c +0 -18
  131. data/ext/numo/narray/gen/tmpl_bit/cast_numeric.c +0 -22
  132. data/ext/numo/narray/gen/tmpl_bit/coerce_cast.c +0 -8
  133. data/ext/numo/narray/gen/tmpl_bit/map_with_index.c +0 -94
  134. data/ext/numo/narray/gen/tmpl_bit/store.c +0 -32
  135. 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 cmp(a,b) \
60
- (m_isnan(qsort_cast(a)) ? (m_isnan(qsort_cast(b)) ? 0 : 1) : \
61
- (m_isnan(qsort_cast(b)) ? -1 : \
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 cmpgt(a,b) \
66
- ((m_isnan(qsort_cast(a)) && !m_isnan(qsort_cast(b))) || \
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,id_op_ufo,1,INT2FIX(0))
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,id_op_eq,1,y))
32
- #define m_ne(x,y) RTEST(rb_funcall(x,id_op_ne,1,y))
33
- #define m_gt(x,y) RTEST(rb_funcall(x,id_op_gt,1,y))
34
- #define m_ge(x,y) RTEST(rb_funcall(x,id_op_ge,1,y))
35
- #define m_lt(x,y) RTEST(rb_funcall(x,id_op_lt,1,y))
36
- #define m_le(x,y) RTEST(rb_funcall(x,id_op_le,1,y))
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 = f_mean(n,p,stride);
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));