carray 2.0.1 → 3.0.1

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  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 +1244 -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 +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -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 +239 -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 +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -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 +839 -0
  33. data/ext/ca_obj_binop.c +948 -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 +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -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 +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -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 +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  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 +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -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 +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
@@ -0,0 +1,330 @@
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
+ }