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,312 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ CArray#count dispatcher (= value-comparison family entry point).
4
+ Hand-routed because the dispatch decision depends on (self.data_type,
5
+ v's runtime class), which the per-dtype mkkernel kernels can't see;
6
+ the actual counting is delegated to the kernel-iterator helpers
7
+ listed below.
8
+
9
+ Future count_axis / count_where extensions belong here.
10
+
11
+ ---------------------------------------------------------------------------- */
12
+
13
+ #include "ruby.h"
14
+ #include "carray.h"
15
+ #include "ca_obj_face.h"
16
+ #include <math.h>
17
+ #include <float.h>
18
+ #include <stdarg.h>
19
+
20
+ /* Forwardees from carray_kernels.c (mkkernel-generated). rb_ca_count
21
+ below picks one based on (self.data_type, v). */
22
+ VALUE rb_ca_count_equal_ki (int argc, VALUE *argv, VALUE self);
23
+ VALUE rb_ca_count_true_ki (int argc, VALUE *argv, VALUE self);
24
+ VALUE rb_ca_count_false_ki (int argc, VALUE *argv, VALUE self);
25
+
26
+ /* Forwardees from carray_mask.c. Public linkage for cross-TU dispatch:
27
+ count(UNDEF) is mask-state vocabulary, not value vocabulary, so it
28
+ routes through the mask-family entry; count with no value argument is
29
+ present-cell cardinality, which routes through count_not_masked. */
30
+ VALUE rb_ca_count_masked (int argc, VALUE *argv, VALUE self);
31
+ VALUE rb_ca_count_not_masked (int argc, VALUE *argv, VALUE self);
32
+
33
+ /* CArray#count(v, axis: nil, min_count: K, fill_value: x) -- count
34
+ cells of self that equal v, with mask-aware reduction along axis.
35
+
36
+ Dispatch:
37
+ - no argument -> count_not_masked (present-cell count)
38
+ - v == UNDEF -> count_masked (mask-state count)
39
+ - v is a CArray -> broadcast: count each v[k] and stack
40
+ (rejected for boolean self; see below)
41
+ - self is boolean, v scalar -> v must be true/false literal
42
+ - self is numeric, v scalar -> count_equal_ki (numeric equality)
43
+
44
+ FIXLEN and OBJECT data_types raise CArray::DataTypeError (the
45
+ kernel-iterator helpers do not implement them). Extend
46
+ count_equal_ki if demand returns. */
47
+
48
+ static VALUE
49
+ rb_ca_count (int argc, VALUE *argv, VALUE self)
50
+ {
51
+ CArray *src;
52
+ GetCArray(self, src);
53
+
54
+ /* count (no value argument) == count_not_masked: present-cell
55
+ cardinality ("how many are there"), the arity-0 rung of the dispatch
56
+ ladder. kwargs reach a -1 C method as a trailing options hash, so a
57
+ bare `count(axis: k)` arrives as argc==1 with argv[0] a Hash; discount
58
+ that trailing hash (same convention as the CArray-broadcast branch
59
+ below) before deciding there is no positional value. argv is forwarded
60
+ verbatim so the axis: kwarg passes through. */
61
+ {
62
+ int has_opts = ( argc >= 1 &&
63
+ rb_obj_is_kind_of(argv[argc - 1], rb_cHash) );
64
+ if ( argc - (has_opts ? 1 : 0) < 1 ) {
65
+ return rb_ca_count_not_masked(argc, argv, self);
66
+ }
67
+ }
68
+
69
+ volatile VALUE rval = argv[0];
70
+
71
+ /* count(UNDEF) == count_masked: UNDEF is mask-state vocabulary, not a
72
+ value to compare against. Forward, dropping the UNDEF from argv. */
73
+ if ( rval == CA_UNDEF ) {
74
+ return rb_ca_count_masked(argc - 1, argv + 1, self);
75
+ }
76
+
77
+ /* Face gate, mirroring the search / linear family (ext/carray_order.c):
78
+ descend an ORDERABLE Face to its storage so the equality runs on the
79
+ numeric storage, and let the reference reconcile the query into its own
80
+ space -- a COMPARABLE Face compares directly (strip a Face query, take a
81
+ plain one as-is), a unit-bearing one calls its own to_comparable for any
82
+ query type (Face CArray, Element, Time, DateTime). A Face that counts
83
+ by other means never arrives here: CACategorical / CAConstString define
84
+ their own #count in Ruby. Placed after the mask-state branches above,
85
+ which read the mask the Face already shares with its storage, and before
86
+ the broadcast branch, so a reconciled query array recurses as storage. */
87
+ if ( ca_is_face(src) ) {
88
+ volatile VALUE self_ref = self;
89
+ int query_was_scalar = ! rb_obj_is_carray(rval);
90
+ if ( ! ca_test_flag(src, CA_FLAG_FACE_ORDERABLE_STORAGE) ) {
91
+ rb_raise(rb_eArgError,
92
+ "count(v): Face-typed input (%s) is not orderable by storage; "
93
+ "use ca.parent to count the raw storage",
94
+ rb_obj_classname(self));
95
+ }
96
+ if ( ca_test_flag(src, CA_FLAG_FACE_COMPARABLE_STORAGE) ) {
97
+ if ( ! query_was_scalar ) {
98
+ CArray *cv;
99
+ GetCArray(rval, cv);
100
+ if ( ca_is_face(cv) ) {
101
+ rval = rb_ca_strip_face_value(rval);
102
+ }
103
+ }
104
+ }
105
+ else if ( rb_respond_to(self_ref, rb_intern("to_comparable")) ) {
106
+ rval = rb_ca_strip_face_value(rb_funcall(self_ref,
107
+ rb_intern("to_comparable"),
108
+ 1, rval));
109
+ /* to_comparable lifts a scalar query to a length-1 array; unwrap it so a
110
+ scalar query still answers with a count rather than a length-1 array
111
+ from the broadcast branch below. */
112
+ if ( query_was_scalar && rb_obj_is_carray(rval) ) {
113
+ rval = rb_ca_fetch_addr(rval, 0);
114
+ }
115
+ }
116
+ else {
117
+ rb_raise(rb_eArgError,
118
+ "count(v): non-comparable Face (%s) has no to_comparable to "
119
+ "reconcile the query; use ca.parent to count the raw storage",
120
+ rb_obj_classname(self));
121
+ }
122
+ self = rb_ca_strip_face_value(self);
123
+ GetCArray(self, src);
124
+ /* Hand the reconciled query down in argv (count_equal_ki pops argv[0],
125
+ the broadcast branch reads rval). */
126
+ {
127
+ VALUE *nargv = ALLOCA_N(VALUE, argc);
128
+ MEMCPY(nargv, argv, VALUE, argc);
129
+ nargv[0] = rval;
130
+ argv = nargv;
131
+ }
132
+ }
133
+
134
+ /* count(v: CArray) -- broadcast: v.shape is appended to the trailing
135
+ axes of the output (same shape rule as SEARCH_AXIS / LINEAR_INTERP).
136
+ Each v[k] is counted independently and stacked. Boolean self is
137
+ rejected here because the per-scalar dispatch below requires v to
138
+ be a true/false literal, which an array cannot guarantee per-cell.
139
+ Implementation iterates v in flat order and recursively calls
140
+ self.count(vk, *axes, **opts) for each v[k]. */
141
+ if ( rb_obj_is_kind_of(rval, rb_cCArray) ) {
142
+ if ( src->data_type == CA_BOOLEAN ) {
143
+ rb_raise(rb_eTypeError,
144
+ "count(v: CArray) on boolean array: not supported "
145
+ "(use scalar true/false; broadcast is numeric-only)");
146
+ }
147
+
148
+ CArray *cv;
149
+ GetCArray(rval, cv);
150
+
151
+ /* Pop trailing options hash (min_count / fill_value) before axes
152
+ parsing so parse_reduce_axes only sees Integer axes. The opts
153
+ are forwarded verbatim via inner_argv to the recursive count(). */
154
+ int inner_argc = argc - 1;
155
+ VALUE *inner_axes = argv + 1;
156
+ volatile VALUE opt_hash = Qnil;
157
+ if ( inner_argc > 0 && rb_obj_is_kind_of(inner_axes[inner_argc - 1],
158
+ rb_cHash) ) {
159
+ opt_hash = inner_axes[inner_argc - 1];
160
+ inner_argc--;
161
+ }
162
+
163
+ /* axis comes via kwarg (axis:) in opt_hash, not positional;
164
+ extract before computing slab_axes. */
165
+ int8_t slab_axes[CA_RANK_MAX];
166
+ int8_t naxes;
167
+ VALUE axis_val = Qnil;
168
+ if ( ! NIL_P(opt_hash) ) {
169
+ axis_val = rb_hash_lookup2(opt_hash, ID2SYM(rb_intern("axis")), Qnil);
170
+ }
171
+ naxes = rb_ca_parse_reduce_axes_kw(axis_val, src, slab_axes);
172
+ (void) inner_axes; /* axes no longer parsed from inner_axes */
173
+ int out_ndim;
174
+ ca_size_t out_dim[CA_RANK_MAX];
175
+ ca_size_t base_elements = 1;
176
+ {
177
+ /* base_reduced: self.shape minus slab_axes */
178
+ int8_t is_slab[CA_RANK_MAX] = {0};
179
+ for (int k = 0; k < naxes; k++) is_slab[slab_axes[k]] = 1;
180
+ out_ndim = 0;
181
+ for (int k = 0; k < src->ndim; k++) {
182
+ if ( ! is_slab[k] ) {
183
+ out_dim[out_ndim++] = src->dim[k];
184
+ base_elements *= src->dim[k];
185
+ }
186
+ }
187
+ /* Full reduction (naxes == ndim): base_elements = 1, no base axes. */
188
+ /* Append v.shape. */
189
+ for (int k = 0; k < cv->ndim; k++) {
190
+ out_dim[out_ndim++] = cv->dim[k];
191
+ }
192
+ }
193
+
194
+ /* Allocate output i64 CArray. */
195
+ VALUE vout = rb_funcall(rb_cCArray, rb_intern("new"), 2,
196
+ INT2NUM(CA_INT64),
197
+ rb_ary_new4(out_ndim,
198
+ ({ VALUE *tmp = ALLOCA_N(VALUE, out_ndim);
199
+ for (int k = 0; k < out_ndim; k++)
200
+ tmp[k] = SIZE2NUM(out_dim[k]);
201
+ tmp; })));
202
+ CArray *cout;
203
+ GetCArray(vout, cout);
204
+
205
+ /* Iterate v in flat order, call self.count(vk, *axes, **opts)
206
+ recursively, place result at output[..., k]. */
207
+ ca_attach(cv);
208
+ int64_t *out_ptr = (int64_t *) cout->ptr;
209
+ boolean8_t *out_mask = NULL;
210
+ ca_size_t v_elements = cv->elements;
211
+ /* inner_argv layout: [vk_scalar, axis..., axis..., [opt_hash]]
212
+ inner_call_argc = 1 (vk) + inner_argc (axes) + (opt_hash ? 1 : 0). */
213
+ int inner_call_argc = 1 + inner_argc + (NIL_P(opt_hash) ? 0 : 1);
214
+ VALUE inner_argv[CA_RANK_MAX + 2];
215
+ for (int j = 0; j < inner_argc; j++) inner_argv[1 + j] = inner_axes[j];
216
+ if ( ! NIL_P(opt_hash) ) inner_argv[1 + inner_argc] = opt_hash;
217
+
218
+ for (ca_size_t k = 0; k < v_elements; k++) {
219
+ /* Extract vk as a scalar VALUE via flat addr. rb_ca_fetch_addr
220
+ takes a ca_size_t addr (not a Ruby VALUE). */
221
+ VALUE vk = rb_ca_fetch_addr(rval, k);
222
+ inner_argv[0] = vk;
223
+ VALUE sub = rb_ca_count(inner_call_argc, inner_argv, self);
224
+
225
+ /* Place sub into output[..., k] slot.
226
+ Output stride for v-axis = 1, base stride = v_elements. */
227
+ if ( sub == CA_UNDEF ) {
228
+ if ( ! out_mask ) {
229
+ ca_create_mask(cout);
230
+ out_mask = (boolean8_t *) cout->mask->ptr;
231
+ }
232
+ for (ca_size_t i = 0; i < base_elements; i++) {
233
+ out_ptr[i * v_elements + k] = 0;
234
+ out_mask[i * v_elements + k] = 1;
235
+ }
236
+ } else if ( rb_obj_is_kind_of(sub, rb_cInteger) ) {
237
+ /* Full reduction: sub is a single integer. */
238
+ out_ptr[k] = NUM2LL(sub);
239
+ } else if ( rb_obj_is_kind_of(sub, rb_cCArray) ) {
240
+ CArray *csub;
241
+ GetCArray(sub, csub);
242
+ ca_attach(csub);
243
+ int64_t *sub_ptr = (int64_t *) csub->ptr;
244
+ boolean8_t *sub_mask = (csub->mask) ? (boolean8_t *) csub->mask->ptr : NULL;
245
+ for (ca_size_t i = 0; i < base_elements; i++) {
246
+ out_ptr[i * v_elements + k] = sub_ptr[i];
247
+ if ( sub_mask && sub_mask[i] ) {
248
+ if ( ! out_mask ) {
249
+ ca_create_mask(cout);
250
+ out_mask = (boolean8_t *) cout->mask->ptr;
251
+ }
252
+ out_mask[i * v_elements + k] = 1;
253
+ }
254
+ }
255
+ ca_detach(csub);
256
+ } else {
257
+ ca_detach(cv);
258
+ rb_raise(rb_eRuntimeError,
259
+ "count(v: CArray): unexpected sub-result type");
260
+ }
261
+ }
262
+ ca_detach(cv);
263
+ return vout;
264
+ }
265
+
266
+ /* Scalar v: strict (self.data_type, v) validation, then forward. */
267
+ if ( src->data_type == CA_BOOLEAN ) {
268
+ if ( rval == Qtrue ) {
269
+ return rb_ca_count_true_ki(argc - 1, argv + 1, self);
270
+ } else if ( rval == Qfalse ) {
271
+ return rb_ca_count_false_ki(argc - 1, argv + 1, self);
272
+ } else if ( FIXNUM_P(rval) ) {
273
+ /* Boolean stores 0/1; accept the integer literals 1 (= true) and
274
+ 0 (= false) as the query, matching boolean-as-0/1-numeric. Any
275
+ other integer is outside the boolean domain and rejected. (A
276
+ Bignum / Float / other type falls through to the raise below --
277
+ only true / false / 1 / 0 are accepted.) */
278
+ long iv = FIX2LONG(rval);
279
+ if ( iv == 1 ) {
280
+ return rb_ca_count_true_ki(argc - 1, argv + 1, self);
281
+ } else if ( iv == 0 ) {
282
+ return rb_ca_count_false_ki(argc - 1, argv + 1, self);
283
+ }
284
+ rb_raise(rb_eTypeError,
285
+ "count(v) on boolean array: v must be true / false / 1 / 0, got %ld",
286
+ iv);
287
+ } else {
288
+ rb_raise(rb_eTypeError,
289
+ "count(v) on boolean array: v must be true / false / 1 / 0, got %s",
290
+ rb_obj_classname(rval));
291
+ }
292
+ } else {
293
+ if ( rval == Qtrue || rval == Qfalse ) {
294
+ rb_raise(rb_eTypeError,
295
+ "count(v) on numeric array: v must be numeric, got %s",
296
+ rb_obj_classname(rval));
297
+ }
298
+ /* Pass full argv; count_equal_ki pops argv[0] as value_arg. */
299
+ return rb_ca_count_equal_ki(argc, argv, self);
300
+ }
301
+ }
302
+
303
+ void
304
+ Init_carray_count (void)
305
+ {
306
+ /* CArray#count is the sole value-comparison entry. Replaces the
307
+ pre-3.0 count_equal / count_equiv / count_close / count_true /
308
+ count_false (no aliases retained; see NEWS for migration). */
309
+ rb_define_method(rb_cCArray, "count", rb_ca_count, -1);
310
+ }
311
+
312
+
@@ -1,3 +1,28 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ Per-data_type Ruby class shells: registers `CArray::Boolean`,
4
+ `CArray::Int8`, ..., `CArray::Object`, `CArray::Fixlen` (= the
5
+ 15 type-tag classes) and exposes `ca_data_type_class` which maps
6
+ a data_type id back to its class.
7
+
8
+ The classes themselves are bare shells at the C level (no methods
9
+ defined here). Three companion files complete the surface:
10
+
11
+ lib/carray/construct.rb reopens each typed class to
12
+ add the `TypeSymbol` / `DataType` constants and extends them
13
+ with `DataTypeNewConstructor` (`.new(*shape)`,
14
+ `.from_memory_view`, `.wrap_memory_view`).
15
+ lib/carray/data_type_extension.rb fills in the
16
+ `DataTypeExtension` module with Numo-style constructor
17
+ methods (`.zeros`, `.full`, `.ones`, `.linspace`, ...)
18
+ that get attached onto every typed class.
19
+ ext/carray_cast.c defines the paired
20
+ polymorphic cast functions (`CA_INT8(data)`,
21
+ `CA_FLOAT64(data)`, ..., `CA_OBJECT(data)`,
22
+ `CA_FIXLEN(...)`) as global functions.
23
+
24
+ ---------------------------------------------------------------------------- */
25
+
1
26
  #include "carray.h"
2
27
 
3
28
  VALUE rb_cCArrayBoolean;
@@ -11,40 +36,41 @@ VALUE rb_cCArrayInt32;
11
36
  VALUE rb_cCArrayInt64;
12
37
  VALUE rb_cCArrayFloat32;
13
38
  VALUE rb_cCArrayFloat64;
14
- VALUE rb_cCArrayFloat128;
15
39
  VALUE rb_cCArrayCmplx64;
16
40
  VALUE rb_cCArrayCmplx128;
17
- VALUE rb_cCArrayCmplx256;
18
41
  VALUE rb_cCArrayObject;
19
42
  VALUE rb_cCArrayFixlen;
20
43
 
44
+ /* Returns the type class for a given data_type id. CA_FIXLEN is
45
+ * intentionally omitted because Fixlen requires a `bytes:` parameter
46
+ * and cannot be identified by data_type alone.
47
+ *
48
+ * Called from rb_ca_s_body macro (ca_obj_array.c), which dispatches
49
+ * `CArray.<type>()` no-arg calls to the corresponding type class. */
21
50
  VALUE
22
51
  ca_data_type_class (int8_t data_type)
23
52
  {
24
53
  switch ( data_type ) {
25
- case CA_BOOLEAN: return rb_cCArrayBoolean; break;
26
- case CA_INT8: return rb_cCArrayInt8; break;
27
- case CA_UINT8: return rb_cCArrayUInt8; break;
28
- case CA_INT16: return rb_cCArrayInt16; break;
29
- case CA_UINT16: return rb_cCArrayUInt16; break;
30
- case CA_INT32: return rb_cCArrayInt32; break;
31
- case CA_UINT32: return rb_cCArrayUInt32; break;
32
- case CA_INT64: return rb_cCArrayInt64; break;
33
- case CA_UINT64: return rb_cCArrayUInt64; break;
54
+ case CA_BOOLEAN: return rb_cCArrayBoolean; break;
55
+ case CA_INT8: return rb_cCArrayInt8; break;
56
+ case CA_UINT8: return rb_cCArrayUInt8; break;
57
+ case CA_INT16: return rb_cCArrayInt16; break;
58
+ case CA_UINT16: return rb_cCArrayUInt16; break;
59
+ case CA_INT32: return rb_cCArrayInt32; break;
60
+ case CA_UINT32: return rb_cCArrayUInt32; break;
61
+ case CA_INT64: return rb_cCArrayInt64; break;
62
+ case CA_UINT64: return rb_cCArrayUInt64; break;
34
63
  case CA_FLOAT32: return rb_cCArrayFloat32; break;
35
64
  case CA_FLOAT64: return rb_cCArrayFloat64; break;
36
- case CA_FLOAT128: return rb_cCArrayFloat128; break;
37
65
  case CA_CMPLX64: return rb_cCArrayCmplx64; break;
38
- case CA_CMPLX128: return rb_cCArrayCmplx128; break;
39
- case CA_CMPLX256: return rb_cCArrayCmplx256; break;
40
- case CA_OBJECT: return rb_cCArrayObject; break;
66
+ case CA_CMPLX128: return rb_cCArrayCmplx128; break;
67
+ case CA_OBJECT: return rb_cCArrayObject; break;
41
68
  default: rb_raise(rb_eRuntimeError, "invalid data type");
42
69
  }
43
-
44
70
  }
45
71
 
46
72
  void
47
- Init_carray_data_type ()
73
+ Init_carray_data_type (void)
48
74
  {
49
75
  rb_cCArrayBoolean = rb_define_class_under(rb_cCArray, "Boolean", rb_cObject);
50
76
  rb_cCArrayUInt8 = rb_define_class_under(rb_cCArray, "UInt8", rb_cObject);
@@ -57,10 +83,8 @@ Init_carray_data_type ()
57
83
  rb_cCArrayInt64 = rb_define_class_under(rb_cCArray, "Int64", rb_cObject);
58
84
  rb_cCArrayFloat32 = rb_define_class_under(rb_cCArray, "Float32", rb_cObject);
59
85
  rb_cCArrayFloat64 = rb_define_class_under(rb_cCArray, "Float64", rb_cObject);
60
- rb_cCArrayFloat128 = rb_define_class_under(rb_cCArray, "Float128", rb_cObject);
61
86
  rb_cCArrayCmplx64 = rb_define_class_under(rb_cCArray, "Cmplx64", rb_cObject);
62
87
  rb_cCArrayCmplx128 = rb_define_class_under(rb_cCArray, "Cmplx128", rb_cObject);
63
- rb_cCArrayCmplx256 = rb_define_class_under(rb_cCArray, "Cmplx256", rb_cObject);
64
88
  rb_cCArrayObject = rb_define_class_under(rb_cCArray, "Object", rb_cObject);
65
89
  rb_cCArrayFixlen = rb_define_class_under(rb_cCArray, "Fixlen", rb_cObject);
66
90
  }