numo-narray-alt 0.9.4 → 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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +22 -3
  4. data/Rakefile +8 -0
  5. data/ext/numo/narray/SFMT-params19937.h +16 -12
  6. data/ext/numo/narray/SFMT.c +12 -5
  7. data/ext/numo/narray/array.c +51 -21
  8. data/ext/numo/narray/data.c +88 -86
  9. data/ext/numo/narray/index.c +51 -28
  10. data/ext/numo/narray/kwargs.c +11 -9
  11. data/ext/numo/narray/math.c +14 -6
  12. data/ext/numo/narray/narray.c +93 -58
  13. data/ext/numo/narray/ndloop.c +52 -63
  14. data/ext/numo/narray/numo/intern.h +9 -3
  15. data/ext/numo/narray/numo/narray.h +20 -20
  16. data/ext/numo/narray/numo/ndloop.h +1 -1
  17. data/ext/numo/narray/numo/template.h +85 -81
  18. data/ext/numo/narray/numo/types/bit.h +76 -0
  19. data/ext/numo/narray/numo/types/complex.h +7 -3
  20. data/ext/numo/narray/numo/types/complex_macro.h +28 -25
  21. data/ext/numo/narray/numo/types/float_macro.h +21 -17
  22. data/ext/numo/narray/numo/types/real_accum.h +22 -22
  23. data/ext/numo/narray/numo/types/robj_macro.h +20 -12
  24. data/ext/numo/narray/numo/types/xint_macro.h +51 -8
  25. data/ext/numo/narray/rand.c +7 -0
  26. data/ext/numo/narray/src/mh/mean.h +102 -0
  27. data/ext/numo/narray/src/mh/rms.h +102 -0
  28. data/ext/numo/narray/src/mh/stddev.h +103 -0
  29. data/ext/numo/narray/src/mh/var.h +102 -0
  30. data/ext/numo/narray/src/t_bit.c +206 -147
  31. data/ext/numo/narray/src/t_dcomplex.c +531 -641
  32. data/ext/numo/narray/src/t_dfloat.c +1341 -1421
  33. data/ext/numo/narray/src/t_int16.c +562 -468
  34. data/ext/numo/narray/src/t_int32.c +562 -468
  35. data/ext/numo/narray/src/t_int64.c +561 -467
  36. data/ext/numo/narray/src/t_int8.c +520 -448
  37. data/ext/numo/narray/src/t_robject.c +519 -619
  38. data/ext/numo/narray/src/t_scomplex.c +524 -659
  39. data/ext/numo/narray/src/t_sfloat.c +1332 -1410
  40. data/ext/numo/narray/src/t_uint16.c +562 -468
  41. data/ext/numo/narray/src/t_uint32.c +562 -468
  42. data/ext/numo/narray/src/t_uint64.c +562 -468
  43. data/ext/numo/narray/src/t_uint8.c +522 -448
  44. data/ext/numo/narray/step.c +7 -2
  45. data/ext/numo/narray/struct.c +31 -24
  46. data/lib/numo/narray/extra.rb +74 -30
  47. data/numo-narray-alt.gemspec +38 -0
  48. metadata +10 -1
@@ -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,16 @@
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) ((qsort_cast(a) == qsort_cast(b)) ? 0 : (qsort_cast(a) > qsort_cast(b)) ? 1 : -1)
56
+ #define cmp(a, b) \
57
+ ((qsort_cast(a) == qsort_cast(b)) ? 0 : (qsort_cast(a) > qsort_cast(b)) ? 1 : -1)
57
58
  #define cmpgt(a, b) (qsort_cast(a) > qsort_cast(b))
58
59
 
59
60
  static inline dtype f_min(size_t n, char* p, ssize_t stride) {
@@ -164,3 +165,45 @@ static inline dtype f_minimum(dtype x, dtype y) {
164
165
  }
165
166
  return y;
166
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
@@ -0,0 +1,103 @@
1
+ /*
2
+ stddev.h
3
+ Numo::NArray Alternative
4
+
5
+ created on: 2025-10-15
6
+ Copyright (C) 2025 Atsushi Tatsuma
7
+ */
8
+ #ifndef NUMO_NARRAY_MH_STDDEV_H
9
+ #define NUMO_NARRAY_MH_STDDEV_H 1
10
+
11
+ #define DEF_NARRAY_FLT_STDDEV_METHOD_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass) \
12
+ static void iter_##tDType##_stddev(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_stddev(n, p1, s1); \
23
+ } \
24
+ \
25
+ static void iter_##tDType##_stddev_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_stddev_nan(n, p1, s1); \
36
+ } \
37
+ \
38
+ static VALUE tDType##_stddev(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##_stddev, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
43
+ }; \
44
+ VALUE reduce = \
45
+ na_reduce_dimension(argc, argv, 1, &self, &ndf, iter_##tDType##_stddev_nan); \
46
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
47
+ \
48
+ return rb_funcall(v, rb_intern("extract"), 0); \
49
+ }
50
+
51
+ #define DEF_NARRAY_INT_STDDEV_METHOD_FUNC(tDType, tNAryClass) \
52
+ static void iter_##tDType##_stddev(na_loop_t* const lp) { \
53
+ size_t n; \
54
+ char* p1; \
55
+ char* p2; \
56
+ ssize_t s1; \
57
+ \
58
+ INIT_COUNTER(lp, n); \
59
+ INIT_PTR(lp, 0, p1, s1); \
60
+ p2 = NDL_PTR(lp, 1); \
61
+ \
62
+ *(double*)p2 = f_stddev(n, p1, s1); \
63
+ } \
64
+ \
65
+ static VALUE tDType##_stddev(int argc, VALUE* argv, VALUE self) { \
66
+ ndfunc_arg_in_t ain[2] = { { tNAryClass, 0 }, { sym_reduce, 0 } }; \
67
+ ndfunc_arg_out_t aout[1] = { { numo_cDFloat, 0 } }; \
68
+ ndfunc_t ndf = { \
69
+ iter_##tDType##_stddev, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
70
+ }; \
71
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0); \
72
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
73
+ \
74
+ return rb_funcall(v, rb_intern("extract"), 0); \
75
+ }
76
+
77
+ #define DEF_NARRAY_BIT_STDDEV_METHOD_FUNC() \
78
+ static void iter_bit_stddev(na_loop_t* const lp) { \
79
+ size_t n; \
80
+ BIT_DIGIT* p1; \
81
+ size_t ps1; \
82
+ ssize_t s1; \
83
+ size_t* idx1; \
84
+ char* p2; \
85
+ \
86
+ INIT_COUNTER(lp, n); \
87
+ INIT_PTR_BIT_IDX(lp, 0, p1, ps1, s1, idx1); \
88
+ p2 = NDL_PTR(lp, 1); \
89
+ \
90
+ *(double*)p2 = f_stddev(n, p1, ps1, s1, idx1); \
91
+ } \
92
+ \
93
+ static VALUE bit_stddev(int argc, VALUE* argv, VALUE self) { \
94
+ ndfunc_arg_in_t ain[2] = { { numo_cBit, 0 }, { sym_reduce, 0 } }; \
95
+ ndfunc_arg_out_t aout[1] = { { numo_cDFloat, 0 } }; \
96
+ ndfunc_t ndf = { iter_bit_stddev, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout }; \
97
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, 0); \
98
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
99
+ \
100
+ return rb_funcall(v, rb_intern("extract"), 0); \
101
+ }
102
+
103
+ #endif // NUMO_NARRAY_MH_STDDEV_H
@@ -0,0 +1,102 @@
1
+ /*
2
+ var.h
3
+ Numo::NArray Alternative
4
+
5
+ created on: 2025-10-15
6
+ Copyright (C) 2025 Atsushi Tatsuma
7
+ */
8
+ #ifndef NUMO_NARRAY_MH_VAR_H
9
+ #define NUMO_NARRAY_MH_VAR_H 1
10
+
11
+ #define DEF_NARRAY_FLT_VAR_METHOD_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass) \
12
+ static void iter_##tDType##_var(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_var(n, p1, s1); \
23
+ } \
24
+ \
25
+ static void iter_##tDType##_var_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_var_nan(n, p1, s1); \
36
+ } \
37
+ \
38
+ static VALUE tDType##_var(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##_var, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
43
+ }; \
44
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, iter_##tDType##_var_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_VAR_METHOD_FUNC(tDType, tNAryClass) \
51
+ static void iter_##tDType##_var(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_var(n, p1, s1); \
62
+ } \
63
+ \
64
+ static VALUE tDType##_var(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##_var, 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_VAR_METHOD_FUNC() \
77
+ static void iter_bit_var(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_var(n, p1, ps1, s1, idx1); \
90
+ } \
91
+ \
92
+ static VALUE bit_var(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_var, 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_VAR_H