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
data/ext/carray_hold.c ADDED
@@ -0,0 +1,228 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ Mask gap-fill hold: carry the last valid value forward into masked cells
4
+ along one axis. Backing primitive for `unmask(method:)` / `strip_mask(method:)`
5
+ (see devel/PROPOSAL_UNMASK_FILL_METHOD.md).
6
+
7
+ Hold copies a cell's bytes into masked cells with no arithmetic and no
8
+ per-type behavior, so a single ca->bytes-width memcpy walk covers every
9
+ data_type -- numeric, complex, bool, object (VALUE-slot byte copy of an
10
+ already-live value), fixlen, and Face storage. This native does forward
11
+ hold along one axis only and returns a fresh same-shape entity; the
12
+ backward variant (flip -> forward -> flip), flatten, and the linear method
13
+ are composed in the Ruby wrapper.
14
+
15
+ ---------------------------------------------------------------------------- */
16
+
17
+ #include <stdint.h>
18
+ #include <string.h>
19
+ #include "ruby.h"
20
+ #include "carray.h"
21
+ #include "ca_kernel_iterator.h"
22
+ #include "ca_obj_face.h"
23
+
24
+ /* Forward hold along `axis`. Per fiber along the scan axis:
25
+ - present cell -> output = cell value, becomes the held value;
26
+ - masked after a value -> output = held value, unmasked;
27
+ - masked before any value (leading run) -> output stays masked (UNDEF),
28
+ since there is no value to carry (hold has no identity). */
29
+ static VALUE
30
+ rb_ca_hold_forward (VALUE self, int axis)
31
+ {
32
+ CArray *ca, *co;
33
+ GetCArray(self, ca);
34
+
35
+ /* Storage-typed same-shape entity. Deliberately not rb_ca_template(), which
36
+ re-wraps a Face in its own class: the walk below indexes op_mask off the
37
+ raw contiguous buffer, so it needs the entity, and the Face identity is
38
+ put back once at the end (CA_FACE_LIFT_IF_FACE). */
39
+ volatile VALUE vout = ca_wrap_struct(ca_template_safe(ca));
40
+ GetCArray(vout, co);
41
+
42
+ ca_size_t K = co->bytes;
43
+
44
+ int8_t slab_axes[CA_RANK_MAX];
45
+ slab_axes[0] = (int8_t) axis;
46
+
47
+ ca_iter_state st_in, st_out;
48
+ int rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES, slab_axes, 1, 0);
49
+ if ( rc != CA_ITER_OK ) {
50
+ rb_raise(rb_eRuntimeError, "__hold__: input init failed rc=%d", rc);
51
+ }
52
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES, slab_axes, 1,
53
+ CA_KERNEL_WRITE);
54
+ if ( rc != CA_ITER_OK ) {
55
+ ca_iter_state_finish(&st_in);
56
+ rb_raise(rb_eRuntimeError, "__hold__: output init failed rc=%d", rc);
57
+ }
58
+
59
+ /* Output mask allocated lazily on the first leading-masked (UNDEF) cell:
60
+ a fiber can only go UNDEF on a leading masked run, so a fully filled
61
+ result carries no mask at all. op_mask parallels the fresh contiguous
62
+ output value buffer co->ptr. */
63
+ boolean8_t *op_mask = NULL;
64
+ char *co_root = (char *) co->ptr;
65
+
66
+ char *pi, *po;
67
+ boolean8_t *mi, *mo;
68
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
69
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
70
+ ca_size_t N = st_in.slab_dims[0];
71
+ ca_size_t iS = st_in.slab_strides[0]; /* input data byte stride */
72
+ ca_size_t oS = st_out.slab_strides[0]; /* output data byte stride */
73
+ ca_size_t iMS = st_in.slab_mask_strides[0]; /* input mask element stride */
74
+ ca_size_t oMStep = oS / K; /* output mask element step */
75
+ ca_size_t oMBase = (ca_size_t)(po - co_root) / K;
76
+ const char *held = NULL; /* last valid cell (points into input slab) */
77
+
78
+ for ( ca_size_t j = 0; j < N; j++ ) {
79
+ const char *ci = pi + j * iS;
80
+ char *cor = po + j * oS;
81
+ if ( mi == NULL || ! mi[j * iMS] ) {
82
+ memcpy(cor, ci, (size_t) K);
83
+ held = ci;
84
+ }
85
+ else if ( held != NULL ) {
86
+ memcpy(cor, held, (size_t) K); /* carry last valid, unmasked */
87
+ }
88
+ else {
89
+ memcpy(cor, ci, (size_t) K); /* leading run: value slot masked */
90
+ if ( op_mask == NULL ) {
91
+ ca_create_mask(co);
92
+ op_mask = (boolean8_t *) co->mask->ptr;
93
+ }
94
+ op_mask[oMBase + j * oMStep] = 1;
95
+ }
96
+ }
97
+ ca_iter_state_sync_slab(&st_out);
98
+ }
99
+ ca_iter_state_finish(&st_in);
100
+ ca_iter_state_finish(&st_out);
101
+
102
+ CA_FACE_LIFT_IF_FACE(vout, self, ca);
103
+ return vout;
104
+ }
105
+
106
+ /* __hold__(axis): private forward-hold primitive. axis is a required
107
+ Integer (negative counts from the end). The Ruby wrapper composes
108
+ backward / flatten / linear on top of this. */
109
+ static VALUE
110
+ rb_ca_hold_method (VALUE self, VALUE raxis)
111
+ {
112
+ CArray *ca;
113
+ GetCArray(self, ca);
114
+ int axis = NUM2INT(raxis);
115
+ if ( axis < 0 ) axis += ca->ndim;
116
+ if ( axis < 0 || axis >= ca->ndim ) {
117
+ rb_raise(rb_eArgError, "__hold__: axis %d out of range for ndim %d",
118
+ NUM2INT(raxis), ca->ndim);
119
+ }
120
+ return rb_ca_hold_forward(self, axis);
121
+ }
122
+
123
+ /* first / last: the reduction sibling of hold. Reduce each fiber to its
124
+ first (backward = 0) or last (backward = 1) valid (unmasked) value.
125
+ Byte-generic like hold, and identity-less: a fiber with no valid cell
126
+ (all masked, or empty) yields UNDEF. A user who wants a default instead
127
+ of UNDEF completes at the call site: `a.first(axis: 0).strip_mask(v)`. */
128
+ static VALUE
129
+ rb_ca_first_last_reduce (VALUE self, int argc, VALUE *argv, int backward)
130
+ {
131
+ CArray *ca, *co;
132
+ GetCArray(self, ca);
133
+
134
+ volatile VALUE ropt = rb_pop_options(&argc, &argv);
135
+ volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
136
+ rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
137
+ if ( argc > 0 ) {
138
+ rb_raise(rb_eArgError,
139
+ "%s: positional axis is not accepted (got %d); use axis: kwarg "
140
+ "(e.g. a.%s(axis: 0) or a.%s(axis: [0, 1]))",
141
+ backward ? "last" : "first", argc,
142
+ backward ? "last" : "first", backward ? "last" : "first");
143
+ }
144
+ int keep_axis = RTEST(rkeep_axis);
145
+ int8_t slab_axes[CA_RANK_MAX];
146
+ int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, ca, slab_axes);
147
+
148
+ ca_size_t K = ca->bytes;
149
+ volatile VALUE vout = rb_ca_new_reduced_bytes(self, slab_axes, naxes,
150
+ ca->data_type, K, keep_axis);
151
+ GetCArray(vout, co);
152
+ char *op = (char *) co->ptr;
153
+
154
+ ca_iter_state st;
155
+ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES, slab_axes, naxes, 0);
156
+ if ( rc != CA_ITER_OK ) {
157
+ rb_raise(rb_eRuntimeError, "%s: kernel_iterator init failed rc=%d",
158
+ backward ? "last" : "first", rc);
159
+ }
160
+
161
+ char *p;
162
+ boolean8_t *m;
163
+ ca_size_t out_i = 0;
164
+ boolean8_t *op_mask = NULL; /* lazily allocated on the first empty fiber */
165
+ while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
166
+ const char *found = NULL;
167
+ int8_t sndim = st.slab_ndim;
168
+ ca_size_t total = st.slab_elements;
169
+ ca_size_t sidx[CA_RANK_MAX] = { 0 };
170
+ for ( ca_size_t idx = 0; idx < total; idx++ ) {
171
+ ca_size_t doff = 0, moff = 0;
172
+ for ( int8_t sk = 0; sk < sndim; sk++ ) {
173
+ doff += sidx[sk] * st.slab_strides[sk];
174
+ moff += sidx[sk] * st.slab_mask_strides[sk];
175
+ }
176
+ if ( m == NULL || ! m[moff] ) {
177
+ found = (const char *) p + doff;
178
+ if ( ! backward ) break; /* first: take the first present cell */
179
+ } /* last: keep the most recent present */
180
+ /* row-major odometer (innermost slab axis fastest) */
181
+ for ( int8_t sk = (int8_t)(sndim - 1); sk >= 0; sk-- ) {
182
+ if ( ++sidx[sk] < st.slab_dims[sk] ) break;
183
+ sidx[sk] = 0;
184
+ }
185
+ }
186
+ if ( found == NULL ) {
187
+ if ( ! op_mask ) {
188
+ ca_create_mask(co);
189
+ op_mask = (boolean8_t *) co->mask->ptr;
190
+ }
191
+ op_mask[out_i] = 1;
192
+ memset(op + out_i * K, 0, (size_t) K); /* sentinel; mask bit counts */
193
+ }
194
+ else {
195
+ memcpy(op + out_i * K, found, (size_t) K);
196
+ }
197
+ out_i++;
198
+ }
199
+ ca_iter_state_finish(&st);
200
+
201
+ CA_FACE_LIFT_IF_FACE(vout, self, ca);
202
+ if ( naxes == ca->ndim && !keep_axis ) {
203
+ return rb_ca_fetch_addr(vout, 0); /* full reduce -> scalar (UNDEF-aware) */
204
+ }
205
+ return vout;
206
+ }
207
+
208
+ /* @overload first(axis: nil, keep_axis: false) */
209
+ static VALUE
210
+ rb_ca_first (int argc, VALUE *argv, VALUE self)
211
+ {
212
+ return rb_ca_first_last_reduce(self, argc, argv, 0);
213
+ }
214
+
215
+ /* @overload last(axis: nil, keep_axis: false) */
216
+ static VALUE
217
+ rb_ca_last (int argc, VALUE *argv, VALUE self)
218
+ {
219
+ return rb_ca_first_last_reduce(self, argc, argv, 1);
220
+ }
221
+
222
+ void
223
+ Init_carray_hold (void)
224
+ {
225
+ rb_define_private_method(rb_cCArray, "__hold__", rb_ca_hold_method, 1);
226
+ rb_define_method(rb_cCArray, "first", rb_ca_first, -1);
227
+ rb_define_method(rb_cCArray, "last", rb_ca_last, -1);
228
+ }