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.
- checksums.yaml +4 -4
- data/.yardopts +5 -25
- data/CHANGELOG.md +16 -0
- data/LICENSE +1 -1
- data/NEWS.md +3 -0
- data/README.md +128 -44
- data/carray.gemspec +22 -24
- 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 +1208 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +125 -0
- data/ext/ca_binop_dispatch.h +159 -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 +241 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4321 -0
- data/ext/ca_kernel_iterator.h +2603 -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 +809 -0
- data/ext/ca_obj_binop.c +892 -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 +965 -0
- data/ext/ca_obj_face.c +670 -0
- data/ext/ca_obj_face.h +247 -0
- data/ext/ca_obj_fake.c +228 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +306 -0
- data/ext/ca_obj_grid.c +858 -440
- data/ext/ca_obj_meld.c +1034 -0
- data/ext/ca_obj_moncmp.c +569 -0
- data/ext/ca_obj_monop.c +1111 -0
- data/ext/ca_obj_object.c +774 -298
- data/ext/ca_obj_record.c +468 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +569 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +616 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1296 -0
- data/ext/ca_obj_shift.c +230 -792
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2501 -0
- data/ext/ca_obj_string.c +268 -0
- data/ext/ca_obj_tile.c +614 -0
- data/ext/ca_obj_time.c +546 -0
- data/ext/ca_obj_timedelta.c +435 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +746 -0
- data/ext/ca_obj_unbound_repeat.c +208 -241
- data/ext/ca_obj_window.c +1131 -563
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_ipower.c +319 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +430 -0
- data/ext/ca_sweep_engine.h +157 -0
- data/ext/ca_transform_common.c +228 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +795 -402
- data/ext/carray_access.c +831 -711
- data/ext/carray_attribute.c +98 -330
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +283 -0
- data/ext/carray_call_cfunc.c +1360 -828
- data/ext/carray_call_cfunc.h +160 -0
- data/ext/carray_cast.c +1212 -301
- 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 +156 -268
- data/ext/carray_core.c +1342 -199
- 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 +1035 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +120 -0
- data/ext/carray_kernels_bincmp.c +4445 -0
- data/ext/carray_kernels_binop.c +10979 -0
- data/ext/carray_kernels_init.c +36 -0
- data/ext/carray_kernels_map.c +3466 -0
- data/ext/carray_kernels_moncmp.c +2096 -0
- data/ext/carray_kernels_monop.c +18312 -0
- data/ext/carray_kernels_reduce_aggregate.c +25836 -0
- data/ext/carray_kernels_reduce_boolean.c +329 -0
- data/ext/carray_kernels_reduce_cumulative.c +14592 -0
- data/ext/carray_kernels_reduce_extreme.c +16947 -0
- data/ext/carray_kernels_reduce_variance.c +3909 -0
- data/ext/carray_kernels_scan.c +3692 -0
- data/ext/carray_kernels_search.c +32137 -0
- data/ext/carray_kernels_sort.c +10625 -0
- data/ext/carray_kernels_triop.c +1391 -0
- data/ext/carray_lazy.c +567 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +848 -154
- 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 +1625 -0
- data/ext/carray_operator.c +1526 -318
- 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 +216 -55
- data/ext/mk_call_cfunc.rb +480 -0
- data/ext/mkkernel.rb +8842 -0
- data/ext/ruby_carray.c +202 -101
- 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 +220 -0
- data/lib/carray/autoload_method_extension.rb +44 -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 +604 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1062 -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 +139 -328
- data/lib/carray/core_extensions.rb +240 -0
- data/lib/carray/data_type_extension.rb +233 -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 +649 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +164 -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 +299 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -20
- data/lib/carray/iterator.rb +57 -349
- data/lib/carray/lazy.rb +889 -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 +47 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +91 -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 +156 -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 +108 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +292 -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 +2255 -38
- data/lib/carray/window_iterator.rb +655 -0
- data/lib/carray.rb +55 -57
- metadata +163 -130
- 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/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/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/Classes/ex1.rb +0 -46
- 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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
carray_kernels.c -- GENERATED by ext/mkkernel.rb -- DO NOT EDIT
|
|
4
|
+
|
|
5
|
+
Kernel definitions live in mkkernel.rb (search for `MkKernel.reduce`).
|
|
6
|
+
Regenerate by running:
|
|
7
|
+
|
|
8
|
+
cd ext && ruby mkkernel.rb > carray_kernels.c
|
|
9
|
+
|
|
10
|
+
extconf.rb regenerates automatically when mkkernel.rb is touched.
|
|
11
|
+
|
|
12
|
+
--------------------------------------------------------------------------- */
|
|
13
|
+
|
|
14
|
+
#include "carray.h"
|
|
15
|
+
#include "ca_kernel_iterator.h"
|
|
16
|
+
#include "ca_sort_kernels.h" /* sort kernels: internal, not via the carray.h umbrella */
|
|
17
|
+
#include "carray_internal.h" /* ca_lazy_arena_*, ca_is_lazy_view (streaming reduce) */
|
|
18
|
+
#include "ca_obj_face.h" /* rb_ca_strip_face_value (Face ordering gate) */
|
|
19
|
+
#include <math.h>
|
|
20
|
+
#include <stdint.h>
|
|
21
|
+
#include <stdlib.h> /* qsort, mergesort (HAVE_MERGESORT) -- for :sort kind */
|
|
22
|
+
|
|
23
|
+
/* MEMO_REDUCTION_FASTPATH_ENTITY_ONLY_GUARD Tier 2: CAStack identity is
|
|
24
|
+
probed by operation-table function pointer (obj_type is runtime-
|
|
25
|
+
assigned, so no CA_OBJ_STACK compile-time constant exists). */
|
|
26
|
+
extern ca_operation_function_t ca_stack_func;
|
|
27
|
+
/* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
|
|
28
|
+
for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
|
|
29
|
+
return real true/false, not Integer 0/1. (BOOL2OBJ already exists
|
|
30
|
+
but returns Integer per CArray's boolean-as-int convention.) */
|
|
31
|
+
#ifndef CARRAY_BOOL2VAL_DEFINED
|
|
32
|
+
#define CARRAY_BOOL2VAL_DEFINED
|
|
33
|
+
static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
#include "ca_op_powi.h"
|
|
37
|
+
|
|
38
|
+
/* ===== all_ki ============================================ */
|
|
39
|
+
|
|
40
|
+
static VALUE
|
|
41
|
+
all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
|
|
42
|
+
{
|
|
43
|
+
/* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
|
|
44
|
+
/* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
|
|
45
|
+
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
46
|
+
ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
|
|
47
|
+
ca_size_t __inner = 1;
|
|
48
|
+
int __k;
|
|
49
|
+
for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
|
|
50
|
+
ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
|
|
51
|
+
ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
|
|
52
|
+
if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
|
|
53
|
+
ca_size_t __chunk_elems = __rows * __inner;
|
|
54
|
+
ca_size_t __outer = ca->dim[0];
|
|
55
|
+
ca_size_t __starts[CA_RANK_MAX] = {0};
|
|
56
|
+
ca_size_t __counts[CA_RANK_MAX];
|
|
57
|
+
ca_size_t __strides[CA_RANK_MAX];
|
|
58
|
+
ca_size_t __s = sizeof(boolean8_t);
|
|
59
|
+
for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
|
|
60
|
+
__strides[__k] = __s;
|
|
61
|
+
__s *= ca->dim[__k];
|
|
62
|
+
}
|
|
63
|
+
for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
|
|
64
|
+
ca_size_t __outer_off = 0;
|
|
65
|
+
boolean8_t acc;
|
|
66
|
+
acc = (1);
|
|
67
|
+
ca_lazy_arena_enter();
|
|
68
|
+
boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
|
|
69
|
+
while ( __outer_off < __outer ) {
|
|
70
|
+
ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
|
|
71
|
+
ca_size_t __n = __r * __inner;
|
|
72
|
+
__starts[0] = __outer_off;
|
|
73
|
+
__counts[0] = __r;
|
|
74
|
+
ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
|
|
75
|
+
ca_size_t __i;
|
|
76
|
+
for ( __i = 0; __i < __n; __i++ ) {
|
|
77
|
+
boolean8_t v = __chunk[__i];
|
|
78
|
+
acc &= v;
|
|
79
|
+
}
|
|
80
|
+
__outer_off += __r;
|
|
81
|
+
}
|
|
82
|
+
ca_lazy_arena_release(__chunk);
|
|
83
|
+
ca_lazy_arena_exit();
|
|
84
|
+
return BOOL2VAL((boolean8_t) (acc));
|
|
85
|
+
}
|
|
86
|
+
VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
|
|
87
|
+
CArray *co;
|
|
88
|
+
GetCArray(vout, co);
|
|
89
|
+
boolean8_t *op = (boolean8_t *) co->ptr;
|
|
90
|
+
ca_iter_state st;
|
|
91
|
+
int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
|
|
92
|
+
slab_axes, naxes, 0);
|
|
93
|
+
if ( rc != CA_ITER_OK ) {
|
|
94
|
+
rb_raise(rb_eRuntimeError,
|
|
95
|
+
"all_ki: kernel_iterator init failed rc=%d", rc);
|
|
96
|
+
}
|
|
97
|
+
char *p;
|
|
98
|
+
boolean8_t *m;
|
|
99
|
+
ca_size_t out_i = 0;
|
|
100
|
+
while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
|
|
101
|
+
boolean8_t acc;
|
|
102
|
+
CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 1, acc &= v);
|
|
103
|
+
op[out_i++] = (boolean8_t) (acc);
|
|
104
|
+
}
|
|
105
|
+
ca_iter_state_finish(&st);
|
|
106
|
+
if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
|
|
107
|
+
return vout;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
VALUE
|
|
111
|
+
rb_ca_all_ki (int argc, VALUE *argv, VALUE self)
|
|
112
|
+
{
|
|
113
|
+
CArray *src;
|
|
114
|
+
GetCArray(self, src);
|
|
115
|
+
volatile VALUE ropt = rb_pop_options(&argc, &argv);
|
|
116
|
+
volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
|
|
117
|
+
rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
|
|
118
|
+
int keep_axis = RTEST(rkeep_axis);
|
|
119
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
120
|
+
int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
|
|
121
|
+
if ( argc > 0 ) {
|
|
122
|
+
rb_raise(rb_eArgError, "all_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.all(axis: 0) or a.all(axis: [0, 1])", argc);
|
|
123
|
+
}
|
|
124
|
+
switch ( src->data_type ) {
|
|
125
|
+
case CA_BOOLEAN: return all_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
|
|
126
|
+
default:
|
|
127
|
+
rb_raise(rb_eCADataTypeError, "all_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
|
|
128
|
+
}
|
|
129
|
+
return Qnil; /* unreachable */
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* ===== any_ki ============================================ */
|
|
133
|
+
|
|
134
|
+
static VALUE
|
|
135
|
+
any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
|
|
136
|
+
{
|
|
137
|
+
/* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
|
|
138
|
+
/* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
|
|
139
|
+
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
140
|
+
ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
|
|
141
|
+
ca_size_t __inner = 1;
|
|
142
|
+
int __k;
|
|
143
|
+
for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
|
|
144
|
+
ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
|
|
145
|
+
ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
|
|
146
|
+
if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
|
|
147
|
+
ca_size_t __chunk_elems = __rows * __inner;
|
|
148
|
+
ca_size_t __outer = ca->dim[0];
|
|
149
|
+
ca_size_t __starts[CA_RANK_MAX] = {0};
|
|
150
|
+
ca_size_t __counts[CA_RANK_MAX];
|
|
151
|
+
ca_size_t __strides[CA_RANK_MAX];
|
|
152
|
+
ca_size_t __s = sizeof(boolean8_t);
|
|
153
|
+
for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
|
|
154
|
+
__strides[__k] = __s;
|
|
155
|
+
__s *= ca->dim[__k];
|
|
156
|
+
}
|
|
157
|
+
for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
|
|
158
|
+
ca_size_t __outer_off = 0;
|
|
159
|
+
boolean8_t acc;
|
|
160
|
+
acc = (0);
|
|
161
|
+
ca_lazy_arena_enter();
|
|
162
|
+
boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
|
|
163
|
+
while ( __outer_off < __outer ) {
|
|
164
|
+
ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
|
|
165
|
+
ca_size_t __n = __r * __inner;
|
|
166
|
+
__starts[0] = __outer_off;
|
|
167
|
+
__counts[0] = __r;
|
|
168
|
+
ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
|
|
169
|
+
ca_size_t __i;
|
|
170
|
+
for ( __i = 0; __i < __n; __i++ ) {
|
|
171
|
+
boolean8_t v = __chunk[__i];
|
|
172
|
+
acc |= v;
|
|
173
|
+
}
|
|
174
|
+
__outer_off += __r;
|
|
175
|
+
}
|
|
176
|
+
ca_lazy_arena_release(__chunk);
|
|
177
|
+
ca_lazy_arena_exit();
|
|
178
|
+
return BOOL2VAL((boolean8_t) (acc));
|
|
179
|
+
}
|
|
180
|
+
VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
|
|
181
|
+
CArray *co;
|
|
182
|
+
GetCArray(vout, co);
|
|
183
|
+
boolean8_t *op = (boolean8_t *) co->ptr;
|
|
184
|
+
ca_iter_state st;
|
|
185
|
+
int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
|
|
186
|
+
slab_axes, naxes, 0);
|
|
187
|
+
if ( rc != CA_ITER_OK ) {
|
|
188
|
+
rb_raise(rb_eRuntimeError,
|
|
189
|
+
"any_ki: kernel_iterator init failed rc=%d", rc);
|
|
190
|
+
}
|
|
191
|
+
char *p;
|
|
192
|
+
boolean8_t *m;
|
|
193
|
+
ca_size_t out_i = 0;
|
|
194
|
+
while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
|
|
195
|
+
boolean8_t acc;
|
|
196
|
+
CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 0, acc |= v);
|
|
197
|
+
op[out_i++] = (boolean8_t) (acc);
|
|
198
|
+
}
|
|
199
|
+
ca_iter_state_finish(&st);
|
|
200
|
+
if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
|
|
201
|
+
return vout;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
VALUE
|
|
205
|
+
rb_ca_any_ki (int argc, VALUE *argv, VALUE self)
|
|
206
|
+
{
|
|
207
|
+
CArray *src;
|
|
208
|
+
GetCArray(self, src);
|
|
209
|
+
volatile VALUE ropt = rb_pop_options(&argc, &argv);
|
|
210
|
+
volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
|
|
211
|
+
rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
|
|
212
|
+
int keep_axis = RTEST(rkeep_axis);
|
|
213
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
214
|
+
int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
|
|
215
|
+
if ( argc > 0 ) {
|
|
216
|
+
rb_raise(rb_eArgError, "any_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.any(axis: 0) or a.any(axis: [0, 1])", argc);
|
|
217
|
+
}
|
|
218
|
+
switch ( src->data_type ) {
|
|
219
|
+
case CA_BOOLEAN: return any_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
|
|
220
|
+
default:
|
|
221
|
+
rb_raise(rb_eCADataTypeError, "any_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
|
|
222
|
+
}
|
|
223
|
+
return Qnil; /* unreachable */
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* ===== none_ki ============================================ */
|
|
227
|
+
|
|
228
|
+
static VALUE
|
|
229
|
+
none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
|
|
230
|
+
{
|
|
231
|
+
/* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
|
|
232
|
+
/* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
|
|
233
|
+
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
234
|
+
ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
|
|
235
|
+
ca_size_t __inner = 1;
|
|
236
|
+
int __k;
|
|
237
|
+
for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
|
|
238
|
+
ca_size_t __target = 4096; /* L1d-friendly element budget (32KB for f64) */
|
|
239
|
+
ca_size_t __rows = (__inner > 0) ? (__target / __inner) : __target;
|
|
240
|
+
if ( __rows < 1 ) __rows = 1; /* at least one row per chunk */
|
|
241
|
+
ca_size_t __chunk_elems = __rows * __inner;
|
|
242
|
+
ca_size_t __outer = ca->dim[0];
|
|
243
|
+
ca_size_t __starts[CA_RANK_MAX] = {0};
|
|
244
|
+
ca_size_t __counts[CA_RANK_MAX];
|
|
245
|
+
ca_size_t __strides[CA_RANK_MAX];
|
|
246
|
+
ca_size_t __s = sizeof(boolean8_t);
|
|
247
|
+
for ( __k = ca->ndim - 1; __k >= 0; __k-- ) {
|
|
248
|
+
__strides[__k] = __s;
|
|
249
|
+
__s *= ca->dim[__k];
|
|
250
|
+
}
|
|
251
|
+
for ( __k = 1; __k < ca->ndim; __k++ ) __counts[__k] = ca->dim[__k];
|
|
252
|
+
ca_size_t __outer_off = 0;
|
|
253
|
+
boolean8_t acc;
|
|
254
|
+
acc = (1);
|
|
255
|
+
ca_lazy_arena_enter();
|
|
256
|
+
boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
|
|
257
|
+
while ( __outer_off < __outer ) {
|
|
258
|
+
ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
|
|
259
|
+
ca_size_t __n = __r * __inner;
|
|
260
|
+
__starts[0] = __outer_off;
|
|
261
|
+
__counts[0] = __r;
|
|
262
|
+
ca_xfer_stride(ca, __starts, __counts, __strides, __chunk, CA_XFER_GET);
|
|
263
|
+
ca_size_t __i;
|
|
264
|
+
for ( __i = 0; __i < __n; __i++ ) {
|
|
265
|
+
boolean8_t v = __chunk[__i];
|
|
266
|
+
acc &= !v;
|
|
267
|
+
}
|
|
268
|
+
__outer_off += __r;
|
|
269
|
+
}
|
|
270
|
+
ca_lazy_arena_release(__chunk);
|
|
271
|
+
ca_lazy_arena_exit();
|
|
272
|
+
return BOOL2VAL((boolean8_t) (acc));
|
|
273
|
+
}
|
|
274
|
+
VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
|
|
275
|
+
CArray *co;
|
|
276
|
+
GetCArray(vout, co);
|
|
277
|
+
boolean8_t *op = (boolean8_t *) co->ptr;
|
|
278
|
+
ca_iter_state st;
|
|
279
|
+
int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
|
|
280
|
+
slab_axes, naxes, 0);
|
|
281
|
+
if ( rc != CA_ITER_OK ) {
|
|
282
|
+
rb_raise(rb_eRuntimeError,
|
|
283
|
+
"none_ki: kernel_iterator init failed rc=%d", rc);
|
|
284
|
+
}
|
|
285
|
+
char *p;
|
|
286
|
+
boolean8_t *m;
|
|
287
|
+
ca_size_t out_i = 0;
|
|
288
|
+
while ( ca_iter_state_next_slab_axes(&st, &p, &m) ) {
|
|
289
|
+
boolean8_t acc;
|
|
290
|
+
CA_SLAB_REDUCE_T(boolean8_t, st, p, m, acc, 1, acc &= !v);
|
|
291
|
+
op[out_i++] = (boolean8_t) (acc);
|
|
292
|
+
}
|
|
293
|
+
ca_iter_state_finish(&st);
|
|
294
|
+
if ( naxes == ca->ndim && !keep_axis ) return BOOL2VAL(op[0]);
|
|
295
|
+
return vout;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
VALUE
|
|
299
|
+
rb_ca_none_ki (int argc, VALUE *argv, VALUE self)
|
|
300
|
+
{
|
|
301
|
+
CArray *src;
|
|
302
|
+
GetCArray(self, src);
|
|
303
|
+
volatile VALUE ropt = rb_pop_options(&argc, &argv);
|
|
304
|
+
volatile VALUE raxis = Qnil, rkeep_axis = Qnil;
|
|
305
|
+
rb_scan_options(ropt, "axis,keep_axis", &raxis, &rkeep_axis);
|
|
306
|
+
int keep_axis = RTEST(rkeep_axis);
|
|
307
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
308
|
+
int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
|
|
309
|
+
if ( argc > 0 ) {
|
|
310
|
+
rb_raise(rb_eArgError, "none_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.none(axis: 0) or a.none(axis: [0, 1])", argc);
|
|
311
|
+
}
|
|
312
|
+
switch ( src->data_type ) {
|
|
313
|
+
case CA_BOOLEAN: return none_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
|
|
314
|
+
default:
|
|
315
|
+
rb_raise(rb_eCADataTypeError, "none_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
|
|
316
|
+
}
|
|
317
|
+
return Qnil; /* unreachable */
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
void
|
|
321
|
+
Init_carray_kernels_reduce_boolean (void)
|
|
322
|
+
{
|
|
323
|
+
/* Phase E rewire: legacy 'all' now dispatches via all_ki */
|
|
324
|
+
rb_define_method(rb_cCArray, "all", rb_ca_all_ki, -1);
|
|
325
|
+
/* Phase E rewire: legacy 'any' now dispatches via any_ki */
|
|
326
|
+
rb_define_method(rb_cCArray, "any", rb_ca_any_ki, -1);
|
|
327
|
+
/* Phase E rewire: legacy 'none' now dispatches via none_ki */
|
|
328
|
+
rb_define_method(rb_cCArray, "none", rb_ca_none_ki, -1);
|
|
329
|
+
}
|