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,216 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
Key windows: the rows each row's window holds when the window is bounded by
|
|
4
|
+
a width of a key (a time or a number) rather than by a count of cells.
|
|
5
|
+
Backing primitive for `windows(on:)` (lib/carray/key_windows.rb).
|
|
6
|
+
|
|
7
|
+
The Ruby side sorts the rows by (group, key), drops the rows whose key or
|
|
8
|
+
group is masked, and hands the sorted keys and group codes here. One walk
|
|
9
|
+
with two pointers gives each row the range [lo, hi) of sorted positions in
|
|
10
|
+
its window: within a group the key does not decrease, so both bounds of the
|
|
11
|
+
window only move forward.
|
|
12
|
+
|
|
13
|
+
With points given (`windows(at:)`), the windows sit at the points instead
|
|
14
|
+
of at the rows: the walk goes over the sorted points, one window each, and
|
|
15
|
+
the two pointers move over the sorted keys of a single group.
|
|
16
|
+
|
|
17
|
+
---------------------------------------------------------------------------- */
|
|
18
|
+
|
|
19
|
+
#include <stdint.h>
|
|
20
|
+
#include <math.h>
|
|
21
|
+
#include "ruby.h"
|
|
22
|
+
#include "carray.h"
|
|
23
|
+
|
|
24
|
+
/* Whether key k lies inside the window of an anchor t:
|
|
25
|
+
lower bound t - before, upper bound t + after,
|
|
26
|
+
each bound excluded when the matching flag is set. */
|
|
27
|
+
#define KW_ABOVE_LOWER(k, lo_b, ex_lo) ((ex_lo) ? ((k) > (lo_b)) : ((k) >= (lo_b)))
|
|
28
|
+
#define KW_BELOW_UPPER(k, hi_b, ex_hi) ((ex_hi) ? ((k) < (hi_b)) : ((k) <= (hi_b)))
|
|
29
|
+
|
|
30
|
+
/* The walk, written once for an int64 key and once for a float64 key. ON_GRID
|
|
31
|
+
tells whether key k lies on the interval grid that starts at anchor t.
|
|
32
|
+
BOUNDS sets lo_b and hi_b, and lo_open / hi_open when a bound lies beyond
|
|
33
|
+
the range of T, so that every key of the group is inside it. */
|
|
34
|
+
#define KW_WALK(T, ON_GRID, BOUNDS) \
|
|
35
|
+
{ \
|
|
36
|
+
const T *key = (const T *) ck->ptr; \
|
|
37
|
+
const T before = (T) vbefore, after = (T) vafter, iv = (T) viv; \
|
|
38
|
+
ca_size_t lo = 0, hi = 0, gstart = 0; \
|
|
39
|
+
for (ca_size_t i = 0; i < n; i++) { \
|
|
40
|
+
if ( i > 0 && grp[i] != grp[i-1] ) { \
|
|
41
|
+
gstart = i; lo = i; hi = i; \
|
|
42
|
+
} \
|
|
43
|
+
else if ( i > 0 && key[i] < key[i-1] ) { \
|
|
44
|
+
rb_raise(rb_eArgError, \
|
|
45
|
+
"windows: the keys are not sorted within a group"); \
|
|
46
|
+
} \
|
|
47
|
+
if ( lo < gstart ) lo = gstart; \
|
|
48
|
+
if ( hi < lo ) hi = lo; \
|
|
49
|
+
const T t = key[i]; \
|
|
50
|
+
T lo_b, hi_b; \
|
|
51
|
+
int lo_open, hi_open; \
|
|
52
|
+
BOUNDS; \
|
|
53
|
+
while ( lo < n && grp[lo] == grp[i] && !lo_open && \
|
|
54
|
+
!KW_ABOVE_LOWER(key[lo], lo_b, ex_lo) ) lo++; \
|
|
55
|
+
if ( hi < lo ) hi = lo; \
|
|
56
|
+
while ( hi < n && grp[hi] == grp[i] && \
|
|
57
|
+
( hi_open || KW_BELOW_UPPER(key[hi], hi_b, ex_hi) ) ) hi++; \
|
|
58
|
+
plo[i] = lo; \
|
|
59
|
+
phi[i] = hi; \
|
|
60
|
+
if ( pcomplete ) { \
|
|
61
|
+
int64_t distinct = 0; \
|
|
62
|
+
int ok = 1; \
|
|
63
|
+
for (ca_size_t j = lo; j < hi; j++) { \
|
|
64
|
+
const T k = key[j]; \
|
|
65
|
+
if ( j == lo || k != key[j-1] ) distinct++; \
|
|
66
|
+
if ( !(ON_GRID) ) { ok = 0; break; } \
|
|
67
|
+
} \
|
|
68
|
+
pcomplete[i] = ( ok && distinct == nexp ) ? 1 : 0; \
|
|
69
|
+
} \
|
|
70
|
+
} \
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* The walk over points: the window of point t holds the keys within its
|
|
74
|
+
bounds. The keys form one group (at: refuses by:), and both the keys and
|
|
75
|
+
the points are sorted, so both pointers only move forward. */
|
|
76
|
+
#define KW_WALK_AT(T, ON_GRID, BOUNDS) \
|
|
77
|
+
{ \
|
|
78
|
+
const T *key = (const T *) ck->ptr; \
|
|
79
|
+
const T *pts = (const T *) cp->ptr; \
|
|
80
|
+
const T before = (T) vbefore, after = (T) vafter, iv = (T) viv; \
|
|
81
|
+
ca_size_t lo = 0, hi = 0; \
|
|
82
|
+
for (ca_size_t j = 1; j < n; j++) { \
|
|
83
|
+
if ( key[j] < key[j-1] ) { \
|
|
84
|
+
rb_raise(rb_eArgError, "windows: the keys are not sorted"); \
|
|
85
|
+
} \
|
|
86
|
+
} \
|
|
87
|
+
for (ca_size_t i = 0; i < nout; i++) { \
|
|
88
|
+
if ( i > 0 && pts[i] < pts[i-1] ) { \
|
|
89
|
+
rb_raise(rb_eArgError, "windows: the points are not sorted"); \
|
|
90
|
+
} \
|
|
91
|
+
const T t = pts[i]; \
|
|
92
|
+
T lo_b, hi_b; \
|
|
93
|
+
int lo_open, hi_open; \
|
|
94
|
+
BOUNDS; \
|
|
95
|
+
while ( lo < n && !lo_open && !KW_ABOVE_LOWER(key[lo], lo_b, ex_lo) ) \
|
|
96
|
+
lo++; \
|
|
97
|
+
if ( hi < lo ) hi = lo; \
|
|
98
|
+
while ( hi < n && ( hi_open || KW_BELOW_UPPER(key[hi], hi_b, ex_hi) ) ) \
|
|
99
|
+
hi++; \
|
|
100
|
+
plo[i] = lo; \
|
|
101
|
+
phi[i] = hi; \
|
|
102
|
+
if ( pcomplete ) { \
|
|
103
|
+
int64_t distinct = 0; \
|
|
104
|
+
int ok = 1; \
|
|
105
|
+
for (ca_size_t j = lo; j < hi; j++) { \
|
|
106
|
+
const T k = key[j]; \
|
|
107
|
+
if ( j == lo || k != key[j-1] ) distinct++; \
|
|
108
|
+
if ( !(ON_GRID) ) { ok = 0; break; } \
|
|
109
|
+
} \
|
|
110
|
+
pcomplete[i] = ( ok && distinct == nexp ) ? 1 : 0; \
|
|
111
|
+
} \
|
|
112
|
+
} \
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* CArray.__find_key_window_row_ranges__(keys, groups, before, after,
|
|
116
|
+
exclude_lower, exclude_upper,
|
|
117
|
+
interval, expected, points)
|
|
118
|
+
keys: int64 or float64 entity, sorted within each group
|
|
119
|
+
groups: int64 entity, the group code of each row (rows of a group adjacent)
|
|
120
|
+
interval: nil, or the grid step for the completeness test
|
|
121
|
+
expected: the number of grid points a complete window holds
|
|
122
|
+
points: nil for a window at each row; or an entity of the keys' data type,
|
|
123
|
+
sorted, for a window at each point (groups must then be one group)
|
|
124
|
+
Returns [lo, hi, complete]: int64 positions into the sorted rows, one per
|
|
125
|
+
row or per point, and a boolean array (nil when no interval was given). */
|
|
126
|
+
static VALUE
|
|
127
|
+
rb_ca_s_key_window_ranges (VALUE self, VALUE vkeys, VALUE vgroups,
|
|
128
|
+
VALUE rbefore, VALUE rafter,
|
|
129
|
+
VALUE rex_lo, VALUE rex_hi,
|
|
130
|
+
VALUE rinterval, VALUE rexpected, VALUE vpoints)
|
|
131
|
+
{
|
|
132
|
+
CArray *ck, *cg, *cp = NULL, *clo, *chi, *cc = NULL;
|
|
133
|
+
volatile VALUE vlo, vhi, vcomplete = Qnil;
|
|
134
|
+
ca_size_t n, nout;
|
|
135
|
+
int64_t *plo, *phi;
|
|
136
|
+
boolean8_t *pcomplete = NULL;
|
|
137
|
+
int ex_lo = RTEST(rex_lo), ex_hi = RTEST(rex_hi);
|
|
138
|
+
int64_t nexp = 0;
|
|
139
|
+
const int64_t *grp;
|
|
140
|
+
|
|
141
|
+
if ( !rb_obj_is_kind_of(vkeys, rb_cCArray) ||
|
|
142
|
+
!rb_obj_is_kind_of(vgroups, rb_cCArray) ) {
|
|
143
|
+
rb_raise(rb_eTypeError, "__find_key_window_row_ranges__: CArray arguments expected");
|
|
144
|
+
}
|
|
145
|
+
GetCArray(vkeys, ck);
|
|
146
|
+
GetCArray(vgroups, cg);
|
|
147
|
+
if ( ck->obj_type != CA_OBJ_ARRAY || cg->obj_type != CA_OBJ_ARRAY ||
|
|
148
|
+
ck->ndim != 1 || cg->ndim != 1 || cg->data_type != CA_INT64 ||
|
|
149
|
+
ck->elements != cg->elements || ca_has_mask(ck) || ca_has_mask(cg) ||
|
|
150
|
+
( ck->data_type != CA_INT64 && ck->data_type != CA_FLOAT64 ) ) {
|
|
151
|
+
rb_raise(rb_eArgError, "__find_key_window_row_ranges__: unexpected arguments");
|
|
152
|
+
}
|
|
153
|
+
n = ck->elements;
|
|
154
|
+
grp = (const int64_t *) cg->ptr;
|
|
155
|
+
nout = n;
|
|
156
|
+
if ( !NIL_P(vpoints) ) {
|
|
157
|
+
if ( !rb_obj_is_kind_of(vpoints, rb_cCArray) ) {
|
|
158
|
+
rb_raise(rb_eTypeError, "__find_key_window_row_ranges__: CArray arguments expected");
|
|
159
|
+
}
|
|
160
|
+
GetCArray(vpoints, cp);
|
|
161
|
+
if ( cp->obj_type != CA_OBJ_ARRAY || cp->ndim != 1 || ca_has_mask(cp) ||
|
|
162
|
+
cp->data_type != ck->data_type ) {
|
|
163
|
+
rb_raise(rb_eArgError, "__find_key_window_row_ranges__: unexpected arguments");
|
|
164
|
+
}
|
|
165
|
+
nout = cp->elements;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
vlo = rb_carray_new(CA_INT64, 1, &nout, 0, NULL);
|
|
169
|
+
vhi = rb_carray_new(CA_INT64, 1, &nout, 0, NULL);
|
|
170
|
+
GetCArray(vlo, clo);
|
|
171
|
+
GetCArray(vhi, chi);
|
|
172
|
+
plo = (int64_t *) clo->ptr;
|
|
173
|
+
phi = (int64_t *) chi->ptr;
|
|
174
|
+
if ( !NIL_P(rinterval) ) {
|
|
175
|
+
vcomplete = rb_carray_new(CA_BOOLEAN, 1, &nout, 0, NULL);
|
|
176
|
+
GetCArray(vcomplete, cc);
|
|
177
|
+
pcomplete = (boolean8_t *) cc->ptr;
|
|
178
|
+
nexp = NUM2LL(rexpected);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if ( ck->data_type == CA_INT64 ) {
|
|
182
|
+
int64_t vbefore = NUM2LL(rbefore), vafter = NUM2LL(rafter);
|
|
183
|
+
int64_t viv = NIL_P(rinterval) ? 1 : NUM2LL(rinterval);
|
|
184
|
+
int64_t d;
|
|
185
|
+
/* before and after are not negative, so an overflow of t - before is
|
|
186
|
+
below every key and one of t + after above every key. A difference
|
|
187
|
+
k - t that overflows is not taken as on the grid. */
|
|
188
|
+
#define KW_INT_ON_GRID (!__builtin_sub_overflow(k, t, &d) && d % iv == 0)
|
|
189
|
+
#define KW_INT_BOUNDS (lo_open = __builtin_sub_overflow(t, before, &lo_b), \
|
|
190
|
+
hi_open = __builtin_add_overflow(t, after, &hi_b))
|
|
191
|
+
if ( cp ) KW_WALK_AT(int64_t, KW_INT_ON_GRID, KW_INT_BOUNDS)
|
|
192
|
+
else KW_WALK(int64_t, KW_INT_ON_GRID, KW_INT_BOUNDS)
|
|
193
|
+
#undef KW_INT_ON_GRID
|
|
194
|
+
#undef KW_INT_BOUNDS
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
double vbefore = NUM2DBL(rbefore), vafter = NUM2DBL(rafter);
|
|
198
|
+
double viv = NIL_P(rinterval) ? 1.0 : NUM2DBL(rinterval);
|
|
199
|
+
#define KW_DBL_ON_GRID (fabs((k - t) / iv - nearbyint((k - t) / iv)) <= \
|
|
200
|
+
1e-9 * fmax(1.0, fabs((k - t) / iv)))
|
|
201
|
+
#define KW_DBL_BOUNDS (lo_b = t - before, hi_b = t + after, lo_open = 0, hi_open = 0)
|
|
202
|
+
if ( cp ) KW_WALK_AT(double, KW_DBL_ON_GRID, KW_DBL_BOUNDS)
|
|
203
|
+
else KW_WALK(double, KW_DBL_ON_GRID, KW_DBL_BOUNDS)
|
|
204
|
+
#undef KW_DBL_ON_GRID
|
|
205
|
+
#undef KW_DBL_BOUNDS
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return rb_ary_new3(3, vlo, vhi, vcomplete);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
void
|
|
212
|
+
Init_carray_key_windows (void)
|
|
213
|
+
{
|
|
214
|
+
rb_define_singleton_method(rb_cCArray, "__find_key_window_row_ranges__",
|
|
215
|
+
rb_ca_s_key_window_ranges, 9);
|
|
216
|
+
}
|