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.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
data/ext/ca_op_ipower.c CHANGED
@@ -168,6 +168,19 @@ ca_ipower_cmplx128_t (ca_size_t n, boolean8_t *m,
168
168
  while (n--) { (*p2) = op_powi_cmplx128_t(*p1, ipow); p1++; p2++; }
169
169
  }
170
170
 
171
+ /* The data types the ipower kernels cover; checked before any window
172
+ opens, so the switches inside cannot fall through to a raise. */
173
+ static int
174
+ ca_ipower_type_ok (CArray *ca)
175
+ {
176
+ switch ( ca->data_type ) {
177
+ case CA_FLOAT32: case CA_FLOAT64: case CA_CMPLX64: case CA_CMPLX128:
178
+ return 1;
179
+ default:
180
+ return 0;
181
+ }
182
+ }
183
+
171
184
  /* Eager Float/Complex ** Integer producing a fresh entity output.
172
185
  * ca is input-only, co is the write target. Mirrors rb_ca_call_monop
173
186
  * (see carray_math* / carray_kernels.c) so operand attach is elided:
@@ -189,6 +202,10 @@ rb_ca_ipower (VALUE self, VALUE other)
189
202
 
190
203
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
191
204
 
205
+ if ( ! ca_ipower_type_ok(ca) ) {
206
+ rb_raise(rb_eCADataTypeError, "invalid data type for ipower");
207
+ }
208
+
192
209
  co = ca_has_mask(ca) ? ca_template_safe(ca) : ca_template(ca);
193
210
  obj = ca_wrap_struct(co);
194
211
 
@@ -196,7 +213,7 @@ rb_ca_ipower (VALUE self, VALUE other)
196
213
  m = ( co->mask ) ? (boolean8_t *)co->mask->ptr : NULL;
197
214
 
198
215
  if ( ca_attach_is_alias(ca) ) {
199
- ca_attach(ca);
216
+ ca_attach(ca); /* window: nothing raises inside */
200
217
  switch ( ca->data_type ) {
201
218
  case CA_FLOAT32:
202
219
  ca_ipower_float32_t(ca->elements, m, ca->ptr, ipow, co->ptr); break;
@@ -206,8 +223,6 @@ rb_ca_ipower (VALUE self, VALUE other)
206
223
  ca_ipower_cmplx64_t(ca->elements, m, ca->ptr, ipow, co->ptr); break;
207
224
  case CA_CMPLX128:
208
225
  ca_ipower_cmplx128_t(ca->elements, m, ca->ptr, ipow, co->ptr); break;
209
- default:
210
- rb_raise(rb_eCADataTypeError, "invalid data type for ipower");
211
226
  }
212
227
  ca_detach(ca);
213
228
  }
@@ -226,9 +241,6 @@ rb_ca_ipower (VALUE self, VALUE other)
226
241
  ca_ipower_cmplx64_t(ca->elements, m, p1, ipow, co->ptr); break;
227
242
  case CA_CMPLX128:
228
243
  ca_ipower_cmplx128_t(ca->elements, m, p1, ipow, co->ptr); break;
229
- default:
230
- ALLOCV_END(h1);
231
- rb_raise(rb_eCADataTypeError, "invalid data type for ipower");
232
244
  }
233
245
  ALLOCV_END(h1);
234
246
  }
@@ -247,7 +259,11 @@ rb_ca_ipower_bang (VALUE self, VALUE other)
247
259
 
248
260
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
249
261
 
250
- ca_attach(ca);
262
+ if ( ! ca_ipower_type_ok(ca) ) {
263
+ rb_raise(rb_eRuntimeError, "invalid data type for ipower");
264
+ }
265
+
266
+ ca_attach(ca); /* window: nothing raises inside until ca_sync_detach */
251
267
 
252
268
  m = ( ca->mask ) ? (boolean8_t *)ca->mask->ptr : NULL;
253
269
 
@@ -260,12 +276,9 @@ rb_ca_ipower_bang (VALUE self, VALUE other)
260
276
  ca_ipower_cmplx64_t(ca->elements, m, ca->ptr, ipow, ca->ptr); break;
261
277
  case CA_CMPLX128:
262
278
  ca_ipower_cmplx128_t(ca->elements, m, ca->ptr, ipow, ca->ptr); break;
263
- default:
264
- rb_raise(rb_eRuntimeError, "invalid data type for ipower");
265
279
  }
266
280
 
267
- ca_sync(ca);
268
- ca_detach(ca);
281
+ ca_sync_detach(ca);
269
282
 
270
283
  return self;
271
284
  }
data/ext/ca_op_powi.h CHANGED
@@ -23,9 +23,19 @@
23
23
  #include "carray.h"
24
24
  #include <stdint.h>
25
25
 
26
- #define op_powi(type) \
26
+ /* The text between the two markers below is also handed, as it stands, to
27
+ an evaluator that compiles a kernel body calling op_powi_<type>
28
+ (CArray.__kernel_helpers__, written into the build by mkkernel.rb). It
29
+ may use only <stdint.h>, float32_t / float64_t and ca_zerodiv: what such
30
+ an evaluator's C declares. The complex instantiations stay outside. */
31
+
32
+ /* BEGIN kernel helpers */
33
+
34
+ /* x raised to a non-negative power, by binary exponentiation. The power
35
+ is unsigned so that the magnitude of INT64_MIN is representable. */
36
+ #define op_powi_magnitude(type) \
27
37
  static inline type \
28
- op_powi_## type (type x, int64_t p) \
38
+ op_powi_mag_## type (type x, uint64_t p) \
29
39
  { \
30
40
  type r=1; \
31
41
  \
@@ -35,53 +45,70 @@ op_powi_## type (type x, int64_t p) \
35
45
  case 0: return 1; \
36
46
  case 1: return x; \
37
47
  } \
38
- if (p<0) { \
39
- type den = op_powi_## type(x, -p); \
40
- if (den==0) ca_zerodiv(); \
41
- return 1/den; \
42
- }\
43
48
  while (p) { \
44
- if ( (p%2) == 1 ) r *= x; \
49
+ if ( p & 1 ) r *= x; \
45
50
  x *= x; \
46
- p /= 2; \
51
+ p >>= 1; \
47
52
  } \
48
53
  return r; \
49
54
  }
50
55
 
51
- #define op_powi_fc(type) \
56
+ /* An integer to a negative power is 1/x^|p| in integer division, which is
57
+ decided by x alone: 0 has no reciprocal, 1 and -1 keep their magnitude,
58
+ anything larger truncates to 0. Answering it that way, rather than by
59
+ computing x^|p|, keeps a power that overflows -- 2 ** -64 -- from wrapping
60
+ to a zero divisor. */
61
+ #define op_powi(type) \
62
+ op_powi_magnitude(type) \
52
63
  static inline type \
53
64
  op_powi_## type (type x, int64_t p) \
54
65
  { \
55
- type r=1; \
56
- \
57
- switch(p) { \
58
- case 2: return x*x; \
59
- case 3: return x*x*x; \
60
- case 0: return 1; \
61
- case 1: return x; \
66
+ if ( p < 0 ) { \
67
+ if ( x == 0 ) ca_zerodiv(); \
68
+ if ( x == 1 ) return 1; \
69
+ if ( x == (type) -1 ) return ( p % 2 ) ? x : 1; \
70
+ return 0; \
62
71
  } \
63
- if (p<0) { \
64
- type den = op_powi_## type(x, -p); \
65
- return 1/den; \
66
- }\
67
- while (p) { \
68
- if ( (p%2) == 1 ) r *= x; \
69
- x *= x; \
70
- p /= 2; \
72
+ return op_powi_mag_## type(x, (uint64_t) p); \
73
+ }
74
+
75
+ /* An unsigned x is never -1; (type) -1 is its largest value. */
76
+ #define op_powi_u(type) \
77
+ op_powi_magnitude(type) \
78
+ static inline type \
79
+ op_powi_## type (type x, int64_t p) \
80
+ { \
81
+ if ( p < 0 ) { \
82
+ if ( x == 0 ) ca_zerodiv(); \
83
+ return ( x == 1 ) ? 1 : 0; \
71
84
  } \
72
- return r; \
85
+ return op_powi_mag_## type(x, (uint64_t) p); \
86
+ }
87
+
88
+ #define op_powi_fc(type) \
89
+ op_powi_magnitude(type) \
90
+ static inline type \
91
+ op_powi_## type (type x, int64_t p) \
92
+ { \
93
+ if ( p < 0 ) { \
94
+ return 1 / op_powi_mag_## type(x, (uint64_t) 0 - (uint64_t) p); \
95
+ } \
96
+ return op_powi_mag_## type(x, (uint64_t) p); \
73
97
  }
74
98
 
75
99
  op_powi(int8_t)
76
- op_powi(uint8_t)
100
+ op_powi_u(uint8_t)
77
101
  op_powi(int16_t)
78
- op_powi(uint16_t)
102
+ op_powi_u(uint16_t)
79
103
  op_powi(int32_t)
80
- op_powi(uint32_t)
104
+ op_powi_u(uint32_t)
81
105
  op_powi(int64_t)
82
- op_powi(uint64_t)
106
+ op_powi_u(uint64_t)
83
107
  op_powi_fc(float32_t)
84
108
  op_powi_fc(float64_t)
109
+
110
+ /* END kernel helpers */
111
+
85
112
  op_powi_fc(cmplx64_t)
86
113
  op_powi_fc(cmplx128_t)
87
114