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_mapping.c DELETED
@@ -1,644 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- ca_obj_mapping.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
- /*
12
- CAMapping
13
- * index array should not have mask
14
- * index array's value should be within the range of the referred array's index
15
- */
16
-
17
- #include "carray.h"
18
-
19
- typedef struct {
20
- int16_t obj_type;
21
- int8_t data_type;
22
- int8_t ndim;
23
- int32_t flags;
24
- ca_size_t bytes;
25
- ca_size_t elements;
26
- ca_size_t *dim;
27
- char *ptr;
28
- CArray *mask;
29
- CArray *parent;
30
- uint32_t attach;
31
- uint8_t nosync;
32
- /* -------------*/
33
- CArray *mapper;
34
- } CAMapping;
35
-
36
- const rb_data_type_t camapping_data_type = {
37
- .parent = &cavirtual_data_type,
38
- .wrap_struct_name = "CAMapping",
39
- .function = {
40
- .dmark = ca_mark,
41
- .dfree = ca_free,
42
- .dsize = NULL,
43
- .dcompact = NULL
44
- },
45
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
46
- };
47
-
48
- const rb_data_type_t camapping_mask_data_type = {
49
- .parent = &camapping_data_type,
50
- .wrap_struct_name = "CAMappingMask",
51
- .function = {
52
- .dmark = NULL,
53
- .dfree = ca_free_nop,
54
- .dsize = NULL,
55
- .dcompact = NULL
56
- },
57
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
58
- };
59
-
60
- static int8_t CA_OBJ_MAPPING;
61
-
62
- VALUE rb_cCAMapping;
63
- VALUE rb_cCAMappingMask;
64
-
65
- /* yard:
66
- class CAMapping < CAVirtual # :nodoc:
67
- end
68
- */
69
-
70
- /* ------------------------------------------------------------------- */
71
-
72
- int
73
- ca_mapping_setup (CAMapping *ca, CArray *parent, CArray *mapper, int share)
74
- {
75
- int8_t ndim, data_type;
76
- ca_size_t elements, bytes;
77
- ca_size_t *p;
78
- ca_size_t i;
79
-
80
- ca_check_type(mapper, CA_SIZE);
81
-
82
- data_type = parent->data_type;
83
- bytes = parent->bytes;
84
-
85
- ca->obj_type = CA_OBJ_MAPPING;
86
- ca->data_type = data_type;
87
- ca->flags = 0;
88
-
89
- ca->bytes = bytes;
90
- ca->ptr = NULL;
91
-
92
- ndim = mapper->ndim;
93
- elements = mapper->elements;
94
-
95
- ca->ndim = ndim;
96
- ca->elements = elements;
97
- ca->mask = NULL;
98
- ca->dim = ALLOC_N(ca_size_t, ndim);
99
-
100
- ca->parent = parent;
101
- ca->attach = 0;
102
- ca->nosync = 0;
103
-
104
- memcpy(ca->dim, mapper->dim, ndim * sizeof(ca_size_t));
105
-
106
- if ( share ) {
107
- ca_set_flag(ca, CA_FLAG_SHARE_INDEX);
108
- ca->mapper = mapper;
109
- }
110
- else {
111
- if ( ca_is_any_masked(mapper) ) {
112
- rb_raise(rb_eArgError, "mapper in ca[mapper] should not be masked");
113
- }
114
- else {
115
- ca->mapper = ca_copy(mapper);
116
- }
117
- }
118
-
119
- if ( ca_has_mask(parent) ) {
120
- ca_create_mask(ca);
121
- }
122
-
123
- p = (ca_size_t*)ca->mapper->ptr;
124
- for (i=0; i<ca->elements; i++) {
125
- CA_CHECK_INDEX(*p, parent->elements);
126
- p++;
127
- }
128
-
129
- if ( ca->elements == 1 && ca_is_scalar(mapper) ) {
130
- ca_set_flag(ca, CA_FLAG_SCALAR);
131
- }
132
-
133
- return 0;
134
- }
135
-
136
- CAMapping *
137
- ca_mapping_new (CArray *parent, CArray *mapper)
138
- {
139
- CAMapping *ca = ALLOC(CAMapping);
140
- ca_mapping_setup(ca, parent, mapper, 0);
141
- return ca;
142
- }
143
-
144
- CAMapping *
145
- ca_mapping_new_share (CArray *parent, CArray *mapper)
146
- {
147
- CAMapping *ca = ALLOC(CAMapping);
148
- ca_mapping_setup(ca, parent, mapper, 1);
149
- return ca;
150
- }
151
-
152
- static void
153
- free_ca_mapping (void *ap)
154
- {
155
- CAMapping *ca = (CAMapping *) ap;
156
- if ( ca != NULL ) {
157
- ca_free(ca->mask);
158
- if ( ! (ca->flags & CA_FLAG_SHARE_INDEX) ) {
159
- ca_free(ca->mapper);
160
- }
161
- xfree(ca->dim);
162
- xfree(ca);
163
- }
164
- }
165
-
166
- static void ca_mapping_attach (CAMapping *ca);
167
- static void ca_mapping_sync (CAMapping *ca);
168
- static void ca_mapping_fill (CAMapping *ca, char *ptr);
169
-
170
- /* ------------------------------------------------------------------- */
171
-
172
- static void *
173
- ca_mapping_func_clone (void *ap)
174
- {
175
- CAMapping *ca = (CAMapping *) ap;
176
- return ca_mapping_new_share(ca->parent, ca->mapper);
177
- }
178
-
179
- static char *
180
- ca_mapping_func_ptr_at_addr (void *ap, ca_size_t addr)
181
- {
182
- CAMapping *ca = (CAMapping *) ap;
183
- if ( ! ca->ptr ) {
184
- ca_size_t idx[CA_RANK_MAX];
185
- ca_addr2index((CArray *)ca, addr, idx);
186
- return ca_ptr_at_index(ca, idx);
187
- }
188
- else {
189
- return ca->ptr + ca->bytes * addr;
190
- }
191
- }
192
-
193
- static char *
194
- ca_mapping_func_ptr_at_index (void *ap, ca_size_t *idx)
195
- {
196
- CAMapping *ca = (CAMapping *) ap;
197
- if ( ! ca->ptr ) {
198
- ca_size_t *dim = ca->dim;
199
- int8_t i;
200
- ca_size_t n;
201
- n = idx[0];
202
- for (i=1; i<ca->ndim; i++) {
203
- n = dim[i]*n+idx[i];
204
- }
205
- n = *(ca_size_t*) ca_ptr_at_addr(ca->mapper, n);
206
- if ( ca->parent->ptr == NULL ) {
207
- return ca_ptr_at_addr(ca->parent, n);
208
- }
209
- else {
210
- return ca->parent->ptr + ca->bytes * n;
211
- }
212
- }
213
- else {
214
- return ca_func[CA_OBJ_ARRAY].ptr_at_index(ca, idx);
215
- }
216
- }
217
-
218
- static void
219
- ca_mapping_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
220
- {
221
- CAMapping *ca = (CAMapping *) ap;
222
- ca_size_t *dim = ca->dim;
223
- int8_t i;
224
- ca_size_t n;
225
- n = idx[0];
226
- for (i=1; i<ca->ndim; i++) {
227
- n = dim[i]*n+idx[i];
228
- }
229
- n = *(ca_size_t*) ca_ptr_at_addr(ca->mapper, n);
230
- ca_fetch_addr(ca->parent, n, ptr);
231
- }
232
-
233
- static void
234
- ca_mapping_func_store_index (void *ap, ca_size_t *idx, void *ptr)
235
- {
236
- CAMapping *ca = (CAMapping *) ap;
237
- ca_size_t *dim = ca->dim;
238
- int8_t i;
239
- ca_size_t n;
240
- n = idx[0];
241
- for (i=1; i<ca->ndim; i++) {
242
- n = dim[i]*n+idx[i];
243
- }
244
- n = *(ca_size_t*) ca_ptr_at_addr(ca->mapper, n);
245
- ca_store_addr(ca->parent, n, ptr);
246
- }
247
-
248
- static void
249
- ca_mapping_func_allocate (void *ap)
250
- {
251
- CAMapping *ca = (CAMapping *) ap;
252
- ca_attach(ca->parent);
253
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
254
- ca->ptr = malloc_with_check(ca_length(ca));
255
- }
256
-
257
- static void
258
- ca_mapping_func_attach (void *ap)
259
- {
260
- CAMapping *ca = (CAMapping *) ap;
261
- ca_attach(ca->parent);
262
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
263
- ca->ptr = malloc_with_check(ca_length(ca));
264
- ca_mapping_attach(ca);
265
- }
266
-
267
- static void
268
- ca_mapping_func_sync (void *ap)
269
- {
270
- CAMapping *ca = (CAMapping *) ap;
271
- ca_mapping_sync(ca);
272
- ca_sync(ca->parent);
273
- }
274
-
275
- static void
276
- ca_mapping_func_detach (void *ap)
277
- {
278
- CAMapping *ca = (CAMapping *) ap;
279
- free(ca->ptr);
280
- ca->ptr = NULL;
281
- ca_detach(ca->parent);
282
- }
283
-
284
- static void
285
- ca_mapping_func_copy_data (void *ap, void *ptr)
286
- {
287
- CAMapping *ca = (CAMapping *) ap;
288
- char *ptr0 = ca->ptr;
289
- ca_attach(ca->parent);
290
- ca->ptr = ptr;
291
- ca_mapping_attach(ca);
292
- ca->ptr = ptr0;
293
- ca_detach(ca->parent);
294
- }
295
-
296
- static void
297
- ca_mapping_func_sync_data (void *ap, void *ptr)
298
- {
299
- CAMapping *ca = (CAMapping *) ap;
300
- char *ptr0 = ca->ptr;
301
- ca_attach(ca->parent);
302
- ca->ptr = ptr;
303
- ca_mapping_sync(ca);
304
- ca->ptr = ptr0;
305
- ca_sync(ca->parent);
306
- ca_detach(ca->parent);
307
- }
308
-
309
- static void
310
- ca_mapping_func_fill_data (void *ap, void *ptr)
311
- {
312
- CAMapping *ca = (CAMapping *) ap;
313
- ca_attach(ca->parent);
314
- ca_mapping_fill(ca, ptr);
315
- ca_sync(ca->parent);
316
- ca_detach(ca->parent);
317
- }
318
-
319
- static void
320
- ca_mapping_func_create_mask (void *ap)
321
- {
322
- CAMapping *ca = (CAMapping *) ap;
323
-
324
- ca_update_mask(ca->parent);
325
- if ( ! ca->parent->mask ) {
326
- ca_create_mask(ca->parent);
327
- }
328
-
329
- ca->mask = (CArray *) ca_mapping_new_share(ca->parent->mask, ca->mapper);
330
-
331
- return;
332
- }
333
-
334
- ca_operation_function_t ca_mapping_func = {
335
- -1, /* CA_OBJ_MAPPING */
336
- CA_VIRTUAL_ARRAY,
337
- free_ca_mapping,
338
- ca_mapping_func_clone,
339
- ca_mapping_func_ptr_at_addr,
340
- ca_mapping_func_ptr_at_index,
341
- NULL,
342
- ca_mapping_func_fetch_index,
343
- NULL,
344
- ca_mapping_func_store_index,
345
- ca_mapping_func_allocate,
346
- ca_mapping_func_attach,
347
- ca_mapping_func_sync,
348
- ca_mapping_func_detach,
349
- ca_mapping_func_copy_data,
350
- ca_mapping_func_sync_data,
351
- ca_mapping_func_fill_data,
352
- ca_mapping_func_create_mask,
353
- };
354
-
355
- /* ------------------------------------------------------------------- */
356
-
357
- static void
358
- ca_mapping_attach (CAMapping *ca)
359
- {
360
- ca_size_t *ip = (ca_size_t*) ca_ptr_at_addr(ca->mapper, 0);
361
- ca_size_t i;
362
-
363
- #define proc_mapping_attach(type) \
364
- { \
365
- type *p = (type*)ca_ptr_at_addr(ca, 0); \
366
- type *q = (type*)ca_ptr_at_addr(ca->parent, 0); \
367
- for (i=0; i<ca->elements; i++) { \
368
- *(p+i) = *(q+(*(ip+i))); \
369
- } \
370
- }
371
-
372
- switch ( ca->bytes ) {
373
- case 1:
374
- {
375
- int8_t *p = (int8_t *)ca_ptr_at_addr(ca, 0);
376
- int8_t *q = (int8_t *)ca_ptr_at_addr(ca->parent, 0);
377
- #ifdef _OPENMP
378
- #pragma omp parallel for
379
- #endif
380
- for (i=0; i<ca->elements; i++) {
381
- *(p+i) = *(q+(*(ip+i)));
382
- }
383
- break;
384
- }
385
- case 2:
386
- {
387
- int16_t *p = (int16_t *)ca_ptr_at_addr(ca, 0);
388
- int16_t *q = (int16_t *)ca_ptr_at_addr(ca->parent, 0);
389
- #ifdef _OPENMP
390
- #pragma omp parallel for
391
- #endif
392
- for (i=0; i<ca->elements; i++) {
393
- *(p+i) = *(q+(*(ip+i)));
394
- }
395
- break;
396
- }
397
- case 4:
398
- {
399
- int32_t *p = (int32_t *)ca_ptr_at_addr(ca, 0);
400
- int32_t *q = (int32_t *)ca_ptr_at_addr(ca->parent, 0);
401
- #ifdef _OPENMP
402
- #pragma omp parallel for
403
- #endif
404
- for (i=0; i<ca->elements; i++) {
405
- *(p+i) = *(q+(*(ip+i)));
406
- }
407
- break;
408
- }
409
- case 8:
410
- {
411
- float64_t *p = (float64_t *)ca_ptr_at_addr(ca, 0);
412
- float64_t *q = (float64_t *)ca_ptr_at_addr(ca->parent, 0);
413
- #ifdef _OPENMP
414
- #pragma omp parallel for
415
- #endif
416
- for (i=0; i<ca->elements; i++) {
417
- *(p+i) = *(q+(*(ip+i)));
418
- }
419
- break;
420
- }
421
- default:
422
- {
423
- char *p = ca_ptr_at_addr(ca, 0);
424
- char *q = ca_ptr_at_addr(ca->parent, 0);
425
- #ifdef _OPENMP
426
- #pragma omp parallel for
427
- #endif
428
- for (i=0; i<ca->elements; i++) {
429
- memcpy(p + i * ca->bytes, q + (*(ip+i)) * ca->bytes, ca->bytes);
430
- }
431
- }
432
- }
433
- }
434
-
435
- static void
436
- ca_mapping_sync (CAMapping *ca)
437
- {
438
- ca_size_t *ip = (ca_size_t*) ca_ptr_at_addr(ca->mapper, 0);
439
- ca_size_t i;
440
-
441
- switch ( ca->bytes ) {
442
- case 1:
443
- {
444
- int8_t *p = (int8_t *)ca_ptr_at_addr(ca, 0);
445
- int8_t *q = (int8_t *)ca_ptr_at_addr(ca->parent, 0);
446
- #ifdef _OPENMP
447
- #pragma omp parallel for
448
- #endif
449
- for (i=0; i<ca->elements; i++) {
450
- *(q+*(ip+i)) = *(p+i);
451
- }
452
- break;
453
- }
454
- case 2:
455
- {
456
- int16_t *p = (int16_t *)ca_ptr_at_addr(ca, 0);
457
- int16_t *q = (int16_t *)ca_ptr_at_addr(ca->parent, 0);
458
- #ifdef _OPENMP
459
- #pragma omp parallel for
460
- #endif
461
- for (i=0; i<ca->elements; i++) {
462
- *(q+*(ip+i)) = *(p+i);
463
- }
464
- break;
465
- }
466
- case 4:
467
- {
468
- int32_t *p = (int32_t *)ca_ptr_at_addr(ca, 0);
469
- int32_t *q = (int32_t *)ca_ptr_at_addr(ca->parent, 0);
470
- #ifdef _OPENMP
471
- #pragma omp parallel for
472
- #endif
473
- for (i=0; i<ca->elements; i++) {
474
- *(q+*(ip+i)) = *(p+i);
475
- }
476
- break;
477
- }
478
- case 8:
479
- {
480
- float64_t *p = (float64_t *)ca_ptr_at_addr(ca, 0);
481
- float64_t *q = (float64_t *)ca_ptr_at_addr(ca->parent, 0);
482
- #ifdef _OPENMP
483
- #pragma omp parallel for
484
- #endif
485
- for (i=0; i<ca->elements; i++) {
486
- *(q+*(ip+i)) = *(p+i);
487
- }
488
- break;
489
- }
490
- default:
491
- {
492
- char *p = ca_ptr_at_addr(ca, 0);
493
- char *q = ca_ptr_at_addr(ca->parent, 0);
494
- #ifdef _OPENMP
495
- #pragma omp parallel for
496
- #endif
497
- for (i=0; i<ca->elements; i++) {
498
- memcpy(q + (*(ip+i)) * ca->bytes, p + i * ca->bytes, ca->bytes);
499
- }
500
- }
501
- }
502
- }
503
-
504
- static void
505
- ca_mapping_fill (CAMapping *ca, char *ptr)
506
- {
507
- ca_size_t *ip = (ca_size_t*) ca_ptr_at_addr(ca->mapper, 0);
508
- ca_size_t i;
509
-
510
- switch ( ca->bytes ) {
511
- case 1:
512
- {
513
- int8_t *q = (int8_t *)ca_ptr_at_addr(ca->parent, 0);
514
- int8_t fval = *(int8_t *)ptr;
515
- #ifdef _OPENMP
516
- #pragma omp parallel for
517
- #endif
518
- for (i=0; i<ca->elements; i++) {
519
- *(q+*(ip+i)) = fval;
520
- }
521
- break;
522
- }
523
- case 2:
524
- {
525
- int16_t *q = (int16_t *)ca_ptr_at_addr(ca->parent, 0);
526
- int16_t fval = *(int16_t *)ptr;
527
- #ifdef _OPENMP
528
- #pragma omp parallel for
529
- #endif
530
- for (i=0; i<ca->elements; i++) {
531
- *(q+*(ip+i)) = fval;
532
- }
533
- break;
534
- }
535
- case 4:
536
- {
537
- int32_t *q = (int32_t *)ca_ptr_at_addr(ca->parent, 0);
538
- int32_t fval = *(int32_t *)ptr;
539
- #ifdef _OPENMP
540
- #pragma omp parallel for
541
- #endif
542
- for (i=0; i<ca->elements; i++) {
543
- *(q+*(ip+i)) = fval;
544
- }
545
- break;
546
- }
547
- case 8:
548
- {
549
- float64_t *q = (float64_t *)ca_ptr_at_addr(ca->parent, 0);
550
- float64_t fval = *(float64_t *)ptr;
551
- #ifdef _OPENMP
552
- #pragma omp parallel for
553
- #endif
554
- for (i=0; i<ca->elements; i++) {
555
- *(q+*(ip+i)) = fval;
556
- }
557
- break;
558
- }
559
- default:
560
- {
561
- char *q = ca_ptr_at_addr(ca->parent, 0);
562
- #ifdef _OPENMP
563
- #pragma omp parallel for
564
- #endif
565
- for (i=0; i<ca->elements; i++) {
566
- memcpy(q + (*(ip+i)) * ca->bytes, ptr, ca->bytes);
567
- }
568
- }
569
- }
570
- }
571
-
572
- /* ------------------------------------------------------------------- */
573
-
574
- VALUE
575
- rb_ca_mapping_new (VALUE cary, CArray *mapper)
576
- {
577
- volatile VALUE obj;
578
- CArray *parent;
579
- CAMapping *ca;
580
- rb_check_carray_object(cary);
581
- TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
582
- ca = ca_mapping_new(parent, mapper);
583
- obj = ca_wrap_struct(ca);
584
- rb_ca_set_parent(obj, cary);
585
- rb_ca_data_type_inherit(obj, cary);
586
- return obj;
587
- }
588
-
589
- VALUE
590
- rb_ca_mapping (int argc, VALUE *argv, VALUE self)
591
- {
592
- volatile VALUE rmapper;
593
- volatile VALUE obj;
594
- CArray *ca;
595
- CArray *mapper;
596
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
597
-
598
- rb_scan_args(argc, argv, "1", (VALUE *) &rmapper);
599
- rb_check_carray_object(rmapper);
600
-
601
- mapper = ca_wrap_readonly(rmapper, CA_SIZE);
602
-
603
- obj = rb_ca_mapping_new(self, mapper);
604
-
605
- return obj;
606
- }
607
-
608
- static VALUE
609
- rb_ca_mapping_s_allocate (VALUE klass)
610
- {
611
- CAMapping *ca;
612
- return TypedData_Make_Struct(klass, CAMapping, &camapping_data_type, ca);
613
- }
614
-
615
- static VALUE
616
- rb_ca_mapping_initialize_copy (VALUE self, VALUE other)
617
- {
618
- CAMapping *ca, *cs;
619
-
620
- TypedData_Get_Struct(self, CAMapping, &camapping_data_type, ca);
621
- TypedData_Get_Struct(other, CAMapping, &camapping_data_type, cs);
622
-
623
- /* share mapper info */
624
- ca_mapping_setup(ca, cs->parent, cs->mapper, 1);
625
-
626
- return self;
627
- }
628
-
629
- void
630
- Init_ca_obj_mapping ()
631
- {
632
- rb_cCAMapping = rb_define_class("CAMapping", rb_cCAVirtual);
633
- rb_cCAMappingMask = rb_define_class("CAMappingMask", rb_cCAMapping);
634
-
635
- CA_OBJ_MAPPING = ca_install_obj_type(rb_cCAMapping,
636
- &camapping_data_type,
637
- rb_cCAMappingMask,
638
- &camapping_mask_data_type, ca_mapping_func);
639
- rb_define_const(rb_cObject, "CA_OBJ_MAPPING", INT2NUM(CA_OBJ_MAPPING));
640
-
641
- rb_define_alloc_func(rb_cCAMapping, rb_ca_mapping_s_allocate);
642
- rb_define_method(rb_cCAMapping, "initialize_copy",
643
- rb_ca_mapping_initialize_copy, 1);
644
- }