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,481 @@
1
+ # Frequently-used CArray convenience methods kept eager-loaded.
2
+ #
3
+ # Rationale: a method lands here NOT because of its topic / domain (those
4
+ # have their own files such as compose.rb / math.rb / datetime.rb, many of
5
+ # them autoloaded) but because it is reached often enough that the
6
+ # lazy-autoload indirection is not worth it. These methods are NOT
7
+ # load-bearing -- the core works without them; that distinguishes this file
8
+ # from carray/runtime.rb (which holds the support the core depends on).
9
+ #
10
+ # Keep this file small and obvious. If a method is domain-specific or only
11
+ # occasionally used, it belongs in its topic file (autoloaded when possible),
12
+ # not here.
13
+
14
+ class CArray
15
+
16
+ # reshape / flatten / transpose! are defined in C
17
+ # (ext/ca_obj_refer.c and ext/ca_obj_transpose.c). The bare size-1
18
+ # insertion primitive is `__insert_axis_size1__` (C); `insert_axis` below
19
+ # is the user-facing method that owns the name and adds `repeat:`.
20
+
21
+ # @overload insert_axis(*positions, repeat: nil)
22
+ # Returns a view of `self` with one or more new axes inserted,
23
+ # optionally repeating along them.
24
+ #
25
+ # Each entry of `positions` names the source axis the new axis
26
+ # goes *before*. `ndim` (one past the last axis) appends at the
27
+ # end; negative positions count from the end. Repeating the same
28
+ # position inserts several axes before that axis, in argument
29
+ # order. Positions are in the *source* frame, so they do not
30
+ # shift as other axes are inserted (e.g. `insert_axis(0, 1, 2)`
31
+ # puts one axis before each of the first three source axes).
32
+ #
33
+ # Each inserted axis takes one of two forms, chosen by its
34
+ # `repeat` value: `1` (or `nil`) for a plain size-1 axis, or an
35
+ # Integer `N > 1` for a read-only bound repeat view. `repeat` is
36
+ # either a single value applied to every inserted axis, or an
37
+ # Array giving one value per position.
38
+ #
39
+ # The everyday way to add an axis is the `:_` indexer when the
40
+ # shape is known at the call site; `insert_axis` is for library
41
+ # code that builds the axis list programmatically.
42
+ #
43
+ # @param positions [Array<Integer>] source-frame positions of the
44
+ # new axes.
45
+ # @param repeat [Integer, Array, nil] repeat spec applied to each
46
+ # inserted axis.
47
+ # @return [CArray] view with the new axes inserted.
48
+ # @example
49
+ # a = CArray.int32(3, 4).seq
50
+ # a.insert_axis(0) # shape (1, 3, 4)
51
+ # a.insert_axis(1, repeat: 5) # shape (3, 5, 4)
52
+ # a.insert_axis(0, 1, repeat: [1, 3]) # size-1 then bound
53
+ def insert_axis (*positions, repeat: nil)
54
+ flat = positions.flatten
55
+ if flat.empty?
56
+ raise ArgumentError, "insert_axis: at least one position is required"
57
+ end
58
+
59
+ # No repeat: -> plain size-1 insertion. The source-frame C primitive
60
+ # handles normalization, range check and multiplicity directly.
61
+ return __insert_axis_size1__(*flat) if repeat.nil?
62
+
63
+ # Source frame: each position names the source axis the new axis goes
64
+ # before. Gaps live in [0, ndim] (ndim = append at end); negatives count
65
+ # from the end gap. Duplicates are allowed (several axes before one
66
+ # source axis), kept in argument order.
67
+ gaps = flat.map { |p| CArray.normalize_axis(p, ndim + 1, "insert_axis") }
68
+
69
+ # One repeat value per position, in argument order.
70
+ reps =
71
+ case repeat
72
+ when Array
73
+ unless repeat.length == flat.length
74
+ raise ArgumentError,
75
+ "insert_axis: repeat array length (#{repeat.length}) " \
76
+ "must match number of positions (#{flat.length})"
77
+ end
78
+ repeat
79
+ else
80
+ Array.new(flat.length, repeat)
81
+ end
82
+
83
+ # Validate each value. A positive Integer only; nil is not a valid
84
+ # per-axis repeat.
85
+ reps.each do |r|
86
+ unless r.is_a?(Integer)
87
+ raise ArgumentError,
88
+ "insert_axis: repeat must be a positive Integer, got #{r.inspect}"
89
+ end
90
+ raise ArgumentError, "insert_axis: repeat count must be >= 1" if r < 1
91
+ end
92
+
93
+ # Final output layout: stable order by (gap, argument index) keeps
94
+ # same-gap axes in argument order; the k-th inserted axis lands at output
95
+ # position gap + k. This output position only drives broadcast_to; the
96
+ # insertion itself always goes through the source-frame primitive.
97
+ order = (0...flat.length).sort_by { |i| [gaps[i], i] }
98
+ final = {}
99
+ order.each_with_index { |i, k| final[i] = gaps[i] + k }
100
+
101
+ inter = __insert_axis_size1__(*order.map { |i| gaps[i] })
102
+ return inter unless order.any? { |i| reps[i] > 1 }
103
+
104
+ shp = inter.shape
105
+ order.each { |i| shp[final[i]] = reps[i] if reps[i] > 1 }
106
+ inter.broadcast_to(*shp)
107
+ end
108
+
109
+ # @overload drop_axis
110
+ # Returns a view of `self` with every size-1 axis dropped.
111
+ # @return [CArray] view with reduced `ndim`.
112
+ def drop_axis
113
+ if ndim == 1
114
+ return self[]
115
+ else
116
+ newdim = shape.reject{|x| x == 1 }
117
+ return ( ndim != newdim.size ) ? reshape(*newdim) : self[]
118
+ end
119
+ end
120
+
121
+ # @overload address
122
+ # Returns an int32 CArray of the same shape as `self` where each
123
+ # cell holds its row-major flat address.
124
+ # @return [CArray]
125
+ def address
126
+ return CArray.int32(*shape).seq!
127
+ end
128
+
129
+ # @overload false
130
+ # Returns a boolean CArray of the same shape as `self` filled
131
+ # with `false`.
132
+ # @return [CArray]
133
+ def false ()
134
+ return template(:boolean)
135
+ end
136
+
137
+ # @overload true
138
+ # Returns a boolean CArray of the same shape as `self` filled
139
+ # with `true`.
140
+ # @return [CArray]
141
+ def true ()
142
+ return template(:boolean) { 1 }
143
+ end
144
+
145
+ # Sub-region copy (paste / crop), the old C `ca_paste` / `ca_clip` pair.
146
+ # `clip` is reserved for value clamping (clamp to a min/max range), so
147
+ # the read-out side is `crop`. Kept together as a pair (crop is rare, but paste is reached
148
+ # often -- concatenate / mosaic / resize / bit_string all use it). Both
149
+ # accept negative offsets.
150
+
151
+ # @overload paste(offset, src)
152
+ # Sets `self` at `offset` by copying `src`. Out-of-bounds cells
153
+ # (`src` extending past `self`'s edge or before its origin) are
154
+ # silently dropped via CAWindow's interior-only PUT scatter.
155
+ # @param offset [Array<Integer>] starting indices, length equal
156
+ # to `self.ndim`.
157
+ # @param src [CArray] source array.
158
+ # @return [self]
159
+ # @raise [ArgumentError] when `offset.length != self.ndim`.
160
+ def paste (offset, src)
161
+ raise ArgumentError, "offset length must equal ndim" if offset.length != ndim
162
+ ranges = offset.each_with_index.map { |o, i| o...(o + src.shape[i]) }
163
+ self.window(*ranges)[] = src
164
+ self
165
+ end
166
+
167
+ # @overload crop(offset, dst)
168
+ # Reads a `dst.shape`-sized region from `self` starting at
169
+ # `offset` into `dst`. Cells whose read position falls outside
170
+ # `self` leave the corresponding `dst` cells untouched.
171
+ # @param offset [Array<Integer>] source starting indices, length
172
+ # equal to `self.ndim`.
173
+ # @param dst [CArray] destination array; mutated in place.
174
+ # @return [CArray] `dst`.
175
+ # @raise [ArgumentError] when `offset.length != self.ndim`.
176
+ def crop (offset, dst)
177
+ raise ArgumentError, "offset length must equal ndim" if offset.length != ndim
178
+ src_ranges = []
179
+ dst_ranges = []
180
+ ndim.times do |i|
181
+ s_lo = [offset[i], 0].max
182
+ s_hi = [offset[i] + dst.shape[i], shape[i]].min
183
+ return dst if s_lo >= s_hi
184
+ src_ranges << (s_lo...s_hi)
185
+ dst_ranges << ((s_lo - offset[i])...(s_hi - offset[i]))
186
+ end
187
+ dst[*dst_ranges] = self[*src_ranges]
188
+ dst
189
+ end
190
+
191
+ # @overload lookup(table, fill_value = nil, lfill: nil, ufill: nil)
192
+ # Returns values gathered from `table` at the indices given by
193
+ # `self`. Equivalent to `table.project(self, lfill, ufill)` with
194
+ # the receiver / first argument swapped so the index reads as
195
+ # the subject. `fill_value` is sugar for symmetric dual-fill;
196
+ # `lfill` / `ufill` override per side (`UNDEF` or `nil` masks
197
+ # that end), following the `project` vocabulary.
198
+ # @param table [CArray] value table indexed by `self`.
199
+ # @param fill_value [Object, nil] symmetric fill for below- and
200
+ # above-range indices.
201
+ # @param lfill [Object, nil] override for below-range fill.
202
+ # @param ufill [Object, nil] override for above-range fill.
203
+ # @return [CArray] gathered values with the shape of `self`.
204
+ def lookup(table, fill_value=nil, lfill: nil, ufill: nil)
205
+ lfill = fill_value if lfill.nil?
206
+ ufill = fill_value if ufill.nil?
207
+ table.project(self, lfill, ufill)
208
+ end
209
+
210
+ # @overload <=>(other)
211
+ # Returns an element-wise 3-way comparison: `+1` where
212
+ # `self > other`, `-1` where `self < other`, `0` where equal.
213
+ # Output `data_type` is `CA_INT8`.
214
+ # @param other [CArray, Numeric] operand to compare against.
215
+ # @return [CArray]
216
+ def <=> (other)
217
+ (self > other).as_int8 - (self < other).as_int8
218
+ end
219
+
220
+ alias cmp <=>
221
+
222
+ # @!group Elementwise math
223
+
224
+ # Returns `[quotient, remainder]` element-wise.
225
+ #
226
+ # The quotient is floored toward -inf, so `q * other + r == self` holds
227
+ # for every sign combination -- the pair Ruby's `Integer#divmod` and
228
+ # `Float#divmod` return. For integers that is `self / other` unchanged;
229
+ # for floats `/` is true division, so the quotient is floored here.
230
+ #
231
+ # @param other [CArray, Numeric] divisor.
232
+ # @return [Array<CArray>] the floored quotient and the remainder.
233
+ # @raise [ArgumentError] for complex arrays, which have no ordering to
234
+ # floor toward.
235
+ # @example
236
+ # CA_INT32([-7]).divmod(3) # => [-3, 2]
237
+ # CA_DOUBLE([-7.0]).divmod(3.0) # => [-3.0, 2.0]
238
+ def divmod(other)
239
+ if complex?
240
+ raise ArgumentError, "divmod is not defined for complex arrays"
241
+ end
242
+ q = self / other
243
+ q = q.floor unless q.integer?
244
+ [q, self % other]
245
+ end
246
+
247
+ # @!endgroup
248
+
249
+ # @overload clip(min, max = nil, fill_value = nil, lfill: nil, ufill: nil)
250
+ # Returns `self` with every element clamped to `[min, max]`.
251
+ #
252
+ # Either bound may be `nil` for a one-sided clip; that side
253
+ # dispatches to the `pmax` / `pmin` binop kernels. When
254
+ # `fill_value` (or `lfill` / `ufill`) is given, out-of-range
255
+ # cells are replaced by the fill instead of clamped -- pass
256
+ # `UNDEF` to mask that end. `fill_value` is sugar for symmetric
257
+ # dual-fill; `lfill` / `ufill` override per side.
258
+ #
259
+ # Boundary is strict `[min, max]`: values equal to a bound
260
+ # remain unchanged in both the clamped and filled variants.
261
+ #
262
+ # @param min [Numeric, nil] lower bound; `nil` for one-sided
263
+ # clip above.
264
+ # @param max [Numeric, nil] upper bound; `nil` for one-sided
265
+ # clip below.
266
+ # @param fill_value [Object, nil] symmetric fill for
267
+ # out-of-range cells.
268
+ # @param lfill [Object, nil] override below-range fill.
269
+ # @param ufill [Object, nil] override above-range fill.
270
+ # @return [CArray] new CArray with clamped or filled values.
271
+ # @raise [ArgumentError] when both `min` and `max` are `nil`.
272
+ # @example
273
+ # a.clip(0, 10) # strict clamp
274
+ # a.clip(0, 10, -1) # both ends -> -1
275
+ # a.clip(0, 10, lfill: UNDEF, ufill: 99) # below masks
276
+ def clip(min, max=nil, fill_value=nil, lfill: nil, ufill: nil)
277
+ if min.nil? && max.nil?
278
+ raise ArgumentError, "clip: at least one of (min, max) must be given"
279
+ end
280
+
281
+ # `fill_value` as a single argument is sugar applied to both ends; kwargs override.
282
+ lfill = fill_value if lfill.nil?
283
+ ufill = fill_value if ufill.nil?
284
+
285
+ if lfill.nil? && ufill.nil?
286
+ return __clip_ki__(min, max) if !min.nil? && !max.nil?
287
+ return pmax(min) if max.nil?
288
+ return pmin(max)
289
+ end
290
+
291
+ out = self.copy
292
+ out[:lt, min] = lfill unless min.nil? || lfill.nil?
293
+ out[:gt, max] = ufill unless max.nil? || ufill.nil?
294
+ out
295
+ end
296
+
297
+ # `contains` was retired in favour of {#is_in} (value-hash membership).
298
+ # `a.contains(v1, v2)` -> `a.is_in([v1, v2])`;
299
+ # `a.contains(v1, v2, axis: k)` -> `a.is_in([v1, v2]).any(axis: k)`.
300
+ # See carray/methods/is_in.rb. Note is_in collapses NaN (a NaN cell is in a
301
+ # set containing NaN), whereas contains (self.eq) never matched NaN.
302
+
303
+ # `windows` (the sliding-window iterator entry) lives in
304
+ # carray/window_iterator.rb, autoloaded on first use.
305
+
306
+ # ---------------------------------------------------------------------------
307
+ # Sequence fill over a range (span / span!) and a linear interval
308
+ # (scale / scale!).
309
+ # ---------------------------------------------------------------------------
310
+
311
+ # @overload span!(range)
312
+ # Sets `self` to a linear sequence over `range`, with the step
313
+ # chosen so that `range.end` (or `range.end` when the range is
314
+ # exclusive-end, treated as the limit not reached) determines the
315
+ # endpoint. Concretely:
316
+ #
317
+ # - inclusive range `a..b`: `self[0] == a`, `self[-1] == b`,
318
+ # intermediate values are evenly spaced.
319
+ # - exclusive range `a...b`: `self[0] == a`, `self[-1] == a + (N-1)
320
+ # * (b-a)/N` (endpoint `b` is not reached).
321
+ #
322
+ # Only **float** arrays are supported. Integer arrays raise —
323
+ # "N evenly-spaced integers" is not a well-defined concept; the
324
+ # error message shows the two idioms that cover the two distinct
325
+ # integer use cases:
326
+ #
327
+ # - (A) N points with both endpoints hitting `a` and `b` exactly
328
+ # (linspace-like): use the manual integer form
329
+ # `CArray.int32(N).seq * (b - a) / (N - 1) + a`, or sample as
330
+ # float then cast: `CArray.float64(N).span(a.to_f..b.to_f).int32`.
331
+ # - (B) N labels distributed uniformly over the value range so
332
+ # each of the `(b - a + 1)` values appears approximately the
333
+ # same number of times (bucket distribution): use
334
+ # `CArray.int32(N).seq * (b - a + 1) / N + a`.
335
+ #
336
+ # @param range [Range<Numeric>] value range to span.
337
+ # @return [self]
338
+ # @raise [ArgumentError] when `self` is not a float array.
339
+ def span! (range)
340
+ unless float?
341
+ raise ArgumentError,
342
+ "span!: integer arrays are ambiguous — 'N evenly-spaced " \
343
+ "integers' has two distinct meanings. Pick the one you want:\n" \
344
+ " (A) N points hitting both endpoints exactly (linspace-like):\n" \
345
+ " CArray.int32(N).seq * (b - a) / (N - 1) + a\n" \
346
+ " or CArray.float64(N).span(a.to_f..b.to_f).int32\n" \
347
+ " (B) N labels distributed uniformly over range values:\n" \
348
+ " CArray.int32(N).seq * (b - a + 1) / N + a"
349
+ end
350
+ first = range.begin.to_r
351
+ last = range.end.to_r
352
+ step = range.exclude_end? ? (last-first)/elements : (last-first)/(elements-1)
353
+ seq!(first, step)
354
+ return self
355
+ end
356
+
357
+ # @overload span(range)
358
+ # Returns a fresh CArray shaped like `self` filled with the
359
+ # linear sequence produced by {#span!}. Float arrays only.
360
+ # @param range [Range<Numeric>] value range to span.
361
+ # @return [CArray]
362
+ # @raise [ArgumentError] when `self` is not a float array.
363
+ def span (range)
364
+ return template.span!(range)
365
+ end
366
+
367
+ # @overload scale!(xa, xb)
368
+ # Sets `self` to `elements` evenly spaced float64 values from
369
+ # `xa` to `xb` inclusive.
370
+ # @param xa [Numeric] first value.
371
+ # @param xb [Numeric] last value.
372
+ # @return [self]
373
+ def scale! (xa, xb)
374
+ xa = xa.to_f
375
+ xb = xb.to_f
376
+ seq!(xa, (xb-xa)/(elements-1))
377
+ end
378
+
379
+ # @overload scale(xa, xb)
380
+ # Returns a fresh CArray shaped like `self` holding `elements`
381
+ # evenly spaced values from `xa` to `xb` inclusive.
382
+ # @param xa [Numeric] first value.
383
+ # @param xb [Numeric] last value.
384
+ # @return [CArray]
385
+ def scale (xa, xb)
386
+ template.scale!(xa, xb)
387
+ end
388
+
389
+ end
390
+
391
+ # ---------------------------------------------------------------------------
392
+ # Container -> CArray coercion (relocated from former basic.rb)
393
+ # ---------------------------------------------------------------------------
394
+
395
+ class Array
396
+
397
+ # @overload to_ca(writable: false)
398
+ # Returns `self` coerced into a `CA_OBJECT` CArray of matching
399
+ # shape.
400
+ #
401
+ # The result is a freshly built array that shares nothing with the
402
+ # receiver, so `writable: true` — a demand for a result whose writes
403
+ # reach the source — is refused.
404
+ # @return [CArray]
405
+ # @raise [RuntimeError] when `writable: true` is given.
406
+ def to_ca(writable: false)
407
+ if writable
408
+ raise "#{self.class}#to_ca builds a new array; " \
409
+ "it can't satisfy `writable: true'"
410
+ end
411
+ return CA_OBJECT(self)
412
+ end
413
+ end
414
+
415
+ # Reopened to add {#to_ca}, so a Range can be handed to any CArray entry
416
+ # point that coerces its operand (`CArray.cast`, `wrap_readonly`, `meshgrid`).
417
+ class Range
418
+
419
+ # @overload to_ca(writable: false)
420
+ # Returns the members of `self` as a 1-D `CA_OBJECT` CArray.
421
+ #
422
+ # Enumeration follows Ruby, so a Float range raises (`TypeError`,
423
+ # not iterable) and an endless range raises (`RangeError`); use
424
+ # {CArray.linspace} or `span!` for a float axis. A descending
425
+ # integer range is the one departure: it counts down
426
+ # (`(3..0).to_ca` gives `[3, 2, 1, 0]`, not the empty array
427
+ # `(3..0).to_a` gives), so that it agrees with the cast form
428
+ # `CA_INT32(3..0)`.
429
+ #
430
+ # As with {Array#to_ca} the result is newly built, so `writable: true`
431
+ # is refused.
432
+ #
433
+ # @return [CArray]
434
+ # @raise [RuntimeError] when `writable: true` is given.
435
+ def to_ca(writable: false)
436
+ if writable
437
+ raise "#{self.class}#to_ca builds a new array; " \
438
+ "it can't satisfy `writable: true'"
439
+ end
440
+ first, last = self.begin, self.end
441
+ if first.is_a?(Integer) and last.is_a?(Integer) and first > last
442
+ return CA_OBJECT(self, 1) # step 1: signed arange
443
+ end
444
+ return CA_OBJECT(self)
445
+ end
446
+ end
447
+
448
+ # Reopened to add {#to_ca}, so a stepped sequence can be handed to any CArray
449
+ # entry point that coerces its operand.
450
+ class Enumerator::ArithmeticSequence
451
+
452
+ # @overload to_ca(writable: false)
453
+ # Returns the members of `self` as a 1-D `CA_OBJECT` CArray, so that
454
+ # a strided axis can be written `(0..10).step(2)` or `(0.0..1.0).step(0.25)`.
455
+ #
456
+ # An endless sequence is rejected up front: unlike an endless Range,
457
+ # which `RangeError`s, enumerating one runs forever. As with
458
+ # {Range#to_ca}, descending integer bounds count down rather than
459
+ # coming back empty.
460
+ #
461
+ # As with {Array#to_ca} the result is newly built, so `writable: true`
462
+ # is refused.
463
+ #
464
+ # @return [CArray]
465
+ # @raise [RangeError] when the sequence has no end.
466
+ # @raise [RuntimeError] when `writable: true` is given.
467
+ def to_ca(writable: false)
468
+ if writable
469
+ raise "#{self.class}#to_ca builds a new array; " \
470
+ "it can't satisfy `writable: true'"
471
+ end
472
+ first, last, by = self.begin, self.end, self.step
473
+ if last.nil?
474
+ raise RangeError, "cannot convert endless arithmetic sequence to an array"
475
+ end
476
+ if first.is_a?(Integer) and last.is_a?(Integer) and by > 0 and first > last
477
+ return CA_OBJECT(Range.new(first, last, exclude_end?), by)
478
+ end
479
+ return CA_OBJECT(to_a)
480
+ end
481
+ end