carray 2.0.1 → 3.0.0

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 (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +772 -297
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +229 -791
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +207 -240
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1341 -198
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +5 -15
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/mailmap +0 -1
  269. data/misc/Methods.ja.md +0 -182
  270. data/misc/NOTE +0 -51
  271. data/spec/Classes/CABitfield_spec.rb +0 -58
  272. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  273. data/spec/Classes/CABlock_spec.rb +0 -205
  274. data/spec/Classes/CAField_spec.rb +0 -39
  275. data/spec/Classes/CAGrid_spec.rb +0 -75
  276. data/spec/Classes/CAMap_spec.rb +0 -0
  277. data/spec/Classes/CAMapping_spec.rb +0 -105
  278. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  279. data/spec/Classes/CAObject_spec.rb +0 -33
  280. data/spec/Classes/CARefer_spec.rb +0 -93
  281. data/spec/Classes/CARepeat_spec.rb +0 -65
  282. data/spec/Classes/CASelect_spec.rb +0 -22
  283. data/spec/Classes/CAShift_spec.rb +0 -16
  284. data/spec/Classes/CAStruct_spec.rb +0 -71
  285. data/spec/Classes/CATranspose_spec.rb +0 -60
  286. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  287. data/spec/Classes/CAWindow_spec.rb +0 -54
  288. data/spec/Classes/CAWrap_spec.rb +0 -8
  289. data/spec/Classes/CArray_spec.rb +0 -184
  290. data/spec/Classes/CScalar_spec.rb +0 -55
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
@@ -0,0 +1,329 @@
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
+
38
+ /* ===== all_ki ============================================ */
39
+
40
+ static VALUE
41
+ all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
42
+ {
43
+ /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
44
+ /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
45
+ if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
46
+ ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
47
+ ca_size_t __inner = 1;
48
+ int __k;
49
+ for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
50
+ ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
51
+ ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
52
+ if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
53
+ ca_size_t __chunk_elems = __rows * __inner;
54
+ ca_size_t __outer = ca->dim[0];
55
+ ca_size_t __starts[CA_RANK_MAX] = {0};
56
+ ca_size_t __counts[CA_RANK_MAX];
57
+ ca_size_t __strides[CA_RANK_MAX];
58
+ ca_size_t __s = sizeof(boolean8_t);
59
+ for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
60
+ __strides[__k] = __s;
61
+ __s *= ca->dim[__k];
62
+ }
63
+ for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
64
+ ca_size_t __outer_off = 0;
65
+ boolean8_t acc;
66
+ acc = (1);
67
+ ca_lazy_arena_enter();
68
+ boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
69
+ while ( __outer_off < __outer ) {
70
+ ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
71
+ ca_size_t __n = __r * __inner;
72
+ __starts[0] = __outer_off;
73
+ __counts[0] = __r;
74
+ ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
75
+ ca_size_t __i;
76
+ for ( __i = 0; __i < __n; __i++ ) {
77
+ boolean8_t v = __chunk[__i];
78
+ acc &= v;
79
+ }
80
+ __outer_off += __r;
81
+ }
82
+ ca_lazy_arena_release(__chunk);
83
+ ca_lazy_arena_exit();
84
+ return BOOL2VAL((boolean8_t) (acc));
85
+ }
86
+ VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
87
+ CArray *co;
88
+ GetCArray(vout, co);
89
+ boolean8_t *op = (boolean8_t *) co->ptr;
90
+ ca_iter_state st;
91
+ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
92
+ slab_axes, naxes, 0);
93
+ if ( rc != CA_ITER_OK ) {
94
+ rb_raise(rb_eRuntimeError,
95
+ "all_ki: kernel_iterator init failed rc=%d", rc);
96
+ }
97
+ char *p;
98
+ boolean8_t *m;
99
+ ca_size_t out_i = 0;
100
+ while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
101
+ boolean8_t acc;
102
+ CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 1, acc &= v);
103
+ op[out_i++] = (boolean8_t) (acc);
104
+ }
105
+ ca_iter_state_finish(&st);
106
+ if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
107
+ return vout;
108
+ }
109
+
110
+ VALUE
111
+ rb_ca_all_ki (int argc, VALUE *argv, VALUE self)
112
+ {
113
+ CArray *src;
114
+ GetCArray(self, src);
115
+ volatile VALUE ropt = rb_pop_options(&argc, &argv);
116
+ volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
117
+ rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
118
+ int keep_axis = RTEST(rkeep_axis);
119
+ int8_t slab_axes[CA_RANK_MAX];
120
+ int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
121
+ if ( argc > 0 ) {
122
+ 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);
123
+ }
124
+ switch ( src->data_type ) {
125
+ case CA_BOOLEAN: return all_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
126
+ default:
127
+ rb_raise(rb_eCADataTypeError, "all_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
128
+ }
129
+ return Qnil; /* unreachable */
130
+ }
131
+
132
+ /* ===== any_ki ============================================ */
133
+
134
+ static VALUE
135
+ any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
136
+ {
137
+ /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
138
+ /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
139
+ if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
140
+ ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
141
+ ca_size_t __inner = 1;
142
+ int __k;
143
+ for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
144
+ ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
145
+ ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
146
+ if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
147
+ ca_size_t __chunk_elems = __rows * __inner;
148
+ ca_size_t __outer = ca->dim[0];
149
+ ca_size_t __starts[CA_RANK_MAX] = {0};
150
+ ca_size_t __counts[CA_RANK_MAX];
151
+ ca_size_t __strides[CA_RANK_MAX];
152
+ ca_size_t __s = sizeof(boolean8_t);
153
+ for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
154
+ __strides[__k] = __s;
155
+ __s *= ca->dim[__k];
156
+ }
157
+ for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
158
+ ca_size_t __outer_off = 0;
159
+ boolean8_t acc;
160
+ acc = (0);
161
+ ca_lazy_arena_enter();
162
+ boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
163
+ while ( __outer_off < __outer ) {
164
+ ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
165
+ ca_size_t __n = __r * __inner;
166
+ __starts[0] = __outer_off;
167
+ __counts[0] = __r;
168
+ ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
169
+ ca_size_t __i;
170
+ for ( __i = 0; __i < __n; __i++ ) {
171
+ boolean8_t v = __chunk[__i];
172
+ acc |= v;
173
+ }
174
+ __outer_off += __r;
175
+ }
176
+ ca_lazy_arena_release(__chunk);
177
+ ca_lazy_arena_exit();
178
+ return BOOL2VAL((boolean8_t) (acc));
179
+ }
180
+ VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
181
+ CArray *co;
182
+ GetCArray(vout, co);
183
+ boolean8_t *op = (boolean8_t *) co->ptr;
184
+ ca_iter_state st;
185
+ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
186
+ slab_axes, naxes, 0);
187
+ if ( rc != CA_ITER_OK ) {
188
+ rb_raise(rb_eRuntimeError,
189
+ "any_ki: kernel_iterator init failed rc=%d", rc);
190
+ }
191
+ char *p;
192
+ boolean8_t *m;
193
+ ca_size_t out_i = 0;
194
+ while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
195
+ boolean8_t acc;
196
+ CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 0, acc |= v);
197
+ op[out_i++] = (boolean8_t) (acc);
198
+ }
199
+ ca_iter_state_finish(&st);
200
+ if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
201
+ return vout;
202
+ }
203
+
204
+ VALUE
205
+ rb_ca_any_ki (int argc, VALUE *argv, VALUE self)
206
+ {
207
+ CArray *src;
208
+ GetCArray(self, src);
209
+ volatile VALUE ropt = rb_pop_options(&argc, &argv);
210
+ volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
211
+ rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
212
+ int keep_axis = RTEST(rkeep_axis);
213
+ int8_t slab_axes[CA_RANK_MAX];
214
+ int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
215
+ if ( argc > 0 ) {
216
+ 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);
217
+ }
218
+ switch ( src->data_type ) {
219
+ case CA_BOOLEAN: return any_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
220
+ default:
221
+ rb_raise(rb_eCADataTypeError, "any_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
222
+ }
223
+ return Qnil; /* unreachable */
224
+ }
225
+
226
+ /* ===== none_ki ============================================ */
227
+
228
+ static VALUE
229
+ none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
230
+ {
231
+ /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
232
+ /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
233
+ if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
234
+ ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
235
+ ca_size_t __inner = 1;
236
+ int __k;
237
+ for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
238
+ ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
239
+ ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
240
+ if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
241
+ ca_size_t __chunk_elems = __rows * __inner;
242
+ ca_size_t __outer = ca->dim[0];
243
+ ca_size_t __starts[CA_RANK_MAX] = {0};
244
+ ca_size_t __counts[CA_RANK_MAX];
245
+ ca_size_t __strides[CA_RANK_MAX];
246
+ ca_size_t __s = sizeof(boolean8_t);
247
+ for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
248
+ __strides[__k] = __s;
249
+ __s *= ca->dim[__k];
250
+ }
251
+ for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
252
+ ca_size_t __outer_off = 0;
253
+ boolean8_t acc;
254
+ acc = (1);
255
+ ca_lazy_arena_enter();
256
+ boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
257
+ while ( __outer_off < __outer ) {
258
+ ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
259
+ ca_size_t __n = __r * __inner;
260
+ __starts[0] = __outer_off;
261
+ __counts[0] = __r;
262
+ ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
263
+ ca_size_t __i;
264
+ for ( __i = 0; __i < __n; __i++ ) {
265
+ boolean8_t v = __chunk[__i];
266
+ acc &= !v;
267
+ }
268
+ __outer_off += __r;
269
+ }
270
+ ca_lazy_arena_release(__chunk);
271
+ ca_lazy_arena_exit();
272
+ return BOOL2VAL((boolean8_t) (acc));
273
+ }
274
+ VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
275
+ CArray *co;
276
+ GetCArray(vout, co);
277
+ boolean8_t *op = (boolean8_t *) co->ptr;
278
+ ca_iter_state st;
279
+ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
280
+ slab_axes, naxes, 0);
281
+ if ( rc != CA_ITER_OK ) {
282
+ rb_raise(rb_eRuntimeError,
283
+ "none_ki: kernel_iterator init failed rc=%d", rc);
284
+ }
285
+ char *p;
286
+ boolean8_t *m;
287
+ ca_size_t out_i = 0;
288
+ while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
289
+ boolean8_t acc;
290
+ CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 1, acc &= !v);
291
+ op[out_i++] = (boolean8_t) (acc);
292
+ }
293
+ ca_iter_state_finish(&st);
294
+ if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
295
+ return vout;
296
+ }
297
+
298
+ VALUE
299
+ rb_ca_none_ki (int argc, VALUE *argv, VALUE self)
300
+ {
301
+ CArray *src;
302
+ GetCArray(self, src);
303
+ volatile VALUE ropt = rb_pop_options(&argc, &argv);
304
+ volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
305
+ rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
306
+ int keep_axis = RTEST(rkeep_axis);
307
+ int8_t slab_axes[CA_RANK_MAX];
308
+ int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
309
+ if ( argc > 0 ) {
310
+ 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);
311
+ }
312
+ switch ( src->data_type ) {
313
+ case CA_BOOLEAN: return none_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
314
+ default:
315
+ rb_raise(rb_eCADataTypeError, "none_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
316
+ }
317
+ return Qnil; /* unreachable */
318
+ }
319
+
320
+ void
321
+ Init_carray_kernels_reduce_boolean (void)
322
+ {
323
+ /* Phase E rewire: legacy 'all' now dispatches via all_ki */
324
+ rb_define_method(rb_cCArray, "all", rb_ca_all_ki, -1);
325
+ /* Phase E rewire: legacy 'any' now dispatches via any_ki */
326
+ rb_define_method(rb_cCArray, "any", rb_ca_any_ki, -1);
327
+ /* Phase E rewire: legacy 'none' now dispatches via none_ki */
328
+ rb_define_method(rb_cCArray, "none", rb_ca_none_ki, -1);
329
+ }