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
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
probed by operation-table function pointer (obj_type is runtime-
|
|
25
25
|
assigned, so no CA_OBJ_STACK compile-time constant exists). */
|
|
26
26
|
extern ca_operation_function_t ca_stack_func;
|
|
27
|
+
/* The square root of a variance: an ε-negative from rounding becomes 0,
|
|
28
|
+
a NaN stays NaN (fmax(NaN, 0.0) is 0.0). */
|
|
29
|
+
#ifndef CARRAY_SQRT_CLAMP_DEFINED
|
|
30
|
+
#define CARRAY_SQRT_CLAMP_DEFINED
|
|
31
|
+
static inline double ca_sqrt_clamp (double v) { return sqrt(v < 0.0 ? 0.0 : v); }
|
|
32
|
+
#endif
|
|
33
|
+
|
|
27
34
|
/* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
|
|
28
35
|
for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
|
|
29
36
|
return real true/false, not Integer 0/1. (BOOL2OBJ already exists
|
|
@@ -38,13 +45,16 @@ static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
|
|
|
38
45
|
|
|
39
46
|
/* ===== all_ki ============================================ */
|
|
40
47
|
|
|
48
|
+
typedef struct {
|
|
49
|
+
void *chunk;
|
|
50
|
+
CArray *ca;
|
|
51
|
+
} all_ki_stream_bool_t;
|
|
52
|
+
|
|
41
53
|
static VALUE
|
|
42
|
-
|
|
54
|
+
all_ki_stream_bool (VALUE arg)
|
|
43
55
|
{
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
47
|
-
ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
|
|
56
|
+
all_ki_stream_bool_t *__ctx = (all_ki_stream_bool_t *) arg;
|
|
57
|
+
CArray *ca = __ctx->ca;
|
|
48
58
|
ca_size_t __inner = 1;
|
|
49
59
|
int __k;
|
|
50
60
|
for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
|
|
@@ -65,8 +75,8 @@ all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
|
|
|
65
75
|
ca_size_t __outer_off = 0;
|
|
66
76
|
boolean8_t acc;
|
|
67
77
|
acc = (1);
|
|
68
|
-
ca_lazy_arena_enter();
|
|
69
78
|
boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
|
|
79
|
+
__ctx->chunk = __chunk;
|
|
70
80
|
while ( __outer_off < __outer ) {
|
|
71
81
|
ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
|
|
72
82
|
ca_size_t __n = __r * __inner;
|
|
@@ -80,9 +90,21 @@ all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
|
|
|
80
90
|
}
|
|
81
91
|
__outer_off += __r;
|
|
82
92
|
}
|
|
83
|
-
ca_lazy_arena_release(__chunk);
|
|
84
|
-
ca_lazy_arena_exit();
|
|
85
93
|
return BOOL2VAL((boolean8_t) (acc));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static VALUE
|
|
97
|
+
all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
|
|
98
|
+
{
|
|
99
|
+
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
100
|
+
ca->elements > 0 &&
|
|
101
|
+
ca_is_lazy_view(ca) && ! ca_has_mask(ca) &&
|
|
102
|
+
ca_fast_paths_enabled() ) {
|
|
103
|
+
all_ki_stream_bool_t __ctx;
|
|
104
|
+
__ctx.chunk = NULL;
|
|
105
|
+
__ctx.ca = ca;
|
|
106
|
+
return ca_lazy_arena_protect(all_ki_stream_bool, ca_lazy_arena_release_held,
|
|
107
|
+
(VALUE) &__ctx);
|
|
86
108
|
}
|
|
87
109
|
VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
|
|
88
110
|
CArray *co;
|
|
@@ -93,7 +115,7 @@ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
|
|
|
93
115
|
slab_axes, naxes, 0);
|
|
94
116
|
if ( rc != CA_ITER_OK ) {
|
|
95
117
|
rb_raise(rb_eRuntimeError,
|
|
96
|
-
"
|
|
118
|
+
"%s: kernel_iterator init failed rc=%d", ca_calling_method_name(), rc);
|
|
97
119
|
}
|
|
98
120
|
char *p;
|
|
99
121
|
boolean8_t *m;
|
|
@@ -119,26 +141,37 @@ rb_ca_all_ki (int argc, VALUE *argv, VALUE self)
|
|
|
119
141
|
int keep_axis = RTEST(rkeep_axis);
|
|
120
142
|
int8_t slab_axes[CA_RANK_MAX];
|
|
121
143
|
int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
|
|
144
|
+
if ( ca_is_lazy_view(src) && ! ( naxes == src->ndim && src->ndim >= 1 && ! keep_axis && ! ca_has_mask(src) ) ) {
|
|
145
|
+
volatile VALUE evaluated = ca_lazy_evaluated(self);
|
|
146
|
+
if ( ! NIL_P(evaluated) ) {
|
|
147
|
+
self = evaluated;
|
|
148
|
+
GetCArray(self, src);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
122
151
|
if ( argc > 0 ) {
|
|
123
|
-
rb_raise(rb_eArgError, "
|
|
152
|
+
rb_raise(rb_eArgError, "%s: positional axis arguments are no longer accepted (got %d); use the axis: keyword, e.g. a.%s(axis: 0) or a.%s(axis: [0, 1])", ca_calling_method_name(), argc, ca_calling_method_name(), ca_calling_method_name());
|
|
124
153
|
}
|
|
125
154
|
switch ( src->data_type ) {
|
|
126
|
-
case CA_BOOLEAN:
|
|
155
|
+
case CA_BOOLEAN: CA_RETURN_KEEPING(self, all_ki_native_bool(self, src, slab_axes, naxes, keep_axis));
|
|
127
156
|
default:
|
|
128
|
-
|
|
157
|
+
ca_face_refuse_numeric(self, ca_calling_method_name(), rb_eCADataTypeError);
|
|
158
|
+
rb_raise(rb_eCADataTypeError, "%s: source data_type :%s not supported (expected one of: boolean)", ca_calling_method_name(), ca_type_name[src->data_type]);
|
|
129
159
|
}
|
|
130
160
|
return Qnil; /* unreachable */
|
|
131
161
|
}
|
|
132
162
|
|
|
133
163
|
/* ===== any_ki ============================================ */
|
|
134
164
|
|
|
165
|
+
typedef struct {
|
|
166
|
+
void *chunk;
|
|
167
|
+
CArray *ca;
|
|
168
|
+
} any_ki_stream_bool_t;
|
|
169
|
+
|
|
135
170
|
static VALUE
|
|
136
|
-
|
|
171
|
+
any_ki_stream_bool (VALUE arg)
|
|
137
172
|
{
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
141
|
-
ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
|
|
173
|
+
any_ki_stream_bool_t *__ctx = (any_ki_stream_bool_t *) arg;
|
|
174
|
+
CArray *ca = __ctx->ca;
|
|
142
175
|
ca_size_t __inner = 1;
|
|
143
176
|
int __k;
|
|
144
177
|
for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
|
|
@@ -159,8 +192,8 @@ any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
|
|
|
159
192
|
ca_size_t __outer_off = 0;
|
|
160
193
|
boolean8_t acc;
|
|
161
194
|
acc = (0);
|
|
162
|
-
ca_lazy_arena_enter();
|
|
163
195
|
boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
|
|
196
|
+
__ctx->chunk = __chunk;
|
|
164
197
|
while ( __outer_off < __outer ) {
|
|
165
198
|
ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
|
|
166
199
|
ca_size_t __n = __r * __inner;
|
|
@@ -174,9 +207,21 @@ any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
|
|
|
174
207
|
}
|
|
175
208
|
__outer_off += __r;
|
|
176
209
|
}
|
|
177
|
-
ca_lazy_arena_release(__chunk);
|
|
178
|
-
ca_lazy_arena_exit();
|
|
179
210
|
return BOOL2VAL((boolean8_t) (acc));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
static VALUE
|
|
214
|
+
any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
|
|
215
|
+
{
|
|
216
|
+
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
217
|
+
ca->elements > 0 &&
|
|
218
|
+
ca_is_lazy_view(ca) && ! ca_has_mask(ca) &&
|
|
219
|
+
ca_fast_paths_enabled() ) {
|
|
220
|
+
any_ki_stream_bool_t __ctx;
|
|
221
|
+
__ctx.chunk = NULL;
|
|
222
|
+
__ctx.ca = ca;
|
|
223
|
+
return ca_lazy_arena_protect(any_ki_stream_bool, ca_lazy_arena_release_held,
|
|
224
|
+
(VALUE) &__ctx);
|
|
180
225
|
}
|
|
181
226
|
VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
|
|
182
227
|
CArray *co;
|
|
@@ -187,7 +232,7 @@ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
|
|
|
187
232
|
slab_axes, naxes, 0);
|
|
188
233
|
if ( rc != CA_ITER_OK ) {
|
|
189
234
|
rb_raise(rb_eRuntimeError,
|
|
190
|
-
"
|
|
235
|
+
"%s: kernel_iterator init failed rc=%d", ca_calling_method_name(), rc);
|
|
191
236
|
}
|
|
192
237
|
char *p;
|
|
193
238
|
boolean8_t *m;
|
|
@@ -213,26 +258,37 @@ rb_ca_any_ki (int argc, VALUE *argv, VALUE self)
|
|
|
213
258
|
int keep_axis = RTEST(rkeep_axis);
|
|
214
259
|
int8_t slab_axes[CA_RANK_MAX];
|
|
215
260
|
int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
|
|
261
|
+
if ( ca_is_lazy_view(src) && ! ( naxes == src->ndim && src->ndim >= 1 && ! keep_axis && ! ca_has_mask(src) ) ) {
|
|
262
|
+
volatile VALUE evaluated = ca_lazy_evaluated(self);
|
|
263
|
+
if ( ! NIL_P(evaluated) ) {
|
|
264
|
+
self = evaluated;
|
|
265
|
+
GetCArray(self, src);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
216
268
|
if ( argc > 0 ) {
|
|
217
|
-
rb_raise(rb_eArgError, "
|
|
269
|
+
rb_raise(rb_eArgError, "%s: positional axis arguments are no longer accepted (got %d); use the axis: keyword, e.g. a.%s(axis: 0) or a.%s(axis: [0, 1])", ca_calling_method_name(), argc, ca_calling_method_name(), ca_calling_method_name());
|
|
218
270
|
}
|
|
219
271
|
switch ( src->data_type ) {
|
|
220
|
-
case CA_BOOLEAN:
|
|
272
|
+
case CA_BOOLEAN: CA_RETURN_KEEPING(self, any_ki_native_bool(self, src, slab_axes, naxes, keep_axis));
|
|
221
273
|
default:
|
|
222
|
-
|
|
274
|
+
ca_face_refuse_numeric(self, ca_calling_method_name(), rb_eCADataTypeError);
|
|
275
|
+
rb_raise(rb_eCADataTypeError, "%s: source data_type :%s not supported (expected one of: boolean)", ca_calling_method_name(), ca_type_name[src->data_type]);
|
|
223
276
|
}
|
|
224
277
|
return Qnil; /* unreachable */
|
|
225
278
|
}
|
|
226
279
|
|
|
227
280
|
/* ===== none_ki ============================================ */
|
|
228
281
|
|
|
282
|
+
typedef struct {
|
|
283
|
+
void *chunk;
|
|
284
|
+
CArray *ca;
|
|
285
|
+
} none_ki_stream_bool_t;
|
|
286
|
+
|
|
229
287
|
static VALUE
|
|
230
|
-
|
|
288
|
+
none_ki_stream_bool (VALUE arg)
|
|
231
289
|
{
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
235
|
-
ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
|
|
290
|
+
none_ki_stream_bool_t *__ctx = (none_ki_stream_bool_t *) arg;
|
|
291
|
+
CArray *ca = __ctx->ca;
|
|
236
292
|
ca_size_t __inner = 1;
|
|
237
293
|
int __k;
|
|
238
294
|
for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
|
|
@@ -253,8 +309,8 @@ none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, in
|
|
|
253
309
|
ca_size_t __outer_off = 0;
|
|
254
310
|
boolean8_t acc;
|
|
255
311
|
acc = (1);
|
|
256
|
-
ca_lazy_arena_enter();
|
|
257
312
|
boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
|
|
313
|
+
__ctx->chunk = __chunk;
|
|
258
314
|
while ( __outer_off < __outer ) {
|
|
259
315
|
ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
|
|
260
316
|
ca_size_t __n = __r * __inner;
|
|
@@ -268,9 +324,21 @@ none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, in
|
|
|
268
324
|
}
|
|
269
325
|
__outer_off += __r;
|
|
270
326
|
}
|
|
271
|
-
ca_lazy_arena_release(__chunk);
|
|
272
|
-
ca_lazy_arena_exit();
|
|
273
327
|
return BOOL2VAL((boolean8_t) (acc));
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
static VALUE
|
|
331
|
+
none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
|
|
332
|
+
{
|
|
333
|
+
if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
|
|
334
|
+
ca->elements > 0 &&
|
|
335
|
+
ca_is_lazy_view(ca) && ! ca_has_mask(ca) &&
|
|
336
|
+
ca_fast_paths_enabled() ) {
|
|
337
|
+
none_ki_stream_bool_t __ctx;
|
|
338
|
+
__ctx.chunk = NULL;
|
|
339
|
+
__ctx.ca = ca;
|
|
340
|
+
return ca_lazy_arena_protect(none_ki_stream_bool, ca_lazy_arena_release_held,
|
|
341
|
+
(VALUE) &__ctx);
|
|
274
342
|
}
|
|
275
343
|
VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
|
|
276
344
|
CArray *co;
|
|
@@ -281,7 +349,7 @@ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
|
|
|
281
349
|
slab_axes, naxes, 0);
|
|
282
350
|
if ( rc != CA_ITER_OK ) {
|
|
283
351
|
rb_raise(rb_eRuntimeError,
|
|
284
|
-
"
|
|
352
|
+
"%s: kernel_iterator init failed rc=%d", ca_calling_method_name(), rc);
|
|
285
353
|
}
|
|
286
354
|
char *p;
|
|
287
355
|
boolean8_t *m;
|
|
@@ -307,13 +375,21 @@ rb_ca_none_ki (int argc, VALUE *argv, VALUE self)
|
|
|
307
375
|
int keep_axis = RTEST(rkeep_axis);
|
|
308
376
|
int8_t slab_axes[CA_RANK_MAX];
|
|
309
377
|
int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
|
|
378
|
+
if ( ca_is_lazy_view(src) && ! ( naxes == src->ndim && src->ndim >= 1 && ! keep_axis && ! ca_has_mask(src) ) ) {
|
|
379
|
+
volatile VALUE evaluated = ca_lazy_evaluated(self);
|
|
380
|
+
if ( ! NIL_P(evaluated) ) {
|
|
381
|
+
self = evaluated;
|
|
382
|
+
GetCArray(self, src);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
310
385
|
if ( argc > 0 ) {
|
|
311
|
-
rb_raise(rb_eArgError, "
|
|
386
|
+
rb_raise(rb_eArgError, "%s: positional axis arguments are no longer accepted (got %d); use the axis: keyword, e.g. a.%s(axis: 0) or a.%s(axis: [0, 1])", ca_calling_method_name(), argc, ca_calling_method_name(), ca_calling_method_name());
|
|
312
387
|
}
|
|
313
388
|
switch ( src->data_type ) {
|
|
314
|
-
case CA_BOOLEAN:
|
|
389
|
+
case CA_BOOLEAN: CA_RETURN_KEEPING(self, none_ki_native_bool(self, src, slab_axes, naxes, keep_axis));
|
|
315
390
|
default:
|
|
316
|
-
|
|
391
|
+
ca_face_refuse_numeric(self, ca_calling_method_name(), rb_eCADataTypeError);
|
|
392
|
+
rb_raise(rb_eCADataTypeError, "%s: source data_type :%s not supported (expected one of: boolean)", ca_calling_method_name(), ca_type_name[src->data_type]);
|
|
317
393
|
}
|
|
318
394
|
return Qnil; /* unreachable */
|
|
319
395
|
}
|