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_numeric.c DELETED
@@ -1,259 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- carray_numeric.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2025 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
- #include "ruby.h"
12
- #include "carray.h"
13
-
14
- VALUE CA_NAN, CA_INF;
15
-
16
- static ID id___or__;
17
- static ID id___and__;
18
- static ID id___xor__;
19
- static ID id___rshift__;
20
- static ID id___lshift__;
21
-
22
- static ID id_bit_or;
23
- static ID id_bit_and;
24
- static ID id_bit_xor;
25
- static ID id_lshift;
26
- static ID id_rshift;
27
-
28
- static VALUE
29
- rb_hack_or(VALUE x, VALUE y)
30
- {
31
- if ( rb_obj_is_carray(y) ) {
32
- if ( rb_ca_is_boolean_type(y) ) {
33
- return rb_funcall(y, id_bit_or, 1, x);
34
- }
35
- else {
36
- #if RUBY_VERSION_CODE >= 190
37
- return rb_num_coerce_bin(x, y, '|');
38
- #else
39
- return rb_num_coerce_bin(x, y);
40
- #endif
41
- }
42
- }
43
- else {
44
- return rb_funcall(x, id___or__, 1, y);
45
- }
46
- }
47
-
48
- static VALUE
49
- rb_hack_and (VALUE x, VALUE y)
50
- {
51
- if ( rb_obj_is_carray(y) ) {
52
- if ( rb_ca_is_boolean_type(y) ) {
53
- return rb_funcall(y, id_bit_and, 1, x);
54
- }
55
- else {
56
- #if RUBY_VERSION_CODE >= 190
57
- return rb_num_coerce_bin(x, y, '&');
58
- #else
59
- return rb_num_coerce_bin(x, y);
60
- #endif
61
- }
62
- }
63
- else {
64
- return rb_funcall(x, id___and__, 1, y);
65
- }
66
- }
67
-
68
- static VALUE
69
- rb_hack_xor (VALUE x, VALUE y)
70
- {
71
- if ( rb_obj_is_carray(y) ) {
72
- if ( rb_ca_is_boolean_type(y) ) {
73
- return rb_funcall(y, id_bit_xor, 1, x);
74
- }
75
- else {
76
- #if RUBY_VERSION_CODE >= 190
77
- return rb_num_coerce_bin(x, y, '^');
78
- #else
79
- return rb_num_coerce_bin(x, y);
80
- #endif
81
- }
82
- }
83
- else {
84
- return rb_funcall(x, id___xor__, 1, y);
85
- }
86
- }
87
-
88
- static VALUE
89
- rb_hack_lshift (VALUE x, VALUE y)
90
- {
91
- if ( rb_obj_is_carray(y) ) {
92
- #if RUBY_VERSION_CODE >= 190
93
- return rb_num_coerce_bin(x, y, id_lshift);
94
- #else
95
- return rb_num_coerce_bin(x, y);
96
- #endif
97
- }
98
- else {
99
- return rb_funcall(x, id___lshift__, 1, y);
100
- }
101
- }
102
-
103
- static VALUE
104
- rb_hack_rshift (VALUE x, VALUE y)
105
- {
106
- if ( rb_obj_is_carray(y) ) {
107
- #if RUBY_VERSION_CODE >= 190
108
- return rb_num_coerce_bin(x, y, id_rshift);
109
- #else
110
- return rb_num_coerce_bin(x, y);
111
- #endif
112
- }
113
- else {
114
- return rb_funcall(x, id___rshift__, 1, y);
115
- }
116
- }
117
-
118
- /* ------------------------------------------------------------------- */
119
-
120
- #ifdef HAVE_COMPLEX_H
121
-
122
- #include <math.h>
123
- #include <float.h>
124
-
125
- #define proc_arg_cmplx(type) \
126
- { \
127
- type *p = (type *) ca->ptr; \
128
- double *q = (double *) co->ptr; \
129
- boolean8_t *m = (ca->mask) ? (boolean8_t *) ca->mask->ptr : NULL; \
130
- ca_size_t i; \
131
- if ( m ) { \
132
- for (i=ca->elements; i; i--, p++, q++) { \
133
- if ( ! *m++ ) \
134
- *q = carg(*p); \
135
- } \
136
- } \
137
- else { \
138
- for (i=ca->elements; i; i--, p++, q++) { \
139
- *q = carg(*p); \
140
- } \
141
- } \
142
- }
143
-
144
- static VALUE
145
- rb_ca_arg (VALUE self)
146
- {
147
- volatile VALUE obj;
148
- CArray *ca, *co;
149
-
150
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
151
-
152
- co = carray_new(CA_FLOAT64, ca->ndim, ca->dim, 0, NULL);
153
- obj = ca_wrap_struct(co);
154
-
155
- if ( ca_has_mask(ca) ) {
156
- ca_copy_mask_overlay(co, co->elements, 1, ca);
157
- }
158
-
159
- ca_attach(ca);
160
-
161
- switch ( ca->data_type ) {
162
- case CA_FLOAT32: proc_arg_cmplx(float32_t); break;
163
- case CA_FLOAT64: proc_arg_cmplx(float64_t); break;
164
- case CA_FLOAT128: proc_arg_cmplx(float128_t); break;
165
- case CA_CMPLX64: proc_arg_cmplx(cmplx64_t); break;
166
- case CA_CMPLX128: proc_arg_cmplx(cmplx128_t); break;
167
- case CA_CMPLX256: proc_arg_cmplx(cmplx256_t); break;
168
- default: rb_raise(rb_eRuntimeError, "invalid data type");
169
- }
170
-
171
- ca_detach(ca);
172
-
173
- return obj;
174
- }
175
-
176
- #endif
177
-
178
- void
179
- Init_carray_numeric ()
180
- {
181
- /* hack Fixnum and Bignum's "|", "&", "^", "<<", ">>" */
182
-
183
- id___or__ = rb_intern("__or__");
184
- id___and__ = rb_intern("__and__");
185
- id___xor__ = rb_intern("__xor__");
186
- id___rshift__ = rb_intern("__rshift__");
187
- id___lshift__ = rb_intern("__lshift__");
188
-
189
- id_bit_or = rb_intern("bit_or");
190
- id_bit_and = rb_intern("bit_and");
191
- id_bit_xor = rb_intern("bit_xor");
192
- id_lshift = rb_intern("<<");
193
- id_rshift = rb_intern(">>");
194
-
195
- CA_NAN = rb_float_new(0.0/0.0);
196
- CA_INF = rb_float_new(1.0/0.0);
197
- rb_define_const(rb_cObject, "CA_NAN", CA_NAN);
198
- rb_define_const(rb_cObject, "CA_INF", CA_INF);
199
-
200
- rb_define_alias(rb_cTrueClass, "__or__", "|");
201
- rb_define_alias(rb_cTrueClass, "__and__", "&");
202
- rb_define_alias(rb_cTrueClass, "__xor__", "^");
203
-
204
- rb_define_method(rb_cTrueClass, "|", rb_hack_or, 1);
205
- rb_define_method(rb_cTrueClass, "&", rb_hack_and, 1);
206
- rb_define_method(rb_cTrueClass, "^", rb_hack_xor, 1);
207
-
208
- rb_define_alias(rb_cFalseClass, "__or__", "|");
209
- rb_define_alias(rb_cFalseClass, "__and__", "&");
210
- rb_define_alias(rb_cFalseClass, "__xor__", "^");
211
-
212
- rb_define_method(rb_cFalseClass, "|", rb_hack_or, 1);
213
- rb_define_method(rb_cFalseClass, "&", rb_hack_and, 1);
214
- rb_define_method(rb_cFalseClass, "^", rb_hack_xor, 1);
215
-
216
- #if RUBY_VERSION_CODE >= 240
217
- rb_define_alias(rb_cInteger, "__or__", "|");
218
- rb_define_alias(rb_cInteger, "__and__", "&");
219
- rb_define_alias(rb_cInteger, "__xor__", "^");
220
- rb_define_alias(rb_cInteger, "__lshift__", "<<");
221
- rb_define_alias(rb_cInteger, "__rshift__", ">>");
222
-
223
- rb_define_method(rb_cInteger, "|", rb_hack_or, 1);
224
- rb_define_method(rb_cInteger, "&", rb_hack_and, 1);
225
- rb_define_method(rb_cInteger, "^", rb_hack_xor, 1);
226
- rb_define_method(rb_cInteger, "<<", rb_hack_lshift, 1);
227
- rb_define_method(rb_cInteger, ">>", rb_hack_rshift, 1);
228
- #else
229
- rb_define_alias(rb_cFixnum, "__or__", "|");
230
- rb_define_alias(rb_cFixnum, "__and__", "&");
231
- rb_define_alias(rb_cFixnum, "__xor__", "^");
232
- rb_define_alias(rb_cFixnum, "__lshift__", "<<");
233
- rb_define_alias(rb_cFixnum, "__rshift__", ">>");
234
-
235
- rb_define_alias(rb_cBignum, "__or__", "|");
236
- rb_define_alias(rb_cBignum, "__and__", "&");
237
- rb_define_alias(rb_cBignum, "__xor__", "^");
238
- rb_define_alias(rb_cBignum, "__lshift__", "<<");
239
- rb_define_alias(rb_cBignum, "__rshift__", ">>");
240
-
241
- rb_define_method(rb_cFixnum, "|", rb_hack_or, 1);
242
- rb_define_method(rb_cFixnum, "&", rb_hack_and, 1);
243
- rb_define_method(rb_cFixnum, "^", rb_hack_xor, 1);
244
- rb_define_method(rb_cFixnum, "<<", rb_hack_lshift, 1);
245
- rb_define_method(rb_cFixnum, ">>", rb_hack_rshift, 1);
246
-
247
- rb_define_method(rb_cBignum, "|", rb_hack_or, 1);
248
- rb_define_method(rb_cBignum, "&", rb_hack_and, 1);
249
- rb_define_method(rb_cBignum, "^", rb_hack_xor, 1);
250
- rb_define_method(rb_cBignum, "<<", rb_hack_lshift, 1);
251
- rb_define_method(rb_cBignum, ">>", rb_hack_rshift, 1);
252
- #endif
253
-
254
- #ifdef HAVE_COMPLEX_H
255
- rb_define_method(rb_cCArray, "arg", rb_ca_arg, 0);
256
- #endif
257
-
258
- }
259
-
@@ -1,254 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- carray_sort_addr.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2025 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
- #include "ruby.h"
12
- #include "carray.h"
13
- #include <math.h>
14
-
15
- /* ----------------------------------------------------------------- */
16
-
17
- typedef int (*ca_qsort_cmp_func)();
18
-
19
- #define qcmp_type(type) \
20
- static int \
21
- qcmp_## type (type *a, type *b) \
22
- { \
23
- if ( *a > *b ) return 1; \
24
- if ( *a < *b ) return -1; \
25
- return 0; \
26
- }
27
-
28
- #define qcmp_f_type(type) \
29
- static int \
30
- qcmp_## type (type *a, type *b) \
31
- { \
32
- if ( isnan(*a) && ( ! isnan(*b) ) ) return 1; \
33
- if ( isnan(*b) && ( ! isnan(*a) ) ) return -1; \
34
- if ( *a > *b ) return 1; \
35
- if ( *a < *b ) return -1; \
36
- return 0; \
37
- }
38
-
39
- static int
40
- qcmp_data (char *a, char *b, ca_size_t bytes)
41
- {
42
- int cmp;
43
- cmp = memcmp(a, b, bytes);
44
- if ( cmp != 0 ) return cmp;
45
- return 0;
46
- }
47
-
48
- static int
49
- qcmp_VALUE (VALUE *a, VALUE *b)
50
- {
51
- int cmp;
52
- cmp = NUM2INT(rb_funcall(*a, rb_intern("<=>"), 1, *b));
53
- if ( cmp != 0 ) return cmp;
54
- return 0;
55
- }
56
-
57
- qcmp_type(boolean8_t)
58
- qcmp_type(int8_t)
59
- qcmp_type(uint8_t)
60
- qcmp_type(int16_t)
61
- qcmp_type(uint16_t)
62
- qcmp_type(int32_t)
63
- qcmp_type(uint32_t)
64
- qcmp_type(int64_t)
65
- qcmp_type(uint64_t)
66
- qcmp_f_type(float32_t)
67
- qcmp_f_type(float64_t)
68
- qcmp_f_type(float128_t)
69
-
70
- static int
71
- qcmp_not_implement (void *a, void *b)
72
- {
73
- rb_raise(rb_eNotImpError,
74
- "compare function is not implemented for the data type");
75
- }
76
-
77
- static ca_qsort_cmp_func
78
- ca_qsort_cmp[CA_NTYPE] = {
79
- qcmp_data,
80
- qcmp_boolean8_t,
81
- qcmp_int8_t,
82
- qcmp_uint8_t,
83
- qcmp_int16_t,
84
- qcmp_uint16_t,
85
- qcmp_int32_t,
86
- qcmp_uint32_t,
87
- qcmp_int64_t,
88
- qcmp_uint64_t,
89
- qcmp_float32_t,
90
- qcmp_float64_t,
91
- qcmp_float128_t,
92
- qcmp_not_implement,
93
- qcmp_not_implement,
94
- qcmp_not_implement,
95
- qcmp_VALUE,
96
- };
97
-
98
- /* ----------------------------------------------------------------- */
99
-
100
- struct cmp_base {
101
- int n;
102
- CArray **ca;
103
- };
104
-
105
- struct cmp_data {
106
- ca_size_t i;
107
- struct cmp_base *base;
108
- };
109
-
110
- static int
111
- qcmp_func (struct cmp_data *a, struct cmp_data *b)
112
- {
113
- struct cmp_base *base = a->base;
114
- int n = base->n;
115
- CArray **ca = base->ca;
116
- ca_size_t ia = a->i;
117
- ca_size_t ib = b->i;
118
- int result;
119
- int i;
120
- for (i=0; i<n; i++) {
121
- int8_t data_type = ca[i]->data_type;
122
- char *ptr = ca[i]->ptr;
123
- boolean8_t *m = ( ca[i]->mask ) ? (boolean8_t *) ca[i]->mask->ptr : NULL;
124
- ca_size_t bytes = ca[i]->bytes;
125
- if ( ( ! m ) ||
126
- ( ( ! m[ia] ) && ( ! m[ib] ) ) ) {
127
- if ( data_type == CA_FIXLEN ) {
128
- result = ca_qsort_cmp[CA_FIXLEN](ptr + ia*bytes,
129
- ptr + ib*bytes, bytes);
130
- }
131
- else {
132
- result = ca_qsort_cmp[data_type](ptr + ia*bytes,
133
- ptr + ib*bytes);
134
- }
135
- }
136
- else if ( ( ! m[ia] ) && ( m[ib] ) ) {
137
- result = -1;
138
- }
139
- else if ( ( m[ia] ) && ( ! m[ib] ) ) {
140
- result = 1;
141
- }
142
- else {
143
- result = 0;
144
- }
145
- if ( result ) {
146
- return result;
147
- }
148
- }
149
- return ( ia > ib ) ? 1 : -1; /* for stable sort */
150
- }
151
-
152
- /* @overload sort_addr (*args)
153
-
154
- (Sort) Returns index table for index sort
155
-
156
- idx = CA.sort_addr(a, b, c) ### priority a > b > c
157
- a[idx]
158
- b[idx]
159
- c[idx]
160
- */
161
-
162
- static VALUE
163
- rb_ca_s_sort_addr (int argc, VALUE *argv, VALUE self)
164
- {
165
- volatile VALUE out;
166
- CArray *co;
167
- struct cmp_base *base;
168
- struct cmp_data *data;
169
- ca_size_t elements;
170
- ca_size_t *q;
171
- int j;
172
- ca_size_t i;
173
-
174
- if ( argc <= 0 ) {
175
- rb_raise(rb_eArgError, "no arg given");
176
- }
177
-
178
- rb_check_carray_object(argv[0]);
179
- elements = NUM2SIZE(rb_ca_elements(argv[0]));
180
-
181
- for (j=0; j<argc; j++) {
182
- rb_check_carray_object(argv[j]);
183
- if ( elements != NUM2SIZE(rb_ca_elements(argv[j])) ) {
184
- rb_raise(rb_eArgError, "elements mismatch");
185
- }
186
- }
187
-
188
- base = malloc_with_check(sizeof(struct cmp_base));
189
- base->n = argc;
190
- base->ca = malloc_with_check(sizeof(CArray *)*base->n);
191
-
192
- for (j=0; j<argc; j++) {
193
- CArray *ca;
194
- TypedData_Get_Struct(argv[j], CArray, &carray_data_type, ca);
195
- base->ca[j] = ca;
196
- ca_attach(ca);
197
- }
198
-
199
- data = malloc_with_check(sizeof(struct cmp_data)*elements);
200
- for (i=0; i<elements; i++) {
201
- data[i].i = i;
202
- data[i].base = base;
203
- }
204
-
205
- #ifdef HAVE_MERGESORT
206
- mergesort(data, elements, sizeof(struct cmp_data),
207
- (int (*)(const void*,const void*)) qcmp_func);
208
- #else
209
- qsort(data, elements, sizeof(struct cmp_data),
210
- (int (*)(const void*,const void*)) qcmp_func);
211
- #endif
212
-
213
- out = rb_ca_template_with_type(argv[0], INT2NUM(CA_SIZE), INT2NUM(0));
214
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
215
- q = (ca_size_t *) co->ptr;
216
-
217
- for (i=0; i<elements; i++) {
218
- *q = data[i].i;
219
- q++;
220
- }
221
-
222
- for (j=0; j<argc; j++) {
223
- ca_detach(base->ca[j]);
224
- }
225
-
226
- free(data);
227
- free(base->ca);
228
- free(base);
229
-
230
- return out;
231
- }
232
-
233
- /* @overload sort_addr (*args)
234
-
235
- (Sort) Returns index table for index sort
236
- This method same as,
237
-
238
- idx = CA.sort_addr(self, *args)
239
- */
240
-
241
- static VALUE
242
- rb_ca_sort_addr (int argc, VALUE *argv, VALUE self)
243
- {
244
- VALUE list = rb_ary_new4(argc, argv);
245
- rb_ary_unshift(list, self);
246
- return rb_apply(rb_mCA, rb_intern("sort_addr"), list);
247
- }
248
-
249
- void
250
- Init_carray_sort_addr ()
251
- {
252
- rb_define_singleton_method(rb_mCA, "sort_addr", rb_ca_s_sort_addr, -1);
253
- rb_define_method(rb_cCArray, "sort_addr", rb_ca_sort_addr, -1);
254
- }