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.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -1
  3. data/CHANGELOG.md +845 -3
  4. data/{NEWS.md → CHANGELOG.v1.md} +1 -1
  5. data/README.md +33 -33
  6. data/carray.gemspec +12 -8
  7. data/ext/ca_axis_dispatch.c +33 -4
  8. data/ext/ca_axis_group.c +256 -114
  9. data/ext/ca_binop_dispatch.c +5 -6
  10. data/ext/ca_binop_dispatch.h +0 -7
  11. data/ext/ca_categorical_iterator.c +121 -67
  12. data/ext/ca_for_each_element.h +6 -8
  13. data/ext/ca_group_iter.c +1 -1
  14. data/ext/ca_kernel_iterator.c +386 -74
  15. data/ext/ca_kernel_iterator.h +145 -45
  16. data/ext/ca_obj_array.c +62 -20
  17. data/ext/ca_obj_bincmp.c +57 -27
  18. data/ext/ca_obj_binop.c +86 -30
  19. data/ext/ca_obj_block.c +4 -4
  20. data/ext/ca_obj_const_string.c +88 -27
  21. data/ext/ca_obj_face.c +104 -0
  22. data/ext/ca_obj_face.h +48 -1
  23. data/ext/ca_obj_fake.c +11 -0
  24. data/ext/ca_obj_fixlen_string.c +21 -6
  25. data/ext/ca_obj_grid.c +11 -3
  26. data/ext/ca_obj_meld.c +125 -22
  27. data/ext/ca_obj_moncmp.c +33 -14
  28. data/ext/ca_obj_monop.c +19 -7
  29. data/ext/ca_obj_object.c +107 -4
  30. data/ext/ca_obj_record.c +3 -1
  31. data/ext/ca_obj_refer.c +30 -6
  32. data/ext/ca_obj_roll.c +13 -5
  33. data/ext/ca_obj_select.c +49 -34
  34. data/ext/ca_obj_select_axis.c +16 -6
  35. data/ext/ca_obj_shift.c +3 -3
  36. data/ext/ca_obj_stack.c +3 -8
  37. data/ext/ca_obj_stride.c +178 -24
  38. data/ext/ca_obj_string.c +11 -5
  39. data/ext/ca_obj_tile.c +13 -5
  40. data/ext/ca_obj_time.c +3 -1
  41. data/ext/ca_obj_timedelta.c +3 -1
  42. data/ext/ca_obj_transpose.c +1 -1
  43. data/ext/ca_obj_triop.c +62 -23
  44. data/ext/ca_obj_window.c +94 -19
  45. data/ext/ca_op_cmplx64.h +123 -0
  46. data/ext/ca_op_ipower.c +1 -5
  47. data/ext/ca_rng_normal.h +42 -0
  48. data/ext/ca_rng_xoshiro256pp.h +105 -0
  49. data/ext/ca_sort_kernels.h +5 -5
  50. data/ext/ca_sweep_engine.c +362 -155
  51. data/ext/ca_sweep_engine.h +39 -9
  52. data/ext/ca_transform_common.c +7 -0
  53. data/ext/carray.h +148 -132
  54. data/ext/carray_access.c +83 -49
  55. data/ext/carray_address_basis.c +590 -0
  56. data/ext/carray_bincount.c +8 -8
  57. data/ext/carray_broadcast.c +102 -9
  58. data/ext/carray_build_flags.h +3 -0
  59. data/ext/carray_call_cfunc.c +2010 -335
  60. data/ext/carray_call_cfunc.h +153 -0
  61. data/ext/carray_cast.c +184 -72
  62. data/ext/carray_conversion.c +22 -22
  63. data/ext/carray_copy.c +67 -32
  64. data/ext/carray_core.c +140 -13
  65. data/ext/carray_count.c +10 -11
  66. data/ext/carray_element.c +7 -7
  67. data/ext/carray_factorize.c +72 -51
  68. data/ext/carray_hold.c +1 -1
  69. data/ext/carray_index_classifier.c +7 -21
  70. data/ext/carray_internal.h +36 -3
  71. data/ext/carray_kernels_bincmp.c +1 -0
  72. data/ext/carray_kernels_binop.c +320 -298
  73. data/ext/carray_kernels_init.c +1095 -0
  74. data/ext/carray_kernels_map.c +1 -0
  75. data/ext/carray_kernels_moncmp.c +1 -0
  76. data/ext/carray_kernels_monop.c +412 -411
  77. data/ext/carray_kernels_reduce_aggregate.c +256 -87
  78. data/ext/carray_kernels_reduce_boolean.c +1 -0
  79. data/ext/carray_kernels_reduce_cumulative.c +324 -54
  80. data/ext/carray_kernels_reduce_extreme.c +605 -58
  81. data/ext/carray_kernels_reduce_variance.c +1 -0
  82. data/ext/carray_kernels_scan.c +5 -4
  83. data/ext/carray_kernels_search.c +187 -106
  84. data/ext/carray_kernels_sort.c +1 -0
  85. data/ext/carray_kernels_triop.c +1 -0
  86. data/ext/carray_lazy.c +175 -5
  87. data/ext/carray_loop.c +7 -1
  88. data/ext/carray_mask.c +29 -13
  89. data/ext/carray_median_percentile.c +56 -1
  90. data/ext/carray_memory_view.c +46 -21
  91. data/ext/carray_operator.c +50 -53
  92. data/ext/carray_order.c +1 -1
  93. data/ext/carray_partition.c +4 -4
  94. data/ext/carray_random.c +391 -47
  95. data/ext/carray_scatter.c +1 -1
  96. data/ext/carray_slab.c +13 -0
  97. data/ext/carray_sort.c +22 -24
  98. data/ext/carray_sort_kernel.c +10 -10
  99. data/ext/carray_test.c +1 -1
  100. data/ext/extconf.rb +18 -0
  101. data/ext/mk_call_cfunc.rb +323 -145
  102. data/ext/mkkernel.rb +651 -129
  103. data/ext/ruby_carray.c +28 -17
  104. data/ext/version.h +4 -4
  105. data/lib/carray/autoload_carray.rb +24 -3
  106. data/lib/carray/autoload_method_extension.rb +14 -1
  107. data/lib/carray/axis_group.rb +84 -7
  108. data/lib/carray/basics.rb +63 -59
  109. data/lib/carray/bincount_nd.rb +12 -12
  110. data/lib/carray/block_iterator.rb +111 -25
  111. data/lib/carray/categorical.rb +154 -37
  112. data/lib/carray/categorical_iterator.rb +300 -151
  113. data/lib/carray/conditional.rb +14 -14
  114. data/lib/carray/const_string.rb +131 -27
  115. data/lib/carray/construct.rb +61 -0
  116. data/lib/carray/core_extensions.rb +62 -5
  117. data/lib/carray/data_type_extension.rb +21 -1
  118. data/lib/carray/data_type_limits.rb +91 -0
  119. data/lib/carray/fixlen_string.rb +1 -1
  120. data/lib/carray/frame/concat.rb +3 -3
  121. data/lib/carray/frame/convert.rb +1 -1
  122. data/lib/carray/frame/csv_parser.rb +11 -4
  123. data/lib/carray/frame/frame.rb +85 -21
  124. data/lib/carray/frame/group.rb +36 -3
  125. data/lib/carray/frame/io.rb +224 -15
  126. data/lib/carray/frame/records.rb +18 -4
  127. data/lib/carray/frame/sort.rb +1 -1
  128. data/lib/carray/frame/verbs.rb +32 -12
  129. data/lib/carray/fuse_source.rb +123 -0
  130. data/lib/carray/fusion.rb +218 -0
  131. data/lib/carray/histogram.rb +16 -16
  132. data/lib/carray/inspect.rb +43 -16
  133. data/lib/carray/iterator.rb +147 -3
  134. data/lib/carray/lazy.rb +88 -73
  135. data/lib/carray/mask_gap_fill.rb +3 -1
  136. data/lib/carray/meld_reduce.rb +2 -2
  137. data/lib/carray/methods/align_addr.rb +1 -1
  138. data/lib/carray/methods/composition.rb +1 -1
  139. data/lib/carray/methods/discovery_along.rb +74 -0
  140. data/lib/carray/methods/factorize.rb +50 -0
  141. data/lib/carray/methods/is_in.rb +25 -14
  142. data/lib/carray/methods/locate_addr.rb +81 -3
  143. data/lib/carray/methods/mask_duplicates.rb +36 -2
  144. data/lib/carray/methods/meshgrid.rb +4 -5
  145. data/lib/carray/methods/mode.rb +2 -2
  146. data/lib/carray/methods/nunique.rb +23 -2
  147. data/lib/carray/methods/repeat.rb +110 -0
  148. data/lib/carray/methods/snap.rb +7 -2
  149. data/lib/carray/methods/unique.rb +44 -4
  150. data/lib/carray/methods/value_counts.rb +2 -2
  151. data/lib/carray/rng.rb +86 -0
  152. data/lib/carray/runtime.rb +0 -19
  153. data/lib/carray/slab_iterator.rb +77 -19
  154. data/lib/carray/string_operation_extension.rb +10 -6
  155. data/lib/carray/time.rb +906 -491
  156. data/lib/carray/window_iterator.rb +421 -27
  157. data/lib/carray.rb +7 -5
  158. data/yard-stubs/ca_obj_array.rb +385 -0
  159. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  160. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  161. data/yard-stubs/ca_obj_block.rb +68 -0
  162. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  163. data/yard-stubs/ca_obj_fake.rb +31 -0
  164. data/yard-stubs/ca_obj_farray.rb +32 -0
  165. data/yard-stubs/ca_obj_field.rb +45 -0
  166. data/yard-stubs/ca_obj_grid.rb +35 -0
  167. data/yard-stubs/ca_obj_refer.rb +72 -0
  168. data/yard-stubs/ca_obj_roll.rb +45 -0
  169. data/yard-stubs/ca_obj_shift.rb +43 -0
  170. data/yard-stubs/ca_obj_stride.rb +181 -0
  171. data/yard-stubs/ca_obj_tile.rb +29 -0
  172. data/yard-stubs/ca_obj_transpose.rb +40 -0
  173. data/yard-stubs/ca_obj_window.rb +57 -0
  174. data/yard-stubs/carray_access.rb +131 -0
  175. data/yard-stubs/carray_attribute.rb +246 -0
  176. data/yard-stubs/carray_broadcast.rb +37 -0
  177. data/yard-stubs/carray_cast.rb +489 -0
  178. data/yard-stubs/carray_class.rb +65 -0
  179. data/yard-stubs/carray_conversion.rb +76 -0
  180. data/yard-stubs/carray_copy.rb +79 -0
  181. data/yard-stubs/carray_core.rb +34 -0
  182. data/yard-stubs/carray_count.rb +84 -0
  183. data/yard-stubs/carray_element.rb +108 -0
  184. data/yard-stubs/carray_generate.rb +66 -0
  185. data/yard-stubs/carray_lazy.rb +228 -0
  186. data/yard-stubs/carray_loop.rb +140 -0
  187. data/yard-stubs/carray_mask.rb +259 -0
  188. data/yard-stubs/carray_math.rb +1615 -0
  189. data/yard-stubs/carray_mathfunc.rb +45 -0
  190. data/yard-stubs/carray_median_percentile.rb +103 -0
  191. data/yard-stubs/carray_memory_view.rb +163 -0
  192. data/yard-stubs/carray_order.rb +252 -0
  193. data/yard-stubs/carray_random.rb +89 -0
  194. data/yard-stubs/carray_scatter.rb +106 -0
  195. data/yard-stubs/carray_slab.rb +59 -0
  196. data/yard-stubs/carray_sort.rb +165 -0
  197. data/yard-stubs/carray_test.rb +85 -0
  198. data/yard-stubs/carray_undef.rb +64 -0
  199. data/yard-stubs/carray_utils.rb +97 -0
  200. data/yard-stubs/ruby_carray.rb +193 -0
  201. metadata +67 -10
  202. 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
+ }
@@ -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 dtypes
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 dtypes. */
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 dtypes (`aux` is caller-supplied
49
- scratch buffer of the same length / dtype as `a`). */
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 dtypes (Hoare 1-pass, returns finite count). */
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