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,91 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ CArray pool framework primitives. Collapses the per-class
4
+ `dim` / `strides` / per-view-tail metadata allocations into a
5
+ single `_pool` buffer, owned by the CArray struct and freed in
6
+ one xfree. Reduces the number of xmalloc / xfree pairs per
7
+ CArray lifecycle and keeps the metadata cache-adjacent.
8
+
9
+ Primary motivation: CABlock and CAWindow view creation. Those
10
+ two carry the most per-instance metadata (dim + strides + per-
11
+ axis tail), so consolidating their allocations into one pool
12
+ buffer roughly doubles clone throughput. Other view types and
13
+ entities adopted the same primitives for uniform alloc/free
14
+ discipline; the perf gain on those is modest.
15
+
16
+ Internal C API (no Ruby surface, no Init function). Three
17
+ entry points:
18
+
19
+ ca_array_alloc struct + pool in one allocation; used by
20
+ the C `*_new` constructors that build a
21
+ CArray from C without a Ruby wrapper.
22
+ ca_array_pool_alloc pool only; used by `*_initialize_copy`
23
+ where TypedData_Make_Struct has already
24
+ allocated the C struct.
25
+ ca_array_free frees both struct and pool; dispatched
26
+ from per-class free callbacks.
27
+
28
+ Per obj_type, two function-pointer hooks are registered into
29
+ `ca_func[obj_type]`: `pool_bytes(ndim)` computes the pool size,
30
+ and `pool_init(ca, ndim)` wires the struct's `dim` / `strides` /
31
+ tail pointers into the freshly allocated pool. See the per-view
32
+ Init_* setup for examples.
33
+
34
+ Mixed dispatch: an obj_type that has not yet registered the pool
35
+ hooks falls through to its legacy per-field ALLOC_N path
36
+ (`ca->_pool == NULL`); existing CArrays from such classes continue
37
+ to free correctly because `ca_array_free` is a no-op when
38
+ `_pool` is NULL. This kept the migration incremental and
39
+ remains safe in mixed object-graph scenarios.
40
+
41
+ See devel/PROPOSAL_CARRAY_POOL_STANDARDIZATION.md for the design.
42
+
43
+ ---------------------------------------------------------------------------- */
44
+
45
+ #include "carray.h"
46
+ #include <string.h>
47
+
48
+ /* Allocate struct + pool in one shot, then run pool_init.
49
+ *
50
+ * Called by per-class C `*_new` constructors. */
51
+ void *
52
+ ca_array_alloc (int8_t obj_type, int8_t ndim)
53
+ {
54
+ ca_operation_function_t *func = &ca_func[obj_type];
55
+ CArray *ca = xmalloc(func->struct_size);
56
+ memset(ca, 0, func->struct_size);
57
+ ca_array_pool_alloc(ca, obj_type, ndim);
58
+ return ca;
59
+ }
60
+
61
+ /* Allocate just the _pool buffer and run pool_init. The C struct
62
+ * itself is assumed already allocated (e.g. by TypedData_Make_Struct
63
+ * via `*_s_allocate`).
64
+ *
65
+ * Called by per-class `*_initialize_copy` and by ca_array_alloc above. */
66
+ void
67
+ ca_array_pool_alloc (void *ap, int8_t obj_type, int8_t ndim)
68
+ {
69
+ CArray *ca = (CArray *) ap;
70
+ ca_operation_function_t *func = &ca_func[obj_type];
71
+ ca->ndim = ndim;
72
+ ca->_pool = xmalloc(func->pool_bytes(ndim));
73
+ func->pool_init(ca, ndim);
74
+ }
75
+
76
+ /* Free struct + pool in one shot. Safe when `ca->_pool == NULL`
77
+ * (the pool xfree is skipped, the struct xfree always runs); this
78
+ * lets the per-class free callback dispatch here uniformly whether
79
+ * or not its obj_type has migrated to pool registration.
80
+ *
81
+ * Called by per-class free_* callbacks (= `func->free_object`). */
82
+ void
83
+ ca_array_free (void *ap)
84
+ {
85
+ CArray *ca = (CArray *) ap;
86
+ if (ca->_pool) {
87
+ xfree(ca->_pool);
88
+ ca->_pool = NULL;
89
+ }
90
+ xfree(ca);
91
+ }
@@ -0,0 +1,186 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_axis_descriptor.h
4
+
5
+ Per-axis descriptor framework (D1 + D2 + D3) — shared C-level vocabulary
6
+ that lets CSA, CAGrid, CASelectAxis, CAWindow, CAShift, and future
7
+ per-axis-mixed views describe each axis the same way so a common
8
+ attach dispatch engine (D3, ca_axis_dispatch.c) can drive them
9
+ uniformly.
10
+
11
+ See devel/PROPOSAL_AXIS_DESCRIPTOR_FRAMEWORK.md for the design.
12
+
13
+ Status: TWO-TIER FREEZE CONTRACT (3.0 onward), the same split
14
+ ca_kernel_iterator.h declares, for the same reason: this header is
15
+ installed and reachable from `#include "carray.h"`, so what it declares
16
+ is visible to downstream gems whether or not they were meant to use it.
17
+
18
+ FROZEN (additions only; renaming or re-laying-out is a 3.x break):
19
+ - ca_axis_kind_t and the layout of ca_axis_desc_t
20
+
21
+ Not because view authors were invited to build descriptors, but
22
+ because ca_iter_state -- whose slab-delivery fields ARE frozen
23
+ author contract -- embeds ca_axis_desc_t descs[CA_RANK_MAX] by
24
+ value. The type is already part of that struct's layout, so it
25
+ cannot move or shrink without breaking kernels that were promised
26
+ stability. It is frozen by consequence, not by invitation.
27
+
28
+ INTERNAL (free to change across 3.x; no downstream contract):
29
+ - every function below: ca_axis_dispatch_gather / _attach /
30
+ _scatter / _fill_value / _fill_value_via_parent, and the
31
+ ca_*_describe_axes producers
32
+
33
+ An external obj_type cannot participate in this engine anyway:
34
+ ca_iter_register_source_kind accepts CA_ITER_SRC_ATTACH only and
35
+ raises on CA_ITER_SRC_DESCRIPTOR, precisely because the engine
36
+ looks describe_axes up in its own table and an external type has no
37
+ way to supply one. A contract nobody outside can invoke is a
38
+ contract not worth keeping, so these stay free to move.
39
+
40
+ In-tree consumers (ca_obj_grid.c, ca_obj_select.c, ca_obj_select_axis.c,
41
+ ca_obj_window.c, ca_iter_substrate.h, ca_kernel_iterator.c) pick this up
42
+ transitively from carray.h without an explicit include.
43
+
44
+ --------------------------------------------------------------------------- */
45
+
46
+ #ifndef CA_AXIS_DESCRIPTOR_H
47
+ #define CA_AXIS_DESCRIPTOR_H 1
48
+
49
+ /* Depends on int8_t / uint8_t / ca_size_t typedefs from carray.h.
50
+ When this header is included from carray.h mid-file, those typedefs
51
+ are already in scope by the time we reach the include site. */
52
+
53
+ /* ---- D1: per-axis descriptor types ----------------------------------------
54
+
55
+ STRIDE = linear stride axis: parent index = start + i*step,
56
+ i in [0, count). Subsumes nil / Integer / Range index args.
57
+ INDEX = integer index axis: parent index = indices[i],
58
+ i in [0, count). Subsumes integer-array (CAGrid)
59
+ and boolean-mask-after-snapshot (CASelectAxis) axes.
60
+ SHIFT = bound-aware stride axis (CAWindow/CAShift, Tier 2.B):
61
+ parent index = start + i*step normalised by `policy`
62
+ (CA_BOUNDS_FILL / PERIODIC / REFLECT / NEAREST / ...)
63
+ against `size0` (= parent dim along this axis). When
64
+ normalisation fails (still out of range, e.g. FILL
65
+ policy), the engine writes `bound_fill` to the gather
66
+ buffer (or skips the parent write on scatter). */
67
+ typedef enum {
68
+ CA_AXIS_KIND_STRIDE = 0,
69
+ CA_AXIS_KIND_INDEX = 1,
70
+ CA_AXIS_KIND_SHIFT = 2
71
+ } ca_axis_kind_t;
72
+
73
+ typedef struct {
74
+ ca_axis_kind_t kind;
75
+ ca_size_t count; /* output size contributed by this axis */
76
+ /* STRIDE / SHIFT fields (unused / undefined when kind == INDEX) */
77
+ ca_size_t start;
78
+ ca_size_t step;
79
+ /* INDEX-only field (unused / NULL when kind != INDEX).
80
+ Ownership: borrowed from the producer view; lifetime tied to
81
+ the view that produced the descriptor array. Consumer (D3
82
+ dispatch) must not free or mutate. */
83
+ ca_size_t *indices;
84
+ /* SHIFT-only fields (unused / undefined when kind != SHIFT) */
85
+ ca_size_t size0; /* parent dim along this axis (bounds check) */
86
+ uint8_t policy; /* CA_BOUNDS_FILL / PERIODIC / REFLECT / ... */
87
+ } ca_axis_desc_t;
88
+
89
+ /* ---- D2: producer interface ----------------------------------------------
90
+
91
+ Both implementations write ndim entries into `out` (caller-allocated)
92
+ and `out_parent_dims` (caller-allocated, sized CA_RANK_MAX). See
93
+ devel/PROPOSAL_AXIS_DESCRIPTOR_FRAMEWORK.md §5 Framework Phase 1 and
94
+ devel/PROPOSAL_FLAT_INDEX_VIEWS.md §2.3 for rationale.
95
+
96
+ `out_parent_dims[k]` is the **effective** parent dim along descriptor
97
+ axis k — for CSA / CAGrid this is just `parent->dim[k]`, but for
98
+ flat-index views (CASelect / CAMapping, Tier 2.A.3+) it is
99
+ `{parent->elements}` (a single-axis flat view of parent). This
100
+ decouples descriptor.ndim from parent.ndim so the engine can drive
101
+ views whose iteration axes don't match the parent's physical shape.
102
+
103
+ Pointer arguments are typed `void *` here to avoid pulling the
104
+ private CASelectAxis / CAGrid struct definitions (which live in
105
+ their respective .c files) into this header. Each implementation
106
+ casts to its concrete type inside the .c file. */
107
+ void ca_select_axis_describe_axes (void *ca, ca_axis_desc_t *out,
108
+ ca_size_t *out_parent_dims);
109
+ void ca_grid_describe_axes (void *ca, ca_axis_desc_t *out,
110
+ ca_size_t *out_parent_dims);
111
+
112
+ /* ---- D3: common attach engine --------------------------------------------
113
+
114
+ Drives gather from `parent` into an output buffer driven by the
115
+ per-axis descriptor array. Caller must have parent attached before
116
+ invoking.
117
+
118
+ `parent_axis_dims[ndim]` carries the effective parent dim per
119
+ descriptor axis (see producer interface above). The engine never
120
+ reads `parent->dim` directly — it only reads `parent->ptr` for
121
+ data access — which is what allows flat-index views to lie about
122
+ parent's apparent shape (Tier 2.A, PROPOSAL_FLAT_INDEX_VIEWS.md).
123
+
124
+ `bound_fill` is the bytes-wide value written into gather output
125
+ cells whose SHIFT axes resolve to an out-of-bounds parent index
126
+ (Tier 2.B, PROPOSAL_BOUND_AWARE_VIEWS.md). Pass NULL when no
127
+ SHIFT axis is present (CSA / CAGrid / CASelect / CAMapping); the
128
+ engine ignores it. On scatter, the engine simply skips parent
129
+ writes for OOB cells regardless of bound_fill.
130
+
131
+ _gather — caller provides out_buf (must be sized total_elements*bytes)
132
+ _attach — wrapper that mallocs the buffer; caller xfrees
133
+
134
+ Returns a 1-byte placeholder when total_elements == 0 (the
135
+ _attach variant); _gather becomes a no-op in that case.
136
+
137
+ Forward-declare struct _CArray so these declarations can sit in a
138
+ stand-alone header without dragging in the full CArray definition. */
139
+ struct _CArray;
140
+ void ca_axis_dispatch_gather (struct _CArray *parent,
141
+ const ca_size_t *parent_axis_dims,
142
+ ca_axis_desc_t *axes,
143
+ int8_t ndim,
144
+ ca_size_t bytes,
145
+ ca_size_t total_elements,
146
+ const void *bound_fill,
147
+ char *out_buf);
148
+ char *ca_axis_dispatch_attach (struct _CArray *parent,
149
+ const ca_size_t *parent_axis_dims,
150
+ ca_axis_desc_t *axes,
151
+ int8_t ndim,
152
+ ca_size_t bytes,
153
+ ca_size_t total_elements,
154
+ const void *bound_fill);
155
+ void ca_axis_dispatch_scatter (struct _CArray *parent,
156
+ const ca_size_t *parent_axis_dims,
157
+ ca_axis_desc_t *axes,
158
+ int8_t ndim,
159
+ ca_size_t bytes,
160
+ ca_size_t total_elements,
161
+ const char *in_buf);
162
+ /* Broadcast scatter: write the single value `val` (bytes wide) into
163
+ every selected parent cell. See D6 of the framework piece.
164
+ (SHIFT axis OOB cells are skipped — fill semantics aren't
165
+ meaningful for broadcast-write since the destination value already
166
+ IS the broadcast value.) */
167
+ void ca_axis_dispatch_fill_value (struct _CArray *parent,
168
+ const ca_size_t *parent_axis_dims,
169
+ ca_axis_desc_t *axes,
170
+ int8_t ndim,
171
+ ca_size_t bytes,
172
+ ca_size_t total_elements,
173
+ const void *val);
174
+
175
+ /* As above, but each slab is handed to the parent as a region of its own via
176
+ ca_fill_stride, so a parent that has to be materialised to be addressed is
177
+ never gathered and written back whole to set the cells this view selected. */
178
+ void ca_axis_dispatch_fill_value_via_parent (struct _CArray *parent,
179
+ const ca_size_t *parent_axis_dims,
180
+ ca_axis_desc_t *axes,
181
+ int8_t ndim,
182
+ ca_size_t bytes,
183
+ ca_size_t total_elements,
184
+ const void *val);
185
+
186
+ #endif /* CA_AXIS_DESCRIPTOR_H */