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/lib/carray/mkmf.rb CHANGED
@@ -1,15 +1,10 @@
1
- # ----------------------------------------------------------------------------
2
- #
3
- # carray/mkmf.rb
4
- #
5
- # This file is part of Ruby/CArray extension library.
6
- #
7
- # Copyright (C) 2005-2025 Hiroki Motoyoshi
8
- #
9
- # ----------------------------------------------------------------------------
10
-
11
1
  require 'mkmf'
12
2
 
3
+ # Locates an installed Ruby/CArray and wires its header (and, on Windows,
4
+ # its import library) into the extension being configured. Call this at the
5
+ # top of a companion gem's `extconf.rb`.
6
+ #
7
+ # @return [Boolean] whether every required piece was found.
13
8
  def have_carray
14
9
  begin
15
10
  require 'carray'
@@ -18,28 +13,10 @@ def have_carray
18
13
  end
19
14
  $LOAD_PATH.each do |path|
20
15
  if File.exist? File.join(path, 'carray.h')
21
- dir_config("carray", path, path)
16
+ dir_config("carray", path, path)
22
17
  break
23
18
  end
24
19
  end
25
- =begin
26
- dir_config("carray", $sitearchdir, $sitearchdir)
27
- if defined? Gem
28
- if Gem::VERSION >= "1.7.0"
29
- begin
30
- Gem::Specification.find_all_by_name("carray").each do |spec|
31
- dir = spec.full_gem_path
32
- dir_config("carray", dir, dir)
33
- end
34
- rescue Gem::LoadError
35
- end
36
- else
37
- Gem.all_load_paths.grep(/narray/).each do |dir|
38
- dir_config("carray", dir, dir)
39
- end
40
- end
41
- end
42
- =end
43
20
  status = true
44
21
  status &= have_header("carray.h")
45
22
  if /cygwin|mingw/ =~ RUBY_PLATFORM
@@ -48,79 +25,25 @@ def have_carray
48
25
  status
49
26
  end
50
27
 
51
- def check_fortran
52
-
53
- SRC_EXT << "f" << "f90" << "f95"
54
-
55
- fortran = with_config("fortran", "gfortran")
56
- fflags = with_config("fflags", "")
57
-
58
- case fortran
59
- when /\Ag77/
60
- libdir = File.dirname(`#{fortran} --print-file-name=libg2c.a`)
61
- dir_config("g2c", possible_includes, [libdir]+possible_libs)
62
- have_library("g2c")
63
- fc = fortran
64
- fflags << " -O2 -g "
65
- when /\Agfortran/
66
- libdir = File.dirname(`#{fortran} --print-file-name=libgfortran.a`)
67
- dir_config("gfortran", possible_includes, [libdir]+possible_libs)
68
- have_library("gfortran")
69
- fc = fortran
70
- fflags << " -O2 -g -fPIC "
71
- when /\Aintel/, /\Aifort/, /\Aifc/
72
- libdir = File.join(File.dirname(File.dirname(`which ifort`)), "lib")
73
- dir_config("ifcore", possible_includes, [libdir]+possible_libs)
74
- have_library("ifcore")
75
- have_library("ifport")
76
- have_library("imf")
77
- have_library("irc")
78
- have_library("svml")
79
- have_library("unwind")
80
- fc = "ifort"
81
- fflags << " -O2 -fPIC "
82
- when /\Afujitsu/, /\Afrt/
83
- libdir = File.join(File.dirname(File.dirname(`which frt`)), "lib")
84
- dir_config("fj9f6", nil, libdir)
85
- $LIBS = " -lfj9i6 -lfj9f6"
86
- fc = "frt"
87
- fflags = " -O -fw "
88
- else
89
- puts "unknown fortran option <#{fortran}>"
90
- exit(1)
91
- end
92
- at_exit {
93
- if File.file?("Makefile")
94
- makefile = File.read("Makefile")
95
- unless makefile =~ /^FC=/
96
- makefile.sub!(/^COPY =.*$/,
97
- '\0' + "\n\n" +
98
- "FC=#{fc}\n" +
99
- "FFLAGS=#{fflags}\n")
100
- end
101
- open("Makefile", "w") { |io| io.write(makefile) }
102
- end
103
- }
104
-
105
- return "--with-fortran='#{fortran}' --with-fflags='#{fflags}'"
106
-
107
- end
108
-
28
+ # @!visibility private
109
29
  def possible_prefix (*postfixes)
110
30
  dirs = [
111
- File.expand_path("~/usr"), ### user's home / usr
112
- File.expand_path("~/local"), ### user's home / local
113
- File.expand_path("~"), ### user's home
114
- "/opt/local", ### MacPorts
115
- "/opt/homebrew", ### Homebrew
116
- "/opt", ### UNIX
117
- "/sw/local", ### Mac Fink
118
- "/sw/", ### Mac Fink
119
- "/usr/X11R6", ### UNIX X11
120
- "/usr/local", ### UNIX
121
- "/usr", ### UNIX
122
- "/" ### UNIX
123
- ]
31
+ ENV["CONDA_PREFIX"], ### active conda / mamba env
32
+ ENV["HOMEBREW_PREFIX"], ### Homebrew (non-standard install path)
33
+ File.expand_path("~/usr"), ### user's home / usr
34
+ File.expand_path("~/local"), ### user's home / local
35
+ File.expand_path("~/.local"), ### user's home / .local (XDG, pip --user)
36
+ File.expand_path("~"), ### user's home
37
+ "/opt/local", ### MacPorts
38
+ "/opt/homebrew", ### Homebrew (Apple Silicon)
39
+ "/opt", ### UNIX
40
+ "/sw/local", ### Mac Fink
41
+ "/sw/", ### Mac Fink
42
+ "/usr/X11R6", ### UNIX X11
43
+ "/usr/local", ### UNIX
44
+ "/usr", ### UNIX
45
+ "/" ### UNIX
46
+ ].compact
124
47
  if postfixes
125
48
  dirs = postfixes.inject(dirs) { |list, postfix|
126
49
  list + dirs.map{|d| File.join(d, postfix) }
@@ -129,8 +52,10 @@ def possible_prefix (*postfixes)
129
52
  return dirs.select{|d| File.directory?(d)}
130
53
  end
131
54
 
55
+ # @!visibility private
132
56
  POSSIBLE_PREFIX = possible_prefix()
133
57
 
58
+ # @!visibility private
134
59
  def possible_libs (*postfixes)
135
60
  dirs = possible_prefix().map{|prefix| File.join(prefix, "lib") }
136
61
  if postfixes
@@ -141,12 +66,110 @@ def possible_libs (*postfixes)
141
66
  return dirs.select{|d| File.directory?(d)}
142
67
  end
143
68
 
69
+ # @!visibility private
144
70
  def possible_includes (*postfixes)
145
71
  dirs = possible_prefix().map{|prefix| File.join(prefix, "include") }
146
72
  if postfixes
147
73
  dirs = postfixes.inject(dirs) { |list, postfix|
148
74
  list + dirs.map{|d| File.join(d, postfix) }
149
75
  }
150
- end
76
+ end
151
77
  return dirs.select{|d| File.directory?(d)}
152
78
  end
79
+
80
+ # Configure include/library search for a dependency, preferring its own
81
+ # build description over brute-force prefix probing.
82
+ #
83
+ # If the dependency ships a pkg-config file (`<pkg>.pc`), use it to obtain
84
+ # cflags / libs and stop. Otherwise fall back to scanning possible_includes
85
+ # / possible_libs (the only option for hand-rolled scientific libraries
86
+ # that do not provide a `.pc` file, e.g. nn / ngmath / FITPACK).
87
+ #
88
+ # carray_dir_config("gsl") # gsl.pc -> done
89
+ # carray_dir_config("nn") # no .pc -> possible_* probe
90
+ # carray_dir_config("foo", "libfoo") # search foo.pc / libfoo.pc as "libfoo"
91
+ #
92
+ def carray_dir_config (name, pkg = name)
93
+ return true if pkg_config(pkg)
94
+ dir_config(name, possible_includes, possible_libs)
95
+ true
96
+ end
97
+
98
+ # --- pluggable Fortran backend registry
99
+ #
100
+ # CArray no longer tries to enumerate every Fortran compiler. Only
101
+ # gfortran ships out of the box. A companion gem (or a user's extconf)
102
+ # that needs another compiler registers a backend *before* calling
103
+ # check_fortran:
104
+ #
105
+ # register_fortran_backend(/ifx|ifort/) do |fc|
106
+ # libdir = ... # locate the runtime
107
+ # dir_config("ifcore", possible_includes, [libdir] + possible_libs)
108
+ # have_library("ifcore")
109
+ # end
110
+ # check_fortran("--with-fortran=ifx")
111
+ #
112
+ # A backend receives the compiler command and is responsible only for
113
+ # linking that compiler's runtime library (dir_config + have_library).
114
+ #
115
+ # @!visibility private
116
+ FORTRAN_BACKENDS = {}
117
+
118
+ # Registers a Fortran runtime backend for {check_fortran} to pick up. Only
119
+ # gfortran ships out of the box; a companion gem that needs another compiler
120
+ # registers its own before calling {check_fortran}. The block receives the
121
+ # compiler command and is responsible only for linking that compiler's
122
+ # runtime library (`dir_config` + `have_library`).
123
+ #
124
+ # @param pattern [Regexp] matched against the configured compiler command.
125
+ # @yieldparam fc [String] the compiler command.
126
+ # @return [void]
127
+ def register_fortran_backend (pattern, &block)
128
+ FORTRAN_BACKENDS[pattern] = block
129
+ end
130
+
131
+ # gfortran: the one compiler CArray supports out of the box.
132
+ register_fortran_backend(/gfortran/) do |fc|
133
+ libdir = File.dirname(`#{fc} --print-file-name=libgfortran.a`.strip)
134
+ dir_config("gfortran", possible_includes, [libdir] + possible_libs)
135
+ have_library("gfortran")
136
+ end
137
+
138
+ # Configures the extension to compile Fortran sources, selecting the compiler
139
+ # from `--with-fortran` (default `gfortran`) and its flags from
140
+ # `--with-fflags`. The matching backend registered by
141
+ # {register_fortran_backend} links that compiler's runtime; an unmatched
142
+ # compiler warns and leaves the runtime to `LIBS` / `--with-fflags`.
143
+ #
144
+ # @return [void]
145
+ def check_fortran
146
+
147
+ SRC_EXT << "f" << "f90" << "f95"
148
+
149
+ fc = with_config("fortran", "gfortran")
150
+ fflags = with_config("fflags", "-O2 -g -fPIC")
151
+
152
+ _pattern, backend = FORTRAN_BACKENDS.find { |pat, _| pat =~ fc }
153
+ if backend
154
+ backend.call(fc)
155
+ else
156
+ warn "carray/mkmf: no backend for fortran '#{fc}'; " \
157
+ "register one with register_fortran_backend or pass the " \
158
+ "runtime via LIBS / --with-fflags"
159
+ end
160
+
161
+ at_exit do
162
+ if File.file?("Makefile")
163
+ makefile = File.read("Makefile")
164
+ unless makefile =~ /^FC=/
165
+ makefile.sub!(/^COPY =.*$/,
166
+ '\0' + "\n\n" +
167
+ "FC=#{fc}\n" +
168
+ "FFLAGS=#{fflags}\n")
169
+ end
170
+ File.write("Makefile", makefile)
171
+ end
172
+ end
173
+
174
+ return fc
175
+ end
@@ -0,0 +1,89 @@
1
+ # Load-bearing Ruby support that the core depends on at run time. Unlike
2
+ # carray/basics.rb (convenience methods kept eager merely because they are
3
+ # frequent), the definitions here are NOT optional: removing or lazy-loading
4
+ # them breaks core behaviour. Keep this file eager-loaded.
5
+
6
+ class CArray
7
+
8
+ # String fallback for the global cast functions CA_INT32(data) etc. The C
9
+ # dispatcher (ext/carray_cast.c) handles every other input class in C and
10
+ # delegates only String here, because the whitespace / `,` / `;` /
11
+ # `_`->UNDEF parser is far more natural (and maintainable) in Ruby.
12
+ # +type+ arrives as the data_type Symbol. Required: without it
13
+ # +CA_INT32("1 2 3")+ and friends raise.
14
+ def self.__cast_string__ (type, v) # :nodoc:
15
+ if type == CA_OBJECT
16
+ return CScalar.new(CA_OBJECT) { v }
17
+ elsif type == CA_BOOLEAN
18
+ v = v.dup
19
+ v.tr!('^01',"1")
20
+ v.tr!('01',"\x0\x1")
21
+ return CArray.boolean(v.length).load_binary(v)
22
+ else
23
+ case v
24
+ when /;/
25
+ v = v.strip.split(/\s*;\s*/).
26
+ map{|s| s.split(/\s+|\s*,\s*/).map{|x| x=='_' ? UNDEF : x} }
27
+ else
28
+ v = v.strip.split(/\s+|\s*,\s*/).map{|x| x=='_' ? UNDEF : x}
29
+ end
30
+ return CArray.new(type, CArray.guess_array_shape(v)).tap { |a| a[] = v }
31
+ end
32
+ end
33
+ private_class_method :__cast_string__
34
+
35
+ # CA_OBJECT escape for the weighted-sum kernel (mkkernel object_escape:).
36
+ # The C dispatcher (carray_kernels.c rb_ca_wsum_ki) intercepts CA_OBJECT
37
+ # source and forwards here verbatim, because a per-cell object weighted sum
38
+ # is more naturally (and exactly, for Rational / BigDecimal weights) a
39
+ # +(self * weights).sum+ composition than a dedicated :object kernel branch.
40
+ #
41
+ # +weights+ is a Ruby Numeric scalar (W-A1) or a same-shape CArray; the 1-D
42
+ # axis-broadcast form (W-A2) is not supported for object weights (pass a
43
+ # scalar or a full-shape weight), matching CArray's explicit-broadcast rule.
44
+ # +opts+ is the trailing options Hash (axis:/keep_axis:/min_count:/
45
+ # fill_value:) forwarded verbatim by the C escape; it goes straight to +sum+.
46
+ def __wsum_object__ (weights, opts = {}) # :nodoc:
47
+ (self * weights).sum(**opts)
48
+ end
49
+ private :__wsum_object__
50
+
51
+ # CA_OBJECT escape for the weighted-mean kernel. Weighted mean is
52
+ # +Σ(w*v) / Σw+ over the cells valid after mask overlay (a masked value OR a
53
+ # masked weight drops the cell from BOTH sums). The denominator is guarded:
54
+ # an empty / all-masked slab or weights summing to zero yields UNDEF (the
55
+ # object analogue of the numeric kernel's 0/0 -> NaN, since objects have no
56
+ # NaN). Weight forms and +opts+ as in {#__wsum_object__}.
57
+ def __wmean_object__ (weights, opts = {}) # :nodoc:
58
+ axis = opts[:axis]
59
+ keep_axis = opts[:keep_axis]
60
+ prod = self * weights
61
+ wv = (weights.is_a?(CArray) ? weights : self * 0 + weights).copy
62
+ wv[prod.is_masked] = UNDEF if prod.has_mask?
63
+ nopt = { axis: axis, keep_axis: keep_axis }
64
+ nopt[:min_count] = opts[:min_count] unless opts[:min_count].nil?
65
+ num = prod.sum(**nopt)
66
+ den = wv.sum(axis: axis, keep_axis: keep_axis)
67
+ result =
68
+ if axis
69
+ den = den.copy
70
+ den[den.eq(0)] = UNDEF # zero / empty denominator -> undetermined
71
+ num / den # UNDEF propagates cell-wise
72
+ elsif den.equal?(UNDEF) || den == 0
73
+ UNDEF
74
+ else
75
+ num / den
76
+ end
77
+ fill_value = opts[:fill_value]
78
+ return result if fill_value.nil?
79
+ if result.is_a?(CArray)
80
+ result[result.is_masked] = fill_value if result.has_mask?
81
+ result
82
+ else
83
+ result.equal?(UNDEF) ? fill_value : result
84
+ end
85
+ end
86
+ private :__wmean_object__
87
+
88
+ end
89
+