numo-narray-alt 0.9.5 → 0.9.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +13 -0
  4. data/ext/numo/narray/SFMT-params19937.h +12 -12
  5. data/ext/numo/narray/array.c +26 -2
  6. data/ext/numo/narray/data.c +70 -72
  7. data/ext/numo/narray/extconf.rb +0 -1
  8. data/ext/numo/narray/index.c +2 -2
  9. data/ext/numo/narray/kwargs.c +6 -6
  10. data/ext/numo/narray/math.c +10 -4
  11. data/ext/numo/narray/narray.c +80 -52
  12. data/ext/numo/narray/numo/narray.h +20 -20
  13. data/ext/numo/narray/numo/ndloop.h +1 -1
  14. data/ext/numo/narray/numo/template.h +80 -80
  15. data/ext/numo/narray/numo/types/bit.h +76 -0
  16. data/ext/numo/narray/numo/types/complex.h +2 -2
  17. data/ext/numo/narray/numo/types/complex_macro.h +27 -26
  18. data/ext/numo/narray/numo/types/float_macro.h +18 -17
  19. data/ext/numo/narray/numo/types/real_accum.h +22 -22
  20. data/ext/numo/narray/numo/types/robj_macro.h +15 -14
  21. data/ext/numo/narray/numo/types/xint_macro.h +50 -8
  22. data/ext/numo/narray/rand.c +7 -0
  23. data/ext/numo/narray/src/mh/mean.h +102 -0
  24. data/ext/numo/narray/src/mh/rms.h +102 -0
  25. data/ext/numo/narray/src/mh/stddev.h +103 -0
  26. data/ext/numo/narray/src/mh/var.h +102 -0
  27. data/ext/numo/narray/src/t_bit.c +121 -71
  28. data/ext/numo/narray/src/t_dcomplex.c +248 -387
  29. data/ext/numo/narray/src/t_dfloat.c +922 -1068
  30. data/ext/numo/narray/src/t_int16.c +282 -231
  31. data/ext/numo/narray/src/t_int32.c +282 -231
  32. data/ext/numo/narray/src/t_int64.c +281 -230
  33. data/ext/numo/narray/src/t_int8.c +282 -231
  34. data/ext/numo/narray/src/t_robject.c +278 -405
  35. data/ext/numo/narray/src/t_scomplex.c +246 -406
  36. data/ext/numo/narray/src/t_sfloat.c +916 -1058
  37. data/ext/numo/narray/src/t_uint16.c +282 -231
  38. data/ext/numo/narray/src/t_uint32.c +282 -231
  39. data/ext/numo/narray/src/t_uint64.c +282 -231
  40. data/ext/numo/narray/src/t_uint8.c +282 -231
  41. data/ext/numo/narray/struct.c +12 -7
  42. data/lib/numo/narray/extra.rb +8 -5
  43. metadata +6 -3
  44. data/ext/numo/narray/src/t_mean.c +0 -105
@@ -62,6 +62,7 @@ static inline dtype c_from_dcomplex(dcomplex x) {
62
62
  #define m_sub(x, y) c_sub(x, y)
63
63
  #define m_mul(x, y) c_mul(x, y)
64
64
  #define m_div(x, y) c_div(x, y)
65
+ #define m_div_r(x, y) c_div_r(x, y)
65
66
  #define m_mod(x, y) c_mod(x, y)
66
67
  #define m_pow(x, y) c_pow(x, y)
67
68
  #define m_pow_int(x, y) c_pow_int(x, y)
@@ -75,10 +76,10 @@ static inline dtype c_from_dcomplex(dcomplex x) {
75
76
  #define m_ceil(x) c_new(ceil(REAL(x)), ceil(IMAG(x)))
76
77
  #define m_trunc(x) c_new(trunc(REAL(x)), trunc(IMAG(x)))
77
78
  #define m_rint(x) c_new(rint(REAL(x)), rint(IMAG(x)))
78
- #define m_sign(x) \
79
- c_new( \
80
- ((REAL(x) == 0) ? 0.0 : ((REAL(x) > 0) ? 1.0 : ((REAL(x) < 0) ? -1.0 : REAL(x)))), \
81
- ((IMAG(x) == 0) ? 0.0 : ((IMAG(x) > 0) ? 1.0 : ((IMAG(x) < 0) ? -1.0 : IMAG(x)))) \
79
+ #define m_sign(x) \
80
+ c_new( \
81
+ ((REAL(x) == 0) ? 0.0 : ((REAL(x) > 0) ? 1.0 : ((REAL(x) < 0) ? -1.0 : REAL(x)))), \
82
+ ((IMAG(x) == 0) ? 0.0 : ((IMAG(x) > 0) ? 1.0 : ((IMAG(x) < 0) ? -1.0 : IMAG(x)))) \
82
83
  )
83
84
  #define m_copysign(x, y) c_new(copysign(REAL(x), REAL(y)), copysign(IMAG(x), IMAG(y)))
84
85
 
@@ -126,35 +127,35 @@ static inline dtype c_from_dcomplex(dcomplex x) {
126
127
 
127
128
  #define not_nan(x) (REAL(x) == REAL(x) && IMAG(x) == IMAG(x))
128
129
 
129
- #define m_mulsum(x, y, z) \
130
+ #define m_mulsum(x, y, z) \
130
131
  { z = m_add(m_mul(x, y), z); }
131
- #define m_mulsum_nan(x, y, z) \
132
- { \
133
- if (not_nan(x) && not_nan(y)) { \
134
- z = m_add(m_mul(x, y), z); \
135
- } \
132
+ #define m_mulsum_nan(x, y, z) \
133
+ { \
134
+ if (not_nan(x) && not_nan(y)) { \
135
+ z = m_add(m_mul(x, y), z); \
136
+ } \
136
137
  }
137
138
 
138
- #define m_cumsum(x, y) \
139
+ #define m_cumsum(x, y) \
139
140
  { (x) = m_add(x, y); }
140
- #define m_cumsum_nan(x, y) \
141
- { \
142
- if (!not_nan(x)) { \
143
- (x) = (y); \
144
- } else if (not_nan(y)) { \
145
- (x) = m_add(x, y); \
146
- } \
141
+ #define m_cumsum_nan(x, y) \
142
+ { \
143
+ if (!not_nan(x)) { \
144
+ (x) = (y); \
145
+ } else if (not_nan(y)) { \
146
+ (x) = m_add(x, y); \
147
+ } \
147
148
  }
148
149
 
149
- #define m_cumprod(x, y) \
150
+ #define m_cumprod(x, y) \
150
151
  { (x) = m_mul(x, y); }
151
- #define m_cumprod_nan(x, y) \
152
- { \
153
- if (!not_nan(x)) { \
154
- (x) = (y); \
155
- } else if (not_nan(y)) { \
156
- (x) = m_mul(x, y); \
157
- } \
152
+ #define m_cumprod_nan(x, y) \
153
+ { \
154
+ if (!not_nan(x)) { \
155
+ (x) = (y); \
156
+ } else if (not_nan(y)) { \
157
+ (x) = m_mul(x, y); \
158
+ } \
158
159
  }
159
160
 
160
161
  static inline dtype f_sum(size_t n, char* p, ssize_t stride) {
@@ -27,12 +27,13 @@ extern double pow(double, double);
27
27
  #define m_sub(x, y) ((x) - (y))
28
28
  #define m_mul(x, y) ((x) * (y))
29
29
  #define m_div(x, y) ((x) / (y))
30
+ #define m_div_r(x, y) m_div(x, m_from_real(y))
30
31
  #define m_div_check(x, y) ((y) == 0)
31
32
  #define m_mod(x, y) fmod(x, y)
32
- #define m_divmod(x, y, a, b) \
33
- { \
34
- a = (x) / (y); \
35
- b = m_mod(x, y); \
33
+ #define m_divmod(x, y, a, b) \
34
+ { \
35
+ a = (x) / (y); \
36
+ b = m_mod(x, y); \
36
37
  }
37
38
  #define m_pow(x, y) pow(x, y)
38
39
  #define m_pow_int(x, y) pow_int(x, y)
@@ -49,11 +50,11 @@ extern double pow(double, double);
49
50
  #define m_sign(x) (((x) == 0) ? 0.0 : (((x) > 0) ? 1.0 : (((x) < 0) ? -1.0 : (x))))
50
51
  #define m_copysign(x, y) copysign(x, y)
51
52
  #define m_signbit(x) signbit(x)
52
- #define m_modf(x, y, z) \
53
- { \
54
- double d; \
55
- y = modf(x, &d); \
56
- z = d; \
53
+ #define m_modf(x, y, z) \
54
+ { \
55
+ double d; \
56
+ y = modf(x, &d); \
57
+ z = d; \
57
58
  }
58
59
 
59
60
  #define m_eq(x, y) ((x) == (y))
@@ -73,20 +74,20 @@ extern double pow(double, double);
73
74
 
74
75
  #define m_sprintf(s, x) sprintf(s, "%g", x)
75
76
 
76
- #define cmp_prnan(a, b) \
77
+ #define cmp_prnan(a, b) \
77
78
  ((qsort_cast(a) == qsort_cast(b)) ? 0 : (qsort_cast(a) > qsort_cast(b)) ? 1 : -1)
78
79
 
79
- #define cmp_ignan(a, b) \
80
- (m_isnan(qsort_cast(a)) \
81
- ? (m_isnan(qsort_cast(b)) ? 0 : 1) \
82
- : (m_isnan(qsort_cast(b)) ? -1 \
83
- : ((qsort_cast(a) == qsort_cast(b)) ? 0 \
84
- : (qsort_cast(a) > qsort_cast(b)) ? 1 \
80
+ #define cmp_ignan(a, b) \
81
+ (m_isnan(qsort_cast(a)) \
82
+ ? (m_isnan(qsort_cast(b)) ? 0 : 1) \
83
+ : (m_isnan(qsort_cast(b)) ? -1 \
84
+ : ((qsort_cast(a) == qsort_cast(b)) ? 0 \
85
+ : (qsort_cast(a) > qsort_cast(b)) ? 1 \
85
86
  : -1)))
86
87
 
87
88
  #define cmpgt_prnan(a, b) (qsort_cast(a) > qsort_cast(b))
88
89
 
89
- #define cmpgt_ignan(a, b) \
90
+ #define cmpgt_ignan(a, b) \
90
91
  ((m_isnan(qsort_cast(a)) && !m_isnan(qsort_cast(b))) || (qsort_cast(a) > qsort_cast(b)))
91
92
 
92
93
  #define m_sqrt(x) sqrt(x)
@@ -1,34 +1,34 @@
1
1
  #define not_nan(x) ((x) == (x))
2
2
 
3
- #define m_mulsum(x, y, z) \
3
+ #define m_mulsum(x, y, z) \
4
4
  { z = m_add(m_mul(x, y), z); }
5
- #define m_mulsum_nan(x, y, z) \
6
- { \
7
- if (not_nan(x) && not_nan(y)) { \
8
- z = m_add(m_mul(x, y), z); \
9
- } \
5
+ #define m_mulsum_nan(x, y, z) \
6
+ { \
7
+ if (not_nan(x) && not_nan(y)) { \
8
+ z = m_add(m_mul(x, y), z); \
9
+ } \
10
10
  }
11
11
 
12
- #define m_cumsum(x, y) \
12
+ #define m_cumsum(x, y) \
13
13
  { (x) = m_add(x, y); }
14
- #define m_cumsum_nan(x, y) \
15
- { \
16
- if (!not_nan(x)) { \
17
- (x) = (y); \
18
- } else if (not_nan(y)) { \
19
- (x) = m_add(x, y); \
20
- } \
14
+ #define m_cumsum_nan(x, y) \
15
+ { \
16
+ if (!not_nan(x)) { \
17
+ (x) = (y); \
18
+ } else if (not_nan(y)) { \
19
+ (x) = m_add(x, y); \
20
+ } \
21
21
  }
22
22
 
23
- #define m_cumprod(x, y) \
23
+ #define m_cumprod(x, y) \
24
24
  { (x) = m_mul(x, y); }
25
- #define m_cumprod_nan(x, y) \
26
- { \
27
- if (!not_nan(x)) { \
28
- (x) = (y); \
29
- } else if (not_nan(y)) { \
30
- (x) = m_mul(x, y); \
31
- } \
25
+ #define m_cumprod_nan(x, y) \
26
+ { \
27
+ if (!not_nan(x)) { \
28
+ (x) = (y); \
29
+ } else if (not_nan(y)) { \
30
+ (x) = m_mul(x, y); \
31
+ } \
32
32
  }
33
33
 
34
34
  static inline dtype f_sum(size_t n, char* p, ssize_t stride) {
@@ -16,12 +16,13 @@
16
16
  #define m_sub(x, y) rb_funcall(x, '-', 1, y)
17
17
  #define m_mul(x, y) rb_funcall(x, '*', 1, y)
18
18
  #define m_div(x, y) rb_funcall(x, '/', 1, y)
19
+ #define m_div_r(x, y) m_div(x, m_from_real(y))
19
20
  #define m_mod(x, y) rb_funcall(x, '%', 1, y)
20
- #define m_divmod(x, y, a, b) \
21
- { \
22
- x = rb_funcall(x, id_divmod, 1, y); \
23
- a = RARRAY_PTR(x)[0]; \
24
- b = RARRAY_PTR(x)[0]; \
21
+ #define m_divmod(x, y, a, b) \
22
+ { \
23
+ x = rb_funcall(x, id_divmod, 1, y); \
24
+ a = RARRAY_PTR(x)[0]; \
25
+ b = RARRAY_PTR(x)[0]; \
25
26
  }
26
27
  #define m_pow(x, y) rb_funcall(x, id_pow, 1, y)
27
28
  #define m_pow_int(x, y) rb_funcall(x, id_pow, 1, y)
@@ -52,17 +53,17 @@
52
53
  #define m_right_shift(x, y) rb_funcall(x, id_right_shift, 1, y)
53
54
 
54
55
  #define m_isnan(x) ((rb_respond_to(x, id_nan_p)) ? RTEST(rb_funcall(x, id_nan_p, 0)) : 0)
55
- #define m_isinf(x) \
56
+ #define m_isinf(x) \
56
57
  ((rb_respond_to(x, id_infinite_p)) ? RTEST(rb_funcall(x, id_infinite_p, 0)) : 0)
57
- #define m_isposinf(x) \
58
- ((rb_respond_to(x, id_infinite_p)) \
59
- ? ((RTEST(rb_funcall(x, id_infinite_p, 0))) ? m_gt(x, INT2FIX(0)) : 0) \
58
+ #define m_isposinf(x) \
59
+ ((rb_respond_to(x, id_infinite_p)) \
60
+ ? ((RTEST(rb_funcall(x, id_infinite_p, 0))) ? m_gt(x, INT2FIX(0)) : 0) \
60
61
  : 0)
61
- #define m_isneginf(x) \
62
- ((rb_respond_to(x, id_infinite_p)) \
63
- ? ((RTEST(rb_funcall(x, id_infinite_p, 0))) ? m_lt(x, INT2FIX(0)) : 0) \
62
+ #define m_isneginf(x) \
63
+ ((rb_respond_to(x, id_infinite_p)) \
64
+ ? ((RTEST(rb_funcall(x, id_infinite_p, 0))) ? m_lt(x, INT2FIX(0)) : 0) \
64
65
  : 0)
65
- #define m_isfinite(x) \
66
+ #define m_isfinite(x) \
66
67
  ((rb_respond_to(x, id_finite_p)) ? RTEST(rb_funcall(x, id_finite_p, 0)) : 0)
67
68
 
68
69
  #define m_mulsum_init INT2FIX(0)
@@ -74,7 +75,7 @@ static inline int robj_sprintf(char* s, VALUE x) {
74
75
  return sprintf(s, "%s", StringValuePtr(v));
75
76
  }
76
77
 
77
- #define m_sqrt(x) \
78
+ #define m_sqrt(x) \
78
79
  rb_funcall(rb_const_get(rb_mKernel, rb_intern("Math")), rb_intern("sqrt"), 1, x);
79
80
 
80
81
  static inline dtype f_seq(dtype x, dtype y, size_t c) {
@@ -17,10 +17,10 @@
17
17
  #define m_mul(x, y) ((x) * (y))
18
18
  #define m_div(x, y) ((x) / (y))
19
19
  #define m_mod(x, y) ((x) % (y))
20
- #define m_divmod(x, y, a, b) \
21
- { \
22
- a = (x) / (y); \
23
- b = m_mod(x, y); \
20
+ #define m_divmod(x, y, a, b) \
21
+ { \
22
+ a = (x) / (y); \
23
+ b = m_mod(x, y); \
24
24
  }
25
25
  #define m_pow(x, y) pow_int(x, y)
26
26
  #define m_pow_int(x, y) pow_int(x, y)
@@ -45,15 +45,15 @@
45
45
 
46
46
  #define m_isnan(x) 0
47
47
 
48
- #define m_mulsum(x, y, z) \
48
+ #define m_mulsum(x, y, z) \
49
49
  { z += x * y; }
50
50
  #define m_mulsum_init INT2FIX(0)
51
- #define m_cumsum(x, y) \
51
+ #define m_cumsum(x, y) \
52
52
  { x += y; }
53
- #define m_cumprod(x, y) \
53
+ #define m_cumprod(x, y) \
54
54
  { x *= y; }
55
55
 
56
- #define cmp(a, b) \
56
+ #define cmp(a, b) \
57
57
  ((qsort_cast(a) == qsort_cast(b)) ? 0 : (qsort_cast(a) > qsort_cast(b)) ? 1 : -1)
58
58
  #define cmpgt(a, b) (qsort_cast(a) > qsort_cast(b))
59
59
 
@@ -165,3 +165,45 @@ static inline dtype f_minimum(dtype x, dtype y) {
165
165
  }
166
166
  return y;
167
167
  }
168
+
169
+ static inline double f_mean(size_t n, char* p, ssize_t stride) {
170
+ size_t count = 0;
171
+ double sum = 0.0;
172
+ for (size_t i = n; i--;) {
173
+ const double x = (double)(*(dtype*)p);
174
+ p += stride;
175
+ sum = m_add(sum, x);
176
+ count++;
177
+ }
178
+ return sum / (double)count;
179
+ }
180
+
181
+ static inline double f_var(size_t n, char* p, ssize_t stride) {
182
+ size_t count = 0;
183
+ double sum = 0.0;
184
+ const double mean = f_mean(n, p, stride);
185
+ for (size_t i = n; i--;) {
186
+ const double x = (double)(*(dtype*)p);
187
+ const double d = m_sub(x, mean);
188
+ p += stride;
189
+ sum = m_add(sum, m_square(d));
190
+ count++;
191
+ }
192
+ return sum / (double)(count - 1);
193
+ }
194
+
195
+ static inline double f_stddev(size_t n, char* p, ssize_t stride) {
196
+ return sqrt(f_var(n, p, stride));
197
+ }
198
+
199
+ static inline double f_rms(size_t n, char* p, ssize_t stride) {
200
+ size_t count = 0;
201
+ double sum = 0.0;
202
+ for (size_t i = n; i--;) {
203
+ const double x = (double)(*(dtype*)p);
204
+ p += stride;
205
+ sum = m_add(sum, m_square(x));
206
+ count++;
207
+ }
208
+ return sqrt(sum / (double)count);
209
+ }
@@ -35,6 +35,13 @@ static VALUE nary_s_srand(int argc, VALUE* argv, VALUE obj) {
35
35
  }
36
36
 
37
37
  void Init_nary_rand(void) {
38
+ /**
39
+ * Sets the seed for random number generator.
40
+ * @overload Numo::NArray.srand(seed)
41
+ * @param seed [Integer] if seed is not given, a seed is generated from current time,
42
+ * process id, and a sequence number.
43
+ * @return [nil]
44
+ */
38
45
  rb_define_singleton_method(cNArray, "srand", nary_s_srand, -1);
39
46
  init_gen_rand(0);
40
47
  }
@@ -0,0 +1,102 @@
1
+ /*
2
+ mean.h
3
+ Numo::NArray Alternative
4
+
5
+ created on: 2025-10-08
6
+ Copyright (C) 2025 Atsushi Tatsuma
7
+ */
8
+ #ifndef NUMO_NARRAY_MH_MEAN_H
9
+ #define NUMO_NARRAY_MH_MEAN_H 1
10
+
11
+ #define DEF_NARRAY_FLT_MEAN_METHOD_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass) \
12
+ static void iter_##tDType##_mean(na_loop_t* const lp) { \
13
+ size_t n; \
14
+ char* p1; \
15
+ char* p2; \
16
+ ssize_t s1; \
17
+ \
18
+ INIT_COUNTER(lp, n); \
19
+ INIT_PTR(lp, 0, p1, s1); \
20
+ p2 = NDL_PTR(lp, 1); \
21
+ \
22
+ *(tRtDType*)p2 = f_mean(n, p1, s1); \
23
+ } \
24
+ \
25
+ static void iter_##tDType##_mean_nan(na_loop_t* const lp) { \
26
+ size_t n; \
27
+ char* p1; \
28
+ char* p2; \
29
+ ssize_t s1; \
30
+ \
31
+ INIT_COUNTER(lp, n); \
32
+ INIT_PTR(lp, 0, p1, s1); \
33
+ p2 = NDL_PTR(lp, 1); \
34
+ \
35
+ *(tRtDType*)p2 = f_mean_nan(n, p1, s1); \
36
+ } \
37
+ \
38
+ static VALUE tDType##_mean(int argc, VALUE* argv, VALUE self) { \
39
+ ndfunc_arg_in_t ain[2] = { { tNAryClass, 0 }, { sym_reduce, 0 } }; \
40
+ ndfunc_arg_out_t aout[1] = { { tRtNAryClass, 0 } }; \
41
+ ndfunc_t ndf = { \
42
+ iter_##tDType##_mean, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
43
+ }; \
44
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, iter_##tDType##_mean_nan); \
45
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
46
+ \
47
+ return rb_funcall(v, rb_intern("extract"), 0); \
48
+ }
49
+
50
+ #define DEF_NARRAY_INT_MEAN_METHOD_FUNC(tDType, tNAryClass) \
51
+ static void iter_##tDType##_mean(na_loop_t* const lp) { \
52
+ size_t n; \
53
+ char* p1; \
54
+ char* p2; \
55
+ ssize_t s1; \
56
+ \
57
+ INIT_COUNTER(lp, n); \
58
+ INIT_PTR(lp, 0, p1, s1); \
59
+ p2 = NDL_PTR(lp, 1); \
60
+ \
61
+ *(double*)p2 = f_mean(n, p1, s1); \
62
+ } \
63
+ \
64
+ static VALUE tDType##_mean(int argc, VALUE* argv, VALUE self) { \
65
+ ndfunc_arg_in_t ain[2] = { { tNAryClass, 0 }, { sym_reduce, 0 } }; \
66
+ ndfunc_arg_out_t aout[1] = { { numo_cDFloat, 0 } }; \
67
+ ndfunc_t ndf = { \
68
+ iter_##tDType##_mean, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
69
+ }; \
70
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0); \
71
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
72
+ \
73
+ return rb_funcall(v, rb_intern("extract"), 0); \
74
+ }
75
+
76
+ #define DEF_NARRAY_BIT_MEAN_METHOD_FUNC() \
77
+ static void iter_bit_mean(na_loop_t* const lp) { \
78
+ size_t n; \
79
+ BIT_DIGIT* p1; \
80
+ size_t ps1; \
81
+ ssize_t s1; \
82
+ size_t* idx1; \
83
+ char* p2; \
84
+ \
85
+ INIT_COUNTER(lp, n); \
86
+ INIT_PTR_BIT_IDX(lp, 0, p1, ps1, s1, idx1); \
87
+ p2 = NDL_PTR(lp, 1); \
88
+ \
89
+ *(double*)p2 = f_mean(n, p1, ps1, s1, idx1); \
90
+ } \
91
+ \
92
+ static VALUE bit_mean(int argc, VALUE* argv, VALUE self) { \
93
+ ndfunc_arg_in_t ain[2] = { { numo_cBit, 0 }, { sym_reduce, 0 } }; \
94
+ ndfunc_arg_out_t aout[1] = { { numo_cDFloat, 0 } }; \
95
+ ndfunc_t ndf = { iter_bit_mean, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout }; \
96
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0); \
97
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
98
+ \
99
+ return rb_funcall(v, rb_intern("extract"), 0); \
100
+ }
101
+
102
+ #endif // NUMO_NARRAY_MH_MEAN_H
@@ -0,0 +1,102 @@
1
+ /*
2
+ rms.h
3
+ Numo::NArray Alternative
4
+
5
+ created on: 2025-10-15
6
+ Copyright (C) 2025 Atsushi Tatsuma
7
+ */
8
+ #ifndef NUMO_NARRAY_MH_RMS_H
9
+ #define NUMO_NARRAY_MH_RMS_H 1
10
+
11
+ #define DEF_NARRAY_FLT_RMS_METHOD_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass) \
12
+ static void iter_##tDType##_rms(na_loop_t* const lp) { \
13
+ size_t n; \
14
+ char* p1; \
15
+ char* p2; \
16
+ ssize_t s1; \
17
+ \
18
+ INIT_COUNTER(lp, n); \
19
+ INIT_PTR(lp, 0, p1, s1); \
20
+ p2 = NDL_PTR(lp, 1); \
21
+ \
22
+ *(tRtDType*)p2 = f_rms(n, p1, s1); \
23
+ } \
24
+ \
25
+ static void iter_##tDType##_rms_nan(na_loop_t* const lp) { \
26
+ size_t n; \
27
+ char* p1; \
28
+ char* p2; \
29
+ ssize_t s1; \
30
+ \
31
+ INIT_COUNTER(lp, n); \
32
+ INIT_PTR(lp, 0, p1, s1); \
33
+ p2 = NDL_PTR(lp, 1); \
34
+ \
35
+ *(tRtDType*)p2 = f_rms_nan(n, p1, s1); \
36
+ } \
37
+ \
38
+ static VALUE tDType##_rms(int argc, VALUE* argv, VALUE self) { \
39
+ ndfunc_arg_in_t ain[2] = { { tNAryClass, 0 }, { sym_reduce, 0 } }; \
40
+ ndfunc_arg_out_t aout[1] = { { tRtNAryClass, 0 } }; \
41
+ ndfunc_t ndf = { \
42
+ iter_##tDType##_rms, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
43
+ }; \
44
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, iter_##tDType##_rms_nan); \
45
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
46
+ \
47
+ return rb_funcall(v, rb_intern("extract"), 0); \
48
+ }
49
+
50
+ #define DEF_NARRAY_INT_RMS_METHOD_FUNC(tDType, tNAryClass) \
51
+ static void iter_##tDType##_rms(na_loop_t* const lp) { \
52
+ size_t n; \
53
+ char* p1; \
54
+ char* p2; \
55
+ ssize_t s1; \
56
+ \
57
+ INIT_COUNTER(lp, n); \
58
+ INIT_PTR(lp, 0, p1, s1); \
59
+ p2 = NDL_PTR(lp, 1); \
60
+ \
61
+ *(double*)p2 = f_rms(n, p1, s1); \
62
+ } \
63
+ \
64
+ static VALUE tDType##_rms(int argc, VALUE* argv, VALUE self) { \
65
+ ndfunc_arg_in_t ain[2] = { { tNAryClass, 0 }, { sym_reduce, 0 } }; \
66
+ ndfunc_arg_out_t aout[1] = { { numo_cDFloat, 0 } }; \
67
+ ndfunc_t ndf = { \
68
+ iter_##tDType##_rms, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
69
+ }; \
70
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0); \
71
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
72
+ \
73
+ return rb_funcall(v, rb_intern("extract"), 0); \
74
+ }
75
+
76
+ #define DEF_NARRAY_BIT_RMS_METHOD_FUNC() \
77
+ static void iter_bit_rms(na_loop_t* const lp) { \
78
+ size_t n; \
79
+ BIT_DIGIT* p1; \
80
+ size_t ps1; \
81
+ ssize_t s1; \
82
+ size_t* idx1; \
83
+ char* p2; \
84
+ \
85
+ INIT_COUNTER(lp, n); \
86
+ INIT_PTR_BIT_IDX(lp, 0, p1, ps1, s1, idx1); \
87
+ p2 = NDL_PTR(lp, 1); \
88
+ \
89
+ *(double*)p2 = f_rms(n, p1, ps1, s1, idx1); \
90
+ } \
91
+ \
92
+ static VALUE bit_rms(int argc, VALUE* argv, VALUE self) { \
93
+ ndfunc_arg_in_t ain[2] = { { numo_cBit, 0 }, { sym_reduce, 0 } }; \
94
+ ndfunc_arg_out_t aout[1] = { { numo_cDFloat, 0 } }; \
95
+ ndfunc_t ndf = { iter_bit_rms, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout }; \
96
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0); \
97
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
98
+ \
99
+ return rb_funcall(v, rb_intern("extract"), 0); \
100
+ }
101
+
102
+ #endif // NUMO_NARRAY_MH_RMS_H