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
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
carray_segment.c
|
|
4
|
+
|
|
5
|
+
Conversions between the representations of a flat sequence cut into
|
|
6
|
+
consecutive segments:
|
|
7
|
+
|
|
8
|
+
lengths [2, 0, 3] one count per segment (k)
|
|
9
|
+
offsets [0, 2, 2, 5] every boundary, first and last included (k+1)
|
|
10
|
+
segment index [0, 0, 2, 2, 2] the segment each element belongs to (n)
|
|
11
|
+
|
|
12
|
+
CArray.segment_offsets(lengths: l) lengths -> offsets
|
|
13
|
+
CArray.segment_index(lengths: l) lengths -> segment index
|
|
14
|
+
CArray.segment_index(offsets: o) offsets -> segment index
|
|
15
|
+
|
|
16
|
+
Everything is computed in int64, so a total beyond 2**53 stays exact
|
|
17
|
+
(a cumsum would go through float64). Offsets need not start at 0: the
|
|
18
|
+
offsets of rows a..b cut out of a longer table start at offsets[a], and
|
|
19
|
+
the segment index then covers offsets[0]...offsets[-1] with the segments
|
|
20
|
+
numbered from 0.
|
|
21
|
+
|
|
22
|
+
Inputs are read through ca_copy_data straight into an int64 array that
|
|
23
|
+
Ruby already owns, so a refusal after reading leaks nothing.
|
|
24
|
+
|
|
25
|
+
--------------------------------------------------------------------------- */
|
|
26
|
+
|
|
27
|
+
#include "carray.h"
|
|
28
|
+
|
|
29
|
+
static ID id_lengths, id_offsets;
|
|
30
|
+
|
|
31
|
+
/* Read `v` (any integer or boolean CArray, or an Array of Integers) as
|
|
32
|
+
int64 into a fresh Ruby-owned array of `pad_front + v.elements`
|
|
33
|
+
elements, starting after `pad_front` cells. Refuses a non-integer
|
|
34
|
+
data type and masked cells, since neither names a count or a
|
|
35
|
+
position. */
|
|
36
|
+
static VALUE
|
|
37
|
+
segment_read_int64 (VALUE v, const char *name, int is_lengths,
|
|
38
|
+
ca_size_t pad_front, CArray **out_ca, ca_size_t *out_k)
|
|
39
|
+
{
|
|
40
|
+
CArray *src, *dst;
|
|
41
|
+
VALUE rsrc, rdst;
|
|
42
|
+
ca_size_t k;
|
|
43
|
+
const char *role = is_lengths ? "lengths" : "offsets";
|
|
44
|
+
|
|
45
|
+
if ( TYPE(v) == T_ARRAY ) {
|
|
46
|
+
long i;
|
|
47
|
+
for (i = 0; i < RARRAY_LEN(v); i++) {
|
|
48
|
+
if ( ! RB_INTEGER_TYPE_P(RARRAY_AREF(v, i)) ) {
|
|
49
|
+
rb_raise(rb_eArgError, "%s: %s must be integers", name, role);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if ( ! rb_obj_is_carray(v) ) {
|
|
54
|
+
rb_raise(rb_eTypeError, "%s: %s must be a CArray or an Array of Integers",
|
|
55
|
+
name, role);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
GetCArray(v, src);
|
|
59
|
+
if ( ! ca_is_integer_type(src) && src->data_type != CA_BOOLEAN ) {
|
|
60
|
+
rb_raise(rb_eCADataTypeError, "%s: %s must be integers (got %s)",
|
|
61
|
+
name, role, ca_type_name[src->data_type]);
|
|
62
|
+
}
|
|
63
|
+
if ( ca_has_mask(src) &&
|
|
64
|
+
NUM2LL(rb_funcall(v, rb_intern("count_masked"), 0)) > 0 ) {
|
|
65
|
+
rb_raise(rb_eArgError, is_lengths ? "%s: a masked length is not a count"
|
|
66
|
+
: "%s: a masked offset is not a position",
|
|
67
|
+
name);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
rsrc = rb_ca_wrap_readonly(v, INT2NUM(CA_INT64));
|
|
72
|
+
GetCArray(rsrc, src);
|
|
73
|
+
k = src->elements;
|
|
74
|
+
{
|
|
75
|
+
ca_size_t dim[1];
|
|
76
|
+
dim[0] = pad_front + k;
|
|
77
|
+
rdst = rb_carray_new(CA_INT64, 1, dim, 0, NULL);
|
|
78
|
+
}
|
|
79
|
+
GetCArray(rdst, dst);
|
|
80
|
+
if ( k > 0 ) {
|
|
81
|
+
ca_copy_data(src, dst->ptr + pad_front * sizeof(int64_t));
|
|
82
|
+
}
|
|
83
|
+
RB_GC_GUARD(rsrc);
|
|
84
|
+
*out_ca = dst;
|
|
85
|
+
*out_k = k;
|
|
86
|
+
return rdst;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Turn a lengths array read into o[1..k] into offsets in place, o[0] = 0. */
|
|
90
|
+
static void
|
|
91
|
+
segment_prefix_sum (int64_t *o, ca_size_t k, const char *name)
|
|
92
|
+
{
|
|
93
|
+
int64_t s = 0;
|
|
94
|
+
ca_size_t c;
|
|
95
|
+
o[0] = 0;
|
|
96
|
+
for (c = 1; c <= k; c++) {
|
|
97
|
+
int64_t l = o[c];
|
|
98
|
+
if ( l < 0 ) {
|
|
99
|
+
rb_raise(rb_eArgError, "%s: lengths must not be negative (got %lld at %lld)",
|
|
100
|
+
name, (long long) l, (long long) (c - 1));
|
|
101
|
+
}
|
|
102
|
+
if ( s > INT64_MAX - l ) {
|
|
103
|
+
rb_raise(rb_eRangeError, "%s: the total length overflows int64", name);
|
|
104
|
+
}
|
|
105
|
+
s += l;
|
|
106
|
+
o[c] = s;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Parse the one role keyword. Returns the value and sets *is_lengths. */
|
|
111
|
+
static VALUE
|
|
112
|
+
segment_role (int argc, VALUE *argv, const char *name, int allow_offsets,
|
|
113
|
+
int *is_lengths)
|
|
114
|
+
{
|
|
115
|
+
VALUE opts, vals[2];
|
|
116
|
+
ID ids[2];
|
|
117
|
+
int nids;
|
|
118
|
+
|
|
119
|
+
rb_scan_args(argc, argv, ":", &opts);
|
|
120
|
+
ids[0] = id_lengths;
|
|
121
|
+
ids[1] = id_offsets;
|
|
122
|
+
nids = allow_offsets ? 2 : 1;
|
|
123
|
+
vals[0] = vals[1] = Qundef;
|
|
124
|
+
rb_get_kwargs(opts, ids, 0, nids, vals);
|
|
125
|
+
|
|
126
|
+
if ( vals[0] != Qundef && nids == 2 && vals[1] != Qundef ) {
|
|
127
|
+
rb_raise(rb_eArgError, "%s: give lengths: or offsets:, not both", name);
|
|
128
|
+
}
|
|
129
|
+
if ( vals[0] != Qundef ) {
|
|
130
|
+
*is_lengths = 1;
|
|
131
|
+
return vals[0];
|
|
132
|
+
}
|
|
133
|
+
if ( nids == 2 && vals[1] != Qundef ) {
|
|
134
|
+
*is_lengths = 0;
|
|
135
|
+
return vals[1];
|
|
136
|
+
}
|
|
137
|
+
rb_raise(rb_eArgError, allow_offsets ? "%s: lengths: or offsets: is required"
|
|
138
|
+
: "%s: lengths: is required", name);
|
|
139
|
+
return Qnil;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* CArray.segment_offsets(lengths: l) -> int64[k+1] */
|
|
143
|
+
static VALUE
|
|
144
|
+
rb_ca_s_segment_offsets (int argc, VALUE *argv, VALUE klass)
|
|
145
|
+
{
|
|
146
|
+
const char *name = "segment_offsets";
|
|
147
|
+
int is_lengths;
|
|
148
|
+
VALUE v, ro;
|
|
149
|
+
CArray *co;
|
|
150
|
+
ca_size_t k;
|
|
151
|
+
|
|
152
|
+
v = segment_role(argc, argv, name, 0, &is_lengths);
|
|
153
|
+
ro = segment_read_int64(v, name, 1, 1, &co, &k);
|
|
154
|
+
segment_prefix_sum((int64_t *) co->ptr, k, name);
|
|
155
|
+
return ro;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* The boundaries named by the one role keyword, as a validated int64 array
|
|
159
|
+
of k+1 elements that Ruby owns: lengths are summed, offsets are checked
|
|
160
|
+
to be non-empty and non-decreasing. */
|
|
161
|
+
static VALUE
|
|
162
|
+
segment_bounds (int argc, VALUE *argv, const char *name, CArray **out_co,
|
|
163
|
+
ca_size_t *out_k)
|
|
164
|
+
{
|
|
165
|
+
int is_lengths;
|
|
166
|
+
VALUE v, ro;
|
|
167
|
+
CArray *co;
|
|
168
|
+
ca_size_t k, c;
|
|
169
|
+
int64_t *o;
|
|
170
|
+
|
|
171
|
+
v = segment_role(argc, argv, name, 1, &is_lengths);
|
|
172
|
+
|
|
173
|
+
if ( is_lengths ) {
|
|
174
|
+
ro = segment_read_int64(v, name, 1, 1, &co, &k);
|
|
175
|
+
segment_prefix_sum((int64_t *) co->ptr, k, name);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
ro = segment_read_int64(v, name, 0, 0, &co, &k);
|
|
179
|
+
if ( k == 0 ) {
|
|
180
|
+
rb_raise(rb_eArgError,
|
|
181
|
+
"%s: offsets need at least one element (the start of the first segment)",
|
|
182
|
+
name);
|
|
183
|
+
}
|
|
184
|
+
o = (int64_t *) co->ptr;
|
|
185
|
+
for (c = 1; c < k; c++) {
|
|
186
|
+
if ( o[c] < o[c-1] ) {
|
|
187
|
+
rb_raise(rb_eArgError,
|
|
188
|
+
"%s: offsets must not decrease (%lld after %lld at %lld)",
|
|
189
|
+
name, (long long) o[c], (long long) o[c-1], (long long) c);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
k -= 1; /* k+1 boundaries -> k segments */
|
|
193
|
+
}
|
|
194
|
+
*out_co = co;
|
|
195
|
+
*out_k = k;
|
|
196
|
+
return ro;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* CArray.segment_index(lengths: l) -> int64[l.sum]
|
|
200
|
+
CArray.segment_index(offsets: o) -> int64[o[-1] - o[0]] */
|
|
201
|
+
static VALUE
|
|
202
|
+
rb_ca_s_segment_index (int argc, VALUE *argv, VALUE klass)
|
|
203
|
+
{
|
|
204
|
+
VALUE ro, rout;
|
|
205
|
+
CArray *co, *cout;
|
|
206
|
+
ca_size_t k, c;
|
|
207
|
+
int64_t *o, *q, base, total;
|
|
208
|
+
|
|
209
|
+
ro = segment_bounds(argc, argv, "segment_index", &co, &k);
|
|
210
|
+
o = (int64_t *) co->ptr;
|
|
211
|
+
|
|
212
|
+
base = o[0];
|
|
213
|
+
total = o[k] - base;
|
|
214
|
+
{
|
|
215
|
+
ca_size_t dim[1];
|
|
216
|
+
dim[0] = (ca_size_t) total;
|
|
217
|
+
rout = rb_carray_new(CA_INT64, 1, dim, 0, NULL);
|
|
218
|
+
}
|
|
219
|
+
GetCArray(rout, cout);
|
|
220
|
+
q = (int64_t *) cout->ptr;
|
|
221
|
+
for (c = 0; c < k; c++) {
|
|
222
|
+
int64_t p = o[c] - base, e = o[c+1] - base;
|
|
223
|
+
for (; p < e; p++) {
|
|
224
|
+
q[p] = (int64_t) c;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
RB_GC_GUARD(ro);
|
|
228
|
+
return rout;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* CArray.__segment_boundaries_from_lengths_or_offsets__(name, lengths: l | offsets: o) -> int64[k+1]
|
|
232
|
+
|
|
233
|
+
Internal: the validated boundaries, for a Ruby caller that takes the same
|
|
234
|
+
two keywords (CArray#segments). `name` heads the error messages. */
|
|
235
|
+
static VALUE
|
|
236
|
+
rb_ca_s_segment_bounds (int argc, VALUE *argv, VALUE klass)
|
|
237
|
+
{
|
|
238
|
+
CArray *co;
|
|
239
|
+
ca_size_t k;
|
|
240
|
+
VALUE rname;
|
|
241
|
+
if ( argc < 1 ) {
|
|
242
|
+
rb_raise(rb_eArgError, "__segment_boundaries_from_lengths_or_offsets__: the caller's name is required");
|
|
243
|
+
}
|
|
244
|
+
rname = argv[0];
|
|
245
|
+
StringValue(rname);
|
|
246
|
+
return segment_bounds(argc - 1, argv + 1, RSTRING_PTR(rname), &co, &k);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
void
|
|
250
|
+
Init_carray_segment (void)
|
|
251
|
+
{
|
|
252
|
+
id_lengths = rb_intern("lengths");
|
|
253
|
+
id_offsets = rb_intern("offsets");
|
|
254
|
+
rb_define_singleton_method(rb_cCArray, "segment_offsets", rb_ca_s_segment_offsets, -1);
|
|
255
|
+
rb_define_singleton_method(rb_cCArray, "segment_index", rb_ca_s_segment_index, -1);
|
|
256
|
+
rb_define_singleton_method(rb_cCArray, "__segment_boundaries_from_lengths_or_offsets__", rb_ca_s_segment_bounds, -1);
|
|
257
|
+
}
|