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
@@ -1,367 +1,75 @@
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-2020 Hiroki Motoyoshi
17
+ # The retired 2.0 generic dispatch (calculate / filter / evaluate over a
18
+ # kernel_at_addr slot) is preserved at `samples/caiterator/iterator.{rb,c}`.
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, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, # tier 1
41
+ :variancep, :stddevp, :minmax, # tier 2
42
+ :min_index, :max_index, :min_addr, :max_addr, # position
43
+ :wsum, :wmean, # weighted
44
+ :median, :percentile, :quantile, # tier 3
45
+ :count, :count_not_masked, :count_masked, :elements, # count family
46
+ :each, :reduce, # generic iterate
34
47
  ].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
48
+ define_method(name) do |*, **, &_blk|
49
+ raise NotImplementedError, "#{self.class} must implement ##{name}"
204
50
  end
205
- return retval
206
51
  end
207
52
 
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
53
+ # Recommended (should) surface -- template methods. These are well-defined
54
+ # for some members and structurally impossible for others, so they are not
55
+ # required: `map` is a per-piece element-wise transform scattered back to the
56
+ # source, `sort_addr` is a per-piece sort returning source flat addresses, and
57
+ # the segment scans (cumsum / cumprod / cummax / cummin / cumcount) write a
58
+ # per-cell running statistic of each piece. A member implements each when it
59
+ # is well-defined and overrides it to raise with a reason when it is not. The
60
+ # scans belong here for the same reason as map: a running per-cell value is
61
+ # single-valued only when each cell belongs to exactly one piece, so the
62
+ # partition members (slab / block / categorical / group) provide them, while
63
+ # CAWindowIterator's overlapping padded windows put a cell in many windows --
64
+ # no single running value -- and it raises, exactly as it does for map /
65
+ # sort_addr. Un-overridden each is simply unavailable, not a contract
66
+ # violation. min_addr / max_addr stay required: a single winner address is
67
+ # well-defined even for an overlapping window.
68
+ [:map, :sort_addr,
69
+ :cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |name|
70
+ define_method(name) do |*, **, &_blk|
71
+ raise NotImplementedError, "#{self.class} does not provide ##{name} (optional)"
221
72
  end
222
- return retval
223
73
  end
224
74
 
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
75
  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
-