numo-narray-alt 0.9.4 → 0.9.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -3
  3. data/Rakefile +8 -0
  4. data/ext/numo/narray/SFMT-params19937.h +16 -12
  5. data/ext/numo/narray/SFMT.c +12 -5
  6. data/ext/numo/narray/array.c +25 -19
  7. data/ext/numo/narray/data.c +74 -70
  8. data/ext/numo/narray/extconf.rb +1 -0
  9. data/ext/numo/narray/index.c +49 -26
  10. data/ext/numo/narray/kwargs.c +11 -9
  11. data/ext/numo/narray/math.c +4 -2
  12. data/ext/numo/narray/narray.c +17 -10
  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/complex.h +7 -3
  19. data/ext/numo/narray/numo/types/complex_macro.h +27 -25
  20. data/ext/numo/narray/numo/types/float_macro.h +20 -17
  21. data/ext/numo/narray/numo/types/real_accum.h +22 -22
  22. data/ext/numo/narray/numo/types/robj_macro.h +19 -12
  23. data/ext/numo/narray/numo/types/xint_macro.h +9 -8
  24. data/ext/numo/narray/src/t_bit.c +97 -88
  25. data/ext/numo/narray/src/t_dcomplex.c +336 -307
  26. data/ext/numo/narray/src/t_dfloat.c +522 -456
  27. data/ext/numo/narray/src/t_int16.c +351 -308
  28. data/ext/numo/narray/src/t_int32.c +351 -308
  29. data/ext/numo/narray/src/t_int64.c +351 -308
  30. data/ext/numo/narray/src/t_int8.c +309 -288
  31. data/ext/numo/narray/src/t_mean.c +105 -0
  32. data/ext/numo/narray/src/t_robject.c +323 -296
  33. data/ext/numo/narray/src/t_scomplex.c +327 -302
  34. data/ext/numo/narray/src/t_sfloat.c +515 -451
  35. data/ext/numo/narray/src/t_uint16.c +351 -308
  36. data/ext/numo/narray/src/t_uint32.c +351 -308
  37. data/ext/numo/narray/src/t_uint64.c +351 -308
  38. data/ext/numo/narray/src/t_uint8.c +311 -288
  39. data/ext/numo/narray/step.c +7 -2
  40. data/ext/numo/narray/struct.c +24 -22
  41. data/lib/numo/narray/extra.rb +66 -25
  42. data/numo-narray-alt.gemspec +38 -0
  43. metadata +7 -1
@@ -0,0 +1,105 @@
1
+ /*
2
+ t_mean.c
3
+ Numo::NArray Alternative
4
+
5
+ created on: 2025-10-08
6
+ Copyright (C) 2025 Atsushi Tatsuma
7
+ */
8
+ #include <ruby.h>
9
+
10
+ #include "numo/narray.h"
11
+ #include "numo/template.h"
12
+
13
+ // Type aliases for shorter notation following the codebase naming convention.
14
+ typedef BIT_DIGIT bit;
15
+ typedef int8_t int8;
16
+ typedef int16_t int16;
17
+ typedef int32_t int32;
18
+ typedef int64_t int64;
19
+ typedef u_int8_t uint8;
20
+ typedef u_int16_t uint16;
21
+ typedef u_int32_t uint32;
22
+ typedef u_int64_t uint64;
23
+
24
+ #define DEF_INT_MEAN_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass) \
25
+ static void iter_##tDType##_mean(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
+ size_t count = 0; \
36
+ tRtDType sum = 0; \
37
+ for (size_t i = n; i--;) { \
38
+ sum += (tRtDType)(*(tDType*)p1); \
39
+ p1 += s1; \
40
+ count++; \
41
+ } \
42
+ \
43
+ *(tRtDType*)p2 = sum / (tRtDType)count; \
44
+ } \
45
+ \
46
+ static void iter_##tDType##_mean_nan(na_loop_t* const lp) { \
47
+ size_t n; \
48
+ char* p1; \
49
+ char* p2; \
50
+ ssize_t s1; \
51
+ \
52
+ INIT_COUNTER(lp, n); \
53
+ INIT_PTR(lp, 0, p1, s1); \
54
+ p2 = NDL_PTR(lp, 1); \
55
+ \
56
+ size_t count = 0; \
57
+ tRtDType tmp = 0; \
58
+ tRtDType sum = 0; \
59
+ for (size_t i = n; i--;) { \
60
+ tmp = (tRtDType)(*(tDType*)p1); \
61
+ p1 += s1; \
62
+ if (tmp == tmp) { \
63
+ sum += tmp; \
64
+ count++; \
65
+ } \
66
+ } \
67
+ \
68
+ *(tRtDType*)p2 = sum / (tRtDType)count; \
69
+ } \
70
+ \
71
+ static VALUE tDType##_mean(int argc, VALUE* argv, VALUE self) { \
72
+ ndfunc_arg_in_t ain[2] = { { tNAryClass, 0 }, { sym_reduce, 0 } }; \
73
+ ndfunc_arg_out_t aout[1] = { { tRtNAryClass, 0 } }; \
74
+ ndfunc_t ndf = { \
75
+ iter_##tDType##_mean, STRIDE_LOOP_NIP | NDF_FLAT_REDUCE, 2, 1, ain, aout \
76
+ }; \
77
+ VALUE reduce = na_reduce_dimension(argc, argv, 1, &self, &ndf, iter_##tDType##_mean_nan); \
78
+ VALUE v = na_ndloop(&ndf, 2, self, reduce); \
79
+ \
80
+ return rb_funcall(v, rb_intern("extract"), 0); \
81
+ }
82
+
83
+ DEF_INT_MEAN_FUNC(bit, double, numo_cBit, numo_cDFloat)
84
+ DEF_INT_MEAN_FUNC(int8, double, numo_cInt8, numo_cDFloat)
85
+ DEF_INT_MEAN_FUNC(int16, double, numo_cInt16, numo_cDFloat)
86
+ DEF_INT_MEAN_FUNC(int32, double, numo_cInt32, numo_cDFloat)
87
+ DEF_INT_MEAN_FUNC(int64, double, numo_cInt64, numo_cDFloat)
88
+ DEF_INT_MEAN_FUNC(uint8, double, numo_cUInt8, numo_cDFloat)
89
+ DEF_INT_MEAN_FUNC(uint16, double, numo_cUInt16, numo_cDFloat)
90
+ DEF_INT_MEAN_FUNC(uint32, double, numo_cUInt32, numo_cDFloat)
91
+ DEF_INT_MEAN_FUNC(uint64, double, numo_cUInt64, numo_cDFloat)
92
+
93
+ #undef DEF_INT_MEAN_FUNC
94
+
95
+ void Init_nary_mean(void) {
96
+ rb_define_method(numo_cBit, "mean", bit_mean, -1);
97
+ rb_define_method(numo_cInt8, "mean", int8_mean, -1);
98
+ rb_define_method(numo_cInt16, "mean", int16_mean, -1);
99
+ rb_define_method(numo_cInt32, "mean", int32_mean, -1);
100
+ rb_define_method(numo_cInt64, "mean", int64_mean, -1);
101
+ rb_define_method(numo_cUInt8, "mean", uint8_mean, -1);
102
+ rb_define_method(numo_cUInt16, "mean", uint16_mean, -1);
103
+ rb_define_method(numo_cUInt32, "mean", uint32_mean, -1);
104
+ rb_define_method(numo_cUInt64, "mean", uint64_mean, -1);
105
+ }