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.
- checksums.yaml +4 -4
- data/.yardopts +5 -25
- data/CHANGELOG.md +16 -0
- data/LICENSE +1 -1
- data/NEWS.md +3 -0
- data/README.md +128 -44
- data/carray.gemspec +22 -24
- data/ext/ca_array_pool.c +91 -0
- data/ext/ca_axis_descriptor.h +186 -0
- data/ext/ca_axis_dispatch.c +924 -0
- data/ext/ca_axis_group.c +1208 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +125 -0
- data/ext/ca_binop_dispatch.h +159 -0
- data/ext/ca_categorical_iterator.c +1375 -0
- data/ext/ca_compare.c +94 -0
- data/ext/ca_compare.h +26 -0
- data/ext/ca_composite_dispatch.c +414 -0
- data/ext/ca_composite_dispatch.h +116 -0
- data/ext/ca_for_buffer.h +96 -0
- data/ext/ca_for_each_element.h +241 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4321 -0
- data/ext/ca_kernel_iterator.h +2603 -0
- data/ext/ca_moncmp_dispatch.c +37 -0
- data/ext/ca_moncmp_dispatch.h +62 -0
- data/ext/ca_monop_dispatch.c +200 -0
- data/ext/ca_monop_dispatch.h +235 -0
- data/ext/ca_obj_array.c +355 -359
- data/ext/ca_obj_bincmp.c +809 -0
- data/ext/ca_obj_binop.c +892 -0
- data/ext/ca_obj_bitarray.c +369 -164
- data/ext/ca_obj_bitfield.c +294 -234
- data/ext/ca_obj_block.c +189 -711
- data/ext/ca_obj_byte_swap.c +766 -0
- data/ext/ca_obj_const_string.c +965 -0
- data/ext/ca_obj_face.c +670 -0
- data/ext/ca_obj_face.h +247 -0
- data/ext/ca_obj_fake.c +228 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +306 -0
- data/ext/ca_obj_grid.c +858 -440
- data/ext/ca_obj_meld.c +1034 -0
- data/ext/ca_obj_moncmp.c +569 -0
- data/ext/ca_obj_monop.c +1111 -0
- data/ext/ca_obj_object.c +774 -298
- data/ext/ca_obj_record.c +468 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +569 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +616 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1296 -0
- data/ext/ca_obj_shift.c +230 -792
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2501 -0
- data/ext/ca_obj_string.c +268 -0
- data/ext/ca_obj_tile.c +614 -0
- data/ext/ca_obj_time.c +546 -0
- data/ext/ca_obj_timedelta.c +435 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +746 -0
- data/ext/ca_obj_unbound_repeat.c +208 -241
- data/ext/ca_obj_window.c +1131 -563
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_ipower.c +319 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +430 -0
- data/ext/ca_sweep_engine.h +157 -0
- data/ext/ca_transform_common.c +228 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +795 -402
- data/ext/carray_access.c +831 -711
- data/ext/carray_attribute.c +98 -330
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +283 -0
- data/ext/carray_call_cfunc.c +1360 -828
- data/ext/carray_call_cfunc.h +160 -0
- data/ext/carray_cast.c +1212 -301
- data/ext/carray_cast_func.rb +81 -40
- data/ext/carray_class.c +53 -63
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +350 -346
- data/ext/carray_copy.c +156 -268
- data/ext/carray_core.c +1342 -199
- data/ext/carray_count.c +312 -0
- data/ext/carray_data_type.c +43 -19
- data/ext/carray_element.c +585 -213
- data/ext/carray_factorize.c +2542 -0
- data/ext/carray_generate.c +230 -559
- data/ext/carray_histogram.c +490 -0
- data/ext/carray_hold.c +228 -0
- data/ext/carray_index_classifier.c +1035 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +120 -0
- data/ext/carray_kernels_bincmp.c +4445 -0
- data/ext/carray_kernels_binop.c +10979 -0
- data/ext/carray_kernels_init.c +36 -0
- data/ext/carray_kernels_map.c +3466 -0
- data/ext/carray_kernels_moncmp.c +2096 -0
- data/ext/carray_kernels_monop.c +18312 -0
- data/ext/carray_kernels_reduce_aggregate.c +25836 -0
- data/ext/carray_kernels_reduce_boolean.c +329 -0
- data/ext/carray_kernels_reduce_cumulative.c +14592 -0
- data/ext/carray_kernels_reduce_extreme.c +16947 -0
- data/ext/carray_kernels_reduce_variance.c +3909 -0
- data/ext/carray_kernels_scan.c +3692 -0
- data/ext/carray_kernels_search.c +32137 -0
- data/ext/carray_kernels_sort.c +10625 -0
- data/ext/carray_kernels_triop.c +1391 -0
- data/ext/carray_lazy.c +567 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +848 -154
- data/ext/carray_math_kernel.h +120 -0
- data/ext/carray_mathfunc.c +10 -241
- data/ext/carray_median_percentile.c +1257 -0
- data/ext/carray_memory_view.c +1625 -0
- data/ext/carray_operator.c +1526 -318
- data/ext/carray_order.c +664 -1394
- data/ext/carray_partition.c +416 -0
- data/ext/carray_random.c +518 -0
- data/ext/carray_scatter.c +357 -0
- data/ext/carray_slab.c +1219 -0
- data/ext/carray_slab.h +84 -0
- data/ext/carray_sort.c +829 -0
- data/ext/carray_sort_kernel.c +620 -0
- data/ext/carray_struct.c +695 -0
- data/ext/carray_test.c +343 -229
- data/ext/carray_undef.c +34 -17
- data/ext/carray_utils.c +175 -74
- data/ext/extconf.rb +216 -55
- data/ext/mk_call_cfunc.rb +480 -0
- data/ext/mkkernel.rb +8842 -0
- data/ext/ruby_carray.c +202 -101
- data/ext/version.h +4 -14
- data/ext/version.rb +5 -13
- data/lib/carray/arrow_tensor.rb +401 -0
- data/lib/carray/attribute.rb +166 -0
- data/lib/carray/autoload_carray.rb +220 -0
- data/lib/carray/autoload_method_extension.rb +44 -0
- data/lib/carray/axis_group.rb +711 -0
- data/lib/carray/basics.rb +481 -0
- data/lib/carray/bincount_nd.rb +358 -0
- data/lib/carray/block_iterator.rb +604 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1062 -0
- data/lib/carray/complex.rb +150 -0
- data/lib/carray/conditional.rb +216 -0
- data/lib/carray/const_string.rb +228 -0
- data/lib/carray/construct.rb +139 -328
- data/lib/carray/core_extensions.rb +240 -0
- data/lib/carray/data_type_extension.rb +233 -0
- data/lib/carray/fixlen_string.rb +95 -0
- data/lib/carray/frame/concat.rb +132 -0
- data/lib/carray/frame/convert.rb +95 -0
- data/lib/carray/frame/csv_parser.rb +211 -0
- data/lib/carray/frame/frame.rb +649 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +164 -0
- data/lib/carray/frame/join.rb +248 -0
- data/lib/carray/frame/records.rb +99 -0
- data/lib/carray/frame/sort.rb +113 -0
- data/lib/carray/frame/verbs.rb +299 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -20
- data/lib/carray/iterator.rb +57 -349
- data/lib/carray/lazy.rb +889 -0
- data/lib/carray/mask_gap_fill.rb +200 -0
- data/lib/carray/math.rb +78 -342
- data/lib/carray/meld_reduce.rb +289 -0
- data/lib/carray/methods/align_addr.rb +116 -0
- data/lib/carray/methods/bin.rb +128 -0
- data/lib/carray/methods/bincount.rb +87 -0
- data/lib/carray/methods/bit_string.rb +92 -0
- data/lib/carray/methods/broadcast.rb +63 -0
- data/lib/carray/methods/choose.rb +39 -0
- data/lib/carray/methods/composition.rb +280 -0
- data/lib/carray/methods/gather_nd.rb +206 -0
- data/lib/carray/methods/index.rb +39 -0
- data/lib/carray/methods/insert_block.rb +99 -0
- data/lib/carray/methods/is_in.rb +141 -0
- data/lib/carray/methods/join.rb +90 -0
- data/lib/carray/methods/locate_addr.rb +47 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +91 -0
- data/lib/carray/methods/mode.rb +126 -0
- data/lib/carray/methods/nunique.rb +46 -0
- data/lib/carray/methods/resize.rb +56 -0
- data/lib/carray/methods/snap.rb +156 -0
- data/lib/carray/methods/string_format.rb +57 -0
- data/lib/carray/methods/unique.rb +47 -0
- data/lib/carray/methods/value_counts.rb +71 -0
- data/lib/carray/mkmf.rb +124 -101
- data/lib/carray/runtime.rb +108 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +292 -0
- data/lib/carray/stack.rb +291 -0
- data/lib/carray/string.rb +56 -180
- data/lib/carray/string_operation_extension.rb +289 -0
- data/lib/carray/struct.rb +335 -323
- data/lib/carray/struct_builder.rb +697 -0
- data/lib/carray/table.rb +41 -2
- data/lib/carray/time.rb +2255 -38
- data/lib/carray/window_iterator.rb +655 -0
- data/lib/carray.rb +55 -57
- metadata +163 -130
- data/Rakefile +0 -51
- data/TODO.md +0 -18
- data/ext/ca_iter_block.c +0 -257
- data/ext/ca_iter_dimension.c +0 -299
- data/ext/ca_iter_window.c +0 -214
- data/ext/ca_obj_mapping.c +0 -644
- data/ext/carray_iterator.c +0 -641
- data/ext/carray_math.rb +0 -850
- data/ext/carray_numeric.c +0 -259
- data/ext/carray_sort_addr.c +0 -254
- data/ext/carray_stat.c +0 -2100
- data/ext/carray_stat_proc.rb +0 -1999
- data/ext/mkmath.rb +0 -741
- data/ext/ruby_ccomplex.c +0 -509
- data/ext/ruby_float_func.c +0 -86
- data/lib/carray/array.rb +0 -8
- data/lib/carray/autoload/autoload_base.rb +0 -19
- data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
- data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
- data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
- data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
- data/lib/carray/autoload/autoload_gem_random.rb +0 -8
- data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
- data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
- data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
- data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
- data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
- data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
- data/lib/carray/autoload/autoload_object_link.rb +0 -1
- data/lib/carray/autoload/autoload_object_pack.rb +0 -2
- data/lib/carray/autoload.rb +0 -141
- data/lib/carray/basic.rb +0 -191
- data/lib/carray/broadcast.rb +0 -101
- data/lib/carray/compose.rb +0 -315
- data/lib/carray/convert.rb +0 -115
- data/lib/carray/info.rb +0 -110
- data/lib/carray/io/imagemagick.rb +0 -235
- data/lib/carray/mask.rb +0 -102
- data/lib/carray/math/histogram.rb +0 -177
- data/lib/carray/math/recurrence.rb +0 -93
- data/lib/carray/object/ca_obj_iterator.rb +0 -50
- data/lib/carray/object/ca_obj_link.rb +0 -50
- data/lib/carray/object/ca_obj_pack.rb +0 -99
- data/lib/carray/obsolete.rb +0 -256
- data/lib/carray/ordering.rb +0 -181
- data/lib/carray/testing.rb +0 -51
- data/lib/carray/transform.rb +0 -109
- data/misc/Methods.ja.md +0 -182
- data/misc/NOTE +0 -51
- data/spec/Classes/CABitfield_spec.rb +0 -58
- data/spec/Classes/CABlockIterator_spec.rb +0 -114
- data/spec/Classes/CABlock_spec.rb +0 -205
- data/spec/Classes/CAField_spec.rb +0 -39
- data/spec/Classes/CAGrid_spec.rb +0 -75
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/spec/Classes/CAMapping_spec.rb +0 -105
- data/spec/Classes/CAObject_attribute_spec.rb +0 -33
- data/spec/Classes/CAObject_spec.rb +0 -33
- data/spec/Classes/CARefer_spec.rb +0 -93
- data/spec/Classes/CARepeat_spec.rb +0 -65
- data/spec/Classes/CASelect_spec.rb +0 -22
- data/spec/Classes/CAShift_spec.rb +0 -16
- data/spec/Classes/CAStruct_spec.rb +0 -71
- data/spec/Classes/CATranspose_spec.rb +0 -60
- data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
- data/spec/Classes/CAWindow_spec.rb +0 -54
- data/spec/Classes/CAWrap_spec.rb +0 -8
- data/spec/Classes/CArray_spec.rb +0 -184
- data/spec/Classes/CScalar_spec.rb +0 -55
- data/spec/Classes/ex1.rb +0 -46
- data/spec/Features/feature_130_spec.rb +0 -19
- data/spec/Features/feature_attributes_spec.rb +0 -280
- data/spec/Features/feature_boolean_spec.rb +0 -98
- data/spec/Features/feature_broadcast.rb +0 -116
- data/spec/Features/feature_cast_function.rb +0 -19
- data/spec/Features/feature_cast_spec.rb +0 -33
- data/spec/Features/feature_class_spec.rb +0 -84
- data/spec/Features/feature_complex_spec.rb +0 -42
- data/spec/Features/feature_composite_spec.rb +0 -124
- data/spec/Features/feature_convert_spec.rb +0 -46
- data/spec/Features/feature_copy_spec.rb +0 -123
- data/spec/Features/feature_creation_spec.rb +0 -84
- data/spec/Features/feature_element_spec.rb +0 -144
- data/spec/Features/feature_extream_spec.rb +0 -54
- data/spec/Features/feature_generate_spec.rb +0 -74
- data/spec/Features/feature_index_spec.rb +0 -69
- data/spec/Features/feature_mask_spec.rb +0 -580
- data/spec/Features/feature_math_spec.rb +0 -97
- data/spec/Features/feature_order_spec.rb +0 -146
- data/spec/Features/feature_ref_store_spec.rb +0 -209
- data/spec/Features/feature_serialization_spec.rb +0 -125
- data/spec/Features/feature_stat_spec.rb +0 -397
- data/spec/Features/feature_virtual_spec.rb +0 -48
- data/spec/Features/method_eq_spec.rb +0 -81
- data/spec/Features/method_is_nan_spec.rb +0 -12
- data/spec/Features/method_map_spec.rb +0 -54
- data/spec/Features/method_max_with.rb +0 -20
- data/spec/Features/method_min_with.rb +0 -19
- data/spec/Features/method_ne_spec.rb +0 -18
- data/spec/Features/method_project_spec.rb +0 -188
- data/spec/Features/method_ref_spec.rb +0 -27
- data/spec/Features/method_round_spec.rb +0 -11
- data/spec/Features/method_s_linspace_spec.rb +0 -48
- data/spec/Features/method_s_span_spec.rb +0 -14
- data/spec/Features/method_seq_spec.rb +0 -47
- data/spec/Features/method_sort_with.rb +0 -43
- data/spec/Features/method_sorted_with.rb +0 -29
- data/spec/Features/method_span_spec.rb +0 -42
- data/spec/Features/method_wrap_readonly_spec.rb +0 -43
- data/spec/UnitTest/test_CAVirtual.rb +0 -214
- data/spec/spec_all.rb +0 -10
- data/utils/ca_ase.rb +0 -21
- data/utils/ca_methods.rb +0 -15
- data/utils/cast_checker.rb +0 -30
- data/utils/convert_test.rb +0 -73
- data/utils/extract_yard.rb +0 -22
- data/utils/guess_shape.rb +0 -76
- data/utils/monkey_patch_methods.rb +0 -62
- 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 */
|