carray 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
@@ -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,125 @@
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 dtypes
18
+ IPOWER -- heterogeneous (left: float/cmplx preserved, right: int64);
19
+ output preserves left dtype. 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
+ case CA_BINOP_REMINDER: return ca_binop_reminder [common_dt];
62
+ default: return NULL;
63
+ }
64
+ }
65
+
66
+ /* ------------------------------------------------------------------- */
67
+ /* output data_type rule */
68
+ /* ------------------------------------------------------------------- */
69
+
70
+ /* Returns the output data_type for op_id applied to operands of types
71
+ (l_dt, r_dt). For most ops this is ca_promote_type(l_dt, r_dt) (=
72
+ the common promoted type). Broadcast / scalar wrap are handled by
73
+ the caller, not here. */
74
+ int8_t
75
+ ca_lazy_promote_binop (uint16_t op_id, int8_t l_dt, int8_t r_dt)
76
+ {
77
+ /* QUO has only a CA_OBJECT kernel: force both operands to CA_OBJECT
78
+ so the rb_funcall dispatch path runs (matches eager behaviour). */
79
+ if ( op_id == CA_BINOP_QUO ) return CA_OBJECT;
80
+ /* IPOWER preserves the left data_type as output (right is coerced
81
+ to int64 separately by ca_binop_kernel_input_data_types below). */
82
+ if ( op_id == CA_BINOP_IPOWER ) return l_dt;
83
+ return (int8_t) ca_promote_type(l_dt, r_dt);
84
+ }
85
+
86
+ void
87
+ ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
88
+ int8_t *out_l_in_dt, int8_t *out_r_in_dt)
89
+ {
90
+ /* IPOWER: heterogeneous (left preserves, right -> int64). Skip the
91
+ cast-before common-data_type unification. */
92
+ if ( op_id == CA_BINOP_IPOWER ) {
93
+ if ( out_l_in_dt ) *out_l_in_dt = l_dt;
94
+ if ( out_r_in_dt ) *out_r_in_dt = CA_INT64;
95
+ (void) r_dt;
96
+ return;
97
+ }
98
+ int8_t common = ca_lazy_promote_binop(op_id, l_dt, r_dt);
99
+ if ( out_l_in_dt ) *out_l_in_dt = common;
100
+ if ( out_r_in_dt ) *out_r_in_dt = common;
101
+ }
102
+
103
+ /* ------------------------------------------------------------------- */
104
+ /* trapping-op predicate */
105
+ /* ------------------------------------------------------------------- */
106
+
107
+ int
108
+ ca_binop_is_trapping (uint16_t op_id, int8_t common_dt)
109
+ {
110
+ /* Integer DIV / MOD / QUO can SIGFPE on a zero divisor. Float DIV
111
+ returns NaN/Inf and does NOT trap, so it is not classified
112
+ trapping. */
113
+ int is_integer = ( common_dt >= CA_INT8 && common_dt <= CA_UINT64 );
114
+ if ( ! is_integer ) return 0;
115
+
116
+ switch (op_id) {
117
+ case CA_BINOP_DIV:
118
+ case CA_BINOP_MOD:
119
+ case CA_BINOP_QUO:
120
+ case CA_BINOP_REMINDER:
121
+ return 1;
122
+ default:
123
+ return 0;
124
+ }
125
+ }
@@ -0,0 +1,159 @@
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
+ /* IEEE 754 remainder (round-half-to-even, distinct from MOD which
84
+ truncates toward zero via C99 fmod on the float branch). Integer
85
+ branch is identical to MOD (`%`). All numeric + object. Traps on
86
+ integer zero divisor, like MOD. */
87
+ CA_BINOP_REMINDER = 27,
88
+
89
+ CA_BINOP_COUNT
90
+ };
91
+
92
+ /* ------------------------------------------------------------------- */
93
+ /* Kernel dispatch tables (per-data_type) */
94
+ /* ------------------------------------------------------------------- */
95
+
96
+ /* The per-data_type binop kernel tables. Defined in carray_kernels.c
97
+ (mkkernel-generated), ext/ca_op_ipower.c (ipower). Made public here
98
+ (PROPOSAL_CARRAY_H_REORG H.2) so external math-backend gems can swap
99
+ a slot through the carray.h umbrella with no hand-declared externs. */
100
+ extern ca_binop_func_t ca_binop_add [CA_NTYPE];
101
+ extern ca_binop_func_t ca_binop_sub [CA_NTYPE];
102
+ extern ca_binop_func_t ca_binop_mul [CA_NTYPE];
103
+ extern ca_binop_func_t ca_binop_div [CA_NTYPE];
104
+ extern ca_binop_func_t ca_binop_power [CA_NTYPE];
105
+ extern ca_binop_func_t ca_binop_bit_and_i [CA_NTYPE];
106
+ extern ca_binop_func_t ca_binop_bit_or_i [CA_NTYPE];
107
+ extern ca_binop_func_t ca_binop_bit_xor_i [CA_NTYPE];
108
+ extern ca_binop_func_t ca_binop_bit_lshift [CA_NTYPE];
109
+ extern ca_binop_func_t ca_binop_bit_rshift [CA_NTYPE];
110
+ extern ca_binop_func_t ca_binop_mod [CA_NTYPE];
111
+ extern ca_binop_func_t ca_binop_quo_i [CA_NTYPE];
112
+ extern ca_binop_func_t ca_binop_rcp_mul [CA_NTYPE];
113
+ /* Hand-written heterogeneous binop (left: float/cmplx, right: int64,
114
+ output: left data_type). Defined in ext/ca_op_ipower.c. */
115
+ extern ca_binop_func_t ca_binop_ipower [CA_NTYPE];
116
+ /* M.2 + M.3: PyTorch alignment additions (mkkernel-generated, float-only). */
117
+ extern ca_binop_func_t ca_binop_copysign [CA_NTYPE];
118
+ extern ca_binop_func_t ca_binop_logaddexp [CA_NTYPE];
119
+ extern ca_binop_func_t ca_binop_nextafter [CA_NTYPE];
120
+ extern ca_binop_func_t ca_binop_fmod [CA_NTYPE];
121
+ extern ca_binop_func_t ca_binop_atan2 [CA_NTYPE];
122
+ extern ca_binop_func_t ca_binop_hypot [CA_NTYPE];
123
+ extern ca_binop_func_t ca_binop_pmax [CA_NTYPE];
124
+ extern ca_binop_func_t ca_binop_pmin [CA_NTYPE];
125
+ extern ca_binop_func_t ca_binop_maximum [CA_NTYPE];
126
+ extern ca_binop_func_t ca_binop_minimum [CA_NTYPE];
127
+ extern ca_binop_func_t ca_binop_and [CA_NTYPE];
128
+ extern ca_binop_func_t ca_binop_or [CA_NTYPE];
129
+ extern ca_binop_func_t ca_binop_xor [CA_NTYPE];
130
+ extern ca_binop_func_t ca_binop_reminder [CA_NTYPE];
131
+
132
+ /* ------------------------------------------------------------------- */
133
+ /* Dispatch API */
134
+ /* ------------------------------------------------------------------- */
135
+
136
+ /* Look up the same-type vv kernel for (op_id, common_dt). Returns NULL
137
+ if not implemented. P.2.1: only ADD wired up; others NULL until P.2.2. */
138
+ ca_binop_func_t ca_binop_kernel_lookup_vv (uint16_t op_id, int8_t common_dt);
139
+
140
+ /* Compute output (= common) data_type via the existing eager promotion rule
141
+ (ca_promote_type). Phase 0 audit landed extern visibility. */
142
+ int8_t ca_lazy_promote_binop (uint16_t op_id, int8_t l_dt, int8_t r_dt);
143
+
144
+ /* What data_type does each operand need to be cast to before reaching the
145
+ kernel? Returns common data_type for both (= cast-before route). When
146
+ common != operand.data_type, caller inserts CAMonOp(:cast_<common>). */
147
+ void ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
148
+ int8_t *out_l_in_dt, int8_t *out_r_in_dt);
149
+
150
+ /* True iff op_id is a trapping op for the given common_dt (= integer
151
+ DIV / MOD on integer data_types). Float DIV returns NaN/Inf and does
152
+ not trap, so it is NOT classified trapping.
153
+
154
+ When trapping AND either operand has a mask, xfer_stride must pass
155
+ a slab mask to the kernel so masked cells are skipped (otherwise
156
+ masked-zero divisors crash with SIGFPE). See §3.4 rev3. */
157
+ int ca_binop_is_trapping (uint16_t op_id, int8_t common_dt);
158
+
159
+ #endif /* CA_BINOP_DISPATCH_H */