carray 3.0.2 → 3.0.4

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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
@@ -45,67 +45,67 @@
45
45
  /* op_id -> kernel table lookup */
46
46
  /* ------------------------------------------------------------------- */
47
47
 
48
- /* Returns the kernel for the given input data_type. Returns NULL for
49
- cast ops (op_id >= CA_MONOP_CAST_BASE) and unknown op_ids; cast is
50
- handled specially in xfer_stride via ca_cast_block. */
51
- ca_monop_func_t
52
- ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type)
48
+ /* The kernel table of an op, or NULL for cast ops (op_id >=
49
+ CA_MONOP_CAST_BASE) and unknown op_ids; cast is handled specially in
50
+ xfer_stride via ca_cast_block. */
51
+ static ca_monop_func_t *
52
+ ca_monop_table_of (uint16_t op_id)
53
53
  {
54
54
  switch (op_id) {
55
- case CA_MONOP_ZERO: return ca_monop_zero[in_data_type];
56
- case CA_MONOP_ONE: return ca_monop_one[in_data_type];
57
- case CA_MONOP_FRAC: return ca_monop_frac[in_data_type];
58
- case CA_MONOP_NEG: return ca_monop_neg[in_data_type];
59
- case CA_MONOP_BIT_NEG: return ca_monop_bit_neg[in_data_type];
60
- case CA_MONOP_ABS_I: return ca_monop_abs_i[in_data_type];
61
- case CA_MONOP_CONJ: return ca_monop_conj[in_data_type];
62
- case CA_MONOP_NOT: return ca_monop_not[in_data_type];
63
-
64
- case CA_MONOP_CEIL: return ca_monop_ceil[in_data_type];
65
- case CA_MONOP_FLOOR: return ca_monop_floor[in_data_type];
66
- case CA_MONOP_ROUND: return ca_monop_round[in_data_type];
67
- case CA_MONOP_RCP: return ca_monop_rcp[in_data_type];
68
-
69
- case CA_MONOP_RAD: return ca_monop_rad[in_data_type];
70
- case CA_MONOP_DEG: return ca_monop_deg[in_data_type];
71
- case CA_MONOP_SQRT: return ca_monop_sqrt[in_data_type];
72
- case CA_MONOP_EXP: return ca_monop_exp[in_data_type];
73
- case CA_MONOP_EXP2: return ca_monop_exp2[in_data_type];
74
- case CA_MONOP_EXP10: return ca_monop_exp10[in_data_type];
75
- case CA_MONOP_LOG: return ca_monop_log[in_data_type];
76
- case CA_MONOP_LOG10: return ca_monop_log10[in_data_type];
77
- case CA_MONOP_LOG2: return ca_monop_log2[in_data_type];
78
- case CA_MONOP_LOGB: return ca_monop_logb[in_data_type];
79
- case CA_MONOP_SIN: return ca_monop_sin[in_data_type];
80
- case CA_MONOP_COS: return ca_monop_cos[in_data_type];
81
- case CA_MONOP_TAN: return ca_monop_tan[in_data_type];
82
- case CA_MONOP_ASIN: return ca_monop_asin[in_data_type];
83
- case CA_MONOP_ACOS: return ca_monop_acos[in_data_type];
84
- case CA_MONOP_ATAN: return ca_monop_atan[in_data_type];
85
- case CA_MONOP_SINH: return ca_monop_sinh[in_data_type];
86
- case CA_MONOP_COSH: return ca_monop_cosh[in_data_type];
87
- case CA_MONOP_TANH: return ca_monop_tanh[in_data_type];
88
- case CA_MONOP_ASINH: return ca_monop_asinh[in_data_type];
89
- case CA_MONOP_ACOSH: return ca_monop_acosh[in_data_type];
90
- case CA_MONOP_ATANH: return ca_monop_atanh[in_data_type];
91
-
92
- case CA_MONOP_BYTE_SWAP: return ca_monop_byte_swap[in_data_type];
93
-
94
- case CA_MONOP_IMAG_I: return ca_monop_imag_i[in_data_type];
95
-
96
- case CA_MONOP_EXPM1: return ca_monop_expm1 [in_data_type];
97
- case CA_MONOP_LOG1P: return ca_monop_log1p [in_data_type];
98
- case CA_MONOP_RSQRT: return ca_monop_rsqrt [in_data_type];
99
- case CA_MONOP_TRUNC: return ca_monop_trunc [in_data_type];
100
- case CA_MONOP_SQUARE: return ca_monop_square[in_data_type];
101
-
102
- case CA_MONOP_DEG_360: return ca_monop_deg_360[in_data_type];
103
- case CA_MONOP_DEG_180: return ca_monop_deg_180[in_data_type];
104
- case CA_MONOP_RAD_2PI: return ca_monop_rad_2pi[in_data_type];
105
- case CA_MONOP_RAD_PI: return ca_monop_rad_pi [in_data_type];
106
-
107
- case CA_MONOP_SIGN: return ca_monop_sign [in_data_type];
108
- case CA_MONOP_ARG_I: return ca_monop_arg_i [in_data_type];
55
+ case CA_MONOP_ZERO: return ca_monop_zero;
56
+ case CA_MONOP_ONE: return ca_monop_one;
57
+ case CA_MONOP_FRAC: return ca_monop_frac;
58
+ case CA_MONOP_NEG: return ca_monop_neg;
59
+ case CA_MONOP_BIT_NEG: return ca_monop_bit_neg;
60
+ case CA_MONOP_ABS_I: return ca_monop_abs_i;
61
+ case CA_MONOP_CONJ: return ca_monop_conj;
62
+ case CA_MONOP_NOT: return ca_monop_not;
63
+
64
+ case CA_MONOP_CEIL: return ca_monop_ceil;
65
+ case CA_MONOP_FLOOR: return ca_monop_floor;
66
+ case CA_MONOP_ROUND: return ca_monop_round;
67
+ case CA_MONOP_RCP: return ca_monop_rcp;
68
+
69
+ case CA_MONOP_RAD: return ca_monop_rad;
70
+ case CA_MONOP_DEG: return ca_monop_deg;
71
+ case CA_MONOP_SQRT: return ca_monop_sqrt;
72
+ case CA_MONOP_EXP: return ca_monop_exp;
73
+ case CA_MONOP_EXP2: return ca_monop_exp2;
74
+ case CA_MONOP_EXP10: return ca_monop_exp10;
75
+ case CA_MONOP_LOG: return ca_monop_log;
76
+ case CA_MONOP_LOG10: return ca_monop_log10;
77
+ case CA_MONOP_LOG2: return ca_monop_log2;
78
+ case CA_MONOP_LOGB: return ca_monop_logb;
79
+ case CA_MONOP_SIN: return ca_monop_sin;
80
+ case CA_MONOP_COS: return ca_monop_cos;
81
+ case CA_MONOP_TAN: return ca_monop_tan;
82
+ case CA_MONOP_ASIN: return ca_monop_asin;
83
+ case CA_MONOP_ACOS: return ca_monop_acos;
84
+ case CA_MONOP_ATAN: return ca_monop_atan;
85
+ case CA_MONOP_SINH: return ca_monop_sinh;
86
+ case CA_MONOP_COSH: return ca_monop_cosh;
87
+ case CA_MONOP_TANH: return ca_monop_tanh;
88
+ case CA_MONOP_ASINH: return ca_monop_asinh;
89
+ case CA_MONOP_ACOSH: return ca_monop_acosh;
90
+ case CA_MONOP_ATANH: return ca_monop_atanh;
91
+
92
+ case CA_MONOP_BYTE_SWAP: return ca_monop_byte_swap;
93
+
94
+ case CA_MONOP_IMAG_I: return ca_monop_imag_i;
95
+
96
+ case CA_MONOP_EXPM1: return ca_monop_expm1;
97
+ case CA_MONOP_LOG1P: return ca_monop_log1p;
98
+ case CA_MONOP_RSQRT: return ca_monop_rsqrt;
99
+ case CA_MONOP_TRUNC: return ca_monop_trunc;
100
+ case CA_MONOP_SQUARE: return ca_monop_square;
101
+
102
+ case CA_MONOP_DEG_360: return ca_monop_deg_360;
103
+ case CA_MONOP_DEG_180: return ca_monop_deg_180;
104
+ case CA_MONOP_RAD_2PI: return ca_monop_rad_2pi;
105
+ case CA_MONOP_RAD_PI: return ca_monop_rad_pi;
106
+
107
+ case CA_MONOP_SIGN: return ca_monop_sign;
108
+ case CA_MONOP_ARG_I: return ca_monop_arg_i;
109
109
 
110
110
  default:
111
111
  /* Cast ops or unknown — caller handles cast specially. */
@@ -113,15 +113,38 @@ ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type)
113
113
  }
114
114
  }
115
115
 
116
+ /* Returns the kernel for the given input data_type. Returns NULL for
117
+ cast ops and unknown op_ids. */
118
+ ca_monop_func_t
119
+ ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type)
120
+ {
121
+ ca_monop_func_t *table = ca_monop_table_of(op_id);
122
+ return table ? table[in_data_type] : NULL;
123
+ }
124
+
125
+ /* The op id whose kernel table is `table`, or -1 for a table no op id
126
+ names. */
127
+ int
128
+ ca_monop_op_id_of_table (ca_monop_func_t table[])
129
+ {
130
+ int op_id;
131
+ for ( op_id = 0; op_id < CA_MONOP_CAST_BASE; op_id++ ) {
132
+ if ( ca_monop_table_of((uint16_t) op_id) == table ) return op_id;
133
+ }
134
+ return -1;
135
+ }
136
+
137
+
138
+
116
139
  /* ------------------------------------------------------------------- */
117
140
  /* op category predicates */
118
141
  /* ------------------------------------------------------------------- */
119
142
 
120
- /* True if op widens integer / boolean parent to CA_FLOAT64. False for
143
+ /* True if op widens an integer parent to CA_FLOAT64. False for
121
144
  preserve ops and cast ops. Widening ops are enumerated explicitly
122
145
  because they were added in multiple groups outside the original
123
146
  contiguous WIDENING_BEGIN..WIDENING_END range. */
124
- static int
147
+ int
125
148
  ca_monop_is_widening (uint16_t op_id)
126
149
  {
127
150
  if ( op_id >= CA_MONOP_WIDENING_BEGIN && op_id < CA_MONOP_WIDENING_END ) {
@@ -170,8 +193,8 @@ ca_lazy_promote_monop (uint16_t op_id, int8_t in_data_type)
170
193
  return (int8_t)(op_id - CA_MONOP_CAST_BASE);
171
194
  }
172
195
  if ( ca_monop_is_widening(op_id) ) {
173
- /* integer → f64, else preserve. Boolean (CA_BOOLEAN = 1) is also
174
- widened to f64 (existing eager behaviour via wrap_readonly). */
196
+ /* integer → f64, else preserve. A boolean parent never reaches a
197
+ widening op: the builder refuses it, as the eager monop does. */
175
198
  if ( in_data_type < CA_FLOAT32 ) return CA_FLOAT64;
176
199
  return in_data_type;
177
200
  }
@@ -190,10 +190,15 @@ extern ca_monop_func_t ca_monop_arg_i [CA_NTYPE];
190
190
  /* Look up the per-data_type kernel for a normal monop op_id. Returns NULL
191
191
  for cast op_ids (caller handles cast via ca_cast_block). */
192
192
  ca_monop_func_t ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type);
193
+ int ca_monop_op_id_of_table (ca_monop_func_t table[]);
193
194
 
194
195
  /* Returns true iff op_id encodes a cast operation. */
195
196
  int ca_monop_is_cast (uint16_t op_id);
196
197
 
198
+ /* Returns true iff op_id widens an integer parent to CA_FLOAT64 (the
199
+ math functions: sqrt, sin, exp, ...). */
200
+ int ca_monop_is_widening (uint16_t op_id);
201
+
197
202
  /* Phase 6 P.6.3: returns true iff op_id is a "writable view" op
198
203
  (= cast or byte_swap). These ops:
199
204
  - support writable view lifecycle (CA_FLAG_READ_ONLY not set)