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/carray_copy.c CHANGED
@@ -36,6 +36,42 @@ ca_fill_or_free (CArray *co, VALUE (*fill)(VALUE), VALUE arg)
36
36
  }
37
37
  }
38
38
 
39
+ void
40
+ ca_fill_or_xfree (void *buf, VALUE (*fill)(VALUE), VALUE arg)
41
+ {
42
+ int tag = 0;
43
+ rb_protect(fill, arg, &tag);
44
+ if ( tag ) {
45
+ xfree(buf);
46
+ rb_jump_tag(tag);
47
+ }
48
+ }
49
+
50
+ void
51
+ ca_fill_or_detach (int n, CArray **list, VALUE (*fill)(VALUE), VALUE arg)
52
+ {
53
+ int tag = 0;
54
+ int k;
55
+ rb_protect(fill, arg, &tag);
56
+ if ( tag ) {
57
+ for ( k = 0; k < n; k++ ) {
58
+ ca_detach(list[k]);
59
+ }
60
+ rb_jump_tag(tag);
61
+ }
62
+ }
63
+
64
+ VALUE
65
+ ca_view_inherit_mask (VALUE view)
66
+ {
67
+ CArray *ca = (CArray *) view;
68
+ CArray *parent = ((CAView *) ca)->parent;
69
+ if ( parent && ca_has_mask(parent) ) {
70
+ ca_create_mask(ca);
71
+ }
72
+ return Qnil;
73
+ }
74
+
39
75
  static VALUE
40
76
  ca_copy_fill (VALUE arg)
41
77
  {
@@ -72,14 +108,32 @@ ca_copy (void *ap)
72
108
 
73
109
  pair[0] = ca;
74
110
  pair[1] = co;
75
- ca_fill_or_free(co, ca_copy_fill, (VALUE) pair);
111
+
112
+ /* Object cells read from a view that computes them exist only in
113
+ co->ptr, and copying the mask afterwards can build it -- a lazy
114
+ expression's mask is computed from its operands -- which allocates.
115
+ Hold them until the copy is complete. carray_new has filled the
116
+ cells with valid VALUEs. */
117
+ if ( ca_is_object_type(co) ) {
118
+ int tag = 0;
119
+ int guard = ca_gc_hold_push(co->ptr, co->elements);
120
+ rb_protect(ca_copy_fill, (VALUE) pair, &tag);
121
+ ca_gc_hold_pop_to(guard);
122
+ if ( tag ) {
123
+ ca_free(co);
124
+ rb_jump_tag(tag);
125
+ }
126
+ }
127
+ else {
128
+ ca_fill_or_free(co, ca_copy_fill, (VALUE) pair);
129
+ }
76
130
 
77
131
  return co;
78
132
  }
79
133
 
80
134
  /* Ruby entry for `CArray#copy`. Wraps `ca_copy` and, when `self` is a
81
135
  * Face (e.g. CARecord), lifts the wrapped result so the derived class
82
- * identity is preserved on the copy. */
136
+ * identity is preserved on the copy. The copy keeps self's attributes. */
83
137
  VALUE
84
138
  rb_ca_copy (VALUE self)
85
139
  {
@@ -97,6 +151,7 @@ rb_ca_copy (VALUE self)
97
151
  obj = ca_wrap_struct(co);
98
152
  ca_gc_hold_pop_to(guard);
99
153
  CA_FACE_LIFT_IF_FACE(obj, self, ca);
154
+ rb_ca_inherit_attr(obj, self);
100
155
  return obj;
101
156
  }
102
157
 
@@ -154,7 +209,7 @@ rb_ca_to_ca (int argc, VALUE *argv, VALUE self)
154
209
  CArray *ca;
155
210
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
156
211
  if ( ca_is_readonly(ca) ) {
157
- rb_raise(rb_eRuntimeError, "can't modify read-only carray");
212
+ ca_refuse_read_only();
158
213
  }
159
214
  }
160
215
  return self;
@@ -201,7 +256,7 @@ CArray *
201
256
  ca_template_safe2 (void *ap, int8_t data_type, ca_size_t bytes)
202
257
  {
203
258
  CArray *ca = (CArray *) ap;
204
- CA_CHECK_DATA_TYPE(data_type);
259
+ CA_CHECK_DATA_TYPE_GIVEN(data_type);
205
260
  if ( ca_is_scalar(ca) ) {
206
261
  return (CArray*) cscalar_new(data_type, bytes, NULL);
207
262
  }
@@ -220,9 +275,8 @@ ca_template_safe2 (void *ap, int8_t data_type, ca_size_t bytes)
220
275
  * The arity dispatch matches `CArray.new` (ca_obj_array.c) so the two
221
276
  * factories behave the same for block-driven initialisation. */
222
277
  static VALUE
223
- rb_ca_template_method (int argc, VALUE *argv, VALUE self)
278
+ rb_ca_template_kw (int argc, VALUE *argv, VALUE ropt, VALUE self)
224
279
  {
225
- volatile VALUE ropt = rb_pop_options(&argc, &argv);
226
280
  volatile VALUE obj, rtype, rbytes = Qnil;
227
281
  CArray *ca, *co;
228
282
  int8_t data_type;
@@ -243,6 +297,19 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
243
297
  obj = ca_wrap_struct(co);
244
298
  }
245
299
 
300
+ /* Preserve the Face identity only for a same-type template (no explicit
301
+ * retype). A retype (template(:boolean)) is a different-typed buffer and
302
+ * must not be re-wrapped as the Face. A same-type template of a Face with
303
+ * a valid blank form (CARecord carries its data_class through the struct
304
+ * tail; identity Faces alias same-type storage) is lifted so the class is
305
+ * preserved. A Face with no valid blank form (CAConstString's content-
306
+ * defined offset+buffer) overrides `template` in Ruby to return a plain
307
+ * array instead of a broken same-class shell. The lift comes before the
308
+ * block initialiser so its values are stored through the Face. */
309
+ if ( NIL_P(rtype) ) {
310
+ CA_FACE_LIFT_IF_FACE(obj, self, ca);
311
+ }
312
+
246
313
  if ( rb_block_given_p() ) {
247
314
  if ( rb_proc_arity(rb_block_proc()) == 0 ) {
248
315
  volatile VALUE rval = rb_yield_values2(0, NULL);
@@ -256,10 +323,7 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
256
323
  if ( co->ndim > 0 ) {
257
324
  ca_size_t idx[CA_RANK_MAX];
258
325
  volatile VALUE ridx = rb_ary_new2(co->ndim);
259
- ca_attach(co);
260
326
  rb_ca_index_walk(obj, co, 0, idx, ridx, CA_LOOP_STORE);
261
- ca_sync(co);
262
- ca_detach(co);
263
327
  }
264
328
  else {
265
329
  volatile VALUE rval = rb_yield_values2(0, NULL);
@@ -268,21 +332,16 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
268
332
  }
269
333
  }
270
334
 
271
- /* Preserve the Face identity only for a same-type template (no explicit
272
- * retype). A retype (template(:boolean)) is a different-typed buffer and
273
- * must not be re-wrapped as the Face. A same-type template of a Face with
274
- * a valid blank form (CARecord carries its data_class through the struct
275
- * tail; identity Faces alias same-type storage) is lifted so the class is
276
- * preserved. A Face with no valid blank form (CAConstString's content-
277
- * defined offset+buffer) overrides `template` in Ruby to return a plain
278
- * array instead of a broken same-class shell. */
279
- if ( NIL_P(rtype) ) {
280
- CA_FACE_LIFT_IF_FACE(obj, self, ca);
281
- }
282
-
283
335
  return obj;
284
336
  }
285
337
 
338
+ static VALUE
339
+ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
340
+ {
341
+ volatile VALUE ropt = rb_pop_options(&argc, &argv);
342
+ return rb_ca_template_kw(argc, argv, ropt, self);
343
+ }
344
+
286
345
  VALUE
287
346
  rb_ca_template (VALUE self)
288
347
  {
@@ -292,10 +351,9 @@ rb_ca_template (VALUE self)
292
351
  VALUE
293
352
  rb_ca_template_with_type (VALUE self, VALUE rtype, VALUE rbytes)
294
353
  {
295
- VALUE ropt = rb_hash_new();
296
- VALUE args[2] = { rtype, ropt };
354
+ volatile VALUE ropt = rb_hash_new();
297
355
  rb_set_options(ropt, "bytes", rbytes);
298
- return rb_ca_template_method(2, args, self);
356
+ return rb_ca_template_kw(1, &rtype, ropt, self);
299
357
  }
300
358
 
301
359
  /* Returns `template` of the first non-scalar among `n` variadic CArray