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,76 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ CABinCmp dispatch: routes a bincmp op id (`CA_BINCMP_*`) to the
4
+ per-data_type kernel, and computes the input promotion type for the
5
+ two operands.
6
+
7
+ Sibling of ca_obj_bincmp.c (the CABinCmp view), ca_moncmp_dispatch.c
8
+ (unary counterpart), and ca_binop_dispatch.c (arithmetic binop
9
+ family). Per-data_type kernel tables are declared in
10
+ ca_bincmp_dispatch.h.
11
+
12
+ The bincmp kernels assume both operands already share data_type. The
13
+ CABinCmp builder inserts a CAMonOp(`:cast_<common>`) before reaching
14
+ CABinCmp so both operands arrive at the common (promoted) type. Use
15
+ `ca_bincmp_kernel_input_data_types` to obtain that common type.
16
+
17
+ Dispatched ops (all kernels return CArray<:bool>):
18
+ CA_BINCMP_LT -> ca_bincmp_lt [dt] ( < )
19
+ CA_BINCMP_GT -> ca_bincmp_gt [dt] ( > )
20
+ CA_BINCMP_LE -> ca_bincmp_le [dt] ( <= )
21
+ CA_BINCMP_GE -> ca_bincmp_ge [dt] ( >= )
22
+ CA_BINCMP_EQ -> ca_bincmp_eq [dt] ( == )
23
+ CA_BINCMP_NE -> ca_bincmp_ne [dt] ( != )
24
+ CA_BINCMP_FEQ -> ca_bincmp_feq [dt] (float equality with
25
+ a built-in tolerance)
26
+ CA_BINCMP_IS_CLOSE -> ca_bincmp_is_close [dt] (|a - b| <= tol)
27
+ CA_BINCMP_IS_EQUIV -> ca_bincmp_is_equiv [dt] (is_close with
28
+ relative tolerance)
29
+
30
+ ---------------------------------------------------------------------------- */
31
+
32
+ #include "carray.h"
33
+ #include "ca_bincmp_dispatch.h"
34
+
35
+ /* ------------------------------------------------------------------- */
36
+ /* bincmp kernel lookup */
37
+ /* ------------------------------------------------------------------- */
38
+
39
+ ca_bincmp_func_t
40
+ ca_bincmp_kernel_lookup (uint16_t op_id, int8_t common_dt)
41
+ {
42
+ switch (op_id) {
43
+ case CA_BINCMP_LT: return ca_bincmp_lt [common_dt];
44
+ case CA_BINCMP_GT: return ca_bincmp_gt [common_dt];
45
+ case CA_BINCMP_LE: return ca_bincmp_le [common_dt];
46
+ case CA_BINCMP_GE: return ca_bincmp_ge [common_dt];
47
+ case CA_BINCMP_EQ: return ca_bincmp_eq [common_dt];
48
+ case CA_BINCMP_NE: return ca_bincmp_ne [common_dt];
49
+ case CA_BINCMP_FEQ: return ca_bincmp_feq [common_dt];
50
+ case CA_BINCMP_IS_CLOSE: return ca_bincmp_is_close [common_dt];
51
+ case CA_BINCMP_IS_EQUIV: return ca_bincmp_is_equiv [common_dt];
52
+ default: return NULL;
53
+ }
54
+ }
55
+
56
+ /* ------------------------------------------------------------------- */
57
+ /* Input promotion: both operands cast to common data_type before the */
58
+ /* kernel runs. bincmp output is always boolean and independent of */
59
+ /* operand types. */
60
+ /* ------------------------------------------------------------------- */
61
+
62
+ int8_t
63
+ ca_lazy_bincmp_promote (uint16_t op_id, int8_t l_dt, int8_t r_dt)
64
+ {
65
+ (void) op_id;
66
+ return (int8_t) ca_promote_type(l_dt, r_dt);
67
+ }
68
+
69
+ void
70
+ ca_bincmp_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
71
+ int8_t *out_l_in_dt, int8_t *out_r_in_dt)
72
+ {
73
+ int8_t common = ca_lazy_bincmp_promote(op_id, l_dt, r_dt);
74
+ if ( out_l_in_dt ) *out_l_in_dt = common;
75
+ if ( out_r_in_dt ) *out_r_in_dt = common;
76
+ }
@@ -0,0 +1,85 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_bincmp_dispatch.h
4
+
5
+ PROPOSAL_LAZY_ELEMENTWISE_VIEW Phase 4 (P.4.1) — CABinCmp dispatch API.
6
+
7
+ rev2 §0.5 #1 model: comparison output is always CA_BOOLEAN (boolean8_t,
8
+ 1 byte/cell). Operands are cast to the common data_type via
9
+ ca_promote_type, the kernel reads both operands and writes boolean
10
+ output. The binop in-place trick (= pull left into output buffer)
11
+ does NOT work for comparison because output data_type != operand data_type.
12
+
13
+ rev2 §0.5 #4: bitwise on boolean output is handled by Phase 2 CABinOp
14
+ (= ca_binop_bit_and_i_boolean8_t exists). This file is comparison-
15
+ only.
16
+
17
+ P.4.1 scope: only :lt wired with a kernel; other 6 op constants
18
+ reserved and lookup returns NULL (caller detects not-implemented).
19
+ P.4.2 expands to 7 ops (= eq / ne / lt / gt / le / ge / feq).
20
+
21
+ ---------------------------------------------------------------------------- */
22
+
23
+ #ifndef CA_BINCMP_DISPATCH_H
24
+ #define CA_BINCMP_DISPATCH_H
25
+
26
+ #include "carray.h"
27
+
28
+ /* ------------------------------------------------------------------- */
29
+ /* op_id enum */
30
+ /* ------------------------------------------------------------------- */
31
+
32
+ enum {
33
+ CA_BINCMP_LT = 0,
34
+ CA_BINCMP_GT = 1,
35
+ CA_BINCMP_LE = 2,
36
+ CA_BINCMP_GE = 3,
37
+ CA_BINCMP_EQ = 4,
38
+ CA_BINCMP_NE = 5,
39
+ CA_BINCMP_FEQ = 6, /* float ε-equal, eps stored in CABinCmp.tol tail */
40
+ /* IC.2: tolerance-bearing predicates, tol stored in CABinCmp.tol tail */
41
+ CA_BINCMP_IS_CLOSE = 7, /* |a - b| <= tol (absolute) */
42
+ CA_BINCMP_IS_EQUIV = 8, /* |a - b| / max(|a|, |b|) <= tol (relative) */
43
+
44
+ CA_BINCMP_COUNT
45
+ };
46
+
47
+ /* ------------------------------------------------------------------- */
48
+ /* Kernel dispatch tables (per-data_type) */
49
+ /* ------------------------------------------------------------------- */
50
+
51
+ /* The per-data_type bincmp kernel tables (mkkernel-generated, write
52
+ boolean8_t output). Made public here (PROPOSAL_CARRAY_H_REORG H.2)
53
+ so external math-backend gems can swap a slot through the carray.h
54
+ umbrella with no hand-declared externs. */
55
+ extern ca_bincmp_func_t ca_bincmp_lt [CA_NTYPE];
56
+ extern ca_bincmp_func_t ca_bincmp_gt [CA_NTYPE];
57
+ extern ca_bincmp_func_t ca_bincmp_le [CA_NTYPE];
58
+ extern ca_bincmp_func_t ca_bincmp_ge [CA_NTYPE];
59
+ extern ca_bincmp_func_t ca_bincmp_eq [CA_NTYPE];
60
+ extern ca_bincmp_func_t ca_bincmp_ne [CA_NTYPE];
61
+ extern ca_bincmp_func_t ca_bincmp_feq [CA_NTYPE];
62
+ extern ca_bincmp_func_t ca_bincmp_is_close [CA_NTYPE];
63
+ extern ca_bincmp_func_t ca_bincmp_is_equiv [CA_NTYPE];
64
+
65
+ /* ------------------------------------------------------------------- */
66
+ /* Dispatch API */
67
+ /* ------------------------------------------------------------------- */
68
+
69
+ /* Look up the bincmp kernel for (op_id, common_dt). Returns NULL if
70
+ not implemented at the requested data_type. All bincmp kernels write
71
+ boolean8_t to ptr3. */
72
+ ca_bincmp_func_t ca_bincmp_kernel_lookup (uint16_t op_id, int8_t common_dt);
73
+
74
+ /* Compute input common data_type via ca_promote_type. Output data_type is
75
+ always CA_BOOLEAN (NOT returned here; CABinCmp.data_type is set
76
+ directly). */
77
+ int8_t ca_lazy_bincmp_promote (uint16_t op_id, int8_t l_dt, int8_t r_dt);
78
+
79
+ /* What data_type does each operand need to be cast to before reaching the
80
+ kernel? Returns common data_type for both (= cast-before route, same as
81
+ Phase 2 CABinOp). */
82
+ void ca_bincmp_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
83
+ int8_t *out_l_in_dt, int8_t *out_r_in_dt);
84
+
85
+ #endif /* CA_BINCMP_DISPATCH_H */
@@ -0,0 +1,124 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ CABinOp dispatch: routes a binop op id (`CA_BINOP_*`) to the per-
4
+ data_type kernel, computes the input promotion + output data_type
5
+ rule, and tags ops that can trap on integer zero divisor.
6
+
7
+ Sibling of ca_obj_binop.c (the CABinOp view), ca_bincmp_dispatch.c
8
+ (comparison binop family), and ca_monop_dispatch.c (unary
9
+ counterpart). Per-data_type kernel tables are declared in
10
+ ca_binop_dispatch.h.
11
+
12
+ The binop kernels assume both operands already share data_type. The
13
+ CABinOp builder inserts CAMonOp(`:cast_<common>`) nodes so both
14
+ operands arrive at the common type. Two ops break the uniform rule:
15
+
16
+ QUO -- only has a CA_OBJECT kernel; both operands promoted to
17
+ CA_OBJECT regardless of input data types
18
+ IPOWER -- heterogeneous (left: float/cmplx preserved, right: int64);
19
+ output preserves left data type. See ca_op_ipower.c.
20
+
21
+ ---------------------------------------------------------------------------- */
22
+
23
+ #include "carray.h"
24
+ #include "ca_binop_dispatch.h"
25
+
26
+ /* ------------------------------------------------------------------- */
27
+ /* vv kernel lookup */
28
+ /* ------------------------------------------------------------------- */
29
+
30
+ ca_binop_func_t
31
+ ca_binop_kernel_lookup_vv (uint16_t op_id, int8_t common_dt)
32
+ {
33
+ switch (op_id) {
34
+ case CA_BINOP_ADD: return ca_binop_add [common_dt];
35
+ case CA_BINOP_SUB: return ca_binop_sub [common_dt];
36
+ case CA_BINOP_MUL: return ca_binop_mul [common_dt];
37
+ case CA_BINOP_DIV: return ca_binop_div [common_dt];
38
+ case CA_BINOP_POW: return ca_binop_power [common_dt];
39
+ case CA_BINOP_BIT_AND: return ca_binop_bit_and_i [common_dt];
40
+ case CA_BINOP_BIT_OR: return ca_binop_bit_or_i [common_dt];
41
+ case CA_BINOP_BIT_XOR: return ca_binop_bit_xor_i [common_dt];
42
+ case CA_BINOP_BIT_LSHIFT: return ca_binop_bit_lshift [common_dt];
43
+ case CA_BINOP_BIT_RSHIFT: return ca_binop_bit_rshift [common_dt];
44
+ case CA_BINOP_MOD: return ca_binop_mod [common_dt];
45
+ case CA_BINOP_QUO: return ca_binop_quo_i [common_dt];
46
+ case CA_BINOP_RCP_MUL: return ca_binop_rcp_mul [common_dt];
47
+ case CA_BINOP_IPOWER: return ca_binop_ipower [common_dt];
48
+ case CA_BINOP_COPYSIGN: return ca_binop_copysign [common_dt];
49
+ case CA_BINOP_LOGADDEXP: return ca_binop_logaddexp [common_dt];
50
+ case CA_BINOP_NEXTAFTER: return ca_binop_nextafter [common_dt];
51
+ case CA_BINOP_FMOD: return ca_binop_fmod [common_dt];
52
+ case CA_BINOP_ATAN2: return ca_binop_atan2 [common_dt];
53
+ case CA_BINOP_HYPOT: return ca_binop_hypot [common_dt];
54
+ case CA_BINOP_PMAX: return ca_binop_pmax [common_dt];
55
+ case CA_BINOP_PMIN: return ca_binop_pmin [common_dt];
56
+ case CA_BINOP_MAXIMUM: return ca_binop_maximum [common_dt];
57
+ case CA_BINOP_MINIMUM: return ca_binop_minimum [common_dt];
58
+ case CA_BINOP_AND: return ca_binop_and [common_dt];
59
+ case CA_BINOP_OR: return ca_binop_or [common_dt];
60
+ case CA_BINOP_XOR: return ca_binop_xor [common_dt];
61
+ default: return NULL;
62
+ }
63
+ }
64
+
65
+ /* ------------------------------------------------------------------- */
66
+ /* output data_type rule */
67
+ /* ------------------------------------------------------------------- */
68
+
69
+ /* Returns the output data_type for op_id applied to operands of types
70
+ (l_dt, r_dt). For most ops this is ca_promote_type(l_dt, r_dt) (=
71
+ the common promoted type). Broadcast / scalar wrap are handled by
72
+ the caller, not here. */
73
+ int8_t
74
+ ca_lazy_promote_binop (uint16_t op_id, int8_t l_dt, int8_t r_dt)
75
+ {
76
+ /* QUO has only a CA_OBJECT kernel: force both operands to CA_OBJECT
77
+ so the rb_funcall dispatch path runs (matches eager behaviour). */
78
+ if ( op_id == CA_BINOP_QUO ) return CA_OBJECT;
79
+ /* IPOWER preserves the left data_type as output (right is coerced
80
+ to int64 separately by ca_binop_kernel_input_data_types below). */
81
+ if ( op_id == CA_BINOP_IPOWER ) return l_dt;
82
+ return (int8_t) ca_promote_type(l_dt, r_dt);
83
+ }
84
+
85
+ void
86
+ ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
87
+ int8_t *out_l_in_dt, int8_t *out_r_in_dt)
88
+ {
89
+ /* IPOWER: heterogeneous (left preserves, right -> int64). Skip the
90
+ cast-before common-data_type unification. */
91
+ if ( op_id == CA_BINOP_IPOWER ) {
92
+ if ( out_l_in_dt ) *out_l_in_dt = l_dt;
93
+ if ( out_r_in_dt ) *out_r_in_dt = CA_INT64;
94
+ (void) r_dt;
95
+ return;
96
+ }
97
+ int8_t common = ca_lazy_promote_binop(op_id, l_dt, r_dt);
98
+ if ( out_l_in_dt ) *out_l_in_dt = common;
99
+ if ( out_r_in_dt ) *out_r_in_dt = common;
100
+ }
101
+
102
+ /* ------------------------------------------------------------------- */
103
+ /* trapping-op predicate */
104
+ /* ------------------------------------------------------------------- */
105
+
106
+ int
107
+ ca_binop_is_trapping (uint16_t op_id, int8_t common_dt)
108
+ {
109
+ /* Integer DIV / MOD / QUO / FMOD can SIGFPE on a zero divisor. Float
110
+ DIV returns NaN/Inf and does NOT trap, so it is not classified
111
+ trapping. */
112
+ int is_integer = ( common_dt >= CA_INT8 && common_dt <= CA_UINT64 );
113
+ if ( ! is_integer ) return 0;
114
+
115
+ switch (op_id) {
116
+ case CA_BINOP_DIV:
117
+ case CA_BINOP_MOD:
118
+ case CA_BINOP_QUO:
119
+ case CA_BINOP_FMOD:
120
+ return 1;
121
+ default:
122
+ return 0;
123
+ }
124
+ }
@@ -0,0 +1,152 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_binop_dispatch.h
4
+
5
+ PROPOSAL_LAZY_ELEMENTWISE_VIEW Phase 2 (P.2.1) — CABinOp dispatch API.
6
+
7
+ rev3 §3.2: 1-D same-type table + cast-before route. No 2-D mixed-type
8
+ dispatch (= existing eager `ca_binop_<op>[CA_NTYPE]` is 1-D same-type,
9
+ promotion handled by inserting CAMonOp(:cast_<common>) nodes before
10
+ reaching CABinOp).
11
+
12
+ P.2.1 scope: ADD only, vv only. P.2.2 expands to 13 ops.
13
+
14
+ ---------------------------------------------------------------------------- */
15
+
16
+ #ifndef CA_BINOP_DISPATCH_H
17
+ #define CA_BINOP_DISPATCH_H
18
+
19
+ #include "carray.h"
20
+
21
+ /* ------------------------------------------------------------------- */
22
+ /* op_id enum */
23
+ /* ------------------------------------------------------------------- */
24
+
25
+ enum {
26
+ /* Arithmetic binop (5) — variants: vv/vs/sv (P.2.3 gate) */
27
+ CA_BINOP_ADD = 0,
28
+ CA_BINOP_SUB = 1,
29
+ CA_BINOP_MUL = 2,
30
+ CA_BINOP_DIV = 3,
31
+ CA_BINOP_POW = 4,
32
+
33
+ /* Bitwise / logical (Q1 (b) verdict: 13 op total; full scope flesh
34
+ out in P.2.2) */
35
+ CA_BINOP_BIT_AND = 5,
36
+ CA_BINOP_BIT_OR = 6,
37
+ CA_BINOP_BIT_XOR = 7,
38
+ CA_BINOP_BIT_LSHIFT= 8,
39
+ CA_BINOP_BIT_RSHIFT= 9,
40
+ CA_BINOP_MOD = 10,
41
+ CA_BINOP_QUO = 11,
42
+ CA_BINOP_RCP_MUL = 12,
43
+
44
+ /* Float/Complex ** Integer fast path (binary exponentiation, O(log p)).
45
+ Heterogeneous binop: left data_type is float32/float64/cmplx64/cmplx128,
46
+ right is always int64 (CScalar carrying the exponent), output data_type
47
+ = left data_type (preserve). Bypasses the standard cast-before route
48
+ (= no common-data_type promotion) since the integer semantics of the
49
+ right operand is load-bearing. See ext/ca_op_ipower.c for the
50
+ hand-written kernel table. */
51
+ CA_BINOP_IPOWER = 13,
52
+
53
+ /* M.2 (PyTorch alignment): float-only binop family. Integer input
54
+ unsupported at this layer — caller must cast operands explicitly.
55
+ ATAN2 / HYPOT migrate from hand-written CAMath wrappers (M.3). */
56
+ CA_BINOP_COPYSIGN = 14,
57
+ CA_BINOP_LOGADDEXP = 15,
58
+ CA_BINOP_NEXTAFTER = 16,
59
+ CA_BINOP_FMOD = 17,
60
+ CA_BINOP_ATAN2 = 18,
61
+ CA_BINOP_HYPOT = 19,
62
+
63
+ /* Pair-wise max / min (NaN-skip semantics via C99 fmax / fmin on the
64
+ float branch; comparison form on integer / object). All numeric +
65
+ object. Ruby aliases `fmax` / `fmin` share the same kernel. */
66
+ CA_BINOP_PMAX = 20,
67
+ CA_BINOP_PMIN = 21,
68
+
69
+ /* Pair-wise max / min, NaN-propagate variant (if either operand is
70
+ NaN the result is NaN). Distinct kernel from PMAX/PMIN — the
71
+ float branch short-circuits on isnan. All numeric + object. */
72
+ CA_BINOP_MAXIMUM = 22,
73
+ CA_BINOP_MINIMUM = 23,
74
+
75
+ /* Boolean 3-value logic word forms (bool + object only, no numeric).
76
+ Distinct from BIT_AND / BIT_OR / BIT_XOR: those carry the Kleene
77
+ 3-valued fixup on masked cells (see ca_obj_binop.c ~line 515);
78
+ these word forms use plain mask-propagate semantics. */
79
+ CA_BINOP_AND = 24,
80
+ CA_BINOP_OR = 25,
81
+ CA_BINOP_XOR = 26,
82
+
83
+ CA_BINOP_COUNT
84
+ };
85
+
86
+ /* ------------------------------------------------------------------- */
87
+ /* Kernel dispatch tables (per-data_type) */
88
+ /* ------------------------------------------------------------------- */
89
+
90
+ /* The per-data_type binop kernel tables. Defined in carray_kernels.c
91
+ (mkkernel-generated), ext/ca_op_ipower.c (ipower). Made public here
92
+ (PROPOSAL_CARRAY_H_REORG H.2) so external math-backend gems can swap
93
+ a slot through the carray.h umbrella with no hand-declared externs. */
94
+ extern ca_binop_func_t ca_binop_add [CA_NTYPE];
95
+ extern ca_binop_func_t ca_binop_sub [CA_NTYPE];
96
+ extern ca_binop_func_t ca_binop_mul [CA_NTYPE];
97
+ extern ca_binop_func_t ca_binop_div [CA_NTYPE];
98
+ extern ca_binop_func_t ca_binop_power [CA_NTYPE];
99
+ extern ca_binop_func_t ca_binop_bit_and_i [CA_NTYPE];
100
+ extern ca_binop_func_t ca_binop_bit_or_i [CA_NTYPE];
101
+ extern ca_binop_func_t ca_binop_bit_xor_i [CA_NTYPE];
102
+ extern ca_binop_func_t ca_binop_bit_lshift [CA_NTYPE];
103
+ extern ca_binop_func_t ca_binop_bit_rshift [CA_NTYPE];
104
+ extern ca_binop_func_t ca_binop_mod [CA_NTYPE];
105
+ extern ca_binop_func_t ca_binop_quo_i [CA_NTYPE];
106
+ extern ca_binop_func_t ca_binop_rcp_mul [CA_NTYPE];
107
+ /* Hand-written heterogeneous binop (left: float/cmplx, right: int64,
108
+ output: left data_type). Defined in ext/ca_op_ipower.c. */
109
+ extern ca_binop_func_t ca_binop_ipower [CA_NTYPE];
110
+ /* M.2 + M.3: PyTorch alignment additions (mkkernel-generated, float-only). */
111
+ extern ca_binop_func_t ca_binop_copysign [CA_NTYPE];
112
+ extern ca_binop_func_t ca_binop_logaddexp [CA_NTYPE];
113
+ extern ca_binop_func_t ca_binop_nextafter [CA_NTYPE];
114
+ extern ca_binop_func_t ca_binop_fmod [CA_NTYPE];
115
+ extern ca_binop_func_t ca_binop_atan2 [CA_NTYPE];
116
+ extern ca_binop_func_t ca_binop_hypot [CA_NTYPE];
117
+ extern ca_binop_func_t ca_binop_pmax [CA_NTYPE];
118
+ extern ca_binop_func_t ca_binop_pmin [CA_NTYPE];
119
+ extern ca_binop_func_t ca_binop_maximum [CA_NTYPE];
120
+ extern ca_binop_func_t ca_binop_minimum [CA_NTYPE];
121
+ extern ca_binop_func_t ca_binop_and [CA_NTYPE];
122
+ extern ca_binop_func_t ca_binop_or [CA_NTYPE];
123
+ extern ca_binop_func_t ca_binop_xor [CA_NTYPE];
124
+
125
+ /* ------------------------------------------------------------------- */
126
+ /* Dispatch API */
127
+ /* ------------------------------------------------------------------- */
128
+
129
+ /* Look up the same-type vv kernel for (op_id, common_dt). Returns NULL
130
+ if not implemented. P.2.1: only ADD wired up; others NULL until P.2.2. */
131
+ ca_binop_func_t ca_binop_kernel_lookup_vv (uint16_t op_id, int8_t common_dt);
132
+
133
+ /* Compute output (= common) data_type via the existing eager promotion rule
134
+ (ca_promote_type). Phase 0 audit landed extern visibility. */
135
+ int8_t ca_lazy_promote_binop (uint16_t op_id, int8_t l_dt, int8_t r_dt);
136
+
137
+ /* What data_type does each operand need to be cast to before reaching the
138
+ kernel? Returns common data_type for both (= cast-before route). When
139
+ common != operand.data_type, caller inserts CAMonOp(:cast_<common>). */
140
+ void ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
141
+ int8_t *out_l_in_dt, int8_t *out_r_in_dt);
142
+
143
+ /* True iff op_id is a trapping op for the given common_dt (= integer
144
+ DIV / MOD on integer data_types). Float DIV returns NaN/Inf and does
145
+ not trap, so it is NOT classified trapping.
146
+
147
+ When trapping AND either operand has a mask, xfer_stride must pass
148
+ a slab mask to the kernel so masked cells are skipped (otherwise
149
+ masked-zero divisors crash with SIGFPE). See §3.4 rev3. */
150
+ int ca_binop_is_trapping (uint16_t op_id, int8_t common_dt);
151
+
152
+ #endif /* CA_BINOP_DISPATCH_H */