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,98 +1,46 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ca_obj_transpose.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
3
+ CATranspose: a CAStride view that permutes the parent's dimension
4
+ order. Pure typedef of CAStride; only the dim / stride layout
5
+ differs (no extra state).
8
6
 
9
7
  ---------------------------------------------------------------------------- */
10
8
 
11
9
  #include "carray.h"
10
+ #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
12
11
 
13
- typedef struct {
14
- int16_t obj_type;
15
- int8_t data_type;
16
- int8_t ndim;
17
- int32_t flags;
18
- ca_size_t bytes;
19
- ca_size_t elements;
20
- ca_size_t *dim;
21
- char *ptr;
22
- CArray *mask;
23
- CArray *parent;
24
- uint32_t attach;
25
- uint8_t nosync;
26
- /* -------------*/
27
- ca_size_t *imap;
28
- ca_size_t step;
29
- } CATrans;
12
+ extern ca_operation_function_t ca_stride_func;
30
13
 
31
14
  static int8_t CA_OBJ_TRANSPOSE;
32
15
 
33
- const rb_data_type_t catrans_data_type = {
34
- .parent = &cavirtual_data_type,
35
- .wrap_struct_name = "CATrans",
36
- .function = {
37
- .dmark = ca_mark,
38
- .dfree = ca_free,
39
- .dsize = NULL,
40
- .dcompact = NULL
41
- },
42
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
43
- };
44
-
45
- const rb_data_type_t catrans_mask_data_type = {
46
- .parent = &catrans_data_type,
47
- .wrap_struct_name = "CATransMask",
48
- .function = {
49
- .dmark = NULL,
50
- .dfree = ca_free_nop,
51
- .dsize = NULL,
52
- .dcompact = NULL
53
- },
54
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
55
- };
56
-
57
16
  VALUE rb_cCATrans;
58
17
  VALUE rb_cCATransMask;
59
18
 
60
- /* yard:
61
- class CATranspose < CAVirtual # :nodoc:
62
- end
63
- */
64
-
65
19
  /* ------------------------------------------------------------------- */
66
20
 
67
21
  int
68
- ca_trans_setup (CATrans *ca, CArray *parent, ca_size_t *imap)
22
+ ca_trans_setup (CAStride *ca, CArray *parent, ca_size_t *imap)
69
23
  {
70
- int8_t data_type, ndim;
71
- ca_size_t bytes, elements;
24
+ int8_t ndim;
72
25
  ca_size_t *dim0;
73
26
  ca_size_t newdim[CA_RANK_MAX];
27
+ ca_size_t strides[CA_RANK_MAX];
28
+ ca_size_t parent_byte_stride[CA_RANK_MAX];
74
29
  ca_size_t map[CA_RANK_MAX];
75
30
  int8_t i;
76
- ca_size_t idim, step;
77
-
78
- data_type = parent->data_type;
79
- bytes = parent->bytes;
80
- ndim = parent->ndim;
81
- elements = parent->elements;
82
- dim0 = parent->dim;
31
+ ca_size_t idim, s;
83
32
 
84
- for (i=0; i<ndim; i++) {
85
- map[i] = -1;
86
- }
33
+ ndim = parent->ndim;
34
+ dim0 = parent->dim;
87
35
 
88
- for (i=0; i<ndim; i++) {
36
+ for (i = 0; i < ndim; i++) map[i] = -1;
37
+ for (i = 0; i < ndim; i++) {
89
38
  idim = imap[i];
90
- if ( idim < 0 || idim >= ndim ) {
39
+ if (idim < 0 || idim >= ndim) {
91
40
  rb_raise(rb_eRuntimeError,
92
41
  "specified %i-th dimension number out of range", i);
93
42
  }
94
-
95
- if ( map[idim] != -1 ) {
43
+ if (map[idim] != -1) {
96
44
  rb_raise(rb_eRuntimeError,
97
45
  "specified %i-th dimension number is duplicated", i);
98
46
  }
@@ -100,423 +48,30 @@ ca_trans_setup (CATrans *ca, CArray *parent, ca_size_t *imap)
100
48
  newdim[i] = dim0[idim];
101
49
  }
102
50
 
103
- step = 1;
104
- for (i=imap[ndim-1]+1; i<ndim; i++) {
105
- step *= dim0[i];
51
+ /* parent_byte_stride[k] = bytes * Π_{j>k} parent->dim[j] */
52
+ s = parent->bytes;
53
+ for (i = ndim - 1; i >= 0; i--) {
54
+ parent_byte_stride[i] = s;
55
+ s *= dim0[i];
106
56
  }
107
-
108
- ca->obj_type = CA_OBJ_TRANSPOSE;
109
- ca->data_type = data_type;
110
- ca->flags = 0;
111
- ca->ndim = ndim;
112
- ca->bytes = bytes;
113
- ca->elements = elements;
114
- ca->ptr = NULL;
115
- ca->mask = NULL;
116
- ca->dim = ALLOC_N(ca_size_t, ndim);
117
-
118
- ca->parent = parent;
119
- ca->attach = 0;
120
- ca->nosync = 0;
121
- ca->imap = ALLOC_N(ca_size_t, ndim);
122
- ca->step = step;
123
-
124
- memcpy(ca->dim, newdim, ndim * sizeof(ca_size_t));
125
- memcpy(ca->imap, imap, ndim * sizeof(ca_size_t));
126
-
127
- if ( ca_has_mask(parent) ) {
128
- ca_create_mask(ca);
57
+ for (i = 0; i < ndim; i++) {
58
+ strides[i] = parent_byte_stride[imap[i]];
129
59
  }
130
60
 
61
+ ca_stride_setup(ca, CA_OBJ_TRANSPOSE, parent,
62
+ parent->data_type, parent->bytes,
63
+ ndim, newdim, strides, 0);
131
64
  return 0;
132
65
  }
133
66
 
134
- CATrans *
67
+ CAStride *
135
68
  ca_trans_new (CArray *parent, ca_size_t *imap)
136
69
  {
137
- CATrans *ca = ALLOC(CATrans);
70
+ CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_TRANSPOSE, parent->ndim);
138
71
  ca_trans_setup(ca, parent, imap);
139
72
  return ca;
140
73
  }
141
74
 
142
- static void
143
- free_ca_trans (void *ap)
144
- {
145
- CATrans *ca = (CATrans *) ap;
146
- if ( ca != NULL ) {
147
- xfree(ca->imap);
148
- ca_free(ca->mask);
149
- xfree(ca->dim);
150
- xfree(ca);
151
- }
152
- }
153
-
154
- static void ca_trans_attach (CATrans *cb);
155
- static void ca_trans_sync (CATrans *cb);
156
- static void ca_trans_fill (CATrans *ca, char *ptr);
157
-
158
-
159
- /* ------------------------------------------------------------------- */
160
-
161
- static void *
162
- ca_trans_func_clone (void *ap)
163
- {
164
- CATrans *ca = (CATrans *) ap;
165
- return ca_trans_new(ca->parent, ca->imap);
166
- }
167
-
168
- static char *
169
- ca_trans_func_ptr_at_addr (void *ap, ca_size_t addr)
170
- {
171
- CATrans *ca = (CATrans *) ap;
172
- if ( ca->ptr ) {
173
- return ca->ptr + ca->bytes * addr;
174
- }
175
- else {
176
- ca_size_t idx[CA_RANK_MAX];
177
- ca_addr2index((CArray *)ca, addr, idx);
178
- return ca_ptr_at_index(ca, idx);
179
- }
180
- }
181
-
182
- static char *
183
- ca_trans_func_ptr_at_index (void *ap, ca_size_t *idx)
184
- {
185
- CATrans *ca = (CATrans *) ap;
186
- if ( ca->ptr ) {
187
- return ca_array_func_ptr_at_index(ca, idx);
188
- }
189
- else {
190
- ca_size_t *imap = ca->imap;
191
- ca_size_t idx0[CA_RANK_MAX];
192
- int8_t i;
193
- for (i=0; i<ca->ndim; i++) {
194
- idx0[imap[i]] = idx[i];
195
- }
196
- return ca_ptr_at_index(ca->parent, idx0);
197
- }
198
- }
199
-
200
- static void
201
- ca_trans_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
202
- {
203
- CATrans *ca = (CATrans *) ap;
204
- ca_size_t *imap = ca->imap;
205
- ca_size_t idx0[CA_RANK_MAX];
206
- int8_t i;
207
- for (i=0; i<ca->ndim; i++) {
208
- idx0[imap[i]] = idx[i];
209
- }
210
- ca_fetch_index(ca->parent, idx0, ptr);
211
- }
212
-
213
- static void
214
- ca_trans_func_store_index (void *ap, ca_size_t *idx, void *ptr)
215
- {
216
- CATrans *ca = (CATrans *) ap;
217
- ca_size_t *imap = ca->imap;
218
- ca_size_t idx0[CA_RANK_MAX];
219
- int8_t i;
220
- for (i=0; i<ca->ndim; i++) {
221
- idx0[imap[i]] = idx[i];
222
- }
223
- ca_store_index(ca->parent, idx0, ptr);
224
- }
225
-
226
- static void
227
- ca_trans_func_allocate (void *ap)
228
- {
229
- CATrans *ca = (CATrans *) ap;
230
- ca_attach(ca->parent);
231
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
232
- ca->ptr = malloc_with_check(ca_length(ca));
233
- }
234
-
235
- static void
236
- ca_trans_func_attach (void *ap)
237
- {
238
- CATrans *ca = (CATrans *) ap;
239
- ca_attach(ca->parent);
240
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
241
- ca->ptr = malloc_with_check(ca_length(ca));
242
- ca_trans_attach(ca);
243
- }
244
-
245
- static void
246
- ca_trans_func_sync (void *ap)
247
- {
248
- CATrans *ca = (CATrans *) ap;
249
- ca_trans_sync(ca);
250
- ca_sync(ca->parent);
251
- }
252
-
253
- static void
254
- ca_trans_func_detach (void *ap)
255
- {
256
- CATrans *ca = (CATrans *) ap;
257
- free(ca->ptr);
258
- ca->ptr = NULL;
259
- ca_detach(ca->parent);
260
- }
261
-
262
- static void
263
- ca_trans_func_copy_data (void *ap, void *ptr)
264
- {
265
- CATrans *ca = (CATrans *) ap;
266
- char *ptr0 = ca->ptr;
267
- ca_attach(ca->parent);
268
- ca->ptr = ptr;
269
- ca_trans_attach(ca);
270
- ca->ptr = ptr0;
271
- ca_detach(ca->parent);
272
- }
273
-
274
- static void
275
- ca_trans_func_sync_data (void *ap, void *ptr)
276
- {
277
- CATrans *ca = (CATrans *) ap;
278
- char *ptr0 = ca->ptr;
279
- ca_attach(ca->parent);
280
- ca->ptr = ptr;
281
- ca_trans_sync(ca);
282
- ca->ptr = ptr0;
283
- ca_sync(ca->parent);
284
- ca_detach(ca->parent);
285
- }
286
-
287
- static void
288
- ca_trans_func_fill_data (void *ap, void *ptr)
289
- {
290
- CATrans *ca = (CATrans *) ap;
291
- ca_attach(ca->parent);
292
- ca_trans_fill(ca, ptr);
293
- ca_sync(ca->parent);
294
- ca_detach(ca->parent);
295
- }
296
-
297
- static void
298
- ca_trans_func_create_mask (void *ap)
299
- {
300
- CATrans *ca = (CATrans *) ap;
301
- ca_create_mask(ca->parent);
302
- ca->mask =
303
- (CArray *) ca_trans_new(ca->parent->mask, ca->imap);
304
- }
305
-
306
- ca_operation_function_t ca_trans_func = {
307
- -1, /* CA_OBJ_TRANSPOSE */
308
- CA_VIRTUAL_ARRAY,
309
- free_ca_trans,
310
- ca_trans_func_clone,
311
- ca_trans_func_ptr_at_addr,
312
- ca_trans_func_ptr_at_index,
313
- NULL,
314
- ca_trans_func_fetch_index,
315
- NULL,
316
- ca_trans_func_store_index,
317
- ca_trans_func_allocate,
318
- ca_trans_func_attach,
319
- ca_trans_func_sync,
320
- ca_trans_func_detach,
321
- ca_trans_func_copy_data,
322
- ca_trans_func_sync_data,
323
- ca_trans_func_fill_data,
324
- ca_trans_func_create_mask,
325
- };
326
-
327
- /* ------------------------------------------------------------------- */
328
-
329
- static void
330
- ca_trans_attach_loop (CATrans *ca, int8_t level, ca_size_t *idx, ca_size_t *idx0)
331
- {
332
- ca_size_t step = ca->step;
333
- ca_size_t dim = ca->dim[level];
334
- ca_size_t *imap = ca->imap;
335
- ca_size_t i;
336
-
337
- if ( level == ca->ndim - 1 ) {
338
- idx[level] = 0;
339
- idx0[imap[level]] = 0;
340
- switch ( ca->bytes ) {
341
- case 1:
342
- {
343
- int8_t *p = ca_ptr_at_index(ca, idx);
344
- int8_t *q = ca_ptr_at_index(ca->parent, idx0);
345
- for (i=0; i<dim; i++) {
346
- *p++ = *q;
347
- q += step;
348
- }
349
- }
350
- break;
351
- case 2:
352
- {
353
- int16_t *p = ca_ptr_at_index(ca, idx);
354
- int16_t *q = ca_ptr_at_index(ca->parent, idx0);
355
- for (i=0; i<dim; i++) {
356
- *p++ = *q;
357
- q += step;
358
- }
359
- }
360
- break;
361
- case 4:
362
- {
363
- int32_t *p = ca_ptr_at_index(ca, idx);
364
- int32_t *q = ca_ptr_at_index(ca->parent, idx0);
365
- for (i=0; i<dim; i++) {
366
- *p++ = *q;
367
- q += step;
368
- }
369
- }
370
- break;
371
- case 8:
372
- {
373
- float64_t *p = ca_ptr_at_index(ca, idx);
374
- float64_t *q = ca_ptr_at_index(ca->parent, idx0);
375
- for (i=0; i<dim; i++) {
376
- *p++ = *q;
377
- q += step;
378
- }
379
- }
380
- break;
381
- default:
382
- {
383
- char *p = ca_ptr_at_index(ca, idx);
384
- char *q = ca_ptr_at_index(ca->parent, idx0);
385
- for (i=0; i<dim; i++) {
386
- memcpy(p, q, ca->bytes);
387
- p += ca->bytes;
388
- q += ca->bytes*step;
389
- }
390
- }
391
- }
392
- }
393
- else {
394
- for (i=0; i<dim; i++) {
395
- idx[level] = i;
396
- idx0[imap[level]] = i;
397
- ca_trans_attach_loop(ca, level+1, idx, idx0);
398
- }
399
- }
400
- }
401
-
402
- static void
403
- ca_trans_attach (CATrans *ca)
404
- {
405
- ca_size_t idx[CA_RANK_MAX];
406
- ca_size_t idx0[CA_RANK_MAX];
407
- ca_trans_attach_loop(ca, 0, idx, idx0);
408
- }
409
-
410
- static void
411
- ca_trans_sync_loop (CATrans *ca, int8_t level, ca_size_t *idx, ca_size_t *idx0)
412
- {
413
- ca_size_t step = ca->step;
414
- ca_size_t dim = ca->dim[level];
415
- ca_size_t *imap = ca->imap;
416
- ca_size_t i;
417
-
418
- if ( level == ca->ndim - 1 ) {
419
- idx[level] = 0;
420
- idx0[imap[level]] = 0;
421
- switch ( ca->bytes ) {
422
- case 1:
423
- {
424
- int8_t *p = ca_ptr_at_index(ca, idx);
425
- int8_t *q = ca_ptr_at_index(ca->parent, idx0);
426
- for (i=0; i<dim; i++) {
427
- *q = *p++;
428
- q += step;
429
- }
430
- }
431
- break;
432
- case 2:
433
- {
434
- int16_t *p = ca_ptr_at_index(ca, idx);
435
- int16_t *q = ca_ptr_at_index(ca->parent, idx0);
436
- for (i=0; i<dim; i++) {
437
- *q = *p++;
438
- q += step;
439
- }
440
- }
441
- break;
442
- case 4:
443
- {
444
- int32_t *p = ca_ptr_at_index(ca, idx);
445
- int32_t *q = ca_ptr_at_index(ca->parent, idx0);
446
- for (i=0; i<dim; i++) {
447
- *q = *p++;
448
- q += step;
449
- }
450
- }
451
- break;
452
- case 8:
453
- {
454
- float64_t *p = ca_ptr_at_index(ca, idx);
455
- float64_t *q = ca_ptr_at_index(ca->parent, idx0);
456
- for (i=0; i<dim; i++) {
457
- *q = *p++;
458
- q += step;
459
- }
460
- }
461
- break;
462
- default:
463
- {
464
- char *p = ca_ptr_at_index(ca, idx);
465
- char *q = ca_ptr_at_index(ca->parent, idx0);
466
- for (i=0; i<dim; i++) {
467
- memcpy(q, p, ca->bytes);
468
- p += ca->bytes;
469
- q += ca->bytes * step;
470
- }
471
- }
472
- }
473
- }
474
- else {
475
- for (i=0; i<dim; i++) {
476
- idx[level] = i;
477
- idx0[imap[level]] = i;
478
- ca_trans_sync_loop(ca, level+1, idx, idx0);
479
- }
480
- }
481
- }
482
-
483
- static void
484
- ca_trans_sync (CATrans *ca)
485
- {
486
- ca_size_t idx[CA_RANK_MAX];
487
- ca_size_t idx0[CA_RANK_MAX];
488
- ca_trans_sync_loop(ca, 0, idx, idx0);
489
- }
490
-
491
- /*
492
- static void
493
- ca_trans_fill_loop (CATrans *ca, char *ptr,
494
- int8_t level, ca_size_t *idx0)
495
- {
496
- ca_size_t *imap = ca->imap;
497
- ca_size_t i;
498
-
499
- if ( level == ca->ndim - 1 ) {
500
- for (i=0; i<ca->dim[level]; i++) {
501
- idx0[imap[level]] = i;
502
- memcpy(ca_ptr_at_index(ca->parent, idx0), ptr, ca->bytes);
503
- }
504
- }
505
- else {
506
- for (i=0; i<ca->dim[level]; i++) {
507
- idx0[imap[level]] = i;
508
- ca_trans_fill_loop(ca, ptr, level+1, idx0);
509
- }
510
- }
511
- }
512
- */
513
-
514
- static void
515
- ca_trans_fill (CATrans *ca, char *ptr)
516
- {
517
- ca_fill(ca->parent, ptr);
518
- }
519
-
520
75
  /* ------------------------------------------------------------------- */
521
76
 
522
77
  VALUE
@@ -524,87 +79,78 @@ rb_ca_trans_new (VALUE cary, ca_size_t *imap)
524
79
  {
525
80
  volatile VALUE obj;
526
81
  CArray *parent;
527
- CATrans *ca;
82
+ CAStride *ca;
528
83
  rb_check_carray_object(cary);
529
- TypedData_Get_Struct(cary, CArray,&carray_data_type, parent);
84
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
530
85
  ca = ca_trans_new(parent, imap);
531
86
  obj = ca_wrap_struct(ca);
532
87
  rb_ca_set_parent(obj, cary);
533
- rb_ca_data_type_inherit(obj, cary);
534
88
  return obj;
535
89
  }
536
90
 
537
- /* yard:
538
- class CArray
539
- def transposed
540
- end
541
- end
542
- */
543
-
91
+ /* CArray#transpose(*imap) -- returns a CATranspose view. With no
92
+ args, reverses the dimension order (= same as `.T`). With argc
93
+ == ndim, uses imap as the per-axis permutation. */
544
94
  static VALUE
545
95
  rb_ca_trans (int argc, VALUE *argv, VALUE self)
546
96
  {
547
- volatile VALUE obj;
97
+ volatile VALUE obj, ropt;
548
98
  CArray *ca;
549
99
  ca_size_t imap[CA_RANK_MAX];
550
100
  int8_t i;
551
101
 
552
102
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
553
103
 
554
- if ( argc == 0 ) {
555
- for (i=0; i<ca->ndim; i++) {
556
- imap[i] = ca->ndim - i - 1;
557
- }
104
+ /* The axis order is positional only. Reject a trailing Hash here so a
105
+ keyword argument does not read as an argument-count mismatch. */
106
+ ropt = rb_pop_options(&argc, &argv);
107
+ rb_reject_options(ropt);
108
+
109
+ if (argc == 0) {
110
+ for (i = 0; i < ca->ndim; i++) imap[i] = ca->ndim - i - 1;
558
111
  }
559
- else if ( argc == ca->ndim ) {
560
- for (i=0; i<ca->ndim; i++) {
561
- imap[i] = NUM2SIZE(argv[i]);
562
- }
112
+ else if (argc == ca->ndim) {
113
+ for (i = 0; i < ca->ndim; i++) imap[i] = NUM2SIZE(argv[i]);
563
114
  }
564
115
  else {
565
116
  rb_raise(rb_eArgError, "# of arguments should be equal to ndim");
566
117
  }
567
118
 
568
119
  obj = rb_ca_trans_new(self, imap);
569
-
120
+ CA_FACE_LIFT_IF_FACE(obj, self, ca);
570
121
  return obj;
571
122
  }
572
123
 
573
- static VALUE
574
- rb_ca_trans_s_allocate (VALUE klass)
575
- {
576
- CATrans *ca;
577
- return TypedData_Make_Struct(klass, CATrans, &catrans_data_type, ca);
578
- }
579
-
580
124
  static VALUE
581
125
  rb_ca_trans_initialize_copy (VALUE self, VALUE other)
582
126
  {
583
- CATrans *ca, *cs;
584
-
585
- TypedData_Get_Struct(self, CATrans, &catrans_data_type, ca);
586
- TypedData_Get_Struct(other, CATrans, &catrans_data_type, cs);
587
-
588
- ca_trans_setup(ca, cs->parent, cs->imap);
589
-
127
+ CAStride *ca, *cs;
128
+ TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
129
+ TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
130
+ if ( ca_func[CA_OBJ_TRANSPOSE].pool_init ) {
131
+ ca_array_pool_alloc(ca, CA_OBJ_TRANSPOSE, cs->ndim);
132
+ }
133
+ ca_stride_setup(ca, CA_OBJ_TRANSPOSE, cs->parent,
134
+ cs->data_type, cs->bytes,
135
+ cs->ndim, cs->dim, cs->strides, cs->base_offset);
590
136
  return self;
591
137
  }
592
138
 
593
139
  void
594
- Init_ca_obj_transpose ()
140
+ Init_ca_obj_transpose (void)
595
141
  {
596
- rb_cCATrans = rb_define_class("CATranspose", rb_cCAVirtual);
142
+ rb_cCATrans = rb_define_class("CATranspose", rb_cCAStride);
597
143
  rb_cCATransMask = rb_define_class("CATransposeMask", rb_cCATrans);
598
144
 
599
- CA_OBJ_TRANSPOSE = ca_install_obj_type(rb_cCATrans,
600
- &catrans_data_type,
601
- rb_cCATransMask,
602
- &catrans_mask_data_type, ca_trans_func);
145
+ CA_OBJ_TRANSPOSE = ca_install_obj_type(rb_cCATrans,
146
+ &castride_data_type,
147
+ rb_cCATransMask,
148
+ &castride_mask_data_type,
149
+ &ca_stride_func, sizeof(ca_stride_func));
603
150
  rb_define_const(rb_cObject, "CA_OBJ_TRANSPOSE", INT2NUM(CA_OBJ_TRANSPOSE));
604
151
 
605
- rb_define_method(rb_cCArray, "transposed", rb_ca_trans, -1);
606
-
607
- rb_define_alloc_func(rb_cCATrans, rb_ca_trans_s_allocate);
152
+ rb_define_method(rb_cCArray, "transpose", rb_ca_trans, -1);
153
+ rb_define_alias(rb_cCArray, "T", "transpose");
608
154
  rb_define_method(rb_cCATrans, "initialize_copy",
609
155
  rb_ca_trans_initialize_copy, 1);
610
156
  }