carray 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
@@ -0,0 +1,120 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ---------------------------------------------------------------------------
4
+
5
+ PROPOSAL_CARRAY_H_REORG (H.3): the ext-author / math-backend surface.
6
+
7
+ This header carries the element-wise kernel calling-convention typedefs
8
+ (ca_monop_func_t / ca_binop_func_t / ...), the rb_ca_call_* drivers, and
9
+ (via the per-family dispatch headers it pulls in) the per-data_type kernel
10
+ dispatch tables (ca_monop_sin[CA_NTYPE], ...).
11
+
12
+ It is included by carray.h (the public umbrella), so an external gem that
13
+ does `#include "carray.h"` reaches the whole math-kernel surface with no
14
+ hand-declared externs — e.g. a vector-math backend gem can swap
15
+ `ca_monop_sin[CA_FLOAT64] = my_vector_sin;`.
16
+
17
+ Ordering invariant: the func typedefs below MUST precede the dispatch-header
18
+ includes (the tables are typed with them).
19
+
20
+ ---------------------------------------------------------------------------- */
21
+
22
+ #ifndef CARRAY_MATH_KERNEL_H
23
+ #define CARRAY_MATH_KERNEL_H
24
+
25
+ #include "carray.h"
26
+
27
+ /* -------------------------------------------------------------------- */
28
+ /* Element-wise kernel calling-convention typedefs */
29
+ /* -------------------------------------------------------------------- */
30
+
31
+ typedef void (*ca_monop_func_t)(ca_size_t n, boolean8_t *m,
32
+ char *ptr1, ca_size_t i1,
33
+ char *ptr2, ca_size_t i2);
34
+ typedef void (*ca_binop_func_t)(ca_size_t n, boolean8_t *m,
35
+ char *ptr1, ca_size_t i1,
36
+ char *ptr2, ca_size_t i2,
37
+ char *ptr3, ca_size_t i3);
38
+ typedef void (*ca_triop_func_t)(ca_size_t n, boolean8_t *m,
39
+ char *ptr1, ca_size_t i1,
40
+ char *ptr2, ca_size_t i2,
41
+ char *ptr3, ca_size_t i3,
42
+ char *ptr4, ca_size_t i4);
43
+ typedef void (*ca_moncmp_func_t)(ca_size_t n, boolean8_t *m,
44
+ char *ptr1, ca_size_t i1,
45
+ boolean8_t *ptr2, ca_size_t i2);
46
+ /* IC.1 (PROPOSAL_IS_CLOSE_BINCMP_MIGRATION rev1): runtime `double tol`
47
+ slot added uniformly. Non-tolerance ops (eq/ne/lt/gt/le/ge/feq, etc.)
48
+ ignore it via `(void) tol;`. Tolerance ops (is_close, is_equiv) read
49
+ it in the comparison expression. See PROPOSAL §3.1 Option A. */
50
+ typedef void (*ca_bincmp_func_t)(ca_size_t n, boolean8_t *m,
51
+ char *ptr1, ca_size_t b1, ca_size_t i1,
52
+ char *ptr2, ca_size_t b2, ca_size_t i2,
53
+ char *ptr3, ca_size_t b3, ca_size_t i3,
54
+ double tol);
55
+
56
+ /* -------------------------------------------------------------------- */
57
+ /* Kernel drivers (attach / cast / mask / output-alloc are handled here, */
58
+ /* so a kernel receives a contig stride-resolved buffer + element count) */
59
+ /* -------------------------------------------------------------------- */
60
+
61
+ VALUE rb_ca_call_monop (VALUE self, ca_monop_func_t func[]);
62
+ VALUE rb_ca_call_monop_bang (VALUE self, ca_monop_func_t func[]);
63
+ /* Dtype-changing monop dispatch: out_data_types[in_data_type] gives the output
64
+ data_type for each input data_type (= -1 if not implemented). Used by
65
+ monops with output: { numeric: ..., complex: ... } Hash form (e.g. abs
66
+ cmplx128 -> f64). Allocates output array of out_data_types[in_data_type]. */
67
+ VALUE rb_ca_call_monop_typed (VALUE self, ca_monop_func_t func[], int8_t out_data_types[]);
68
+ VALUE rb_ca_call_binop (VALUE self, VALUE other, ca_binop_func_t func[]);
69
+ VALUE rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[]);
70
+
71
+ /* Kleene three-valued mask fixup for boolean AND (is_or=0) / OR (is_or=1),
72
+ applied by the generated `&`/`|` wrappers after rb_ca_call_binop. No-op
73
+ unless the output is boolean with a mask. */
74
+ VALUE ca_kleene_bool_fixup (VALUE vout, VALUE vself, VALUE vother, int is_or);
75
+
76
+ /* Triop driver: applies a 3-input / 1-output kernel. Operand 1 = self,
77
+ operands 2/3 are passed in. Common data_type promotion via
78
+ rb_ca_cast_self_or_other applied pairwise. Scalar / array
79
+ combinations (= 2^3 = 8 cases) are handled uniformly via
80
+ ca_set_iterator(3, ...) which collapses scalar operands to stride 0. */
81
+ VALUE rb_ca_call_triop (VALUE self, VALUE other2, VALUE other3,
82
+ ca_triop_func_t func[]);
83
+ VALUE rb_ca_call_triop_bang (VALUE self, VALUE other2, VALUE other3,
84
+ ca_triop_func_t func[]);
85
+ VALUE rb_ca_call_moncmp (VALUE self, ca_moncmp_func_t func[]);
86
+ VALUE rb_ca_call_bincmp (VALUE self, VALUE other, ca_bincmp_func_t func[], double tol);
87
+ void ca_monop_not_implement(ca_size_t n, boolean8_t *m,
88
+ char *ptr1, ca_size_t i1,
89
+ char *ptr2, ca_size_t i2) __attribute__((noreturn));
90
+ void ca_binop_not_implement(ca_size_t n, boolean8_t *m,
91
+ char *ptr1, ca_size_t i1,
92
+ char *ptr2, ca_size_t i2,
93
+ char *ptr3, ca_size_t i3) __attribute__((noreturn));
94
+ void ca_triop_not_implement(ca_size_t n, boolean8_t *m,
95
+ char *ptr1, ca_size_t i1,
96
+ char *ptr2, ca_size_t i2,
97
+ char *ptr3, ca_size_t i3,
98
+ char *ptr4, ca_size_t i4) __attribute__((noreturn));
99
+ void ca_moncmp_not_implement(ca_size_t n, boolean8_t *m,
100
+ char *ptr1, ca_size_t i1,
101
+ boolean8_t *ptr2, ca_size_t i2) __attribute__((noreturn));
102
+ void ca_bincmp_not_implement(ca_size_t n, boolean8_t *m,
103
+ char *ptr1, ca_size_t b1, ca_size_t i1,
104
+ char *ptr2, ca_size_t b2, ca_size_t i2,
105
+ char *ptr3, ca_size_t b3, ca_size_t i3,
106
+ double tol) __attribute__((noreturn));
107
+ VALUE ca_math_call (VALUE mod, VALUE arg, ID id);
108
+
109
+ /* -------------------------------------------------------------------- */
110
+ /* Per-data_type kernel dispatch tables + op_id enums + lookup APIs */
111
+ /* (must come after the func typedefs above — the tables are typed */
112
+ /* with them). */
113
+ /* -------------------------------------------------------------------- */
114
+
115
+ #include "ca_monop_dispatch.h"
116
+ #include "ca_binop_dispatch.h"
117
+ #include "ca_bincmp_dispatch.h"
118
+ #include "ca_moncmp_dispatch.h"
119
+
120
+ #endif /* CARRAY_MATH_KERNEL_H */
@@ -1,10 +1,10 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- carray/mathfunc/carray_mathfunc.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
3
+ CAMath module functions whose semantics are not a 1-arg/1-arg
4
+ numeric kernel (= multi-input / multi-output cartesian conversions,
5
+ hand-written lgamma). Single-arg numeric ops (deg_360 / rad_pi /
6
+ atan2 / hypot / expm1 / etc.) live in ext/mkkernel.rb and are
7
+ registered via Init_carray_kernels.
8
8
 
9
9
  ---------------------------------------------------------------------------- */
10
10
 
@@ -18,166 +18,6 @@
18
18
 
19
19
  /* ----------------------------------------------------------------------- */
20
20
 
21
- static void
22
- mathfunc_deg_360 (void *p0, void *p1)
23
- {
24
- double a = *(double*) p1;
25
- double fa = a / 360.0;
26
- if ( a >= 0 ) {
27
- *(double*) p0 = (fa - floor(fa)) * 360.0;
28
- }
29
- else {
30
- *(double*) p0 = (fa - ceil(fa) + 1) * 360.0;
31
- }
32
- }
33
-
34
- static VALUE
35
- rb_ca_deg_360 (VALUE self)
36
- {
37
- return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_360, self);
38
- }
39
-
40
- static VALUE
41
- rb_ca_deg_360_bang (VALUE self)
42
- {
43
- volatile VALUE out;
44
- out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_360, self);
45
- rb_funcall(self, rb_intern("[]="), 1, out);
46
- return self;
47
- }
48
-
49
- static VALUE
50
- rb_num_deg_360 (VALUE self)
51
- {
52
- double v0, v1 = NUM2DBL(self);
53
- mathfunc_deg_360(&v0, &v1);
54
- return rb_float_new(v0);
55
- }
56
-
57
- /* ----------------------------------------------------------------------- */
58
-
59
- static void
60
- mathfunc_deg_180 (void *p0, void *p1)
61
- {
62
- double a = *(double*) p1, b;
63
- double fa = (a+180.0) / 360.0;
64
- if ( a >= 0 ) {
65
- b = (fa - floor(fa)) * 360.0 - 180;
66
- }
67
- else {
68
- b = (fa - ceil(fa)) * 360.0 - 180;
69
- }
70
- if ( b <= -180 ) {
71
- b += 360.0;
72
- }
73
- *(double*) p0 = b;
74
- }
75
-
76
- static VALUE
77
- rb_ca_deg_180 (VALUE self)
78
- {
79
- return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_180, self);
80
- }
81
-
82
- static VALUE
83
- rb_ca_deg_180_bang (VALUE self)
84
- {
85
- volatile VALUE out;
86
- out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_180, self);
87
- rb_funcall(self, rb_intern("[]="), 1, out);
88
- return self;
89
- }
90
-
91
- static VALUE
92
- rb_num_deg_180 (VALUE self)
93
- {
94
- double v0, v1 = NUM2DBL(self);
95
- mathfunc_deg_180(&v0, &v1);
96
- return rb_float_new(v0);
97
- }
98
-
99
- /* ----------------------------------------------------------------------- */
100
-
101
- static void
102
- mathfunc_rad_2pi (void *p0, void *p1)
103
- {
104
- double a = *(double*) p1;
105
- double fa = a / (2*M_PI);
106
- if ( a >= 0 ) {
107
- *(double*) p0 = (fa - floor(fa)) * 2*M_PI;
108
- }
109
- else {
110
- *(double*) p0 = (fa - ceil(fa) + 1) * 2*M_PI;
111
- }
112
- }
113
-
114
- static VALUE
115
- rb_ca_rad_2pi (VALUE self)
116
- {
117
- return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_2pi, self);
118
- }
119
-
120
- static VALUE
121
- rb_ca_rad_2pi_bang (VALUE self)
122
- {
123
- volatile VALUE out;
124
- out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_2pi, self);
125
- rb_funcall(self, rb_intern("[]="), 1, out);
126
- return self;
127
- }
128
-
129
- static VALUE
130
- rb_num_rad_2pi (VALUE self)
131
- {
132
- double v0, v1 = NUM2DBL(self);
133
- mathfunc_rad_2pi(&v0, &v1);
134
- return rb_float_new(v0);
135
- }
136
-
137
- /* ----------------------------------------------------------------------- */
138
-
139
- static void
140
- mathfunc_rad_pi (void *p0, void *p1)
141
- {
142
- double a = *(double*) p1, b;
143
- double fa = (a+M_PI) / (2*M_PI);
144
- if ( a >= 0 ) {
145
- b = (fa - floor(fa)) * 2*M_PI - M_PI;
146
- }
147
- else {
148
- b = (fa - ceil(fa)) * 2*M_PI - M_PI;
149
- }
150
- if ( b <= -M_PI ) {
151
- b += 2*M_PI;
152
- }
153
- *(double*) p0 = b;
154
- }
155
-
156
- static VALUE
157
- rb_ca_rad_pi (VALUE self)
158
- {
159
- return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_pi, self);
160
- }
161
-
162
- static VALUE
163
- rb_ca_rad_pi_bang (VALUE self)
164
- {
165
- volatile VALUE out;
166
- out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_pi, self);
167
- rb_funcall(self, rb_intern("[]="), 1, out);
168
- return self;
169
- }
170
-
171
- static VALUE
172
- rb_num_rad_pi (VALUE self)
173
- {
174
- double v0, v1 = NUM2DBL(self);
175
- mathfunc_rad_pi(&v0, &v1);
176
- return rb_float_new(v0);
177
- }
178
-
179
- /* ----------------------------------------------------------------------- */
180
-
181
21
  static void
182
22
  mathfunc_sph_to_xyz (void *p0, void *p1, void *p2, void *p3, void *p4, void *p5)
183
23
  {
@@ -219,43 +59,9 @@ rb_camath_xyz_to_sph (VALUE mod, VALUE rx1, VALUE rx2, VALUE rx3)
219
59
 
220
60
  /* ----------------------------------------------------------------------- */
221
61
 
222
- static void
223
- mathfunc_atan2 (void *p0, void *p1, void *p2)
224
- {
225
- #ifdef HAVE_ATAN2
226
- *(double*)p0 = atan2(*(double*)p1, *(double*)p2);
227
- #else
228
- rb_raise(rb_eRuntimeError, "atan2 is not defined");
229
- #endif
230
- }
231
-
232
- static VALUE
233
- rb_camath_atan2 (VALUE mod, VALUE rx1, VALUE rx2)
234
- {
235
- return ca_call_cfunc_1_2(CA_DOUBLE, CA_DOUBLE, CA_DOUBLE,
236
- mathfunc_atan2, rx1, rx2);
237
- }
238
-
239
- /* ----------------------------------------------------------------------- */
240
-
241
- static void
242
- mathfunc_hypot (void *p0, void *p1, void *p2)
243
- {
244
- #ifdef HAVE_HYPOT
245
- *(double *)p0 = hypot(*(double*)p1, *(double*)p2);
246
- #else
247
- rb_raise(rb_eRuntimeError, "hypot is not defined");
248
- #endif
249
- }
250
-
251
- static VALUE
252
- rb_camath_hypot (VALUE mod, VALUE rx1, VALUE rx2)
253
- {
254
- return ca_call_cfunc_1_2(CA_DOUBLE, CA_DOUBLE, CA_DOUBLE,
255
- mathfunc_hypot, rx1, rx2);
256
- }
257
-
258
- /* ----------------------------------------------------------------------- */
62
+ /* [MOVED] atan2 / hypot / expm1 -> ext/mkkernel.rb (binop / monfunc
63
+ tables); their CAMath wrappers live in lib/carray/math.rb. lgamma
64
+ stays hand-written here because no mkkernel slot exists for it. */
259
65
 
260
66
  static void
261
67
  mathfunc_lgamma (void *p0, void *p1)
@@ -273,47 +79,10 @@ rb_camath_lgamma (VALUE mod, VALUE rx1)
273
79
  return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_lgamma, rx1);
274
80
  }
275
81
 
276
- /* ----------------------------------------------------------------------- */
277
-
278
- static void
279
- mathfunc_expm1 (void *p0, void *p1)
280
- {
281
- #ifdef HAVE_EXP1M
282
- *(double *)p0 = expm1(*(double*)p1);
283
- #else
284
- rb_raise(rb_eRuntimeError, "expm1 is not defined ");
285
- #endif
286
- }
287
-
288
- static VALUE
289
- rb_camath_expm1 (VALUE mod, VALUE rx1)
290
- {
291
- return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_expm1, rx1);
292
- }
293
-
294
82
  void
295
- Init_carray_mathfunc ()
83
+ Init_carray_mathfunc (void)
296
84
  {
297
- rb_define_method(rb_cCArray, "deg_360", rb_ca_deg_360, 0);
298
- rb_define_method(rb_cCArray, "deg_360!", rb_ca_deg_360_bang, 0);
299
- rb_define_method(rb_cCArray, "deg_180", rb_ca_deg_180, 0);
300
- rb_define_method(rb_cCArray, "deg_180!", rb_ca_deg_180_bang, 0);
301
- rb_define_method(rb_cCArray, "rad_2pi", rb_ca_rad_2pi, 0);
302
- rb_define_method(rb_cCArray, "rad_2pi!", rb_ca_rad_2pi_bang, 0);
303
- rb_define_method(rb_cCArray, "rad_pi", rb_ca_rad_pi, 0);
304
- rb_define_method(rb_cCArray, "rad_pi!", rb_ca_rad_pi_bang, 0);
305
-
306
85
  rb_define_module_function(rb_mCAMath, "spherical_to_xyz", rb_camath_sph_to_xyz, 3);
307
86
  rb_define_module_function(rb_mCAMath, "xyz_to_spherical", rb_camath_xyz_to_sph, 3);
308
-
309
- rb_define_module_function(rb_mCAMath, "atan2", rb_camath_atan2, 2);
310
- rb_define_module_function(rb_mCAMath, "hypot", rb_camath_hypot, 2);
311
-
312
- rb_define_module_function(rb_mCAMath, "lgamma", rb_camath_lgamma, 1);
313
- rb_define_module_function(rb_mCAMath, "expm1", rb_camath_expm1, 1);
314
-
315
- rb_define_method(rb_cNumeric, "deg_360", rb_num_deg_360, 0);
316
- rb_define_method(rb_cNumeric, "deg_180", rb_num_deg_180, 0);
317
- rb_define_method(rb_cNumeric, "rad_2pi", rb_num_rad_2pi, 0);
318
- rb_define_method(rb_cNumeric, "rad_pi", rb_num_rad_pi, 0);
87
+ rb_define_module_function(rb_mCAMath, "lgamma", rb_camath_lgamma, 1);
319
88
  }