carray 2.0.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1244 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +239 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +839 -0
  33. data/ext/ca_obj_binop.c +948 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
data/ext/ca_obj_reduce.c CHANGED
@@ -1,22 +1,20 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- ca_obj_reduce.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
1
  #include "carray.h"
2
+ #include "carray_internal.h" /* per-obj_type view constructors */
3
+
4
+ static size_t
5
+ ca_reduce_dsize (const void *ap)
6
+ {
7
+ const CAReduce *ca = (const CAReduce *) ap;
8
+ return sizeof(CAReduce) + ca->ndim * sizeof(ca_size_t);
9
+ }
12
10
 
13
11
  const rb_data_type_t careduce_data_type = {
14
- .parent = &cavirtual_data_type,
12
+ .parent = &caview_data_type,
15
13
  .wrap_struct_name = "CAReduce",
16
14
  .function = {
17
15
  .dmark = ca_mark,
18
16
  .dfree = ca_free,
19
- .dsize = NULL,
17
+ .dsize = ca_reduce_dsize,
20
18
  .dcompact = NULL
21
19
  },
22
20
  .flags = RUBY_TYPED_FREE_IMMEDIATELY
@@ -28,7 +26,7 @@ const rb_data_type_t careduce_mask_data_type = {
28
26
  .function = {
29
27
  .dmark = NULL,
30
28
  .dfree = ca_free_nop,
31
- .dsize = NULL,
29
+ .dsize = ca_reduce_dsize,
32
30
  .dcompact = NULL
33
31
  },
34
32
  .flags = RUBY_TYPED_FREE_IMMEDIATELY
@@ -40,7 +38,7 @@ VALUE rb_cCAReduce;
40
38
  VALUE rb_cCAReduceMask;
41
39
 
42
40
  /* yard:
43
- class CAReduce < CAVirtual # :nodoc:
41
+ class CAReduce < CAView # :nodoc:
44
42
  end
45
43
  */
46
44
 
@@ -102,7 +100,7 @@ free_ca_reduce (void *ap)
102
100
  CAReduce *ca = (CAReduce *) ap;
103
101
  if ( ca != NULL ) {
104
102
  ca_free(ca->mask);
105
- /* free(ca->dim); */
103
+ /* xfree(ca->dim); */
106
104
  xfree(ca);
107
105
  }
108
106
  }
@@ -116,44 +114,77 @@ ca_reduce_func_clone (void *ap)
116
114
  return ca_reduce_new(ca->parent, ca->count, ca->offset);
117
115
  }
118
116
 
119
- static char *
120
- ca_reduce_func_ptr_at_addr (void *ap, ca_size_t addr)
121
- {
122
- CAReduce *ca = (CAReduce *) ap;
123
- return ca->ptr + addr;
124
- }
125
-
126
- static char *
127
- ca_reduce_func_ptr_at_index (void *ap, ca_size_t *idx)
117
+ /* addr-list logic lives in xfer_addrs: GET = OR-reduce `count` adjacent parent
118
+ bytes per addr; PUT = broadcast the value to all `count` parent cells.
119
+ fetch_addr/store_addr forward (n==1), xfer_index = index2addr then xfer_addrs.
120
+ All forward to a single home; the legacy slots are removed at step 5. */
121
+ static void
122
+ ca_reduce_func_xfer_addrs (void *ap, ca_size_t n, ca_size_t *addrs,
123
+ void *data, int dir)
128
124
  {
129
125
  CAReduce *ca = (CAReduce *) ap;
130
- return ca_func[CA_OBJ_ARRAY].ptr_at_index(ca, idx);
126
+ char *d = (char *) data;
127
+ ca_size_t k, i;
128
+ for (k=0; k<n; k++) {
129
+ ca_size_t addr = addrs[k];
130
+ char *cell = d + k * ca->bytes;
131
+ if ( dir == CA_XFER_GET ) {
132
+ char q, v = 0;
133
+ for (i=0; i<ca->count; i++) {
134
+ ca_fetch_addr(ca->parent, addr*ca->count + i + ca->offset, &q);
135
+ if ( q ) { v = 1; break; }
136
+ }
137
+ *(char*)cell = v;
138
+ }
139
+ else {
140
+ for (i=0; i<ca->count; i++) {
141
+ ca_store_addr(ca->parent, addr*ca->count + i + ca->offset, cell);
142
+ }
143
+ }
144
+ }
131
145
  }
132
146
 
133
147
  static void
134
- ca_reduce_func_fetch_addr (void *ap, ca_size_t addr, void *ptr)
148
+ ca_reduce_func_xfer_index (void *ap, ca_size_t *idx, void *data, int dir)
135
149
  {
136
- CAReduce *ca = (CAReduce *) ap;
137
- char q;
138
- int i;
139
- for (i=0; i<ca->count; i++) {
140
- ca_fetch_addr(ca->parent, addr*ca->count+ca->offset, &q);
141
- if ( q ) {
142
- *(char*)ptr = (char) 1;
143
- return;
144
- }
145
- }
146
- *(char*)ptr = (char) 0;
150
+ ca_size_t addr = ca_index2addr(ap, idx);
151
+ ca_reduce_func_xfer_addrs(ap, 1, &addr, data, dir);
147
152
  }
148
153
 
154
+ /* xfer_stride (PROPOSAL_XFER_PROTOCOL.md §3/§4.4): CAReduce's view dimension
155
+ differs from its parent (each output cell reduces a window of ca->count
156
+ parent cells). The reduce (GET) / broadcast (PUT) is inherently per-output-
157
+ cell -- there is no STRIDE structure to preserve -- so the region reduces to
158
+ the view's flat output address list and is delivered through CAReduce's own
159
+ xfer_addrs, which encapsulates the parent-window mapping (addr*count+offset).
160
+ data is contiguous (semantics b); no whole-view attach. */
149
161
  static void
150
- ca_reduce_func_store_addr (void *ap, ca_size_t addr, void *ptr)
162
+ ca_reduce_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
163
+ ca_size_t *strides, void *data, int dir)
151
164
  {
152
- CAReduce *ca = (CAReduce *) ap;
153
- ca_size_t i;
154
- for (i=0; i<ca->count; i++) {
155
- ca_store_addr(ca->parent, addr*ca->count+i+ca->offset, ptr);
165
+ CAReduce *ca = (CAReduce *) ap;
166
+ int8_t ndim = ca->ndim;
167
+ ca_size_t native[CA_RANK_MAX], idx[CA_RANK_MAX];
168
+ ca_size_t *vaddrs;
169
+ ca_size_t base = 0, n = 1, i, s;
170
+ int8_t k;
171
+ volatile VALUE holder;
172
+
173
+ s = ca->bytes;
174
+ for (k = ndim - 1; k >= 0; k--) { native[k] = s; s *= ca->dim[k]; }
175
+ for (k = 0; k < ndim; k++) { base += starts[k] * native[k]; n *= counts[k]; }
176
+
177
+ vaddrs = ALLOCV_N(ca_size_t, holder, n);
178
+ for (k = 0; k < ndim; k++) idx[k] = 0;
179
+ for (i = 0; i < n; i++) {
180
+ ca_size_t off = base;
181
+ for (k = 0; k < ndim; k++) off += idx[k] * strides[k];
182
+ vaddrs[i] = off / ca->bytes;
183
+ k = ndim - 1;
184
+ while (k >= 0) { if (++idx[k] < counts[k]) break; idx[k] = 0; k--; }
156
185
  }
186
+ ca_xfer_addrs(ca, n, vaddrs, data, dir);
187
+ ALLOCV_END(holder);
157
188
  }
158
189
 
159
190
  static void
@@ -162,7 +193,7 @@ ca_reduce_func_allocate (void *ap)
162
193
  CAReduce *ca = (CAReduce *) ap;
163
194
  ca_attach(ca->parent);
164
195
  /* ca->ptr = ALLOC_N(char, ca->elements); */
165
- ca->ptr = malloc_with_check(ca_length(ca));
196
+ ca->ptr = xmalloc(ca_length(ca));
166
197
  }
167
198
 
168
199
  static void
@@ -173,10 +204,10 @@ ca_reduce_func_attach (void *ap)
173
204
  ca_size_t i;
174
205
  ca_attach(ca->parent);
175
206
  /* ca->ptr = ALLOC_N(char, ca->elements); */
176
- ca->ptr = malloc_with_check(ca_length(ca));
207
+ ca->ptr = xmalloc(ca_length(ca));
177
208
  p = ca->ptr;
178
209
  for (i=0; i<ca->elements; i++) {
179
- ca_reduce_func_fetch_addr(ca, i, p);
210
+ ca_reduce_func_xfer_addrs(ca, 1, &i, p, CA_XFER_GET);
180
211
  p++;
181
212
  }
182
213
  }
@@ -190,7 +221,7 @@ ca_reduce_func_sync (void *ap)
190
221
  p = ca->ptr;
191
222
  ca_attach(ca->parent);
192
223
  for (i=0; i<ca->elements; i++) {
193
- ca_reduce_func_store_addr(ca, i, p);
224
+ ca_reduce_func_xfer_addrs(ca, 1, &i, p, CA_XFER_PUT);
194
225
  p++;
195
226
  }
196
227
  ca_sync(ca->parent);
@@ -201,40 +232,27 @@ static void
201
232
  ca_reduce_func_detach (void *ap)
202
233
  {
203
234
  CAReduce *ca = (CAReduce *) ap;
204
- free(ca->ptr);
235
+ xfree(ca->ptr);
205
236
  ca->ptr = NULL;
206
237
  ca_detach(ca->parent);
207
238
  }
208
239
 
240
+ /* xfer_all (PROPOSAL_CHEAP_ATTACH.md rev5 W.5, 2026-06-01):
241
+ Removed ca_attach(parent) silent transitive attach. The per-cell loop
242
+ uses ca_fetch_addr/ca_store_addr (via xfer_addrs) which dispatch through
243
+ parent's xfer_index slot -- no parent.ptr requirement, §2.5 compliant.
244
+ For cold parent, each cell access traverses parent's view chain (slower
245
+ but correct). */
209
246
  static void
210
- ca_reduce_func_copy_data (void *ap, void *ptr)
211
- {
212
- CAReduce *ca = (CAReduce *) ap;
213
- ca_size_t i;
214
- char *p;
215
- ca_attach(ca->parent);
216
- p = ptr;
217
- for (i=0; i<ca->elements; i++) {
218
- ca_reduce_func_fetch_addr(ca, i, p);
219
- p++;
220
- }
221
- ca_detach(ca->parent);
222
- }
223
-
224
- static void
225
- ca_reduce_func_sync_data (void *ap, void *ptr)
247
+ ca_reduce_func_xfer_all (void *ap, void *data, int dir)
226
248
  {
227
249
  CAReduce *ca = (CAReduce *) ap;
228
- char *p;
229
250
  ca_size_t i;
230
- ca_attach(ca->parent);
231
- p = ptr;
251
+ char *p = (char *) data;
232
252
  for (i=0; i<ca->elements; i++) {
233
- ca_reduce_func_store_addr(ca, i, p);
253
+ ca_reduce_func_xfer_addrs(ca, 1, &i, p, dir);
234
254
  p++;
235
255
  }
236
- ca_sync(ca->parent);
237
- ca_detach(ca->parent);
238
256
  }
239
257
 
240
258
  static void
@@ -244,7 +262,7 @@ ca_reduce_func_fill_data (void *ap, void *ptr)
244
262
  ca_size_t i;
245
263
  ca_attach(ca->parent);
246
264
  for (i=0; i<ca->elements; i++) {
247
- ca_reduce_func_store_addr(ca, i, ptr);
265
+ ca_reduce_func_xfer_addrs(ca, 1, &i, ptr, CA_XFER_PUT);
248
266
  }
249
267
  ca_sync(ca->parent);
250
268
  ca_detach(ca->parent);
@@ -265,23 +283,20 @@ ca_reduce_func_create_mask (void *ap)
265
283
 
266
284
  ca_operation_function_t ca_reduce_func = {
267
285
  -1, /* CA_OBJ_REDUCE */
268
- CA_VIRTUAL_ARRAY,
286
+ CA_VIEW_ARRAY,
269
287
  free_ca_reduce,
270
288
  ca_reduce_func_clone,
271
- ca_reduce_func_ptr_at_addr,
272
- ca_reduce_func_ptr_at_index,
273
- ca_reduce_func_fetch_addr,
274
- NULL,
275
- ca_reduce_func_store_addr,
276
- NULL,
277
289
  ca_reduce_func_allocate,
278
290
  ca_reduce_func_attach,
279
291
  ca_reduce_func_sync,
280
292
  ca_reduce_func_detach,
281
- ca_reduce_func_copy_data,
282
- ca_reduce_func_sync_data,
283
293
  ca_reduce_func_fill_data,
284
294
  ca_reduce_func_create_mask,
295
+ ca_reduce_func_xfer_index,
296
+ ca_reduce_func_xfer_addrs,
297
+ NULL, /* fold_stride: never-fold (reduce window) */
298
+ ca_reduce_func_xfer_stride,
299
+ ca_reduce_func_xfer_all,
285
300
  };
286
301
 
287
302
  /* ------------------------------------------------------------------- */
@@ -307,15 +322,15 @@ rb_ca_reduce_initialize_copy (VALUE self, VALUE other)
307
322
  }
308
323
 
309
324
  void
310
- Init_ca_obj_reduce ()
325
+ Init_ca_obj_reduce (void)
311
326
  {
312
- rb_cCAReduce = rb_define_class("CAReduce", rb_cCAVirtual);
327
+ rb_cCAReduce = rb_define_class("CAReduce", rb_cCAView);
313
328
  rb_cCAReduceMask = rb_define_class("CAReduceMask", rb_cCAReduce);
314
329
 
315
330
  CA_OBJ_REDUCE = ca_install_obj_type(rb_cCAReduce,
316
331
  &careduce_data_type,
317
332
  rb_cCAReduceMask,
318
- &careduce_mask_data_type, ca_reduce_func);
333
+ &careduce_mask_data_type, &ca_reduce_func, sizeof(ca_reduce_func));
319
334
  rb_define_const(rb_cObject, "CA_OBJ_REDUCE", INT2NUM(CA_OBJ_REDUCE));
320
335
 
321
336
  rb_define_alloc_func(rb_cCAReduce, rb_ca_reduce_s_allocate);