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,475 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ CARemap — internal-only per-element gather view. Each output cell
4
+ (k0, k1, ..., k_{n-1}) reads the input cell at
5
+ parent.flatten[idx.flatten[k]].
6
+
7
+ Constraints:
8
+ - ref.dim == idx.dim (same shape, same ndim, per-axis dim match)
9
+ - idx.data_type == CA_SIZE (caller responsible)
10
+ - No public constructor — there is no `CArray#remap(idx)` or
11
+ `CARemap.new` surface; the class is only reachable via internal
12
+ helpers and the `ca[idx]` same-shape indexer fast path.
13
+ - The CARemap Ruby class IS rb_define_class'd: visibility lets users
14
+ see "this view came from a same-shape gather" when they inspect
15
+ `.class`. CA_OBJ_REMAP integer remains unexported as a Ruby
16
+ constant — it is an internal type tag.
17
+
18
+ ---------------------------------------------------------------------------- */
19
+
20
+ #include "carray.h"
21
+
22
+ typedef struct {
23
+ int16_t obj_type;
24
+ int8_t data_type;
25
+ int8_t ndim;
26
+ int32_t flags;
27
+ ca_size_t bytes;
28
+ ca_size_t elements;
29
+ ca_size_t *dim;
30
+ char *ptr;
31
+ CArray *mask;
32
+ char *_pool; /* framework-managed pool buffer (NULL = legacy ALLOC_N path). */
33
+ CArray *parent; /* = ref */
34
+ uint32_t attach;
35
+ uint8_t nosync;
36
+ /* ---------- */
37
+ CArray *idx; /* shared reference; data_type = CA_SIZE, same shape as parent */
38
+ } CARemap;
39
+
40
+ static int8_t CA_OBJ_REMAP;
41
+
42
+ /* Ruby classes — rb_define_class'd in Init so users see the right
43
+ class name on .class inspection. No constructor is bound (no
44
+ rb_define_method "initialize" or alloc), so the class is unreachable
45
+ from Ruby code; only internal C helpers can construct CARemap. */
46
+ static VALUE rb_cCARemap;
47
+ static VALUE rb_cCARemapMask;
48
+
49
+ static size_t
50
+ ca_remap_dsize (const void *ap)
51
+ {
52
+ const CARemap *ca = (const CARemap *) ap;
53
+ return sizeof(CARemap) + ca->ndim * sizeof(ca_size_t);
54
+ }
55
+
56
+ /* Pool framework hooks: single ndim-sized tail (dim) in the _pool buffer. */
57
+ static size_t
58
+ ca_remap_pool_bytes (int8_t ndim)
59
+ {
60
+ ca_size_t n = (ndim > 0) ? ndim : 1;
61
+ return (size_t) n * sizeof(ca_size_t);
62
+ }
63
+
64
+ static void
65
+ ca_remap_pool_init (void *ap, int8_t ndim)
66
+ {
67
+ CARemap *ca = (CARemap *) ap;
68
+ ca->dim = (ca_size_t *) ca->_pool;
69
+ }
70
+
71
+ const rb_data_type_t caremap_data_type = {
72
+ .parent = &caview_data_type,
73
+ .wrap_struct_name = "CARemap",
74
+ .function = {
75
+ .dmark = ca_mark,
76
+ .dfree = ca_free,
77
+ .dsize = ca_remap_dsize,
78
+ .dcompact = NULL
79
+ },
80
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
81
+ };
82
+
83
+ const rb_data_type_t caremap_mask_data_type = {
84
+ .parent = &caremap_data_type,
85
+ .wrap_struct_name = "CARemapMask",
86
+ .function = {
87
+ .dmark = NULL,
88
+ .dfree = ca_free_nop,
89
+ .dsize = ca_remap_dsize,
90
+ .dcompact = NULL
91
+ },
92
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
93
+ };
94
+
95
+ /* ------------------------------------------------------------------- */
96
+ /* Constraint enforcement: idx is CA_SIZE and ref.dim == idx.dim. */
97
+
98
+ static void
99
+ ca_remap_check_constraints (CArray *ref, CArray *idx)
100
+ {
101
+ int k;
102
+
103
+ if ( idx->data_type != CA_SIZE ) {
104
+ rb_raise(rb_eArgError,
105
+ "CARemap: idx data_type must be CA_SIZE (got %d)",
106
+ (int) idx->data_type);
107
+ }
108
+ if ( ref->ndim != idx->ndim ) {
109
+ rb_raise(rb_eArgError,
110
+ "CARemap: ref.ndim (%d) != idx.ndim (%d)",
111
+ (int) ref->ndim, (int) idx->ndim);
112
+ }
113
+ for ( k = 0; k < ref->ndim; k++ ) {
114
+ if ( ref->dim[k] != idx->dim[k] ) {
115
+ rb_raise(rb_eArgError,
116
+ "CARemap: shape mismatch at axis %d (ref=%lld, idx=%lld)",
117
+ k,
118
+ (long long) ref->dim[k],
119
+ (long long) idx->dim[k]);
120
+ }
121
+ }
122
+ }
123
+
124
+ /* ------------------------------------------------------------------- */
125
+
126
+ int
127
+ ca_remap_setup (CARemap *ca, CArray *ref, CArray *idx)
128
+ {
129
+ ca_remap_check_constraints(ref, idx);
130
+
131
+ ca->obj_type = CA_OBJ_REMAP;
132
+ ca->data_type = ref->data_type;
133
+ ca->flags = 0;
134
+ ca->ndim = ref->ndim;
135
+ ca->bytes = ref->bytes;
136
+ ca->elements = ref->elements;
137
+ ca->ptr = NULL;
138
+ ca->mask = NULL;
139
+ if ( ! ca->_pool ) {
140
+ ca->dim = ALLOC_N(ca_size_t, ref->ndim);
141
+ }
142
+ memcpy(ca->dim, ref->dim, ref->ndim * sizeof(ca_size_t));
143
+
144
+ ca->parent = ref;
145
+ ca->attach = 0;
146
+ ca->nosync = 0;
147
+ ca->idx = idx;
148
+
149
+ if ( ca_has_mask(ref) ) {
150
+ ca_create_mask(ca);
151
+ }
152
+
153
+ if ( ca_is_scalar(ref) ) {
154
+ ca_set_flag(ca, CA_FLAG_SCALAR);
155
+ }
156
+
157
+ return 0;
158
+ }
159
+
160
+ CARemap *
161
+ ca_remap_new (CArray *ref, CArray *idx)
162
+ {
163
+ CARemap *ca = (CARemap *) ca_array_alloc(CA_OBJ_REMAP, ref->ndim);
164
+ ca_remap_setup(ca, ref, idx);
165
+ return ca;
166
+ }
167
+
168
+ static void
169
+ free_ca_remap (void *ap)
170
+ {
171
+ CARemap *ca = (CARemap *) ap;
172
+ if ( ca != NULL ) {
173
+ ca_free(ca->mask);
174
+ /* ca->idx is a shared reference owned by the caller; no free here.
175
+ The Ruby-side parent linkage (rb_ca_set_parent on idx wrapper)
176
+ keeps it reachable for GC. */
177
+ if ( ca->_pool ) {
178
+ ca_array_free(ca); /* dim lives in _pool */
179
+ }
180
+ else {
181
+ xfree(ca->dim);
182
+ xfree(ca);
183
+ }
184
+ }
185
+ }
186
+
187
+ /* Forward declarations for the xfer slot implementations, used by the
188
+ lifecycle slots above them in the dispatch table. */
189
+ static void ca_remap_func_xfer_addrs (void *ap, ca_size_t n,
190
+ ca_size_t *addrs, void *data, int dir);
191
+ static void ca_remap_func_xfer_all (void *ap, void *data, int dir);
192
+
193
+ /* ------------------------------------------------------------------- */
194
+
195
+ static void *
196
+ ca_remap_func_clone (void *ap)
197
+ {
198
+ CARemap *ca = (CARemap *) ap;
199
+ return ca_remap_new(ca->parent, ca->idx);
200
+ }
201
+
202
+ /* Lifecycle (xfer contract):
203
+ attach = allocate ptr + xfer_all(GET)
204
+ sync = xfer_all(PUT)
205
+ detach = xfree(ptr)
206
+ No ca_attach(parent) / ca_attach(idx) here — xfer_all resolves both
207
+ per-cell through the per-region ca_xfer_addrs dispatchers. */
208
+
209
+ static void
210
+ ca_remap_func_allocate (void *ap)
211
+ {
212
+ CARemap *ca = (CARemap *) ap;
213
+ ca->ptr = xmalloc(ca_length(ca));
214
+ }
215
+
216
+ static void
217
+ ca_remap_func_attach (void *ap)
218
+ {
219
+ CARemap *ca = (CARemap *) ap;
220
+ ca->ptr = xmalloc(ca_length(ca));
221
+ ca_remap_func_xfer_all(ca, ca->ptr, CA_XFER_GET);
222
+ }
223
+
224
+ static void
225
+ ca_remap_func_sync (void *ap)
226
+ {
227
+ CARemap *ca = (CARemap *) ap;
228
+ ca_remap_func_xfer_all(ca, ca->ptr, CA_XFER_PUT);
229
+ }
230
+
231
+ static void
232
+ ca_remap_func_detach (void *ap)
233
+ {
234
+ CARemap *ca = (CARemap *) ap;
235
+ xfree(ca->ptr);
236
+ ca->ptr = NULL;
237
+ }
238
+
239
+ /* fill_data: broadcast a single cell (`data` is one cell of size
240
+ ca->bytes) to every view position. Implementation = build a
241
+ row-major scratch of `data` repeated `elements` times, then route
242
+ through xfer_all(PUT). With repeats in idx this writes the same
243
+ parent cell multiple times — value is identical so the result is
244
+ well-defined (parent.flat[idx[k]] = value for each unique k). */
245
+ static void
246
+ ca_remap_func_fill_data (void *ap, void *data)
247
+ {
248
+ CARemap *ca = (CARemap *) ap;
249
+ ca_size_t n = ca->elements;
250
+ char *scratch;
251
+ ca_size_t i;
252
+ volatile VALUE holder;
253
+
254
+ if ( n == 0 ) return;
255
+
256
+ scratch = ALLOCV_N(char, holder, n * ca->bytes);
257
+ for ( i = 0; i < n; i++ ) {
258
+ memcpy(scratch + i * ca->bytes, data, ca->bytes);
259
+ }
260
+ ca_remap_func_xfer_all(ca, scratch, CA_XFER_PUT);
261
+ ALLOCV_END(holder);
262
+ }
263
+
264
+ static void
265
+ ca_remap_func_create_mask (void *ap)
266
+ {
267
+ CARemap *ca = (CARemap *) ap;
268
+ ca_update_mask(ca->parent);
269
+ if ( ! ca->parent->mask ) {
270
+ ca_create_mask(ca->parent);
271
+ }
272
+ /* Mask is a CARemap over (parent->mask, idx) — same shape, boolean. */
273
+ ca->mask = (CArray *) ca_remap_new(ca->parent->mask, ca->idx);
274
+ }
275
+
276
+ /* xfer_addrs: batched gather/scatter over a list of view flat addresses.
277
+
278
+ Per the same-shape invariant the view-flat addresses index ca->idx
279
+ identically (both have the same elements layout). Steps:
280
+
281
+ 1. ALLOCV paddrs[n].
282
+ 2. ca_xfer_addrs(ca->idx, n, addrs, paddrs, GET) — one batched
283
+ read of the parent flat addresses through ca->idx's own
284
+ xfer_addrs dispatcher (entity, view, view chain — all
285
+ transparent).
286
+ 3. ca_xfer_addrs(ca->parent, n, paddrs, data, dir) — one batched
287
+ gather/scatter of the user payload against parent.
288
+
289
+ No ca_attach() of parent or idx; both reads are per-region dispatch.
290
+ This is the natural batched form of xfer_index (and xfer_index
291
+ routes through it). */
292
+ static void
293
+ ca_remap_func_xfer_addrs (void *ap, ca_size_t n, ca_size_t *addrs,
294
+ void *data, int dir)
295
+ {
296
+ CARemap *ca = (CARemap *) ap;
297
+ ca_size_t *paddrs;
298
+ volatile VALUE holder;
299
+
300
+ if ( n == 0 ) return;
301
+
302
+ paddrs = ALLOCV_N(ca_size_t, holder, n);
303
+ ca_xfer_addrs(ca->idx, n, addrs, paddrs, CA_XFER_GET);
304
+ ca_xfer_addrs(ca->parent, n, paddrs, data, dir);
305
+ ALLOCV_END(holder);
306
+ }
307
+
308
+ /* xfer_index — single-cell form delegated to xfer_addrs after
309
+ converting the view N-D index to a view flat address. Same-shape
310
+ invariant: ca_index2addr on ca itself (using ca->dim) yields the
311
+ right view flat that equally indexes ca->idx. */
312
+ static void
313
+ ca_remap_func_xfer_index (void *ap, ca_size_t *idx, void *data, int dir)
314
+ {
315
+ ca_size_t view_addr = ca_index2addr(ap, idx);
316
+ ca_remap_func_xfer_addrs(ap, 1, &view_addr, data, dir);
317
+ }
318
+
319
+ /* xfer_stride: CARemap is a never-fold per-element gather boundary --
320
+ no STRIDE structure to preserve. The region [starts[k],
321
+ starts[k]+counts[k]) is enumerated cell-by-cell, each cell resolved
322
+ to its view-flat address through the strides[] byte step, and
323
+ delivered through CARemap's own xfer_addrs (which then walks through
324
+ ca->idx to the parent addresses in two batched calls). data is
325
+ contiguous row-major over counts.
326
+
327
+ Same shape as CAReduce's xfer_stride (ca_obj_reduce.c). */
328
+ static void
329
+ ca_remap_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
330
+ ca_size_t *strides, void *data, int dir)
331
+ {
332
+ CARemap *ca = (CARemap *) ap;
333
+ int8_t ndim = ca->ndim;
334
+ ca_size_t native[CA_RANK_MAX], idx[CA_RANK_MAX];
335
+ ca_size_t *vaddrs;
336
+ ca_size_t base = 0, n = 1, i, s;
337
+ int8_t k;
338
+ volatile VALUE holder;
339
+
340
+ s = ca->bytes;
341
+ for ( k = ndim - 1; k >= 0; k-- ) { native[k] = s; s *= ca->dim[k]; }
342
+ for ( k = 0; k < ndim; k++ ) { base += starts[k] * native[k]; n *= counts[k]; }
343
+
344
+ if ( n == 0 ) return;
345
+
346
+ vaddrs = ALLOCV_N(ca_size_t, holder, n);
347
+ for ( k = 0; k < ndim; k++ ) idx[k] = 0;
348
+ for ( i = 0; i < n; i++ ) {
349
+ ca_size_t off = base;
350
+ for ( k = 0; k < ndim; k++ ) off += idx[k] * strides[k];
351
+ vaddrs[i] = off / ca->bytes;
352
+ k = ndim - 1;
353
+ while ( k >= 0 ) { if ( ++idx[k] < counts[k] ) break; idx[k] = 0; k--; }
354
+ }
355
+ ca_remap_func_xfer_addrs(ca, n, vaddrs, data, dir);
356
+ ALLOCV_END(holder);
357
+ }
358
+
359
+ /* xfer_all: whole-view delivery. Sequential view-flat addresses
360
+ [0..elements) routed through xfer_addrs -- one ALLOCV for the addr
361
+ list, then two batched ca_xfer_addrs calls inside xfer_addrs.
362
+
363
+ No ca_attach(parent) / ca_attach(idx). */
364
+ static void
365
+ ca_remap_func_xfer_all (void *ap, void *data, int dir)
366
+ {
367
+ CARemap *ca = (CARemap *) ap;
368
+ ca_size_t n = ca->elements;
369
+ ca_size_t *vaddrs;
370
+ ca_size_t i;
371
+ volatile VALUE holder;
372
+
373
+ if ( n == 0 ) return;
374
+
375
+ vaddrs = ALLOCV_N(ca_size_t, holder, n);
376
+ for ( i = 0; i < n; i++ ) vaddrs[i] = i;
377
+ ca_remap_func_xfer_addrs(ca, n, vaddrs, data, dir);
378
+ ALLOCV_END(holder);
379
+ }
380
+
381
+ ca_operation_function_t ca_remap_func = {
382
+ -1, /* obj_type — assigned by ca_install_obj_type */
383
+ CA_VIEW_ARRAY,
384
+ free_ca_remap,
385
+ ca_remap_func_clone,
386
+ ca_remap_func_allocate,
387
+ ca_remap_func_attach,
388
+ ca_remap_func_sync,
389
+ ca_remap_func_detach,
390
+ ca_remap_func_fill_data,
391
+ ca_remap_func_create_mask,
392
+ ca_remap_func_xfer_index,
393
+ ca_remap_func_xfer_addrs,
394
+ NULL, /* fold_stride: never-fold (per-element gather boundary) */
395
+ ca_remap_func_xfer_stride,
396
+ ca_remap_func_xfer_all,
397
+ };
398
+
399
+
400
+ /* ------------------------------------------------------------------- */
401
+ /* Ruby wrapper for ca_remap_new. Validates the (ref, idx) shape /
402
+ data_type invariants at the Ruby boundary, builds the view via
403
+ ca_remap_new, wraps as a CARemap VALUE, and sets the parent linkage.
404
+
405
+ Called from the `ca[idx]` same-shape indexer routing (carray_access.c)
406
+ and the sort / partition along-axis gather (carray_sort.c,
407
+ carray_partition.c). Callers are expected to have already checked the
408
+ routing preconditions (same shape, idx data_type == CA_SIZE);
409
+ ca_remap_setup raises ArgumentError on mismatch as a defensive
410
+ fallback. */
411
+ VALUE
412
+ rb_ca_remap_new (VALUE cary, VALUE rmapper)
413
+ {
414
+ volatile VALUE obj;
415
+ CArray *ref, *idx;
416
+ CARemap *ca;
417
+
418
+ rb_check_carray_object(cary);
419
+ rb_check_carray_object(rmapper);
420
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, ref);
421
+ TypedData_Get_Struct(rmapper, CArray, &carray_data_type, idx);
422
+
423
+ ca = ca_remap_new(ref, idx);
424
+ obj = ca_wrap_struct(ca);
425
+ rb_ca_set_parent(obj, cary);
426
+ /* Hold a Ruby-side reference to the idx VALUE so its GC lifetime
427
+ covers the view's. ca->idx is a raw pointer into idx's struct;
428
+ keeping rmapper reachable through the view keeps it alive. */
429
+ rb_ivar_set(obj, rb_intern("remap_idx"), rmapper);
430
+ return obj;
431
+ }
432
+
433
+ /* Read-only accessor for the per-cell index CArray that defines this
434
+ CARemap's mapping. Returns the same CArray VALUE the caller passed
435
+ to ca[mapper] (= shared reference, not a copy). Companion to
436
+ CABlock#start / CAStride#strides / CAWindow#count etc. — the view
437
+ hierarchy is preserved so each named view class exposes its own
438
+ defining semantic state. */
439
+ static VALUE
440
+ rb_ca_remap_mapper (VALUE self)
441
+ {
442
+ return rb_ivar_get(self, rb_intern("remap_idx"));
443
+ }
444
+
445
+
446
+ void
447
+ Init_ca_obj_remap (void)
448
+ {
449
+ /* CARemap is a proper Ruby class so users can see "this view is a
450
+ per-element gather" on .class. No allocator, no initialize, no
451
+ `new` reachable from Ruby — construction is C-internal only.
452
+ CA_OBJ_REMAP integer remains unexported (it's an internal type
453
+ tag, not user-meaningful). */
454
+ rb_cCARemap = rb_define_class("CARemap", rb_cCAView);
455
+ rb_cCARemapMask = rb_define_class("CARemapMask", rb_cCARemap);
456
+ rb_undef_alloc_func(rb_cCARemap);
457
+ rb_undef_alloc_func(rb_cCARemapMask);
458
+
459
+ ca_remap_func.struct_size = sizeof(CARemap);
460
+ ca_remap_func.pool_bytes = ca_remap_pool_bytes;
461
+ ca_remap_func.pool_init = ca_remap_pool_init;
462
+
463
+ CA_OBJ_REMAP = ca_install_obj_type(rb_cCARemap,
464
+ &caremap_data_type,
465
+ rb_cCARemapMask,
466
+ &caremap_mask_data_type,
467
+ &ca_remap_func, sizeof(ca_remap_func));
468
+
469
+ /* Defining semantic state accessor — companion to CABlock#start /
470
+ CAStride#strides / CAWindow#count. The hierarchy-preserving
471
+ design implies each named view class exposes its own defining
472
+ state so user / test / debugger can ask "how is this view
473
+ mapping?" through ordinary Ruby. */
474
+ rb_define_method(rb_cCARemap, "mapper", rb_ca_remap_mapper, 0);
475
+ }