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/carray_copy.c CHANGED
@@ -1,28 +1,38 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- carray_copy.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2025 Hiroki Motoyoshi
3
+ Duplication and template allocation: `copy` (always-copy entity),
4
+ `to_ca` (entity self / view materialise sentinel), and `template`
5
+ (same-shape blank result, optionally retyped or block-initialised).
6
+ Sibling of carray_generate.c (factory builders) and carray_access.c
7
+ (`store_all` broadcast path used by the 0-arity template block).
8
8
 
9
9
  ---------------------------------------------------------------------------- */
10
10
 
11
11
  #include "carray.h"
12
+ #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
13
+ #include "carray_internal.h" /* ca_gc_hold_push / ca_gc_hold_pop_to */
12
14
  #include <stdarg.h>
13
15
 
14
16
  /* ------------------------------------------------------------------- */
15
17
 
18
+ /* Allocates a fresh entity (or scalar) of the same shape, data_type,
19
+ * and bytes as `ca`, copies the element payload, and reproduces the
20
+ * mask state. Always copies even when `ca` is an entity; for view
21
+ * sources the data path goes through `ca_copy_data`, otherwise a flat
22
+ * memcpy of `ca_length(ca)` bytes.
23
+ *
24
+ * Backs `CArray#copy` and is also reachable as a C-level utility from
25
+ * other ext files that need an owned snapshot. */
16
26
  CArray *
17
27
  ca_copy (void *ap)
18
28
  {
19
29
  CArray *ca = (CArray *) ap;
20
30
  CArray *co;
21
31
 
22
- if ( ca_is_scalar(ca) ) { /* create scalar without mask */
32
+ if ( ca_is_scalar(ca) ) {
23
33
  co = (CArray *) cscalar_new(ca->data_type, ca->bytes, 0);
24
34
  }
25
- else { /* create array without mask */
35
+ else {
26
36
  co = carray_new(ca->data_type, ca->ndim, ca->dim, ca->bytes, 0);
27
37
  }
28
38
 
@@ -41,69 +51,148 @@ ca_copy (void *ap)
41
51
  return co;
42
52
  }
43
53
 
44
- /* @overload to_ca
45
-
46
- (Copy) Creates CArray object from `self` with same contents includes mask state.
47
- */
48
-
54
+ /* Ruby entry for `CArray#copy`. Wraps `ca_copy` and, when `self` is a
55
+ * Face (e.g. CARecord), lifts the wrapped result so the derived class
56
+ * identity is preserved on the copy. */
49
57
  VALUE
50
58
  rb_ca_copy (VALUE self)
51
59
  {
52
60
  volatile VALUE obj;
53
- CArray *ca;
61
+ CArray *ca, *co;
62
+ int guard = -1;
54
63
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
55
- obj = ca_wrap_struct(ca_copy(ca));
56
- rb_ca_data_type_inherit(obj, self);
64
+ co = ca_copy(ca);
65
+ /* The copy holds VALUEs that so far exist only in co->ptr, and
66
+ ca_wrap_struct allocates. Keep them reachable until the wrapper
67
+ that owns them exists. */
68
+ if ( ca_is_object_type(co) ) {
69
+ guard = ca_gc_hold_push(co->ptr, co->elements);
70
+ }
71
+ obj = ca_wrap_struct(co);
72
+ ca_gc_hold_pop_to(guard);
73
+ CA_FACE_LIFT_IF_FACE(obj, self, ca);
57
74
  return obj;
58
75
  }
59
76
 
77
+ /* Reads the `writable:` keyword every `to_ca` implementation accepts.
78
+ * Returns non-zero when the caller demands a result whose writes reach
79
+ * the source, so a `to_ca` that can only hand back a copy must refuse
80
+ * instead of returning one silently.
81
+ *
82
+ * Exported for `to_ca` implementations written in C, in this tree and
83
+ * in ext gems; the Ruby-side equivalent is a `writable: false` keyword
84
+ * on the method definition. */
85
+ int
86
+ ca_to_ca_writable_arg (int argc, VALUE *argv)
87
+ {
88
+ VALUE opts;
89
+ ID kw_ids[1];
90
+ VALUE kw_vals[1];
91
+
92
+ rb_scan_args(argc, argv, "0:", &opts);
93
+ if ( NIL_P(opts) ) {
94
+ return 0;
95
+ }
96
+ kw_ids[0] = rb_intern("writable");
97
+ rb_get_kwargs(opts, kw_ids, 0, 1, kw_vals);
98
+ return ( kw_vals[0] == Qundef ) ? 0 : RTEST(kw_vals[0]);
99
+ }
100
+
101
+ /* Refusal an implementation raises when `writable: true` was asked of a
102
+ * `to_ca` that only ever produces a detached copy. */
103
+ void
104
+ ca_to_ca_refuse_writable (VALUE self)
105
+ {
106
+ volatile VALUE inspect = rb_inspect(CLASS_OF(self));
107
+ rb_raise(rb_eRuntimeError,
108
+ "%s#to_ca can only return a copy; it can't satisfy `writable: true'",
109
+ StringValuePtr(inspect));
110
+ }
111
+
112
+ /* Ruby entry for `CArray#to_ca`. Returns `self` unchanged — for any
113
+ * CArray (entity or data view) the receiver is already a CArray.
114
+ *
115
+ * `writable: true` states that the caller is going to write through the
116
+ * result into the source. `self` shares its storage by construction, so
117
+ * the only way to fail here is a read-only receiver.
118
+ *
119
+ * Other classes override `to_ca` for their own semantics: a Ruby
120
+ * `Array` builds a new CArray, and lazy views (CAMonOp / CABinOp /
121
+ * CAMonCmp / CABinCmp / CALazyMarker) force evaluation into a fresh
122
+ * entity; both are copies and so refuse `writable: true`. When an
123
+ * independent owned copy is required, callers use `copy`. */
124
+ VALUE
125
+ rb_ca_to_ca (int argc, VALUE *argv, VALUE self)
126
+ {
127
+ if ( ca_to_ca_writable_arg(argc, argv) ) {
128
+ CArray *ca;
129
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
130
+ if ( ca_is_readonly(ca) ) {
131
+ rb_raise(rb_eRuntimeError, "can't modify read-only carray");
132
+ }
133
+ }
134
+ return self;
135
+ }
136
+
60
137
  /* ------------------------------------------------------------------- */
61
138
 
139
+ /* Allocates a fresh entity (or scalar) with the same shape,
140
+ * data_type, and bytes as `ca`, without a mask and with the payload
141
+ * left uninitialised. Used by ext code that is about to overwrite
142
+ * every element (e.g. kernel outputs, casts, element-wise results). */
62
143
  CArray *
63
144
  ca_template (void *ap)
64
145
  {
65
146
  CArray *ca = (CArray *) ap;
66
- if ( ca_is_scalar(ca) ) { /* create scalar without mask */
147
+ if ( ca_is_scalar(ca) ) {
67
148
  return (CArray*) cscalar_new(ca->data_type, ca->bytes, NULL);
68
149
  }
69
- else { /* create array without mask */
150
+ else {
70
151
  return carray_new(ca->data_type, ca->ndim, ca->dim, ca->bytes, NULL);
71
152
  }
72
153
  }
73
154
 
155
+ /* Variant of `ca_template` that zero-fills the payload (entity path
156
+ * uses `carray_new_safe`). Used when the caller may leave some cells
157
+ * untouched and needs a defined initial value. */
74
158
  CArray *
75
159
  ca_template_safe (void *ap)
76
160
  {
77
161
  CArray *ca = (CArray *) ap;
78
- if ( ca_is_scalar(ca) ) { /* create scalar without mask */
162
+ if ( ca_is_scalar(ca) ) {
79
163
  return (CArray*) cscalar_new(ca->data_type, ca->bytes, NULL);
80
164
  }
81
- else { /* create array filled with 0, without mask */
165
+ else {
82
166
  return carray_new_safe(ca->data_type, ca->ndim, ca->dim, ca->bytes, NULL);
83
167
  }
84
168
  }
85
169
 
170
+ /* `ca_template_safe` with an explicit target `data_type` / `bytes`
171
+ * (i.e. shape is taken from `ca` but the element type is overridden).
172
+ * The `bytes` argument is required for fixlen, ignored for numeric
173
+ * data types. */
86
174
  CArray *
87
175
  ca_template_safe2 (void *ap, int8_t data_type, ca_size_t bytes)
88
176
  {
89
177
  CArray *ca = (CArray *) ap;
90
178
  CA_CHECK_DATA_TYPE(data_type);
91
- if ( ca_is_scalar(ca) ) { /* create scalar without mask */
179
+ if ( ca_is_scalar(ca) ) {
92
180
  return (CArray*) cscalar_new(data_type, bytes, NULL);
93
181
  }
94
- else { /* create array filled with 0, without mask */
182
+ else {
95
183
  return carray_new_safe(data_type, ca->ndim, ca->dim, bytes, NULL);
96
184
  }
97
185
  }
98
186
 
99
- /* @overload template(data_type=self.data_type, bytes: 0)
100
-
101
- (Copy) Returns CArray object with same dimension with `self`
102
- The data type of the new carray object can be specified by `data_type`.
103
- For fixlen data type, the option `:bytes` is used to specified the
104
- data length.
105
- */
106
-
187
+ /* Ruby entry for `CArray#template`. Allocates a same-shape blank
188
+ * result, retypes it when `data_type` is given, and optionally runs a
189
+ * block initialiser:
190
+ * - block arity == 0: evaluate once, broadcast via `rb_ca_store_all`
191
+ * (scalar-fill fast path, the dominant idiom)
192
+ * - block arity != 0: per-cell walk yielding the multi-dimensional
193
+ * subscript as individual integer arguments
194
+ * The arity dispatch matches `CArray.new` (ca_obj_array.c) so the two
195
+ * factories behave the same for block-driven initialisation. */
107
196
  static VALUE
108
197
  rb_ca_template_method (int argc, VALUE *argv, VALUE self)
109
198
  {
@@ -118,23 +207,51 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
118
207
 
119
208
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
120
209
 
121
- if ( NIL_P(rtype) ) { /* data_type not given */
210
+ if ( NIL_P(rtype) ) {
122
211
  co = ca_template_safe(ca);
123
212
  obj = ca_wrap_struct(co);
124
- rb_ca_data_type_inherit(obj, self);
125
213
  }
126
214
  else {
127
215
  rb_ca_guess_type_and_bytes(rtype, rbytes, &data_type, &bytes);
128
216
  co = ca_template_safe2(ca, data_type, bytes);
129
217
  obj = ca_wrap_struct(co);
130
- rb_ca_data_type_import(obj, rtype);
131
218
  }
132
219
 
133
- if ( rb_block_given_p() ) { /* block given */
134
- volatile VALUE rval = rb_yield_values(0);
135
- if ( rval != self ) {
136
- rb_ca_store_all(obj, rval);
220
+ if ( rb_block_given_p() ) {
221
+ if ( rb_proc_arity(rb_block_proc()) == 0 ) {
222
+ volatile VALUE rval = rb_yield_values2(0, NULL);
223
+ if ( rval != self ) {
224
+ rb_ca_store_all(obj, rval);
225
+ }
137
226
  }
227
+ else {
228
+ CArray *co;
229
+ TypedData_Get_Struct(obj, CArray, &carray_data_type, co);
230
+ if ( co->ndim > 0 ) {
231
+ ca_size_t idx[CA_RANK_MAX];
232
+ volatile VALUE ridx = rb_ary_new2(co->ndim);
233
+ ca_attach(co);
234
+ rb_ca_index_walk(obj, co, 0, idx, ridx, CA_LOOP_STORE);
235
+ ca_sync(co);
236
+ ca_detach(co);
237
+ }
238
+ else {
239
+ volatile VALUE rval = rb_yield_values2(0, NULL);
240
+ rb_ca_store_addr(obj, 0, rval);
241
+ }
242
+ }
243
+ }
244
+
245
+ /* Preserve the Face identity only for a same-type template (no explicit
246
+ * retype). A retype (template(:boolean)) is a different-typed buffer and
247
+ * must not be re-wrapped as the Face. A same-type template of a Face with
248
+ * a valid blank form (CARecord carries its data_class through the struct
249
+ * tail; identity Faces alias same-type storage) is lifted so the class is
250
+ * preserved. A Face with no valid blank form (CAConstString's content-
251
+ * defined offset+buffer) overrides `template` in Ruby to return a plain
252
+ * array instead of a broken same-class shell. */
253
+ if ( NIL_P(rtype) ) {
254
+ CA_FACE_LIFT_IF_FACE(obj, self, ca);
138
255
  }
139
256
 
140
257
  return obj;
@@ -155,6 +272,10 @@ rb_ca_template_with_type (VALUE self, VALUE rtype, VALUE rbytes)
155
272
  return rb_ca_template_method(2, args, self);
156
273
  }
157
274
 
275
+ /* Picks the largest-shape CArray among `n` variadic CArray arguments
276
+ * and returns `template(largest)`. Used by `carray_call_cfunc.c` to
277
+ * size the output of vectorised scalar C-function calls, where the
278
+ * inputs may be a mix of scalars and arrays. */
158
279
  VALUE
159
280
  rb_ca_template_n (int n, ...)
160
281
  {
@@ -194,244 +315,21 @@ rb_ca_template_n (int n, ...)
194
315
  }
195
316
 
196
317
  /* ------------------------------------------------------------------- */
197
-
198
- static void
199
- ca_paste_loop (CArray *ca, ca_size_t *offset, ca_size_t *offset0,
200
- ca_size_t *size, CArray *cs,
201
- int32_t level, ca_size_t *idx, ca_size_t *idx0)
202
- {
203
- ca_size_t i;
204
- if ( level == ca->ndim - 1 ) {
205
- idx[level] = offset[level];
206
- idx0[level] = offset0[level];
207
- memcpy(ca_ptr_at_index(ca, idx), ca_ptr_at_index(cs, idx0), size[level]*ca->bytes);
208
- if ( ca->mask ) {
209
- memset(ca_ptr_at_index(ca->mask, idx), 0, size[level]*sizeof(boolean8_t));
210
- }
211
- }
212
- else {
213
- for (i=0; i<size[level]; i++) {
214
- idx[level] = offset[level] + i;
215
- idx0[level] = offset0[level] + i;
216
- ca_paste_loop(ca, offset, offset0, size, cs, level+1, idx, idx0);
217
- }
218
- }
219
- }
318
+ /* [MOVED] sub-region copy `crop(offset, dst)` / `paste(offset, src)`
319
+ * -> lib/extras/crop_paste.rb (Ruby wrappers over CAWindow,
320
+ * opt-in via `require "extras/crop_paste"`, not autoloaded).
321
+ *
322
+ * The names `clip` / `clip!` now mean value clamp (clamp to a min/max
323
+ * range) and live in ext/carray_generate.c. The old `clip` argument
324
+ * order was reversed in the sub-region API, so the moved entry is
325
+ * renamed to `crop`; `paste` keeps its name. */
220
326
 
221
327
  /* ------------------------------------------------------------------- */
222
328
 
223
329
  void
224
- ca_paste (void *ap, ca_size_t *offset, void *sp)
225
- {
226
- CArray *ca = (CArray *) ap;
227
- CArray *cs = (CArray *) sp;
228
- ca_size_t size[CA_RANK_MAX];
229
- ca_size_t offset0[CA_RANK_MAX];
230
- ca_size_t idx[CA_RANK_MAX];
231
- ca_size_t idx0[CA_RANK_MAX];
232
- int8_t i;
233
-
234
- ca_check_same_data_type(ca, cs);
235
- ca_check_same_ndim(ca, cs);
236
-
237
- for (i=0; i<ca->ndim; i++) {
238
- if ( offset[i] >= 0 ) {
239
- if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
240
- size[i] = ca->dim[i] - offset[i];
241
- }
242
- else {
243
- size[i] = cs->dim[i];
244
- }
245
- offset0[i] = 0;
246
- }
247
- else {
248
- if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
249
- size[i] = ca->dim[i];
250
- }
251
- else {
252
- size[i] = cs->dim[i] + offset[i];
253
- }
254
- offset0[i] = -offset[i];
255
- offset[i] = 0;
256
- }
257
- }
258
-
259
- for (i=0; i<ca->ndim; i++) {
260
- CA_CHECK_INDEX(offset[i], ca->dim[i]);
261
- }
262
-
263
- if ( ca_has_mask(cs) ) {
264
- ca_create_mask(ca);
265
- }
266
-
267
- ca_attach_n(2, ca, cs);
268
-
269
- ca_paste_loop(ca, offset, offset0, size, cs, 0, idx, idx0);
270
-
271
- if ( ca_has_mask(cs) ) {
272
- ca_paste_loop(ca->mask, offset, offset0, size, cs->mask, 0, idx, idx0);
273
- }
274
-
275
- ca_sync(ca);
276
- ca_detach_n(2, ca, cs);
277
- }
278
-
279
- /* @overload paste (idx, ary)
280
- (Copy) Pastes `ary` to `self` at the index `idx`.
281
- `idx` should be Array object with the length same as `self.ndim`.
282
- `ary` should have same shape with `self`.
283
- */
284
-
285
- static VALUE
286
- rb_ca_paste (VALUE self, VALUE roffset, VALUE rsrc)
330
+ Init_carray_copy (void)
287
331
  {
288
- CArray *ca, *cs;
289
- ca_size_t offset[CA_RANK_MAX];
290
- int i;
291
-
292
- rb_ca_modify(self);
293
-
294
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
295
-
296
- Check_Type(roffset, T_ARRAY);
297
-
298
- if ( RARRAY_LEN(roffset) != ca->ndim ) {
299
- rb_raise(rb_eArgError,
300
- "# of arguments should equal to the ndim");
301
- }
302
-
303
- for (i=0; i<ca->ndim; i++) {
304
- offset[i] = NUM2SIZE(rb_ary_entry(roffset,i));
305
- }
306
-
307
- cs = ca_wrap_readonly(rsrc, ca->data_type);
308
-
309
- ca_paste(ca, offset, cs);
310
-
311
- return self;
312
- }
313
-
314
-
315
- static void
316
- ca_clip_loop (CArray *ca, ca_size_t *offset, ca_size_t *offset0,
317
- ca_size_t *size, CArray *cs,
318
- int32_t level, ca_size_t *idx, ca_size_t *idx0)
319
- {
320
- ca_size_t i;
321
- if ( level == ca->ndim - 1 ) {
322
- idx[level] = offset[level];
323
- idx0[level] = offset0[level];
324
- memcpy(ca_ptr_at_index(cs, idx0), ca_ptr_at_index(ca, idx), size[level]*ca->bytes);
325
- }
326
- else {
327
- for (i=0; i<size[level]; i++) {
328
- idx[level] = offset[level] + i;
329
- idx0[level] = offset0[level] + i;
330
- ca_clip_loop(ca, offset, offset0, size, cs, level+1, idx, idx0);
331
- }
332
- }
333
- }
334
-
335
- /* ------------------------------------------------------------------- */
336
-
337
- void
338
- ca_clip (void *ap, ca_size_t *offset, void *sp)
339
- {
340
- CArray *ca = (CArray *) ap;
341
- CArray *cs = (CArray *) sp;
342
- ca_size_t size[CA_RANK_MAX];
343
- ca_size_t offset0[CA_RANK_MAX];
344
- ca_size_t idx[CA_RANK_MAX];
345
- ca_size_t idx0[CA_RANK_MAX];
346
- int i;
347
-
348
- ca_check_same_data_type(ca, cs);
349
- ca_check_same_ndim(ca, cs);
350
-
351
- for (i=0; i<ca->ndim; i++) {
352
- if ( offset[i] >= 0 ) {
353
- if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
354
- size[i] = ca->dim[i] - offset[i];
355
- }
356
- else {
357
- size[i] = cs->dim[i];
358
- }
359
- offset0[i] = 0;
360
- }
361
- else {
362
- if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
363
- size[i] = ca->dim[i];
364
- }
365
- else {
366
- size[i] = cs->dim[i] + offset[i];
367
- }
368
- offset0[i] = -offset[i];
369
- offset[i] = 0;
370
- }
371
- }
372
-
373
- for (i=0; i<ca->ndim; i++) {
374
- CA_CHECK_INDEX(offset[i], ca->dim[i]);
375
- }
376
-
377
- if ( ca_has_mask(cs) ) {
378
- ca_create_mask(ca);
379
- }
380
-
381
- ca_attach_n(2, ca, cs);
382
-
383
- ca_clip_loop(ca, offset, offset0, size, cs, 0, idx, idx0);
384
-
385
- if ( ca_has_mask(cs) ) {
386
- ca_clip_loop(ca->mask, offset, offset0, size, cs->mask, 0, idx, idx0);
387
- }
388
-
389
- ca_sync(ca);
390
- ca_detach_n(2, ca, cs);
391
- }
392
-
393
- /* @overload clip (idx, ary)
394
- (copy) Clips the data at `idx` from `self` to `ary`.
395
- */
396
-
397
- static VALUE
398
- rb_ca_clip (VALUE self, VALUE roffset, VALUE rsrc)
399
- {
400
- CArray *ca, *cs;
401
- ca_size_t offset[CA_RANK_MAX];
402
- int i;
403
-
404
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
405
-
406
- Check_Type(roffset, T_ARRAY);
407
-
408
- if ( RARRAY_LEN(roffset) != ca->ndim ) {
409
- rb_raise(rb_eArgError,
410
- "# of arguments should equal to the ndim");
411
- }
412
-
413
- for (i=0; i<ca->ndim; i++) {
414
- offset[i] = NUM2SIZE(rb_ary_entry(roffset, i));
415
- }
416
-
417
- cs = ca_wrap_writable(rsrc, ca->data_type);
418
-
419
- ca_clip(ca, offset, cs);
420
-
421
- return rsrc;
422
- }
423
-
424
- /* ------------------------------------------------------------------- */
425
-
426
- void
427
- Init_carray_copy ()
428
- {
429
- /* CArray duplication, conversion */
430
-
431
- rb_define_method(rb_cCArray, "to_ca", rb_ca_copy, 0);
332
+ rb_define_method(rb_cCArray, "to_ca", rb_ca_to_ca, -1);
333
+ rb_define_method(rb_cCArray, "copy", rb_ca_copy, 0);
432
334
  rb_define_method(rb_cCArray, "template", rb_ca_template_method, -1);
433
-
434
- rb_define_method(rb_cCArray, "clip", rb_ca_clip, 2);
435
- rb_define_method(rb_cCArray, "paste", rb_ca_paste, 2);
436
335
  }
437
-