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,229 +1,28 @@
1
- # ----------------------------------------------------------------------------
2
- #
3
- # carray/constructor.rb
4
- #
5
- # This file is part of Ruby/CArray extension library.
6
- #
7
- # Copyright (C) 2005-2020 Hiroki Motoyoshi
8
- #
9
- # ----------------------------------------------------------------------------
10
-
11
- class CArray
12
-
13
- #
14
- # CArray.span(data_type, range[, step])
15
- # CArray.span(range[, step]) -> data_type guessed by range.first type
16
- #
17
-
18
- def self.span (*argv)
19
- if argv.first.is_a?(Range)
20
- type = nil
21
- else
22
- type, = *CArray.guess_type_and_bytes(argv.shift, nil)
23
- end
24
- range, step = argv[0], argv[1]
25
- start, stop = range.begin, range.end
26
- if step == 0
27
- raise "step should not be 0"
28
- end
29
- if not type
30
- case start
31
- when Integer
32
- type = CA_INT32
33
- when Float
34
- type = CA_FLOAT64
35
- else
36
- type = CA_OBJECT
37
- end
38
- end
39
- if type == CA_OBJECT and not step
40
- return CA_OBJECT(range.to_a)
41
- else
42
- step ||= 1
43
- if range.exclude_end?
44
- n = ((stop - start).abs/step).floor
45
- else
46
- n = ((stop - start).abs/step).floor + 1
47
- end
48
- if start <= stop
49
- return CArray.new(type, [n]).seq(start, step)
50
- else
51
- return CArray.new(type, [n]).seq(start, -step.abs)
52
- end
53
- end
54
- end
55
-
56
- def span! (range)
57
- first = range.begin.to_r
58
- last = range.end.to_r
59
- if integer?
60
- if range.exclude_end?
61
- step = ((last-1)-first+1)/elements
62
- else
63
- step = (last-first+1)/elements
64
- end
65
- else
66
- if range.exclude_end?
67
- step = (last-first)/elements
68
- else
69
- step = (last-first)/(elements-1)
70
- end
71
- end
72
- if integer? && step.denominator != 1
73
- self[] = (first + seq * step).floor
74
- else
75
- seq!(first, step)
76
- end
77
- return self
78
- end
79
-
80
- def span (range)
81
- return template.span!(range)
82
- end
83
-
84
- #
85
- #
86
- #
87
-
88
- def scale! (xa, xb)
89
- xa = xa.to_f
90
- xb = xb.to_f
91
- seq!(xa, (xb-xa)/(elements-1))
92
- end
93
-
94
- def scale (xa, xb)
95
- template.scale!(xa, xb)
96
- end
97
-
98
- # @private
99
- # Create new CArray object from the return value of the block
100
- # with data type +type+. The dimensional size and the initialization value
101
- # are guessed from the return value of the block.
102
- # The block should return one of the following objects.
103
- #
104
- # * Numeric
105
- # * Array
106
- # * CArray
107
- # * an object that has either method +to_ca+ or +to_a+ or +map+
108
- #
109
- # When the return value of the block is a Numeric or CScalar object,
110
- # CScalar object is returned.
111
- #
112
- def self.__new__ (type, *args) # :nodoc:
113
- case v = args.first
114
- when CArray
115
- return ( v.data_type == type ) ? v.to_ca : v.to_type(type)
116
- when Array
117
- return CArray.new(type, CArray.guess_array_shape(v)) { v }
118
- when Range
119
- return CArray.span(type, *args)
120
- when String
121
- if type == CA_OBJECT
122
- return CScalar.new(CA_OBJECT) { v }
123
- elsif type == CA_BOOLEAN
124
- v = v.dup
125
- v.tr!('^01',"1")
126
- v.tr!('01',"\x0\x1")
127
- return CArray.boolean(v.length).load_binary(v)
128
- else
129
- case v
130
- when /;/
131
- v = v.strip.split(/\s*;\s*/).
132
- map{|s| s.split(/\s+|\s*,\s*/).map{|x| x=='_' ? UNDEF : x} }
133
- else
134
- v = v.strip.split(/\s+|\s*,\s*/).map{|x| x=='_' ? UNDEF : x}
135
- end
136
- return CArray.new(type, CArray.guess_array_shape(v)) { v }
137
- end
138
- when NilClass
139
- return CArray.new(type, [0])
140
- else
141
- if v.respond_to?(:to_ca)
142
- ca = v.to_ca
143
- return ( ca.data_type == type ) ? ca : ca.to_type(type)
144
- else
145
- return CScalar.new(type) { v }
146
- end
147
- end
148
- end
149
-
150
- # @private
151
- def self.__new_fixlen__ (bytes, v) # :nodoc:
152
- case v
153
- when CArray
154
- return ( v.data_type == :fixlen ) ? v.to_ca : v.to_type(:fixlen, :bytes=>bytes)
155
- when Array
156
- unless bytes
157
- bytes = v.map{|s| s.length}.max
158
- end
159
- return CArray.new(:fixlen, CArray.guess_array_shape(v), :bytes=>bytes) { v }
160
- when NilClass
161
- return CArray.new(type, [0])
162
- else
163
- if v.respond_to?(:to_ca)
164
- ca = v.to_ca
165
- return ( ca.data_type == :fixlen ) ? ca : ca.to_type(:fixlen, :bytes=>bytes)
166
- else
167
- return CScalar.new(:fixlen, :bytes=>bytes) { v }
168
- end
169
- end
170
- end
171
-
172
- end
173
-
174
1
  #
175
2
  # CA_INT8(data)
176
3
  # :
177
- # CA_CMPLX256(data)
4
+ # CA_OBJECT(data)
178
5
  #
179
- # Create new CArray object from +data+ with data type
180
- # which is guessed from the method name. +data+ should be one of the following
181
- # objects.
6
+ # Cast +data+ to a CArray of the data_type indicated by the method name.
7
+ # This is a polymorphic cast (not a fresh allocator): the source +data+
8
+ # is coerced into a CArray of the target data_type, dispatching on its
9
+ # Ruby class. +data+ should be one of the following objects:
182
10
  #
183
- # * Numeric
184
- # * Array
185
- # * CArray
186
- # * an object that has either method +to_ca+ or +to_a+ or +map+
11
+ # * Numeric -> CScalar (0-d CArray)
12
+ # * Array -> shape-guessed CArray, element-wise cast
13
+ # * CArray -> data_type cast (copy if same data_type, +to_type+ otherwise)
14
+ # * Range -> arange-like sequence (start..stop with step 1)
15
+ # * String -> parsed (per-data_type parser)
16
+ # * nil -> empty CArray
17
+ # * any object responding to +to_ca+ or +to_a+ -> coerced then cast
187
18
  #
188
19
  # When the block returns a Numeric or CScalar object,
189
20
  # the resulted array is a CScalar object.
190
21
 
191
- [
192
- "CA_BOOLEAN",
193
- "CA_INT8",
194
- "CA_UINT8",
195
- "CA_INT16",
196
- "CA_UINT16",
197
- "CA_INT32",
198
- "CA_UINT32",
199
- "CA_INT64",
200
- "CA_UINT64",
201
- "CA_FLOAT32",
202
- "CA_FLOAT64",
203
- "CA_FLOAT128",
204
- "CA_CMPLX64",
205
- "CA_CMPLX128",
206
- "CA_CMPLX256",
207
- "CA_OBJECT",
208
- "CA_BYTE",
209
- "CA_SHORT",
210
- "CA_INT",
211
- "CA_FLOAT",
212
- "CA_DOUBLE",
213
- "CA_COMPLEX",
214
- "CA_DCOMPLEX",
215
- "CA_SIZE",
216
- ].each do |name|
217
- eval %{
218
- def #{name} (*val)
219
- CArray.__new__(#{name}, *val)
220
- end
221
- }
222
- end
223
-
224
- def CA_FIXLEN (val, options = {})
225
- CArray.__new_fixlen__(options[:bytes], val)
226
- end
22
+ # CA_BOOLEAN / CA_INT8 / ... / CA_OBJECT (+ type-name aliases CA_BYTE /
23
+ # CA_SHORT / CA_INT / CA_FLOAT / CA_DOUBLE / CA_COMPLEX / CA_DCOMPLEX /
24
+ # CA_SIZE) and CA_FIXLEN are defined as global functions in C
25
+ # (ext/carray_cast.c).
227
26
 
228
27
  class CArray
229
28
 
@@ -233,118 +32,198 @@ class CArray
233
32
  module DataTypeExtension
234
33
  end
235
34
 
35
+ # CArray whose elements are `boolean`. Naming the element type as a
36
+ # class lets a constructor be spelled `CArray::Boolean.new(...)`; see
37
+ # {DataTypeNewConstructor} for what that form adds.
236
38
  class Boolean
237
39
  extend DataTypeNewConstructor
238
40
  extend DataTypeExtension
41
+ # @!visibility private
239
42
  TypeSymbol = :boolean
43
+ # @!visibility private
240
44
  DataType = CA_BOOLEAN
241
45
  end
242
46
 
47
+ # CArray whose elements are `uint8`. Naming the element type as a
48
+ # class lets a constructor be spelled `CArray::UInt8.new(...)`; see
49
+ # {DataTypeNewConstructor} for what that form adds.
243
50
  class UInt8
244
51
  extend DataTypeNewConstructor
245
52
  extend DataTypeExtension
53
+ # @!visibility private
246
54
  TypeSymbol = :uint8
55
+ # @!visibility private
247
56
  DataType = CA_UINT8
248
57
  end
249
58
 
59
+ # CArray whose elements are `uint16`. Naming the element type as a
60
+ # class lets a constructor be spelled `CArray::UInt16.new(...)`; see
61
+ # {DataTypeNewConstructor} for what that form adds.
250
62
  class UInt16
251
63
  extend DataTypeNewConstructor
252
64
  extend DataTypeExtension
65
+ # @!visibility private
253
66
  TypeSymbol = :uint16
67
+ # @!visibility private
254
68
  DataType = CA_UINT16
255
69
  end
256
70
 
71
+ # CArray whose elements are `uint32`. Naming the element type as a
72
+ # class lets a constructor be spelled `CArray::UInt32.new(...)`; see
73
+ # {DataTypeNewConstructor} for what that form adds.
257
74
  class UInt32
258
75
  extend DataTypeNewConstructor
259
76
  extend DataTypeExtension
77
+ # @!visibility private
260
78
  TypeSymbol = :uint32
79
+ # @!visibility private
261
80
  DataType = CA_UINT32
262
81
  end
263
82
 
83
+ # CArray whose elements are `uint64`. Naming the element type as a
84
+ # class lets a constructor be spelled `CArray::UInt64.new(...)`; see
85
+ # {DataTypeNewConstructor} for what that form adds.
264
86
  class UInt64
265
87
  extend DataTypeNewConstructor
266
88
  extend DataTypeExtension
89
+ # @!visibility private
267
90
  TypeSymbol = :uint64
91
+ # @!visibility private
268
92
  DataType = CA_UINT64
269
93
  end
270
94
 
95
+ # CArray whose elements are `int8`. Naming the element type as a
96
+ # class lets a constructor be spelled `CArray::Int8.new(...)`; see
97
+ # {DataTypeNewConstructor} for what that form adds.
271
98
  class Int8
272
99
  extend DataTypeNewConstructor
273
100
  extend DataTypeExtension
101
+ # @!visibility private
274
102
  TypeSymbol = :int8
103
+ # @!visibility private
275
104
  DataType = CA_INT8
276
105
  end
277
106
 
107
+ # CArray whose elements are `int16`. Naming the element type as a
108
+ # class lets a constructor be spelled `CArray::Int16.new(...)`; see
109
+ # {DataTypeNewConstructor} for what that form adds.
278
110
  class Int16
279
111
  extend DataTypeNewConstructor
280
112
  extend DataTypeExtension
113
+ # @!visibility private
281
114
  TypeSymbol = :int16
115
+ # @!visibility private
282
116
  DataType = CA_INT16
283
117
  end
284
118
 
119
+ # CArray whose elements are `int32`. Naming the element type as a
120
+ # class lets a constructor be spelled `CArray::Int32.new(...)`; see
121
+ # {DataTypeNewConstructor} for what that form adds.
285
122
  class Int32
286
123
  extend DataTypeNewConstructor
287
124
  extend DataTypeExtension
125
+ # @!visibility private
288
126
  TypeSymbol = :int32
127
+ # @!visibility private
289
128
  DataType = CA_INT32
290
129
  end
291
130
 
131
+ # CArray whose elements are `int64`. Naming the element type as a
132
+ # class lets a constructor be spelled `CArray::Int64.new(...)`; see
133
+ # {DataTypeNewConstructor} for what that form adds.
292
134
  class Int64
293
135
  extend DataTypeNewConstructor
294
136
  extend DataTypeExtension
137
+ # @!visibility private
295
138
  TypeSymbol = :int64
139
+ # @!visibility private
296
140
  DataType = CA_INT64
297
141
  end
298
142
 
143
+ # CArray whose elements are `float32`. Naming the element type as a
144
+ # class lets a constructor be spelled `CArray::Float32.new(...)`; see
145
+ # {DataTypeNewConstructor} for what that form adds.
299
146
  class Float32
300
147
  extend DataTypeNewConstructor
301
148
  extend DataTypeExtension
149
+ # @!visibility private
302
150
  TypeSymbol = :float32
151
+ # @!visibility private
303
152
  DataType = CA_FLOAT32
304
153
  end
305
154
 
155
+ # Numo-compatible alias of {Float32}.
306
156
  SFloat = Float32
307
157
 
158
+ # CArray whose elements are `float64`. Naming the element type as a
159
+ # class lets a constructor be spelled `CArray::Float64.new(...)`; see
160
+ # {DataTypeNewConstructor} for what that form adds.
308
161
  class Float64
309
162
  extend DataTypeNewConstructor
310
163
  extend DataTypeExtension
164
+ # @!visibility private
311
165
  TypeSymbol = :float64
166
+ # @!visibility private
312
167
  DataType = CA_FLOAT64
313
168
  end
314
169
 
170
+ # Numo-compatible alias of {Float64}.
315
171
  DFloat = Float64
316
172
 
173
+ # CArray whose elements are `complex64`. Naming the element type as a
174
+ # class lets a constructor be spelled `CArray::Complex64.new(...)`; see
175
+ # {DataTypeNewConstructor} for what that form adds.
317
176
  class Complex64
318
177
  extend DataTypeNewConstructor
319
178
  extend DataTypeExtension
179
+ # @!visibility private
320
180
  TypeSymbol = :complex64
181
+ # @!visibility private
321
182
  DataType = CA_CMPLX64
322
183
  end
323
184
 
185
+ # Numo-compatible alias of {Complex64}.
324
186
  SComplex = Complex64
325
187
 
188
+ # CArray whose elements are `complex128`. Naming the element type as a
189
+ # class lets a constructor be spelled `CArray::Complex128.new(...)`; see
190
+ # {DataTypeNewConstructor} for what that form adds.
326
191
  class Complex128
327
192
  extend DataTypeNewConstructor
328
193
  extend DataTypeExtension
194
+ # @!visibility private
329
195
  TypeSymbol = :complex128
196
+ # @!visibility private
330
197
  DataType = CA_CMPLX128
331
198
  end
332
199
 
200
+ # Numo-compatible alias of {Complex128}.
333
201
  DComplex = Complex128
334
202
 
203
+ # CArray whose elements are `object`. Naming the element type as a
204
+ # class lets a constructor be spelled `CArray::Object.new(...)`; see
205
+ # {DataTypeNewConstructor} for what that form adds.
335
206
  class Object
336
207
  extend DataTypeNewConstructor
337
208
  extend DataTypeExtension
209
+ # @!visibility private
338
210
  TypeSymbol = :object
211
+ # @!visibility private
339
212
  DataType = CA_OBJECT
340
213
  end
341
214
 
215
+ # Numo-compatible alias of {Object}.
342
216
  RObject = Object
343
217
 
218
+ # CArray whose elements are `fixlen`. Naming the element type as a
219
+ # class lets a constructor be spelled `CArray::Fixlen.new(...)`; see
220
+ # {DataTypeNewConstructor} for what that form adds.
344
221
  class Fixlen
345
222
  extend DataTypeNewConstructor
346
223
  extend DataTypeExtension
224
+ # @!visibility private
347
225
  TypeSymbol = :fixlen
226
+ # @!visibility private
348
227
  DataType = CA_FIXLEN
349
228
  end
350
229
 
@@ -352,133 +231,65 @@ end
352
231
 
353
232
  class CArray
354
233
  extend DataTypeExtension
234
+ # @!visibility private
355
235
  TypeSymbol = nil
236
+ # @!visibility private
356
237
  DataType = nil
357
238
  end
358
239
 
359
240
  class CArray
360
241
 
242
+ # Constructors added to every typed class ({Float64}, {Int32}, ...) so the
243
+ # class itself names the element type. Each forwards to the `CArray`
244
+ # equivalent with `data_type:` filled in.
361
245
  module DataTypeNewConstructor
362
-
246
+
247
+ # @overload new(*shape)
248
+ # Allocates a new CArray of this typed subclass with the given
249
+ # shape.
250
+ # @param shape [Array<Integer>] shape of the new CArray.
251
+ # @return [CArray]
363
252
  def new (*shape)
364
253
  CArray.new(self::DataType, shape)
365
254
  end
366
-
367
- end
368
-
369
- module DataTypeExtension
370
255
 
371
- def guess_data_type_from_values (*values)
372
- if values.all? {|v| v == true || v == false }
373
- CA_BOOLEAN
374
- elsif values.all? { |v| v.is_a?(Integer) }
375
- CA_INT64
376
- elsif values.all? { |v| v.is_a?(Float) }
377
- CA_FLOAT64
378
- elsif values.all? { |v| v.is_a?(Complex) }
379
- CA_CMPLX128
380
- else
381
- CA_OBJECT
382
- end
256
+ # @overload from_memory_view(obj)
257
+ # Returns a fresh CArray interpreted as this typed subclass's
258
+ # `data_type`, imported by copy from a MemoryView producer.
259
+ # Forwards to
260
+ # `CArray.from_memory_view(obj, data_type: self::DataType)`; the
261
+ # result is always 1-D (chain `.reshape` for higher rank).
262
+ # @param obj [Object] MemoryView producer.
263
+ # @return [CArray]
264
+ def from_memory_view (obj)
265
+ CArray.from_memory_view(obj, data_type: self::DataType)
383
266
  end
384
-
385
- private :guess_data_type_from_values
386
267
 
387
- def zeros (*shape)
388
- CArray.new(self::DataType || CA_FLOAT64, shape).zero
268
+ # @overload wrap_memory_view(obj)
269
+ # Returns a zero-copy CAWrap over `obj`'s MemoryView interpreted
270
+ # as this typed subclass's `data_type`. Forwards to
271
+ # `CArray.wrap_memory_view(obj, data_type: self::DataType)`; the
272
+ # result is always 1-D (chain `.reshape` for higher rank).
273
+ #
274
+ # Here the receiver names the element type, not the class of the
275
+ # result: the call forwards with `CArray` as the receiver, so a
276
+ # `CAWrap` comes back. Choosing the class is the other reading of
277
+ # the receiver, and it lives on `CArray.wrap_memory_view` itself.
278
+ # @param obj [Object] MemoryView producer.
279
+ # @return [CAWrap]
280
+ def wrap_memory_view (obj)
281
+ CArray.wrap_memory_view(obj, data_type: self::DataType)
389
282
  end
390
283
 
391
- def ones (*shape)
392
- CArray.new(self::DataType || CA_FLOAT64 , shape).one
393
- end
394
-
395
- def eye (n, m = nil, k = 0)
396
- m ||= n
397
- mat = CArray.new(self::DataType || CA_FLOAT64, [n, m])
398
- start = ( k == 0 ) ? k : ( k > 0 ? k : m - k - 1 )
399
- mat[[start..-1,m+1]] = 1
400
- mat
401
- end
402
-
403
- def identity (n)
404
- mat = CArray.new(self::DataType || CA_FLOAT64, [n, n])
405
- mat[[nil,n+1]] = 1
406
- mat
407
- end
408
-
409
- def linspace (x1, x2, n = 100)
410
- data_type = self::DataType
411
- unless data_type
412
- guess = guess_data_type_from_values(x1, x2)
413
- guess = CA_FLOAT64 if guess == CA_INT64
414
- data_type = guess
415
- end
416
- CArray.new(data_type, [n]).span(x1..x2)
417
- end
418
-
419
- def arange (*args)
420
- case args.size
421
- when 3
422
- start, stop, step = *args
423
- when 2
424
- start, stop = *args
425
- step = 1
426
- when 1
427
- start = 0
428
- stop, = *args
429
- step = 1
430
- end
431
- data_type = self::DataType
432
- data_type ||= guess_data_type_from_values(start, stop, step)
433
- CArray.__new__(data_type, start..stop-step, step)
434
- end
435
-
436
- def full (shape, fill_value)
437
- data_type = self::DataType
438
- data_type ||= guess_data_type_from_values(fill_value)
439
- shape = [shape] unless shape.is_a?(Array)
440
- CArray.new(data_type, shape).fill(fill_value)
441
- end
442
-
443
284
  end
444
285
 
445
- end
446
-
447
- class CArray
448
-
449
- def self.meshgrid (*axes, indexing: "xy", copy: true, sparse: false, &block)
450
- case indexing
451
- when "xy"
452
- ### no operation
453
- when "ij"
454
- axes = axes.map{|axis| axis.seq }
455
- else
456
- raise ArgumentError, %{indexing option should be one of "xy" and "ij"}
457
- end
458
- shape = axes.map(&:size).reverse
459
- if sparse ### => CAUnboundRepeat
460
- list = axes.map.with_index do |axis, k|
461
- extended_shape = (shape.size-1).downto(0).map { |i| ( i == k ) ? nil : :* }
462
- if copy
463
- axis[*extended_shape].to_ca
464
- else
465
- axis[*extended_shape]
466
- end
467
- end
468
- else ### => CARepeat
469
- naxes = shape.size
470
- list = axes.map.with_index do |axis, k|
471
- extended_shape = shape.dup
472
- extended_shape[naxes - k - 1] = :%
473
- if copy
474
- axis[*extended_shape].to_ca
475
- else
476
- axis[*extended_shape]
477
- end
478
- end
479
- end
480
- return block.call(*list) if block
481
- return list
286
+ # DataTypeExtension is the carrier module for Numo / NumPy-style
287
+ # factory methods that are extended onto CArray and every typed
288
+ # CArray::Int32 / Float64 / ... class below. Its body is defined
289
+ # in lib/carray/data_type_extension.rb (required after this file),
290
+ # keeping the soft-compatibility surface separate from carray's
291
+ # native constructor API.
292
+ module DataTypeExtension
482
293
  end
483
-
294
+
484
295
  end