carray 3.0.0 → 3.0.2
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 +2 -1
- data/CHANGELOG.md +845 -3
- data/{NEWS.md → CHANGELOG.v1.md} +1 -1
- data/README.md +33 -33
- data/carray.gemspec +12 -8
- data/ext/ca_axis_dispatch.c +33 -4
- data/ext/ca_axis_group.c +256 -114
- data/ext/ca_binop_dispatch.c +5 -6
- data/ext/ca_binop_dispatch.h +0 -7
- data/ext/ca_categorical_iterator.c +121 -67
- data/ext/ca_for_each_element.h +6 -8
- data/ext/ca_group_iter.c +1 -1
- data/ext/ca_kernel_iterator.c +386 -74
- data/ext/ca_kernel_iterator.h +145 -45
- data/ext/ca_obj_array.c +62 -20
- data/ext/ca_obj_bincmp.c +57 -27
- data/ext/ca_obj_binop.c +86 -30
- data/ext/ca_obj_block.c +4 -4
- data/ext/ca_obj_const_string.c +88 -27
- data/ext/ca_obj_face.c +104 -0
- data/ext/ca_obj_face.h +48 -1
- data/ext/ca_obj_fake.c +11 -0
- data/ext/ca_obj_fixlen_string.c +21 -6
- data/ext/ca_obj_grid.c +11 -3
- data/ext/ca_obj_meld.c +125 -22
- data/ext/ca_obj_moncmp.c +33 -14
- data/ext/ca_obj_monop.c +19 -7
- data/ext/ca_obj_object.c +107 -4
- data/ext/ca_obj_record.c +3 -1
- data/ext/ca_obj_refer.c +30 -6
- data/ext/ca_obj_roll.c +13 -5
- data/ext/ca_obj_select.c +49 -34
- data/ext/ca_obj_select_axis.c +16 -6
- data/ext/ca_obj_shift.c +3 -3
- data/ext/ca_obj_stack.c +3 -8
- data/ext/ca_obj_stride.c +178 -24
- data/ext/ca_obj_string.c +11 -5
- data/ext/ca_obj_tile.c +13 -5
- data/ext/ca_obj_time.c +3 -1
- data/ext/ca_obj_timedelta.c +3 -1
- data/ext/ca_obj_transpose.c +1 -1
- data/ext/ca_obj_triop.c +62 -23
- data/ext/ca_obj_window.c +94 -19
- data/ext/ca_op_cmplx64.h +123 -0
- data/ext/ca_op_ipower.c +1 -5
- data/ext/ca_rng_normal.h +42 -0
- data/ext/ca_rng_xoshiro256pp.h +105 -0
- data/ext/ca_sort_kernels.h +5 -5
- data/ext/ca_sweep_engine.c +362 -155
- data/ext/ca_sweep_engine.h +39 -9
- data/ext/ca_transform_common.c +7 -0
- data/ext/carray.h +148 -132
- data/ext/carray_access.c +83 -49
- data/ext/carray_address_basis.c +590 -0
- data/ext/carray_bincount.c +8 -8
- data/ext/carray_broadcast.c +102 -9
- data/ext/carray_build_flags.h +3 -0
- data/ext/carray_call_cfunc.c +2010 -335
- data/ext/carray_call_cfunc.h +153 -0
- data/ext/carray_cast.c +184 -72
- data/ext/carray_conversion.c +22 -22
- data/ext/carray_copy.c +67 -32
- data/ext/carray_core.c +140 -13
- data/ext/carray_count.c +10 -11
- data/ext/carray_element.c +7 -7
- data/ext/carray_factorize.c +72 -51
- data/ext/carray_hold.c +1 -1
- data/ext/carray_index_classifier.c +7 -21
- data/ext/carray_internal.h +36 -3
- data/ext/carray_kernels_bincmp.c +1 -0
- data/ext/carray_kernels_binop.c +320 -298
- data/ext/carray_kernels_init.c +1095 -0
- data/ext/carray_kernels_map.c +1 -0
- data/ext/carray_kernels_moncmp.c +1 -0
- data/ext/carray_kernels_monop.c +412 -411
- data/ext/carray_kernels_reduce_aggregate.c +256 -87
- data/ext/carray_kernels_reduce_boolean.c +1 -0
- data/ext/carray_kernels_reduce_cumulative.c +324 -54
- data/ext/carray_kernels_reduce_extreme.c +605 -58
- data/ext/carray_kernels_reduce_variance.c +1 -0
- data/ext/carray_kernels_scan.c +5 -4
- data/ext/carray_kernels_search.c +187 -106
- data/ext/carray_kernels_sort.c +1 -0
- data/ext/carray_kernels_triop.c +1 -0
- data/ext/carray_lazy.c +175 -5
- data/ext/carray_loop.c +7 -1
- data/ext/carray_mask.c +29 -13
- data/ext/carray_median_percentile.c +56 -1
- data/ext/carray_memory_view.c +46 -21
- data/ext/carray_operator.c +50 -53
- data/ext/carray_order.c +1 -1
- data/ext/carray_partition.c +4 -4
- data/ext/carray_random.c +391 -47
- data/ext/carray_scatter.c +1 -1
- data/ext/carray_slab.c +13 -0
- data/ext/carray_sort.c +22 -24
- data/ext/carray_sort_kernel.c +10 -10
- data/ext/carray_test.c +1 -1
- data/ext/extconf.rb +18 -0
- data/ext/mk_call_cfunc.rb +323 -145
- data/ext/mkkernel.rb +651 -129
- data/ext/ruby_carray.c +28 -17
- data/ext/version.h +4 -4
- data/lib/carray/autoload_carray.rb +24 -3
- data/lib/carray/autoload_method_extension.rb +14 -1
- data/lib/carray/axis_group.rb +84 -7
- data/lib/carray/basics.rb +63 -59
- data/lib/carray/bincount_nd.rb +12 -12
- data/lib/carray/block_iterator.rb +111 -25
- data/lib/carray/categorical.rb +154 -37
- data/lib/carray/categorical_iterator.rb +300 -151
- data/lib/carray/conditional.rb +14 -14
- data/lib/carray/const_string.rb +131 -27
- data/lib/carray/construct.rb +61 -0
- data/lib/carray/core_extensions.rb +62 -5
- data/lib/carray/data_type_extension.rb +21 -1
- data/lib/carray/data_type_limits.rb +91 -0
- data/lib/carray/fixlen_string.rb +1 -1
- data/lib/carray/frame/concat.rb +3 -3
- data/lib/carray/frame/convert.rb +1 -1
- data/lib/carray/frame/csv_parser.rb +11 -4
- data/lib/carray/frame/frame.rb +85 -21
- data/lib/carray/frame/group.rb +36 -3
- data/lib/carray/frame/io.rb +224 -15
- data/lib/carray/frame/records.rb +18 -4
- data/lib/carray/frame/sort.rb +1 -1
- data/lib/carray/frame/verbs.rb +32 -12
- data/lib/carray/fuse_source.rb +123 -0
- data/lib/carray/fusion.rb +218 -0
- data/lib/carray/histogram.rb +16 -16
- data/lib/carray/inspect.rb +43 -16
- data/lib/carray/iterator.rb +147 -3
- data/lib/carray/lazy.rb +88 -73
- data/lib/carray/mask_gap_fill.rb +3 -1
- data/lib/carray/meld_reduce.rb +2 -2
- data/lib/carray/methods/align_addr.rb +1 -1
- data/lib/carray/methods/composition.rb +1 -1
- data/lib/carray/methods/discovery_along.rb +74 -0
- data/lib/carray/methods/factorize.rb +50 -0
- data/lib/carray/methods/is_in.rb +25 -14
- data/lib/carray/methods/locate_addr.rb +81 -3
- data/lib/carray/methods/mask_duplicates.rb +36 -2
- data/lib/carray/methods/meshgrid.rb +4 -5
- data/lib/carray/methods/mode.rb +2 -2
- data/lib/carray/methods/nunique.rb +23 -2
- data/lib/carray/methods/repeat.rb +110 -0
- data/lib/carray/methods/snap.rb +7 -2
- data/lib/carray/methods/unique.rb +44 -4
- data/lib/carray/methods/value_counts.rb +2 -2
- data/lib/carray/rng.rb +86 -0
- data/lib/carray/runtime.rb +0 -19
- data/lib/carray/slab_iterator.rb +77 -19
- data/lib/carray/string_operation_extension.rb +10 -6
- data/lib/carray/time.rb +906 -491
- data/lib/carray/window_iterator.rb +421 -27
- data/lib/carray.rb +7 -5
- data/yard-stubs/ca_obj_array.rb +385 -0
- data/yard-stubs/ca_obj_bitarray.rb +38 -0
- data/yard-stubs/ca_obj_bitfield.rb +43 -0
- data/yard-stubs/ca_obj_block.rb +68 -0
- data/yard-stubs/ca_obj_byte_swap.rb +56 -0
- data/yard-stubs/ca_obj_fake.rb +31 -0
- data/yard-stubs/ca_obj_farray.rb +32 -0
- data/yard-stubs/ca_obj_field.rb +45 -0
- data/yard-stubs/ca_obj_grid.rb +35 -0
- data/yard-stubs/ca_obj_refer.rb +72 -0
- data/yard-stubs/ca_obj_roll.rb +45 -0
- data/yard-stubs/ca_obj_shift.rb +43 -0
- data/yard-stubs/ca_obj_stride.rb +181 -0
- data/yard-stubs/ca_obj_tile.rb +29 -0
- data/yard-stubs/ca_obj_transpose.rb +40 -0
- data/yard-stubs/ca_obj_window.rb +57 -0
- data/yard-stubs/carray_access.rb +131 -0
- data/yard-stubs/carray_attribute.rb +246 -0
- data/yard-stubs/carray_broadcast.rb +37 -0
- data/yard-stubs/carray_cast.rb +489 -0
- data/yard-stubs/carray_class.rb +65 -0
- data/yard-stubs/carray_conversion.rb +76 -0
- data/yard-stubs/carray_copy.rb +79 -0
- data/yard-stubs/carray_core.rb +34 -0
- data/yard-stubs/carray_count.rb +84 -0
- data/yard-stubs/carray_element.rb +108 -0
- data/yard-stubs/carray_generate.rb +66 -0
- data/yard-stubs/carray_lazy.rb +228 -0
- data/yard-stubs/carray_loop.rb +140 -0
- data/yard-stubs/carray_mask.rb +259 -0
- data/yard-stubs/carray_math.rb +1615 -0
- data/yard-stubs/carray_mathfunc.rb +45 -0
- data/yard-stubs/carray_median_percentile.rb +103 -0
- data/yard-stubs/carray_memory_view.rb +163 -0
- data/yard-stubs/carray_order.rb +252 -0
- data/yard-stubs/carray_random.rb +89 -0
- data/yard-stubs/carray_scatter.rb +106 -0
- data/yard-stubs/carray_slab.rb +59 -0
- data/yard-stubs/carray_sort.rb +165 -0
- data/yard-stubs/carray_test.rb +85 -0
- data/yard-stubs/carray_undef.rb +64 -0
- data/yard-stubs/carray_utils.rb +97 -0
- data/yard-stubs/ruby_carray.rb +193 -0
- metadata +67 -10
- data/ext/ca_obj_unbound_repeat.c +0 -496
data/ext/carray_broadcast.c
CHANGED
|
@@ -12,23 +12,94 @@
|
|
|
12
12
|
ca_broadcast_pair (&self, &other)
|
|
13
13
|
Two-sided expansion for binary ops (case A only: same ndim,
|
|
14
14
|
size-1 axes broadcast pairwise). Leaves both operands
|
|
15
|
-
unchanged when shapes are already equal
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
coercion path and by the binop
|
|
15
|
+
unchanged when shapes are already equal, and raises when they
|
|
16
|
+
cannot be paired: both operands of a binary operation are
|
|
17
|
+
equally authoritative, so a shape conflict has no resolution.
|
|
18
|
+
Called by carray_cast.c's coercion path and by the binop,
|
|
19
|
+
bincmp and triop builders, which is every place two operands
|
|
20
|
+
are brought together.
|
|
19
21
|
|
|
20
22
|
rb_ca_broadcast_to -- backs the public CArray#broadcast_to method
|
|
21
23
|
(right-to-left axis pairing; see the docstring at the function).
|
|
22
24
|
|
|
23
25
|
Case B (cross-ndim dim-prepending) is not handled by the implicit
|
|
24
|
-
helpers;
|
|
25
|
-
|
|
26
|
-
pinned to size 1).
|
|
26
|
+
helpers; a cross-ndim operand has to declare the axis itself, either
|
|
27
|
+
with the newaxis sigil (`a + c[:_, nil]`) or with #broadcast_to (which
|
|
28
|
+
does accept cross-ndim with target axes pinned to size 1).
|
|
27
29
|
|
|
28
30
|
---------------------------------------------------------------------------- */
|
|
29
31
|
|
|
30
32
|
#include "carray.h"
|
|
31
33
|
|
|
34
|
+
NORETURN(static void ca_broadcast_refuse_write (VALUE dst, VALUE src));
|
|
35
|
+
|
|
36
|
+
/* Report a source that cannot be brought to the destination's shape. */
|
|
37
|
+
static void
|
|
38
|
+
ca_broadcast_refuse_write (VALUE dst, VALUE src)
|
|
39
|
+
{
|
|
40
|
+
volatile VALUE dst_s = rb_inspect(rb_funcall(dst, rb_intern("shape"), 0));
|
|
41
|
+
volatile VALUE src_s = rb_inspect(rb_funcall(src, rb_intern("shape"), 0));
|
|
42
|
+
rb_raise(rb_eRuntimeError,
|
|
43
|
+
"shape mismatch writing to carray (%s <- %s); shapes must agree "
|
|
44
|
+
"once size-1 axes are dropped, or one side must be 1-D, or the "
|
|
45
|
+
"source must be smaller and broadcastable -- use .flatten to "
|
|
46
|
+
"write the values in the order they lie",
|
|
47
|
+
StringValueCStr(dst_s), StringValueCStr(src_s));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Bring `*src` to `dst`'s shape for a write into `dst` (assignment, and
|
|
51
|
+
the in-place operators, whose result shape is the destination's by
|
|
52
|
+
definition). The destination owns the shape and the source only
|
|
53
|
+
supplies values, so what is allowed here is wider than what two
|
|
54
|
+
operands of a binary operation may do -- but only where nothing is
|
|
55
|
+
duplicated. When the counts already agree the values land in the
|
|
56
|
+
order they lie and the shape is merely a reading of them: shapes that
|
|
57
|
+
both sides claim must agree once size-1 axes are dropped, since such
|
|
58
|
+
an axis moves no element, and a 1-D side claims no shape at all,
|
|
59
|
+
whether it is the flat source or the flat container. When the source
|
|
60
|
+
is smaller it is repeated instead, and that is held to same-ndim
|
|
61
|
+
size-1 and is one-sided: the destination never grows. Raises when
|
|
62
|
+
neither reading applies. */
|
|
63
|
+
void
|
|
64
|
+
ca_broadcast_to_destination (VALUE dst, volatile VALUE *src)
|
|
65
|
+
{
|
|
66
|
+
CArray *cd, *cs;
|
|
67
|
+
|
|
68
|
+
TypedData_Get_Struct(dst, CArray, &carray_data_type, cd);
|
|
69
|
+
TypedData_Get_Struct(*src, CArray, &carray_data_type, cs);
|
|
70
|
+
|
|
71
|
+
if ( cs->elements == cd->elements ) {
|
|
72
|
+
ca_size_t dst_dim[CA_RANK_MAX], src_dim[CA_RANK_MAX];
|
|
73
|
+
int dst_ndim = 0, src_ndim = 0, i, agree;
|
|
74
|
+
if ( cd->ndim <= 1 || cs->ndim <= 1 ) return;
|
|
75
|
+
for ( i = 0; i < cd->ndim; i++ ) {
|
|
76
|
+
if ( cd->dim[i] != 1 ) dst_dim[dst_ndim++] = cd->dim[i];
|
|
77
|
+
}
|
|
78
|
+
for ( i = 0; i < cs->ndim; i++ ) {
|
|
79
|
+
if ( cs->dim[i] != 1 ) src_dim[src_ndim++] = cs->dim[i];
|
|
80
|
+
}
|
|
81
|
+
agree = ( dst_ndim == src_ndim );
|
|
82
|
+
for ( i = 0; agree && i < dst_ndim; i++ ) {
|
|
83
|
+
if ( dst_dim[i] != src_dim[i] ) agree = 0;
|
|
84
|
+
}
|
|
85
|
+
if ( ! agree ) ca_broadcast_refuse_write(dst, *src);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if ( cs->elements < cd->elements && cs->ndim == cd->ndim ) {
|
|
90
|
+
int i;
|
|
91
|
+
for ( i = 0; i < cd->ndim; i++ ) {
|
|
92
|
+
if ( cs->dim[i] != cd->dim[i] && cs->dim[i] != 1 ) break;
|
|
93
|
+
}
|
|
94
|
+
if ( i == cd->ndim ) {
|
|
95
|
+
*src = ca_broadcast_view(*src, cd->ndim, cd->dim);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
ca_broadcast_refuse_write(dst, *src);
|
|
101
|
+
}
|
|
102
|
+
|
|
32
103
|
/* Build a CAStride view of `src` with shape `target_dim`. For each
|
|
33
104
|
axis where src.dim[i] == target_dim[i], inherit the row-major byte
|
|
34
105
|
stride; for src.dim[i] == 1 and target_dim[i] > 1, use stride 0.
|
|
@@ -99,6 +170,24 @@ ca_broadcast_view (VALUE src, int8_t ndim, ca_size_t *target_dim)
|
|
|
99
170
|
pairwise equal, no-op. If any axis pair is incompatible (neither
|
|
100
171
|
side is 1 nor equal), no-op (caller's existing element-count check
|
|
101
172
|
raises). */
|
|
173
|
+
NORETURN(static void ca_broadcast_refuse (VALUE self, VALUE other));
|
|
174
|
+
|
|
175
|
+
/* Report a pair that cannot be brought to a common shape. Naming both
|
|
176
|
+
shapes is the point of the message: the caller wrote two arrays that
|
|
177
|
+
cannot be combined, and the only remedy is to say which two. */
|
|
178
|
+
static void
|
|
179
|
+
ca_broadcast_refuse (VALUE self, VALUE other)
|
|
180
|
+
{
|
|
181
|
+
volatile VALUE self_s = rb_inspect(rb_funcall(self, rb_intern("shape"), 0));
|
|
182
|
+
volatile VALUE other_s = rb_inspect(rb_funcall(other, rb_intern("shape"), 0));
|
|
183
|
+
rb_raise(rb_eArgError,
|
|
184
|
+
"shape mismatch between operands (%s and %s); shapes must "
|
|
185
|
+
"agree, or differ only in size-1 axes with equal ndim -- use "
|
|
186
|
+
".flatten on both sides to operate on the values in the order "
|
|
187
|
+
"they lie",
|
|
188
|
+
StringValueCStr(self_s), StringValueCStr(other_s));
|
|
189
|
+
}
|
|
190
|
+
|
|
102
191
|
void
|
|
103
192
|
ca_broadcast_pair (volatile VALUE *self, volatile VALUE *other)
|
|
104
193
|
{
|
|
@@ -111,8 +200,11 @@ ca_broadcast_pair (volatile VALUE *self, volatile VALUE *other)
|
|
|
111
200
|
TypedData_Get_Struct(*self, CArray, &carray_data_type, ca);
|
|
112
201
|
TypedData_Get_Struct(*other, CArray, &carray_data_type, cb);
|
|
113
202
|
|
|
203
|
+
/* A scalar carries no shape and reaches every cell; leave the pair to
|
|
204
|
+
the caller's own scalar handling. A one-element array is not a
|
|
205
|
+
scalar: it states a shape, and is held to it. */
|
|
114
206
|
if (ca_is_scalar(ca) || ca_is_scalar(cb)) return;
|
|
115
|
-
if (ca->ndim != cb->ndim)
|
|
207
|
+
if (ca->ndim != cb->ndim) ca_broadcast_refuse(*self, *other);
|
|
116
208
|
if (ca->ndim == 0) return;
|
|
117
209
|
|
|
118
210
|
for (i = 0; i < ca->ndim; i++) {
|
|
@@ -133,7 +225,8 @@ ca_broadcast_pair (volatile VALUE *self, volatile VALUE *other)
|
|
|
133
225
|
}
|
|
134
226
|
}
|
|
135
227
|
|
|
136
|
-
if (!can_broadcast
|
|
228
|
+
if (!can_broadcast) ca_broadcast_refuse(*self, *other);
|
|
229
|
+
if (!needs_broadcast) return;
|
|
137
230
|
|
|
138
231
|
*self = ca_broadcast_view(*self, ca->ndim, target_dim);
|
|
139
232
|
*other = ca_broadcast_view(*other, ca->ndim, target_dim);
|