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/extconf.rb CHANGED
@@ -38,11 +38,6 @@ end
38
38
 
39
39
  # --- ruby version code ---
40
40
 
41
- major = RbConfig::CONFIG['MAJOR'].to_i
42
- minor = RbConfig::CONFIG['MINOR'].to_i
43
- teeny = RbConfig::CONFIG['TEENY'].to_i
44
- RUBY_VERSION_CODE = major * 100 + minor * 10 + teeny
45
- $defs.push "-DRUBY_VERSION_CODE=#{RUBY_VERSION_CODE}"
46
41
 
47
42
  # --- add option "--sitelibdir=dir" ---
48
43
 
@@ -66,7 +61,119 @@ end
66
61
 
67
62
  # --- seting $CFLAGS
68
63
 
69
- $CFLAGS += " -Wall -O2"
64
+ $CFLAGS += " -Wall"
65
+
66
+ # --- the flags that decide the numbers
67
+ #
68
+ # Two compilations of the same C do not have to agree on the last bit: what
69
+ # the compiler is allowed to fuse or reorder is decided by the flags it was
70
+ # given. Anything computing what these kernels compute, somewhere other
71
+ # than in them, has to be built the same way to arrive at the same answer,
72
+ # so the flags that bear on it are recorded and handed out as
73
+ # CArray::BUILD_FLAGS. Optimisation and architecture only -- warnings,
74
+ # defines and link options change nothing about the arithmetic.
75
+ $carray_build_flags = [RbConfig::CONFIG["optflags"].to_s.strip]
76
+
77
+ # --- in-build flag (CARRAY_BUILD)
78
+ #
79
+ # Marks a translation unit as part of carray itself, i.e. recompiled whenever
80
+ # ext/*.h changes. carray.h uses it to hand out the inline form of accessors
81
+ # that depend on struct layout (ca_is_entity indexes ca_func[], whose stride
82
+ # is sizeof(ca_operation_function_t)). Extensions built separately get the
83
+ # out-of-line form instead, so adding an operation-table slot cannot silently
84
+ # re-index the table underneath them.
85
+ #
86
+ # The fixtures under spec/spec_ai/ext_* deliberately do NOT set this -- they
87
+ # stand in for external extensions and should exercise the same surface.
88
+ #
89
+ # See devel/PROPOSAL_PARTIAL_FILL_WHOLE_ROOT_WRITEBACK.md section 6.1
90
+ #
91
+ $CFLAGS += " -DCARRAY_BUILD"
92
+
93
+ # --- dev-only build flag (CARRAY_DEV_BUILD)
94
+ #
95
+ # When `--enable-dev-build` is passed (or `rake build_ext` is invoked with
96
+ # CARRAY_DEV=1), define CARRAY_DEV_BUILD. This unlocks the smoke surface
97
+ # in ext/*.c (gated by #ifdef CARRAY_DEV_BUILD at the tail of each file
98
+ # + Init_ registration block) so spec_ai regression pins can run.
99
+ #
100
+ # Release builds (default) leave CARRAY_DEV_BUILD undefined → smoke fences
101
+ # compile to nothing → user-facing binary has no smoke API exposed.
102
+ #
103
+ # See devel/PROPOSAL_SMOKE_DEV_BUILD_GATE.md
104
+ #
105
+ if enable_config("dev-build", false)
106
+ $CFLAGS += " -DCARRAY_DEV_BUILD"
107
+ $stderr.puts "carray: CARRAY_DEV_BUILD enabled (smoke surface available)"
108
+ end
109
+
110
+ # --- probe for `-fopenmp-simd` (SL.1.0, PROPOSAL_REDUCTION_SIMD_LICENSE)
111
+ #
112
+ # `-fopenmp-simd` enables `#pragma omp simd` (and its `reduction(+:acc)`
113
+ # clause) without pulling in libomp. Used by SL.1.1+ contig-branch
114
+ # variants in CA_SLAB_REDUCE_T_{PLUS,MIN,MAX,STAR,VAR}_EX to let
115
+ # the compiler reassoc the reduction accumulator into SIMD lanes
116
+ # (worth ~5-8x on f64 reduction hot paths, per PoC bench 2026-06-12).
117
+ #
118
+ # - Apple clang / gcc 4.9+ / clang 3.9+ : supported.
119
+ # - MSVC / older compilers : probe fails, flag omitted,
120
+ # pragma silently ignored,
121
+ # code stays correct (graceful).
122
+ #
123
+ # Q1 closure (sparring round 1 2026-06-12): (A) try_compile.
124
+ #
125
+ simd_probe = <<~C
126
+ int main(void) {
127
+ double x = 0;
128
+ #pragma omp simd reduction(+:x)
129
+ for (int i = 0; i < 10; i++) x += i;
130
+ return (int)x;
131
+ }
132
+ C
133
+ if try_compile(simd_probe, "-fopenmp-simd")
134
+ $CFLAGS += " -fopenmp-simd"
135
+ $carray_build_flags << "-fopenmp-simd"
136
+ $stderr.puts "carray: -fopenmp-simd enabled (SIMD reduction license)"
137
+ end
138
+
139
+ # --- probe for `-march=native` (opt-in)
140
+ #
141
+ # Widens SIMD codegen to whatever ISA extensions the build-machine CPU
142
+ # supports — AVX / AVX2 / AVX-512 on x86_64, SVE on newer aarch64.
143
+ #
144
+ # Default: on. Ruby gems are install-on-target — `gem install carray`
145
+ # runs extconf + gcc/clang on the machine that will also run the
146
+ # compiled binary, so build CPU == run CPU by construction and there
147
+ # is no cross-generation deployment risk. Baseline-SSE2 build on an
148
+ # AVX2/AVX-512 x86_64 box under-reports by 2-4x on reduction / element-
149
+ # wise kernels (observed 2026-07-18: i7-14700K bench showed no `vaddpd`,
150
+ # only `addpd` + `addsd`, AVX2 completely dormant), which is not what
151
+ # most users want.
152
+ #
153
+ # Opt out (only needed when building a portable pre-built binary gem
154
+ # meant to run on older CPUs than the build machine):
155
+ # ruby extconf.rb --disable-march-native
156
+ # CARRAY_MARCH_NATIVE=0 rake build_ext
157
+ #
158
+ # Probe uses try_compile with a trivial program; unsupported compilers
159
+ # fail the probe gracefully and stay on the baseline ISA.
160
+ #
161
+ default_on = ENV["CARRAY_MARCH_NATIVE"] != "0"
162
+ if enable_config("march-native", default_on)
163
+ arch_probe = "int main(void) { return 0; }\n"
164
+ if try_compile(arch_probe, "-march=native")
165
+ $CFLAGS += " -march=native"
166
+ $carray_build_flags << "-march=native"
167
+ $stderr.puts "carray: -march=native enabled (build-machine ISA extensions)"
168
+ else
169
+ $stderr.puts "carray: -march=native probe FAILED, keeping baseline SIMD"
170
+ end
171
+ end
172
+ File.write("carray_build_flags.h",
173
+ "/* GENERATED by extconf.rb: the flags this build's arithmetic\n" \
174
+ " was compiled with. See CArray::BUILD_FLAGS. */\n" \
175
+ "#define CA_BUILD_FLAGS #{$carray_build_flags.join(" ").inspect}\n")
176
+
70
177
  # $CFLAGS += " -m128bit-long-double" ### gcc only
71
178
  # $CFLAGS += " -Wno-absolute-value"
72
179
  # $LDFLAGS += " -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib"
@@ -92,44 +199,17 @@ have_type("uint32_t", header)
92
199
  have_type("int64_t", header)
93
200
  have_type("uint64_t", header)
94
201
 
95
- if RUBY_VERSION_CODE < 191
96
- if have_type("long long", header)
97
- check_sizeof("long long")
98
- end
99
- if have_type("float", header)
100
- check_sizeof("float", header)
101
- end
102
- if have_type("double", header)
103
- check_sizeof("double", header)
104
- end
105
- if have_type("long double", header)
106
- check_sizeof("long double")
107
- end
108
- if have_header("complex.h")
109
- complex_h = "complex.h"
110
- if have_type("float complex", complex_h)
111
- check_sizeof("float complex", complex_h)
112
- end
113
- if have_type("double complex", complex_h)
114
- check_sizeof("double complex", complex_h)
115
- end
116
- else
117
- complex_h = nil
118
- end
202
+ have_type("long long", header)
203
+ have_type("float", header)
204
+ have_type("double", header)
205
+ # long double / long double complex were retired in carray-3.0
206
+ # (DROP_LONGDOUBLE); no probes needed.
207
+ if have_header("complex.h")
208
+ complex_h = "complex.h"
209
+ have_type("float complex", complex_h)
210
+ have_type("double complex", complex_h)
119
211
  else
120
- have_type("long long", header)
121
- have_type("float", header)
122
- have_type("double", header)
123
- if have_type("long double", header)
124
- check_sizeof("long double")
125
- end
126
- if have_header("complex.h")
127
- complex_h = "complex.h"
128
- have_type("float complex", complex_h)
129
- have_type("double complex", complex_h)
130
- else
131
- complex_h = nil
132
- end
212
+ complex_h = nil
133
213
  end
134
214
 
135
215
  # --- check tgmath.h
@@ -152,12 +232,55 @@ have_func("strptime", "time.h")
152
232
 
153
233
  have_func("rb_arithmetic_sequence_extract")
154
234
 
235
+ # --- check MemoryView protocol (Ruby 3.0+ required) ---
236
+
237
+ unless have_header("ruby/memory_view.h")
238
+ raise "ruby/memory_view.h not found; Ruby 3.0+ is required"
239
+ end
240
+
155
241
  # --- setup install files
156
242
 
157
243
  $INSTALLFILES = []
158
244
  $INSTALLFILES << ['carray.h', '$(archdir)']
159
245
  $INSTALLFILES << ['carray_config.h', '$(archdir)']
160
246
 
247
+ # --- ext-author / math-backend surface (PROPOSAL_CARRAY_H_REORG H.1)
248
+ #
249
+ # Two reasons a header belongs here, and only these two.
250
+ #
251
+ # (a) Reachable from `#include "carray.h"`. carray.h is a public umbrella
252
+ # that pulls carray_math_kernel.h and ca_kernel_iterator.h, which in
253
+ # turn pull the per-family dispatch headers and the iterator
254
+ # substrate. Every header in that transitive closure must ship, or a
255
+ # downstream gem's `#include "carray.h"` fails to resolve.
256
+ #
257
+ # (b) Not in the closure, but written for ext authors to include
258
+ # explicitly. ca_obj_face.h is the Face authoring surface: an
259
+ # external gem defines its own Face by including it directly.
260
+ #
261
+ # A header that is neither is internal, however useful it looks in-tree.
262
+ # ca_op_powi.h (op_powi_<type> helpers for the generated kernels) and
263
+ # ca_composite_dispatch.h (per-region gather/scatter routines behind
264
+ # CAWindow / CATile / CARoll attach) are consumed only by carray's own
265
+ # translation units, each of which includes them directly; shipping them
266
+ # would promote unstable internals to a downstream contract, so they stay
267
+ # out. carray_internal.h (layer 3) is likewise never installed.
268
+ #
269
+ %w[
270
+ carray_math_kernel.h
271
+ carray_call_cfunc.h
272
+ ca_axis_descriptor.h
273
+ ca_monop_dispatch.h
274
+ ca_binop_dispatch.h
275
+ ca_bincmp_dispatch.h
276
+ ca_moncmp_dispatch.h
277
+ ca_kernel_iterator.h
278
+ ca_iter_substrate.h
279
+ ca_obj_face.h
280
+ ].each do |h|
281
+ $INSTALLFILES << [h, '$(archdir)']
282
+ end
283
+
161
284
  # --- cygwin/mingw
162
285
  #
163
286
  # Installing the static link library "libcarray.a".
@@ -184,21 +307,49 @@ create_header(config_h)
184
307
 
185
308
  $defs = [] # Now these definitions are in carray_config.h.
186
309
 
187
- # --- create carray_math.c, carray_stat_proc.c
310
+ # --- generated sources
188
311
 
189
312
  if ( not File.exist?("carray_cast_func.c") ) or
190
313
  File.stat("carray_cast_func.rb").mtime > File.stat("carray_cast_func.c").mtime
191
314
  system("ruby carray_cast_func.rb > carray_cast_func.c")
192
315
  end
193
316
 
194
- if ( not File.exist?("carray_math.c") ) or
195
- File.stat("carray_math.rb").mtime > File.stat("carray_math.c").mtime
196
- system("ruby carray_math.rb")
317
+ # The kernels are generated as 15 files (10 kinds, with reduce split into 5
318
+ # sub-groups, plus an aggregator init.c) rather than one carray_kernels.c,
319
+ # which is what lets a parallel make actually parallelise. They land flat in
320
+ # ext/ so mkmf picks them up as $srcs.
321
+ #
322
+ # Generation happens here and only here; the Makefile does not regenerate
323
+ # anything. On the gem-install path that reads extconf -> mkkernel -> make
324
+ # compiling static sources, which is one pass with no race.
325
+ #
326
+ # carray_kernels.stamp is the mtime witness:
327
+ # - here: regenerate and touch it when mkkernel.rb is newer
328
+ # - in the Rakefile (rake build_ext): the same stamp triggers need_extconf
329
+ CARRAY_KERNELS_STAMP = "carray_kernels.stamp"
330
+ if ( not File.exist?(CARRAY_KERNELS_STAMP) ) or
331
+ File.stat("mkkernel.rb").mtime > File.stat(CARRAY_KERNELS_STAMP).mtime
332
+ # passing "." makes the generator write the split files into ext/
333
+ unless system("ruby mkkernel.rb .")
334
+ raise "mkkernel.rb failed to generate split kernel files"
335
+ end
336
+ require "fileutils"
337
+ FileUtils.touch(CARRAY_KERNELS_STAMP)
338
+ end
339
+ # clear out a single-stream carray_kernels.c left over from an older
340
+ # checkout; having both would give duplicate definitions
341
+ if File.exist?("carray_kernels.c")
342
+ File.unlink("carray_kernels.c")
343
+ end
344
+ # Fail here rather than at link time if the generator produced nothing.
345
+ if Dir.glob("carray_kernels_*.c").empty?
346
+ raise "no carray_kernels_*.c files found after mkkernel.rb; check the generator"
197
347
  end
198
348
 
199
- if ( not File.exist?("carray_stat_proc.c") ) or
200
- File.stat("carray_stat_proc.rb").mtime > File.stat("carray_stat_proc.c").mtime
201
- system("ruby carray_stat_proc.rb > carray_stat_proc.c")
349
+ if ( not File.exist?("carray_call_cfunc.c") ) or
350
+ ( not File.exist?("carray_call_cfunc.h") ) or
351
+ File.stat("mk_call_cfunc.rb").mtime > File.stat("carray_call_cfunc.c").mtime
352
+ system("ruby mk_call_cfunc.rb")
202
353
  end
203
354
 
204
355
  # --- create Makefile
@@ -225,18 +376,46 @@ GEMFILE = carray-${CA_VERSION}.gem
225
376
  carray_cast_func.c: carray_cast_func.rb
226
377
  ${RUBY} carray_cast_func.rb > carray_cast_func.c
227
378
 
228
- carray_stat_proc.c: carray_stat_proc.rb
229
- ${RUBY} carray_stat_proc.rb > carray_stat_proc.c
379
+ # P.5b.5: ext/mkmath.rb / ext/carray_math.rb retired (= residual hand-
380
+ # written ipower wrappers + lazy ipower kernel table now live in
381
+ # ext/ca_op_ipower.c, single file, no generation). No Makefile rule
382
+ # needed.
230
383
 
231
- carray_math.c: carray_math.rb
232
- ${RUBY} carray_math.rb
384
+ # There is deliberately no kernel-regeneration rule in the Makefile. Running
385
+ # mkkernel.rb belongs to the pre-generation block above, which is idempotent
386
+ # through carray_kernels.stamp.
387
+ #
388
+ # Two things went wrong when the Makefile did own it:
389
+ # - `carray_kernels_init.c: mkkernel.rb` declares one target for a recipe
390
+ # that writes 15 files. Under a parallel make on a filesystem with fine
391
+ # mtime granularity this raced: intermittent build failures
392
+ # (`as: can't create ... reduce_aggregate.o`) or the same file compiled
393
+ # twice. It showed up on Linux during gem install; on macOS the
394
+ # filesystem timing hid it.
395
+ # - Routing the rule through a stamp file does not help either: GNU make
396
+ # treats a no-recipe dependency as a reason to skip re-checking the mtime
397
+ # of the downstream .o, so a fresh .c can sit next to a stale .o and the
398
+ # build still reports success.
399
+ #
400
+ # Who does what now:
401
+ # - gem install: extconf.rb runs mkkernel, make compiles static sources.
402
+ # One pass, nothing to race.
403
+ # - `rake build_ext`: the Rakefile compares mkkernel.rb against
404
+ # carray_kernels.stamp and triggers need_extconf, so extconf reruns,
405
+ # mkkernel regenerates, the stamp is touched and make compiles.
406
+ # Transparent to the caller.
407
+ # - bare `cd ext && make`: changes to mkkernel.rb are not picked up. That
408
+ # is advanced usage -- run extconf explicitly after touching mkkernel.rb.
409
+
410
+ carray_call_cfunc.c carray_call_cfunc.h: mk_call_cfunc.rb
411
+ ${RUBY} mk_call_cfunc.rb
233
412
 
234
413
  yard:
235
414
  sh utils/create_rdoc.sh
236
415
 
237
416
  clean-generated:
238
417
  @rm -f carray_config.h lib/carray/config.rb
239
- @rm -f carray_cast_func.c carray_math.c carray_stat_proc.c
418
+ @rm -f carray_cast_func.c carray_kernels.c carray_kernels_*.c carray_kernels.stamp
240
419
  @rm -f ${GEMFILE}
241
420
  @rm -rf pkg
242
421
  @rm -f rdoc_ext.rb