carray 2.0.1 → 3.0.1

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  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 +1244 -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 +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -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 +239 -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 +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -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 +839 -0
  33. data/ext/ca_obj_binop.c +948 -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 +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -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 +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -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 +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  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 +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -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 +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
data/ext/ca_obj_farray.c CHANGED
@@ -1,440 +1,69 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ca_obj_farray.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
3
+ CAFarray: a CAStride view that exposes a row-major parent in
4
+ column-major (Fortran) order. Pure typedef of CAStride
5
+ (no extra state); only the dim / stride layout differs.
8
6
 
9
7
  ---------------------------------------------------------------------------- */
10
8
 
11
9
  #include "carray.h"
12
10
 
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 step;
28
- } CAFarray;
29
-
30
- const rb_data_type_t cafarray_data_type = {
31
- .parent = &cavirtual_data_type,
32
- .wrap_struct_name = "CAFarray",
33
- .function = {
34
- .dmark = ca_mark,
35
- .dfree = ca_free,
36
- .dsize = NULL,
37
- .dcompact = NULL
38
- },
39
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
40
- };
41
-
42
- const rb_data_type_t cafarray_mask_data_type = {
43
- .parent = &cafarray_data_type,
44
- .wrap_struct_name = "CAFarrayMask",
45
- .function = {
46
- .dmark = NULL,
47
- .dfree = ca_free_nop,
48
- .dsize = NULL,
49
- .dcompact = NULL
50
- },
51
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
52
- };
11
+ extern ca_operation_function_t ca_stride_func;
53
12
 
54
13
  static int8_t CA_OBJ_FARRAY;
55
14
 
56
- static VALUE rb_cCAFarray;
57
- static VALUE rb_cCAFarrayMask;
58
-
59
- /* yard:
60
- class CAFArray < CAVirtual # :nodoc:
61
- end
62
- */
15
+ VALUE rb_cCAFarray;
16
+ VALUE rb_cCAFarrayMask;
63
17
 
64
18
  /* ------------------------------------------------------------------- */
65
19
 
66
- int
67
- ca_farray_setup (CAFarray *ca, CArray *parent)
68
- {
69
- int8_t ndim, data_type;
70
- ca_size_t *dim, elements, bytes;
71
- int i;
72
-
73
- /* check arguments */
74
-
75
- data_type = parent->data_type;
76
- ndim = parent->ndim;
77
- dim = parent->dim;
78
- bytes = parent->bytes;
79
- elements = parent->elements;
20
+ /* CAFarray = column-major (Fortran) view of a row-major parent.
21
+ For a parent of shape (d_0, d_1, ..., d_{n-1}) and byte size B, the
22
+ view has shape (d_{n-1}, ..., d_1, d_0) and reads parent's memory in
23
+ column-major order:
80
24
 
81
- ca->obj_type = CA_OBJ_FARRAY;
82
- ca->data_type = data_type;
83
- ca->flags = 0;
84
- ca->ndim = ndim;
85
- ca->bytes = bytes;
86
- ca->elements = elements;
87
- ca->ptr = NULL;
88
- ca->mask = NULL;
89
- ca->dim = ALLOC_N(ca_size_t, ndim);
25
+ view dim[k] = parent->dim[n-1-k]
26
+ view strides[k] = parent_byte_stride[n-1-k]
27
+ view base_offset = 0
90
28
 
91
- ca->parent = parent;
92
- ca->attach = 0;
93
- ca->nosync = 0;
94
-
95
- for (i=0; i<ndim; i++) {
96
- ca->dim[i] = dim[ndim-1-i];
29
+ where parent_byte_stride[j] = B * Π_{i>j} parent->dim[i]. */
30
+ int
31
+ ca_farray_setup (CAStride *ca, CArray *parent)
32
+ {
33
+ int8_t ndim = parent->ndim;
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 s = parent->bytes;
38
+ int8_t i;
39
+
40
+ for (i = ndim - 1; i >= 0; i--) {
41
+ parent_byte_stride[i] = s;
42
+ s *= parent->dim[i];
97
43
  }
98
-
99
- ca->step = 1;
100
- for (i=1; i<ndim; i++) {
101
- ca->step *= dim[i];
44
+ for (i = 0; i < ndim; i++) {
45
+ newdim[i] = parent->dim[ndim - 1 - i];
46
+ strides[i] = parent_byte_stride[ndim - 1 - i];
102
47
  }
103
48
 
104
- if ( ca_has_mask(parent) ) {
105
- ca_create_mask(ca);
106
- }
49
+ ca_stride_setup(ca, CA_OBJ_FARRAY, parent,
50
+ parent->data_type, parent->bytes,
51
+ ndim, newdim, strides, 0);
107
52
 
108
- if ( ca_is_scalar(parent) ) {
53
+ if (ca_is_scalar(parent)) {
109
54
  ca_set_flag(ca, CA_FLAG_SCALAR);
110
55
  }
111
-
112
56
  return 0;
113
57
  }
114
58
 
115
- CAFarray *
59
+ CAStride *
116
60
  ca_farray_new (CArray *parent)
117
61
  {
118
- CAFarray *ca = ALLOC(CAFarray);
62
+ CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_FARRAY, parent->ndim);
119
63
  ca_farray_setup(ca, parent);
120
64
  return ca;
121
65
  }
122
66
 
123
- static void
124
- free_ca_farray (void *ap)
125
- {
126
- CAFarray *ca = (CAFarray *) ap;
127
- if ( ca != NULL ) {
128
- ca_free(ca->mask);
129
- xfree(ca->dim);
130
- xfree(ca);
131
- }
132
- }
133
-
134
- /* ------------------------------------------------------------------- */
135
-
136
- static void *
137
- ca_farray_func_clone (void *ap)
138
- {
139
- CAFarray *ca = (CAFarray *) ap;
140
- return ca_farray_new(ca->parent);
141
- }
142
-
143
- #define ca_farray_func_ptr_at_addr ca_array_func_ptr_at_addr
144
- #define ca_farray_func_ptr_at_index ca_array_func_ptr_at_index
145
-
146
- static void
147
- ca_farray_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
148
- {
149
- CAFarray *ca = (CAFarray *) ap;
150
- int8_t ndim = ca->ndim;
151
- ca_size_t idx0[CA_RANK_MAX];
152
- int i;
153
- for (i=0; i<ndim; i++) {
154
- idx0[i] = idx[ndim-1-i];
155
- }
156
- ca_fetch_index(ca->parent, idx0, ptr);
157
- }
158
-
159
- static void
160
- ca_farray_func_store_index (void *ap, ca_size_t *idx, void *ptr)
161
- {
162
- CAFarray *ca = (CAFarray *) ap;
163
- int8_t ndim = ca->ndim;
164
- ca_size_t idx0[CA_RANK_MAX];
165
- int i;
166
- for (i=0; i<ndim; i++) {
167
- idx0[i] = idx[ndim-1-i];
168
- }
169
- ca_store_index(ca->parent, idx0, ptr);
170
- }
171
-
172
- static void
173
- ca_farray_func_allocate (void *ap)
174
- {
175
- CAFarray *ca = (CAFarray *) ap;
176
- ca_attach(ca->parent);
177
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
178
- ca->ptr = malloc_with_check(ca_length(ca));
179
- }
180
-
181
- static void ca_fa_attach (CAFarray *ca);
182
- static void ca_fa_sync (CAFarray *ca);
183
-
184
- static void
185
- ca_farray_func_attach (void *ap)
186
- {
187
- CAFarray *ca = (CAFarray *) ap;
188
- ca_attach(ca->parent);
189
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
190
- ca->ptr = malloc_with_check(ca_length(ca));
191
- ca_fa_attach(ca);
192
- }
193
-
194
- static void
195
- ca_farray_func_sync (void *ap)
196
- {
197
- CAFarray *ca = (CAFarray *) ap;
198
- ca_fa_sync(ca);
199
- ca_sync(ca->parent);
200
- }
201
-
202
- static void
203
- ca_farray_func_detach (void *ap)
204
- {
205
- CAFarray *ca = (CAFarray *) ap;
206
- free(ca->ptr);
207
- ca->ptr = NULL;
208
- ca_detach(ca->parent);
209
- }
210
-
211
- static void
212
- ca_farray_func_copy_data (void *ap, void *ptr)
213
- {
214
- CAFarray *ca = (CAFarray *) ap;
215
- char *ptr0 = ca->ptr;
216
- ca_attach(ca->parent);
217
- ca->ptr = ptr;
218
- ca_fa_attach(ca);
219
- ca->ptr = ptr0;
220
- ca_detach(ca->parent);
221
- }
222
-
223
- static void
224
- ca_farray_func_sync_data (void *ap, void *ptr)
225
- {
226
- CAFarray *ca = (CAFarray *) ap;
227
- char *ptr0 = ca->ptr;
228
- ca_attach(ca->parent);
229
- ca->ptr = ptr;
230
- ca_fa_sync(ca);
231
- ca->ptr = ptr0;
232
- ca_sync(ca->parent);
233
- ca_detach(ca->parent);
234
- }
235
-
236
- static void
237
- ca_farray_func_fill_data (void *ap, void *ptr)
238
- {
239
- CAFarray *ca = (CAFarray *) ap;
240
- ca_fill(ca->parent, ptr);
241
- }
242
-
243
- static void
244
- ca_farray_func_create_mask (void *ap)
245
- {
246
- CAFarray *ca = (CAFarray *) ap;
247
- ca_update_mask(ca->parent);
248
- if ( ! ca->parent->mask ) {
249
- ca_create_mask(ca->parent);
250
- }
251
- ca->mask = (CArray *) ca_farray_new(ca->parent->mask);
252
- }
253
-
254
- ca_operation_function_t ca_farray_func = {
255
- -1, /* CA_OBJ_FARRAY */
256
- CA_VIRTUAL_ARRAY,
257
- free_ca_farray,
258
- ca_farray_func_clone,
259
- ca_farray_func_ptr_at_addr,
260
- ca_farray_func_ptr_at_index,
261
- NULL,
262
- ca_farray_func_fetch_index,
263
- NULL,
264
- ca_farray_func_store_index,
265
- ca_farray_func_allocate,
266
- ca_farray_func_attach,
267
- ca_farray_func_sync,
268
- ca_farray_func_detach,
269
- ca_farray_func_copy_data,
270
- ca_farray_func_sync_data,
271
- ca_farray_func_fill_data,
272
- ca_farray_func_create_mask,
273
- };
274
-
275
- /* ------------------------------------------------------------------- */
276
-
277
-
278
- static void
279
- ca_fa_attach_loop (CAFarray *ca, int8_t level, ca_size_t *idx, ca_size_t *idx0)
280
- {
281
- ca_size_t step = ca->step;
282
- ca_size_t dim = ca->dim[level];
283
- ca_size_t i;
284
- if ( level == ca->ndim - 1 ) {
285
- idx[level] = 0;
286
- idx0[0] = 0;
287
- switch ( ca->bytes ) {
288
- case 1:
289
- {
290
- int8_t *p = ca_ptr_at_index(ca, idx);
291
- int8_t *q = ca_ptr_at_index(ca->parent, idx0);
292
- for (i=0; i<dim; i++) {
293
- *p++ = *q;
294
- q += step;
295
- }
296
- }
297
- break;
298
- case 2:
299
- {
300
- int16_t *p = ca_ptr_at_index(ca, idx);
301
- int16_t *q = ca_ptr_at_index(ca->parent, idx0);
302
- for (i=0; i<dim; i++) {
303
- *p++ = *q;
304
- q += step;
305
- }
306
- }
307
- break;
308
- case 4:
309
- {
310
- int32_t *p = ca_ptr_at_index(ca, idx);
311
- int32_t *q = ca_ptr_at_index(ca->parent, idx0);
312
- for (i=0; i<dim; i++) {
313
- *p++ = *q;
314
- q += step;
315
- }
316
- }
317
- break;
318
- case 8:
319
- {
320
- float64_t *p = ca_ptr_at_index(ca, idx);
321
- float64_t *q = ca_ptr_at_index(ca->parent, idx0);
322
- for (i=0; i<dim; i++) {
323
- *p++ = *q;
324
- q += step;
325
- }
326
- }
327
- break;
328
- default:
329
- {
330
- char *p = ca_ptr_at_index(ca, idx);
331
- char *q = ca_ptr_at_index(ca->parent, idx0);
332
- for (i=0; i<dim; i++) {
333
- memcpy(p, q, ca->bytes);
334
- p += ca->bytes;
335
- q += step * ca->bytes;
336
- }
337
- }
338
- }
339
- }
340
- else {
341
- int level0 = ca->ndim - 1 - level;
342
- for (i=0; i<dim; i++) {
343
- idx[level] = i;
344
- idx0[level0] = i;
345
- ca_fa_attach_loop(ca, level+1, idx, idx0);
346
- }
347
- }
348
- }
349
-
350
- static void
351
- ca_fa_attach (CAFarray *ca)
352
- {
353
- ca_size_t idx[CA_RANK_MAX];
354
- ca_size_t idx0[CA_RANK_MAX];
355
- ca_fa_attach_loop(ca, 0, idx, idx0);
356
- }
357
-
358
- static void
359
- ca_fa_sync_loop (CAFarray *ca, int8_t level, ca_size_t *idx, ca_size_t *idx0)
360
- {
361
- ca_size_t step = ca->step;
362
- ca_size_t dim = ca->dim[level];
363
- ca_size_t i;
364
-
365
- if ( level == ca->ndim - 1 ) {
366
- idx[level] = 0;
367
- idx0[0] = 0;
368
- switch ( ca->bytes ) {
369
- case 1:
370
- {
371
- int8_t *p = ca_ptr_at_index(ca, idx);
372
- int8_t *q = ca_ptr_at_index(ca->parent, idx0);
373
- for (i=0; i<dim; i++) {
374
- *q = *p++;
375
- q += step;
376
- }
377
- }
378
- break;
379
- case 2:
380
- {
381
- int16_t *p = ca_ptr_at_index(ca, idx);
382
- int16_t *q = ca_ptr_at_index(ca->parent, idx0);
383
- for (i=0; i<dim; i++) {
384
- *q = *p++;
385
- q += step;
386
- }
387
- }
388
- break;
389
- case 4:
390
- {
391
- int32_t *p = ca_ptr_at_index(ca, idx);
392
- int32_t *q = ca_ptr_at_index(ca->parent, idx0);
393
- for (i=0; i<dim; i++) {
394
- *q = *p++;
395
- q += step;
396
- }
397
- }
398
- break;
399
- case 8:
400
- {
401
- float64_t *p = ca_ptr_at_index(ca, idx);
402
- float64_t *q = ca_ptr_at_index(ca->parent, idx0);
403
- for (i=0; i<dim; i++) {
404
- *q = *p++;
405
- q += step;
406
- }
407
- }
408
- break;
409
- default:
410
- {
411
- char *p = ca_ptr_at_index(ca, idx);
412
- char *q = ca_ptr_at_index(ca->parent, idx0);
413
- for (i=0; i<dim; i++) {
414
- memcpy(q, p, ca->bytes);
415
- p += ca->bytes;
416
- q += step * ca->bytes;
417
- }
418
- }
419
- }
420
- }
421
- else {
422
- for (i=0; i<dim; i++) {
423
- idx[level] = i;
424
- idx0[ca->ndim - 1 - level] = i;
425
- ca_fa_sync_loop(ca, level+1, idx, idx0);
426
- }
427
- }
428
- }
429
-
430
- static void
431
- ca_fa_sync (CAFarray *ca)
432
- {
433
- ca_size_t idx[CA_RANK_MAX];
434
- ca_size_t idx0[CA_RANK_MAX];
435
- ca_fa_sync_loop(ca, 0, idx, idx0);
436
- }
437
-
438
67
  /* ------------------------------------------------------------------- */
439
68
 
440
69
  VALUE
@@ -442,68 +71,52 @@ rb_ca_farray_new (VALUE cary)
442
71
  {
443
72
  volatile VALUE obj;
444
73
  CArray *parent;
445
- CAFarray *ca;
74
+ CAStride *ca;
446
75
  rb_check_carray_object(cary);
447
76
  TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
448
77
  ca = ca_farray_new(parent);
449
78
  obj = ca_wrap_struct(ca);
450
79
  rb_ca_set_parent(obj, cary);
451
- rb_ca_data_type_inherit(obj, cary);
452
80
  return obj;
453
81
  }
454
82
 
455
- /* yard:
456
- class CArray
457
- # create the virtual transposed array which dimension order is reversed.
458
- def t
459
- end
460
- end
461
- */
462
-
83
+ /* CArray#farray -- column-major view (dimension order reversed). */
463
84
  VALUE
464
85
  rb_ca_farray (VALUE self)
465
86
  {
466
87
  return rb_ca_farray_new(self);
467
88
  }
468
89
 
469
- static VALUE
470
- rb_ca_farray_s_allocate (VALUE klass)
471
- {
472
- CAFarray *ca;
473
- return TypedData_Make_Struct(klass, CAFarray, &cafarray_data_type, ca);
474
- }
475
-
476
90
  static VALUE
477
91
  rb_ca_farray_initialize_copy (VALUE self, VALUE other)
478
92
  {
479
- CAFarray *ca, *cs;
480
-
481
- TypedData_Get_Struct(self, CAFarray, &cafarray_data_type, ca);
482
- TypedData_Get_Struct(other, CAFarray, &cafarray_data_type, cs);
483
-
484
- ca_farray_setup(ca, cs->parent);
485
-
93
+ CAStride *ca, *cs;
94
+ TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
95
+ TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
96
+ if ( ca_func[CA_OBJ_FARRAY].pool_init ) {
97
+ ca_array_pool_alloc(ca, CA_OBJ_FARRAY, cs->ndim);
98
+ }
99
+ ca_stride_setup(ca, CA_OBJ_FARRAY, cs->parent,
100
+ cs->data_type, cs->bytes,
101
+ cs->ndim, cs->dim, cs->strides, cs->base_offset);
486
102
  return self;
487
103
  }
488
104
 
489
105
  void
490
- Init_ca_obj_farray ()
106
+ Init_ca_obj_farray (void)
491
107
  {
492
- rb_cCAFarray = rb_define_class("CAFarray", rb_cCAVirtual);
108
+ rb_cCAFarray = rb_define_class("CAFarray", rb_cCAStride);
493
109
  rb_cCAFarrayMask = rb_define_class("CAFarrayMask", rb_cCAFarray);
494
110
 
495
- CA_OBJ_FARRAY = ca_install_obj_type(rb_cCAFarray,
496
- &cafarray_data_type,
497
- rb_cCAFarrayMask,
498
- &cafarray_mask_data_type, ca_farray_func);
111
+ CA_OBJ_FARRAY = ca_install_obj_type(rb_cCAFarray,
112
+ &castride_data_type,
113
+ rb_cCAFarrayMask,
114
+ &castride_mask_data_type,
115
+ &ca_stride_func, sizeof(ca_stride_func));
499
116
  rb_define_const(rb_cObject, "CA_OBJ_FARRAY", INT2NUM(CA_OBJ_FARRAY));
500
117
 
501
118
  rb_define_method(rb_cCArray, "farray", rb_ca_farray, 0);
502
- rb_define_method(rb_cCArray, "t", rb_ca_farray, 0);
503
119
 
504
- rb_define_alloc_func(rb_cCAFarray, rb_ca_farray_s_allocate);
505
120
  rb_define_method(rb_cCAFarray, "initialize_copy",
506
121
  rb_ca_farray_initialize_copy, 1);
507
122
  }
508
-
509
-