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
data/ext/ca_obj_repeat.c CHANGED
@@ -1,498 +1,101 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ca_obj_repeat.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
3
+ CARepeat: a CAStride view that broadcasts the parent over additional
4
+ axes by giving those axes stride 0 (so multiple output positions
5
+ alias the same parent cell). Pure CAStride typedef; the only extra
6
+ shape rule is the "repeat" vs "data" axis split documented at
7
+ ca_repeat_setup below. Read-only (writes through a stride-0 axis
8
+ are ambiguous).
8
9
 
9
10
  ---------------------------------------------------------------------------- */
10
11
 
11
12
  #include "carray.h"
13
+ #include "carray_internal.h" /* per-obj_type view constructors */
14
+ #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
12
15
 
13
- const rb_data_type_t carepeat_data_type = {
14
- .parent = &cavirtual_data_type,
15
- .wrap_struct_name = "CARepeat",
16
- .function = {
17
- .dmark = ca_mark,
18
- .dfree = ca_free,
19
- .dsize = NULL,
20
- .dcompact = NULL
21
- },
22
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
23
- };
24
-
25
- const rb_data_type_t carepeat_mask_data_type = {
26
- .parent = &carepeat_data_type,
27
- .wrap_struct_name = "CARepeatMask",
28
- .function = {
29
- .dmark = NULL,
30
- .dfree = ca_free_nop,
31
- .dsize = NULL,
32
- .dcompact = NULL
33
- },
34
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
35
- };
16
+ extern ca_operation_function_t ca_stride_func;
36
17
 
37
18
  VALUE rb_cCARepeat;
38
19
  VALUE rb_cCARepeatMask;
39
20
 
40
- /* yard:
41
- class CARepeat < CAVirtual # :nodoc:
42
- end
43
- */
21
+ /* CARepeat builds a broadcasting view: for each output axis k,
22
+ count[k] > 0 => "repeat" axis; view dim[k] = count[k], stride = 0
23
+ count[k] == 0 => "data" axis; view dim[k] = parent->dim[j],
24
+ stride = parent_byte_stride[j],
25
+ where j is the running data-axis index.
26
+ The total number of data axes must equal parent->ndim.
44
27
 
28
+ The result is marked CA_FLAG_READ_ONLY: writing through a stride-0
29
+ axis is ambiguous, since several output positions alias the same
30
+ parent element. */
45
31
  int
46
- ca_repeat_setup (CARepeat *ca, CArray *parent, int8_t ndim, ca_size_t *count)
32
+ ca_repeat_setup (CAStride *ca, CArray *parent, int8_t ndim, ca_size_t *count)
47
33
  {
48
- int8_t data_type;
49
- ca_size_t elements, bytes, nrpt, repeat_level, repeat_num,
50
- contig_level, contig_num, data_ndim;
51
- int i, j;
52
-
53
- nrpt = 1;
54
- data_ndim = 0;
55
- for (i=0; i<ndim; i++) {
56
- if ( count[i] < 0 ) {
34
+ ca_size_t parent_byte_stride[CA_RANK_MAX];
35
+ ca_size_t newdim[CA_RANK_MAX];
36
+ ca_size_t strides[CA_RANK_MAX];
37
+ ca_size_t total_elements_d = (double) parent->elements;
38
+ ca_size_t nrpt = 1;
39
+ int8_t data_ndim = 0;
40
+ int8_t i, j;
41
+
42
+ for (i = 0; i < ndim; i++) {
43
+ if (count[i] < 0) {
57
44
  rb_raise(rb_eRuntimeError,
58
45
  "negative size for %i-th dimension specified", i);
59
46
  }
60
-
61
- if ( count[i] ) {
62
- nrpt *= count[i];
63
- }
64
- else {
65
- data_ndim += 1;
66
- }
67
- }
68
-
69
- repeat_level = 0;
70
- repeat_num = 1;
71
- for (i=0; i<ndim && count[i]; i++) {
72
- repeat_level = i+1;
73
- repeat_num *= count[i];
47
+ if (count[i]) nrpt *= count[i];
48
+ else data_ndim += 1;
74
49
  }
75
-
76
- contig_level = ndim-1;
77
- contig_num = 1;
78
- for (i=ndim-1; i >= 0 && count[i]; i--) {
79
- contig_level = i;
80
- contig_num *= count[i];
81
- }
82
-
83
- if ( data_ndim != parent->ndim ) {
50
+ if (data_ndim != parent->ndim) {
84
51
  rb_raise(rb_eRuntimeError,
85
52
  "mismatch in ndim between original array and determined by # of dummies");
86
53
  }
87
-
88
- if ( ((double) parent->elements) * nrpt > CA_LENGTH_MAX ) {
54
+ if (((double) parent->elements) * nrpt > CA_LENGTH_MAX) {
89
55
  rb_raise(rb_eRuntimeError, "too large byte length");
90
56
  }
91
-
92
- data_type = parent->data_type;
93
- elements = parent->elements * nrpt;
94
- bytes = parent->bytes;
95
-
96
- ca->obj_type = CA_OBJ_REPEAT;
97
- ca->data_type = data_type;
98
- ca->flags = 0;
99
- ca->ndim = ndim;
100
- ca->bytes = bytes;
101
- ca->elements = elements;
102
- ca->ptr = NULL;
103
- ca->mask = NULL;
104
- ca->dim = ALLOC_N(ca_size_t, ndim);
105
-
106
- ca->parent = parent;
107
- ca->attach = 0;
108
- ca->nosync = 0;
109
- ca->count = ALLOC_N(ca_size_t, ndim);
110
- ca->repeat_level = repeat_level;
111
- ca->repeat_num = repeat_num;
112
- ca->contig_level = contig_level;
113
- ca->contig_num = contig_num;
57
+ (void) total_elements_d;
58
+
59
+ /* parent_byte_stride[k] = bytes * Π_{i>k} parent->dim[i] */
60
+ {
61
+ ca_size_t s = parent->bytes;
62
+ for (i = parent->ndim - 1; i >= 0; i--) {
63
+ parent_byte_stride[i] = s;
64
+ s *= parent->dim[i];
65
+ }
66
+ }
114
67
 
115
68
  j = 0;
116
- for (i=0; i<ndim; i++) {
117
- if ( count[i] ) {
118
- ca->dim[i] = count[i];
119
- }
120
- else {
121
- ca->dim[i] = parent->dim[j++];
69
+ for (i = 0; i < ndim; i++) {
70
+ if (count[i] > 0) {
71
+ newdim[i] = count[i];
72
+ strides[i] = 0;
73
+ } else {
74
+ newdim[i] = parent->dim[j];
75
+ strides[i] = parent_byte_stride[j];
76
+ j++;
122
77
  }
123
78
  }
124
79
 
125
- memcpy(ca->count, count, ndim * sizeof(ca_size_t));
80
+ ca_stride_setup(ca, CA_OBJ_REPEAT, parent,
81
+ parent->data_type, parent->bytes,
82
+ ndim, newdim, strides, 0);
126
83
 
127
84
  ca_set_flag(ca, CA_FLAG_READ_ONLY);
128
-
129
- if ( ca_has_mask(parent) ) {
130
- ca_create_mask(ca);
85
+ if (ca->mask) {
86
+ ca_set_flag(ca->mask, CA_FLAG_READ_ONLY);
131
87
  }
132
-
133
88
  return 0;
134
89
  }
135
90
 
136
-
137
- CARepeat *
91
+ CAStride *
138
92
  ca_repeat_new (CArray *parent, int8_t ndim, ca_size_t *count)
139
93
  {
140
- CARepeat *ca = ALLOC(CARepeat);
94
+ CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_REPEAT, ndim);
141
95
  ca_repeat_setup(ca, parent, ndim, count);
142
96
  return ca;
143
97
  }
144
98
 
145
- static void
146
- free_ca_repeat (void *ap)
147
- {
148
- CARepeat *ca = (CARepeat *) ap;
149
- if ( ca != NULL ) {
150
- xfree(ca->count);
151
- ca_free(ca->mask);
152
- xfree(ca->dim);
153
- xfree(ca);
154
- }
155
- }
156
-
157
- static void ca_repeat_attach (CARepeat *cb);
158
- static void ca_repeat_sync (CARepeat *cb);
159
- static void ca_repeat_fill (CARepeat *ca, char *ptr);
160
-
161
- /* ------------------------------------------------------------------- */
162
-
163
- static void *
164
- ca_repeat_func_clone (void *ap)
165
- {
166
- CARepeat *ca = (CARepeat *) ap;
167
- return ca_repeat_new(ca->parent, ca->ndim, ca->count);
168
- }
169
-
170
- static char *
171
- ca_repeat_func_ptr_at_addr (void *ap, ca_size_t addr)
172
- {
173
- CARepeat *ca = (CARepeat *) ap;
174
- if ( ca->ptr ) {
175
- return ca->ptr + ca->bytes * addr;
176
- }
177
- else {
178
- ca_size_t idx[CA_RANK_MAX];
179
- ca_addr2index((CArray *)ca, addr, idx);
180
- return ca_ptr_at_index(ca, idx);
181
- }
182
- }
183
-
184
- static char *
185
- ca_repeat_func_ptr_at_index (void *ap, ca_size_t *idx)
186
- {
187
- CARepeat *ca = (CARepeat *) ap;
188
- if ( ca->ptr ) {
189
- return ca_array_func_ptr_at_index(ca, idx);
190
- }
191
- else {
192
- ca_size_t *count = ca->count;
193
- ca_size_t *dim0 = ca->parent->dim;
194
- int8_t i;
195
- ca_size_t n, j;
196
-
197
- j = 0;
198
- n = 0;
199
- for (i=0; i<ca->ndim; i++) {
200
- if ( ! count[i] ) {
201
- n = dim0[j]*n + idx[i];
202
- j++;
203
- }
204
- }
205
-
206
- if ( ca->parent->ptr ) {
207
- return ca->parent->ptr + ca->bytes * n;
208
- }
209
- else {
210
- return ca_ptr_at_addr(ca->parent, n);
211
- }
212
- }
213
- }
214
-
215
- static void
216
- ca_repeat_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
217
- {
218
- CARepeat *ca = (CARepeat *) ap;
219
- ca_size_t *count = ca->count;
220
- ca_size_t idx0[CA_RANK_MAX];
221
- int8_t i;
222
- ca_size_t j;
223
- j = 0;
224
- for (i=0; i<ca->ndim; i++) {
225
- if ( ! count[i] ) {
226
- idx0[j++] = idx[i];
227
- }
228
- }
229
- ca_fetch_index(ca->parent, idx0, ptr);
230
- }
231
-
232
- static void
233
- ca_repeat_func_store_index (void *ap, ca_size_t *idx, void *ptr)
234
- {
235
- CARepeat *ca = (CARepeat *) ap;
236
- ca_size_t *count = ca->count;
237
- ca_size_t idx0[CA_RANK_MAX];
238
- int8_t i;
239
- ca_size_t j;
240
- j = 0;
241
- for (i=0; i<ca->ndim; i++) {
242
- if ( ! count[i] ) {
243
- idx0[j++] = idx[i];
244
- }
245
- }
246
- ca_store_index(ca->parent, idx0, ptr);
247
- }
248
-
249
- static void
250
- ca_repeat_func_allocate (void *ap)
251
- {
252
- CARepeat *ca = (CARepeat *) ap;
253
- ca_attach(ca->parent);
254
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
255
- ca->ptr = malloc_with_check(ca_length(ca));
256
- }
257
-
258
- static void
259
- ca_repeat_func_attach (void *ap)
260
- {
261
- CARepeat *ca = (CARepeat *) ap;
262
- ca_attach(ca->parent);
263
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
264
- ca->ptr = malloc_with_check(ca_length(ca));
265
- ca_repeat_attach(ca);
266
- }
267
-
268
- static void
269
- ca_repeat_func_sync (void *ap)
270
- {
271
- CARepeat *ca = (CARepeat *) ap;
272
- ca_repeat_sync(ca);
273
- ca_sync(ca->parent);
274
- }
275
-
276
- static void
277
- ca_repeat_func_detach (void *ap)
278
- {
279
- CARepeat *ca = (CARepeat *) ap;
280
- free(ca->ptr);
281
- ca->ptr = NULL;
282
- ca_detach(ca->parent);
283
- }
284
-
285
- static void
286
- ca_repeat_func_copy_data (void *ap, void *ptr)
287
- {
288
- CARepeat *ca = (CARepeat *) ap;
289
- char *ptr0 = ca->ptr;
290
- ca_attach(ca->parent);
291
- ca->ptr = ptr;
292
- ca_repeat_attach(ca);
293
- ca->ptr = ptr0;
294
- ca_detach(ca->parent);
295
- }
296
-
297
- static void
298
- ca_repeat_func_sync_data (void *ap, void *ptr)
299
- {
300
- CARepeat *ca = (CARepeat *) ap;
301
- char *ptr0 = ca->ptr;
302
- ca_attach(ca->parent);
303
- ca->ptr = ptr;
304
- ca_repeat_sync(ca);
305
- ca->ptr = ptr0;
306
- ca_sync(ca->parent);
307
- ca_detach(ca->parent);
308
- }
309
-
310
- static void
311
- ca_repeat_func_fill_data (void *ap, void *ptr)
312
- {
313
- CARepeat *ca = (CARepeat *) ap;
314
- ca_attach(ca->parent);
315
- ca_repeat_fill(ca, ptr);
316
- ca_sync(ca->parent);
317
- ca_detach(ca->parent);
318
- }
319
-
320
- static void
321
- ca_repeat_func_create_mask (void *ap)
322
- {
323
- CARepeat *ca = (CARepeat *) ap;
324
- ca_update_mask(ca->parent);
325
- if ( ! ca->parent->mask ) {
326
- ca_create_mask(ca->parent);
327
- }
328
- ca->mask =
329
- (CArray *) ca_repeat_new(ca->parent->mask, ca->ndim, ca->count);
330
- }
331
-
332
- ca_operation_function_t ca_repeat_func = {
333
- -1, /* CA_OBJ_REPEAT */
334
- CA_VIRTUAL_ARRAY,
335
- free_ca_repeat,
336
- ca_repeat_func_clone,
337
- ca_repeat_func_ptr_at_addr,
338
- ca_repeat_func_ptr_at_index,
339
- NULL,
340
- ca_repeat_func_fetch_index,
341
- NULL,
342
- ca_repeat_func_store_index,
343
- ca_repeat_func_allocate,
344
- ca_repeat_func_attach,
345
- ca_repeat_func_sync,
346
- ca_repeat_func_detach,
347
- ca_repeat_func_copy_data,
348
- ca_repeat_func_sync_data,
349
- ca_repeat_func_fill_data,
350
- ca_repeat_func_create_mask,
351
- };
352
-
353
- /* ------------------------------------------------------------------- */
354
-
355
- static void
356
- memfill (void *dp, void *sp, ca_size_t bytes, ca_size_t n)
357
- {
358
- switch ( bytes ) {
359
- case 1:
360
- memset(dp, *(uint8_t*)sp, n);
361
- break;
362
- case 2: {
363
- int16_t *p = (int16_t *) dp, *q = (int16_t *) sp;
364
- while (n--) { *p++ = *q; }
365
- break;
366
- }
367
- case 4: {
368
- int32_t *p = (int32_t *) dp, *q = (int32_t *) sp;
369
- while (n--) { *p++ = *q; }
370
- break;
371
- }
372
- case 8: {
373
- float64_t *p = (float64_t *) dp, *q = (float64_t *) sp;
374
- while (n--) { *p++ = *q; }
375
- break;
376
- }
377
- default: {
378
- ca_size_t i;
379
- char *p = (char *) dp, *q = (char *) sp;
380
- for (i=0; i<n; i++) {
381
- memcpy(p, q, bytes);
382
- p+=bytes;
383
- }
384
- }
385
- }
386
- }
387
-
388
- static void
389
- ca_repeat_attach_loop1 (CARepeat *ca, int8_t level, int8_t level0,
390
- ca_size_t *idx, ca_size_t *idx0)
391
- {
392
- ca_size_t *count = ca->count;
393
- ca_size_t i;
394
-
395
- if ( level == ca->contig_level ) {
396
- if ( ca->contig_num == 1 ) {
397
- for (i=0; i<ca->dim[level]; i++) {
398
- idx[level] = i;
399
- idx0[level0] = i;
400
- memcpy(ca_ptr_at_index(ca, idx),
401
- ca_ptr_at_index(ca->parent, idx0),
402
- ca->bytes);
403
- }
404
- }
405
- else {
406
- char *dp, *sp;
407
- dp = ca_ptr_at_index(ca, idx);
408
- sp = ca_ptr_at_index(ca->parent, idx0);
409
- memfill(dp, sp, ca->bytes, ca->contig_num);
410
- }
411
- }
412
- else {
413
- for (i=0; i<ca->dim[level]; i++) {
414
- idx[level] = i;
415
- if ( ! count[level] ) {
416
- idx0[level0] = i;
417
- ca_repeat_attach_loop1(ca, level+1, level0+1, idx, idx0);
418
- }
419
- else {
420
- ca_repeat_attach_loop1(ca, level+1, level0, idx, idx0);
421
- }
422
- }
423
- }
424
- }
425
-
426
- static void
427
- ca_repeat_attach (CARepeat *ca)
428
- {
429
- ca_size_t idx[CA_RANK_MAX];
430
- ca_size_t idx0[CA_RANK_MAX];
431
- ca_size_t i;
432
- char *dp, *sp;
433
-
434
- for (i=0; i<ca->ndim; i++) {
435
- idx[i] = 0;
436
- idx0[i] = 0;
437
- }
438
- ca_repeat_attach_loop1(ca, ca->repeat_level, 0, idx, idx0);
439
-
440
- sp = ca_ptr_at_addr(ca, 0);
441
- for (i=1; i<ca->repeat_num; i++) {
442
- dp = sp + i * ca->bytes * (ca->elements / ca->repeat_num);
443
- memcpy(dp, sp, ca->bytes * (ca->elements / ca->repeat_num));
444
- }
445
- }
446
-
447
- static void
448
- ca_repeat_sync_loop (CARepeat *ca, int8_t level, int8_t level0,
449
- ca_size_t *idx, ca_size_t *idx0)
450
- {
451
- ca_size_t *count = ca->count;
452
- ca_size_t i;
453
-
454
- if ( level == ca->contig_level ) {
455
- if ( ca->contig_num == 1 ) {
456
- memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx),
457
- ca_length(ca->parent));
458
- }
459
- else {
460
- memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx), ca->bytes);
461
- }
462
- }
463
- else {
464
- for (i=0; i<ca->dim[level]; i++) {
465
- idx[level] = i;
466
- if ( ! count[level] ) {
467
- idx0[level0] = i;
468
- ca_repeat_sync_loop(ca, level+1, level0+1, idx, idx0);
469
- }
470
- else {
471
- ca_repeat_sync_loop(ca, level+1, level0, idx, idx0);
472
- }
473
- }
474
- }
475
- }
476
-
477
- static void
478
- ca_repeat_sync (CARepeat *ca)
479
- {
480
- ca_size_t idx[CA_RANK_MAX];
481
- ca_size_t idx0[CA_RANK_MAX];
482
- int8_t i;
483
- for (i=0; i<ca->ndim; i++) {
484
- idx[i] = 0;
485
- idx0[i] = 0;
486
- }
487
- ca_repeat_sync_loop(ca, ca->repeat_level, 0, idx, idx0);
488
- }
489
-
490
- static void
491
- ca_repeat_fill (CARepeat *ca, char *ptr)
492
- {
493
- ca_fill(ca->parent, ptr);
494
- }
495
-
496
99
  /* ------------------------------------------------------------------- */
497
100
 
498
101
  VALUE
@@ -500,16 +103,31 @@ rb_ca_repeat_new (VALUE cary, int8_t ndim, ca_size_t *count)
500
103
  {
501
104
  volatile VALUE obj;
502
105
  CArray *parent;
503
- CARepeat *ca;
106
+ CAStride *ca;
504
107
  rb_check_carray_object(cary);
505
108
  TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
506
109
  ca = ca_repeat_new(parent, ndim, count);
507
110
  obj = ca_wrap_struct(ca);
508
111
  rb_ca_set_parent(obj, cary);
509
- rb_ca_data_type_inherit(obj, cary);
510
112
  return obj;
511
113
  }
512
114
 
115
+ /* rb_ca_repeat -- build a broadcasting view of self. Each argv[k]
116
+ is either an Integer (= repeat count for that output axis, gets
117
+ stride 0) or the symbol :% (= "data axis", pulls the next
118
+ parent->dim[j] / parent_byte_stride[j] in order). The number of
119
+ :% positions must equal parent->ndim.
120
+
121
+ Two-arg shorthand `repeat(:%, template)` or `repeat(template, :%)`
122
+ matches the receiver's non-singleton axes to `template.shape` and
123
+ fills the rest with explicit repeat counts; used by broadcast
124
+ helpers.
125
+
126
+ Single-call no-op (= repeat == 1, every count is 0 or 1) returns a
127
+ CARefer reshape instead of a CARepeat, keeping the chain flat.
128
+
129
+ Called by carray_access.c indexer dispatch when the index includes
130
+ the :% symbol (e.g. `a[:%, nil, :%, 3]`). */
513
131
  VALUE
514
132
  rb_ca_repeat (int argc, VALUE *argv, VALUE self)
515
133
  {
@@ -521,10 +139,10 @@ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
521
139
 
522
140
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
523
141
 
524
- if ( argc == 2 &&
142
+ if ( argc == 2 &&
525
143
  (
526
144
  ( argv[0] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[1]) ) ||
527
- ( argv[1] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[0]) )
145
+ ( argv[1] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[0]) )
528
146
  ) ) {
529
147
  volatile VALUE args;
530
148
  CArray *ct;
@@ -587,7 +205,7 @@ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
587
205
  self = rb_ca_refer_new(self, ca->data_type, ndim, dim, ca->bytes, 0);
588
206
  }
589
207
  }
590
- return rb_ca_repeat((int)RARRAY_LEN(args), RARRAY_PTR(args), self);
208
+ return rb_ca_repeat((int)RARRAY_LEN(args), (VALUE *)RARRAY_CONST_PTR(args), self);
591
209
  }
592
210
 
593
211
  repeat = 1;
@@ -628,37 +246,34 @@ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
628
246
  obj = rb_ca_repeat_new(self, argc, count);
629
247
  }
630
248
 
249
+ CA_FACE_LIFT_IF_FACE(obj, self, ca);
631
250
  return obj;
632
251
  }
633
252
 
634
- static VALUE
635
- rb_ca_repeat_s_allocate (VALUE klass)
636
- {
637
- CARepeat *ca;
638
- return TypedData_Make_Struct(klass, CARepeat, &carepeat_data_type, ca);
639
- }
640
-
641
253
  static VALUE
642
254
  rb_ca_repeat_initialize_copy (VALUE self, VALUE other)
643
255
  {
644
- CARepeat *ca, *cs;
645
-
646
- TypedData_Get_Struct(self, CARepeat, &carepeat_data_type, ca);
647
- TypedData_Get_Struct(other, CARepeat, &carepeat_data_type, cs);
648
-
649
- ca_repeat_setup(ca, cs->parent, cs->ndim, cs->count);
650
-
256
+ CAStride *ca, *cs;
257
+ TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
258
+ TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
259
+ if ( ca_func[CA_OBJ_REPEAT].pool_init ) {
260
+ ca_array_pool_alloc(ca, CA_OBJ_REPEAT, cs->ndim);
261
+ }
262
+ ca_stride_setup(ca, CA_OBJ_REPEAT, cs->parent,
263
+ cs->data_type, cs->bytes,
264
+ cs->ndim, cs->dim, cs->strides, cs->base_offset);
265
+ ca_set_flag(ca, CA_FLAG_READ_ONLY);
266
+ if (ca->mask) ca_set_flag(ca->mask, CA_FLAG_READ_ONLY);
651
267
  return self;
652
268
  }
653
269
 
654
270
  void
655
- Init_ca_obj_repeat ()
271
+ Init_ca_obj_repeat (void)
656
272
  {
657
- /* rb_cCARepeat, CA_OBJ_REPEAT are defined in rb_carray.c */
273
+ /* rb_cCARepeat, CA_OBJ_REPEAT are defined in ruby_carray.c / carray_core.c */
658
274
 
659
275
  rb_define_const(rb_cObject, "CA_OBJ_REPEAT", INT2NUM(CA_OBJ_REPEAT));
660
276
 
661
- rb_define_alloc_func(rb_cCARepeat, rb_ca_repeat_s_allocate);
662
277
  rb_define_method(rb_cCARepeat, "initialize_copy",
663
278
  rb_ca_repeat_initialize_copy, 1);
664
279
  }