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
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
ca_rng_xoshiro256pp.h -- the xoshiro256++ generator, as text
|
|
4
|
+
|
|
5
|
+
This file is not a header in the usual sense. It carries no include
|
|
6
|
+
guard and includes nothing, because it is read two ways:
|
|
7
|
+
|
|
8
|
+
- ext/carray_random.c #includes it, and the extension compiles it.
|
|
9
|
+
That is what `CArray#random!(rng: r)` runs.
|
|
10
|
+
|
|
11
|
+
- CArray::Rng::SOURCE[:xoshiro256pp] is this file's text, read at
|
|
12
|
+
runtime. carray-jit pastes it into the translation unit it
|
|
13
|
+
generates for a kernel, beside its own `static inline` helpers.
|
|
14
|
+
That is what a kernel's `random(rng:)` runs.
|
|
15
|
+
|
|
16
|
+
One text, so the two cannot drift: a kernel that draws after
|
|
17
|
+
`random!` continues the same sequence because it is running the same
|
|
18
|
+
code, not because two implementations were checked against each
|
|
19
|
+
other. Anything added here has to stay pasteable -- `static inline`,
|
|
20
|
+
no directives, and nothing beyond <stdint.h>, which both sides have.
|
|
21
|
+
|
|
22
|
+
xoshiro256++ 1.0 by David Blackman and Sebastiano Vigna, released to
|
|
23
|
+
the public domain (https://prng.di.unimi.it/xoshiro256plusplus.c).
|
|
24
|
+
The state is seeded through splitmix64, as its authors prescribe.
|
|
25
|
+
|
|
26
|
+
The state is held as int64_t[4] rather than uint64_t[4] so that it is
|
|
27
|
+
a plain CA_INT64 array a caller can look at. C says an object may be
|
|
28
|
+
read through the corresponding signed or unsigned type, so the cast
|
|
29
|
+
below is the language's own allowance and not a reinterpretation.
|
|
30
|
+
|
|
31
|
+
--------------------------------------------------------------------------- */
|
|
32
|
+
|
|
33
|
+
/* splitmix64: the state seeder. A single 64-bit seed is a poor state
|
|
34
|
+
for xoshiro on its own -- an all-but-zero state takes many draws to
|
|
35
|
+
escape -- so the seed is stretched through a generator whose output
|
|
36
|
+
is well mixed from the first call. */
|
|
37
|
+
static inline uint64_t
|
|
38
|
+
ca_splitmix64_next (uint64_t *x)
|
|
39
|
+
{
|
|
40
|
+
uint64_t z = (*x += 0x9E3779B97F4A7C15ULL);
|
|
41
|
+
z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ULL;
|
|
42
|
+
z = (z ^ (z >> 27)) * 0x94D049BB133111EBULL;
|
|
43
|
+
return z ^ (z >> 31);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Fill a state from one seed. */
|
|
47
|
+
static inline void
|
|
48
|
+
ca_xoshiro256pp_seed (int64_t *s, uint64_t seed)
|
|
49
|
+
{
|
|
50
|
+
uint64_t *u = (uint64_t *) s;
|
|
51
|
+
uint64_t x = seed;
|
|
52
|
+
u[0] = ca_splitmix64_next(&x);
|
|
53
|
+
u[1] = ca_splitmix64_next(&x);
|
|
54
|
+
u[2] = ca_splitmix64_next(&x);
|
|
55
|
+
u[3] = ca_splitmix64_next(&x);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static inline uint64_t
|
|
59
|
+
ca_xoshiro256pp_rotl (uint64_t x, int k)
|
|
60
|
+
{
|
|
61
|
+
return (x << k) | (x >> (64 - k));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* One draw: 64 random bits, the state advanced. */
|
|
65
|
+
static inline uint64_t
|
|
66
|
+
ca_xoshiro256pp_next (int64_t *s)
|
|
67
|
+
{
|
|
68
|
+
uint64_t *u = (uint64_t *) s;
|
|
69
|
+
const uint64_t result = ca_xoshiro256pp_rotl(u[0] + u[3], 23) + u[0];
|
|
70
|
+
const uint64_t t = u[1] << 17;
|
|
71
|
+
|
|
72
|
+
u[2] ^= u[0];
|
|
73
|
+
u[3] ^= u[1];
|
|
74
|
+
u[1] ^= u[2];
|
|
75
|
+
u[0] ^= u[3];
|
|
76
|
+
u[2] ^= t;
|
|
77
|
+
u[3] = ca_xoshiro256pp_rotl(u[3], 45);
|
|
78
|
+
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* A double in [0, 1). The top 53 bits are the ones taken: that is the
|
|
83
|
+
whole mantissa, so no two draws collide merely because the generator
|
|
84
|
+
handed back fewer bits than a double can hold. */
|
|
85
|
+
static inline double
|
|
86
|
+
ca_xoshiro256pp_next_real (int64_t *s)
|
|
87
|
+
{
|
|
88
|
+
return (double) (ca_xoshiro256pp_next(s) >> 11) * 0x1.0p-53;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* One standard normal, which is two draws. ca_rng_normal is what turns
|
|
92
|
+
them into one, and it is in a file of its own because it belongs to no
|
|
93
|
+
generator.
|
|
94
|
+
|
|
95
|
+
The two draws are taken into locals rather than written as two
|
|
96
|
+
arguments: C does not say which order a call's arguments are
|
|
97
|
+
evaluated in, and these two are not interchangeable -- they advance a
|
|
98
|
+
state. */
|
|
99
|
+
static inline double
|
|
100
|
+
ca_xoshiro256pp_next_normal (int64_t *s)
|
|
101
|
+
{
|
|
102
|
+
const double u1 = ca_xoshiro256pp_next_real(s);
|
|
103
|
+
const double u2 = ca_xoshiro256pp_next_real(s);
|
|
104
|
+
return ca_rng_normal(u1, u2);
|
|
105
|
+
}
|
data/ext/ca_sort_kernels.h
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Portable textbook sort kernels (PROPOSAL_PORTABLE_TEXTBOOK_SORT).
|
|
6
6
|
|
|
7
|
-
P.1 / P.2 : quicksort + mergesort over the 10 numeric
|
|
7
|
+
P.1 / P.2 : quicksort + mergesort over the 10 numeric data types
|
|
8
8
|
(i8 / u8 / i16 / u16 / i32 / u32 / i64 / u64 / f32 / f64)
|
|
9
9
|
P.3 : NaN pre-partition for f32 / f64
|
|
10
10
|
P.4 : pair (value + index) variants for argsort kernels —
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
flight. */
|
|
34
34
|
#include "carray.h"
|
|
35
35
|
|
|
36
|
-
/* P.1 / P.2: quicksort over 10 numeric
|
|
36
|
+
/* P.1 / P.2: quicksort over 10 numeric data types. */
|
|
37
37
|
void ca_sort_quick_i8 (int8_t *a, ca_size_t n);
|
|
38
38
|
void ca_sort_quick_u8 (uint8_t *a, ca_size_t n);
|
|
39
39
|
void ca_sort_quick_i16 (int16_t *a, ca_size_t n);
|
|
@@ -45,8 +45,8 @@ void ca_sort_quick_u64 (uint64_t *a, ca_size_t n);
|
|
|
45
45
|
void ca_sort_quick_f32 (float32_t *a, ca_size_t n);
|
|
46
46
|
void ca_sort_quick_f64 (double *a, ca_size_t n);
|
|
47
47
|
|
|
48
|
-
/* P.1 / P.2: mergesort over 10 numeric
|
|
49
|
-
scratch buffer of the same length /
|
|
48
|
+
/* P.1 / P.2: mergesort over 10 numeric data types (`aux` is caller-supplied
|
|
49
|
+
scratch buffer of the same length / data type as `a`). */
|
|
50
50
|
void ca_sort_merge_i8 (int8_t *a, int8_t *aux, ca_size_t n);
|
|
51
51
|
void ca_sort_merge_u8 (uint8_t *a, uint8_t *aux, ca_size_t n);
|
|
52
52
|
void ca_sort_merge_i16 (int16_t *a, int16_t *aux, ca_size_t n);
|
|
@@ -58,7 +58,7 @@ void ca_sort_merge_u64 (uint64_t *a, uint64_t *aux, ca_size_t n);
|
|
|
58
58
|
void ca_sort_merge_f32 (float32_t *a, float32_t *aux, ca_size_t n);
|
|
59
59
|
void ca_sort_merge_f64 (double *a, double *aux, ca_size_t n);
|
|
60
60
|
|
|
61
|
-
/* P.3: NaN pre-partition for float
|
|
61
|
+
/* P.3: NaN pre-partition for float data types (Hoare 1-pass, returns finite count). */
|
|
62
62
|
ca_size_t ca_partition_nan_f32 (float32_t *a, ca_size_t n);
|
|
63
63
|
ca_size_t ca_partition_nan_f64 (double *a, ca_size_t n);
|
|
64
64
|
|