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,641 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- carray_iterator.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
- #include "carray.h"
12
-
13
- const rb_data_type_t caiterator_data_type = {
14
- .wrap_struct_name = "CAIterator",
15
- .function = {
16
- .dmark = ca_mark,
17
- .dfree = ca_free,
18
- .dsize = NULL,
19
- .dcompact = NULL
20
- },
21
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
22
- };
23
-
24
- VALUE rb_cCAIterator;
25
-
26
- int8_t
27
- ca_iter_ndim (VALUE self)
28
- {
29
- int8_t ndim;
30
- if ( TYPE(self) == T_DATA ) {
31
- CAIterator *it;
32
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
33
- ndim = it->ndim;
34
- }
35
- else {
36
- VALUE rndim = rb_ivar_get(self, rb_intern("@ndim"));
37
- ndim = (int8_t) NUM2LONG(rndim);
38
- }
39
- return ndim;
40
- }
41
-
42
- void
43
- ca_iter_dim (VALUE self, ca_size_t *dim)
44
- {
45
- int i;
46
- if ( TYPE(self) == T_DATA ) {
47
- CAIterator *it;
48
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
49
- for (i=0; i<it->ndim; i++) {
50
- dim[i] = it->dim[i];
51
- }
52
- }
53
- else {
54
- VALUE rndim = rb_ivar_get(self, rb_intern("@ndim"));
55
- VALUE rdim = rb_ivar_get(self, rb_intern("@dim"));
56
- int8_t ndim;
57
- ndim = (int8_t) NUM2INT(rndim);
58
- for (i=0; i<ndim; i++) {
59
- dim[i] = NUM2SIZE(rb_ary_entry(rdim, i));
60
- }
61
- }
62
- }
63
-
64
- ca_size_t
65
- ca_iter_elements (VALUE self)
66
- {
67
- int i, elements;
68
- if ( TYPE(self) == T_DATA ) {
69
- CAIterator *it;
70
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
71
- elements = 1;
72
- for (i=0; i<it->ndim; i++) {
73
- elements *= it->dim[i];
74
- }
75
- }
76
- else {
77
- VALUE rndim = rb_ivar_get(self, rb_intern("@ndim"));
78
- VALUE rdim = rb_ivar_get(self, rb_intern("@dim"));
79
- int8_t ndim = (int8_t) NUM2INT(rndim);
80
- elements = 1;
81
- for (i=0; i<ndim; i++) {
82
- elements *= NUM2SIZE(rb_ary_entry(rdim, i));
83
- }
84
- }
85
- return elements;
86
- }
87
-
88
- VALUE
89
- ca_iter_reference (VALUE self)
90
- {
91
- return rb_ivar_get(self, rb_intern("@reference"));
92
- }
93
-
94
- VALUE
95
- ca_iter_kernel_at_addr (VALUE self, ca_size_t addr, VALUE rref)
96
- {
97
- volatile VALUE rker;
98
- if ( TYPE(self) == T_DATA ) {
99
- CAIterator *it;
100
- CArray *ref, *ker;
101
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
102
- TypedData_Get_Struct(rref, CArray, &carray_data_type, ref);
103
- ker = it->kernel_at_addr(it, addr, ref);
104
- rker = ca_wrap_struct(ker);
105
- rb_ca_data_type_inherit(rker, rref);
106
- rb_ca_set_parent(rker, rref);
107
- }
108
- else {
109
- rker = rb_funcall(self, rb_intern("kernel_at_addr"), 2,
110
- SIZE2NUM(addr), rref);
111
- }
112
- return rker;
113
- }
114
-
115
- VALUE
116
- ca_iter_kernel_at_index (VALUE self, ca_size_t *idx, VALUE rref)
117
- {
118
- VALUE rker;
119
- if ( TYPE(self) == T_DATA ) {
120
- CAIterator *it;
121
- CArray *ref, *ker;
122
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
123
- TypedData_Get_Struct(rref, CArray, &carray_data_type, ref);
124
- ker = it->kernel_at_index(it, idx, ref);
125
- rker = ca_wrap_struct(ker);
126
- rb_ca_data_type_inherit(rker, rref);
127
- rb_ca_set_parent(rker, rref);
128
- }
129
- else {
130
- VALUE vidx;
131
- int8_t ndim = ca_iter_ndim(self);
132
- int i;
133
- vidx = rb_ary_new2(ndim);
134
- for (i=0; i<ndim; i++) {
135
- rb_ary_store(vidx, i, SIZE2NUM(idx[i]));
136
- }
137
- rker = rb_funcall(self, rb_intern("kernel_at_index"), 2,
138
- vidx, rref);
139
- }
140
- return rker;
141
- }
142
-
143
- VALUE
144
- ca_iter_kernel_move_to_addr (VALUE self, ca_size_t addr, VALUE rref)
145
- {
146
- if ( TYPE(self) == T_DATA ) {
147
- CAIterator *it;
148
- CArray *ker;
149
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
150
- TypedData_Get_Struct(rref, CArray, &carray_data_type, ker);
151
- it->kernel_move_to_addr(it, addr, ker);
152
- }
153
- else {
154
- rb_funcall(self, rb_intern("kernel_move_to_addr"), 2,
155
- SIZE2NUM(addr), rref);
156
- }
157
- return rref;
158
- }
159
-
160
- VALUE
161
- ca_iter_kernel_move_to_index (VALUE self, ca_size_t *idx, VALUE rref)
162
- {
163
- if ( TYPE(self) == T_DATA ) {
164
- CAIterator *it;
165
- CArray *ker;
166
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
167
- TypedData_Get_Struct(rref, CArray, &carray_data_type, ker);
168
- it->kernel_move_to_index(it, idx, ker);
169
- }
170
- else {
171
- VALUE vidx;
172
- int8_t ndim = ca_iter_ndim(self);
173
- int i;
174
- vidx = rb_ary_new2(ndim);
175
- for (i=0; i<ndim; i++) {
176
- rb_ary_store(vidx, i, SIZE2NUM(idx[i]));
177
- }
178
- rb_funcall(self, rb_intern("kernel_move_to_index"), 2,
179
- vidx, rref);
180
- }
181
- return rref;
182
- }
183
-
184
-
185
- VALUE
186
- ca_iter_prepare_output (VALUE self, VALUE rtype, VALUE rbytes)
187
- {
188
- volatile VALUE obj;
189
- CArray *co;
190
- int8_t data_type;
191
- ca_size_t bytes;
192
- int i;
193
-
194
- rb_ca_guess_type_and_bytes(rtype, rbytes, &data_type, &bytes);
195
-
196
- if ( TYPE(self) == T_DATA ) {
197
- CAIterator *it;
198
- TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
199
- co = carray_new_safe(data_type, it->ndim, it->dim, bytes, NULL);
200
- }
201
- else {
202
- VALUE rndim = rb_ivar_get(self, rb_intern("@ndim"));
203
- VALUE rdim = rb_ivar_get(self, rb_intern("@dim"));
204
- int8_t ndim = NUM2LONG(rndim);
205
- ca_size_t dim[CA_RANK_MAX];
206
- for (i=0; i<ndim; i++) {
207
- dim[i] = NUM2SIZE(rb_ary_entry(rdim, i));
208
- }
209
- co = carray_new_safe(data_type, ndim, dim, bytes, NULL);
210
- }
211
-
212
- obj = ca_wrap_struct(co);
213
- rb_ca_data_type_import(obj, rtype);
214
-
215
- return obj;
216
- }
217
-
218
- /* -------------------------------------------------------------------- */
219
-
220
- /* yard:
221
- class CAIterator
222
- def ndim
223
- end
224
- end
225
- */
226
-
227
-
228
- VALUE
229
- rb_ca_iter_ndim (VALUE self)
230
- {
231
- return LONG2NUM(ca_iter_ndim(self));
232
- }
233
-
234
- /* yard:
235
- class CAIterator
236
- def dim
237
- end
238
- end
239
- */
240
-
241
- VALUE
242
- rb_ca_iter_dim (VALUE self)
243
- {
244
- VALUE rdim;
245
- ca_size_t dim[CA_RANK_MAX];
246
- int8_t ndim = ca_iter_ndim(self);
247
- int i;
248
- ca_iter_dim(self, dim);
249
- rdim = rb_ary_new2(ndim);
250
- for (i=0; i<ndim; i++) {
251
- rb_ary_store(rdim, i, SIZE2NUM(dim[i]));
252
- }
253
- return rdim;
254
- }
255
-
256
- /* yard:
257
- class CAIterator
258
- def elements
259
- end
260
- end
261
- */
262
-
263
- VALUE
264
- rb_ca_iter_elements (VALUE self)
265
- {
266
- return SIZE2NUM(ca_iter_elements(self));
267
- }
268
-
269
- /* yard:
270
- class CAIterator
271
- def reference
272
- end
273
- end
274
- */
275
-
276
- VALUE
277
- rb_ca_iter_reference (VALUE self)
278
- {
279
- return ca_iter_reference(self);
280
- }
281
-
282
- /* yard:
283
- class CAIterator
284
- def kernel_at_addr
285
- end
286
- end
287
- */
288
-
289
- VALUE
290
- rb_ca_iter_kernel_at_addr (int argc, VALUE *argv, VALUE self)
291
- {
292
- volatile VALUE raddr, rcarray;
293
- rb_scan_args(argc, argv, "11", (VALUE *) &raddr, (VALUE *) &rcarray);
294
- if ( NIL_P(rcarray) ) {
295
- rcarray = rb_ca_iter_reference(self);
296
- }
297
- return ca_iter_kernel_at_addr(self, NUM2SIZE(raddr), rcarray);
298
- }
299
-
300
- /* yard:
301
- class CAIterator
302
- def kernel_at_index
303
- end
304
- end
305
- */
306
-
307
- VALUE
308
- rb_ca_iter_kernel_at_index (int argc, VALUE *argv, VALUE self)
309
- {
310
- volatile VALUE rindex, rcarray;
311
- ca_size_t idx[CA_RANK_MAX];
312
- int8_t ndim = ca_iter_ndim(self);
313
- int i;
314
-
315
- rb_scan_args(argc, argv, "11", (VALUE *) &rindex, (VALUE *) &rcarray);
316
-
317
- if ( NIL_P(rcarray) ) {
318
- rcarray = rb_ca_iter_reference(self);
319
- }
320
-
321
- for (i=0; i<ndim; i++) {
322
- idx[i] = NUM2SIZE(rb_ary_entry(rindex, i));
323
- }
324
-
325
- return ca_iter_kernel_at_index(self, idx, rcarray);
326
- }
327
-
328
- /* yard:
329
- class CAIterator
330
- def kernel_move_to_addr
331
- end
332
- end
333
- */
334
-
335
- VALUE
336
- rb_ca_iter_kernel_move_to_addr (VALUE self, VALUE raddr, VALUE rker)
337
- {
338
- return ca_iter_kernel_move_to_addr(self, NUM2SIZE(raddr), rker);
339
- }
340
-
341
- /* yard:
342
- class CAIterator
343
- def kernel_move_to_index
344
- end
345
- end
346
- */
347
-
348
- VALUE
349
- rb_ca_iter_kernel_move_to_index (VALUE self, VALUE rindex, VALUE rker)
350
- {
351
- ca_size_t idx[CA_RANK_MAX];
352
- int8_t ndim = ca_iter_ndim(self);
353
- int i;
354
-
355
- for (i=0; i<ndim; i++) {
356
- idx[i] = NUM2SIZE(rb_ary_entry(rindex, i));
357
- }
358
-
359
- return ca_iter_kernel_move_to_index(self, idx, rker);
360
- }
361
-
362
- /* yard:
363
- class CAIterator
364
- def prepare_output
365
- end
366
- end
367
- */
368
-
369
- VALUE
370
- rb_ca_iter_prepare_output (int argc, VALUE *argv, VALUE self)
371
- {
372
- VALUE rtype, ropt, rbytes = Qnil;
373
-
374
- rb_scan_args(argc, argv, "11", &rtype, &ropt);
375
- rb_scan_options(ropt, "bytes", &rbytes);
376
-
377
- return ca_iter_prepare_output(self, rtype, rbytes);
378
- }
379
-
380
- /* -------------------------------------------------------------------- */
381
-
382
- /* yard:
383
- class CAIterator
384
- def calculate (data_type=nil, )
385
- end
386
- end
387
- */
388
-
389
- VALUE
390
- rb_ca_iter_calculate (int argc, VALUE *argv, VALUE self)
391
- {
392
- volatile VALUE rtype, rbytes, routput, rref, rker, rout;
393
- CArray *co, *cr, *ck;
394
- ca_size_t elements;
395
- int8_t data_type;
396
- ca_size_t bytes;
397
- int i;
398
-
399
- if ( argc < 1 ) {
400
- rb_raise(rb_eArgError, "invalid # of arguments");
401
- }
402
-
403
- elements = ca_iter_elements(self);
404
-
405
- rref = ca_iter_reference(self);
406
- TypedData_Get_Struct(rref, CArray, &carray_data_type, cr);
407
-
408
- if ( NIL_P(argv[0]) ) {
409
- rtype = INT2NUM(cr->data_type);
410
- rbytes = SIZE2NUM(cr->bytes);
411
- }
412
- else {
413
- rb_ca_guess_type_and_bytes(argv[0], Qnil, &data_type, &bytes);
414
- rtype = INT2NUM(data_type);
415
- rbytes = SIZE2NUM(bytes);
416
- }
417
- argc--;
418
- argv++;
419
-
420
- routput = ca_iter_prepare_output(self, rtype, rbytes);
421
- TypedData_Get_Struct(routput, CArray, &carray_data_type, co);
422
-
423
- ca_attach(cr);
424
-
425
- if ( rb_const_get(CLASS_OF(self), rb_intern("UNIFORM_KERNEL")) ) {
426
-
427
- rker = ca_iter_kernel_at_addr(self, 0, rref);
428
-
429
- TypedData_Get_Struct(rker, CArray, &carray_data_type, ck);
430
- ca_attach(ck);
431
-
432
- if ( rb_block_given_p() ) {
433
- for (i=0; i<elements; i++) {
434
- ca_iter_kernel_move_to_addr(self, i, rker);
435
- ca_update(ck);
436
- rout = rb_yield(rker);
437
- rb_ca_store_addr(routput, i, rout);
438
- }
439
- }
440
- else {
441
- if ( argc < 1 ) {
442
- rb_raise(rb_eArgError, "invalid # of arguments");
443
- }
444
- for (i=0; i<elements; i++) {
445
- ca_iter_kernel_move_to_addr(self, i, rker);
446
- ca_update(ck);
447
- rout = rb_funcall2(rker, SYM2ID(argv[0]), argc-1, &argv[1]);
448
- rb_ca_store_addr(routput, i, rout);
449
- }
450
- }
451
-
452
- ca_detach(ck);
453
- }
454
- else {
455
-
456
- if ( rb_block_given_p() ) {
457
- for (i=0; i<elements; i++) {
458
- rker = ca_iter_kernel_at_addr(self, i, rref);
459
- rout = rb_yield(rker);
460
- rb_ca_store_addr(routput, i, rout);
461
- }
462
- }
463
- else {
464
- if ( argc < 1 ) {
465
- rb_raise(rb_eArgError, "invalid # of arguments");
466
- }
467
- for (i=0; i<elements; i++) {
468
- rker = ca_iter_kernel_at_addr(self, i, rref);
469
- rout = rb_funcall2(rker, SYM2ID(argv[0]), argc-1, &argv[1]);
470
- rb_ca_store_addr(routput, i, rout);
471
- }
472
- }
473
-
474
- }
475
-
476
- ca_detach(cr);
477
-
478
- return routput;
479
- }
480
-
481
- /* yard:
482
- class CAIterator
483
- def filter
484
- end
485
- end
486
- */
487
-
488
- VALUE
489
- rb_ca_iter_filter (int argc, VALUE *argv, VALUE self)
490
- {
491
- volatile VALUE routput, rref, rker, rout;
492
- CArray *co, *cr, *ck, *cq;
493
- ca_size_t elements;
494
- int8_t data_type;
495
- int i;
496
-
497
- if ( argc < 2 ) {
498
- rb_raise(rb_eArgError, "invalid # of arguments");
499
- }
500
-
501
- elements = ca_iter_elements(self);
502
- rref = ca_iter_reference(self);
503
-
504
- TypedData_Get_Struct(rref, CArray, &carray_data_type, cr);
505
-
506
- /* FIXME: check data_type validity */
507
-
508
- data_type = NIL_P(argv[0]) ? cr->data_type : rb_ca_guess_type(argv[0]);
509
- argc--;
510
- argv++;
511
-
512
- co = carray_new(data_type, cr->ndim, cr->dim, 0, NULL);
513
- routput = ca_wrap_struct(co);
514
-
515
- if ( NIL_P(argv[0]) ) {
516
- rb_ca_data_type_inherit(routput, rref);
517
- }
518
-
519
- ca_attach(cr);
520
-
521
- if ( rb_const_get(CLASS_OF(self), rb_intern("UNIFORM_KERNEL")) ) {
522
-
523
- rker = ca_iter_kernel_at_addr(self, 0, rref);
524
- TypedData_Get_Struct(rker, CArray, &carray_data_type, ck);
525
- ca_allocate(ck);
526
-
527
- rout = ca_iter_kernel_at_addr(self, 0, routput);
528
- TypedData_Get_Struct(rker, CArray, &carray_data_type, cq);
529
- ca_allocate(cq);
530
-
531
- for (i=0; i<elements; i++) {
532
- ca_iter_kernel_move_to_addr(self, i, rker);
533
- ca_iter_kernel_move_to_addr(self, i, rout);
534
- ca_update(ck);
535
- rb_funcall(rout, rb_intern("[]="), 1,
536
- rb_funcall2(rker, SYM2ID(argv[0]), argc-1, &argv[1]));
537
- ca_sync(cq);
538
- }
539
-
540
- ca_detach_n(2, ck, cq);
541
-
542
- }
543
- else {
544
-
545
- for (i=0; i<elements; i++) {
546
- rker = ca_iter_kernel_at_addr(self, i, rref);
547
- rout = ca_iter_kernel_at_addr(self, i, routput);
548
- rb_funcall(rout, rb_intern("[]="), 1,
549
- rb_funcall2(rker, SYM2ID(argv[0]), argc-1, &argv[1]));
550
- }
551
-
552
- }
553
-
554
- ca_detach(cr);
555
- return routput;
556
- }
557
-
558
- /* yard:
559
- class CAIterator
560
- def evaluate
561
- end
562
- end
563
- */
564
-
565
- VALUE
566
- rb_ca_iter_evaluate (int argc, VALUE *argv, VALUE self)
567
- {
568
- volatile VALUE rref, rker;
569
- CArray *cr, *ck;
570
- ca_size_t elements;
571
- int i;
572
-
573
- elements = ca_iter_elements(self);
574
- rref = ca_iter_reference(self);
575
-
576
- TypedData_Get_Struct(rref, CArray, &carray_data_type, cr);
577
-
578
- ca_attach(cr);
579
-
580
- if ( rb_const_get(CLASS_OF(self), rb_intern("UNIFORM_KERNEL")) ) {
581
-
582
- rker = ca_iter_kernel_at_addr(self, 0, rref);
583
-
584
- TypedData_Get_Struct(rker, CArray, &carray_data_type, ck);
585
-
586
- ca_attach(ck);
587
-
588
- for (i=0; i<elements; i++) {
589
- ca_iter_kernel_move_to_addr(self, i, rker);
590
- ca_update(ck);
591
- rb_funcall2(rker, SYM2ID(argv[0]), argc-1, &argv[1]);
592
- }
593
-
594
- ca_detach(ck);
595
- }
596
- else {
597
-
598
- for (i=0; i<elements; i++) {
599
- rker = ca_iter_kernel_at_addr(self, i, rref);
600
- rb_funcall2(rker, SYM2ID(argv[0]), argc-1, &argv[1]);
601
- }
602
-
603
- }
604
-
605
- ca_sync(cr);
606
- ca_detach(cr);
607
-
608
- return self;
609
- }
610
-
611
-
612
- void
613
- Init_carray_iterator ()
614
- {
615
- rb_cCAIterator = rb_define_class("CAIterator", rb_cObject);
616
-
617
- rb_define_method(rb_cCAIterator, "ndim", rb_ca_iter_ndim, 0);
618
- rb_define_method(rb_cCAIterator, "rank", rb_ca_iter_ndim, 0); /* alias */
619
- rb_define_method(rb_cCAIterator, "dim", rb_ca_iter_dim, 0);
620
- rb_define_method(rb_cCAIterator, "shape", rb_ca_iter_dim, 0); /* alias */
621
- rb_define_method(rb_cCAIterator, "elements", rb_ca_iter_elements, 0);
622
- rb_define_method(rb_cCAIterator, "reference", rb_ca_iter_reference, 0);
623
-
624
- rb_define_method(rb_cCAIterator, "kernel_at_addr",
625
- rb_ca_iter_kernel_at_addr, -1);
626
- rb_define_method(rb_cCAIterator, "kernel_at_index",
627
- rb_ca_iter_kernel_at_index, -1);
628
- rb_define_method(rb_cCAIterator, "kernel_move_to_addr",
629
- rb_ca_iter_kernel_move_to_addr, 2);
630
- rb_define_method(rb_cCAIterator, "kernel_move_to_index",
631
- rb_ca_iter_kernel_move_to_index, 2);
632
- rb_define_method(rb_cCAIterator, "prepare_output",
633
- rb_ca_iter_prepare_output, -1);
634
-
635
- rb_define_method(rb_cCAIterator, "calculate", rb_ca_iter_calculate, -1);
636
- rb_define_method(rb_cCAIterator, "filter", rb_ca_iter_filter, -1);
637
- rb_define_method(rb_cCAIterator, "evaluate", rb_ca_iter_evaluate, -1);
638
-
639
- }
640
-
641
-