carray 3.0.2 → 3.0.4
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/CHANGELOG.md +568 -0
- data/README.md +6 -6
- data/carray.gemspec +1 -1
- data/ext/ca_axis_descriptor.h +27 -24
- data/ext/ca_axis_dispatch.c +220 -0
- data/ext/ca_axis_group.c +201 -123
- data/ext/ca_binop_dispatch.c +46 -52
- data/ext/ca_binop_dispatch.h +1 -1
- data/ext/ca_categorical_iterator.c +249 -183
- data/ext/ca_compare.c +7 -12
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +38 -23
- data/ext/ca_kernel_iterator.c +1765 -2076
- data/ext/ca_kernel_iterator.h +584 -566
- data/ext/ca_monop_dispatch.c +86 -63
- data/ext/ca_monop_dispatch.h +5 -0
- data/ext/ca_obj_array.c +223 -56
- data/ext/ca_obj_bincmp.c +172 -138
- data/ext/ca_obj_binop.c +116 -230
- data/ext/ca_obj_bitarray.c +40 -26
- data/ext/ca_obj_bitfield.c +100 -68
- data/ext/ca_obj_block.c +19 -9
- data/ext/ca_obj_byte_swap.c +45 -46
- data/ext/ca_obj_const_string.c +269 -44
- data/ext/ca_obj_face.c +612 -89
- data/ext/ca_obj_face.h +111 -47
- data/ext/ca_obj_fake.c +36 -79
- data/ext/ca_obj_farray.c +7 -3
- data/ext/ca_obj_field.c +33 -8
- data/ext/ca_obj_fixlen_string.c +23 -24
- data/ext/ca_obj_grid.c +541 -210
- data/ext/ca_obj_meld.c +331 -111
- data/ext/ca_obj_moncmp.c +80 -65
- data/ext/ca_obj_monop.c +177 -149
- data/ext/ca_obj_object.c +664 -248
- data/ext/ca_obj_record.c +63 -23
- data/ext/ca_obj_reduce.c +18 -16
- data/ext/ca_obj_refer.c +140 -58
- data/ext/ca_obj_remap.c +85 -24
- data/ext/ca_obj_repeat.c +24 -9
- data/ext/ca_obj_roll.c +121 -16
- data/ext/ca_obj_select.c +61 -58
- data/ext/ca_obj_select_axis.c +73 -107
- data/ext/ca_obj_shift.c +32 -102
- data/ext/ca_obj_stack.c +372 -122
- data/ext/ca_obj_stride.c +348 -140
- data/ext/ca_obj_string.c +88 -22
- data/ext/ca_obj_tile.c +38 -21
- data/ext/ca_obj_time.c +45 -31
- data/ext/ca_obj_timedelta.c +43 -29
- data/ext/ca_obj_transpose.c +17 -6
- data/ext/ca_obj_triop.c +125 -141
- data/ext/ca_obj_window.c +330 -44
- data/ext/ca_op_ipower.c +24 -11
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +104 -81
- data/ext/ca_sweep_engine.h +7 -20
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +542 -0
- data/ext/carray.h +241 -92
- data/ext/carray_access.c +608 -276
- data/ext/carray_address_basis.c +494 -97
- data/ext/carray_attribute.c +129 -4
- data/ext/carray_bincount.c +39 -7
- data/ext/carray_broadcast.c +56 -19
- data/ext/carray_build_flags.h +1 -1
- data/ext/carray_call_cfunc.c +108 -28
- data/ext/carray_cast.c +1576 -223
- data/ext/carray_cast_func.rb +77 -24
- data/ext/carray_class.c +4 -3
- data/ext/carray_conversion.c +208 -75
- data/ext/carray_copy.c +82 -24
- data/ext/carray_core.c +646 -162
- data/ext/carray_count.c +171 -88
- data/ext/carray_element.c +94 -60
- data/ext/carray_factorize.c +670 -324
- data/ext/carray_generate.c +260 -83
- data/ext/carray_histogram.c +209 -106
- data/ext/carray_hold.c +14 -16
- data/ext/carray_index_classifier.c +422 -243
- data/ext/carray_internal.h +692 -3
- data/ext/carray_kernels_bincmp.c +7 -0
- data/ext/carray_kernels_binop.c +487 -120
- data/ext/carray_kernels_init.c +653 -50
- data/ext/carray_kernels_moncmp.c +15 -8
- data/ext/carray_kernels_monop.c +99 -43
- data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
- data/ext/carray_kernels_reduce_boolean.c +112 -36
- data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
- data/ext/carray_kernels_reduce_extreme.c +3032 -2892
- data/ext/carray_kernels_reduce_variance.c +439 -500
- data/ext/carray_kernels_scan.c +1097 -488
- data/ext/carray_kernels_search.c +3787 -2176
- data/ext/carray_kernels_sort.c +1200 -920
- data/ext/carray_kernels_triop.c +479 -7
- data/ext/carray_key_windows.c +216 -0
- data/ext/carray_lazy.c +967 -153
- data/ext/carray_loop.c +81 -65
- data/ext/carray_mask.c +910 -324
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +299 -100
- data/ext/carray_memory_view.c +872 -758
- data/ext/carray_operator.c +1171 -364
- data/ext/carray_order.c +505 -133
- data/ext/carray_partition.c +112 -65
- data/ext/carray_random.c +327 -239
- data/ext/carray_round.c +273 -0
- data/ext/carray_scatter.c +346 -78
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +249 -86
- data/ext/carray_sort.c +224 -227
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +118 -39
- data/ext/carray_test.c +193 -69
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_undef.c +4 -0
- data/ext/carray_utils.c +579 -113
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +19 -4
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1202 -1014
- data/ext/ruby_carray.c +17 -5
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +160 -17
- data/lib/carray/autoload_carray.rb +23 -27
- data/lib/carray/autoload_method_extension.rb +20 -5
- data/lib/carray/axis_group.rb +360 -63
- data/lib/carray/basics.rb +162 -28
- data/lib/carray/bincount_nd.rb +18 -2
- data/lib/carray/block_iterator.rb +231 -58
- data/lib/carray/boolean_reduce.rb +34 -42
- data/lib/carray/categorical.rb +242 -52
- data/lib/carray/categorical_iterator.rb +437 -827
- data/lib/carray/complex.rb +41 -34
- data/lib/carray/conditional.rb +150 -14
- data/lib/carray/const_string.rb +59 -4
- data/lib/carray/construct.rb +15 -11
- data/lib/carray/data_type_extension.rb +1 -0
- data/lib/carray/distance_limit.rb +77 -0
- data/lib/carray/fixlen_string.rb +7 -1
- data/lib/carray/frame/column_verbs.rb +70 -0
- data/lib/carray/frame/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +82 -7
- data/lib/carray/frame/csv_parser.rb +688 -87
- data/lib/carray/frame/describe.rb +80 -0
- data/lib/carray/frame/frame.rb +369 -45
- data/lib/carray/frame/group.rb +631 -90
- data/lib/carray/frame/io.rb +506 -79
- data/lib/carray/frame/join.rb +411 -62
- data/lib/carray/frame/records.rb +116 -19
- data/lib/carray/frame/reshape.rb +455 -0
- data/lib/carray/frame/sort.rb +30 -18
- data/lib/carray/frame/verbs.rb +868 -61
- data/lib/carray/frame/windows.rb +117 -0
- data/lib/carray/frame.rb +4 -0
- data/lib/carray/fuse_source.rb +118 -2
- data/lib/carray/fusion.rb +257 -42
- data/lib/carray/histogram.rb +6 -1
- data/lib/carray/inspect.rb +54 -13
- data/lib/carray/iterator.rb +99 -9
- data/lib/carray/key_windows.rb +620 -0
- data/lib/carray/lazy.rb +216 -193
- data/lib/carray/mask_gap_fill.rb +112 -92
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +52 -21
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bin.rb +26 -18
- data/lib/carray/methods/bincount.rb +18 -2
- data/lib/carray/methods/bit_string.rb +15 -4
- data/lib/carray/methods/choose.rb +16 -3
- data/lib/carray/methods/composition.rb +18 -10
- data/lib/carray/methods/factorize.rb +2 -2
- data/lib/carray/methods/gather_nd.rb +25 -5
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_between.rb +59 -0
- data/lib/carray/methods/is_in.rb +140 -10
- data/lib/carray/methods/join.rb +2 -7
- data/lib/carray/methods/lag.rb +49 -0
- data/lib/carray/methods/locate_addr.rb +182 -45
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/nunique.rb +11 -6
- data/lib/carray/methods/repeat.rb +1 -20
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +11 -2
- data/lib/carray/methods/value_counts.rb +4 -11
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/rng.rb +3 -0
- data/lib/carray/runtime.rb +65 -17
- data/lib/carray/segment_iterator.rb +1221 -0
- data/lib/carray/serialize.rb +214 -30
- data/lib/carray/slab_iterator.rb +101 -27
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string.rb +105 -5
- data/lib/carray/string_operation_extension.rb +12 -4
- data/lib/carray/struct.rb +137 -58
- data/lib/carray/struct_builder.rb +124 -17
- data/lib/carray/time.rb +1222 -186
- data/lib/carray/window_iterator.rb +242 -81
- data/lib/carray.rb +9 -2
- data/yard-stubs/ca_obj_array.rb +4 -4
- data/yard-stubs/ca_obj_bitarray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +23 -12
- data/yard-stubs/ca_obj_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +5 -1
- data/yard-stubs/ca_obj_grid.rb +21 -10
- data/yard-stubs/ca_obj_refer.rb +5 -4
- data/yard-stubs/ca_obj_roll.rb +2 -3
- data/yard-stubs/ca_obj_shift.rb +5 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_tile.rb +1 -1
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +9 -5
- data/yard-stubs/carray_access.rb +11 -5
- data/yard-stubs/carray_attribute.rb +0 -5
- data/yard-stubs/carray_broadcast.rb +1 -1
- data/yard-stubs/carray_cast.rb +88 -43
- data/yard-stubs/carray_conversion.rb +15 -2
- data/yard-stubs/carray_copy.rb +12 -5
- data/yard-stubs/carray_core.rb +3 -3
- data/yard-stubs/carray_count.rb +9 -0
- data/yard-stubs/carray_element.rb +10 -4
- data/yard-stubs/carray_generate.rb +21 -1
- data/yard-stubs/carray_lazy.rb +5 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +60 -12
- data/yard-stubs/carray_math.rb +52 -14
- data/yard-stubs/carray_median_percentile.rb +15 -8
- data/yard-stubs/carray_memory_view.rb +40 -23
- data/yard-stubs/carray_order.rb +61 -29
- data/yard-stubs/carray_random.rb +13 -4
- data/yard-stubs/carray_scatter.rb +21 -9
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +10 -2
- data/yard-stubs/carray_sort.rb +49 -8
- data/yard-stubs/carray_test.rb +15 -3
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +19 -5
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_kernels_map.c +0 -3467
- data/lib/carray/arrow_tensor.rb +0 -401
- data/lib/carray/table.rb +0 -108
data/yard-stubs/carray_utils.rb
CHANGED
|
@@ -67,31 +67,5 @@ class CArray
|
|
|
67
67
|
def guess_type_and_bytes(type_spec, bytes = nil); end
|
|
68
68
|
|
|
69
69
|
# @!endgroup
|
|
70
|
-
|
|
71
|
-
# @!group String scanning (internal)
|
|
72
|
-
|
|
73
|
-
# @overload _scan_float(str, fill_value = nil)
|
|
74
|
-
# Parses `str` as a single double-precision float. Returns
|
|
75
|
-
# `fill_value` (or `NaN` if `fill_value` is nil) when `str` is
|
|
76
|
-
# `nil` or unparseable. Internal helper used by text-format I/O
|
|
77
|
-
# readers; end users should prefer Ruby's `Float()` /
|
|
78
|
-
# `String#to_f`.
|
|
79
|
-
# @param str [String, nil]
|
|
80
|
-
# @param fill_value [Float, nil]
|
|
81
|
-
# @return [Float]
|
|
82
|
-
# @api private
|
|
83
|
-
def _scan_float(str, fill_value = nil); end
|
|
84
|
-
|
|
85
|
-
# @overload _scan_int(str, fill_value = nil)
|
|
86
|
-
# Parses `str` as a single integer. Returns `fill_value`
|
|
87
|
-
# (or `0` if `fill_value` is nil) when `str` is `nil` or
|
|
88
|
-
# unparseable. Internal helper used by text-format I/O readers.
|
|
89
|
-
# @param str [String, nil]
|
|
90
|
-
# @param fill_value [Integer, nil]
|
|
91
|
-
# @return [Integer]
|
|
92
|
-
# @api private
|
|
93
|
-
def _scan_int(str, fill_value = nil); end
|
|
94
|
-
|
|
95
|
-
# @!endgroup
|
|
96
70
|
end
|
|
97
71
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: carray
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0.
|
|
4
|
+
version: 3.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- himotoyoshi
|
|
@@ -45,7 +45,6 @@ files:
|
|
|
45
45
|
- ext/ca_composite_dispatch.c
|
|
46
46
|
- ext/ca_composite_dispatch.h
|
|
47
47
|
- ext/ca_for_buffer.h
|
|
48
|
-
- ext/ca_for_each_element.h
|
|
49
48
|
- ext/ca_group_iter.c
|
|
50
49
|
- ext/ca_iter_substrate.h
|
|
51
50
|
- ext/ca_kernel_iterator.c
|
|
@@ -96,6 +95,7 @@ files:
|
|
|
96
95
|
- ext/ca_op_cmplx64.h
|
|
97
96
|
- ext/ca_op_ipower.c
|
|
98
97
|
- ext/ca_op_powi.h
|
|
98
|
+
- ext/ca_pow5_table.h
|
|
99
99
|
- ext/ca_rng_normal.h
|
|
100
100
|
- ext/ca_rng_xoshiro256pp.h
|
|
101
101
|
- ext/ca_sort_kernels.h
|
|
@@ -104,6 +104,7 @@ files:
|
|
|
104
104
|
- ext/ca_transform_common.c
|
|
105
105
|
- ext/ca_triop_dispatch.c
|
|
106
106
|
- ext/ca_triop_dispatch.h
|
|
107
|
+
- ext/caframe_csv_reader.c
|
|
107
108
|
- ext/carray.h
|
|
108
109
|
- ext/carray_access.c
|
|
109
110
|
- ext/carray_address_basis.c
|
|
@@ -133,7 +134,6 @@ files:
|
|
|
133
134
|
- ext/carray_kernels_bincmp.c
|
|
134
135
|
- ext/carray_kernels_binop.c
|
|
135
136
|
- ext/carray_kernels_init.c
|
|
136
|
-
- ext/carray_kernels_map.c
|
|
137
137
|
- ext/carray_kernels_moncmp.c
|
|
138
138
|
- ext/carray_kernels_monop.c
|
|
139
139
|
- ext/carray_kernels_reduce_aggregate.c
|
|
@@ -145,6 +145,7 @@ files:
|
|
|
145
145
|
- ext/carray_kernels_search.c
|
|
146
146
|
- ext/carray_kernels_sort.c
|
|
147
147
|
- ext/carray_kernels_triop.c
|
|
148
|
+
- ext/carray_key_windows.c
|
|
148
149
|
- ext/carray_lazy.c
|
|
149
150
|
- ext/carray_loop.c
|
|
150
151
|
- ext/carray_mask.c
|
|
@@ -156,23 +157,26 @@ files:
|
|
|
156
157
|
- ext/carray_order.c
|
|
157
158
|
- ext/carray_partition.c
|
|
158
159
|
- ext/carray_random.c
|
|
160
|
+
- ext/carray_round.c
|
|
159
161
|
- ext/carray_scatter.c
|
|
162
|
+
- ext/carray_segment.c
|
|
160
163
|
- ext/carray_slab.c
|
|
161
164
|
- ext/carray_slab.h
|
|
162
165
|
- ext/carray_sort.c
|
|
163
166
|
- ext/carray_sort_kernel.c
|
|
164
167
|
- ext/carray_struct.c
|
|
165
168
|
- ext/carray_test.c
|
|
169
|
+
- ext/carray_time_text.c
|
|
166
170
|
- ext/carray_undef.c
|
|
167
171
|
- ext/carray_utils.c
|
|
168
172
|
- ext/extconf.rb
|
|
169
173
|
- ext/mk_call_cfunc.rb
|
|
174
|
+
- ext/mk_pow5_table.rb
|
|
170
175
|
- ext/mkkernel.rb
|
|
171
176
|
- ext/ruby_carray.c
|
|
172
177
|
- ext/version.h
|
|
173
178
|
- ext/version.rb
|
|
174
179
|
- lib/carray.rb
|
|
175
|
-
- lib/carray/arrow_tensor.rb
|
|
176
180
|
- lib/carray/attribute.rb
|
|
177
181
|
- lib/carray/autoload_carray.rb
|
|
178
182
|
- lib/carray/autoload_method_extension.rb
|
|
@@ -190,23 +194,29 @@ files:
|
|
|
190
194
|
- lib/carray/core_extensions.rb
|
|
191
195
|
- lib/carray/data_type_extension.rb
|
|
192
196
|
- lib/carray/data_type_limits.rb
|
|
197
|
+
- lib/carray/distance_limit.rb
|
|
193
198
|
- lib/carray/fixlen_string.rb
|
|
194
199
|
- lib/carray/frame.rb
|
|
200
|
+
- lib/carray/frame/column_verbs.rb
|
|
195
201
|
- lib/carray/frame/concat.rb
|
|
196
202
|
- lib/carray/frame/convert.rb
|
|
197
203
|
- lib/carray/frame/csv_parser.rb
|
|
204
|
+
- lib/carray/frame/describe.rb
|
|
198
205
|
- lib/carray/frame/frame.rb
|
|
199
206
|
- lib/carray/frame/group.rb
|
|
200
207
|
- lib/carray/frame/io.rb
|
|
201
208
|
- lib/carray/frame/join.rb
|
|
202
209
|
- lib/carray/frame/records.rb
|
|
210
|
+
- lib/carray/frame/reshape.rb
|
|
203
211
|
- lib/carray/frame/sort.rb
|
|
204
212
|
- lib/carray/frame/verbs.rb
|
|
213
|
+
- lib/carray/frame/windows.rb
|
|
205
214
|
- lib/carray/fuse_source.rb
|
|
206
215
|
- lib/carray/fusion.rb
|
|
207
216
|
- lib/carray/histogram.rb
|
|
208
217
|
- lib/carray/inspect.rb
|
|
209
218
|
- lib/carray/iterator.rb
|
|
219
|
+
- lib/carray/key_windows.rb
|
|
210
220
|
- lib/carray/lazy.rb
|
|
211
221
|
- lib/carray/mask_gap_fill.rb
|
|
212
222
|
- lib/carray/math.rb
|
|
@@ -223,8 +233,10 @@ files:
|
|
|
223
233
|
- lib/carray/methods/gather_nd.rb
|
|
224
234
|
- lib/carray/methods/index.rb
|
|
225
235
|
- lib/carray/methods/insert_block.rb
|
|
236
|
+
- lib/carray/methods/is_between.rb
|
|
226
237
|
- lib/carray/methods/is_in.rb
|
|
227
238
|
- lib/carray/methods/join.rb
|
|
239
|
+
- lib/carray/methods/lag.rb
|
|
228
240
|
- lib/carray/methods/locate_addr.rb
|
|
229
241
|
- lib/carray/methods/mask_duplicates.rb
|
|
230
242
|
- lib/carray/methods/meshgrid.rb
|
|
@@ -237,8 +249,10 @@ files:
|
|
|
237
249
|
- lib/carray/methods/unique.rb
|
|
238
250
|
- lib/carray/methods/value_counts.rb
|
|
239
251
|
- lib/carray/mkmf.rb
|
|
252
|
+
- lib/carray/record_order.rb
|
|
240
253
|
- lib/carray/rng.rb
|
|
241
254
|
- lib/carray/runtime.rb
|
|
255
|
+
- lib/carray/segment_iterator.rb
|
|
242
256
|
- lib/carray/serialize.rb
|
|
243
257
|
- lib/carray/slab_iterator.rb
|
|
244
258
|
- lib/carray/stack.rb
|
|
@@ -246,7 +260,6 @@ files:
|
|
|
246
260
|
- lib/carray/string_operation_extension.rb
|
|
247
261
|
- lib/carray/struct.rb
|
|
248
262
|
- lib/carray/struct_builder.rb
|
|
249
|
-
- lib/carray/table.rb
|
|
250
263
|
- lib/carray/time.rb
|
|
251
264
|
- lib/carray/window_iterator.rb
|
|
252
265
|
- yard-stubs/ca_obj_array.rb
|
|
@@ -286,6 +299,7 @@ files:
|
|
|
286
299
|
- yard-stubs/carray_order.rb
|
|
287
300
|
- yard-stubs/carray_random.rb
|
|
288
301
|
- yard-stubs/carray_scatter.rb
|
|
302
|
+
- yard-stubs/carray_segment.rb
|
|
289
303
|
- yard-stubs/carray_slab.rb
|
|
290
304
|
- yard-stubs/carray_sort.rb
|
|
291
305
|
- yard-stubs/carray_test.rb
|
data/ext/ca_for_each_element.h
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
/* ---------------------------------------------------------------------------
|
|
2
|
-
*
|
|
3
|
-
* ca_for_each_element.h -- sweep ELEMENT macro family (single-array, lexical
|
|
4
|
-
* scope body) for ext authors.
|
|
5
|
-
*
|
|
6
|
-
* PROPOSAL_L0_AUTHOR_SURFACE L0.2a (2026-06-11). Builds on the sweep engine
|
|
7
|
-
* helper (ca_sweep_engine.{c,h}, L0.1) for the xfer_all-aware acquire/release
|
|
8
|
-
* lifecycle. Provides 5 macro forms for single-array element-wise loops
|
|
9
|
-
* with author-inline body and lexical-scope state capture.
|
|
10
|
-
*
|
|
11
|
-
* Forms (Q2 = gamma: READ by-value, INOUT / OUT by-lvalue):
|
|
12
|
-
*
|
|
13
|
-
* CA_FOR_EACH_ELEMENT(st1, ca, T, x)
|
|
14
|
-
* Read-only loop; per-iter x = cell value (T rvalue convention but
|
|
15
|
-
* declared lvalue for assignment). Mask policy: NO_MASK (raises if
|
|
16
|
-
* INPUT has mask; use _MASKED form to handle).
|
|
17
|
-
*
|
|
18
|
-
* CA_FOR_EACH_ELEMENT_MASKED(st1, ca, T, x, m)
|
|
19
|
-
* Read-only with mask byte m (1 = masked). Author inspects m and
|
|
20
|
-
* decides; m == 0 if source has no mask.
|
|
21
|
-
*
|
|
22
|
-
* CA_FOR_EACH_ELEMENT_INOUT(st2, ca_in, ca_out, T_IN, T_OUT, in, out)
|
|
23
|
-
* Map kernel; per-iter in = read input, body assigns to out (lvalue),
|
|
24
|
-
* out is written back to ca_out. Strict same-shape check on init
|
|
25
|
-
* (raises on mismatch). NO_MASK on input.
|
|
26
|
-
*
|
|
27
|
-
* CA_FOR_EACH_ELEMENT_INOUT_MASKED(st2, ca_in, ca_out, T_IN, T_OUT,
|
|
28
|
-
* in, out, m_in, m_out)
|
|
29
|
-
* Map kernel with mask; per-iter m_in = input mask byte (or 0 if no
|
|
30
|
-
* input mask), author writes m_out (1 = mark output cell masked) and
|
|
31
|
-
* out. m_out written back to ca_out's mask.
|
|
32
|
-
*
|
|
33
|
-
* CA_FOR_EACH_ELEMENT_OUT(st1, ca_out, T, out)
|
|
34
|
-
* Write-only; body assigns to out (lvalue). Use for init / iota /
|
|
35
|
-
* fill patterns. NO_MASK (output mask cleared).
|
|
36
|
-
*
|
|
37
|
-
* Usage pattern:
|
|
38
|
-
*
|
|
39
|
-
* ca_each_state_t st;
|
|
40
|
-
* double x;
|
|
41
|
-
* CA_FOR_EACH_ELEMENT(st, ca, double, x) {
|
|
42
|
-
* accumulator += x;
|
|
43
|
-
* }
|
|
44
|
-
*
|
|
45
|
-
* Constraints (same as CA_FOR_EACH_FIBER family):
|
|
46
|
-
* - State (st1 / st2) is author-declared on the stack.
|
|
47
|
-
* - `break;` from body exits cleanly (release runs in outer for's
|
|
48
|
-
* teardown clause).
|
|
49
|
-
* - `return;` from body LEAKS scratch buffers / attached views — do
|
|
50
|
-
* not return early from the macro body; restructure to break.
|
|
51
|
-
* - Macros are NOT statement-equivalent (expand to nested for); no
|
|
52
|
-
* trailing `else`.
|
|
53
|
-
* - `T` must be the data_type of `ca` (matched via ca->data_type and
|
|
54
|
-
* ca->bytes — engine does not auto-cast; use rb_ca_wrap_readonly /
|
|
55
|
-
* rb_ca_template_with_type at the call site if cast needed).
|
|
56
|
-
*
|
|
57
|
-
* --------------------------------------------------------------------------- */
|
|
58
|
-
|
|
59
|
-
#ifndef CA_FOR_EACH_ELEMENT_H
|
|
60
|
-
#define CA_FOR_EACH_ELEMENT_H
|
|
61
|
-
|
|
62
|
-
#include "carray.h"
|
|
63
|
-
#include "ca_sweep_engine.h"
|
|
64
|
-
|
|
65
|
-
/* Stack-allocated state holders for 1- and 2-operand sweep ELEMENT macros.
|
|
66
|
-
* Embeds the per-op bookkeeping arrays + the core ca_sweep_state_t in one
|
|
67
|
-
* struct so authors declare just one variable. */
|
|
68
|
-
|
|
69
|
-
typedef struct {
|
|
70
|
-
CArray *cx[1];
|
|
71
|
-
char *base[1];
|
|
72
|
-
ca_size_t stride[1];
|
|
73
|
-
char *owned_buf[1];
|
|
74
|
-
int attached[1];
|
|
75
|
-
char *base_orig[1];
|
|
76
|
-
ca_sweep_state_t core;
|
|
77
|
-
} ca_each_state_t;
|
|
78
|
-
|
|
79
|
-
typedef struct {
|
|
80
|
-
CArray *cx[2];
|
|
81
|
-
char *base[2];
|
|
82
|
-
ca_size_t stride[2];
|
|
83
|
-
char *owned_buf[2];
|
|
84
|
-
int attached[2];
|
|
85
|
-
char *base_orig[2];
|
|
86
|
-
ca_sweep_state_t core;
|
|
87
|
-
} ca_each_map_state_t;
|
|
88
|
-
|
|
89
|
-
/* Internal init helpers: wire the embedded arrays into core, set fsync /
|
|
90
|
-
* no_mask / src_label. Called via comma-expression inside the macro
|
|
91
|
-
* for-loop init clause. */
|
|
92
|
-
|
|
93
|
-
#define CA_SWEEP_WIRE_1_(_st1, _ca0, _fsync, _no_mask, _label) ( \
|
|
94
|
-
(_st1).cx[0] = (CArray *)(_ca0), \
|
|
95
|
-
(_st1).core.n_ops = 1, \
|
|
96
|
-
(_st1).core.fsync = (_fsync), \
|
|
97
|
-
(_st1).core.cx = (_st1).cx, \
|
|
98
|
-
(_st1).core.base = (_st1).base, \
|
|
99
|
-
(_st1).core.stride = (_st1).stride, \
|
|
100
|
-
(_st1).core.owned_buf = (_st1).owned_buf, \
|
|
101
|
-
(_st1).core.attached = (_st1).attached, \
|
|
102
|
-
(_st1).core.base_orig = (_st1).base_orig, \
|
|
103
|
-
(_st1).core.no_mask = (_no_mask), \
|
|
104
|
-
(_st1).core.src_label = (_label))
|
|
105
|
-
|
|
106
|
-
#define CA_SWEEP_WIRE_2_(_st2, _ca0, _ca1, _fsync, _no_mask, _label) ( \
|
|
107
|
-
(_st2).cx[0] = (CArray *)(_ca0), \
|
|
108
|
-
(_st2).cx[1] = (CArray *)(_ca1), \
|
|
109
|
-
(_st2).core.n_ops = 2, \
|
|
110
|
-
(_st2).core.fsync = (_fsync), \
|
|
111
|
-
(_st2).core.cx = (_st2).cx, \
|
|
112
|
-
(_st2).core.base = (_st2).base, \
|
|
113
|
-
(_st2).core.stride = (_st2).stride, \
|
|
114
|
-
(_st2).core.owned_buf = (_st2).owned_buf, \
|
|
115
|
-
(_st2).core.attached = (_st2).attached, \
|
|
116
|
-
(_st2).core.base_orig = (_st2).base_orig, \
|
|
117
|
-
(_st2).core.no_mask = (_no_mask), \
|
|
118
|
-
(_st2).core.src_label = (_label))
|
|
119
|
-
|
|
120
|
-
/* ---------- 5 author-facing macro forms ----------
|
|
121
|
-
*
|
|
122
|
-
* All 5 forms expand to a 3-level nested for:
|
|
123
|
-
* outer : acquire_chunked / release_chunked (= lifecycle scope)
|
|
124
|
-
* middle : ca_sweep_next_chunk loop (= chunk iteration)
|
|
125
|
-
* inner : per-cell loop within chunk_n
|
|
126
|
-
*
|
|
127
|
-
* Memory peak per AC2: INPUT non-alias views materialise into a single
|
|
128
|
-
* chunk scratch (~32KB at f64). m0 (= masked form) is chunk-sized too and
|
|
129
|
-
* re-gathered per chunk, so the macro reads at m0[k] -- indexed within the
|
|
130
|
-
* chunk, not by the flat cell index.
|
|
131
|
-
*
|
|
132
|
-
* For MASKED forms (m / m_in / m_out): when source has no mask, m0 is
|
|
133
|
-
* NULL and m / m_in == 0 always. m_out writes during INOUT_MASKED are
|
|
134
|
-
* silently dropped if no INPUT mask exists (= AC4 mask-creation on
|
|
135
|
-
* INOUT MASKED with no source mask is a future enhancement; current
|
|
136
|
-
* convention follows the FIBER family's MASKED form).
|
|
137
|
-
*/
|
|
138
|
-
|
|
139
|
-
/* (1) READ-only, NO_MASK */
|
|
140
|
-
#define CA_FOR_EACH_ELEMENT(_st1, _ca, T, x) \
|
|
141
|
-
for ( int __cfe_init = (CA_SWEEP_WIRE_1_((_st1), (_ca), "0", 1, \
|
|
142
|
-
"CA_FOR_EACH_ELEMENT"), \
|
|
143
|
-
ca_sweep_acquire_chunked(&(_st1).core), 1); \
|
|
144
|
-
__cfe_init; \
|
|
145
|
-
__cfe_init = 0, ca_sweep_release_chunked(&(_st1).core) ) \
|
|
146
|
-
for ( ; ca_sweep_next_chunk(&(_st1).core); ) \
|
|
147
|
-
for ( ca_size_t __cfe_k = 0; \
|
|
148
|
-
__cfe_k < (_st1).core.chunk_n \
|
|
149
|
-
&& (((x) = *(T *)((_st1).core.base[0] \
|
|
150
|
-
+ __cfe_k * (_st1).core.stride[0])), 1); \
|
|
151
|
-
__cfe_k++ )
|
|
152
|
-
|
|
153
|
-
/* (2) READ-only, MASKED (m is 1 if masked, 0 otherwise; 0 if no source mask) */
|
|
154
|
-
#define CA_FOR_EACH_ELEMENT_MASKED(_st1, _ca, T, x, m) \
|
|
155
|
-
for ( int __cfem_init = (CA_SWEEP_WIRE_1_((_st1), (_ca), "0", 0, \
|
|
156
|
-
"CA_FOR_EACH_ELEMENT_MASKED"), \
|
|
157
|
-
ca_sweep_acquire_chunked(&(_st1).core), 1); \
|
|
158
|
-
__cfem_init; \
|
|
159
|
-
__cfem_init = 0, ca_sweep_release_chunked(&(_st1).core) ) \
|
|
160
|
-
for ( ; ca_sweep_next_chunk(&(_st1).core); ) \
|
|
161
|
-
for ( ca_size_t __cfem_k = 0; \
|
|
162
|
-
__cfem_k < (_st1).core.chunk_n \
|
|
163
|
-
&& (((x) = *(T *)((_st1).core.base[0] \
|
|
164
|
-
+ __cfem_k * (_st1).core.stride[0])), \
|
|
165
|
-
((m) = (_st1).core.m0 \
|
|
166
|
-
? (_st1).core.m0[__cfem_k] \
|
|
167
|
-
: (boolean8_t)0), \
|
|
168
|
-
1); \
|
|
169
|
-
__cfem_k++ )
|
|
170
|
-
|
|
171
|
-
/* (3) INOUT map (NO_MASK). Strict same-shape check pre-acquire. */
|
|
172
|
-
#define CA_FOR_EACH_ELEMENT_INOUT(_st2, _ca_in, _ca_out, \
|
|
173
|
-
T_IN, T_OUT, in, out) \
|
|
174
|
-
for ( int __cfei_init = ( \
|
|
175
|
-
ca_sweep_check_same_shape((CArray *)(_ca_in), \
|
|
176
|
-
(CArray *)(_ca_out), \
|
|
177
|
-
"CA_FOR_EACH_ELEMENT_INOUT"), \
|
|
178
|
-
CA_SWEEP_WIRE_2_((_st2), (_ca_in), (_ca_out), "01", 1, \
|
|
179
|
-
"CA_FOR_EACH_ELEMENT_INOUT"), \
|
|
180
|
-
ca_sweep_acquire_chunked(&(_st2).core), \
|
|
181
|
-
1); \
|
|
182
|
-
__cfei_init; \
|
|
183
|
-
__cfei_init = 0, ca_sweep_release_chunked(&(_st2).core) ) \
|
|
184
|
-
for ( ; ca_sweep_next_chunk(&(_st2).core); ) \
|
|
185
|
-
for ( ca_size_t __cfei_k = 0; \
|
|
186
|
-
__cfei_k < (_st2).core.chunk_n \
|
|
187
|
-
&& (((in) = *(T_IN *)((_st2).core.base[0] \
|
|
188
|
-
+ __cfei_k * (_st2).core.stride[0])), \
|
|
189
|
-
1); \
|
|
190
|
-
(*(T_OUT *)((_st2).core.base[1] \
|
|
191
|
-
+ __cfei_k * (_st2).core.stride[1]) = (out)), \
|
|
192
|
-
__cfei_k++ )
|
|
193
|
-
|
|
194
|
-
/* (4) INOUT map (MASKED). Author writes m_out per cell. */
|
|
195
|
-
#define CA_FOR_EACH_ELEMENT_INOUT_MASKED(_st2, _ca_in, _ca_out, \
|
|
196
|
-
T_IN, T_OUT, \
|
|
197
|
-
in, out, m_in, m_out) \
|
|
198
|
-
for ( int __cfeim_init = ( \
|
|
199
|
-
ca_sweep_check_same_shape((CArray *)(_ca_in), \
|
|
200
|
-
(CArray *)(_ca_out), \
|
|
201
|
-
"CA_FOR_EACH_ELEMENT_INOUT_MASKED"), \
|
|
202
|
-
CA_SWEEP_WIRE_2_((_st2), (_ca_in), (_ca_out), "01", 0, \
|
|
203
|
-
"CA_FOR_EACH_ELEMENT_INOUT_MASKED"), \
|
|
204
|
-
ca_sweep_acquire_chunked(&(_st2).core), \
|
|
205
|
-
1); \
|
|
206
|
-
__cfeim_init; \
|
|
207
|
-
__cfeim_init = 0, ca_sweep_release_chunked(&(_st2).core) ) \
|
|
208
|
-
for ( ; ca_sweep_next_chunk(&(_st2).core); ) \
|
|
209
|
-
for ( ca_size_t __cfeim_k = 0; \
|
|
210
|
-
__cfeim_k < (_st2).core.chunk_n \
|
|
211
|
-
&& (((in) = *(T_IN *)((_st2).core.base[0] \
|
|
212
|
-
+ __cfeim_k * (_st2).core.stride[0])), \
|
|
213
|
-
((m_in) = (_st2).core.m0 \
|
|
214
|
-
? (_st2).core.m0[__cfeim_k] \
|
|
215
|
-
: (boolean8_t)0), \
|
|
216
|
-
((m_out) = (m_in)), \
|
|
217
|
-
1); \
|
|
218
|
-
(*(T_OUT *)((_st2).core.base[1] \
|
|
219
|
-
+ __cfeim_k * (_st2).core.stride[1]) = (out)), \
|
|
220
|
-
(((_st2).core.m0) \
|
|
221
|
-
? ((_st2).core.m0[__cfeim_k] = (m_out)) \
|
|
222
|
-
: (boolean8_t)0), \
|
|
223
|
-
__cfeim_k++ )
|
|
224
|
-
|
|
225
|
-
/* (5) WRITE-only (init / iota / fill). */
|
|
226
|
-
#define CA_FOR_EACH_ELEMENT_OUT(_st1, _ca_out, T, out) \
|
|
227
|
-
for ( int __cfeo_init = (CA_SWEEP_WIRE_1_((_st1), (_ca_out), "1", 0, \
|
|
228
|
-
"CA_FOR_EACH_ELEMENT_OUT"), \
|
|
229
|
-
ca_sweep_acquire_chunked(&(_st1).core), 1); \
|
|
230
|
-
__cfeo_init; \
|
|
231
|
-
__cfeo_init = 0, ca_sweep_release_chunked(&(_st1).core) ) \
|
|
232
|
-
for ( ; ca_sweep_next_chunk(&(_st1).core); ) \
|
|
233
|
-
for ( ca_size_t __cfeo_k = 0; \
|
|
234
|
-
__cfeo_k < (_st1).core.chunk_n; \
|
|
235
|
-
(*(T *)((_st1).core.base[0] \
|
|
236
|
-
+ __cfeo_k * (_st1).core.stride[0]) = (out)), \
|
|
237
|
-
__cfeo_k++ )
|
|
238
|
-
|
|
239
|
-
#endif /* CA_FOR_EACH_ELEMENT_H */
|