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
@@ -1,367 +1,76 @@
1
1
  # ----------------------------------------------------------------------------
2
2
  #
3
- # carray/iterator.rb
3
+ # CAIterator -- the form-only base of the iterator family. It carries no
4
+ # engine: each family member (CASlabIterator / CAWindowIterator /
5
+ # CABlockIterator / CACategoricalIterator / CAGroupIterator) implements its own
6
+ # fast engine. The base declares two things: the shared form accessors over
7
+ # the @ndim / @shape ivars, and the common reduction surface every member must
8
+ # implement (surface uniformity is the value: "this is an iterator, so it must
9
+ # answer these").
4
10
  #
5
- # This file is part of Ruby/CArray extension library.
11
+ # `shape` is canonical; `dim` is a legacy alias. A member exposes what it
12
+ # actually holds (source / reference / labels) and adds its own methods
13
+ # (min_index / max_index / map / correlate / convolve / sort_addr / ...);
14
+ # those are NOT part of the common contract because some members legitimately
15
+ # omit them (a window has no map, a group has no within-piece min_index).
6
16
  #
7
- # Copyright (C) 2005-2025 Hiroki Motoyoshi
17
+ # The 2.0 generic dispatch (calculate / filter / evaluate over a
18
+ # kernel_at_addr slot) was retired in 3.0.
8
19
  #
9
20
  # ----------------------------------------------------------------------------
10
21
 
11
22
  class CAIterator
12
23
 
13
- include Enumerable
14
-
15
- def self.define_evaluate_method (name)
16
- define_method(name) { |*args|
17
- self.evaluate(name, *args)
18
- }
19
- end
20
-
24
+ # No `include Enumerable`: the family surface is fully explicit per iterator,
25
+ # so Enumerable's reduction-like names (to_a / min / sum / count / ...) do not
26
+ # leak in and silently fold the pieces. A method outside the contract below
27
+ # that a member does not define is a clean NoMethodError, not a wrong answer.
28
+
29
+ attr_reader :ndim, :shape
30
+ alias dim shape
31
+
32
+ # The required reduction surface, modelled on the two reference members
33
+ # CASlabIterator and CACategoricalIterator (the surface they both provide).
34
+ # Declared abstract so a later member
35
+ # (window / block / group) that leaves one unimplemented fails loudly here
36
+ # rather than reading as "no such method" -- that gap is the member's to close.
37
+ # A member that genuinely cannot provide one overrides it to raise with its
38
+ # own reason.
21
39
  [
22
- :axes!,
23
- :normalize!,
24
- :random!,
25
- :reverse!,
26
- :roll!,
27
- :scale!,
28
- :seq!,
29
- :shift!,
30
- :shuffle!,
31
- :sort!,
32
- :span!,
33
- :transpose!,
40
+ :sum, :accumulate, :prod, :mean, :min, :max, # tier 1
41
+ :variance, :stddev, :all, :any,
42
+ :variancep, :stddevp, :minmax, # tier 2
43
+ :min_index, :max_index, :min_addr, :max_addr, # position
44
+ :wsum, :wmean, # weighted
45
+ :median, :percentile, :quantile, # tier 3
46
+ :count, :count_not_masked, :count_masked, :elements, # count family
47
+ :each, :reduce, # generic iterate
34
48
  ].each do |name|
35
- define_evaluate_method(name)
36
- end
37
-
38
- def self.define_filter_method (data_type, name)
39
- define_method(name) { |*args|
40
- _data_type = data_type || self.reference.data_type
41
- self.filter(_data_type, name, *args)
42
- }
43
- end
44
-
45
- [
46
- [:axes ],
47
- [:normalize ],
48
- [:random ],
49
- [:reverse ],
50
- [:roll ],
51
- [:scale ],
52
- [:seq ],
53
- [:shift ],
54
- [:shuffle ],
55
- [:sort ],
56
- [:span ],
57
- [:transpose ],
58
- ].each do |name, data_type|
59
- define_filter_method(data_type, name)
60
- end
61
-
62
- def self.define_calculate_method (data_type, name)
63
- define_method(name) { |*args|
64
- _data_type = data_type || self.reference.data_type
65
- self.calculate(_data_type, name, *args)
66
- }
67
- end
68
-
69
- [
70
- [:count_masked, CA_INT32],
71
- [:count_not_masked, CA_INT32],
72
- [:count_true, CA_INT32],
73
- [:count_false, CA_INT32],
74
- [:size, CA_INT32],
75
- [:min, nil],
76
- [:min_addr, CA_INT32],
77
- [:max, nil],
78
- [:max_addr, CA_INT32],
79
- [:prod, CA_FLOAT64],
80
- [:sum, CA_FLOAT64],
81
- [:wsum, CA_FLOAT64],
82
- [:mean, CA_FLOAT64],
83
- [:wmean, CA_FLOAT64],
84
- [:variancep, CA_FLOAT64],
85
- [:variance, CA_FLOAT64],
86
- [:stddevp, CA_FLOAT64],
87
- [:stddev, CA_FLOAT64],
88
- [:median, CA_FLOAT64],
89
- [:accumulate, nil],
90
- [:cummin, nil],
91
- [:cummax, nil],
92
- [:cumcount, CA_FLOAT64],
93
- [:cumprod, CA_FLOAT64],
94
- [:cumsum, CA_FLOAT64],
95
- [:cumwsum, CA_FLOAT64],
96
- [:count_equal, CA_INT32],
97
- [:count_equiv, CA_INT32],
98
- [:count_close, CA_INT32],
99
- [:all_equal?, CA_BOOLEAN],
100
- [:any_equal?, CA_BOOLEAN],
101
- [:none_equal?, CA_BOOLEAN],
102
- [:all_equiv?, CA_BOOLEAN],
103
- [:any_equiv?, CA_BOOLEAN],
104
- [:none_equiv?, CA_BOOLEAN],
105
- [:all_close?, CA_BOOLEAN],
106
- [:any_close?, CA_BOOLEAN],
107
- [:none_close?, CA_BOOLEAN],
108
- [:nearest_addr, CA_INT32],
109
- [:mul_add, nil],
110
- ].each do |name, data_type|
111
- define_calculate_method(data_type, name)
112
- end
113
-
114
- # -----------------------------------------------------------
115
-
116
- def ca
117
- @iterary ||= CAIteratorArray.new(self)
118
- return @iterary
119
- end
120
-
121
- def to_a
122
- return ca.to_a
123
- end
124
-
125
- def pick (*idx)
126
- out = prepare_output(reference.data_type, :bytes=>reference.bytes)
127
- elements.times do |addr|
128
- blk = kernel_at_addr(addr)
129
- out[addr] = blk[*idx]
130
- end
131
- return out
132
- end
133
-
134
- def asign! (val)
135
- each do |elem|
136
- elem[] = val
137
- end
138
- return self
139
- end
140
-
141
- def [] (*idx)
142
- if idx.any?{|x| x.is_a?(Symbol) }
143
- return ca[*idx]
144
- else
145
- case idx.size
146
- when 0
147
- return clone
148
- when 1
149
- return kernel_at_addr(idx[0])
150
- else
151
- return kernel_at_index(idx)
152
- end
153
- end
154
- end
155
-
156
- def []= (*idx)
157
- val = idx.pop
158
- if idx.any?{|x| x.is_a?(Symbol) }
159
- ca[*idx] = [val]
160
- else
161
- case idx.size
162
- when 0
163
- asign!(val)
164
- when 1
165
- kernel_at_addr(idx[0])[] = val
166
- else
167
- kernel_at_index(idx)[] = val
168
- end
169
- end
170
- end
171
-
172
- def put (*idx)
173
- val = idx.pop
174
- elements.times do |addr|
175
- blk = kernel_at_addr(addr)
176
- blk[*idx] = val
177
- end
178
- return self
179
- end
180
-
181
- def convert (data_type, options={})
182
- out = prepare_output(data_type, options)
183
- out.map_addr!{ |addr|
184
- blk = kernel_at_addr(addr)
185
- yield(blk.clone)
186
- }
187
- return out
188
- end
189
-
190
- def each ()
191
- retval = nil
192
- if self.class::UNIFORM_KERNEL
193
- reference.attach! {
194
- blk = kernel_at_addr(0)
195
- elements.times do |addr|
196
- kernel_move_to_addr(addr, blk)
197
- retval = yield(blk.clone)
198
- end
199
- }
200
- else
201
- elements.times do |addr|
202
- retval = yield(kernel_at_addr(addr).clone)
203
- end
49
+ define_method(name) do |*, **, &_blk|
50
+ raise NotImplementedError, "#{self.class} must implement ##{name}"
204
51
  end
205
- return retval
206
52
  end
207
53
 
208
- def each_with_addr ()
209
- retval = nil
210
- if self.class::UNIFORM_KERNEL
211
- reference.attach! {
212
- elements.times do |addr|
213
- blk = kernel_at_addr(addr)
214
- retval = yield(blk.clone, addr)
215
- end
216
- }
217
- else
218
- elements.times do |addr|
219
- retval = yield(kernel_at_addr(addr).clone, addr)
220
- end
54
+ # Recommended (should) surface -- template methods. These are well-defined
55
+ # for some members and structurally impossible for others, so they are not
56
+ # required: `map` is a per-piece element-wise transform scattered back to the
57
+ # source, `sort_addr` is a per-piece sort returning source flat addresses, and
58
+ # the segment scans (cumsum / cumprod / cummax / cummin / cumcount) write a
59
+ # per-cell running statistic of each piece. A member implements each when it
60
+ # is well-defined and overrides it to raise with a reason when it is not. The
61
+ # scans belong here for the same reason as map: a running per-cell value is
62
+ # single-valued only when each cell belongs to exactly one piece, so the
63
+ # partition members (slab / block / categorical / group) provide them, while
64
+ # CAWindowIterator's overlapping padded windows put a cell in many windows --
65
+ # no single running value -- and it raises, exactly as it does for map /
66
+ # sort_addr. Un-overridden each is simply unavailable, not a contract
67
+ # violation. min_addr / max_addr stay required: a single winner address is
68
+ # well-defined even for an overlapping window.
69
+ [:map, :sort_addr,
70
+ :cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |name|
71
+ define_method(name) do |*, **, &_blk|
72
+ raise NotImplementedError, "#{self.class} does not provide ##{name} (optional)"
221
73
  end
222
- return retval
223
74
  end
224
75
 
225
- def each_with_index ()
226
- retval = nil
227
- if self.class::UNIFORM_KERNEL
228
- reference.attach! {
229
- CArray.each_index(*dim) do |*idx|
230
- blk = kernel_at_index(idx)
231
- retval = yield(blk.clone, idx)
232
- end
233
- }
234
- else
235
- CArray.each_index(*dim) do |*idx|
236
- retval = yield(kernel_at_index(idx).clone, idx)
237
- end
238
- end
239
- return retval
240
- end
241
-
242
- def inject (*argv)
243
- case argv.size
244
- when 0
245
- memo = nil
246
- each_with_addr do |val, addr|
247
- if addr == 0
248
- memo = val
249
- else
250
- memo = yield(memo, val)
251
- end
252
- end
253
- return memo
254
- when 1
255
- memo = argv.first
256
- each do |val|
257
- memo = yield(memo, val)
258
- end
259
- return memo
260
- else
261
- raise "invalid number of arguments (#{argv.size} for 0 or 1)"
262
- end
263
- end
264
-
265
- def sort_by! (&block)
266
- ia = self.ca
267
- ia[] = ia.to_a.sort_by(&block).map{|x| x.to_ca }
268
- return reference
269
- end
270
-
271
- def sort_by (&block)
272
- out = reference.template
273
- idx = ca.convert(:object, &block).sort_addr
274
- ca[idx].each_with_addr do |blk, i|
275
- kernel_at_addr(i, out)[] = blk
276
- end
277
- return out
278
- end
279
-
280
- def sort_with (&block)
281
- warn "CAIterator#sort_with will be obsolete"
282
- out = reference.template
283
- idx = CA.sort_addr(*yield(self))
284
- ca[idx].each_with_addr do |blk, i|
285
- kernel_at_addr(i, out)[] = blk
286
- end
287
- return out
288
- end
289
-
290
- end
291
-
292
-
293
- # -----------------------------------------------------------------
294
-
295
- class CArray
296
- def windows (*args, &block)
297
- return CAWindowIterator.new(self.window(*args, &block))
298
- end
299
76
  end
300
-
301
- # -----------------------------------------------------------------
302
-
303
- class CArray
304
-
305
- def classes (classifier=nil, &block)
306
- return CAClassIterator.new(self, classifier).__build__(&block)
307
- end
308
-
309
- end
310
-
311
- class CAClassIterator < CAIterator # :nodoc:
312
-
313
- UNIFORM_KERNEL = false
314
-
315
- def initialize (reference, classifier = nil)
316
- @reference = reference
317
- @classifier = classifier || @reference.uniq.sort
318
- @null = CArray.new(@reference.data_type,[0])
319
- @null.data_class = @reference.data_class if @reference.has_data_class?
320
- @table = {}
321
- @ndim = 1
322
- @dim = [0]
323
- if @classifier.all_masked? or @classifier.size == 0
324
- @dim = [0]
325
- else
326
- # @dim = [@classifier.max+1]
327
- @dim = [@classifier.size]
328
- end
329
- end
330
-
331
- attr_reader :classifier, :table
332
-
333
- def __build__ (&block)
334
- if @block
335
- @classifier.each_with_addr do |v, i|
336
- @table[v] = block[v].where
337
- end
338
- else
339
- @classifier.each_with_addr do |v, i|
340
- @table[v] = @reference.eq(v).where
341
- end
342
- end
343
- return self
344
- end
345
-
346
- def ndiming (&block)
347
- block ||= lambda {|a| a.size }
348
- values = self.to_a.map{|v| block[v] }.to_ca
349
- addrs = values.sort_addr.reverse
350
- return CArray.join([@classifier[addrs], values[addrs]])
351
- end
352
-
353
- def kernel_at_addr (addr, ref = nil)
354
- ref ||= @reference
355
- if @table[addr]
356
- return ref[@table[addr]]
357
- else
358
- return @null
359
- end
360
- end
361
-
362
- def kernel_at_index (idx, ref = nil)
363
- kernel_at_addr(idx[0], ref)
364
- end
365
-
366
- end
367
-