carray 2.0.1 → 3.0.1

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