carray 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
data/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-2020 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,108 @@
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
+
90
+ class CAUnboundRepeat
91
+ # Overrides {CArray#template} for unbound-repeat views.
92
+ #
93
+ # The C-level `CArray#template` allocates an entity sized to `self.shape`,
94
+ # which for a CAUnboundRepeat would include the inflated unbound (`:*`)
95
+ # axes — semantically wrong (unbound axes are not yet bound to a size)
96
+ # and a memory bomb on broadcast patterns. Required for correctness.
97
+ #
98
+ # This override allocates at the **parent's compact shape** instead, then
99
+ # rewraps the result with the same `spec` so the returned view preserves
100
+ # the unbound broadcast pattern.
101
+ #
102
+ # @param argv [Array] forwarded to {CArray#template} (data_type, bytes:, ...)
103
+ # @yield forwarded to {CArray#template}
104
+ # @return [CAUnboundRepeat] new entity wrapped with the original unbound spec
105
+ def template (*argv, &block)
106
+ return parent.template(*argv,&block)[*spec.map{|x| x != :* ? nil : x}]
107
+ end
108
+ end