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,325 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
ca_iter_substrate.h
|
|
4
|
+
|
|
5
|
+
Internal substrate shared between the descriptor framework
|
|
6
|
+
(ca_axis_dispatch.c), the CAStride family (ca_obj_stride.c), and the
|
|
7
|
+
future kernel_iterator (ca_kernel_iterator.c).
|
|
8
|
+
|
|
9
|
+
Status: INTERNAL, but installed and unavoidable. ca_kernel_iterator.h
|
|
10
|
+
includes this header for ca_axis_desc_t / ca_op_prefix_axis_t, so every
|
|
11
|
+
kernel author gets these declarations whether they want them or not --
|
|
12
|
+
"do not include this" is not an instruction anyone can follow. What
|
|
13
|
+
holds instead: nothing declared here is a downstream contract, and the
|
|
14
|
+
signatures may change across 3.x as the engine evolves. Calling one of
|
|
15
|
+
these from an ext gem is reaching past the author surface
|
|
16
|
+
(ca_kernel_iterator.h's frozen macros and entry points), and nothing
|
|
17
|
+
will be done to keep such a call working.
|
|
18
|
+
|
|
19
|
+
The helpers were `static` inside ca_axis_dispatch.c / ca_obj_stride.c
|
|
20
|
+
until ca_kernel_iterator.c needed them; only the linkage changed, not
|
|
21
|
+
the bodies. The inline helper is defined here so it still inlines into
|
|
22
|
+
each consumer TU.
|
|
23
|
+
|
|
24
|
+
--------------------------------------------------------------------------- */
|
|
25
|
+
|
|
26
|
+
#ifndef CA_ITER_SUBSTRATE_H
|
|
27
|
+
#define CA_ITER_SUBSTRATE_H 1
|
|
28
|
+
|
|
29
|
+
#include "carray.h"
|
|
30
|
+
|
|
31
|
+
/* ==========================================================================
|
|
32
|
+
ca_axis_dispatch.c substrate
|
|
33
|
+
========================================================================== */
|
|
34
|
+
|
|
35
|
+
/* S2 / PROPOSAL_OPERAND_DESCRIPTOR Phase 1: pre-classified prefix axis.
|
|
36
|
+
|
|
37
|
+
Inner per-iteration offset contribution for prefix axis k:
|
|
38
|
+
STRIDE: poff += byte_start + idx[k] * byte_step
|
|
39
|
+
INDEX : poff += indices[idx[k]] * byte_pstride
|
|
40
|
+
SHIFT : (bound-checked, see ca_axis_dispatch_prefix_offset)
|
|
41
|
+
|
|
42
|
+
Quantities are pre-multiplied by pstrides[k] at setup time so the
|
|
43
|
+
inner loop spends one multiply per axis. */
|
|
44
|
+
|
|
45
|
+
typedef enum {
|
|
46
|
+
CA_OP_AXIS_STRIDE = 0,
|
|
47
|
+
CA_OP_AXIS_INDEX = 1,
|
|
48
|
+
CA_OP_AXIS_SHIFT = 2 /* Tier 2.B: bound-aware (CAWindow/CAShift) */
|
|
49
|
+
} ca_op_axis_kind_t;
|
|
50
|
+
|
|
51
|
+
typedef struct {
|
|
52
|
+
ca_op_axis_kind_t kind;
|
|
53
|
+
ca_size_t count;
|
|
54
|
+
/* STRIDE / SHIFT modes */
|
|
55
|
+
ca_size_t byte_start; /* = start * pstride */
|
|
56
|
+
ca_size_t byte_step; /* = step * pstride */
|
|
57
|
+
/* INDEX-mode (kind == CA_OP_AXIS_INDEX) */
|
|
58
|
+
const ca_size_t *indices;
|
|
59
|
+
ca_size_t byte_pstride; /* = pstride */
|
|
60
|
+
/* SHIFT-only fields (Tier 2.B) */
|
|
61
|
+
ca_size_t shift_start;
|
|
62
|
+
ca_size_t shift_step;
|
|
63
|
+
ca_size_t size0; /* parent dim along this axis */
|
|
64
|
+
uint8_t policy; /* CA_BOUNDS_FILL / PERIODIC / ... */
|
|
65
|
+
} ca_op_prefix_axis_t;
|
|
66
|
+
|
|
67
|
+
/* D8 (PROPOSAL_AXIS_MERGE Phase 2): in-place merge of adjacent STRIDE
|
|
68
|
+
axes when their effective byte strides line up. Operates on
|
|
69
|
+
(axes, pstrides, mdim, *ndim_inout) and writes the merged ndim back. */
|
|
70
|
+
void ca_axis_dispatch_merge (ca_axis_desc_t *axes,
|
|
71
|
+
ca_size_t *pstrides,
|
|
72
|
+
ca_size_t *mdim,
|
|
73
|
+
int8_t *ndim_inout);
|
|
74
|
+
|
|
75
|
+
/* Slab detection: identify the innermost STRIDE-step1 contig run.
|
|
76
|
+
Sets *slab_start, *slab_bytes, *slab_base. */
|
|
77
|
+
void ca_axis_dispatch_layout (ca_axis_desc_t *axes,
|
|
78
|
+
const ca_size_t *pstrides,
|
|
79
|
+
const ca_size_t *mdim,
|
|
80
|
+
int8_t ndim,
|
|
81
|
+
ca_size_t bytes,
|
|
82
|
+
int8_t *slab_start,
|
|
83
|
+
ca_size_t *slab_bytes,
|
|
84
|
+
ca_size_t *slab_base);
|
|
85
|
+
|
|
86
|
+
/* Build merged layout from caller-provided axes / parent_axis_dims.
|
|
87
|
+
Runs the D8 merge pass to fixpoint, writes results into out_*. */
|
|
88
|
+
void ca_axis_dispatch_prepare (const ca_size_t *parent_axis_dims,
|
|
89
|
+
const ca_axis_desc_t *axes,
|
|
90
|
+
int8_t ndim,
|
|
91
|
+
ca_size_t bytes,
|
|
92
|
+
ca_axis_desc_t *out_axes,
|
|
93
|
+
ca_size_t *out_pstrides,
|
|
94
|
+
ca_size_t *out_mdim,
|
|
95
|
+
int8_t *out_ndim);
|
|
96
|
+
|
|
97
|
+
/* Build pre-classified prefix axis array from the (post-merge, post-
|
|
98
|
+
layout) axes/pstrides for indices [0..slab_start-1]. */
|
|
99
|
+
void ca_axis_dispatch_classify_prefix (const ca_axis_desc_t *axes,
|
|
100
|
+
const ca_size_t *pstrides,
|
|
101
|
+
int8_t slab_start,
|
|
102
|
+
ca_op_prefix_axis_t *prefix);
|
|
103
|
+
|
|
104
|
+
/* Inline inner offset computation from pre-classified prefix. Kept as
|
|
105
|
+
`static inline` in the header so any consumer TU (ca_axis_dispatch.c,
|
|
106
|
+
future ca_kernel_iterator.c) inlines it directly. SHIFT axes apply
|
|
107
|
+
ca_bounds_normalize_index; if the normalised index is still OOB,
|
|
108
|
+
*oob is set to 1 and 0 is returned (caller decides skip vs fill). */
|
|
109
|
+
static inline ca_size_t
|
|
110
|
+
ca_axis_dispatch_prefix_offset (const ca_op_prefix_axis_t *prefix,
|
|
111
|
+
const ca_size_t *idx,
|
|
112
|
+
int8_t slab_start,
|
|
113
|
+
int *oob)
|
|
114
|
+
{
|
|
115
|
+
ca_size_t off = 0;
|
|
116
|
+
int8_t k;
|
|
117
|
+
*oob = 0;
|
|
118
|
+
for ( k = 0; k < slab_start; k++ ) {
|
|
119
|
+
if ( prefix[k].kind == CA_OP_AXIS_STRIDE ) {
|
|
120
|
+
off += prefix[k].byte_start + idx[k] * prefix[k].byte_step;
|
|
121
|
+
} else if ( prefix[k].kind == CA_OP_AXIS_INDEX ) {
|
|
122
|
+
off += prefix[k].indices[idx[k]] * prefix[k].byte_pstride;
|
|
123
|
+
} else { /* SHIFT */
|
|
124
|
+
ca_size_t pi = prefix[k].shift_start + idx[k] * prefix[k].shift_step;
|
|
125
|
+
if ( pi < 0 || pi >= prefix[k].size0 ) {
|
|
126
|
+
pi = ca_bounds_normalize_index(prefix[k].policy,
|
|
127
|
+
prefix[k].size0, pi);
|
|
128
|
+
if ( pi < 0 || pi >= prefix[k].size0 ) {
|
|
129
|
+
*oob = 1;
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
off += pi * prefix[k].byte_pstride;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return off;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* Per-slab callback driver (T1 Phase 0 P3, 2026-05-25). The engine
|
|
140
|
+
walks the (post-merge / post-layout) prefix axes row-major and for
|
|
141
|
+
each iteration invokes `cb` with:
|
|
142
|
+
slab_ptr = parent->ptr + composed_offset
|
|
143
|
+
oob = SHIFT-axis out-of-bounds flag (0 = in-bounds)
|
|
144
|
+
slab_n = slab span in bytes (constant across iters)
|
|
145
|
+
ctx = caller cookie (callback advances its own buf position)
|
|
146
|
+
|
|
147
|
+
gather / scatter / fill_value are now thin callback wrappers around
|
|
148
|
+
this driver; future ca_kernel_iterator.c will use the same primitive
|
|
149
|
+
(with its own user-kernel-wrapping callback) for descriptor-routed
|
|
150
|
+
slab walks. */
|
|
151
|
+
/* slab_off is the slab's byte offset into the parent, not a pointer into it:
|
|
152
|
+
a fill that means to write through the parent's own slots rather than a
|
|
153
|
+
borrowed buffer has no parent->ptr to offset from. Callbacks that do want
|
|
154
|
+
the pointer add parent->ptr themselves, from their own ctx. */
|
|
155
|
+
typedef void (*ca_slab_cb_t) (ca_size_t slab_off,
|
|
156
|
+
int oob,
|
|
157
|
+
ca_size_t slab_n,
|
|
158
|
+
void *ctx);
|
|
159
|
+
|
|
160
|
+
void ca_axis_dispatch_for_each_slab (CArray *parent,
|
|
161
|
+
const ca_size_t *parent_axis_dims,
|
|
162
|
+
ca_axis_desc_t *axes,
|
|
163
|
+
int8_t ndim,
|
|
164
|
+
ca_size_t bytes,
|
|
165
|
+
ca_size_t total_elements,
|
|
166
|
+
ca_slab_cb_t cb,
|
|
167
|
+
void *ctx);
|
|
168
|
+
|
|
169
|
+
/* ==========================================================================
|
|
170
|
+
ca_obj_stride.c substrate
|
|
171
|
+
========================================================================== */
|
|
172
|
+
|
|
173
|
+
/* Strided gather/scatter with caller-provided strides+base (used by the
|
|
174
|
+
compose-fold copy_data/sync_data path and by future kernel_iterator
|
|
175
|
+
non-contig CAStride scratch path). */
|
|
176
|
+
void ca_stride_xfer_with_layout (CAStride *ca, int scatter, char *base,
|
|
177
|
+
const ca_size_t *strides);
|
|
178
|
+
|
|
179
|
+
/* Shared strided-region walker for ca_xfer_stride_dispatch (carray_core.c)
|
|
180
|
+
and ca_stride_func_xfer_stride (ca_obj_stride.c). Caller computes any
|
|
181
|
+
base offset into src_base and supplies byte strides in src_strides[];
|
|
182
|
+
the helper applies slab merge, 2-D tile-block transpose at the inner
|
|
183
|
+
pair, and a general outer-prefix odometer with per-iter slab memcpy.
|
|
184
|
+
`data` is the contig side (row-major over counts in `bytes` per cell).
|
|
185
|
+
`dir` is CA_XFER_GET (src -> data) or CA_XFER_PUT (data -> src).
|
|
186
|
+
XFER_REFORM_DEFERRED C.2 sub-A, 2026-05-31. */
|
|
187
|
+
void ca_xfer_strided_walk (char *src_base,
|
|
188
|
+
ca_size_t bytes,
|
|
189
|
+
int8_t ndim,
|
|
190
|
+
const ca_size_t *counts,
|
|
191
|
+
const ca_size_t *src_strides,
|
|
192
|
+
char *data,
|
|
193
|
+
int dir);
|
|
194
|
+
|
|
195
|
+
/* In-place merge of adjacent CAStride axes whose strides compose to a
|
|
196
|
+
contig run. PROPOSAL_AXIS_MERGE Phase 1 (CAStride 0a). */
|
|
197
|
+
void ca_stride_merge_axes (ca_size_t *strides,
|
|
198
|
+
ca_size_t *dim,
|
|
199
|
+
int8_t *ndim_inout);
|
|
200
|
+
|
|
201
|
+
/* Typed strided gather/scatter for one row of n cells of `bytes` width.
|
|
202
|
+
strided_step is byte stride (may be negative). Moved to the header as
|
|
203
|
+
`static inline` (PROPOSAL_TRANSFORM_FUSED_XFER 2026-05-31 + T10 perf fix):
|
|
204
|
+
both ca_obj_stride.c (xfer_with_layout general driver) and
|
|
205
|
+
ca_transform_common.c (fused walk) need this hot, so keep the typed
|
|
206
|
+
inner loops inlinable at every call site. */
|
|
207
|
+
#define CA_STRIDE_GATHER_TYPED(T) \
|
|
208
|
+
do { \
|
|
209
|
+
T *dp = (T *) contig; \
|
|
210
|
+
const char *sp = strided; \
|
|
211
|
+
ca_size_t i; \
|
|
212
|
+
for (i = 0; i < n; i++) { \
|
|
213
|
+
T v; \
|
|
214
|
+
memcpy(&v, sp, sizeof(T)); \
|
|
215
|
+
*dp++ = v; \
|
|
216
|
+
sp += strided_step; \
|
|
217
|
+
} \
|
|
218
|
+
} while (0)
|
|
219
|
+
|
|
220
|
+
#define CA_STRIDE_SCATTER_TYPED(T) \
|
|
221
|
+
do { \
|
|
222
|
+
char *dp = strided; \
|
|
223
|
+
const T *sp = (const T *) contig; \
|
|
224
|
+
ca_size_t i; \
|
|
225
|
+
for (i = 0; i < n; i++) { \
|
|
226
|
+
T v = *sp++; \
|
|
227
|
+
memcpy(dp, &v, sizeof(T)); \
|
|
228
|
+
dp += strided_step; \
|
|
229
|
+
} \
|
|
230
|
+
} while (0)
|
|
231
|
+
|
|
232
|
+
static inline void
|
|
233
|
+
ca_stride_gather_run (char *contig, const char *strided,
|
|
234
|
+
ca_size_t bytes, ca_size_t n, ca_size_t strided_step)
|
|
235
|
+
{
|
|
236
|
+
if (strided_step == bytes) {
|
|
237
|
+
memcpy(contig, strided, n * bytes);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
switch (bytes) {
|
|
241
|
+
case 1: CA_STRIDE_GATHER_TYPED(int8_t); return;
|
|
242
|
+
case 2: CA_STRIDE_GATHER_TYPED(int16_t); return;
|
|
243
|
+
case 4: CA_STRIDE_GATHER_TYPED(int32_t); return;
|
|
244
|
+
case 8: CA_STRIDE_GATHER_TYPED(int64_t); return;
|
|
245
|
+
default: break;
|
|
246
|
+
}
|
|
247
|
+
ca_size_t i;
|
|
248
|
+
for (i = 0; i < n; i++) {
|
|
249
|
+
memcpy(contig, strided, bytes);
|
|
250
|
+
contig += bytes;
|
|
251
|
+
strided += strided_step;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
static inline void
|
|
256
|
+
ca_stride_scatter_run (char *strided, const char *contig,
|
|
257
|
+
ca_size_t bytes, ca_size_t n, ca_size_t strided_step)
|
|
258
|
+
{
|
|
259
|
+
if (strided_step == bytes) {
|
|
260
|
+
memcpy(strided, contig, n * bytes);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
switch (bytes) {
|
|
264
|
+
case 1: CA_STRIDE_SCATTER_TYPED(int8_t); return;
|
|
265
|
+
case 2: CA_STRIDE_SCATTER_TYPED(int16_t); return;
|
|
266
|
+
case 4: CA_STRIDE_SCATTER_TYPED(int32_t); return;
|
|
267
|
+
case 8: CA_STRIDE_SCATTER_TYPED(int64_t); return;
|
|
268
|
+
default: break;
|
|
269
|
+
}
|
|
270
|
+
ca_size_t i;
|
|
271
|
+
for (i = 0; i < n; i++) {
|
|
272
|
+
memcpy(strided, contig, bytes);
|
|
273
|
+
strided += strided_step;
|
|
274
|
+
contig += bytes;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* ==========================================================================
|
|
279
|
+
ca_transform_common.c substrate
|
|
280
|
+
(PROPOSAL_TRANSFORM_FUSED_XFER rev3, 2026-05-31)
|
|
281
|
+
========================================================================== */
|
|
282
|
+
|
|
283
|
+
/* Per-view transform callback for a contig row of n cells (GET or PUT).
|
|
284
|
+
`src` is parent_bytes per cell, `dst` is view_bytes per cell (or swapped
|
|
285
|
+
for PUT). Used by ca_xfer_stride_transform_fused. */
|
|
286
|
+
typedef void (*ca_transform_row_fn)(
|
|
287
|
+
ca_size_t n,
|
|
288
|
+
CArray *src_arr, char *src_row,
|
|
289
|
+
CArray *dst_arr, char *dst_row);
|
|
290
|
+
|
|
291
|
+
/* Fused walk: compose to root, then per-inner-row gather + transform (GET)
|
|
292
|
+
or transform + scatter (PUT). No whole-view scratch, no ca_attach.
|
|
293
|
+
Returns 1 on success, 0 if eligibility check fails (caller falls back). */
|
|
294
|
+
int ca_xfer_stride_transform_fused (
|
|
295
|
+
CArray *view,
|
|
296
|
+
CArray *parent,
|
|
297
|
+
ca_size_t *starts,
|
|
298
|
+
ca_size_t *counts,
|
|
299
|
+
ca_size_t *strides,
|
|
300
|
+
char *data,
|
|
301
|
+
int dir,
|
|
302
|
+
ca_transform_row_fn xform_get,
|
|
303
|
+
ca_transform_row_fn xform_put);
|
|
304
|
+
|
|
305
|
+
/* ==========================================================================
|
|
306
|
+
F-2 (PROPOSAL_F2_KERNEL_ITERATOR_ALIAS rev6): innermost-STRIDE L2 alias
|
|
307
|
+
========================================================================== */
|
|
308
|
+
|
|
309
|
+
/* Predicate: innermost axis (= descs[ndim-1]) is STRIDE kind. This is the
|
|
310
|
+
minimum requirement for L2 strided alias of a descriptor-routed view
|
|
311
|
+
(CAWindow / CAShift / CSA / CAGrid). Outer axes may be any kind
|
|
312
|
+
(STRIDE / INDEX / SHIFT); they are walked by the prefix iterator and
|
|
313
|
+
per-iter offset is computed via ca_axis_dispatch_prefix_offset. */
|
|
314
|
+
int ca_axis_dispatch_is_innermost_stride (const ca_axis_desc_t *descs,
|
|
315
|
+
int8_t ndim);
|
|
316
|
+
|
|
317
|
+
/* Predicate: any outer axis (= descs[0..ndim-2]) is SHIFT kind. When
|
|
318
|
+
true, the L2 alias init must allocate a fill-slab scratch buffer so
|
|
319
|
+
OOB cells in the outer prefix walk yield a contig fill slab instead
|
|
320
|
+
of an out-of-bounds alias pointer. When false, alias mode can yield
|
|
321
|
+
parent.ptr + offset directly for every outer iteration. */
|
|
322
|
+
int ca_axis_dispatch_outer_has_shift (const ca_axis_desc_t *descs,
|
|
323
|
+
int8_t ndim);
|
|
324
|
+
|
|
325
|
+
#endif /* CA_ITER_SUBSTRATE_H */
|