carray 2.0.0 → 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 +774 -298
  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 +230 -792
  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 +208 -241
  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 -330
  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 +1342 -199
  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 +4 -14
  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/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  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,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 */