carray 3.0.2 → 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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +304 -0
  3. data/README.md +3 -4
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +225 -0
  6. data/ext/ca_axis_group.c +177 -99
  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 +66 -71
  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 +663 -214
  14. data/ext/ca_kernel_iterator.h +231 -167
  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 +132 -22
  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 +1 -0
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +96 -25
  25. data/ext/ca_obj_face.c +406 -64
  26. data/ext/ca_obj_face.h +92 -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 +21 -21
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +189 -107
  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 +543 -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 +47 -49
  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 -118
  46. data/ext/ca_obj_stride.c +195 -34
  47. data/ext/ca_obj_string.c +17 -18
  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 +149 -27
  54. data/ext/ca_op_ipower.c +24 -11
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_sort_kernels.h +70 -0
  58. data/ext/ca_sweep_engine.c +102 -79
  59. data/ext/ca_sweep_engine.h +7 -20
  60. data/ext/ca_triop_dispatch.c +4 -1
  61. data/ext/ca_triop_dispatch.h +5 -2
  62. data/ext/caframe_csv_reader.c +463 -0
  63. data/ext/carray.h +70 -27
  64. data/ext/carray_access.c +455 -211
  65. data/ext/carray_address_basis.c +177 -36
  66. data/ext/carray_attribute.c +45 -3
  67. data/ext/carray_bincount.c +32 -2
  68. data/ext/carray_broadcast.c +46 -14
  69. data/ext/carray_call_cfunc.c +0 -28
  70. data/ext/carray_cast.c +1444 -209
  71. data/ext/carray_cast_func.rb +34 -21
  72. data/ext/carray_conversion.c +197 -73
  73. data/ext/carray_copy.c +32 -11
  74. data/ext/carray_core.c +514 -122
  75. data/ext/carray_count.c +140 -87
  76. data/ext/carray_element.c +18 -27
  77. data/ext/carray_factorize.c +569 -277
  78. data/ext/carray_generate.c +76 -40
  79. data/ext/carray_histogram.c +152 -94
  80. data/ext/carray_hold.c +2 -1
  81. data/ext/carray_index_classifier.c +63 -96
  82. data/ext/carray_internal.h +385 -3
  83. data/ext/carray_lazy.c +834 -79
  84. data/ext/carray_loop.c +81 -65
  85. data/ext/carray_mask.c +682 -316
  86. data/ext/carray_math_kernel.h +1 -0
  87. data/ext/carray_median_percentile.c +221 -76
  88. data/ext/carray_memory_view.c +254 -248
  89. data/ext/carray_operator.c +1089 -359
  90. data/ext/carray_order.c +133 -69
  91. data/ext/carray_partition.c +102 -56
  92. data/ext/carray_random.c +273 -239
  93. data/ext/carray_scatter.c +308 -65
  94. data/ext/carray_segment.c +257 -0
  95. data/ext/carray_slab.c +170 -70
  96. data/ext/carray_sort.c +215 -218
  97. data/ext/carray_sort_kernel.c +8 -1
  98. data/ext/carray_struct.c +99 -21
  99. data/ext/carray_test.c +167 -64
  100. data/ext/carray_time_text.c +1182 -0
  101. data/ext/carray_utils.c +363 -98
  102. data/ext/extconf.rb +27 -2
  103. data/ext/mk_call_cfunc.rb +0 -2
  104. data/ext/mk_pow5_table.rb +35 -0
  105. data/ext/mkkernel.rb +1076 -846
  106. data/ext/ruby_carray.c +7 -1
  107. data/ext/version.h +4 -4
  108. data/ext/version.rb +4 -2
  109. data/lib/carray/attribute.rb +39 -0
  110. data/lib/carray/autoload_carray.rb +19 -0
  111. data/lib/carray/autoload_method_extension.rb +6 -0
  112. data/lib/carray/axis_group.rb +174 -26
  113. data/lib/carray/basics.rb +91 -25
  114. data/lib/carray/bincount_nd.rb +6 -0
  115. data/lib/carray/block_iterator.rb +118 -48
  116. data/lib/carray/boolean_reduce.rb +21 -29
  117. data/lib/carray/categorical.rb +94 -26
  118. data/lib/carray/categorical_iterator.rb +333 -826
  119. data/lib/carray/complex.rb +36 -29
  120. data/lib/carray/conditional.rb +94 -7
  121. data/lib/carray/const_string.rb +46 -0
  122. data/lib/carray/frame/concat.rb +157 -6
  123. data/lib/carray/frame/convert.rb +13 -7
  124. data/lib/carray/frame/csv_parser.rb +589 -82
  125. data/lib/carray/frame/describe.rb +79 -0
  126. data/lib/carray/frame/frame.rb +124 -25
  127. data/lib/carray/frame/group.rb +189 -63
  128. data/lib/carray/frame/io.rb +412 -72
  129. data/lib/carray/frame/join.rb +134 -46
  130. data/lib/carray/frame/records.rb +37 -16
  131. data/lib/carray/frame/reshape.rb +448 -0
  132. data/lib/carray/frame/sort.rb +26 -2
  133. data/lib/carray/frame/verbs.rb +715 -48
  134. data/lib/carray/frame.rb +2 -0
  135. data/lib/carray/fuse_source.rb +111 -2
  136. data/lib/carray/fusion.rb +229 -38
  137. data/lib/carray/inspect.rb +29 -11
  138. data/lib/carray/iterator.rb +14 -2
  139. data/lib/carray/lazy.rb +54 -30
  140. data/lib/carray/mask_gap_fill.rb +66 -52
  141. data/lib/carray/math.rb +32 -19
  142. data/lib/carray/meld_reduce.rb +40 -7
  143. data/lib/carray/methods/align_addr.rb +8 -4
  144. data/lib/carray/methods/bincount.rb +2 -2
  145. data/lib/carray/methods/bit_string.rb +14 -3
  146. data/lib/carray/methods/composition.rb +16 -10
  147. data/lib/carray/methods/factorize.rb +2 -2
  148. data/lib/carray/methods/gather_nd.rb +13 -2
  149. data/lib/carray/methods/insert_block.rb +9 -14
  150. data/lib/carray/methods/is_in.rb +117 -4
  151. data/lib/carray/methods/join.rb +1 -1
  152. data/lib/carray/methods/locate_addr.rb +177 -36
  153. data/lib/carray/methods/mode.rb +18 -1
  154. data/lib/carray/methods/repeat.rb +1 -20
  155. data/lib/carray/methods/resize.rb +21 -23
  156. data/lib/carray/methods/snap.rb +34 -12
  157. data/lib/carray/methods/unique.rb +11 -2
  158. data/lib/carray/record_order.rb +208 -0
  159. data/lib/carray/runtime.rb +14 -11
  160. data/lib/carray/segment_iterator.rb +990 -0
  161. data/lib/carray/serialize.rb +197 -27
  162. data/lib/carray/slab_iterator.rb +51 -27
  163. data/lib/carray/stack.rb +10 -4
  164. data/lib/carray/string_operation_extension.rb +4 -3
  165. data/lib/carray/struct.rb +142 -51
  166. data/lib/carray/struct_builder.rb +110 -14
  167. data/lib/carray/table.rb +2 -2
  168. data/lib/carray/time.rb +517 -103
  169. data/lib/carray/window_iterator.rb +127 -72
  170. data/lib/carray.rb +2 -2
  171. data/yard-stubs/ca_obj_array.rb +4 -4
  172. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  173. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  174. data/yard-stubs/ca_obj_fake.rb +1 -1
  175. data/yard-stubs/ca_obj_field.rb +1 -1
  176. data/yard-stubs/ca_obj_refer.rb +3 -3
  177. data/yard-stubs/ca_obj_roll.rb +0 -1
  178. data/yard-stubs/ca_obj_stride.rb +10 -7
  179. data/yard-stubs/ca_obj_transpose.rb +1 -1
  180. data/yard-stubs/ca_obj_window.rb +1 -2
  181. data/yard-stubs/carray_access.rb +5 -4
  182. data/yard-stubs/carray_broadcast.rb +1 -1
  183. data/yard-stubs/carray_cast.rb +78 -43
  184. data/yard-stubs/carray_conversion.rb +13 -1
  185. data/yard-stubs/carray_copy.rb +8 -3
  186. data/yard-stubs/carray_core.rb +3 -3
  187. data/yard-stubs/carray_count.rb +9 -0
  188. data/yard-stubs/carray_lazy.rb +5 -1
  189. data/yard-stubs/carray_loop.rb +4 -1
  190. data/yard-stubs/carray_mask.rb +34 -10
  191. data/yard-stubs/carray_math.rb +25 -13
  192. data/yard-stubs/carray_median_percentile.rb +10 -6
  193. data/yard-stubs/carray_order.rb +34 -13
  194. data/yard-stubs/carray_scatter.rb +10 -3
  195. data/yard-stubs/carray_segment.rb +72 -0
  196. data/yard-stubs/carray_slab.rb +2 -1
  197. data/yard-stubs/carray_sort.rb +43 -3
  198. data/yard-stubs/carray_test.rb +10 -0
  199. data/yard-stubs/carray_utils.rb +0 -26
  200. metadata +11 -19
  201. data/ext/ca_for_each_element.h +0 -239
  202. data/ext/carray_build_flags.h +0 -3
  203. data/ext/carray_config.h +0 -28
  204. data/ext/carray_kernels_bincmp.c +0 -4446
  205. data/ext/carray_kernels_binop.c +0 -11001
  206. data/ext/carray_kernels_init.c +0 -1131
  207. data/ext/carray_kernels_map.c +0 -3467
  208. data/ext/carray_kernels_moncmp.c +0 -2097
  209. data/ext/carray_kernels_monop.c +0 -18313
  210. data/ext/carray_kernels_reduce_aggregate.c +0 -26005
  211. data/ext/carray_kernels_reduce_boolean.c +0 -330
  212. data/ext/carray_kernels_reduce_cumulative.c +0 -14862
  213. data/ext/carray_kernels_reduce_extreme.c +0 -17494
  214. data/ext/carray_kernels_reduce_variance.c +0 -3910
  215. data/ext/carray_kernels_scan.c +0 -3693
  216. data/ext/carray_kernels_search.c +0 -32218
  217. data/ext/carray_kernels_sort.c +0 -10626
  218. 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
- }