carray 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
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);