carray 3.0.3 → 3.0.5
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 +469 -0
- data/README.md +3 -2
- data/carray.gemspec +1 -1
- data/ext/ca_array_pool.c +25 -1
- data/ext/ca_axis_descriptor.h +27 -24
- data/ext/ca_axis_dispatch.c +14 -26
- data/ext/ca_axis_group.c +27 -27
- data/ext/ca_binop_dispatch.c +1 -29
- data/ext/ca_binop_dispatch.h +0 -1
- data/ext/ca_categorical_iterator.c +231 -153
- data/ext/ca_compare.c +9 -20
- data/ext/ca_composite_dispatch.c +9 -9
- data/ext/ca_group_iter.c +16 -17
- data/ext/ca_kernel_iterator.c +1240 -2000
- data/ext/ca_kernel_iterator.h +502 -519
- data/ext/ca_monop_dispatch.c +82 -59
- data/ext/ca_monop_dispatch.h +1 -0
- data/ext/ca_obj_array.c +152 -45
- data/ext/ca_obj_bincmp.c +25 -21
- data/ext/ca_obj_binop.c +16 -26
- data/ext/ca_obj_bitarray.c +8 -3
- data/ext/ca_obj_bitfield.c +63 -49
- data/ext/ca_obj_block.c +18 -9
- data/ext/ca_obj_byte_swap.c +7 -7
- data/ext/ca_obj_const_string.c +188 -22
- data/ext/ca_obj_face.c +280 -58
- data/ext/ca_obj_face.h +19 -0
- data/ext/ca_obj_fake.c +15 -29
- data/ext/ca_obj_farray.c +6 -3
- data/ext/ca_obj_field.c +30 -8
- data/ext/ca_obj_fixlen_string.c +2 -3
- data/ext/ca_obj_grid.c +455 -134
- data/ext/ca_obj_meld.c +172 -34
- data/ext/ca_obj_moncmp.c +23 -8
- data/ext/ca_obj_monop.c +113 -67
- data/ext/ca_obj_object.c +210 -52
- data/ext/ca_obj_record.c +15 -7
- data/ext/ca_obj_reduce.c +17 -8
- data/ext/ca_obj_refer.c +42 -35
- data/ext/ca_obj_remap.c +30 -9
- data/ext/ca_obj_repeat.c +9 -10
- data/ext/ca_obj_roll.c +31 -10
- data/ext/ca_obj_select.c +48 -14
- data/ext/ca_obj_select_axis.c +15 -47
- data/ext/ca_obj_shift.c +41 -7
- data/ext/ca_obj_stack.c +180 -34
- data/ext/ca_obj_stride.c +190 -134
- data/ext/ca_obj_string.c +80 -4
- data/ext/ca_obj_tile.c +32 -11
- data/ext/ca_obj_time.c +22 -6
- data/ext/ca_obj_timedelta.c +22 -6
- data/ext/ca_obj_transpose.c +13 -7
- data/ext/ca_obj_triop.c +26 -32
- data/ext/ca_obj_window.c +267 -74
- data/ext/ca_op_ipower.c +4 -4
- data/ext/ca_sort_kernels.h +6 -3
- data/ext/ca_sweep_engine.c +2 -2
- data/ext/caframe_csv_reader.c +80 -1
- data/ext/carray.h +214 -75
- data/ext/carray_access.c +200 -99
- data/ext/carray_address_basis.c +343 -87
- data/ext/carray_attribute.c +113 -6
- data/ext/carray_bincount.c +10 -8
- data/ext/carray_broadcast.c +13 -8
- data/ext/carray_build_flags.h +3 -0
- data/ext/carray_call_cfunc.c +108 -0
- data/ext/carray_cast.c +375 -96
- data/ext/carray_cast_func.rb +90 -20
- data/ext/carray_class.c +4 -3
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +18 -9
- data/ext/carray_copy.c +51 -14
- data/ext/carray_core.c +150 -55
- data/ext/carray_count.c +56 -20
- data/ext/carray_element.c +81 -33
- data/ext/carray_factorize.c +138 -84
- data/ext/carray_generate.c +199 -52
- data/ext/carray_histogram.c +63 -18
- data/ext/carray_hold.c +12 -15
- data/ext/carray_index_classifier.c +388 -176
- data/ext/carray_internal.h +348 -29
- data/ext/carray_kernels_bincmp.c +4453 -0
- data/ext/carray_kernels_binop.c +11368 -0
- data/ext/carray_kernels_init.c +1734 -0
- data/ext/carray_kernels_moncmp.c +2104 -0
- data/ext/carray_kernels_monop.c +18369 -0
- data/ext/carray_kernels_reduce_aggregate.c +23818 -0
- data/ext/carray_kernels_reduce_boolean.c +406 -0
- data/ext/carray_kernels_reduce_cumulative.c +10086 -0
- data/ext/carray_kernels_reduce_extreme.c +17634 -0
- data/ext/carray_kernels_reduce_variance.c +3849 -0
- data/ext/carray_kernels_scan.c +4302 -0
- data/ext/carray_kernels_search.c +33829 -0
- data/ext/carray_kernels_sort.c +10897 -0
- data/ext/carray_kernels_triop.c +1864 -0
- data/ext/carray_key_windows.c +220 -0
- data/ext/carray_lazy.c +170 -111
- data/ext/carray_mask.c +337 -94
- data/ext/carray_median_percentile.c +82 -28
- data/ext/carray_memory_view.c +669 -561
- data/ext/carray_operator.c +129 -52
- data/ext/carray_order.c +604 -77
- data/ext/carray_partition.c +28 -27
- data/ext/carray_random.c +85 -31
- data/ext/carray_round.c +273 -0
- data/ext/carray_scatter.c +87 -45
- data/ext/carray_segment.c +3 -3
- data/ext/carray_slab.c +123 -37
- data/ext/carray_sort.c +259 -51
- data/ext/carray_sort_kernel.c +5 -7
- data/ext/carray_struct.c +54 -61
- data/ext/carray_test.c +26 -5
- data/ext/carray_time_text.c +4 -2
- data/ext/carray_undef.c +4 -0
- data/ext/carray_utils.c +309 -66
- data/ext/mk_call_cfunc.rb +19 -2
- data/ext/mkkernel.rb +403 -350
- data/ext/ruby_carray.c +10 -4
- data/ext/version.h +4 -4
- data/lib/carray/attribute.rb +139 -22
- data/lib/carray/autoload_carray.rb +8 -31
- data/lib/carray/autoload_method_extension.rb +14 -5
- data/lib/carray/axis_group.rb +255 -106
- data/lib/carray/basics.rb +105 -17
- data/lib/carray/bincount_nd.rb +12 -2
- data/lib/carray/block_iterator.rb +126 -23
- data/lib/carray/boolean_reduce.rb +17 -17
- data/lib/carray/categorical.rb +195 -59
- data/lib/carray/categorical_iterator.rb +132 -29
- data/lib/carray/complex.rb +5 -5
- data/lib/carray/conditional.rb +67 -18
- data/lib/carray/const_string.rb +24 -5
- data/lib/carray/construct.rb +15 -11
- data/lib/carray/data_type_extension.rb +9 -1
- data/lib/carray/distance_limit.rb +77 -0
- data/lib/carray/fixlen_string.rb +48 -3
- data/lib/carray/frame/column_verbs.rb +71 -0
- data/lib/carray/frame/concat.rb +17 -3
- data/lib/carray/frame/convert.rb +69 -0
- data/lib/carray/frame/csv_parser.rb +111 -17
- data/lib/carray/frame/describe.rb +3 -2
- data/lib/carray/frame/frame.rb +252 -28
- data/lib/carray/frame/group.rb +603 -101
- data/lib/carray/frame/io.rb +117 -28
- data/lib/carray/frame/join.rb +312 -51
- data/lib/carray/frame/records.rb +83 -7
- data/lib/carray/frame/reshape.rb +42 -35
- data/lib/carray/frame/sort.rb +7 -19
- data/lib/carray/frame/verbs.rb +188 -48
- data/lib/carray/frame/windows.rb +117 -0
- data/lib/carray/frame.rb +2 -0
- data/lib/carray/fuse_source.rb +42 -6
- data/lib/carray/fusion.rb +40 -16
- data/lib/carray/histogram.rb +6 -1
- data/lib/carray/inspect.rb +31 -8
- data/lib/carray/iterator.rb +85 -7
- data/lib/carray/key_windows.rb +620 -0
- data/lib/carray/lazy.rb +217 -183
- data/lib/carray/mask_gap_fill.rb +63 -57
- data/lib/carray/meld_reduce.rb +12 -14
- data/lib/carray/methods/bin.rb +26 -18
- data/lib/carray/methods/bincount.rb +16 -0
- data/lib/carray/methods/bit_string.rb +1 -1
- data/lib/carray/methods/choose.rb +16 -3
- data/lib/carray/methods/composition.rb +3 -1
- data/lib/carray/methods/gather_nd.rb +14 -5
- data/lib/carray/methods/insert_block.rb +2 -2
- data/lib/carray/methods/is_between.rb +59 -0
- data/lib/carray/methods/is_in.rb +61 -37
- data/lib/carray/methods/join.rb +1 -6
- data/lib/carray/methods/lag.rb +49 -0
- data/lib/carray/methods/locate_addr.rb +47 -51
- data/lib/carray/methods/mode.rb +1 -1
- data/lib/carray/methods/nunique.rb +11 -6
- data/lib/carray/methods/resize.rb +3 -3
- data/lib/carray/methods/value_counts.rb +4 -11
- data/lib/carray/record_order.rb +3 -3
- data/lib/carray/rng.rb +3 -0
- data/lib/carray/runtime.rb +53 -8
- data/lib/carray/segment_iterator.rb +323 -88
- data/lib/carray/serialize.rb +45 -14
- data/lib/carray/slab_iterator.rb +50 -0
- data/lib/carray/stack.rb +15 -12
- data/lib/carray/string.rb +113 -5
- data/lib/carray/string_operation_extension.rb +21 -6
- data/lib/carray/struct.rb +9 -21
- data/lib/carray/struct_builder.rb +24 -11
- data/lib/carray/time.rb +819 -158
- data/lib/carray/window_iterator.rb +122 -16
- data/lib/carray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +4 -0
- data/yard-stubs/ca_obj_grid.rb +21 -10
- data/yard-stubs/ca_obj_refer.rb +2 -1
- data/yard-stubs/ca_obj_roll.rb +2 -2
- data/yard-stubs/ca_obj_shift.rb +5 -1
- data/yard-stubs/ca_obj_tile.rb +1 -1
- data/yard-stubs/ca_obj_transpose.rb +5 -4
- data/yard-stubs/ca_obj_window.rb +8 -3
- data/yard-stubs/carray_access.rb +6 -1
- data/yard-stubs/carray_attribute.rb +3 -6
- data/yard-stubs/carray_cast.rb +12 -0
- data/yard-stubs/carray_conversion.rb +7 -2
- data/yard-stubs/carray_copy.rb +4 -2
- data/yard-stubs/carray_count.rb +4 -4
- data/yard-stubs/carray_element.rb +17 -10
- data/yard-stubs/carray_generate.rb +21 -1
- data/yard-stubs/carray_mask.rb +32 -3
- data/yard-stubs/carray_math.rb +41 -5
- data/yard-stubs/carray_median_percentile.rb +5 -2
- data/yard-stubs/carray_memory_view.rb +40 -23
- data/yard-stubs/carray_order.rb +129 -22
- data/yard-stubs/carray_random.rb +13 -4
- data/yard-stubs/carray_scatter.rb +17 -10
- data/yard-stubs/carray_slab.rb +9 -2
- data/yard-stubs/carray_sort.rb +6 -5
- data/yard-stubs/carray_test.rb +5 -3
- metadata +25 -3
- data/lib/carray/arrow_tensor.rb +0 -401
- data/lib/carray/table.rb +0 -108
data/ext/ca_axis_dispatch.c
CHANGED
|
@@ -647,15 +647,15 @@ ca_axis_dispatch_percell_gather (CArray *parent,
|
|
|
647
647
|
break;
|
|
648
648
|
case 2:
|
|
649
649
|
for (j = 0; j < inner_count; j++)
|
|
650
|
-
|
|
650
|
+
__builtin_memcpy(row_dst + j*2, src + j*inner_step, 2);
|
|
651
651
|
break;
|
|
652
652
|
case 4:
|
|
653
653
|
for (j = 0; j < inner_count; j++)
|
|
654
|
-
|
|
654
|
+
__builtin_memcpy(row_dst + j*4, src + j*inner_step, 4);
|
|
655
655
|
break;
|
|
656
656
|
case 8:
|
|
657
657
|
for (j = 0; j < inner_count; j++)
|
|
658
|
-
|
|
658
|
+
__builtin_memcpy(row_dst + j*8, src + j*inner_step, 8);
|
|
659
659
|
break;
|
|
660
660
|
default:
|
|
661
661
|
for (j = 0; j < inner_count; j++)
|
|
@@ -672,18 +672,15 @@ ca_axis_dispatch_percell_gather (CArray *parent,
|
|
|
672
672
|
break;
|
|
673
673
|
case 2:
|
|
674
674
|
for (j = 0; j < inner_count; j++)
|
|
675
|
-
|
|
676
|
-
*(uint16_t *)(row_src_base + inner_indices[j]*inner_pstride);
|
|
675
|
+
__builtin_memcpy(row_dst + j*2, row_src_base + inner_indices[j]*inner_pstride, 2);
|
|
677
676
|
break;
|
|
678
677
|
case 4:
|
|
679
678
|
for (j = 0; j < inner_count; j++)
|
|
680
|
-
|
|
681
|
-
*(uint32_t *)(row_src_base + inner_indices[j]*inner_pstride);
|
|
679
|
+
__builtin_memcpy(row_dst + j*4, row_src_base + inner_indices[j]*inner_pstride, 4);
|
|
682
680
|
break;
|
|
683
681
|
case 8:
|
|
684
682
|
for (j = 0; j < inner_count; j++)
|
|
685
|
-
|
|
686
|
-
*(uint64_t *)(row_src_base + inner_indices[j]*inner_pstride);
|
|
683
|
+
__builtin_memcpy(row_dst + j*8, row_src_base + inner_indices[j]*inner_pstride, 8);
|
|
687
684
|
break;
|
|
688
685
|
default:
|
|
689
686
|
for (j = 0; j < inner_count; j++)
|
|
@@ -761,8 +758,7 @@ ca_axis_dispatch_gather (CArray *parent,
|
|
|
761
758
|
so clang lowers to NEON ldp/stp directly (no libc memcpy call). */
|
|
762
759
|
if ( sbytes == 8 ) {
|
|
763
760
|
for ( i = 0; i < n; i++ ) {
|
|
764
|
-
|
|
765
|
-
*(uint64_t *)(base + indices[i] * pstride);
|
|
761
|
+
__builtin_memcpy(out_buf + i*8, base + indices[i] * pstride, 8);
|
|
766
762
|
}
|
|
767
763
|
} else if ( sbytes == 16 ) {
|
|
768
764
|
for ( i = 0; i < n; i++ ) {
|
|
@@ -887,15 +883,15 @@ ca_axis_dispatch_percell_scatter (CArray *parent,
|
|
|
887
883
|
break;
|
|
888
884
|
case 2:
|
|
889
885
|
for (j = 0; j < inner_count; j++)
|
|
890
|
-
|
|
886
|
+
__builtin_memcpy(dst + j*inner_step, row_src + j*2, 2);
|
|
891
887
|
break;
|
|
892
888
|
case 4:
|
|
893
889
|
for (j = 0; j < inner_count; j++)
|
|
894
|
-
|
|
890
|
+
__builtin_memcpy(dst + j*inner_step, row_src + j*4, 4);
|
|
895
891
|
break;
|
|
896
892
|
case 8:
|
|
897
893
|
for (j = 0; j < inner_count; j++)
|
|
898
|
-
|
|
894
|
+
__builtin_memcpy(dst + j*inner_step, row_src + j*8, 8);
|
|
899
895
|
break;
|
|
900
896
|
default:
|
|
901
897
|
for (j = 0; j < inner_count; j++)
|
|
@@ -912,18 +908,15 @@ ca_axis_dispatch_percell_scatter (CArray *parent,
|
|
|
912
908
|
break;
|
|
913
909
|
case 2:
|
|
914
910
|
for (j = 0; j < inner_count; j++)
|
|
915
|
-
|
|
916
|
-
*(uint16_t *)(row_src + j*2);
|
|
911
|
+
__builtin_memcpy(row_dst_base + inner_indices[j]*inner_pstride, row_src + j*2, 2);
|
|
917
912
|
break;
|
|
918
913
|
case 4:
|
|
919
914
|
for (j = 0; j < inner_count; j++)
|
|
920
|
-
|
|
921
|
-
*(uint32_t *)(row_src + j*4);
|
|
915
|
+
__builtin_memcpy(row_dst_base + inner_indices[j]*inner_pstride, row_src + j*4, 4);
|
|
922
916
|
break;
|
|
923
917
|
case 8:
|
|
924
918
|
for (j = 0; j < inner_count; j++)
|
|
925
|
-
|
|
926
|
-
*(uint64_t *)(row_src + j*8);
|
|
919
|
+
__builtin_memcpy(row_dst_base + inner_indices[j]*inner_pstride, row_src + j*8, 8);
|
|
927
920
|
break;
|
|
928
921
|
default:
|
|
929
922
|
for (j = 0; j < inner_count; j++)
|
|
@@ -1158,15 +1151,10 @@ ca_axis_view_attach_owned (void *ap)
|
|
|
1158
1151
|
CArray *ca = (CArray *) ap;
|
|
1159
1152
|
char *buf = xmalloc(ca_length(ca) > 0 ? ca_length(ca) : 1);
|
|
1160
1153
|
void *args[2];
|
|
1161
|
-
int tag = 0;
|
|
1162
1154
|
|
|
1163
1155
|
args[0] = ca;
|
|
1164
1156
|
args[1] = buf;
|
|
1165
|
-
|
|
1166
|
-
if ( tag ) {
|
|
1167
|
-
xfree(buf);
|
|
1168
|
-
rb_jump_tag(tag);
|
|
1169
|
-
}
|
|
1157
|
+
ca_fill_or_xfree(buf, ca_axis_view_fill_owned, (VALUE) args);
|
|
1170
1158
|
ca->ptr = buf;
|
|
1171
1159
|
}
|
|
1172
1160
|
|
data/ext/ca_axis_group.c
CHANGED
|
@@ -283,7 +283,7 @@ group_op_code (VALUE vop)
|
|
|
283
283
|
#define GACC_XOR \
|
|
284
284
|
( ((boolean8_t *) co->ptr)[o] ^= (*(boolean8_t *)(p + gw_doff[e]) ? 1 : 0) )
|
|
285
285
|
|
|
286
|
-
/*
|
|
286
|
+
/* __reduce_by_axis_groups__(group_axes, bundles, op) — group-reduces self along
|
|
287
287
|
* the union of `group_axes` (ascending source-axis indices = the slab) into
|
|
288
288
|
* composite groups described by `bundles`, preserving the band (= non-grouped)
|
|
289
289
|
* axes. Internal: the Ruby surface is CAGroupIterator.
|
|
@@ -352,7 +352,7 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
352
352
|
/* --- bundles: small per-group code tables (metadata, kept alive) --- */
|
|
353
353
|
Check_Type(vbundles, T_ARRAY);
|
|
354
354
|
int n_bundles = (int) RARRAY_LEN(vbundles);
|
|
355
|
-
if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) {
|
|
355
|
+
if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) { /* rank-check: a count of key bundles */
|
|
356
356
|
rb_raise(rb_eArgError, "axis_group_reduce: bad bundle count %d", n_bundles);
|
|
357
357
|
}
|
|
358
358
|
int32_t *bundle_codes[CA_RANK_MAX];
|
|
@@ -362,7 +362,8 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
362
362
|
int bundle_slot[CA_RANK_MAX][CA_RANK_MAX];
|
|
363
363
|
ca_size_t bundle_cstride[CA_RANK_MAX][CA_RANK_MAX];
|
|
364
364
|
CArray *bundle_ca[CA_RANK_MAX];
|
|
365
|
-
volatile VALUE keep = rb_ary_new(); /*
|
|
365
|
+
volatile VALUE keep = rb_ary_new(); /* keeps the int32 code views alive */
|
|
366
|
+
volatile VALUE h_codes[CA_RANK_MAX]; /* holders of the copied code tables */
|
|
366
367
|
|
|
367
368
|
ca_size_t K_total = 1;
|
|
368
369
|
long consumed_total = 0;
|
|
@@ -385,18 +386,16 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
385
386
|
and the end of the walk can raise -- a validation just below, a gather
|
|
386
387
|
that cannot convert a cell, an object-lane callback into Ruby -- and a
|
|
387
388
|
raise jumps over every detach, leaving the source materialised with
|
|
388
|
-
nothing left to release it. The copy rides a temporary buffer
|
|
389
|
-
unwind collects.
|
|
389
|
+
nothing left to release it. The copy rides ALLOCV, a temporary buffer
|
|
390
|
+
that the unwind collects. Not a String: a String held only by `keep`
|
|
391
|
+
can be moved by compaction, taking the bytes under bundle_codes with
|
|
392
|
+
it. */
|
|
390
393
|
VALUE v32 = rb_ca_wrap_readonly(vcodes, INT2NUM(CA_INT32));
|
|
391
394
|
rb_ary_push((VALUE) keep, v32);
|
|
392
395
|
GetCArray(v32, bundle_ca[bi]);
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
rb_ary_push((VALUE) keep, vbuf);
|
|
397
|
-
ca_copy_data(bundle_ca[bi], RSTRING_PTR(vbuf));
|
|
398
|
-
bundle_codes[bi] = (int32_t *) RSTRING_PTR(vbuf);
|
|
399
|
-
}
|
|
396
|
+
h_codes[bi] = 0;
|
|
397
|
+
bundle_codes[bi] = ALLOCV_N(int32_t, h_codes[bi], bundle_ca[bi]->elements);
|
|
398
|
+
ca_copy_data(bundle_ca[bi], (char *) bundle_codes[bi]);
|
|
400
399
|
|
|
401
400
|
int nb = (int) RARRAY_LEN(vbaxes);
|
|
402
401
|
if ( nb <= 0 || nb > src->ndim ) {
|
|
@@ -682,6 +681,7 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
682
681
|
ALLOCV_END(h_prod); ALLOCV_END(h_seen); ALLOCV_END(h_xbuf);
|
|
683
682
|
ALLOCV_END(h_nz); ALLOCV_END(h_mnaddr); ALLOCV_END(h_mxaddr);
|
|
684
683
|
ALLOCV_END(h_band);
|
|
684
|
+
for ( int bi = 0; bi < n_bundles; bi++ ) ALLOCV_END(h_codes[bi]);
|
|
685
685
|
|
|
686
686
|
RB_GC_GUARD(keep);
|
|
687
687
|
return vout;
|
|
@@ -983,7 +983,7 @@ group_scan_build_plan (ca_iter_state *st, boolean8_t *m,
|
|
|
983
983
|
omask[o] = 1; \
|
|
984
984
|
} while (0)
|
|
985
985
|
|
|
986
|
-
/* The CA_OBJECT lane of
|
|
986
|
+
/* The CA_OBJECT lane of __scan_by_axis_groups__. Every cell calls into Ruby,
|
|
987
987
|
so the walk can raise part way; its state lives in the caller's frame, in
|
|
988
988
|
c->st, and ca_iter_ensure finishes it however this body leaves. The
|
|
989
989
|
buffers are ALLOCV-backed, so the unwind collects them. */
|
|
@@ -1115,9 +1115,9 @@ group_scan_op_code (VALUE vop)
|
|
|
1115
1115
|
rb_raise(rb_eArgError, "axis_group_scan: unsupported op :%"PRIsVALUE, rb_id2str(id));
|
|
1116
1116
|
}
|
|
1117
1117
|
|
|
1118
|
-
/*
|
|
1118
|
+
/* __scan_by_axis_groups__(group_axes, bundles, op) — group-keyed segment scan of
|
|
1119
1119
|
* self over the union of `group_axes` into composite groups described by
|
|
1120
|
-
* `bundles` (same argument shape as
|
|
1120
|
+
* `bundles` (same argument shape as __reduce_by_axis_groups__). Internal.
|
|
1121
1121
|
*
|
|
1122
1122
|
* Unlike the reduce the grouped axes are not collapsed: the result is a new
|
|
1123
1123
|
* CArray of the same shape as self, each cell holding the running statistic of
|
|
@@ -1187,7 +1187,7 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
1187
1187
|
/* --- bundles: small per-group code tables (same as reduce) --- */
|
|
1188
1188
|
Check_Type(vbundles, T_ARRAY);
|
|
1189
1189
|
int n_bundles = (int) RARRAY_LEN(vbundles);
|
|
1190
|
-
if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) {
|
|
1190
|
+
if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) { /* rank-check: a count of key bundles */
|
|
1191
1191
|
rb_raise(rb_eArgError, "axis_group_scan: bad bundle count %d", n_bundles);
|
|
1192
1192
|
}
|
|
1193
1193
|
int32_t *bundle_codes[CA_RANK_MAX];
|
|
@@ -1198,6 +1198,7 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
1198
1198
|
ca_size_t bundle_cstride[CA_RANK_MAX][CA_RANK_MAX];
|
|
1199
1199
|
CArray *bundle_ca[CA_RANK_MAX];
|
|
1200
1200
|
volatile VALUE keep = rb_ary_new();
|
|
1201
|
+
volatile VALUE h_codes[CA_RANK_MAX];
|
|
1201
1202
|
|
|
1202
1203
|
ca_size_t K_total = 1;
|
|
1203
1204
|
long consumed_total = 0;
|
|
@@ -1220,18 +1221,16 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
1220
1221
|
and the end of the walk can raise -- a validation just below, a gather
|
|
1221
1222
|
that cannot convert a cell, an object-lane callback into Ruby -- and a
|
|
1222
1223
|
raise jumps over every detach, leaving the source materialised with
|
|
1223
|
-
nothing left to release it. The copy rides a temporary buffer
|
|
1224
|
-
unwind collects.
|
|
1224
|
+
nothing left to release it. The copy rides ALLOCV, a temporary buffer
|
|
1225
|
+
that the unwind collects. Not a String: a String held only by `keep`
|
|
1226
|
+
can be moved by compaction, taking the bytes under bundle_codes with
|
|
1227
|
+
it. */
|
|
1225
1228
|
VALUE v32 = rb_ca_wrap_readonly(vcodes, INT2NUM(CA_INT32));
|
|
1226
1229
|
rb_ary_push((VALUE) keep, v32);
|
|
1227
1230
|
GetCArray(v32, bundle_ca[bi]);
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
rb_ary_push((VALUE) keep, vbuf);
|
|
1232
|
-
ca_copy_data(bundle_ca[bi], RSTRING_PTR(vbuf));
|
|
1233
|
-
bundle_codes[bi] = (int32_t *) RSTRING_PTR(vbuf);
|
|
1234
|
-
}
|
|
1231
|
+
h_codes[bi] = 0;
|
|
1232
|
+
bundle_codes[bi] = ALLOCV_N(int32_t, h_codes[bi], bundle_ca[bi]->elements);
|
|
1233
|
+
ca_copy_data(bundle_ca[bi], (char *) bundle_codes[bi]);
|
|
1235
1234
|
|
|
1236
1235
|
int nb = (int) RARRAY_LEN(vbaxes);
|
|
1237
1236
|
if ( nb <= 0 || nb > src->ndim ) {
|
|
@@ -1413,6 +1412,7 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
1413
1412
|
ALLOCV_END(h_band2); ALLOCV_END(h_code); ALLOCV_END(h_doff);
|
|
1414
1413
|
ALLOCV_END(h_moff); ALLOCV_END(h_addr); ALLOCV_END(h_accd);
|
|
1415
1414
|
ALLOCV_END(h_accn); ALLOCV_END(h_seen); ALLOCV_END(h_acco);
|
|
1415
|
+
for ( int bi = 0; bi < n_bundles; bi++ ) ALLOCV_END(h_codes[bi]);
|
|
1416
1416
|
|
|
1417
1417
|
RB_GC_GUARD(keep);
|
|
1418
1418
|
return vout;
|
|
@@ -1421,8 +1421,8 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
|
|
|
1421
1421
|
void
|
|
1422
1422
|
Init_ca_axis_group (void)
|
|
1423
1423
|
{
|
|
1424
|
-
rb_define_method(rb_cCArray, "
|
|
1424
|
+
rb_define_method(rb_cCArray, "__reduce_by_axis_groups__",
|
|
1425
1425
|
rb_ca_axis_group_reduce, 3);
|
|
1426
|
-
rb_define_method(rb_cCArray, "
|
|
1426
|
+
rb_define_method(rb_cCArray, "__scan_by_axis_groups__",
|
|
1427
1427
|
rb_ca_axis_group_scan, 3);
|
|
1428
1428
|
}
|
data/ext/ca_binop_dispatch.c
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
/* The kernel table of each op id. The eager operators hold the tables
|
|
31
31
|
themselves; ca_binop_op_id_of_table maps one back to its op id, so that
|
|
32
|
-
both ask
|
|
32
|
+
both ask ca_op_raises_on_cell the same question. */
|
|
33
33
|
static ca_binop_func_t * const ca_binop_tables[CA_BINOP_COUNT] = {
|
|
34
34
|
[CA_BINOP_ADD] = ca_binop_add,
|
|
35
35
|
[CA_BINOP_SUB] = ca_binop_sub,
|
|
@@ -116,31 +116,3 @@ ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
|
|
|
116
116
|
if ( out_r_in_dt ) *out_r_in_dt = common;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
/* ------------------------------------------------------------------- */
|
|
120
|
-
/* trapping-op predicate */
|
|
121
|
-
/* ------------------------------------------------------------------- */
|
|
122
|
-
|
|
123
|
-
int
|
|
124
|
-
ca_binop_is_trapping (uint16_t op_id, int8_t common_dt)
|
|
125
|
-
{
|
|
126
|
-
/* An object cell calls Ruby, which can raise for any op. Integer
|
|
127
|
-
DIV / MOD / QUO / FMOD / RCP_MUL raise on a zero divisor, and POW /
|
|
128
|
-
IPOWER on zero to a negative power. Float division returns NaN/Inf
|
|
129
|
-
and does not trap. */
|
|
130
|
-
int is_integer = ( common_dt >= CA_INT8 && common_dt <= CA_UINT64 );
|
|
131
|
-
if ( common_dt == CA_OBJECT ) return 1;
|
|
132
|
-
if ( ! is_integer ) return 0;
|
|
133
|
-
|
|
134
|
-
switch (op_id) {
|
|
135
|
-
case CA_BINOP_DIV:
|
|
136
|
-
case CA_BINOP_MOD:
|
|
137
|
-
case CA_BINOP_QUO:
|
|
138
|
-
case CA_BINOP_FMOD:
|
|
139
|
-
case CA_BINOP_RCP_MUL:
|
|
140
|
-
case CA_BINOP_POW:
|
|
141
|
-
case CA_BINOP_IPOWER:
|
|
142
|
-
return 1;
|
|
143
|
-
default:
|
|
144
|
-
return 0;
|
|
145
|
-
}
|
|
146
|
-
}
|
data/ext/ca_binop_dispatch.h
CHANGED
|
@@ -147,7 +147,6 @@ void ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
|
|
|
147
147
|
When trapping AND either operand has a mask, xfer_stride must pass
|
|
148
148
|
a slab mask to the kernel so masked cells are skipped (otherwise
|
|
149
149
|
masked-zero divisors crash with SIGFPE). See §3.4 rev3. */
|
|
150
|
-
int ca_binop_is_trapping (uint16_t op_id, int8_t common_dt);
|
|
151
150
|
int ca_binop_op_id_of_table (ca_binop_func_t table[]);
|
|
152
151
|
|
|
153
152
|
#endif /* CA_BINOP_DISPATCH_H */
|