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,3466 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray_kernels.c -- GENERATED by ext/mkkernel.rb -- DO NOT EDIT
4
+
5
+ Kernel definitions live in mkkernel.rb (search for `MkKernel.reduce`).
6
+ Regenerate by running:
7
+
8
+ cd ext && ruby mkkernel.rb > carray_kernels.c
9
+
10
+ extconf.rb regenerates automatically when mkkernel.rb is touched.
11
+
12
+ --------------------------------------------------------------------------- */
13
+
14
+ #include "carray.h"
15
+ #include "ca_kernel_iterator.h"
16
+ #include "ca_sort_kernels.h" /* sort kernels: internal, not via the carray.h umbrella */
17
+ #include "carray_internal.h" /* ca_lazy_arena_*, ca_is_lazy_view (streaming reduce) */
18
+ #include "ca_obj_face.h" /* rb_ca_strip_face_value (Face ordering gate) */
19
+ #include <math.h>
20
+ #include <stdint.h>
21
+ #include <stdlib.h> /* qsort, mergesort (HAVE_MERGESORT) -- for :sort kind */
22
+
23
+ /* MEMO_REDUCTION_FASTPATH_ENTITY_ONLY_GUARD Tier 2: CAStack identity is
24
+ probed by operation-table function pointer (obj_type is runtime-
25
+ assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
+ extern ca_operation_function_t ca_stack_func;
27
+ /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
+ for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
+ return real true/false, not Integer 0/1. (BOOL2OBJ already exists
30
+ but returns Integer per CArray's boolean-as-int convention.) */
31
+ #ifndef CARRAY_BOOL2VAL_DEFINED
32
+ #define CARRAY_BOOL2VAL_DEFINED
33
+ static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
34
+ #endif
35
+
36
+ #include "ca_op_powi.h"
37
+
38
+ /* ===== sqrt_ki ============================================ */
39
+
40
+ static VALUE
41
+ sqrt_ki_native_i8 (VALUE self, CArray *ca)
42
+ {
43
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
44
+ INT2NUM(sizeof(double)));
45
+ CArray *co;
46
+ GetCArray(vout, co);
47
+
48
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
49
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
50
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
51
+ K-D-walkable form. */
52
+ int8_t slab_axes[CA_RANK_MAX];
53
+ int8_t naxes = ca->ndim;
54
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
55
+
56
+ ca_iter_state st_in, st_out;
57
+ int rc;
58
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
59
+ slab_axes, naxes, 0);
60
+ if ( rc != CA_ITER_OK ) {
61
+ rb_raise(rb_eRuntimeError,
62
+ "sqrt_ki: input init failed rc=%d", rc);
63
+ }
64
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
65
+ slab_axes, naxes, CA_KERNEL_WRITE);
66
+ if ( rc != CA_ITER_OK ) {
67
+ ca_iter_state_finish(&st_in);
68
+ rb_raise(rb_eRuntimeError,
69
+ "sqrt_ki: output init failed rc=%d", rc);
70
+ }
71
+
72
+ char *pi, *po;
73
+ boolean8_t *mi, *mo;
74
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
75
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
76
+ CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
77
+ ca_iter_state_sync_slab(&st_out);
78
+ }
79
+ ca_iter_state_finish(&st_in);
80
+ ca_iter_state_finish(&st_out);
81
+ return vout;
82
+ }
83
+
84
+ static VALUE
85
+ sqrt_ki_native_u8 (VALUE self, CArray *ca)
86
+ {
87
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
88
+ INT2NUM(sizeof(double)));
89
+ CArray *co;
90
+ GetCArray(vout, co);
91
+
92
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
93
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
94
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
95
+ K-D-walkable form. */
96
+ int8_t slab_axes[CA_RANK_MAX];
97
+ int8_t naxes = ca->ndim;
98
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
99
+
100
+ ca_iter_state st_in, st_out;
101
+ int rc;
102
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
103
+ slab_axes, naxes, 0);
104
+ if ( rc != CA_ITER_OK ) {
105
+ rb_raise(rb_eRuntimeError,
106
+ "sqrt_ki: input init failed rc=%d", rc);
107
+ }
108
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
109
+ slab_axes, naxes, CA_KERNEL_WRITE);
110
+ if ( rc != CA_ITER_OK ) {
111
+ ca_iter_state_finish(&st_in);
112
+ rb_raise(rb_eRuntimeError,
113
+ "sqrt_ki: output init failed rc=%d", rc);
114
+ }
115
+
116
+ char *pi, *po;
117
+ boolean8_t *mi, *mo;
118
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
119
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
120
+ CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
121
+ ca_iter_state_sync_slab(&st_out);
122
+ }
123
+ ca_iter_state_finish(&st_in);
124
+ ca_iter_state_finish(&st_out);
125
+ return vout;
126
+ }
127
+
128
+ static VALUE
129
+ sqrt_ki_native_i16 (VALUE self, CArray *ca)
130
+ {
131
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
132
+ INT2NUM(sizeof(double)));
133
+ CArray *co;
134
+ GetCArray(vout, co);
135
+
136
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
137
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
138
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
139
+ K-D-walkable form. */
140
+ int8_t slab_axes[CA_RANK_MAX];
141
+ int8_t naxes = ca->ndim;
142
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
143
+
144
+ ca_iter_state st_in, st_out;
145
+ int rc;
146
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
147
+ slab_axes, naxes, 0);
148
+ if ( rc != CA_ITER_OK ) {
149
+ rb_raise(rb_eRuntimeError,
150
+ "sqrt_ki: input init failed rc=%d", rc);
151
+ }
152
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
153
+ slab_axes, naxes, CA_KERNEL_WRITE);
154
+ if ( rc != CA_ITER_OK ) {
155
+ ca_iter_state_finish(&st_in);
156
+ rb_raise(rb_eRuntimeError,
157
+ "sqrt_ki: output init failed rc=%d", rc);
158
+ }
159
+
160
+ char *pi, *po;
161
+ boolean8_t *mi, *mo;
162
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
163
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
164
+ CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
165
+ ca_iter_state_sync_slab(&st_out);
166
+ }
167
+ ca_iter_state_finish(&st_in);
168
+ ca_iter_state_finish(&st_out);
169
+ return vout;
170
+ }
171
+
172
+ static VALUE
173
+ sqrt_ki_native_u16 (VALUE self, CArray *ca)
174
+ {
175
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
176
+ INT2NUM(sizeof(double)));
177
+ CArray *co;
178
+ GetCArray(vout, co);
179
+
180
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
181
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
182
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
183
+ K-D-walkable form. */
184
+ int8_t slab_axes[CA_RANK_MAX];
185
+ int8_t naxes = ca->ndim;
186
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
187
+
188
+ ca_iter_state st_in, st_out;
189
+ int rc;
190
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
191
+ slab_axes, naxes, 0);
192
+ if ( rc != CA_ITER_OK ) {
193
+ rb_raise(rb_eRuntimeError,
194
+ "sqrt_ki: input init failed rc=%d", rc);
195
+ }
196
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
197
+ slab_axes, naxes, CA_KERNEL_WRITE);
198
+ if ( rc != CA_ITER_OK ) {
199
+ ca_iter_state_finish(&st_in);
200
+ rb_raise(rb_eRuntimeError,
201
+ "sqrt_ki: output init failed rc=%d", rc);
202
+ }
203
+
204
+ char *pi, *po;
205
+ boolean8_t *mi, *mo;
206
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
207
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
208
+ CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
209
+ ca_iter_state_sync_slab(&st_out);
210
+ }
211
+ ca_iter_state_finish(&st_in);
212
+ ca_iter_state_finish(&st_out);
213
+ return vout;
214
+ }
215
+
216
+ static VALUE
217
+ sqrt_ki_native_i32 (VALUE self, CArray *ca)
218
+ {
219
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
220
+ INT2NUM(sizeof(double)));
221
+ CArray *co;
222
+ GetCArray(vout, co);
223
+
224
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
225
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
226
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
227
+ K-D-walkable form. */
228
+ int8_t slab_axes[CA_RANK_MAX];
229
+ int8_t naxes = ca->ndim;
230
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
231
+
232
+ ca_iter_state st_in, st_out;
233
+ int rc;
234
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
235
+ slab_axes, naxes, 0);
236
+ if ( rc != CA_ITER_OK ) {
237
+ rb_raise(rb_eRuntimeError,
238
+ "sqrt_ki: input init failed rc=%d", rc);
239
+ }
240
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
241
+ slab_axes, naxes, CA_KERNEL_WRITE);
242
+ if ( rc != CA_ITER_OK ) {
243
+ ca_iter_state_finish(&st_in);
244
+ rb_raise(rb_eRuntimeError,
245
+ "sqrt_ki: output init failed rc=%d", rc);
246
+ }
247
+
248
+ char *pi, *po;
249
+ boolean8_t *mi, *mo;
250
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
251
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
252
+ CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
253
+ ca_iter_state_sync_slab(&st_out);
254
+ }
255
+ ca_iter_state_finish(&st_in);
256
+ ca_iter_state_finish(&st_out);
257
+ return vout;
258
+ }
259
+
260
+ static VALUE
261
+ sqrt_ki_native_u32 (VALUE self, CArray *ca)
262
+ {
263
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
264
+ INT2NUM(sizeof(double)));
265
+ CArray *co;
266
+ GetCArray(vout, co);
267
+
268
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
269
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
270
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
271
+ K-D-walkable form. */
272
+ int8_t slab_axes[CA_RANK_MAX];
273
+ int8_t naxes = ca->ndim;
274
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
275
+
276
+ ca_iter_state st_in, st_out;
277
+ int rc;
278
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
279
+ slab_axes, naxes, 0);
280
+ if ( rc != CA_ITER_OK ) {
281
+ rb_raise(rb_eRuntimeError,
282
+ "sqrt_ki: input init failed rc=%d", rc);
283
+ }
284
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
285
+ slab_axes, naxes, CA_KERNEL_WRITE);
286
+ if ( rc != CA_ITER_OK ) {
287
+ ca_iter_state_finish(&st_in);
288
+ rb_raise(rb_eRuntimeError,
289
+ "sqrt_ki: output init failed rc=%d", rc);
290
+ }
291
+
292
+ char *pi, *po;
293
+ boolean8_t *mi, *mo;
294
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
295
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
296
+ CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
297
+ ca_iter_state_sync_slab(&st_out);
298
+ }
299
+ ca_iter_state_finish(&st_in);
300
+ ca_iter_state_finish(&st_out);
301
+ return vout;
302
+ }
303
+
304
+ static VALUE
305
+ sqrt_ki_native_i64 (VALUE self, CArray *ca)
306
+ {
307
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
308
+ INT2NUM(sizeof(double)));
309
+ CArray *co;
310
+ GetCArray(vout, co);
311
+
312
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
313
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
314
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
315
+ K-D-walkable form. */
316
+ int8_t slab_axes[CA_RANK_MAX];
317
+ int8_t naxes = ca->ndim;
318
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
319
+
320
+ ca_iter_state st_in, st_out;
321
+ int rc;
322
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
323
+ slab_axes, naxes, 0);
324
+ if ( rc != CA_ITER_OK ) {
325
+ rb_raise(rb_eRuntimeError,
326
+ "sqrt_ki: input init failed rc=%d", rc);
327
+ }
328
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
329
+ slab_axes, naxes, CA_KERNEL_WRITE);
330
+ if ( rc != CA_ITER_OK ) {
331
+ ca_iter_state_finish(&st_in);
332
+ rb_raise(rb_eRuntimeError,
333
+ "sqrt_ki: output init failed rc=%d", rc);
334
+ }
335
+
336
+ char *pi, *po;
337
+ boolean8_t *mi, *mo;
338
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
339
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
340
+ CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
341
+ ca_iter_state_sync_slab(&st_out);
342
+ }
343
+ ca_iter_state_finish(&st_in);
344
+ ca_iter_state_finish(&st_out);
345
+ return vout;
346
+ }
347
+
348
+ static VALUE
349
+ sqrt_ki_native_u64 (VALUE self, CArray *ca)
350
+ {
351
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
352
+ INT2NUM(sizeof(double)));
353
+ CArray *co;
354
+ GetCArray(vout, co);
355
+
356
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
357
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
358
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
359
+ K-D-walkable form. */
360
+ int8_t slab_axes[CA_RANK_MAX];
361
+ int8_t naxes = ca->ndim;
362
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
363
+
364
+ ca_iter_state st_in, st_out;
365
+ int rc;
366
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
367
+ slab_axes, naxes, 0);
368
+ if ( rc != CA_ITER_OK ) {
369
+ rb_raise(rb_eRuntimeError,
370
+ "sqrt_ki: input init failed rc=%d", rc);
371
+ }
372
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
373
+ slab_axes, naxes, CA_KERNEL_WRITE);
374
+ if ( rc != CA_ITER_OK ) {
375
+ ca_iter_state_finish(&st_in);
376
+ rb_raise(rb_eRuntimeError,
377
+ "sqrt_ki: output init failed rc=%d", rc);
378
+ }
379
+
380
+ char *pi, *po;
381
+ boolean8_t *mi, *mo;
382
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
383
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
384
+ CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
385
+ ca_iter_state_sync_slab(&st_out);
386
+ }
387
+ ca_iter_state_finish(&st_in);
388
+ ca_iter_state_finish(&st_out);
389
+ return vout;
390
+ }
391
+
392
+ static VALUE
393
+ sqrt_ki_native_f32 (VALUE self, CArray *ca)
394
+ {
395
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
396
+ INT2NUM(sizeof(double)));
397
+ CArray *co;
398
+ GetCArray(vout, co);
399
+
400
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
401
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
402
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
403
+ K-D-walkable form. */
404
+ int8_t slab_axes[CA_RANK_MAX];
405
+ int8_t naxes = ca->ndim;
406
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
407
+
408
+ ca_iter_state st_in, st_out;
409
+ int rc;
410
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
411
+ slab_axes, naxes, 0);
412
+ if ( rc != CA_ITER_OK ) {
413
+ rb_raise(rb_eRuntimeError,
414
+ "sqrt_ki: input init failed rc=%d", rc);
415
+ }
416
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
417
+ slab_axes, naxes, CA_KERNEL_WRITE);
418
+ if ( rc != CA_ITER_OK ) {
419
+ ca_iter_state_finish(&st_in);
420
+ rb_raise(rb_eRuntimeError,
421
+ "sqrt_ki: output init failed rc=%d", rc);
422
+ }
423
+
424
+ char *pi, *po;
425
+ boolean8_t *mi, *mo;
426
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
427
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
428
+ CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = sqrt((double) v));
429
+ ca_iter_state_sync_slab(&st_out);
430
+ }
431
+ ca_iter_state_finish(&st_in);
432
+ ca_iter_state_finish(&st_out);
433
+ return vout;
434
+ }
435
+
436
+ static VALUE
437
+ sqrt_ki_native_f64 (VALUE self, CArray *ca)
438
+ {
439
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
440
+ INT2NUM(sizeof(double)));
441
+ CArray *co;
442
+ GetCArray(vout, co);
443
+
444
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
445
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
446
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
447
+ K-D-walkable form. */
448
+ int8_t slab_axes[CA_RANK_MAX];
449
+ int8_t naxes = ca->ndim;
450
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
451
+
452
+ ca_iter_state st_in, st_out;
453
+ int rc;
454
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
455
+ slab_axes, naxes, 0);
456
+ if ( rc != CA_ITER_OK ) {
457
+ rb_raise(rb_eRuntimeError,
458
+ "sqrt_ki: input init failed rc=%d", rc);
459
+ }
460
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
461
+ slab_axes, naxes, CA_KERNEL_WRITE);
462
+ if ( rc != CA_ITER_OK ) {
463
+ ca_iter_state_finish(&st_in);
464
+ rb_raise(rb_eRuntimeError,
465
+ "sqrt_ki: output init failed rc=%d", rc);
466
+ }
467
+
468
+ char *pi, *po;
469
+ boolean8_t *mi, *mo;
470
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
471
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
472
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = sqrt((double) v));
473
+ ca_iter_state_sync_slab(&st_out);
474
+ }
475
+ ca_iter_state_finish(&st_in);
476
+ ca_iter_state_finish(&st_out);
477
+ return vout;
478
+ }
479
+
480
+ static VALUE
481
+ rb_ca_sqrt_ki (VALUE self)
482
+ {
483
+ CArray *src;
484
+ GetCArray(self, src);
485
+ switch ( src->data_type ) {
486
+ case CA_INT8: return sqrt_ki_native_i8(self, src);
487
+ case CA_UINT8: return sqrt_ki_native_u8(self, src);
488
+ case CA_INT16: return sqrt_ki_native_i16(self, src);
489
+ case CA_UINT16: return sqrt_ki_native_u16(self, src);
490
+ case CA_INT32: return sqrt_ki_native_i32(self, src);
491
+ case CA_UINT32: return sqrt_ki_native_u32(self, src);
492
+ case CA_INT64: return sqrt_ki_native_i64(self, src);
493
+ case CA_UINT64: return sqrt_ki_native_u64(self, src);
494
+ case CA_FLOAT32: return sqrt_ki_native_f32(self, src);
495
+ case CA_FLOAT64: return sqrt_ki_native_f64(self, src);
496
+ default: {
497
+ /* Phase E: only wrap data_types that have a meaningful float64
498
+ representation. Complex / fixlen / object would lose
499
+ structure (e.g. complex -> float strips imaginary part)
500
+ so reject explicitly, matching legacy DataTypeError. */
501
+ switch ( src->data_type ) {
502
+ case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
503
+ default:
504
+ rb_raise(rb_eCADataTypeError, "sqrt_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
505
+ }
506
+ VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
507
+ CArray *casted;
508
+ GetCArray(vsrc, casted);
509
+ return sqrt_ki_native_f64(vsrc, casted);
510
+ }
511
+ }
512
+ return Qnil; /* unreachable */
513
+ }
514
+
515
+ /* ===== sin_ki ============================================ */
516
+
517
+ static VALUE
518
+ sin_ki_native_i8 (VALUE self, CArray *ca)
519
+ {
520
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
521
+ INT2NUM(sizeof(double)));
522
+ CArray *co;
523
+ GetCArray(vout, co);
524
+
525
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
526
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
527
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
528
+ K-D-walkable form. */
529
+ int8_t slab_axes[CA_RANK_MAX];
530
+ int8_t naxes = ca->ndim;
531
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
532
+
533
+ ca_iter_state st_in, st_out;
534
+ int rc;
535
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
536
+ slab_axes, naxes, 0);
537
+ if ( rc != CA_ITER_OK ) {
538
+ rb_raise(rb_eRuntimeError,
539
+ "sin_ki: input init failed rc=%d", rc);
540
+ }
541
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
542
+ slab_axes, naxes, CA_KERNEL_WRITE);
543
+ if ( rc != CA_ITER_OK ) {
544
+ ca_iter_state_finish(&st_in);
545
+ rb_raise(rb_eRuntimeError,
546
+ "sin_ki: output init failed rc=%d", rc);
547
+ }
548
+
549
+ char *pi, *po;
550
+ boolean8_t *mi, *mo;
551
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
552
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
553
+ CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = sin((double) v));
554
+ ca_iter_state_sync_slab(&st_out);
555
+ }
556
+ ca_iter_state_finish(&st_in);
557
+ ca_iter_state_finish(&st_out);
558
+ return vout;
559
+ }
560
+
561
+ static VALUE
562
+ sin_ki_native_u8 (VALUE self, CArray *ca)
563
+ {
564
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
565
+ INT2NUM(sizeof(double)));
566
+ CArray *co;
567
+ GetCArray(vout, co);
568
+
569
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
570
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
571
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
572
+ K-D-walkable form. */
573
+ int8_t slab_axes[CA_RANK_MAX];
574
+ int8_t naxes = ca->ndim;
575
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
576
+
577
+ ca_iter_state st_in, st_out;
578
+ int rc;
579
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
580
+ slab_axes, naxes, 0);
581
+ if ( rc != CA_ITER_OK ) {
582
+ rb_raise(rb_eRuntimeError,
583
+ "sin_ki: input init failed rc=%d", rc);
584
+ }
585
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
586
+ slab_axes, naxes, CA_KERNEL_WRITE);
587
+ if ( rc != CA_ITER_OK ) {
588
+ ca_iter_state_finish(&st_in);
589
+ rb_raise(rb_eRuntimeError,
590
+ "sin_ki: output init failed rc=%d", rc);
591
+ }
592
+
593
+ char *pi, *po;
594
+ boolean8_t *mi, *mo;
595
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
596
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
597
+ CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = sin((double) v));
598
+ ca_iter_state_sync_slab(&st_out);
599
+ }
600
+ ca_iter_state_finish(&st_in);
601
+ ca_iter_state_finish(&st_out);
602
+ return vout;
603
+ }
604
+
605
+ static VALUE
606
+ sin_ki_native_i16 (VALUE self, CArray *ca)
607
+ {
608
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
609
+ INT2NUM(sizeof(double)));
610
+ CArray *co;
611
+ GetCArray(vout, co);
612
+
613
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
614
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
615
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
616
+ K-D-walkable form. */
617
+ int8_t slab_axes[CA_RANK_MAX];
618
+ int8_t naxes = ca->ndim;
619
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
620
+
621
+ ca_iter_state st_in, st_out;
622
+ int rc;
623
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
624
+ slab_axes, naxes, 0);
625
+ if ( rc != CA_ITER_OK ) {
626
+ rb_raise(rb_eRuntimeError,
627
+ "sin_ki: input init failed rc=%d", rc);
628
+ }
629
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
630
+ slab_axes, naxes, CA_KERNEL_WRITE);
631
+ if ( rc != CA_ITER_OK ) {
632
+ ca_iter_state_finish(&st_in);
633
+ rb_raise(rb_eRuntimeError,
634
+ "sin_ki: output init failed rc=%d", rc);
635
+ }
636
+
637
+ char *pi, *po;
638
+ boolean8_t *mi, *mo;
639
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
640
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
641
+ CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = sin((double) v));
642
+ ca_iter_state_sync_slab(&st_out);
643
+ }
644
+ ca_iter_state_finish(&st_in);
645
+ ca_iter_state_finish(&st_out);
646
+ return vout;
647
+ }
648
+
649
+ static VALUE
650
+ sin_ki_native_u16 (VALUE self, CArray *ca)
651
+ {
652
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
653
+ INT2NUM(sizeof(double)));
654
+ CArray *co;
655
+ GetCArray(vout, co);
656
+
657
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
658
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
659
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
660
+ K-D-walkable form. */
661
+ int8_t slab_axes[CA_RANK_MAX];
662
+ int8_t naxes = ca->ndim;
663
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
664
+
665
+ ca_iter_state st_in, st_out;
666
+ int rc;
667
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
668
+ slab_axes, naxes, 0);
669
+ if ( rc != CA_ITER_OK ) {
670
+ rb_raise(rb_eRuntimeError,
671
+ "sin_ki: input init failed rc=%d", rc);
672
+ }
673
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
674
+ slab_axes, naxes, CA_KERNEL_WRITE);
675
+ if ( rc != CA_ITER_OK ) {
676
+ ca_iter_state_finish(&st_in);
677
+ rb_raise(rb_eRuntimeError,
678
+ "sin_ki: output init failed rc=%d", rc);
679
+ }
680
+
681
+ char *pi, *po;
682
+ boolean8_t *mi, *mo;
683
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
684
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
685
+ CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = sin((double) v));
686
+ ca_iter_state_sync_slab(&st_out);
687
+ }
688
+ ca_iter_state_finish(&st_in);
689
+ ca_iter_state_finish(&st_out);
690
+ return vout;
691
+ }
692
+
693
+ static VALUE
694
+ sin_ki_native_i32 (VALUE self, CArray *ca)
695
+ {
696
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
697
+ INT2NUM(sizeof(double)));
698
+ CArray *co;
699
+ GetCArray(vout, co);
700
+
701
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
702
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
703
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
704
+ K-D-walkable form. */
705
+ int8_t slab_axes[CA_RANK_MAX];
706
+ int8_t naxes = ca->ndim;
707
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
708
+
709
+ ca_iter_state st_in, st_out;
710
+ int rc;
711
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
712
+ slab_axes, naxes, 0);
713
+ if ( rc != CA_ITER_OK ) {
714
+ rb_raise(rb_eRuntimeError,
715
+ "sin_ki: input init failed rc=%d", rc);
716
+ }
717
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
718
+ slab_axes, naxes, CA_KERNEL_WRITE);
719
+ if ( rc != CA_ITER_OK ) {
720
+ ca_iter_state_finish(&st_in);
721
+ rb_raise(rb_eRuntimeError,
722
+ "sin_ki: output init failed rc=%d", rc);
723
+ }
724
+
725
+ char *pi, *po;
726
+ boolean8_t *mi, *mo;
727
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
728
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
729
+ CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = sin((double) v));
730
+ ca_iter_state_sync_slab(&st_out);
731
+ }
732
+ ca_iter_state_finish(&st_in);
733
+ ca_iter_state_finish(&st_out);
734
+ return vout;
735
+ }
736
+
737
+ static VALUE
738
+ sin_ki_native_u32 (VALUE self, CArray *ca)
739
+ {
740
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
741
+ INT2NUM(sizeof(double)));
742
+ CArray *co;
743
+ GetCArray(vout, co);
744
+
745
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
746
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
747
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
748
+ K-D-walkable form. */
749
+ int8_t slab_axes[CA_RANK_MAX];
750
+ int8_t naxes = ca->ndim;
751
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
752
+
753
+ ca_iter_state st_in, st_out;
754
+ int rc;
755
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
756
+ slab_axes, naxes, 0);
757
+ if ( rc != CA_ITER_OK ) {
758
+ rb_raise(rb_eRuntimeError,
759
+ "sin_ki: input init failed rc=%d", rc);
760
+ }
761
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
762
+ slab_axes, naxes, CA_KERNEL_WRITE);
763
+ if ( rc != CA_ITER_OK ) {
764
+ ca_iter_state_finish(&st_in);
765
+ rb_raise(rb_eRuntimeError,
766
+ "sin_ki: output init failed rc=%d", rc);
767
+ }
768
+
769
+ char *pi, *po;
770
+ boolean8_t *mi, *mo;
771
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
772
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
773
+ CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = sin((double) v));
774
+ ca_iter_state_sync_slab(&st_out);
775
+ }
776
+ ca_iter_state_finish(&st_in);
777
+ ca_iter_state_finish(&st_out);
778
+ return vout;
779
+ }
780
+
781
+ static VALUE
782
+ sin_ki_native_i64 (VALUE self, CArray *ca)
783
+ {
784
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
785
+ INT2NUM(sizeof(double)));
786
+ CArray *co;
787
+ GetCArray(vout, co);
788
+
789
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
790
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
791
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
792
+ K-D-walkable form. */
793
+ int8_t slab_axes[CA_RANK_MAX];
794
+ int8_t naxes = ca->ndim;
795
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
796
+
797
+ ca_iter_state st_in, st_out;
798
+ int rc;
799
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
800
+ slab_axes, naxes, 0);
801
+ if ( rc != CA_ITER_OK ) {
802
+ rb_raise(rb_eRuntimeError,
803
+ "sin_ki: input init failed rc=%d", rc);
804
+ }
805
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
806
+ slab_axes, naxes, CA_KERNEL_WRITE);
807
+ if ( rc != CA_ITER_OK ) {
808
+ ca_iter_state_finish(&st_in);
809
+ rb_raise(rb_eRuntimeError,
810
+ "sin_ki: output init failed rc=%d", rc);
811
+ }
812
+
813
+ char *pi, *po;
814
+ boolean8_t *mi, *mo;
815
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
816
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
817
+ CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = sin((double) v));
818
+ ca_iter_state_sync_slab(&st_out);
819
+ }
820
+ ca_iter_state_finish(&st_in);
821
+ ca_iter_state_finish(&st_out);
822
+ return vout;
823
+ }
824
+
825
+ static VALUE
826
+ sin_ki_native_u64 (VALUE self, CArray *ca)
827
+ {
828
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
829
+ INT2NUM(sizeof(double)));
830
+ CArray *co;
831
+ GetCArray(vout, co);
832
+
833
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
834
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
835
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
836
+ K-D-walkable form. */
837
+ int8_t slab_axes[CA_RANK_MAX];
838
+ int8_t naxes = ca->ndim;
839
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
840
+
841
+ ca_iter_state st_in, st_out;
842
+ int rc;
843
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
844
+ slab_axes, naxes, 0);
845
+ if ( rc != CA_ITER_OK ) {
846
+ rb_raise(rb_eRuntimeError,
847
+ "sin_ki: input init failed rc=%d", rc);
848
+ }
849
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
850
+ slab_axes, naxes, CA_KERNEL_WRITE);
851
+ if ( rc != CA_ITER_OK ) {
852
+ ca_iter_state_finish(&st_in);
853
+ rb_raise(rb_eRuntimeError,
854
+ "sin_ki: output init failed rc=%d", rc);
855
+ }
856
+
857
+ char *pi, *po;
858
+ boolean8_t *mi, *mo;
859
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
860
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
861
+ CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = sin((double) v));
862
+ ca_iter_state_sync_slab(&st_out);
863
+ }
864
+ ca_iter_state_finish(&st_in);
865
+ ca_iter_state_finish(&st_out);
866
+ return vout;
867
+ }
868
+
869
+ static VALUE
870
+ sin_ki_native_f32 (VALUE self, CArray *ca)
871
+ {
872
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
873
+ INT2NUM(sizeof(double)));
874
+ CArray *co;
875
+ GetCArray(vout, co);
876
+
877
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
878
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
879
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
880
+ K-D-walkable form. */
881
+ int8_t slab_axes[CA_RANK_MAX];
882
+ int8_t naxes = ca->ndim;
883
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
884
+
885
+ ca_iter_state st_in, st_out;
886
+ int rc;
887
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
888
+ slab_axes, naxes, 0);
889
+ if ( rc != CA_ITER_OK ) {
890
+ rb_raise(rb_eRuntimeError,
891
+ "sin_ki: input init failed rc=%d", rc);
892
+ }
893
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
894
+ slab_axes, naxes, CA_KERNEL_WRITE);
895
+ if ( rc != CA_ITER_OK ) {
896
+ ca_iter_state_finish(&st_in);
897
+ rb_raise(rb_eRuntimeError,
898
+ "sin_ki: output init failed rc=%d", rc);
899
+ }
900
+
901
+ char *pi, *po;
902
+ boolean8_t *mi, *mo;
903
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
904
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
905
+ CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = sin((double) v));
906
+ ca_iter_state_sync_slab(&st_out);
907
+ }
908
+ ca_iter_state_finish(&st_in);
909
+ ca_iter_state_finish(&st_out);
910
+ return vout;
911
+ }
912
+
913
+ static VALUE
914
+ sin_ki_native_f64 (VALUE self, CArray *ca)
915
+ {
916
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
917
+ INT2NUM(sizeof(double)));
918
+ CArray *co;
919
+ GetCArray(vout, co);
920
+
921
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
922
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
923
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
924
+ K-D-walkable form. */
925
+ int8_t slab_axes[CA_RANK_MAX];
926
+ int8_t naxes = ca->ndim;
927
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
928
+
929
+ ca_iter_state st_in, st_out;
930
+ int rc;
931
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
932
+ slab_axes, naxes, 0);
933
+ if ( rc != CA_ITER_OK ) {
934
+ rb_raise(rb_eRuntimeError,
935
+ "sin_ki: input init failed rc=%d", rc);
936
+ }
937
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
938
+ slab_axes, naxes, CA_KERNEL_WRITE);
939
+ if ( rc != CA_ITER_OK ) {
940
+ ca_iter_state_finish(&st_in);
941
+ rb_raise(rb_eRuntimeError,
942
+ "sin_ki: output init failed rc=%d", rc);
943
+ }
944
+
945
+ char *pi, *po;
946
+ boolean8_t *mi, *mo;
947
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
948
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
949
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = sin((double) v));
950
+ ca_iter_state_sync_slab(&st_out);
951
+ }
952
+ ca_iter_state_finish(&st_in);
953
+ ca_iter_state_finish(&st_out);
954
+ return vout;
955
+ }
956
+
957
+ static VALUE
958
+ rb_ca_sin_ki (VALUE self)
959
+ {
960
+ CArray *src;
961
+ GetCArray(self, src);
962
+ switch ( src->data_type ) {
963
+ case CA_INT8: return sin_ki_native_i8(self, src);
964
+ case CA_UINT8: return sin_ki_native_u8(self, src);
965
+ case CA_INT16: return sin_ki_native_i16(self, src);
966
+ case CA_UINT16: return sin_ki_native_u16(self, src);
967
+ case CA_INT32: return sin_ki_native_i32(self, src);
968
+ case CA_UINT32: return sin_ki_native_u32(self, src);
969
+ case CA_INT64: return sin_ki_native_i64(self, src);
970
+ case CA_UINT64: return sin_ki_native_u64(self, src);
971
+ case CA_FLOAT32: return sin_ki_native_f32(self, src);
972
+ case CA_FLOAT64: return sin_ki_native_f64(self, src);
973
+ default: {
974
+ /* Phase E: only wrap data_types that have a meaningful float64
975
+ representation. Complex / fixlen / object would lose
976
+ structure (e.g. complex -> float strips imaginary part)
977
+ so reject explicitly, matching legacy DataTypeError. */
978
+ switch ( src->data_type ) {
979
+ case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
980
+ default:
981
+ rb_raise(rb_eCADataTypeError, "sin_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
982
+ }
983
+ VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
984
+ CArray *casted;
985
+ GetCArray(vsrc, casted);
986
+ return sin_ki_native_f64(vsrc, casted);
987
+ }
988
+ }
989
+ return Qnil; /* unreachable */
990
+ }
991
+
992
+ /* ===== cos_ki ============================================ */
993
+
994
+ static VALUE
995
+ cos_ki_native_i8 (VALUE self, CArray *ca)
996
+ {
997
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
998
+ INT2NUM(sizeof(double)));
999
+ CArray *co;
1000
+ GetCArray(vout, co);
1001
+
1002
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1003
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1004
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1005
+ K-D-walkable form. */
1006
+ int8_t slab_axes[CA_RANK_MAX];
1007
+ int8_t naxes = ca->ndim;
1008
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1009
+
1010
+ ca_iter_state st_in, st_out;
1011
+ int rc;
1012
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1013
+ slab_axes, naxes, 0);
1014
+ if ( rc != CA_ITER_OK ) {
1015
+ rb_raise(rb_eRuntimeError,
1016
+ "cos_ki: input init failed rc=%d", rc);
1017
+ }
1018
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1019
+ slab_axes, naxes, CA_KERNEL_WRITE);
1020
+ if ( rc != CA_ITER_OK ) {
1021
+ ca_iter_state_finish(&st_in);
1022
+ rb_raise(rb_eRuntimeError,
1023
+ "cos_ki: output init failed rc=%d", rc);
1024
+ }
1025
+
1026
+ char *pi, *po;
1027
+ boolean8_t *mi, *mo;
1028
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1029
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1030
+ CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = cos((double) v));
1031
+ ca_iter_state_sync_slab(&st_out);
1032
+ }
1033
+ ca_iter_state_finish(&st_in);
1034
+ ca_iter_state_finish(&st_out);
1035
+ return vout;
1036
+ }
1037
+
1038
+ static VALUE
1039
+ cos_ki_native_u8 (VALUE self, CArray *ca)
1040
+ {
1041
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1042
+ INT2NUM(sizeof(double)));
1043
+ CArray *co;
1044
+ GetCArray(vout, co);
1045
+
1046
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1047
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1048
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1049
+ K-D-walkable form. */
1050
+ int8_t slab_axes[CA_RANK_MAX];
1051
+ int8_t naxes = ca->ndim;
1052
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1053
+
1054
+ ca_iter_state st_in, st_out;
1055
+ int rc;
1056
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1057
+ slab_axes, naxes, 0);
1058
+ if ( rc != CA_ITER_OK ) {
1059
+ rb_raise(rb_eRuntimeError,
1060
+ "cos_ki: input init failed rc=%d", rc);
1061
+ }
1062
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1063
+ slab_axes, naxes, CA_KERNEL_WRITE);
1064
+ if ( rc != CA_ITER_OK ) {
1065
+ ca_iter_state_finish(&st_in);
1066
+ rb_raise(rb_eRuntimeError,
1067
+ "cos_ki: output init failed rc=%d", rc);
1068
+ }
1069
+
1070
+ char *pi, *po;
1071
+ boolean8_t *mi, *mo;
1072
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1073
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1074
+ CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = cos((double) v));
1075
+ ca_iter_state_sync_slab(&st_out);
1076
+ }
1077
+ ca_iter_state_finish(&st_in);
1078
+ ca_iter_state_finish(&st_out);
1079
+ return vout;
1080
+ }
1081
+
1082
+ static VALUE
1083
+ cos_ki_native_i16 (VALUE self, CArray *ca)
1084
+ {
1085
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1086
+ INT2NUM(sizeof(double)));
1087
+ CArray *co;
1088
+ GetCArray(vout, co);
1089
+
1090
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1091
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1092
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1093
+ K-D-walkable form. */
1094
+ int8_t slab_axes[CA_RANK_MAX];
1095
+ int8_t naxes = ca->ndim;
1096
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1097
+
1098
+ ca_iter_state st_in, st_out;
1099
+ int rc;
1100
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1101
+ slab_axes, naxes, 0);
1102
+ if ( rc != CA_ITER_OK ) {
1103
+ rb_raise(rb_eRuntimeError,
1104
+ "cos_ki: input init failed rc=%d", rc);
1105
+ }
1106
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1107
+ slab_axes, naxes, CA_KERNEL_WRITE);
1108
+ if ( rc != CA_ITER_OK ) {
1109
+ ca_iter_state_finish(&st_in);
1110
+ rb_raise(rb_eRuntimeError,
1111
+ "cos_ki: output init failed rc=%d", rc);
1112
+ }
1113
+
1114
+ char *pi, *po;
1115
+ boolean8_t *mi, *mo;
1116
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1117
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1118
+ CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = cos((double) v));
1119
+ ca_iter_state_sync_slab(&st_out);
1120
+ }
1121
+ ca_iter_state_finish(&st_in);
1122
+ ca_iter_state_finish(&st_out);
1123
+ return vout;
1124
+ }
1125
+
1126
+ static VALUE
1127
+ cos_ki_native_u16 (VALUE self, CArray *ca)
1128
+ {
1129
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1130
+ INT2NUM(sizeof(double)));
1131
+ CArray *co;
1132
+ GetCArray(vout, co);
1133
+
1134
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1135
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1136
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1137
+ K-D-walkable form. */
1138
+ int8_t slab_axes[CA_RANK_MAX];
1139
+ int8_t naxes = ca->ndim;
1140
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1141
+
1142
+ ca_iter_state st_in, st_out;
1143
+ int rc;
1144
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1145
+ slab_axes, naxes, 0);
1146
+ if ( rc != CA_ITER_OK ) {
1147
+ rb_raise(rb_eRuntimeError,
1148
+ "cos_ki: input init failed rc=%d", rc);
1149
+ }
1150
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1151
+ slab_axes, naxes, CA_KERNEL_WRITE);
1152
+ if ( rc != CA_ITER_OK ) {
1153
+ ca_iter_state_finish(&st_in);
1154
+ rb_raise(rb_eRuntimeError,
1155
+ "cos_ki: output init failed rc=%d", rc);
1156
+ }
1157
+
1158
+ char *pi, *po;
1159
+ boolean8_t *mi, *mo;
1160
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1161
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1162
+ CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = cos((double) v));
1163
+ ca_iter_state_sync_slab(&st_out);
1164
+ }
1165
+ ca_iter_state_finish(&st_in);
1166
+ ca_iter_state_finish(&st_out);
1167
+ return vout;
1168
+ }
1169
+
1170
+ static VALUE
1171
+ cos_ki_native_i32 (VALUE self, CArray *ca)
1172
+ {
1173
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1174
+ INT2NUM(sizeof(double)));
1175
+ CArray *co;
1176
+ GetCArray(vout, co);
1177
+
1178
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1179
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1180
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1181
+ K-D-walkable form. */
1182
+ int8_t slab_axes[CA_RANK_MAX];
1183
+ int8_t naxes = ca->ndim;
1184
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1185
+
1186
+ ca_iter_state st_in, st_out;
1187
+ int rc;
1188
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1189
+ slab_axes, naxes, 0);
1190
+ if ( rc != CA_ITER_OK ) {
1191
+ rb_raise(rb_eRuntimeError,
1192
+ "cos_ki: input init failed rc=%d", rc);
1193
+ }
1194
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1195
+ slab_axes, naxes, CA_KERNEL_WRITE);
1196
+ if ( rc != CA_ITER_OK ) {
1197
+ ca_iter_state_finish(&st_in);
1198
+ rb_raise(rb_eRuntimeError,
1199
+ "cos_ki: output init failed rc=%d", rc);
1200
+ }
1201
+
1202
+ char *pi, *po;
1203
+ boolean8_t *mi, *mo;
1204
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1205
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1206
+ CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = cos((double) v));
1207
+ ca_iter_state_sync_slab(&st_out);
1208
+ }
1209
+ ca_iter_state_finish(&st_in);
1210
+ ca_iter_state_finish(&st_out);
1211
+ return vout;
1212
+ }
1213
+
1214
+ static VALUE
1215
+ cos_ki_native_u32 (VALUE self, CArray *ca)
1216
+ {
1217
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1218
+ INT2NUM(sizeof(double)));
1219
+ CArray *co;
1220
+ GetCArray(vout, co);
1221
+
1222
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1223
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1224
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1225
+ K-D-walkable form. */
1226
+ int8_t slab_axes[CA_RANK_MAX];
1227
+ int8_t naxes = ca->ndim;
1228
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1229
+
1230
+ ca_iter_state st_in, st_out;
1231
+ int rc;
1232
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1233
+ slab_axes, naxes, 0);
1234
+ if ( rc != CA_ITER_OK ) {
1235
+ rb_raise(rb_eRuntimeError,
1236
+ "cos_ki: input init failed rc=%d", rc);
1237
+ }
1238
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1239
+ slab_axes, naxes, CA_KERNEL_WRITE);
1240
+ if ( rc != CA_ITER_OK ) {
1241
+ ca_iter_state_finish(&st_in);
1242
+ rb_raise(rb_eRuntimeError,
1243
+ "cos_ki: output init failed rc=%d", rc);
1244
+ }
1245
+
1246
+ char *pi, *po;
1247
+ boolean8_t *mi, *mo;
1248
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1249
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1250
+ CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = cos((double) v));
1251
+ ca_iter_state_sync_slab(&st_out);
1252
+ }
1253
+ ca_iter_state_finish(&st_in);
1254
+ ca_iter_state_finish(&st_out);
1255
+ return vout;
1256
+ }
1257
+
1258
+ static VALUE
1259
+ cos_ki_native_i64 (VALUE self, CArray *ca)
1260
+ {
1261
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1262
+ INT2NUM(sizeof(double)));
1263
+ CArray *co;
1264
+ GetCArray(vout, co);
1265
+
1266
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1267
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1268
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1269
+ K-D-walkable form. */
1270
+ int8_t slab_axes[CA_RANK_MAX];
1271
+ int8_t naxes = ca->ndim;
1272
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1273
+
1274
+ ca_iter_state st_in, st_out;
1275
+ int rc;
1276
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1277
+ slab_axes, naxes, 0);
1278
+ if ( rc != CA_ITER_OK ) {
1279
+ rb_raise(rb_eRuntimeError,
1280
+ "cos_ki: input init failed rc=%d", rc);
1281
+ }
1282
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1283
+ slab_axes, naxes, CA_KERNEL_WRITE);
1284
+ if ( rc != CA_ITER_OK ) {
1285
+ ca_iter_state_finish(&st_in);
1286
+ rb_raise(rb_eRuntimeError,
1287
+ "cos_ki: output init failed rc=%d", rc);
1288
+ }
1289
+
1290
+ char *pi, *po;
1291
+ boolean8_t *mi, *mo;
1292
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1293
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1294
+ CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = cos((double) v));
1295
+ ca_iter_state_sync_slab(&st_out);
1296
+ }
1297
+ ca_iter_state_finish(&st_in);
1298
+ ca_iter_state_finish(&st_out);
1299
+ return vout;
1300
+ }
1301
+
1302
+ static VALUE
1303
+ cos_ki_native_u64 (VALUE self, CArray *ca)
1304
+ {
1305
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1306
+ INT2NUM(sizeof(double)));
1307
+ CArray *co;
1308
+ GetCArray(vout, co);
1309
+
1310
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1311
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1312
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1313
+ K-D-walkable form. */
1314
+ int8_t slab_axes[CA_RANK_MAX];
1315
+ int8_t naxes = ca->ndim;
1316
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1317
+
1318
+ ca_iter_state st_in, st_out;
1319
+ int rc;
1320
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1321
+ slab_axes, naxes, 0);
1322
+ if ( rc != CA_ITER_OK ) {
1323
+ rb_raise(rb_eRuntimeError,
1324
+ "cos_ki: input init failed rc=%d", rc);
1325
+ }
1326
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1327
+ slab_axes, naxes, CA_KERNEL_WRITE);
1328
+ if ( rc != CA_ITER_OK ) {
1329
+ ca_iter_state_finish(&st_in);
1330
+ rb_raise(rb_eRuntimeError,
1331
+ "cos_ki: output init failed rc=%d", rc);
1332
+ }
1333
+
1334
+ char *pi, *po;
1335
+ boolean8_t *mi, *mo;
1336
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1337
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1338
+ CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = cos((double) v));
1339
+ ca_iter_state_sync_slab(&st_out);
1340
+ }
1341
+ ca_iter_state_finish(&st_in);
1342
+ ca_iter_state_finish(&st_out);
1343
+ return vout;
1344
+ }
1345
+
1346
+ static VALUE
1347
+ cos_ki_native_f32 (VALUE self, CArray *ca)
1348
+ {
1349
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1350
+ INT2NUM(sizeof(double)));
1351
+ CArray *co;
1352
+ GetCArray(vout, co);
1353
+
1354
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1355
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1356
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1357
+ K-D-walkable form. */
1358
+ int8_t slab_axes[CA_RANK_MAX];
1359
+ int8_t naxes = ca->ndim;
1360
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1361
+
1362
+ ca_iter_state st_in, st_out;
1363
+ int rc;
1364
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1365
+ slab_axes, naxes, 0);
1366
+ if ( rc != CA_ITER_OK ) {
1367
+ rb_raise(rb_eRuntimeError,
1368
+ "cos_ki: input init failed rc=%d", rc);
1369
+ }
1370
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1371
+ slab_axes, naxes, CA_KERNEL_WRITE);
1372
+ if ( rc != CA_ITER_OK ) {
1373
+ ca_iter_state_finish(&st_in);
1374
+ rb_raise(rb_eRuntimeError,
1375
+ "cos_ki: output init failed rc=%d", rc);
1376
+ }
1377
+
1378
+ char *pi, *po;
1379
+ boolean8_t *mi, *mo;
1380
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1381
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1382
+ CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = cos((double) v));
1383
+ ca_iter_state_sync_slab(&st_out);
1384
+ }
1385
+ ca_iter_state_finish(&st_in);
1386
+ ca_iter_state_finish(&st_out);
1387
+ return vout;
1388
+ }
1389
+
1390
+ static VALUE
1391
+ cos_ki_native_f64 (VALUE self, CArray *ca)
1392
+ {
1393
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1394
+ INT2NUM(sizeof(double)));
1395
+ CArray *co;
1396
+ GetCArray(vout, co);
1397
+
1398
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1399
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1400
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1401
+ K-D-walkable form. */
1402
+ int8_t slab_axes[CA_RANK_MAX];
1403
+ int8_t naxes = ca->ndim;
1404
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1405
+
1406
+ ca_iter_state st_in, st_out;
1407
+ int rc;
1408
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1409
+ slab_axes, naxes, 0);
1410
+ if ( rc != CA_ITER_OK ) {
1411
+ rb_raise(rb_eRuntimeError,
1412
+ "cos_ki: input init failed rc=%d", rc);
1413
+ }
1414
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1415
+ slab_axes, naxes, CA_KERNEL_WRITE);
1416
+ if ( rc != CA_ITER_OK ) {
1417
+ ca_iter_state_finish(&st_in);
1418
+ rb_raise(rb_eRuntimeError,
1419
+ "cos_ki: output init failed rc=%d", rc);
1420
+ }
1421
+
1422
+ char *pi, *po;
1423
+ boolean8_t *mi, *mo;
1424
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1425
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1426
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = cos((double) v));
1427
+ ca_iter_state_sync_slab(&st_out);
1428
+ }
1429
+ ca_iter_state_finish(&st_in);
1430
+ ca_iter_state_finish(&st_out);
1431
+ return vout;
1432
+ }
1433
+
1434
+ static VALUE
1435
+ rb_ca_cos_ki (VALUE self)
1436
+ {
1437
+ CArray *src;
1438
+ GetCArray(self, src);
1439
+ switch ( src->data_type ) {
1440
+ case CA_INT8: return cos_ki_native_i8(self, src);
1441
+ case CA_UINT8: return cos_ki_native_u8(self, src);
1442
+ case CA_INT16: return cos_ki_native_i16(self, src);
1443
+ case CA_UINT16: return cos_ki_native_u16(self, src);
1444
+ case CA_INT32: return cos_ki_native_i32(self, src);
1445
+ case CA_UINT32: return cos_ki_native_u32(self, src);
1446
+ case CA_INT64: return cos_ki_native_i64(self, src);
1447
+ case CA_UINT64: return cos_ki_native_u64(self, src);
1448
+ case CA_FLOAT32: return cos_ki_native_f32(self, src);
1449
+ case CA_FLOAT64: return cos_ki_native_f64(self, src);
1450
+ default: {
1451
+ /* Phase E: only wrap data_types that have a meaningful float64
1452
+ representation. Complex / fixlen / object would lose
1453
+ structure (e.g. complex -> float strips imaginary part)
1454
+ so reject explicitly, matching legacy DataTypeError. */
1455
+ switch ( src->data_type ) {
1456
+ case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
1457
+ default:
1458
+ rb_raise(rb_eCADataTypeError, "cos_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
1459
+ }
1460
+ VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
1461
+ CArray *casted;
1462
+ GetCArray(vsrc, casted);
1463
+ return cos_ki_native_f64(vsrc, casted);
1464
+ }
1465
+ }
1466
+ return Qnil; /* unreachable */
1467
+ }
1468
+
1469
+ /* ===== exp_ki ============================================ */
1470
+
1471
+ static VALUE
1472
+ exp_ki_native_i8 (VALUE self, CArray *ca)
1473
+ {
1474
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1475
+ INT2NUM(sizeof(double)));
1476
+ CArray *co;
1477
+ GetCArray(vout, co);
1478
+
1479
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1480
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1481
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1482
+ K-D-walkable form. */
1483
+ int8_t slab_axes[CA_RANK_MAX];
1484
+ int8_t naxes = ca->ndim;
1485
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1486
+
1487
+ ca_iter_state st_in, st_out;
1488
+ int rc;
1489
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1490
+ slab_axes, naxes, 0);
1491
+ if ( rc != CA_ITER_OK ) {
1492
+ rb_raise(rb_eRuntimeError,
1493
+ "exp_ki: input init failed rc=%d", rc);
1494
+ }
1495
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1496
+ slab_axes, naxes, CA_KERNEL_WRITE);
1497
+ if ( rc != CA_ITER_OK ) {
1498
+ ca_iter_state_finish(&st_in);
1499
+ rb_raise(rb_eRuntimeError,
1500
+ "exp_ki: output init failed rc=%d", rc);
1501
+ }
1502
+
1503
+ char *pi, *po;
1504
+ boolean8_t *mi, *mo;
1505
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1506
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1507
+ CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = exp((double) v));
1508
+ ca_iter_state_sync_slab(&st_out);
1509
+ }
1510
+ ca_iter_state_finish(&st_in);
1511
+ ca_iter_state_finish(&st_out);
1512
+ return vout;
1513
+ }
1514
+
1515
+ static VALUE
1516
+ exp_ki_native_u8 (VALUE self, CArray *ca)
1517
+ {
1518
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1519
+ INT2NUM(sizeof(double)));
1520
+ CArray *co;
1521
+ GetCArray(vout, co);
1522
+
1523
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1524
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1525
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1526
+ K-D-walkable form. */
1527
+ int8_t slab_axes[CA_RANK_MAX];
1528
+ int8_t naxes = ca->ndim;
1529
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1530
+
1531
+ ca_iter_state st_in, st_out;
1532
+ int rc;
1533
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1534
+ slab_axes, naxes, 0);
1535
+ if ( rc != CA_ITER_OK ) {
1536
+ rb_raise(rb_eRuntimeError,
1537
+ "exp_ki: input init failed rc=%d", rc);
1538
+ }
1539
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1540
+ slab_axes, naxes, CA_KERNEL_WRITE);
1541
+ if ( rc != CA_ITER_OK ) {
1542
+ ca_iter_state_finish(&st_in);
1543
+ rb_raise(rb_eRuntimeError,
1544
+ "exp_ki: output init failed rc=%d", rc);
1545
+ }
1546
+
1547
+ char *pi, *po;
1548
+ boolean8_t *mi, *mo;
1549
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1550
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1551
+ CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = exp((double) v));
1552
+ ca_iter_state_sync_slab(&st_out);
1553
+ }
1554
+ ca_iter_state_finish(&st_in);
1555
+ ca_iter_state_finish(&st_out);
1556
+ return vout;
1557
+ }
1558
+
1559
+ static VALUE
1560
+ exp_ki_native_i16 (VALUE self, CArray *ca)
1561
+ {
1562
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1563
+ INT2NUM(sizeof(double)));
1564
+ CArray *co;
1565
+ GetCArray(vout, co);
1566
+
1567
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1568
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1569
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1570
+ K-D-walkable form. */
1571
+ int8_t slab_axes[CA_RANK_MAX];
1572
+ int8_t naxes = ca->ndim;
1573
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1574
+
1575
+ ca_iter_state st_in, st_out;
1576
+ int rc;
1577
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1578
+ slab_axes, naxes, 0);
1579
+ if ( rc != CA_ITER_OK ) {
1580
+ rb_raise(rb_eRuntimeError,
1581
+ "exp_ki: input init failed rc=%d", rc);
1582
+ }
1583
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1584
+ slab_axes, naxes, CA_KERNEL_WRITE);
1585
+ if ( rc != CA_ITER_OK ) {
1586
+ ca_iter_state_finish(&st_in);
1587
+ rb_raise(rb_eRuntimeError,
1588
+ "exp_ki: output init failed rc=%d", rc);
1589
+ }
1590
+
1591
+ char *pi, *po;
1592
+ boolean8_t *mi, *mo;
1593
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1594
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1595
+ CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = exp((double) v));
1596
+ ca_iter_state_sync_slab(&st_out);
1597
+ }
1598
+ ca_iter_state_finish(&st_in);
1599
+ ca_iter_state_finish(&st_out);
1600
+ return vout;
1601
+ }
1602
+
1603
+ static VALUE
1604
+ exp_ki_native_u16 (VALUE self, CArray *ca)
1605
+ {
1606
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1607
+ INT2NUM(sizeof(double)));
1608
+ CArray *co;
1609
+ GetCArray(vout, co);
1610
+
1611
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1612
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1613
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1614
+ K-D-walkable form. */
1615
+ int8_t slab_axes[CA_RANK_MAX];
1616
+ int8_t naxes = ca->ndim;
1617
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1618
+
1619
+ ca_iter_state st_in, st_out;
1620
+ int rc;
1621
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1622
+ slab_axes, naxes, 0);
1623
+ if ( rc != CA_ITER_OK ) {
1624
+ rb_raise(rb_eRuntimeError,
1625
+ "exp_ki: input init failed rc=%d", rc);
1626
+ }
1627
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1628
+ slab_axes, naxes, CA_KERNEL_WRITE);
1629
+ if ( rc != CA_ITER_OK ) {
1630
+ ca_iter_state_finish(&st_in);
1631
+ rb_raise(rb_eRuntimeError,
1632
+ "exp_ki: output init failed rc=%d", rc);
1633
+ }
1634
+
1635
+ char *pi, *po;
1636
+ boolean8_t *mi, *mo;
1637
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1638
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1639
+ CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = exp((double) v));
1640
+ ca_iter_state_sync_slab(&st_out);
1641
+ }
1642
+ ca_iter_state_finish(&st_in);
1643
+ ca_iter_state_finish(&st_out);
1644
+ return vout;
1645
+ }
1646
+
1647
+ static VALUE
1648
+ exp_ki_native_i32 (VALUE self, CArray *ca)
1649
+ {
1650
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1651
+ INT2NUM(sizeof(double)));
1652
+ CArray *co;
1653
+ GetCArray(vout, co);
1654
+
1655
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1656
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1657
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1658
+ K-D-walkable form. */
1659
+ int8_t slab_axes[CA_RANK_MAX];
1660
+ int8_t naxes = ca->ndim;
1661
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1662
+
1663
+ ca_iter_state st_in, st_out;
1664
+ int rc;
1665
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1666
+ slab_axes, naxes, 0);
1667
+ if ( rc != CA_ITER_OK ) {
1668
+ rb_raise(rb_eRuntimeError,
1669
+ "exp_ki: input init failed rc=%d", rc);
1670
+ }
1671
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1672
+ slab_axes, naxes, CA_KERNEL_WRITE);
1673
+ if ( rc != CA_ITER_OK ) {
1674
+ ca_iter_state_finish(&st_in);
1675
+ rb_raise(rb_eRuntimeError,
1676
+ "exp_ki: output init failed rc=%d", rc);
1677
+ }
1678
+
1679
+ char *pi, *po;
1680
+ boolean8_t *mi, *mo;
1681
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1682
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1683
+ CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = exp((double) v));
1684
+ ca_iter_state_sync_slab(&st_out);
1685
+ }
1686
+ ca_iter_state_finish(&st_in);
1687
+ ca_iter_state_finish(&st_out);
1688
+ return vout;
1689
+ }
1690
+
1691
+ static VALUE
1692
+ exp_ki_native_u32 (VALUE self, CArray *ca)
1693
+ {
1694
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1695
+ INT2NUM(sizeof(double)));
1696
+ CArray *co;
1697
+ GetCArray(vout, co);
1698
+
1699
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1700
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1701
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1702
+ K-D-walkable form. */
1703
+ int8_t slab_axes[CA_RANK_MAX];
1704
+ int8_t naxes = ca->ndim;
1705
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1706
+
1707
+ ca_iter_state st_in, st_out;
1708
+ int rc;
1709
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1710
+ slab_axes, naxes, 0);
1711
+ if ( rc != CA_ITER_OK ) {
1712
+ rb_raise(rb_eRuntimeError,
1713
+ "exp_ki: input init failed rc=%d", rc);
1714
+ }
1715
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1716
+ slab_axes, naxes, CA_KERNEL_WRITE);
1717
+ if ( rc != CA_ITER_OK ) {
1718
+ ca_iter_state_finish(&st_in);
1719
+ rb_raise(rb_eRuntimeError,
1720
+ "exp_ki: output init failed rc=%d", rc);
1721
+ }
1722
+
1723
+ char *pi, *po;
1724
+ boolean8_t *mi, *mo;
1725
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1726
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1727
+ CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = exp((double) v));
1728
+ ca_iter_state_sync_slab(&st_out);
1729
+ }
1730
+ ca_iter_state_finish(&st_in);
1731
+ ca_iter_state_finish(&st_out);
1732
+ return vout;
1733
+ }
1734
+
1735
+ static VALUE
1736
+ exp_ki_native_i64 (VALUE self, CArray *ca)
1737
+ {
1738
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1739
+ INT2NUM(sizeof(double)));
1740
+ CArray *co;
1741
+ GetCArray(vout, co);
1742
+
1743
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1744
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1745
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1746
+ K-D-walkable form. */
1747
+ int8_t slab_axes[CA_RANK_MAX];
1748
+ int8_t naxes = ca->ndim;
1749
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1750
+
1751
+ ca_iter_state st_in, st_out;
1752
+ int rc;
1753
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1754
+ slab_axes, naxes, 0);
1755
+ if ( rc != CA_ITER_OK ) {
1756
+ rb_raise(rb_eRuntimeError,
1757
+ "exp_ki: input init failed rc=%d", rc);
1758
+ }
1759
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1760
+ slab_axes, naxes, CA_KERNEL_WRITE);
1761
+ if ( rc != CA_ITER_OK ) {
1762
+ ca_iter_state_finish(&st_in);
1763
+ rb_raise(rb_eRuntimeError,
1764
+ "exp_ki: output init failed rc=%d", rc);
1765
+ }
1766
+
1767
+ char *pi, *po;
1768
+ boolean8_t *mi, *mo;
1769
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1770
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1771
+ CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = exp((double) v));
1772
+ ca_iter_state_sync_slab(&st_out);
1773
+ }
1774
+ ca_iter_state_finish(&st_in);
1775
+ ca_iter_state_finish(&st_out);
1776
+ return vout;
1777
+ }
1778
+
1779
+ static VALUE
1780
+ exp_ki_native_u64 (VALUE self, CArray *ca)
1781
+ {
1782
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1783
+ INT2NUM(sizeof(double)));
1784
+ CArray *co;
1785
+ GetCArray(vout, co);
1786
+
1787
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1788
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1789
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1790
+ K-D-walkable form. */
1791
+ int8_t slab_axes[CA_RANK_MAX];
1792
+ int8_t naxes = ca->ndim;
1793
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1794
+
1795
+ ca_iter_state st_in, st_out;
1796
+ int rc;
1797
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1798
+ slab_axes, naxes, 0);
1799
+ if ( rc != CA_ITER_OK ) {
1800
+ rb_raise(rb_eRuntimeError,
1801
+ "exp_ki: input init failed rc=%d", rc);
1802
+ }
1803
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1804
+ slab_axes, naxes, CA_KERNEL_WRITE);
1805
+ if ( rc != CA_ITER_OK ) {
1806
+ ca_iter_state_finish(&st_in);
1807
+ rb_raise(rb_eRuntimeError,
1808
+ "exp_ki: output init failed rc=%d", rc);
1809
+ }
1810
+
1811
+ char *pi, *po;
1812
+ boolean8_t *mi, *mo;
1813
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1814
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1815
+ CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = exp((double) v));
1816
+ ca_iter_state_sync_slab(&st_out);
1817
+ }
1818
+ ca_iter_state_finish(&st_in);
1819
+ ca_iter_state_finish(&st_out);
1820
+ return vout;
1821
+ }
1822
+
1823
+ static VALUE
1824
+ exp_ki_native_f32 (VALUE self, CArray *ca)
1825
+ {
1826
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1827
+ INT2NUM(sizeof(double)));
1828
+ CArray *co;
1829
+ GetCArray(vout, co);
1830
+
1831
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1832
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1833
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1834
+ K-D-walkable form. */
1835
+ int8_t slab_axes[CA_RANK_MAX];
1836
+ int8_t naxes = ca->ndim;
1837
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1838
+
1839
+ ca_iter_state st_in, st_out;
1840
+ int rc;
1841
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1842
+ slab_axes, naxes, 0);
1843
+ if ( rc != CA_ITER_OK ) {
1844
+ rb_raise(rb_eRuntimeError,
1845
+ "exp_ki: input init failed rc=%d", rc);
1846
+ }
1847
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1848
+ slab_axes, naxes, CA_KERNEL_WRITE);
1849
+ if ( rc != CA_ITER_OK ) {
1850
+ ca_iter_state_finish(&st_in);
1851
+ rb_raise(rb_eRuntimeError,
1852
+ "exp_ki: output init failed rc=%d", rc);
1853
+ }
1854
+
1855
+ char *pi, *po;
1856
+ boolean8_t *mi, *mo;
1857
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1858
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1859
+ CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = exp((double) v));
1860
+ ca_iter_state_sync_slab(&st_out);
1861
+ }
1862
+ ca_iter_state_finish(&st_in);
1863
+ ca_iter_state_finish(&st_out);
1864
+ return vout;
1865
+ }
1866
+
1867
+ static VALUE
1868
+ exp_ki_native_f64 (VALUE self, CArray *ca)
1869
+ {
1870
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1871
+ INT2NUM(sizeof(double)));
1872
+ CArray *co;
1873
+ GetCArray(vout, co);
1874
+
1875
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1876
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1877
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1878
+ K-D-walkable form. */
1879
+ int8_t slab_axes[CA_RANK_MAX];
1880
+ int8_t naxes = ca->ndim;
1881
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1882
+
1883
+ ca_iter_state st_in, st_out;
1884
+ int rc;
1885
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1886
+ slab_axes, naxes, 0);
1887
+ if ( rc != CA_ITER_OK ) {
1888
+ rb_raise(rb_eRuntimeError,
1889
+ "exp_ki: input init failed rc=%d", rc);
1890
+ }
1891
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1892
+ slab_axes, naxes, CA_KERNEL_WRITE);
1893
+ if ( rc != CA_ITER_OK ) {
1894
+ ca_iter_state_finish(&st_in);
1895
+ rb_raise(rb_eRuntimeError,
1896
+ "exp_ki: output init failed rc=%d", rc);
1897
+ }
1898
+
1899
+ char *pi, *po;
1900
+ boolean8_t *mi, *mo;
1901
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1902
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1903
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = exp((double) v));
1904
+ ca_iter_state_sync_slab(&st_out);
1905
+ }
1906
+ ca_iter_state_finish(&st_in);
1907
+ ca_iter_state_finish(&st_out);
1908
+ return vout;
1909
+ }
1910
+
1911
+ static VALUE
1912
+ rb_ca_exp_ki (VALUE self)
1913
+ {
1914
+ CArray *src;
1915
+ GetCArray(self, src);
1916
+ switch ( src->data_type ) {
1917
+ case CA_INT8: return exp_ki_native_i8(self, src);
1918
+ case CA_UINT8: return exp_ki_native_u8(self, src);
1919
+ case CA_INT16: return exp_ki_native_i16(self, src);
1920
+ case CA_UINT16: return exp_ki_native_u16(self, src);
1921
+ case CA_INT32: return exp_ki_native_i32(self, src);
1922
+ case CA_UINT32: return exp_ki_native_u32(self, src);
1923
+ case CA_INT64: return exp_ki_native_i64(self, src);
1924
+ case CA_UINT64: return exp_ki_native_u64(self, src);
1925
+ case CA_FLOAT32: return exp_ki_native_f32(self, src);
1926
+ case CA_FLOAT64: return exp_ki_native_f64(self, src);
1927
+ default: {
1928
+ /* Phase E: only wrap data_types that have a meaningful float64
1929
+ representation. Complex / fixlen / object would lose
1930
+ structure (e.g. complex -> float strips imaginary part)
1931
+ so reject explicitly, matching legacy DataTypeError. */
1932
+ switch ( src->data_type ) {
1933
+ case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
1934
+ default:
1935
+ rb_raise(rb_eCADataTypeError, "exp_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
1936
+ }
1937
+ VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
1938
+ CArray *casted;
1939
+ GetCArray(vsrc, casted);
1940
+ return exp_ki_native_f64(vsrc, casted);
1941
+ }
1942
+ }
1943
+ return Qnil; /* unreachable */
1944
+ }
1945
+
1946
+ /* ===== log_ki ============================================ */
1947
+
1948
+ static VALUE
1949
+ log_ki_native_i8 (VALUE self, CArray *ca)
1950
+ {
1951
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1952
+ INT2NUM(sizeof(double)));
1953
+ CArray *co;
1954
+ GetCArray(vout, co);
1955
+
1956
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
1957
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
1958
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
1959
+ K-D-walkable form. */
1960
+ int8_t slab_axes[CA_RANK_MAX];
1961
+ int8_t naxes = ca->ndim;
1962
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
1963
+
1964
+ ca_iter_state st_in, st_out;
1965
+ int rc;
1966
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
1967
+ slab_axes, naxes, 0);
1968
+ if ( rc != CA_ITER_OK ) {
1969
+ rb_raise(rb_eRuntimeError,
1970
+ "log_ki: input init failed rc=%d", rc);
1971
+ }
1972
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
1973
+ slab_axes, naxes, CA_KERNEL_WRITE);
1974
+ if ( rc != CA_ITER_OK ) {
1975
+ ca_iter_state_finish(&st_in);
1976
+ rb_raise(rb_eRuntimeError,
1977
+ "log_ki: output init failed rc=%d", rc);
1978
+ }
1979
+
1980
+ char *pi, *po;
1981
+ boolean8_t *mi, *mo;
1982
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
1983
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
1984
+ CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = log((double) v));
1985
+ ca_iter_state_sync_slab(&st_out);
1986
+ }
1987
+ ca_iter_state_finish(&st_in);
1988
+ ca_iter_state_finish(&st_out);
1989
+ return vout;
1990
+ }
1991
+
1992
+ static VALUE
1993
+ log_ki_native_u8 (VALUE self, CArray *ca)
1994
+ {
1995
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
1996
+ INT2NUM(sizeof(double)));
1997
+ CArray *co;
1998
+ GetCArray(vout, co);
1999
+
2000
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2001
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2002
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2003
+ K-D-walkable form. */
2004
+ int8_t slab_axes[CA_RANK_MAX];
2005
+ int8_t naxes = ca->ndim;
2006
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2007
+
2008
+ ca_iter_state st_in, st_out;
2009
+ int rc;
2010
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2011
+ slab_axes, naxes, 0);
2012
+ if ( rc != CA_ITER_OK ) {
2013
+ rb_raise(rb_eRuntimeError,
2014
+ "log_ki: input init failed rc=%d", rc);
2015
+ }
2016
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2017
+ slab_axes, naxes, CA_KERNEL_WRITE);
2018
+ if ( rc != CA_ITER_OK ) {
2019
+ ca_iter_state_finish(&st_in);
2020
+ rb_raise(rb_eRuntimeError,
2021
+ "log_ki: output init failed rc=%d", rc);
2022
+ }
2023
+
2024
+ char *pi, *po;
2025
+ boolean8_t *mi, *mo;
2026
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2027
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2028
+ CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = log((double) v));
2029
+ ca_iter_state_sync_slab(&st_out);
2030
+ }
2031
+ ca_iter_state_finish(&st_in);
2032
+ ca_iter_state_finish(&st_out);
2033
+ return vout;
2034
+ }
2035
+
2036
+ static VALUE
2037
+ log_ki_native_i16 (VALUE self, CArray *ca)
2038
+ {
2039
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2040
+ INT2NUM(sizeof(double)));
2041
+ CArray *co;
2042
+ GetCArray(vout, co);
2043
+
2044
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2045
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2046
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2047
+ K-D-walkable form. */
2048
+ int8_t slab_axes[CA_RANK_MAX];
2049
+ int8_t naxes = ca->ndim;
2050
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2051
+
2052
+ ca_iter_state st_in, st_out;
2053
+ int rc;
2054
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2055
+ slab_axes, naxes, 0);
2056
+ if ( rc != CA_ITER_OK ) {
2057
+ rb_raise(rb_eRuntimeError,
2058
+ "log_ki: input init failed rc=%d", rc);
2059
+ }
2060
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2061
+ slab_axes, naxes, CA_KERNEL_WRITE);
2062
+ if ( rc != CA_ITER_OK ) {
2063
+ ca_iter_state_finish(&st_in);
2064
+ rb_raise(rb_eRuntimeError,
2065
+ "log_ki: output init failed rc=%d", rc);
2066
+ }
2067
+
2068
+ char *pi, *po;
2069
+ boolean8_t *mi, *mo;
2070
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2071
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2072
+ CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = log((double) v));
2073
+ ca_iter_state_sync_slab(&st_out);
2074
+ }
2075
+ ca_iter_state_finish(&st_in);
2076
+ ca_iter_state_finish(&st_out);
2077
+ return vout;
2078
+ }
2079
+
2080
+ static VALUE
2081
+ log_ki_native_u16 (VALUE self, CArray *ca)
2082
+ {
2083
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2084
+ INT2NUM(sizeof(double)));
2085
+ CArray *co;
2086
+ GetCArray(vout, co);
2087
+
2088
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2089
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2090
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2091
+ K-D-walkable form. */
2092
+ int8_t slab_axes[CA_RANK_MAX];
2093
+ int8_t naxes = ca->ndim;
2094
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2095
+
2096
+ ca_iter_state st_in, st_out;
2097
+ int rc;
2098
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2099
+ slab_axes, naxes, 0);
2100
+ if ( rc != CA_ITER_OK ) {
2101
+ rb_raise(rb_eRuntimeError,
2102
+ "log_ki: input init failed rc=%d", rc);
2103
+ }
2104
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2105
+ slab_axes, naxes, CA_KERNEL_WRITE);
2106
+ if ( rc != CA_ITER_OK ) {
2107
+ ca_iter_state_finish(&st_in);
2108
+ rb_raise(rb_eRuntimeError,
2109
+ "log_ki: output init failed rc=%d", rc);
2110
+ }
2111
+
2112
+ char *pi, *po;
2113
+ boolean8_t *mi, *mo;
2114
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2115
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2116
+ CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = log((double) v));
2117
+ ca_iter_state_sync_slab(&st_out);
2118
+ }
2119
+ ca_iter_state_finish(&st_in);
2120
+ ca_iter_state_finish(&st_out);
2121
+ return vout;
2122
+ }
2123
+
2124
+ static VALUE
2125
+ log_ki_native_i32 (VALUE self, CArray *ca)
2126
+ {
2127
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2128
+ INT2NUM(sizeof(double)));
2129
+ CArray *co;
2130
+ GetCArray(vout, co);
2131
+
2132
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2133
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2134
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2135
+ K-D-walkable form. */
2136
+ int8_t slab_axes[CA_RANK_MAX];
2137
+ int8_t naxes = ca->ndim;
2138
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2139
+
2140
+ ca_iter_state st_in, st_out;
2141
+ int rc;
2142
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2143
+ slab_axes, naxes, 0);
2144
+ if ( rc != CA_ITER_OK ) {
2145
+ rb_raise(rb_eRuntimeError,
2146
+ "log_ki: input init failed rc=%d", rc);
2147
+ }
2148
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2149
+ slab_axes, naxes, CA_KERNEL_WRITE);
2150
+ if ( rc != CA_ITER_OK ) {
2151
+ ca_iter_state_finish(&st_in);
2152
+ rb_raise(rb_eRuntimeError,
2153
+ "log_ki: output init failed rc=%d", rc);
2154
+ }
2155
+
2156
+ char *pi, *po;
2157
+ boolean8_t *mi, *mo;
2158
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2159
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2160
+ CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = log((double) v));
2161
+ ca_iter_state_sync_slab(&st_out);
2162
+ }
2163
+ ca_iter_state_finish(&st_in);
2164
+ ca_iter_state_finish(&st_out);
2165
+ return vout;
2166
+ }
2167
+
2168
+ static VALUE
2169
+ log_ki_native_u32 (VALUE self, CArray *ca)
2170
+ {
2171
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2172
+ INT2NUM(sizeof(double)));
2173
+ CArray *co;
2174
+ GetCArray(vout, co);
2175
+
2176
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2177
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2178
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2179
+ K-D-walkable form. */
2180
+ int8_t slab_axes[CA_RANK_MAX];
2181
+ int8_t naxes = ca->ndim;
2182
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2183
+
2184
+ ca_iter_state st_in, st_out;
2185
+ int rc;
2186
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2187
+ slab_axes, naxes, 0);
2188
+ if ( rc != CA_ITER_OK ) {
2189
+ rb_raise(rb_eRuntimeError,
2190
+ "log_ki: input init failed rc=%d", rc);
2191
+ }
2192
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2193
+ slab_axes, naxes, CA_KERNEL_WRITE);
2194
+ if ( rc != CA_ITER_OK ) {
2195
+ ca_iter_state_finish(&st_in);
2196
+ rb_raise(rb_eRuntimeError,
2197
+ "log_ki: output init failed rc=%d", rc);
2198
+ }
2199
+
2200
+ char *pi, *po;
2201
+ boolean8_t *mi, *mo;
2202
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2203
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2204
+ CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = log((double) v));
2205
+ ca_iter_state_sync_slab(&st_out);
2206
+ }
2207
+ ca_iter_state_finish(&st_in);
2208
+ ca_iter_state_finish(&st_out);
2209
+ return vout;
2210
+ }
2211
+
2212
+ static VALUE
2213
+ log_ki_native_i64 (VALUE self, CArray *ca)
2214
+ {
2215
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2216
+ INT2NUM(sizeof(double)));
2217
+ CArray *co;
2218
+ GetCArray(vout, co);
2219
+
2220
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2221
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2222
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2223
+ K-D-walkable form. */
2224
+ int8_t slab_axes[CA_RANK_MAX];
2225
+ int8_t naxes = ca->ndim;
2226
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2227
+
2228
+ ca_iter_state st_in, st_out;
2229
+ int rc;
2230
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2231
+ slab_axes, naxes, 0);
2232
+ if ( rc != CA_ITER_OK ) {
2233
+ rb_raise(rb_eRuntimeError,
2234
+ "log_ki: input init failed rc=%d", rc);
2235
+ }
2236
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2237
+ slab_axes, naxes, CA_KERNEL_WRITE);
2238
+ if ( rc != CA_ITER_OK ) {
2239
+ ca_iter_state_finish(&st_in);
2240
+ rb_raise(rb_eRuntimeError,
2241
+ "log_ki: output init failed rc=%d", rc);
2242
+ }
2243
+
2244
+ char *pi, *po;
2245
+ boolean8_t *mi, *mo;
2246
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2247
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2248
+ CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = log((double) v));
2249
+ ca_iter_state_sync_slab(&st_out);
2250
+ }
2251
+ ca_iter_state_finish(&st_in);
2252
+ ca_iter_state_finish(&st_out);
2253
+ return vout;
2254
+ }
2255
+
2256
+ static VALUE
2257
+ log_ki_native_u64 (VALUE self, CArray *ca)
2258
+ {
2259
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2260
+ INT2NUM(sizeof(double)));
2261
+ CArray *co;
2262
+ GetCArray(vout, co);
2263
+
2264
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2265
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2266
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2267
+ K-D-walkable form. */
2268
+ int8_t slab_axes[CA_RANK_MAX];
2269
+ int8_t naxes = ca->ndim;
2270
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2271
+
2272
+ ca_iter_state st_in, st_out;
2273
+ int rc;
2274
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2275
+ slab_axes, naxes, 0);
2276
+ if ( rc != CA_ITER_OK ) {
2277
+ rb_raise(rb_eRuntimeError,
2278
+ "log_ki: input init failed rc=%d", rc);
2279
+ }
2280
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2281
+ slab_axes, naxes, CA_KERNEL_WRITE);
2282
+ if ( rc != CA_ITER_OK ) {
2283
+ ca_iter_state_finish(&st_in);
2284
+ rb_raise(rb_eRuntimeError,
2285
+ "log_ki: output init failed rc=%d", rc);
2286
+ }
2287
+
2288
+ char *pi, *po;
2289
+ boolean8_t *mi, *mo;
2290
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2291
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2292
+ CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = log((double) v));
2293
+ ca_iter_state_sync_slab(&st_out);
2294
+ }
2295
+ ca_iter_state_finish(&st_in);
2296
+ ca_iter_state_finish(&st_out);
2297
+ return vout;
2298
+ }
2299
+
2300
+ static VALUE
2301
+ log_ki_native_f32 (VALUE self, CArray *ca)
2302
+ {
2303
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2304
+ INT2NUM(sizeof(double)));
2305
+ CArray *co;
2306
+ GetCArray(vout, co);
2307
+
2308
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2309
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2310
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2311
+ K-D-walkable form. */
2312
+ int8_t slab_axes[CA_RANK_MAX];
2313
+ int8_t naxes = ca->ndim;
2314
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2315
+
2316
+ ca_iter_state st_in, st_out;
2317
+ int rc;
2318
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2319
+ slab_axes, naxes, 0);
2320
+ if ( rc != CA_ITER_OK ) {
2321
+ rb_raise(rb_eRuntimeError,
2322
+ "log_ki: input init failed rc=%d", rc);
2323
+ }
2324
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2325
+ slab_axes, naxes, CA_KERNEL_WRITE);
2326
+ if ( rc != CA_ITER_OK ) {
2327
+ ca_iter_state_finish(&st_in);
2328
+ rb_raise(rb_eRuntimeError,
2329
+ "log_ki: output init failed rc=%d", rc);
2330
+ }
2331
+
2332
+ char *pi, *po;
2333
+ boolean8_t *mi, *mo;
2334
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2335
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2336
+ CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = log((double) v));
2337
+ ca_iter_state_sync_slab(&st_out);
2338
+ }
2339
+ ca_iter_state_finish(&st_in);
2340
+ ca_iter_state_finish(&st_out);
2341
+ return vout;
2342
+ }
2343
+
2344
+ static VALUE
2345
+ log_ki_native_f64 (VALUE self, CArray *ca)
2346
+ {
2347
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2348
+ INT2NUM(sizeof(double)));
2349
+ CArray *co;
2350
+ GetCArray(vout, co);
2351
+
2352
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2353
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2354
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2355
+ K-D-walkable form. */
2356
+ int8_t slab_axes[CA_RANK_MAX];
2357
+ int8_t naxes = ca->ndim;
2358
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2359
+
2360
+ ca_iter_state st_in, st_out;
2361
+ int rc;
2362
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2363
+ slab_axes, naxes, 0);
2364
+ if ( rc != CA_ITER_OK ) {
2365
+ rb_raise(rb_eRuntimeError,
2366
+ "log_ki: input init failed rc=%d", rc);
2367
+ }
2368
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2369
+ slab_axes, naxes, CA_KERNEL_WRITE);
2370
+ if ( rc != CA_ITER_OK ) {
2371
+ ca_iter_state_finish(&st_in);
2372
+ rb_raise(rb_eRuntimeError,
2373
+ "log_ki: output init failed rc=%d", rc);
2374
+ }
2375
+
2376
+ char *pi, *po;
2377
+ boolean8_t *mi, *mo;
2378
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2379
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2380
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = log((double) v));
2381
+ ca_iter_state_sync_slab(&st_out);
2382
+ }
2383
+ ca_iter_state_finish(&st_in);
2384
+ ca_iter_state_finish(&st_out);
2385
+ return vout;
2386
+ }
2387
+
2388
+ static VALUE
2389
+ rb_ca_log_ki (VALUE self)
2390
+ {
2391
+ CArray *src;
2392
+ GetCArray(self, src);
2393
+ switch ( src->data_type ) {
2394
+ case CA_INT8: return log_ki_native_i8(self, src);
2395
+ case CA_UINT8: return log_ki_native_u8(self, src);
2396
+ case CA_INT16: return log_ki_native_i16(self, src);
2397
+ case CA_UINT16: return log_ki_native_u16(self, src);
2398
+ case CA_INT32: return log_ki_native_i32(self, src);
2399
+ case CA_UINT32: return log_ki_native_u32(self, src);
2400
+ case CA_INT64: return log_ki_native_i64(self, src);
2401
+ case CA_UINT64: return log_ki_native_u64(self, src);
2402
+ case CA_FLOAT32: return log_ki_native_f32(self, src);
2403
+ case CA_FLOAT64: return log_ki_native_f64(self, src);
2404
+ default: {
2405
+ /* Phase E: only wrap data_types that have a meaningful float64
2406
+ representation. Complex / fixlen / object would lose
2407
+ structure (e.g. complex -> float strips imaginary part)
2408
+ so reject explicitly, matching legacy DataTypeError. */
2409
+ switch ( src->data_type ) {
2410
+ case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
2411
+ default:
2412
+ rb_raise(rb_eCADataTypeError, "log_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
2413
+ }
2414
+ VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
2415
+ CArray *casted;
2416
+ GetCArray(vsrc, casted);
2417
+ return log_ki_native_f64(vsrc, casted);
2418
+ }
2419
+ }
2420
+ return Qnil; /* unreachable */
2421
+ }
2422
+
2423
+ /* ===== square_ki ============================================ */
2424
+
2425
+ static VALUE
2426
+ square_ki_native_i8 (VALUE self, CArray *ca)
2427
+ {
2428
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT8),
2429
+ INT2NUM(sizeof(int8_t)));
2430
+ CArray *co;
2431
+ GetCArray(vout, co);
2432
+
2433
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2434
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2435
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2436
+ K-D-walkable form. */
2437
+ int8_t slab_axes[CA_RANK_MAX];
2438
+ int8_t naxes = ca->ndim;
2439
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2440
+
2441
+ ca_iter_state st_in, st_out;
2442
+ int rc;
2443
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2444
+ slab_axes, naxes, 0);
2445
+ if ( rc != CA_ITER_OK ) {
2446
+ rb_raise(rb_eRuntimeError,
2447
+ "square_ki: input init failed rc=%d", rc);
2448
+ }
2449
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2450
+ slab_axes, naxes, CA_KERNEL_WRITE);
2451
+ if ( rc != CA_ITER_OK ) {
2452
+ ca_iter_state_finish(&st_in);
2453
+ rb_raise(rb_eRuntimeError,
2454
+ "square_ki: output init failed rc=%d", rc);
2455
+ }
2456
+
2457
+ char *pi, *po;
2458
+ boolean8_t *mi, *mo;
2459
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2460
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2461
+ CA_SLAB_MAP_T(int8_t, int8_t, st_in, pi, st_out, po, r = v * v);
2462
+ ca_iter_state_sync_slab(&st_out);
2463
+ }
2464
+ ca_iter_state_finish(&st_in);
2465
+ ca_iter_state_finish(&st_out);
2466
+ return vout;
2467
+ }
2468
+
2469
+ static VALUE
2470
+ square_ki_native_u8 (VALUE self, CArray *ca)
2471
+ {
2472
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT8),
2473
+ INT2NUM(sizeof(uint8_t)));
2474
+ CArray *co;
2475
+ GetCArray(vout, co);
2476
+
2477
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2478
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2479
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2480
+ K-D-walkable form. */
2481
+ int8_t slab_axes[CA_RANK_MAX];
2482
+ int8_t naxes = ca->ndim;
2483
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2484
+
2485
+ ca_iter_state st_in, st_out;
2486
+ int rc;
2487
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2488
+ slab_axes, naxes, 0);
2489
+ if ( rc != CA_ITER_OK ) {
2490
+ rb_raise(rb_eRuntimeError,
2491
+ "square_ki: input init failed rc=%d", rc);
2492
+ }
2493
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2494
+ slab_axes, naxes, CA_KERNEL_WRITE);
2495
+ if ( rc != CA_ITER_OK ) {
2496
+ ca_iter_state_finish(&st_in);
2497
+ rb_raise(rb_eRuntimeError,
2498
+ "square_ki: output init failed rc=%d", rc);
2499
+ }
2500
+
2501
+ char *pi, *po;
2502
+ boolean8_t *mi, *mo;
2503
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2504
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2505
+ CA_SLAB_MAP_T(uint8_t, uint8_t, st_in, pi, st_out, po, r = v * v);
2506
+ ca_iter_state_sync_slab(&st_out);
2507
+ }
2508
+ ca_iter_state_finish(&st_in);
2509
+ ca_iter_state_finish(&st_out);
2510
+ return vout;
2511
+ }
2512
+
2513
+ static VALUE
2514
+ square_ki_native_i16 (VALUE self, CArray *ca)
2515
+ {
2516
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT16),
2517
+ INT2NUM(sizeof(int16_t)));
2518
+ CArray *co;
2519
+ GetCArray(vout, co);
2520
+
2521
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2522
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2523
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2524
+ K-D-walkable form. */
2525
+ int8_t slab_axes[CA_RANK_MAX];
2526
+ int8_t naxes = ca->ndim;
2527
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2528
+
2529
+ ca_iter_state st_in, st_out;
2530
+ int rc;
2531
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2532
+ slab_axes, naxes, 0);
2533
+ if ( rc != CA_ITER_OK ) {
2534
+ rb_raise(rb_eRuntimeError,
2535
+ "square_ki: input init failed rc=%d", rc);
2536
+ }
2537
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2538
+ slab_axes, naxes, CA_KERNEL_WRITE);
2539
+ if ( rc != CA_ITER_OK ) {
2540
+ ca_iter_state_finish(&st_in);
2541
+ rb_raise(rb_eRuntimeError,
2542
+ "square_ki: output init failed rc=%d", rc);
2543
+ }
2544
+
2545
+ char *pi, *po;
2546
+ boolean8_t *mi, *mo;
2547
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2548
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2549
+ CA_SLAB_MAP_T(int16_t, int16_t, st_in, pi, st_out, po, r = v * v);
2550
+ ca_iter_state_sync_slab(&st_out);
2551
+ }
2552
+ ca_iter_state_finish(&st_in);
2553
+ ca_iter_state_finish(&st_out);
2554
+ return vout;
2555
+ }
2556
+
2557
+ static VALUE
2558
+ square_ki_native_u16 (VALUE self, CArray *ca)
2559
+ {
2560
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT16),
2561
+ INT2NUM(sizeof(uint16_t)));
2562
+ CArray *co;
2563
+ GetCArray(vout, co);
2564
+
2565
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2566
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2567
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2568
+ K-D-walkable form. */
2569
+ int8_t slab_axes[CA_RANK_MAX];
2570
+ int8_t naxes = ca->ndim;
2571
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2572
+
2573
+ ca_iter_state st_in, st_out;
2574
+ int rc;
2575
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2576
+ slab_axes, naxes, 0);
2577
+ if ( rc != CA_ITER_OK ) {
2578
+ rb_raise(rb_eRuntimeError,
2579
+ "square_ki: input init failed rc=%d", rc);
2580
+ }
2581
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2582
+ slab_axes, naxes, CA_KERNEL_WRITE);
2583
+ if ( rc != CA_ITER_OK ) {
2584
+ ca_iter_state_finish(&st_in);
2585
+ rb_raise(rb_eRuntimeError,
2586
+ "square_ki: output init failed rc=%d", rc);
2587
+ }
2588
+
2589
+ char *pi, *po;
2590
+ boolean8_t *mi, *mo;
2591
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2592
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2593
+ CA_SLAB_MAP_T(uint16_t, uint16_t, st_in, pi, st_out, po, r = v * v);
2594
+ ca_iter_state_sync_slab(&st_out);
2595
+ }
2596
+ ca_iter_state_finish(&st_in);
2597
+ ca_iter_state_finish(&st_out);
2598
+ return vout;
2599
+ }
2600
+
2601
+ static VALUE
2602
+ square_ki_native_i32 (VALUE self, CArray *ca)
2603
+ {
2604
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT32),
2605
+ INT2NUM(sizeof(int32_t)));
2606
+ CArray *co;
2607
+ GetCArray(vout, co);
2608
+
2609
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2610
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2611
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2612
+ K-D-walkable form. */
2613
+ int8_t slab_axes[CA_RANK_MAX];
2614
+ int8_t naxes = ca->ndim;
2615
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2616
+
2617
+ ca_iter_state st_in, st_out;
2618
+ int rc;
2619
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2620
+ slab_axes, naxes, 0);
2621
+ if ( rc != CA_ITER_OK ) {
2622
+ rb_raise(rb_eRuntimeError,
2623
+ "square_ki: input init failed rc=%d", rc);
2624
+ }
2625
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2626
+ slab_axes, naxes, CA_KERNEL_WRITE);
2627
+ if ( rc != CA_ITER_OK ) {
2628
+ ca_iter_state_finish(&st_in);
2629
+ rb_raise(rb_eRuntimeError,
2630
+ "square_ki: output init failed rc=%d", rc);
2631
+ }
2632
+
2633
+ char *pi, *po;
2634
+ boolean8_t *mi, *mo;
2635
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2636
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2637
+ CA_SLAB_MAP_T(int32_t, int32_t, st_in, pi, st_out, po, r = v * v);
2638
+ ca_iter_state_sync_slab(&st_out);
2639
+ }
2640
+ ca_iter_state_finish(&st_in);
2641
+ ca_iter_state_finish(&st_out);
2642
+ return vout;
2643
+ }
2644
+
2645
+ static VALUE
2646
+ square_ki_native_u32 (VALUE self, CArray *ca)
2647
+ {
2648
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT32),
2649
+ INT2NUM(sizeof(uint32_t)));
2650
+ CArray *co;
2651
+ GetCArray(vout, co);
2652
+
2653
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2654
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2655
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2656
+ K-D-walkable form. */
2657
+ int8_t slab_axes[CA_RANK_MAX];
2658
+ int8_t naxes = ca->ndim;
2659
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2660
+
2661
+ ca_iter_state st_in, st_out;
2662
+ int rc;
2663
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2664
+ slab_axes, naxes, 0);
2665
+ if ( rc != CA_ITER_OK ) {
2666
+ rb_raise(rb_eRuntimeError,
2667
+ "square_ki: input init failed rc=%d", rc);
2668
+ }
2669
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2670
+ slab_axes, naxes, CA_KERNEL_WRITE);
2671
+ if ( rc != CA_ITER_OK ) {
2672
+ ca_iter_state_finish(&st_in);
2673
+ rb_raise(rb_eRuntimeError,
2674
+ "square_ki: output init failed rc=%d", rc);
2675
+ }
2676
+
2677
+ char *pi, *po;
2678
+ boolean8_t *mi, *mo;
2679
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2680
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2681
+ CA_SLAB_MAP_T(uint32_t, uint32_t, st_in, pi, st_out, po, r = v * v);
2682
+ ca_iter_state_sync_slab(&st_out);
2683
+ }
2684
+ ca_iter_state_finish(&st_in);
2685
+ ca_iter_state_finish(&st_out);
2686
+ return vout;
2687
+ }
2688
+
2689
+ static VALUE
2690
+ square_ki_native_i64 (VALUE self, CArray *ca)
2691
+ {
2692
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT64),
2693
+ INT2NUM(sizeof(int64_t)));
2694
+ CArray *co;
2695
+ GetCArray(vout, co);
2696
+
2697
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2698
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2699
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2700
+ K-D-walkable form. */
2701
+ int8_t slab_axes[CA_RANK_MAX];
2702
+ int8_t naxes = ca->ndim;
2703
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2704
+
2705
+ ca_iter_state st_in, st_out;
2706
+ int rc;
2707
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2708
+ slab_axes, naxes, 0);
2709
+ if ( rc != CA_ITER_OK ) {
2710
+ rb_raise(rb_eRuntimeError,
2711
+ "square_ki: input init failed rc=%d", rc);
2712
+ }
2713
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2714
+ slab_axes, naxes, CA_KERNEL_WRITE);
2715
+ if ( rc != CA_ITER_OK ) {
2716
+ ca_iter_state_finish(&st_in);
2717
+ rb_raise(rb_eRuntimeError,
2718
+ "square_ki: output init failed rc=%d", rc);
2719
+ }
2720
+
2721
+ char *pi, *po;
2722
+ boolean8_t *mi, *mo;
2723
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2724
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2725
+ CA_SLAB_MAP_T(int64_t, int64_t, st_in, pi, st_out, po, r = v * v);
2726
+ ca_iter_state_sync_slab(&st_out);
2727
+ }
2728
+ ca_iter_state_finish(&st_in);
2729
+ ca_iter_state_finish(&st_out);
2730
+ return vout;
2731
+ }
2732
+
2733
+ static VALUE
2734
+ square_ki_native_u64 (VALUE self, CArray *ca)
2735
+ {
2736
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT64),
2737
+ INT2NUM(sizeof(uint64_t)));
2738
+ CArray *co;
2739
+ GetCArray(vout, co);
2740
+
2741
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2742
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2743
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2744
+ K-D-walkable form. */
2745
+ int8_t slab_axes[CA_RANK_MAX];
2746
+ int8_t naxes = ca->ndim;
2747
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2748
+
2749
+ ca_iter_state st_in, st_out;
2750
+ int rc;
2751
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2752
+ slab_axes, naxes, 0);
2753
+ if ( rc != CA_ITER_OK ) {
2754
+ rb_raise(rb_eRuntimeError,
2755
+ "square_ki: input init failed rc=%d", rc);
2756
+ }
2757
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2758
+ slab_axes, naxes, CA_KERNEL_WRITE);
2759
+ if ( rc != CA_ITER_OK ) {
2760
+ ca_iter_state_finish(&st_in);
2761
+ rb_raise(rb_eRuntimeError,
2762
+ "square_ki: output init failed rc=%d", rc);
2763
+ }
2764
+
2765
+ char *pi, *po;
2766
+ boolean8_t *mi, *mo;
2767
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2768
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2769
+ CA_SLAB_MAP_T(uint64_t, uint64_t, st_in, pi, st_out, po, r = v * v);
2770
+ ca_iter_state_sync_slab(&st_out);
2771
+ }
2772
+ ca_iter_state_finish(&st_in);
2773
+ ca_iter_state_finish(&st_out);
2774
+ return vout;
2775
+ }
2776
+
2777
+ static VALUE
2778
+ square_ki_native_f32 (VALUE self, CArray *ca)
2779
+ {
2780
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT32),
2781
+ INT2NUM(sizeof(float)));
2782
+ CArray *co;
2783
+ GetCArray(vout, co);
2784
+
2785
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2786
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2787
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2788
+ K-D-walkable form. */
2789
+ int8_t slab_axes[CA_RANK_MAX];
2790
+ int8_t naxes = ca->ndim;
2791
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2792
+
2793
+ ca_iter_state st_in, st_out;
2794
+ int rc;
2795
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2796
+ slab_axes, naxes, 0);
2797
+ if ( rc != CA_ITER_OK ) {
2798
+ rb_raise(rb_eRuntimeError,
2799
+ "square_ki: input init failed rc=%d", rc);
2800
+ }
2801
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2802
+ slab_axes, naxes, CA_KERNEL_WRITE);
2803
+ if ( rc != CA_ITER_OK ) {
2804
+ ca_iter_state_finish(&st_in);
2805
+ rb_raise(rb_eRuntimeError,
2806
+ "square_ki: output init failed rc=%d", rc);
2807
+ }
2808
+
2809
+ char *pi, *po;
2810
+ boolean8_t *mi, *mo;
2811
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2812
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2813
+ CA_SLAB_MAP_T(float, float, st_in, pi, st_out, po, r = v * v);
2814
+ ca_iter_state_sync_slab(&st_out);
2815
+ }
2816
+ ca_iter_state_finish(&st_in);
2817
+ ca_iter_state_finish(&st_out);
2818
+ return vout;
2819
+ }
2820
+
2821
+ static VALUE
2822
+ square_ki_native_f64 (VALUE self, CArray *ca)
2823
+ {
2824
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
2825
+ INT2NUM(sizeof(double)));
2826
+ CArray *co;
2827
+ GetCArray(vout, co);
2828
+
2829
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2830
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2831
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2832
+ K-D-walkable form. */
2833
+ int8_t slab_axes[CA_RANK_MAX];
2834
+ int8_t naxes = ca->ndim;
2835
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2836
+
2837
+ ca_iter_state st_in, st_out;
2838
+ int rc;
2839
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2840
+ slab_axes, naxes, 0);
2841
+ if ( rc != CA_ITER_OK ) {
2842
+ rb_raise(rb_eRuntimeError,
2843
+ "square_ki: input init failed rc=%d", rc);
2844
+ }
2845
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2846
+ slab_axes, naxes, CA_KERNEL_WRITE);
2847
+ if ( rc != CA_ITER_OK ) {
2848
+ ca_iter_state_finish(&st_in);
2849
+ rb_raise(rb_eRuntimeError,
2850
+ "square_ki: output init failed rc=%d", rc);
2851
+ }
2852
+
2853
+ char *pi, *po;
2854
+ boolean8_t *mi, *mo;
2855
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2856
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2857
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = v * v);
2858
+ ca_iter_state_sync_slab(&st_out);
2859
+ }
2860
+ ca_iter_state_finish(&st_in);
2861
+ ca_iter_state_finish(&st_out);
2862
+ return vout;
2863
+ }
2864
+
2865
+ static VALUE
2866
+ rb_ca_square_ki (VALUE self)
2867
+ {
2868
+ CArray *src;
2869
+ GetCArray(self, src);
2870
+ switch ( src->data_type ) {
2871
+ case CA_INT8: return square_ki_native_i8(self, src);
2872
+ case CA_UINT8: return square_ki_native_u8(self, src);
2873
+ case CA_INT16: return square_ki_native_i16(self, src);
2874
+ case CA_UINT16: return square_ki_native_u16(self, src);
2875
+ case CA_INT32: return square_ki_native_i32(self, src);
2876
+ case CA_UINT32: return square_ki_native_u32(self, src);
2877
+ case CA_INT64: return square_ki_native_i64(self, src);
2878
+ case CA_UINT64: return square_ki_native_u64(self, src);
2879
+ case CA_FLOAT32: return square_ki_native_f32(self, src);
2880
+ case CA_FLOAT64: return square_ki_native_f64(self, src);
2881
+ default:
2882
+ rb_raise(rb_eCADataTypeError, "square_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64)", ca_type_name[src->data_type]);
2883
+ }
2884
+ return Qnil; /* unreachable */
2885
+ }
2886
+
2887
+ /* ===== abs_ki ============================================ */
2888
+
2889
+ static VALUE
2890
+ abs_ki_native_i8 (VALUE self, CArray *ca)
2891
+ {
2892
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT8),
2893
+ INT2NUM(sizeof(int8_t)));
2894
+ CArray *co;
2895
+ GetCArray(vout, co);
2896
+
2897
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2898
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2899
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2900
+ K-D-walkable form. */
2901
+ int8_t slab_axes[CA_RANK_MAX];
2902
+ int8_t naxes = ca->ndim;
2903
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2904
+
2905
+ ca_iter_state st_in, st_out;
2906
+ int rc;
2907
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2908
+ slab_axes, naxes, 0);
2909
+ if ( rc != CA_ITER_OK ) {
2910
+ rb_raise(rb_eRuntimeError,
2911
+ "abs_ki: input init failed rc=%d", rc);
2912
+ }
2913
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2914
+ slab_axes, naxes, CA_KERNEL_WRITE);
2915
+ if ( rc != CA_ITER_OK ) {
2916
+ ca_iter_state_finish(&st_in);
2917
+ rb_raise(rb_eRuntimeError,
2918
+ "abs_ki: output init failed rc=%d", rc);
2919
+ }
2920
+
2921
+ char *pi, *po;
2922
+ boolean8_t *mi, *mo;
2923
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2924
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2925
+ CA_SLAB_MAP_T(int8_t, int8_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
2926
+ ca_iter_state_sync_slab(&st_out);
2927
+ }
2928
+ ca_iter_state_finish(&st_in);
2929
+ ca_iter_state_finish(&st_out);
2930
+ return vout;
2931
+ }
2932
+
2933
+ static VALUE
2934
+ abs_ki_native_i16 (VALUE self, CArray *ca)
2935
+ {
2936
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT16),
2937
+ INT2NUM(sizeof(int16_t)));
2938
+ CArray *co;
2939
+ GetCArray(vout, co);
2940
+
2941
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2942
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2943
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2944
+ K-D-walkable form. */
2945
+ int8_t slab_axes[CA_RANK_MAX];
2946
+ int8_t naxes = ca->ndim;
2947
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2948
+
2949
+ ca_iter_state st_in, st_out;
2950
+ int rc;
2951
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2952
+ slab_axes, naxes, 0);
2953
+ if ( rc != CA_ITER_OK ) {
2954
+ rb_raise(rb_eRuntimeError,
2955
+ "abs_ki: input init failed rc=%d", rc);
2956
+ }
2957
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
2958
+ slab_axes, naxes, CA_KERNEL_WRITE);
2959
+ if ( rc != CA_ITER_OK ) {
2960
+ ca_iter_state_finish(&st_in);
2961
+ rb_raise(rb_eRuntimeError,
2962
+ "abs_ki: output init failed rc=%d", rc);
2963
+ }
2964
+
2965
+ char *pi, *po;
2966
+ boolean8_t *mi, *mo;
2967
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
2968
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
2969
+ CA_SLAB_MAP_T(int16_t, int16_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
2970
+ ca_iter_state_sync_slab(&st_out);
2971
+ }
2972
+ ca_iter_state_finish(&st_in);
2973
+ ca_iter_state_finish(&st_out);
2974
+ return vout;
2975
+ }
2976
+
2977
+ static VALUE
2978
+ abs_ki_native_i32 (VALUE self, CArray *ca)
2979
+ {
2980
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT32),
2981
+ INT2NUM(sizeof(int32_t)));
2982
+ CArray *co;
2983
+ GetCArray(vout, co);
2984
+
2985
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
2986
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
2987
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
2988
+ K-D-walkable form. */
2989
+ int8_t slab_axes[CA_RANK_MAX];
2990
+ int8_t naxes = ca->ndim;
2991
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
2992
+
2993
+ ca_iter_state st_in, st_out;
2994
+ int rc;
2995
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
2996
+ slab_axes, naxes, 0);
2997
+ if ( rc != CA_ITER_OK ) {
2998
+ rb_raise(rb_eRuntimeError,
2999
+ "abs_ki: input init failed rc=%d", rc);
3000
+ }
3001
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3002
+ slab_axes, naxes, CA_KERNEL_WRITE);
3003
+ if ( rc != CA_ITER_OK ) {
3004
+ ca_iter_state_finish(&st_in);
3005
+ rb_raise(rb_eRuntimeError,
3006
+ "abs_ki: output init failed rc=%d", rc);
3007
+ }
3008
+
3009
+ char *pi, *po;
3010
+ boolean8_t *mi, *mo;
3011
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3012
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3013
+ CA_SLAB_MAP_T(int32_t, int32_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
3014
+ ca_iter_state_sync_slab(&st_out);
3015
+ }
3016
+ ca_iter_state_finish(&st_in);
3017
+ ca_iter_state_finish(&st_out);
3018
+ return vout;
3019
+ }
3020
+
3021
+ static VALUE
3022
+ abs_ki_native_i64 (VALUE self, CArray *ca)
3023
+ {
3024
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT64),
3025
+ INT2NUM(sizeof(int64_t)));
3026
+ CArray *co;
3027
+ GetCArray(vout, co);
3028
+
3029
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3030
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3031
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3032
+ K-D-walkable form. */
3033
+ int8_t slab_axes[CA_RANK_MAX];
3034
+ int8_t naxes = ca->ndim;
3035
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3036
+
3037
+ ca_iter_state st_in, st_out;
3038
+ int rc;
3039
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3040
+ slab_axes, naxes, 0);
3041
+ if ( rc != CA_ITER_OK ) {
3042
+ rb_raise(rb_eRuntimeError,
3043
+ "abs_ki: input init failed rc=%d", rc);
3044
+ }
3045
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3046
+ slab_axes, naxes, CA_KERNEL_WRITE);
3047
+ if ( rc != CA_ITER_OK ) {
3048
+ ca_iter_state_finish(&st_in);
3049
+ rb_raise(rb_eRuntimeError,
3050
+ "abs_ki: output init failed rc=%d", rc);
3051
+ }
3052
+
3053
+ char *pi, *po;
3054
+ boolean8_t *mi, *mo;
3055
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3056
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3057
+ CA_SLAB_MAP_T(int64_t, int64_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
3058
+ ca_iter_state_sync_slab(&st_out);
3059
+ }
3060
+ ca_iter_state_finish(&st_in);
3061
+ ca_iter_state_finish(&st_out);
3062
+ return vout;
3063
+ }
3064
+
3065
+ static VALUE
3066
+ abs_ki_native_f32 (VALUE self, CArray *ca)
3067
+ {
3068
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT32),
3069
+ INT2NUM(sizeof(float)));
3070
+ CArray *co;
3071
+ GetCArray(vout, co);
3072
+
3073
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3074
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3075
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3076
+ K-D-walkable form. */
3077
+ int8_t slab_axes[CA_RANK_MAX];
3078
+ int8_t naxes = ca->ndim;
3079
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3080
+
3081
+ ca_iter_state st_in, st_out;
3082
+ int rc;
3083
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3084
+ slab_axes, naxes, 0);
3085
+ if ( rc != CA_ITER_OK ) {
3086
+ rb_raise(rb_eRuntimeError,
3087
+ "abs_ki: input init failed rc=%d", rc);
3088
+ }
3089
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3090
+ slab_axes, naxes, CA_KERNEL_WRITE);
3091
+ if ( rc != CA_ITER_OK ) {
3092
+ ca_iter_state_finish(&st_in);
3093
+ rb_raise(rb_eRuntimeError,
3094
+ "abs_ki: output init failed rc=%d", rc);
3095
+ }
3096
+
3097
+ char *pi, *po;
3098
+ boolean8_t *mi, *mo;
3099
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3100
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3101
+ CA_SLAB_MAP_T(float, float, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
3102
+ ca_iter_state_sync_slab(&st_out);
3103
+ }
3104
+ ca_iter_state_finish(&st_in);
3105
+ ca_iter_state_finish(&st_out);
3106
+ return vout;
3107
+ }
3108
+
3109
+ static VALUE
3110
+ abs_ki_native_f64 (VALUE self, CArray *ca)
3111
+ {
3112
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
3113
+ INT2NUM(sizeof(double)));
3114
+ CArray *co;
3115
+ GetCArray(vout, co);
3116
+
3117
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3118
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3119
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3120
+ K-D-walkable form. */
3121
+ int8_t slab_axes[CA_RANK_MAX];
3122
+ int8_t naxes = ca->ndim;
3123
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3124
+
3125
+ ca_iter_state st_in, st_out;
3126
+ int rc;
3127
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3128
+ slab_axes, naxes, 0);
3129
+ if ( rc != CA_ITER_OK ) {
3130
+ rb_raise(rb_eRuntimeError,
3131
+ "abs_ki: input init failed rc=%d", rc);
3132
+ }
3133
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3134
+ slab_axes, naxes, CA_KERNEL_WRITE);
3135
+ if ( rc != CA_ITER_OK ) {
3136
+ ca_iter_state_finish(&st_in);
3137
+ rb_raise(rb_eRuntimeError,
3138
+ "abs_ki: output init failed rc=%d", rc);
3139
+ }
3140
+
3141
+ char *pi, *po;
3142
+ boolean8_t *mi, *mo;
3143
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3144
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3145
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
3146
+ ca_iter_state_sync_slab(&st_out);
3147
+ }
3148
+ ca_iter_state_finish(&st_in);
3149
+ ca_iter_state_finish(&st_out);
3150
+ return vout;
3151
+ }
3152
+
3153
+ static VALUE
3154
+ rb_ca_abs_ki (VALUE self)
3155
+ {
3156
+ CArray *src;
3157
+ GetCArray(self, src);
3158
+ switch ( src->data_type ) {
3159
+ case CA_INT8: return abs_ki_native_i8(self, src);
3160
+ case CA_INT16: return abs_ki_native_i16(self, src);
3161
+ case CA_INT32: return abs_ki_native_i32(self, src);
3162
+ case CA_INT64: return abs_ki_native_i64(self, src);
3163
+ case CA_FLOAT32: return abs_ki_native_f32(self, src);
3164
+ case CA_FLOAT64: return abs_ki_native_f64(self, src);
3165
+ default:
3166
+ rb_raise(rb_eCADataTypeError, "abs_ki: source data_type :%s not supported (expected one of: i8, i16, i32, i64, f32, f64)", ca_type_name[src->data_type]);
3167
+ }
3168
+ return Qnil; /* unreachable */
3169
+ }
3170
+
3171
+ /* ===== negate_ki ============================================ */
3172
+
3173
+ static VALUE
3174
+ negate_ki_native_i8 (VALUE self, CArray *ca)
3175
+ {
3176
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT8),
3177
+ INT2NUM(sizeof(int8_t)));
3178
+ CArray *co;
3179
+ GetCArray(vout, co);
3180
+
3181
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3182
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3183
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3184
+ K-D-walkable form. */
3185
+ int8_t slab_axes[CA_RANK_MAX];
3186
+ int8_t naxes = ca->ndim;
3187
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3188
+
3189
+ ca_iter_state st_in, st_out;
3190
+ int rc;
3191
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3192
+ slab_axes, naxes, 0);
3193
+ if ( rc != CA_ITER_OK ) {
3194
+ rb_raise(rb_eRuntimeError,
3195
+ "negate_ki: input init failed rc=%d", rc);
3196
+ }
3197
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3198
+ slab_axes, naxes, CA_KERNEL_WRITE);
3199
+ if ( rc != CA_ITER_OK ) {
3200
+ ca_iter_state_finish(&st_in);
3201
+ rb_raise(rb_eRuntimeError,
3202
+ "negate_ki: output init failed rc=%d", rc);
3203
+ }
3204
+
3205
+ char *pi, *po;
3206
+ boolean8_t *mi, *mo;
3207
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3208
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3209
+ CA_SLAB_MAP_T(int8_t, int8_t, st_in, pi, st_out, po, r = -v);
3210
+ ca_iter_state_sync_slab(&st_out);
3211
+ }
3212
+ ca_iter_state_finish(&st_in);
3213
+ ca_iter_state_finish(&st_out);
3214
+ return vout;
3215
+ }
3216
+
3217
+ static VALUE
3218
+ negate_ki_native_i16 (VALUE self, CArray *ca)
3219
+ {
3220
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT16),
3221
+ INT2NUM(sizeof(int16_t)));
3222
+ CArray *co;
3223
+ GetCArray(vout, co);
3224
+
3225
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3226
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3227
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3228
+ K-D-walkable form. */
3229
+ int8_t slab_axes[CA_RANK_MAX];
3230
+ int8_t naxes = ca->ndim;
3231
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3232
+
3233
+ ca_iter_state st_in, st_out;
3234
+ int rc;
3235
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3236
+ slab_axes, naxes, 0);
3237
+ if ( rc != CA_ITER_OK ) {
3238
+ rb_raise(rb_eRuntimeError,
3239
+ "negate_ki: input init failed rc=%d", rc);
3240
+ }
3241
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3242
+ slab_axes, naxes, CA_KERNEL_WRITE);
3243
+ if ( rc != CA_ITER_OK ) {
3244
+ ca_iter_state_finish(&st_in);
3245
+ rb_raise(rb_eRuntimeError,
3246
+ "negate_ki: output init failed rc=%d", rc);
3247
+ }
3248
+
3249
+ char *pi, *po;
3250
+ boolean8_t *mi, *mo;
3251
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3252
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3253
+ CA_SLAB_MAP_T(int16_t, int16_t, st_in, pi, st_out, po, r = -v);
3254
+ ca_iter_state_sync_slab(&st_out);
3255
+ }
3256
+ ca_iter_state_finish(&st_in);
3257
+ ca_iter_state_finish(&st_out);
3258
+ return vout;
3259
+ }
3260
+
3261
+ static VALUE
3262
+ negate_ki_native_i32 (VALUE self, CArray *ca)
3263
+ {
3264
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT32),
3265
+ INT2NUM(sizeof(int32_t)));
3266
+ CArray *co;
3267
+ GetCArray(vout, co);
3268
+
3269
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3270
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3271
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3272
+ K-D-walkable form. */
3273
+ int8_t slab_axes[CA_RANK_MAX];
3274
+ int8_t naxes = ca->ndim;
3275
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3276
+
3277
+ ca_iter_state st_in, st_out;
3278
+ int rc;
3279
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3280
+ slab_axes, naxes, 0);
3281
+ if ( rc != CA_ITER_OK ) {
3282
+ rb_raise(rb_eRuntimeError,
3283
+ "negate_ki: input init failed rc=%d", rc);
3284
+ }
3285
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3286
+ slab_axes, naxes, CA_KERNEL_WRITE);
3287
+ if ( rc != CA_ITER_OK ) {
3288
+ ca_iter_state_finish(&st_in);
3289
+ rb_raise(rb_eRuntimeError,
3290
+ "negate_ki: output init failed rc=%d", rc);
3291
+ }
3292
+
3293
+ char *pi, *po;
3294
+ boolean8_t *mi, *mo;
3295
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3296
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3297
+ CA_SLAB_MAP_T(int32_t, int32_t, st_in, pi, st_out, po, r = -v);
3298
+ ca_iter_state_sync_slab(&st_out);
3299
+ }
3300
+ ca_iter_state_finish(&st_in);
3301
+ ca_iter_state_finish(&st_out);
3302
+ return vout;
3303
+ }
3304
+
3305
+ static VALUE
3306
+ negate_ki_native_i64 (VALUE self, CArray *ca)
3307
+ {
3308
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT64),
3309
+ INT2NUM(sizeof(int64_t)));
3310
+ CArray *co;
3311
+ GetCArray(vout, co);
3312
+
3313
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3314
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3315
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3316
+ K-D-walkable form. */
3317
+ int8_t slab_axes[CA_RANK_MAX];
3318
+ int8_t naxes = ca->ndim;
3319
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3320
+
3321
+ ca_iter_state st_in, st_out;
3322
+ int rc;
3323
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3324
+ slab_axes, naxes, 0);
3325
+ if ( rc != CA_ITER_OK ) {
3326
+ rb_raise(rb_eRuntimeError,
3327
+ "negate_ki: input init failed rc=%d", rc);
3328
+ }
3329
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3330
+ slab_axes, naxes, CA_KERNEL_WRITE);
3331
+ if ( rc != CA_ITER_OK ) {
3332
+ ca_iter_state_finish(&st_in);
3333
+ rb_raise(rb_eRuntimeError,
3334
+ "negate_ki: output init failed rc=%d", rc);
3335
+ }
3336
+
3337
+ char *pi, *po;
3338
+ boolean8_t *mi, *mo;
3339
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3340
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3341
+ CA_SLAB_MAP_T(int64_t, int64_t, st_in, pi, st_out, po, r = -v);
3342
+ ca_iter_state_sync_slab(&st_out);
3343
+ }
3344
+ ca_iter_state_finish(&st_in);
3345
+ ca_iter_state_finish(&st_out);
3346
+ return vout;
3347
+ }
3348
+
3349
+ static VALUE
3350
+ negate_ki_native_f32 (VALUE self, CArray *ca)
3351
+ {
3352
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT32),
3353
+ INT2NUM(sizeof(float)));
3354
+ CArray *co;
3355
+ GetCArray(vout, co);
3356
+
3357
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3358
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3359
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3360
+ K-D-walkable form. */
3361
+ int8_t slab_axes[CA_RANK_MAX];
3362
+ int8_t naxes = ca->ndim;
3363
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3364
+
3365
+ ca_iter_state st_in, st_out;
3366
+ int rc;
3367
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3368
+ slab_axes, naxes, 0);
3369
+ if ( rc != CA_ITER_OK ) {
3370
+ rb_raise(rb_eRuntimeError,
3371
+ "negate_ki: input init failed rc=%d", rc);
3372
+ }
3373
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3374
+ slab_axes, naxes, CA_KERNEL_WRITE);
3375
+ if ( rc != CA_ITER_OK ) {
3376
+ ca_iter_state_finish(&st_in);
3377
+ rb_raise(rb_eRuntimeError,
3378
+ "negate_ki: output init failed rc=%d", rc);
3379
+ }
3380
+
3381
+ char *pi, *po;
3382
+ boolean8_t *mi, *mo;
3383
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3384
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3385
+ CA_SLAB_MAP_T(float, float, st_in, pi, st_out, po, r = -v);
3386
+ ca_iter_state_sync_slab(&st_out);
3387
+ }
3388
+ ca_iter_state_finish(&st_in);
3389
+ ca_iter_state_finish(&st_out);
3390
+ return vout;
3391
+ }
3392
+
3393
+ static VALUE
3394
+ negate_ki_native_f64 (VALUE self, CArray *ca)
3395
+ {
3396
+ VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
3397
+ INT2NUM(sizeof(double)));
3398
+ CArray *co;
3399
+ GetCArray(vout, co);
3400
+
3401
+ /* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
3402
+ CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
3403
+ populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
3404
+ K-D-walkable form. */
3405
+ int8_t slab_axes[CA_RANK_MAX];
3406
+ int8_t naxes = ca->ndim;
3407
+ for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
3408
+
3409
+ ca_iter_state st_in, st_out;
3410
+ int rc;
3411
+ rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
3412
+ slab_axes, naxes, 0);
3413
+ if ( rc != CA_ITER_OK ) {
3414
+ rb_raise(rb_eRuntimeError,
3415
+ "negate_ki: input init failed rc=%d", rc);
3416
+ }
3417
+ rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
3418
+ slab_axes, naxes, CA_KERNEL_WRITE);
3419
+ if ( rc != CA_ITER_OK ) {
3420
+ ca_iter_state_finish(&st_in);
3421
+ rb_raise(rb_eRuntimeError,
3422
+ "negate_ki: output init failed rc=%d", rc);
3423
+ }
3424
+
3425
+ char *pi, *po;
3426
+ boolean8_t *mi, *mo;
3427
+ while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
3428
+ ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
3429
+ CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = -v);
3430
+ ca_iter_state_sync_slab(&st_out);
3431
+ }
3432
+ ca_iter_state_finish(&st_in);
3433
+ ca_iter_state_finish(&st_out);
3434
+ return vout;
3435
+ }
3436
+
3437
+ static VALUE
3438
+ rb_ca_negate_ki (VALUE self)
3439
+ {
3440
+ CArray *src;
3441
+ GetCArray(self, src);
3442
+ switch ( src->data_type ) {
3443
+ case CA_INT8: return negate_ki_native_i8(self, src);
3444
+ case CA_INT16: return negate_ki_native_i16(self, src);
3445
+ case CA_INT32: return negate_ki_native_i32(self, src);
3446
+ case CA_INT64: return negate_ki_native_i64(self, src);
3447
+ case CA_FLOAT32: return negate_ki_native_f32(self, src);
3448
+ case CA_FLOAT64: return negate_ki_native_f64(self, src);
3449
+ default:
3450
+ rb_raise(rb_eCADataTypeError, "negate_ki: source data_type :%s not supported (expected one of: i8, i16, i32, i64, f32, f64)", ca_type_name[src->data_type]);
3451
+ }
3452
+ return Qnil; /* unreachable */
3453
+ }
3454
+
3455
+ void
3456
+ Init_carray_kernels_map (void)
3457
+ {
3458
+ rb_define_method(rb_cCArray, "sqrt_ki", rb_ca_sqrt_ki, 0);
3459
+ rb_define_method(rb_cCArray, "sin_ki", rb_ca_sin_ki, 0);
3460
+ rb_define_method(rb_cCArray, "cos_ki", rb_ca_cos_ki, 0);
3461
+ rb_define_method(rb_cCArray, "exp_ki", rb_ca_exp_ki, 0);
3462
+ rb_define_method(rb_cCArray, "log_ki", rb_ca_log_ki, 0);
3463
+ rb_define_method(rb_cCArray, "square_ki", rb_ca_square_ki, 0);
3464
+ rb_define_method(rb_cCArray, "abs_ki", rb_ca_abs_ki, 0);
3465
+ rb_define_method(rb_cCArray, "negate_ki", rb_ca_negate_ki, 0);
3466
+ }