carray 3.0.1 → 3.0.3

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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +824 -0
  3. data/README.md +5 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +258 -4
  6. data/ext/ca_axis_group.c +368 -184
  7. data/ext/ca_binop_dispatch.c +54 -32
  8. data/ext/ca_binop_dispatch.h +1 -0
  9. data/ext/ca_categorical_iterator.c +90 -41
  10. data/ext/ca_compare.c +8 -2
  11. data/ext/ca_for_buffer.h +21 -68
  12. data/ext/ca_group_iter.c +27 -11
  13. data/ext/ca_kernel_iterator.c +960 -245
  14. data/ext/ca_kernel_iterator.h +352 -181
  15. data/ext/ca_monop_dispatch.c +4 -4
  16. data/ext/ca_monop_dispatch.h +4 -0
  17. data/ext/ca_obj_array.c +194 -42
  18. data/ext/ca_obj_bincmp.c +152 -121
  19. data/ext/ca_obj_binop.c +107 -210
  20. data/ext/ca_obj_bitarray.c +37 -24
  21. data/ext/ca_obj_bitfield.c +95 -62
  22. data/ext/ca_obj_block.c +5 -4
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +180 -50
  25. data/ext/ca_obj_face.c +428 -62
  26. data/ext/ca_obj_face.h +107 -47
  27. data/ext/ca_obj_fake.c +21 -50
  28. data/ext/ca_obj_farray.c +1 -0
  29. data/ext/ca_obj_field.c +16 -3
  30. data/ext/ca_obj_fixlen_string.c +39 -26
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +235 -55
  33. data/ext/ca_obj_moncmp.c +61 -61
  34. data/ext/ca_obj_monop.c +125 -107
  35. data/ext/ca_obj_object.c +551 -233
  36. data/ext/ca_obj_record.c +51 -16
  37. data/ext/ca_obj_reduce.c +5 -8
  38. data/ext/ca_obj_refer.c +117 -33
  39. data/ext/ca_obj_remap.c +57 -17
  40. data/ext/ca_obj_repeat.c +21 -5
  41. data/ext/ca_obj_roll.c +115 -11
  42. data/ext/ca_obj_select.c +88 -75
  43. data/ext/ca_obj_select_axis.c +58 -60
  44. data/ext/ca_obj_shift.c +22 -102
  45. data/ext/ca_obj_stack.c +223 -123
  46. data/ext/ca_obj_stride.c +267 -35
  47. data/ext/ca_obj_string.c +25 -22
  48. data/ext/ca_obj_tile.c +32 -16
  49. data/ext/ca_obj_time.c +23 -25
  50. data/ext/ca_obj_timedelta.c +21 -23
  51. data/ext/ca_obj_transpose.c +12 -3
  52. data/ext/ca_obj_triop.c +110 -117
  53. data/ext/ca_obj_window.c +157 -29
  54. data/ext/ca_op_ipower.c +25 -13
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_rng_normal.h +42 -0
  58. data/ext/ca_rng_xoshiro256pp.h +105 -0
  59. data/ext/ca_sort_kernels.h +70 -0
  60. data/ext/ca_sweep_engine.c +385 -198
  61. data/ext/ca_sweep_engine.h +31 -23
  62. data/ext/ca_triop_dispatch.c +4 -1
  63. data/ext/ca_triop_dispatch.h +5 -2
  64. data/ext/caframe_csv_reader.c +463 -0
  65. data/ext/carray.h +90 -28
  66. data/ext/carray_access.c +487 -231
  67. data/ext/carray_address_basis.c +731 -0
  68. data/ext/carray_attribute.c +45 -3
  69. data/ext/carray_bincount.c +32 -2
  70. data/ext/carray_broadcast.c +49 -17
  71. data/ext/carray_call_cfunc.c +667 -511
  72. data/ext/carray_cast.c +1556 -247
  73. data/ext/carray_cast_func.rb +34 -21
  74. data/ext/carray_conversion.c +197 -73
  75. data/ext/carray_copy.c +84 -38
  76. data/ext/carray_core.c +591 -119
  77. data/ext/carray_count.c +148 -96
  78. data/ext/carray_element.c +18 -27
  79. data/ext/carray_factorize.c +604 -291
  80. data/ext/carray_generate.c +76 -40
  81. data/ext/carray_histogram.c +152 -94
  82. data/ext/carray_hold.c +2 -1
  83. data/ext/carray_index_classifier.c +63 -96
  84. data/ext/carray_internal.h +400 -1
  85. data/ext/carray_lazy.c +834 -79
  86. data/ext/carray_loop.c +88 -66
  87. data/ext/carray_mask.c +705 -324
  88. data/ext/carray_math_kernel.h +1 -0
  89. data/ext/carray_median_percentile.c +263 -63
  90. data/ext/carray_memory_view.c +254 -248
  91. data/ext/carray_operator.c +1093 -363
  92. data/ext/carray_order.c +133 -69
  93. data/ext/carray_partition.c +102 -56
  94. data/ext/carray_random.c +582 -204
  95. data/ext/carray_scatter.c +308 -65
  96. data/ext/carray_segment.c +257 -0
  97. data/ext/carray_slab.c +183 -70
  98. data/ext/carray_sort.c +235 -240
  99. data/ext/carray_sort_kernel.c +8 -1
  100. data/ext/carray_struct.c +99 -21
  101. data/ext/carray_test.c +167 -64
  102. data/ext/carray_time_text.c +1182 -0
  103. data/ext/carray_utils.c +363 -98
  104. data/ext/extconf.rb +27 -2
  105. data/ext/mk_call_cfunc.rb +103 -118
  106. data/ext/mk_pow5_table.rb +35 -0
  107. data/ext/mkkernel.rb +1349 -851
  108. data/ext/ruby_carray.c +17 -2
  109. data/ext/version.h +4 -4
  110. data/ext/version.rb +4 -2
  111. data/lib/carray/attribute.rb +39 -0
  112. data/lib/carray/autoload_carray.rb +24 -3
  113. data/lib/carray/autoload_method_extension.rb +18 -0
  114. data/lib/carray/axis_group.rb +245 -20
  115. data/lib/carray/basics.rb +95 -25
  116. data/lib/carray/bincount_nd.rb +6 -0
  117. data/lib/carray/block_iterator.rb +200 -54
  118. data/lib/carray/boolean_reduce.rb +21 -29
  119. data/lib/carray/categorical.rb +244 -59
  120. data/lib/carray/categorical_iterator.rb +391 -757
  121. data/lib/carray/complex.rb +36 -29
  122. data/lib/carray/conditional.rb +94 -7
  123. data/lib/carray/const_string.rb +177 -27
  124. data/lib/carray/construct.rb +40 -0
  125. data/lib/carray/data_type_extension.rb +3 -0
  126. data/lib/carray/data_type_limits.rb +91 -0
  127. data/lib/carray/fixlen_string.rb +1 -1
  128. data/lib/carray/frame/concat.rb +157 -6
  129. data/lib/carray/frame/convert.rb +13 -7
  130. data/lib/carray/frame/csv_parser.rb +590 -76
  131. data/lib/carray/frame/describe.rb +79 -0
  132. data/lib/carray/frame/frame.rb +205 -35
  133. data/lib/carray/frame/group.rb +199 -40
  134. data/lib/carray/frame/io.rb +452 -60
  135. data/lib/carray/frame/join.rb +134 -46
  136. data/lib/carray/frame/records.rb +54 -19
  137. data/lib/carray/frame/reshape.rb +448 -0
  138. data/lib/carray/frame/sort.rb +26 -2
  139. data/lib/carray/frame/verbs.rb +726 -56
  140. data/lib/carray/frame.rb +2 -0
  141. data/lib/carray/fuse_source.rb +111 -2
  142. data/lib/carray/fusion.rb +229 -38
  143. data/lib/carray/inspect.rb +71 -20
  144. data/lib/carray/iterator.rb +157 -2
  145. data/lib/carray/lazy.rb +54 -67
  146. data/lib/carray/mask_gap_fill.rb +66 -50
  147. data/lib/carray/math.rb +32 -19
  148. data/lib/carray/meld_reduce.rb +40 -7
  149. data/lib/carray/methods/align_addr.rb +8 -4
  150. data/lib/carray/methods/bincount.rb +2 -2
  151. data/lib/carray/methods/bit_string.rb +14 -3
  152. data/lib/carray/methods/composition.rb +16 -10
  153. data/lib/carray/methods/discovery_along.rb +74 -0
  154. data/lib/carray/methods/factorize.rb +50 -0
  155. data/lib/carray/methods/gather_nd.rb +13 -2
  156. data/lib/carray/methods/insert_block.rb +9 -14
  157. data/lib/carray/methods/is_in.rb +130 -6
  158. data/lib/carray/methods/join.rb +1 -1
  159. data/lib/carray/methods/locate_addr.rb +235 -21
  160. data/lib/carray/methods/mask_duplicates.rb +35 -1
  161. data/lib/carray/methods/mode.rb +18 -1
  162. data/lib/carray/methods/nunique.rb +22 -1
  163. data/lib/carray/methods/repeat.rb +91 -0
  164. data/lib/carray/methods/resize.rb +21 -23
  165. data/lib/carray/methods/snap.rb +34 -12
  166. data/lib/carray/methods/unique.rb +52 -3
  167. data/lib/carray/record_order.rb +208 -0
  168. data/lib/carray/rng.rb +86 -0
  169. data/lib/carray/runtime.rb +14 -11
  170. data/lib/carray/segment_iterator.rb +990 -0
  171. data/lib/carray/serialize.rb +197 -27
  172. data/lib/carray/slab_iterator.rb +109 -40
  173. data/lib/carray/stack.rb +10 -4
  174. data/lib/carray/string_operation_extension.rb +9 -4
  175. data/lib/carray/struct.rb +142 -51
  176. data/lib/carray/struct_builder.rb +110 -14
  177. data/lib/carray/table.rb +2 -2
  178. data/lib/carray/time.rb +535 -105
  179. data/lib/carray/window_iterator.rb +259 -82
  180. data/lib/carray.rb +4 -2
  181. data/yard-stubs/ca_obj_array.rb +4 -4
  182. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  183. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  184. data/yard-stubs/ca_obj_block.rb +2 -7
  185. data/yard-stubs/ca_obj_fake.rb +1 -1
  186. data/yard-stubs/ca_obj_field.rb +1 -1
  187. data/yard-stubs/ca_obj_refer.rb +3 -3
  188. data/yard-stubs/ca_obj_roll.rb +0 -1
  189. data/yard-stubs/ca_obj_stride.rb +10 -7
  190. data/yard-stubs/ca_obj_transpose.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +11 -4
  192. data/yard-stubs/carray_access.rb +6 -5
  193. data/yard-stubs/carray_broadcast.rb +2 -2
  194. data/yard-stubs/carray_cast.rb +78 -43
  195. data/yard-stubs/carray_conversion.rb +13 -1
  196. data/yard-stubs/carray_copy.rb +8 -3
  197. data/yard-stubs/carray_core.rb +3 -83
  198. data/yard-stubs/carray_count.rb +16 -2
  199. data/yard-stubs/carray_lazy.rb +210 -1
  200. data/yard-stubs/carray_loop.rb +4 -1
  201. data/yard-stubs/carray_mask.rb +34 -10
  202. data/yard-stubs/carray_math.rb +1499 -4
  203. data/yard-stubs/carray_median_percentile.rb +26 -8
  204. data/yard-stubs/carray_order.rb +43 -82
  205. data/yard-stubs/carray_scatter.rb +10 -3
  206. data/yard-stubs/carray_segment.rb +72 -0
  207. data/yard-stubs/carray_slab.rb +11 -8
  208. data/yard-stubs/carray_sort.rb +50 -8
  209. data/yard-stubs/carray_test.rb +10 -0
  210. data/yard-stubs/carray_utils.rb +0 -26
  211. metadata +19 -19
  212. data/ext/ca_for_each_element.h +0 -239
  213. data/ext/carray_build_flags.h +0 -3
  214. data/ext/carray_config.h +0 -28
  215. data/ext/carray_kernels_bincmp.c +0 -4446
  216. data/ext/carray_kernels_binop.c +0 -11001
  217. data/ext/carray_kernels_init.c +0 -1131
  218. data/ext/carray_kernels_map.c +0 -3467
  219. data/ext/carray_kernels_moncmp.c +0 -2097
  220. data/ext/carray_kernels_monop.c +0 -18313
  221. data/ext/carray_kernels_reduce_aggregate.c +0 -25837
  222. data/ext/carray_kernels_reduce_boolean.c +0 -330
  223. data/ext/carray_kernels_reduce_cumulative.c +0 -14593
  224. data/ext/carray_kernels_reduce_extreme.c +0 -16948
  225. data/ext/carray_kernels_reduce_variance.c +0 -3910
  226. data/ext/carray_kernels_scan.c +0 -3693
  227. data/ext/carray_kernels_search.c +0 -32138
  228. data/ext/carray_kernels_sort.c +0 -10626
  229. data/ext/carray_kernels_triop.c +0 -1392
@@ -1,330 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- carray_kernels.c -- GENERATED by ext/mkkernel.rb -- DO NOT EDIT
4
-
5
- Kernel definitions live in mkkernel.rb (search for `MkKernel.reduce`).
6
- Regenerate by running:
7
-
8
- cd ext && ruby mkkernel.rb > carray_kernels.c
9
-
10
- extconf.rb regenerates automatically when mkkernel.rb is touched.
11
-
12
- --------------------------------------------------------------------------- */
13
-
14
- #include "carray.h"
15
- #include "ca_kernel_iterator.h"
16
- #include "ca_sort_kernels.h" /* sort kernels: internal, not via the carray.h umbrella */
17
- #include "carray_internal.h" /* ca_lazy_arena_*, ca_is_lazy_view (streaming reduce) */
18
- #include "ca_obj_face.h" /* rb_ca_strip_face_value (Face ordering gate) */
19
- #include <math.h>
20
- #include <stdint.h>
21
- #include <stdlib.h> /* qsort, mergesort (HAVE_MERGESORT) -- for :sort kind */
22
-
23
- /* MEMO_REDUCTION_FASTPATH_ENTITY_ONLY_GUARD Tier 2: CAStack identity is
24
- probed by operation-table function pointer (obj_type is runtime-
25
- assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
- extern ca_operation_function_t ca_stack_func;
27
- /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
- for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
- return real true/false, not Integer 0/1. (BOOL2OBJ already exists
30
- but returns Integer per CArray's boolean-as-int convention.) */
31
- #ifndef CARRAY_BOOL2VAL_DEFINED
32
- #define CARRAY_BOOL2VAL_DEFINED
33
- static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
34
- #endif
35
-
36
- #include "ca_op_powi.h"
37
- #include "ca_op_cmplx64.h"
38
-
39
- /* ===== all_ki ============================================ */
40
-
41
- static VALUE
42
- all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
43
- {
44
- /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
45
- /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
46
- if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
47
- ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
48
- ca_size_t __inner = 1;
49
- int __k;
50
- for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
51
- ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
52
- ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
53
- if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
54
- ca_size_t __chunk_elems = __rows * __inner;
55
- ca_size_t __outer = ca->dim[0];
56
- ca_size_t __starts[CA_RANK_MAX] = {0};
57
- ca_size_t __counts[CA_RANK_MAX];
58
- ca_size_t __strides[CA_RANK_MAX];
59
- ca_size_t __s = sizeof(boolean8_t);
60
- for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
61
- __strides[__k] = __s;
62
- __s *= ca->dim[__k];
63
- }
64
- for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
65
- ca_size_t __outer_off = 0;
66
- boolean8_t acc;
67
- acc = (1);
68
- ca_lazy_arena_enter();
69
- boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
70
- while ( __outer_off < __outer ) {
71
- ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
72
- ca_size_t __n = __r * __inner;
73
- __starts[0] = __outer_off;
74
- __counts[0] = __r;
75
- ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
76
- ca_size_t __i;
77
- for ( __i = 0; __i < __n; __i++ ) {
78
- boolean8_t v = __chunk[__i];
79
- acc &= v;
80
- }
81
- __outer_off += __r;
82
- }
83
- ca_lazy_arena_release(__chunk);
84
- ca_lazy_arena_exit();
85
- return BOOL2VAL((boolean8_t) (acc));
86
- }
87
- VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
88
- CArray *co;
89
- GetCArray(vout, co);
90
- boolean8_t *op = (boolean8_t *) co->ptr;
91
- ca_iter_state st;
92
- int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
93
- slab_axes, naxes, 0);
94
- if ( rc != CA_ITER_OK ) {
95
- rb_raise(rb_eRuntimeError,
96
- "all_ki: kernel_iterator init failed rc=%d", rc);
97
- }
98
- char *p;
99
- boolean8_t *m;
100
- ca_size_t out_i = 0;
101
- while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
102
- boolean8_t acc;
103
- CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 1, acc &= v);
104
- op[out_i++] = (boolean8_t) (acc);
105
- }
106
- ca_iter_state_finish(&st);
107
- if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
108
- return vout;
109
- }
110
-
111
- VALUE
112
- rb_ca_all_ki (int argc, VALUE *argv, VALUE self)
113
- {
114
- CArray *src;
115
- GetCArray(self, src);
116
- volatile VALUE ropt = rb_pop_options(&argc, &argv);
117
- volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
118
- rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
119
- int keep_axis = RTEST(rkeep_axis);
120
- int8_t slab_axes[CA_RANK_MAX];
121
- int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
122
- if ( argc > 0 ) {
123
- rb_raise(rb_eArgError, "all_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.all(axis: 0) or a.all(axis: [0, 1])", argc);
124
- }
125
- switch ( src->data_type ) {
126
- case CA_BOOLEAN: return all_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
127
- default:
128
- rb_raise(rb_eCADataTypeError, "all_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
129
- }
130
- return Qnil; /* unreachable */
131
- }
132
-
133
- /* ===== any_ki ============================================ */
134
-
135
- static VALUE
136
- any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
137
- {
138
- /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
139
- /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
140
- if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
141
- ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
142
- ca_size_t __inner = 1;
143
- int __k;
144
- for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
145
- ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
146
- ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
147
- if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
148
- ca_size_t __chunk_elems = __rows * __inner;
149
- ca_size_t __outer = ca->dim[0];
150
- ca_size_t __starts[CA_RANK_MAX] = {0};
151
- ca_size_t __counts[CA_RANK_MAX];
152
- ca_size_t __strides[CA_RANK_MAX];
153
- ca_size_t __s = sizeof(boolean8_t);
154
- for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
155
- __strides[__k] = __s;
156
- __s *= ca->dim[__k];
157
- }
158
- for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
159
- ca_size_t __outer_off = 0;
160
- boolean8_t acc;
161
- acc = (0);
162
- ca_lazy_arena_enter();
163
- boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
164
- while ( __outer_off < __outer ) {
165
- ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
166
- ca_size_t __n = __r * __inner;
167
- __starts[0] = __outer_off;
168
- __counts[0] = __r;
169
- ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
170
- ca_size_t __i;
171
- for ( __i = 0; __i < __n; __i++ ) {
172
- boolean8_t v = __chunk[__i];
173
- acc |= v;
174
- }
175
- __outer_off += __r;
176
- }
177
- ca_lazy_arena_release(__chunk);
178
- ca_lazy_arena_exit();
179
- return BOOL2VAL((boolean8_t) (acc));
180
- }
181
- VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
182
- CArray *co;
183
- GetCArray(vout, co);
184
- boolean8_t *op = (boolean8_t *) co->ptr;
185
- ca_iter_state st;
186
- int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
187
- slab_axes, naxes, 0);
188
- if ( rc != CA_ITER_OK ) {
189
- rb_raise(rb_eRuntimeError,
190
- "any_ki: kernel_iterator init failed rc=%d", rc);
191
- }
192
- char *p;
193
- boolean8_t *m;
194
- ca_size_t out_i = 0;
195
- while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
196
- boolean8_t acc;
197
- CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 0, acc |= v);
198
- op[out_i++] = (boolean8_t) (acc);
199
- }
200
- ca_iter_state_finish(&st);
201
- if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
202
- return vout;
203
- }
204
-
205
- VALUE
206
- rb_ca_any_ki (int argc, VALUE *argv, VALUE self)
207
- {
208
- CArray *src;
209
- GetCArray(self, src);
210
- volatile VALUE ropt = rb_pop_options(&argc, &argv);
211
- volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
212
- rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
213
- int keep_axis = RTEST(rkeep_axis);
214
- int8_t slab_axes[CA_RANK_MAX];
215
- int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
216
- if ( argc > 0 ) {
217
- rb_raise(rb_eArgError, "any_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.any(axis: 0) or a.any(axis: [0, 1])", argc);
218
- }
219
- switch ( src->data_type ) {
220
- case CA_BOOLEAN: return any_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
221
- default:
222
- rb_raise(rb_eCADataTypeError, "any_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
223
- }
224
- return Qnil; /* unreachable */
225
- }
226
-
227
- /* ===== none_ki ============================================ */
228
-
229
- static VALUE
230
- none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
231
- {
232
- /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
233
- /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
234
- if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
235
- ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
236
- ca_size_t __inner = 1;
237
- int __k;
238
- for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
239
- ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
240
- ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
241
- if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
242
- ca_size_t __chunk_elems = __rows * __inner;
243
- ca_size_t __outer = ca->dim[0];
244
- ca_size_t __starts[CA_RANK_MAX] = {0};
245
- ca_size_t __counts[CA_RANK_MAX];
246
- ca_size_t __strides[CA_RANK_MAX];
247
- ca_size_t __s = sizeof(boolean8_t);
248
- for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
249
- __strides[__k] = __s;
250
- __s *= ca->dim[__k];
251
- }
252
- for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
253
- ca_size_t __outer_off = 0;
254
- boolean8_t acc;
255
- acc = (1);
256
- ca_lazy_arena_enter();
257
- boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
258
- while ( __outer_off < __outer ) {
259
- ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
260
- ca_size_t __n = __r * __inner;
261
- __starts[0] = __outer_off;
262
- __counts[0] = __r;
263
- ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
264
- ca_size_t __i;
265
- for ( __i = 0; __i < __n; __i++ ) {
266
- boolean8_t v = __chunk[__i];
267
- acc &= !v;
268
- }
269
- __outer_off += __r;
270
- }
271
- ca_lazy_arena_release(__chunk);
272
- ca_lazy_arena_exit();
273
- return BOOL2VAL((boolean8_t) (acc));
274
- }
275
- VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
276
- CArray *co;
277
- GetCArray(vout, co);
278
- boolean8_t *op = (boolean8_t *) co->ptr;
279
- ca_iter_state st;
280
- int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
281
- slab_axes, naxes, 0);
282
- if ( rc != CA_ITER_OK ) {
283
- rb_raise(rb_eRuntimeError,
284
- "none_ki: kernel_iterator init failed rc=%d", rc);
285
- }
286
- char *p;
287
- boolean8_t *m;
288
- ca_size_t out_i = 0;
289
- while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
290
- boolean8_t acc;
291
- CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 1, acc &= !v);
292
- op[out_i++] = (boolean8_t) (acc);
293
- }
294
- ca_iter_state_finish(&st);
295
- if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
296
- return vout;
297
- }
298
-
299
- VALUE
300
- rb_ca_none_ki (int argc, VALUE *argv, VALUE self)
301
- {
302
- CArray *src;
303
- GetCArray(self, src);
304
- volatile VALUE ropt = rb_pop_options(&argc, &argv);
305
- volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
306
- rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
307
- int keep_axis = RTEST(rkeep_axis);
308
- int8_t slab_axes[CA_RANK_MAX];
309
- int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
310
- if ( argc > 0 ) {
311
- rb_raise(rb_eArgError, "none_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.none(axis: 0) or a.none(axis: [0, 1])", argc);
312
- }
313
- switch ( src->data_type ) {
314
- case CA_BOOLEAN: return none_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
315
- default:
316
- rb_raise(rb_eCADataTypeError, "none_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
317
- }
318
- return Qnil; /* unreachable */
319
- }
320
-
321
- void
322
- Init_carray_kernels_reduce_boolean (void)
323
- {
324
- /* Phase E rewire: legacy 'all' now dispatches via all_ki */
325
- rb_define_method(rb_cCArray, "all", rb_ca_all_ki, -1);
326
- /* Phase E rewire: legacy 'any' now dispatches via any_ki */
327
- rb_define_method(rb_cCArray, "any", rb_ca_any_ki, -1);
328
- /* Phase E rewire: legacy 'none' now dispatches via none_ki */
329
- rb_define_method(rb_cCArray, "none", rb_ca_none_ki, -1);
330
- }