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,325 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_iter_substrate.h
4
+
5
+ Internal substrate shared between the descriptor framework
6
+ (ca_axis_dispatch.c), the CAStride family (ca_obj_stride.c), and the
7
+ future kernel_iterator (ca_kernel_iterator.c).
8
+
9
+ Status: INTERNAL, but installed and unavoidable. ca_kernel_iterator.h
10
+ includes this header for ca_axis_desc_t / ca_op_prefix_axis_t, so every
11
+ kernel author gets these declarations whether they want them or not --
12
+ "do not include this" is not an instruction anyone can follow. What
13
+ holds instead: nothing declared here is a downstream contract, and the
14
+ signatures may change across 3.x as the engine evolves. Calling one of
15
+ these from an ext gem is reaching past the author surface
16
+ (ca_kernel_iterator.h's frozen macros and entry points), and nothing
17
+ will be done to keep such a call working.
18
+
19
+ The helpers were `static` inside ca_axis_dispatch.c / ca_obj_stride.c
20
+ until ca_kernel_iterator.c needed them; only the linkage changed, not
21
+ the bodies. The inline helper is defined here so it still inlines into
22
+ each consumer TU.
23
+
24
+ --------------------------------------------------------------------------- */
25
+
26
+ #ifndef CA_ITER_SUBSTRATE_H
27
+ #define CA_ITER_SUBSTRATE_H 1
28
+
29
+ #include "carray.h"
30
+
31
+ /* ==========================================================================
32
+ ca_axis_dispatch.c substrate
33
+ ========================================================================== */
34
+
35
+ /* S2 / PROPOSAL_OPERAND_DESCRIPTOR Phase 1: pre-classified prefix axis.
36
+
37
+ Inner per-iteration offset contribution for prefix axis k:
38
+ STRIDE: poff += byte_start + idx[k] * byte_step
39
+ INDEX : poff += indices[idx[k]] * byte_pstride
40
+ SHIFT : (bound-checked, see ca_axis_dispatch_prefix_offset)
41
+
42
+ Quantities are pre-multiplied by pstrides[k] at setup time so the
43
+ inner loop spends one multiply per axis. */
44
+
45
+ typedef enum {
46
+ CA_OP_AXIS_STRIDE = 0,
47
+ CA_OP_AXIS_INDEX = 1,
48
+ CA_OP_AXIS_SHIFT = 2 /* Tier 2.B: bound-aware (CAWindow/CAShift) */
49
+ } ca_op_axis_kind_t;
50
+
51
+ typedef struct {
52
+ ca_op_axis_kind_t kind;
53
+ ca_size_t count;
54
+ /* STRIDE / SHIFT modes */
55
+ ca_size_t byte_start; /* = start * pstride */
56
+ ca_size_t byte_step; /* = step * pstride */
57
+ /* INDEX-mode (kind == CA_OP_AXIS_INDEX) */
58
+ const ca_size_t *indices;
59
+ ca_size_t byte_pstride; /* = pstride */
60
+ /* SHIFT-only fields (Tier 2.B) */
61
+ ca_size_t shift_start;
62
+ ca_size_t shift_step;
63
+ ca_size_t size0; /* parent dim along this axis */
64
+ uint8_t policy; /* CA_BOUNDS_FILL / PERIODIC / ... */
65
+ } ca_op_prefix_axis_t;
66
+
67
+ /* D8 (PROPOSAL_AXIS_MERGE Phase 2): in-place merge of adjacent STRIDE
68
+ axes when their effective byte strides line up. Operates on
69
+ (axes, pstrides, mdim, *ndim_inout) and writes the merged ndim back. */
70
+ void ca_axis_dispatch_merge (ca_axis_desc_t *axes,
71
+ ca_size_t *pstrides,
72
+ ca_size_t *mdim,
73
+ int8_t *ndim_inout);
74
+
75
+ /* Slab detection: identify the innermost STRIDE-step1 contig run.
76
+ Sets *slab_start, *slab_bytes, *slab_base. */
77
+ void ca_axis_dispatch_layout (ca_axis_desc_t *axes,
78
+ const ca_size_t *pstrides,
79
+ const ca_size_t *mdim,
80
+ int8_t ndim,
81
+ ca_size_t bytes,
82
+ int8_t *slab_start,
83
+ ca_size_t *slab_bytes,
84
+ ca_size_t *slab_base);
85
+
86
+ /* Build merged layout from caller-provided axes / parent_axis_dims.
87
+ Runs the D8 merge pass to fixpoint, writes results into out_*. */
88
+ void ca_axis_dispatch_prepare (const ca_size_t *parent_axis_dims,
89
+ const ca_axis_desc_t *axes,
90
+ int8_t ndim,
91
+ ca_size_t bytes,
92
+ ca_axis_desc_t *out_axes,
93
+ ca_size_t *out_pstrides,
94
+ ca_size_t *out_mdim,
95
+ int8_t *out_ndim);
96
+
97
+ /* Build pre-classified prefix axis array from the (post-merge, post-
98
+ layout) axes/pstrides for indices [0..slab_start-1]. */
99
+ void ca_axis_dispatch_classify_prefix (const ca_axis_desc_t *axes,
100
+ const ca_size_t *pstrides,
101
+ int8_t slab_start,
102
+ ca_op_prefix_axis_t *prefix);
103
+
104
+ /* Inline inner offset computation from pre-classified prefix. Kept as
105
+ `static inline` in the header so any consumer TU (ca_axis_dispatch.c,
106
+ future ca_kernel_iterator.c) inlines it directly. SHIFT axes apply
107
+ ca_bounds_normalize_index; if the normalised index is still OOB,
108
+ *oob is set to 1 and 0 is returned (caller decides skip vs fill). */
109
+ static inline ca_size_t
110
+ ca_axis_dispatch_prefix_offset (const ca_op_prefix_axis_t *prefix,
111
+ const ca_size_t *idx,
112
+ int8_t slab_start,
113
+ int *oob)
114
+ {
115
+ ca_size_t off = 0;
116
+ int8_t k;
117
+ *oob = 0;
118
+ for ( k = 0; k < slab_start; k++ ) {
119
+ if ( prefix[k].kind == CA_OP_AXIS_STRIDE ) {
120
+ off += prefix[k].byte_start + idx[k] * prefix[k].byte_step;
121
+ } else if ( prefix[k].kind == CA_OP_AXIS_INDEX ) {
122
+ off += prefix[k].indices[idx[k]] * prefix[k].byte_pstride;
123
+ } else { /* SHIFT */
124
+ ca_size_t pi = prefix[k].shift_start + idx[k] * prefix[k].shift_step;
125
+ if ( pi < 0 || pi >= prefix[k].size0 ) {
126
+ pi = ca_bounds_normalize_index(prefix[k].policy,
127
+ prefix[k].size0, pi);
128
+ if ( pi < 0 || pi >= prefix[k].size0 ) {
129
+ *oob = 1;
130
+ return 0;
131
+ }
132
+ }
133
+ off += pi * prefix[k].byte_pstride;
134
+ }
135
+ }
136
+ return off;
137
+ }
138
+
139
+ /* Per-slab callback driver (T1 Phase 0 P3, 2026-05-25). The engine
140
+ walks the (post-merge / post-layout) prefix axes row-major and for
141
+ each iteration invokes `cb` with:
142
+ slab_ptr = parent->ptr + composed_offset
143
+ oob = SHIFT-axis out-of-bounds flag (0 = in-bounds)
144
+ slab_n = slab span in bytes (constant across iters)
145
+ ctx = caller cookie (callback advances its own buf position)
146
+
147
+ gather / scatter / fill_value are now thin callback wrappers around
148
+ this driver; future ca_kernel_iterator.c will use the same primitive
149
+ (with its own user-kernel-wrapping callback) for descriptor-routed
150
+ slab walks. */
151
+ /* slab_off is the slab's byte offset into the parent, not a pointer into it:
152
+ a fill that means to write through the parent's own slots rather than a
153
+ borrowed buffer has no parent->ptr to offset from. Callbacks that do want
154
+ the pointer add parent->ptr themselves, from their own ctx. */
155
+ typedef void (*ca_slab_cb_t) (ca_size_t slab_off,
156
+ int oob,
157
+ ca_size_t slab_n,
158
+ void *ctx);
159
+
160
+ void ca_axis_dispatch_for_each_slab (CArray *parent,
161
+ const ca_size_t *parent_axis_dims,
162
+ ca_axis_desc_t *axes,
163
+ int8_t ndim,
164
+ ca_size_t bytes,
165
+ ca_size_t total_elements,
166
+ ca_slab_cb_t cb,
167
+ void *ctx);
168
+
169
+ /* ==========================================================================
170
+ ca_obj_stride.c substrate
171
+ ========================================================================== */
172
+
173
+ /* Strided gather/scatter with caller-provided strides+base (used by the
174
+ compose-fold copy_data/sync_data path and by future kernel_iterator
175
+ non-contig CAStride scratch path). */
176
+ void ca_stride_xfer_with_layout (CAStride *ca, int scatter, char *base,
177
+ const ca_size_t *strides);
178
+
179
+ /* Shared strided-region walker for ca_xfer_stride_dispatch (carray_core.c)
180
+ and ca_stride_func_xfer_stride (ca_obj_stride.c). Caller computes any
181
+ base offset into src_base and supplies byte strides in src_strides[];
182
+ the helper applies slab merge, 2-D tile-block transpose at the inner
183
+ pair, and a general outer-prefix odometer with per-iter slab memcpy.
184
+ `data` is the contig side (row-major over counts in `bytes` per cell).
185
+ `dir` is CA_XFER_GET (src -> data) or CA_XFER_PUT (data -> src).
186
+ XFER_REFORM_DEFERRED C.2 sub-A, 2026-05-31. */
187
+ void ca_xfer_strided_walk (char *src_base,
188
+ ca_size_t bytes,
189
+ int8_t ndim,
190
+ const ca_size_t *counts,
191
+ const ca_size_t *src_strides,
192
+ char *data,
193
+ int dir);
194
+
195
+ /* In-place merge of adjacent CAStride axes whose strides compose to a
196
+ contig run. PROPOSAL_AXIS_MERGE Phase 1 (CAStride 0a). */
197
+ void ca_stride_merge_axes (ca_size_t *strides,
198
+ ca_size_t *dim,
199
+ int8_t *ndim_inout);
200
+
201
+ /* Typed strided gather/scatter for one row of n cells of `bytes` width.
202
+ strided_step is byte stride (may be negative). Moved to the header as
203
+ `static inline` (PROPOSAL_TRANSFORM_FUSED_XFER 2026-05-31 + T10 perf fix):
204
+ both ca_obj_stride.c (xfer_with_layout general driver) and
205
+ ca_transform_common.c (fused walk) need this hot, so keep the typed
206
+ inner loops inlinable at every call site. */
207
+ #define CA_STRIDE_GATHER_TYPED(T) \
208
+ do { \
209
+ T *dp = (T *) contig; \
210
+ const char *sp = strided; \
211
+ ca_size_t i; \
212
+ for (i = 0; i < n; i++) { \
213
+ T v; \
214
+ memcpy(&v, sp, sizeof(T)); \
215
+ *dp++ = v; \
216
+ sp += strided_step; \
217
+ } \
218
+ } while (0)
219
+
220
+ #define CA_STRIDE_SCATTER_TYPED(T) \
221
+ do { \
222
+ char *dp = strided; \
223
+ const T *sp = (const T *) contig; \
224
+ ca_size_t i; \
225
+ for (i = 0; i < n; i++) { \
226
+ T v = *sp++; \
227
+ memcpy(dp, &v, sizeof(T)); \
228
+ dp += strided_step; \
229
+ } \
230
+ } while (0)
231
+
232
+ static inline void
233
+ ca_stride_gather_run (char *contig, const char *strided,
234
+ ca_size_t bytes, ca_size_t n, ca_size_t strided_step)
235
+ {
236
+ if (strided_step == bytes) {
237
+ memcpy(contig, strided, n * bytes);
238
+ return;
239
+ }
240
+ switch (bytes) {
241
+ case 1: CA_STRIDE_GATHER_TYPED(int8_t); return;
242
+ case 2: CA_STRIDE_GATHER_TYPED(int16_t); return;
243
+ case 4: CA_STRIDE_GATHER_TYPED(int32_t); return;
244
+ case 8: CA_STRIDE_GATHER_TYPED(int64_t); return;
245
+ default: break;
246
+ }
247
+ ca_size_t i;
248
+ for (i = 0; i < n; i++) {
249
+ memcpy(contig, strided, bytes);
250
+ contig += bytes;
251
+ strided += strided_step;
252
+ }
253
+ }
254
+
255
+ static inline void
256
+ ca_stride_scatter_run (char *strided, const char *contig,
257
+ ca_size_t bytes, ca_size_t n, ca_size_t strided_step)
258
+ {
259
+ if (strided_step == bytes) {
260
+ memcpy(strided, contig, n * bytes);
261
+ return;
262
+ }
263
+ switch (bytes) {
264
+ case 1: CA_STRIDE_SCATTER_TYPED(int8_t); return;
265
+ case 2: CA_STRIDE_SCATTER_TYPED(int16_t); return;
266
+ case 4: CA_STRIDE_SCATTER_TYPED(int32_t); return;
267
+ case 8: CA_STRIDE_SCATTER_TYPED(int64_t); return;
268
+ default: break;
269
+ }
270
+ ca_size_t i;
271
+ for (i = 0; i < n; i++) {
272
+ memcpy(strided, contig, bytes);
273
+ strided += strided_step;
274
+ contig += bytes;
275
+ }
276
+ }
277
+
278
+ /* ==========================================================================
279
+ ca_transform_common.c substrate
280
+ (PROPOSAL_TRANSFORM_FUSED_XFER rev3, 2026-05-31)
281
+ ========================================================================== */
282
+
283
+ /* Per-view transform callback for a contig row of n cells (GET or PUT).
284
+ `src` is parent_bytes per cell, `dst` is view_bytes per cell (or swapped
285
+ for PUT). Used by ca_xfer_stride_transform_fused. */
286
+ typedef void (*ca_transform_row_fn)(
287
+ ca_size_t n,
288
+ CArray *src_arr, char *src_row,
289
+ CArray *dst_arr, char *dst_row);
290
+
291
+ /* Fused walk: compose to root, then per-inner-row gather + transform (GET)
292
+ or transform + scatter (PUT). No whole-view scratch, no ca_attach.
293
+ Returns 1 on success, 0 if eligibility check fails (caller falls back). */
294
+ int ca_xfer_stride_transform_fused (
295
+ CArray *view,
296
+ CArray *parent,
297
+ ca_size_t *starts,
298
+ ca_size_t *counts,
299
+ ca_size_t *strides,
300
+ char *data,
301
+ int dir,
302
+ ca_transform_row_fn xform_get,
303
+ ca_transform_row_fn xform_put);
304
+
305
+ /* ==========================================================================
306
+ F-2 (PROPOSAL_F2_KERNEL_ITERATOR_ALIAS rev6): innermost-STRIDE L2 alias
307
+ ========================================================================== */
308
+
309
+ /* Predicate: innermost axis (= descs[ndim-1]) is STRIDE kind. This is the
310
+ minimum requirement for L2 strided alias of a descriptor-routed view
311
+ (CAWindow / CAShift / CSA / CAGrid). Outer axes may be any kind
312
+ (STRIDE / INDEX / SHIFT); they are walked by the prefix iterator and
313
+ per-iter offset is computed via ca_axis_dispatch_prefix_offset. */
314
+ int ca_axis_dispatch_is_innermost_stride (const ca_axis_desc_t *descs,
315
+ int8_t ndim);
316
+
317
+ /* Predicate: any outer axis (= descs[0..ndim-2]) is SHIFT kind. When
318
+ true, the L2 alias init must allocate a fill-slab scratch buffer so
319
+ OOB cells in the outer prefix walk yield a contig fill slab instead
320
+ of an out-of-bounds alias pointer. When false, alias mode can yield
321
+ parent.ptr + offset directly for every outer iteration. */
322
+ int ca_axis_dispatch_outer_has_shift (const ca_axis_desc_t *descs,
323
+ int8_t ndim);
324
+
325
+ #endif /* CA_ITER_SUBSTRATE_H */