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.
- checksums.yaml +4 -4
- data/.yardopts +6 -25
- data/CHANGELOG.md +338 -0
- data/{NEWS.md → CHANGELOG.v1.md} +3 -0
- data/LICENSE +1 -1
- data/README.md +120 -36
- data/carray.gemspec +32 -30
- data/ext/ca_array_pool.c +91 -0
- data/ext/ca_axis_descriptor.h +186 -0
- data/ext/ca_axis_dispatch.c +924 -0
- data/ext/ca_axis_group.c +1244 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +124 -0
- data/ext/ca_binop_dispatch.h +152 -0
- data/ext/ca_categorical_iterator.c +1375 -0
- data/ext/ca_compare.c +94 -0
- data/ext/ca_compare.h +26 -0
- data/ext/ca_composite_dispatch.c +414 -0
- data/ext/ca_composite_dispatch.h +116 -0
- data/ext/ca_for_buffer.h +96 -0
- data/ext/ca_for_each_element.h +239 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4367 -0
- data/ext/ca_kernel_iterator.h +2596 -0
- data/ext/ca_moncmp_dispatch.c +37 -0
- data/ext/ca_moncmp_dispatch.h +62 -0
- data/ext/ca_monop_dispatch.c +200 -0
- data/ext/ca_monop_dispatch.h +235 -0
- data/ext/ca_obj_array.c +355 -359
- data/ext/ca_obj_bincmp.c +839 -0
- data/ext/ca_obj_binop.c +948 -0
- data/ext/ca_obj_bitarray.c +369 -164
- data/ext/ca_obj_bitfield.c +294 -234
- data/ext/ca_obj_block.c +189 -711
- data/ext/ca_obj_byte_swap.c +766 -0
- data/ext/ca_obj_const_string.c +967 -0
- data/ext/ca_obj_face.c +750 -0
- data/ext/ca_obj_face.h +279 -0
- data/ext/ca_obj_fake.c +239 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +308 -0
- data/ext/ca_obj_grid.c +866 -440
- data/ext/ca_obj_meld.c +1039 -0
- data/ext/ca_obj_moncmp.c +588 -0
- data/ext/ca_obj_monop.c +1123 -0
- data/ext/ca_obj_object.c +866 -296
- data/ext/ca_obj_record.c +470 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +593 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +624 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1306 -0
- data/ext/ca_obj_shift.c +231 -793
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2584 -0
- data/ext/ca_obj_string.c +270 -0
- data/ext/ca_obj_tile.c +622 -0
- data/ext/ca_obj_time.c +548 -0
- data/ext/ca_obj_timedelta.c +437 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +785 -0
- data/ext/ca_obj_window.c +1202 -565
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_cmplx64.h +123 -0
- data/ext/ca_op_ipower.c +316 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +473 -0
- data/ext/ca_sweep_engine.h +166 -0
- data/ext/ca_transform_common.c +235 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +810 -420
- data/ext/carray_access.c +873 -731
- data/ext/carray_attribute.c +98 -329
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +376 -0
- data/ext/carray_build_flags.h +3 -0
- data/ext/carray_call_cfunc.c +2897 -874
- data/ext/carray_call_cfunc.h +313 -0
- data/ext/carray_cast.c +1264 -315
- data/ext/carray_cast_func.rb +81 -40
- data/ext/carray_class.c +53 -63
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +350 -346
- data/ext/carray_copy.c +168 -270
- data/ext/carray_core.c +1396 -206
- data/ext/carray_count.c +312 -0
- data/ext/carray_data_type.c +43 -19
- data/ext/carray_element.c +585 -213
- data/ext/carray_factorize.c +2542 -0
- data/ext/carray_generate.c +230 -559
- data/ext/carray_histogram.c +490 -0
- data/ext/carray_hold.c +228 -0
- data/ext/carray_index_classifier.c +1021 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +136 -0
- data/ext/carray_kernels_bincmp.c +4446 -0
- data/ext/carray_kernels_binop.c +11001 -0
- data/ext/carray_kernels_init.c +1131 -0
- data/ext/carray_kernels_map.c +3467 -0
- data/ext/carray_kernels_moncmp.c +2097 -0
- data/ext/carray_kernels_monop.c +18313 -0
- data/ext/carray_kernels_reduce_aggregate.c +25837 -0
- data/ext/carray_kernels_reduce_boolean.c +330 -0
- data/ext/carray_kernels_reduce_cumulative.c +14593 -0
- data/ext/carray_kernels_reduce_extreme.c +16948 -0
- data/ext/carray_kernels_reduce_variance.c +3910 -0
- data/ext/carray_kernels_scan.c +3693 -0
- data/ext/carray_kernels_search.c +32138 -0
- data/ext/carray_kernels_sort.c +10626 -0
- data/ext/carray_kernels_triop.c +1392 -0
- data/ext/carray_lazy.c +737 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +853 -158
- data/ext/carray_math_kernel.h +120 -0
- data/ext/carray_mathfunc.c +10 -241
- data/ext/carray_median_percentile.c +1257 -0
- data/ext/carray_memory_view.c +1650 -0
- data/ext/carray_operator.c +1525 -320
- data/ext/carray_order.c +664 -1394
- data/ext/carray_partition.c +416 -0
- data/ext/carray_random.c +518 -0
- data/ext/carray_scatter.c +357 -0
- data/ext/carray_slab.c +1219 -0
- data/ext/carray_slab.h +84 -0
- data/ext/carray_sort.c +829 -0
- data/ext/carray_sort_kernel.c +620 -0
- data/ext/carray_struct.c +695 -0
- data/ext/carray_test.c +343 -229
- data/ext/carray_undef.c +34 -17
- data/ext/carray_utils.c +175 -74
- data/ext/extconf.rb +234 -55
- data/ext/mk_call_cfunc.rb +671 -0
- data/ext/mkkernel.rb +9096 -0
- data/ext/ruby_carray.c +211 -108
- data/ext/version.h +4 -14
- data/ext/version.rb +5 -13
- data/lib/carray/arrow_tensor.rb +401 -0
- data/lib/carray/attribute.rb +166 -0
- data/lib/carray/autoload_carray.rb +239 -0
- data/lib/carray/autoload_method_extension.rb +45 -0
- data/lib/carray/axis_group.rb +711 -0
- data/lib/carray/basics.rb +481 -0
- data/lib/carray/bincount_nd.rb +358 -0
- data/lib/carray/block_iterator.rb +614 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1084 -0
- data/lib/carray/complex.rb +150 -0
- data/lib/carray/conditional.rb +216 -0
- data/lib/carray/const_string.rb +228 -0
- data/lib/carray/construct.rb +160 -328
- data/lib/carray/core_extensions.rb +297 -0
- data/lib/carray/data_type_extension.rb +250 -0
- data/lib/carray/fixlen_string.rb +95 -0
- data/lib/carray/frame/concat.rb +132 -0
- data/lib/carray/frame/convert.rb +95 -0
- data/lib/carray/frame/csv_parser.rb +211 -0
- data/lib/carray/frame/frame.rb +642 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +321 -0
- data/lib/carray/frame/join.rb +248 -0
- data/lib/carray/frame/records.rb +99 -0
- data/lib/carray/frame/sort.rb +113 -0
- data/lib/carray/frame/verbs.rb +316 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/fuse_source.rb +123 -0
- data/lib/carray/fusion.rb +218 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -26
- data/lib/carray/iterator.rb +58 -349
- data/lib/carray/lazy.rb +941 -0
- data/lib/carray/mask_gap_fill.rb +200 -0
- data/lib/carray/math.rb +78 -342
- data/lib/carray/meld_reduce.rb +289 -0
- data/lib/carray/methods/align_addr.rb +116 -0
- data/lib/carray/methods/bin.rb +128 -0
- data/lib/carray/methods/bincount.rb +87 -0
- data/lib/carray/methods/bit_string.rb +92 -0
- data/lib/carray/methods/broadcast.rb +63 -0
- data/lib/carray/methods/choose.rb +39 -0
- data/lib/carray/methods/composition.rb +280 -0
- data/lib/carray/methods/gather_nd.rb +206 -0
- data/lib/carray/methods/index.rb +39 -0
- data/lib/carray/methods/insert_block.rb +99 -0
- data/lib/carray/methods/is_in.rb +141 -0
- data/lib/carray/methods/join.rb +90 -0
- data/lib/carray/methods/locate_addr.rb +52 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +90 -0
- data/lib/carray/methods/mode.rb +126 -0
- data/lib/carray/methods/nunique.rb +46 -0
- data/lib/carray/methods/resize.rb +56 -0
- data/lib/carray/methods/snap.rb +161 -0
- data/lib/carray/methods/string_format.rb +57 -0
- data/lib/carray/methods/unique.rb +47 -0
- data/lib/carray/methods/value_counts.rb +71 -0
- data/lib/carray/mkmf.rb +124 -101
- data/lib/carray/runtime.rb +89 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +305 -0
- data/lib/carray/stack.rb +291 -0
- data/lib/carray/string.rb +56 -180
- data/lib/carray/string_operation_extension.rb +289 -0
- data/lib/carray/struct.rb +335 -323
- data/lib/carray/struct_builder.rb +697 -0
- data/lib/carray/table.rb +41 -2
- data/lib/carray/time.rb +2654 -38
- data/lib/carray/window_iterator.rb +927 -0
- data/lib/carray.rb +55 -57
- data/yard-stubs/ca_obj_array.rb +385 -0
- data/yard-stubs/ca_obj_bitarray.rb +38 -0
- data/yard-stubs/ca_obj_bitfield.rb +43 -0
- data/yard-stubs/ca_obj_block.rb +73 -0
- data/yard-stubs/ca_obj_byte_swap.rb +56 -0
- data/yard-stubs/ca_obj_fake.rb +31 -0
- data/yard-stubs/ca_obj_farray.rb +32 -0
- data/yard-stubs/ca_obj_field.rb +45 -0
- data/yard-stubs/ca_obj_grid.rb +35 -0
- data/yard-stubs/ca_obj_refer.rb +72 -0
- data/yard-stubs/ca_obj_roll.rb +45 -0
- data/yard-stubs/ca_obj_shift.rb +43 -0
- data/yard-stubs/ca_obj_stride.rb +181 -0
- data/yard-stubs/ca_obj_tile.rb +29 -0
- data/yard-stubs/ca_obj_transpose.rb +40 -0
- data/yard-stubs/ca_obj_window.rb +49 -0
- data/yard-stubs/carray_access.rb +131 -0
- data/yard-stubs/carray_attribute.rb +246 -0
- data/yard-stubs/carray_broadcast.rb +37 -0
- data/yard-stubs/carray_cast.rb +489 -0
- data/yard-stubs/carray_class.rb +65 -0
- data/yard-stubs/carray_conversion.rb +76 -0
- data/yard-stubs/carray_copy.rb +79 -0
- data/yard-stubs/carray_core.rb +114 -0
- data/yard-stubs/carray_count.rb +79 -0
- data/yard-stubs/carray_element.rb +108 -0
- data/yard-stubs/carray_generate.rb +66 -0
- data/yard-stubs/carray_lazy.rb +23 -0
- data/yard-stubs/carray_loop.rb +140 -0
- data/yard-stubs/carray_mask.rb +259 -0
- data/yard-stubs/carray_math.rb +132 -0
- data/yard-stubs/carray_mathfunc.rb +45 -0
- data/yard-stubs/carray_median_percentile.rb +89 -0
- data/yard-stubs/carray_memory_view.rb +163 -0
- data/yard-stubs/carray_order.rb +312 -0
- data/yard-stubs/carray_random.rb +89 -0
- data/yard-stubs/carray_scatter.rb +106 -0
- data/yard-stubs/carray_slab.rb +57 -0
- data/yard-stubs/carray_sort.rb +163 -0
- data/yard-stubs/carray_test.rb +85 -0
- data/yard-stubs/carray_undef.rb +64 -0
- data/yard-stubs/carray_utils.rb +97 -0
- data/yard-stubs/ruby_carray.rb +193 -0
- metadata +220 -138
- data/Rakefile +0 -51
- data/TODO.md +0 -18
- data/ext/ca_iter_block.c +0 -257
- data/ext/ca_iter_dimension.c +0 -299
- data/ext/ca_iter_window.c +0 -214
- data/ext/ca_obj_mapping.c +0 -644
- data/ext/ca_obj_unbound_repeat.c +0 -529
- data/ext/carray_iterator.c +0 -641
- data/ext/carray_math.rb +0 -850
- data/ext/carray_numeric.c +0 -259
- data/ext/carray_sort_addr.c +0 -254
- data/ext/carray_stat.c +0 -2100
- data/ext/carray_stat_proc.rb +0 -1999
- data/ext/mkmath.rb +0 -741
- data/ext/ruby_ccomplex.c +0 -509
- data/ext/ruby_float_func.c +0 -86
- data/lib/carray/array.rb +0 -8
- data/lib/carray/autoload/autoload_base.rb +0 -19
- data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
- data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
- data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
- data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
- data/lib/carray/autoload/autoload_gem_random.rb +0 -8
- data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
- data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
- data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
- data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
- data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
- data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
- data/lib/carray/autoload/autoload_object_link.rb +0 -1
- data/lib/carray/autoload/autoload_object_pack.rb +0 -2
- data/lib/carray/autoload.rb +0 -141
- data/lib/carray/basic.rb +0 -191
- data/lib/carray/broadcast.rb +0 -101
- data/lib/carray/compose.rb +0 -315
- data/lib/carray/convert.rb +0 -115
- data/lib/carray/info.rb +0 -110
- data/lib/carray/io/imagemagick.rb +0 -235
- data/lib/carray/mask.rb +0 -102
- data/lib/carray/math/histogram.rb +0 -177
- data/lib/carray/math/recurrence.rb +0 -93
- data/lib/carray/object/ca_obj_iterator.rb +0 -50
- data/lib/carray/object/ca_obj_link.rb +0 -50
- data/lib/carray/object/ca_obj_pack.rb +0 -99
- data/lib/carray/obsolete.rb +0 -256
- data/lib/carray/ordering.rb +0 -181
- data/lib/carray/testing.rb +0 -51
- data/lib/carray/transform.rb +0 -109
- data/mailmap +0 -1
- data/misc/Methods.ja.md +0 -182
- data/misc/NOTE +0 -51
- data/spec/Classes/CABitfield_spec.rb +0 -58
- data/spec/Classes/CABlockIterator_spec.rb +0 -114
- data/spec/Classes/CABlock_spec.rb +0 -205
- data/spec/Classes/CAField_spec.rb +0 -39
- data/spec/Classes/CAGrid_spec.rb +0 -75
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/spec/Classes/CAMapping_spec.rb +0 -105
- data/spec/Classes/CAObject_attribute_spec.rb +0 -33
- data/spec/Classes/CAObject_spec.rb +0 -33
- data/spec/Classes/CARefer_spec.rb +0 -93
- data/spec/Classes/CARepeat_spec.rb +0 -65
- data/spec/Classes/CASelect_spec.rb +0 -22
- data/spec/Classes/CAShift_spec.rb +0 -16
- data/spec/Classes/CAStruct_spec.rb +0 -71
- data/spec/Classes/CATranspose_spec.rb +0 -60
- data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
- data/spec/Classes/CAWindow_spec.rb +0 -54
- data/spec/Classes/CAWrap_spec.rb +0 -8
- data/spec/Classes/CArray_spec.rb +0 -184
- data/spec/Classes/CScalar_spec.rb +0 -55
- data/spec/Features/feature_130_spec.rb +0 -19
- data/spec/Features/feature_attributes_spec.rb +0 -280
- data/spec/Features/feature_boolean_spec.rb +0 -98
- data/spec/Features/feature_broadcast.rb +0 -116
- data/spec/Features/feature_cast_function.rb +0 -19
- data/spec/Features/feature_cast_spec.rb +0 -33
- data/spec/Features/feature_class_spec.rb +0 -84
- data/spec/Features/feature_complex_spec.rb +0 -42
- data/spec/Features/feature_composite_spec.rb +0 -124
- data/spec/Features/feature_convert_spec.rb +0 -46
- data/spec/Features/feature_copy_spec.rb +0 -123
- data/spec/Features/feature_creation_spec.rb +0 -84
- data/spec/Features/feature_element_spec.rb +0 -144
- data/spec/Features/feature_extream_spec.rb +0 -54
- data/spec/Features/feature_generate_spec.rb +0 -74
- data/spec/Features/feature_index_spec.rb +0 -69
- data/spec/Features/feature_mask_spec.rb +0 -580
- data/spec/Features/feature_math_spec.rb +0 -97
- data/spec/Features/feature_order_spec.rb +0 -146
- data/spec/Features/feature_ref_store_spec.rb +0 -209
- data/spec/Features/feature_serialization_spec.rb +0 -125
- data/spec/Features/feature_stat_spec.rb +0 -397
- data/spec/Features/feature_virtual_spec.rb +0 -48
- data/spec/Features/method_eq_spec.rb +0 -81
- data/spec/Features/method_is_nan_spec.rb +0 -12
- data/spec/Features/method_map_spec.rb +0 -54
- data/spec/Features/method_max_with.rb +0 -20
- data/spec/Features/method_min_with.rb +0 -19
- data/spec/Features/method_ne_spec.rb +0 -18
- data/spec/Features/method_project_spec.rb +0 -188
- data/spec/Features/method_ref_spec.rb +0 -27
- data/spec/Features/method_round_spec.rb +0 -11
- data/spec/Features/method_s_linspace_spec.rb +0 -48
- data/spec/Features/method_s_span_spec.rb +0 -14
- data/spec/Features/method_seq_spec.rb +0 -47
- data/spec/Features/method_sort_with.rb +0 -43
- data/spec/Features/method_sorted_with.rb +0 -29
- data/spec/Features/method_span_spec.rb +0 -42
- data/spec/Features/method_wrap_readonly_spec.rb +0 -43
- data/spec/UnitTest/test_CAVirtual.rb +0 -214
- data/spec/spec_all.rb +0 -10
- data/utils/ca_ase.rb +0 -21
- data/utils/ca_methods.rb +0 -15
- data/utils/cast_checker.rb +0 -30
- data/utils/convert_test.rb +0 -73
- data/utils/extract_yard.rb +0 -22
- data/utils/guess_shape.rb +0 -76
- data/utils/monkey_patch_methods.rb +0 -62
- 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
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
-
# ---
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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?("
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
232
|
-
|
|
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
|
|
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
|