carray 3.0.1 → 3.0.3

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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +824 -0
  3. data/README.md +5 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +258 -4
  6. data/ext/ca_axis_group.c +368 -184
  7. data/ext/ca_binop_dispatch.c +54 -32
  8. data/ext/ca_binop_dispatch.h +1 -0
  9. data/ext/ca_categorical_iterator.c +90 -41
  10. data/ext/ca_compare.c +8 -2
  11. data/ext/ca_for_buffer.h +21 -68
  12. data/ext/ca_group_iter.c +27 -11
  13. data/ext/ca_kernel_iterator.c +960 -245
  14. data/ext/ca_kernel_iterator.h +352 -181
  15. data/ext/ca_monop_dispatch.c +4 -4
  16. data/ext/ca_monop_dispatch.h +4 -0
  17. data/ext/ca_obj_array.c +194 -42
  18. data/ext/ca_obj_bincmp.c +152 -121
  19. data/ext/ca_obj_binop.c +107 -210
  20. data/ext/ca_obj_bitarray.c +37 -24
  21. data/ext/ca_obj_bitfield.c +95 -62
  22. data/ext/ca_obj_block.c +5 -4
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +180 -50
  25. data/ext/ca_obj_face.c +428 -62
  26. data/ext/ca_obj_face.h +107 -47
  27. data/ext/ca_obj_fake.c +21 -50
  28. data/ext/ca_obj_farray.c +1 -0
  29. data/ext/ca_obj_field.c +16 -3
  30. data/ext/ca_obj_fixlen_string.c +39 -26
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +235 -55
  33. data/ext/ca_obj_moncmp.c +61 -61
  34. data/ext/ca_obj_monop.c +125 -107
  35. data/ext/ca_obj_object.c +551 -233
  36. data/ext/ca_obj_record.c +51 -16
  37. data/ext/ca_obj_reduce.c +5 -8
  38. data/ext/ca_obj_refer.c +117 -33
  39. data/ext/ca_obj_remap.c +57 -17
  40. data/ext/ca_obj_repeat.c +21 -5
  41. data/ext/ca_obj_roll.c +115 -11
  42. data/ext/ca_obj_select.c +88 -75
  43. data/ext/ca_obj_select_axis.c +58 -60
  44. data/ext/ca_obj_shift.c +22 -102
  45. data/ext/ca_obj_stack.c +223 -123
  46. data/ext/ca_obj_stride.c +267 -35
  47. data/ext/ca_obj_string.c +25 -22
  48. data/ext/ca_obj_tile.c +32 -16
  49. data/ext/ca_obj_time.c +23 -25
  50. data/ext/ca_obj_timedelta.c +21 -23
  51. data/ext/ca_obj_transpose.c +12 -3
  52. data/ext/ca_obj_triop.c +110 -117
  53. data/ext/ca_obj_window.c +157 -29
  54. data/ext/ca_op_ipower.c +25 -13
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_rng_normal.h +42 -0
  58. data/ext/ca_rng_xoshiro256pp.h +105 -0
  59. data/ext/ca_sort_kernels.h +70 -0
  60. data/ext/ca_sweep_engine.c +385 -198
  61. data/ext/ca_sweep_engine.h +31 -23
  62. data/ext/ca_triop_dispatch.c +4 -1
  63. data/ext/ca_triop_dispatch.h +5 -2
  64. data/ext/caframe_csv_reader.c +463 -0
  65. data/ext/carray.h +90 -28
  66. data/ext/carray_access.c +487 -231
  67. data/ext/carray_address_basis.c +731 -0
  68. data/ext/carray_attribute.c +45 -3
  69. data/ext/carray_bincount.c +32 -2
  70. data/ext/carray_broadcast.c +49 -17
  71. data/ext/carray_call_cfunc.c +667 -511
  72. data/ext/carray_cast.c +1556 -247
  73. data/ext/carray_cast_func.rb +34 -21
  74. data/ext/carray_conversion.c +197 -73
  75. data/ext/carray_copy.c +84 -38
  76. data/ext/carray_core.c +591 -119
  77. data/ext/carray_count.c +148 -96
  78. data/ext/carray_element.c +18 -27
  79. data/ext/carray_factorize.c +604 -291
  80. data/ext/carray_generate.c +76 -40
  81. data/ext/carray_histogram.c +152 -94
  82. data/ext/carray_hold.c +2 -1
  83. data/ext/carray_index_classifier.c +63 -96
  84. data/ext/carray_internal.h +400 -1
  85. data/ext/carray_lazy.c +834 -79
  86. data/ext/carray_loop.c +88 -66
  87. data/ext/carray_mask.c +705 -324
  88. data/ext/carray_math_kernel.h +1 -0
  89. data/ext/carray_median_percentile.c +263 -63
  90. data/ext/carray_memory_view.c +254 -248
  91. data/ext/carray_operator.c +1093 -363
  92. data/ext/carray_order.c +133 -69
  93. data/ext/carray_partition.c +102 -56
  94. data/ext/carray_random.c +582 -204
  95. data/ext/carray_scatter.c +308 -65
  96. data/ext/carray_segment.c +257 -0
  97. data/ext/carray_slab.c +183 -70
  98. data/ext/carray_sort.c +235 -240
  99. data/ext/carray_sort_kernel.c +8 -1
  100. data/ext/carray_struct.c +99 -21
  101. data/ext/carray_test.c +167 -64
  102. data/ext/carray_time_text.c +1182 -0
  103. data/ext/carray_utils.c +363 -98
  104. data/ext/extconf.rb +27 -2
  105. data/ext/mk_call_cfunc.rb +103 -118
  106. data/ext/mk_pow5_table.rb +35 -0
  107. data/ext/mkkernel.rb +1349 -851
  108. data/ext/ruby_carray.c +17 -2
  109. data/ext/version.h +4 -4
  110. data/ext/version.rb +4 -2
  111. data/lib/carray/attribute.rb +39 -0
  112. data/lib/carray/autoload_carray.rb +24 -3
  113. data/lib/carray/autoload_method_extension.rb +18 -0
  114. data/lib/carray/axis_group.rb +245 -20
  115. data/lib/carray/basics.rb +95 -25
  116. data/lib/carray/bincount_nd.rb +6 -0
  117. data/lib/carray/block_iterator.rb +200 -54
  118. data/lib/carray/boolean_reduce.rb +21 -29
  119. data/lib/carray/categorical.rb +244 -59
  120. data/lib/carray/categorical_iterator.rb +391 -757
  121. data/lib/carray/complex.rb +36 -29
  122. data/lib/carray/conditional.rb +94 -7
  123. data/lib/carray/const_string.rb +177 -27
  124. data/lib/carray/construct.rb +40 -0
  125. data/lib/carray/data_type_extension.rb +3 -0
  126. data/lib/carray/data_type_limits.rb +91 -0
  127. data/lib/carray/fixlen_string.rb +1 -1
  128. data/lib/carray/frame/concat.rb +157 -6
  129. data/lib/carray/frame/convert.rb +13 -7
  130. data/lib/carray/frame/csv_parser.rb +590 -76
  131. data/lib/carray/frame/describe.rb +79 -0
  132. data/lib/carray/frame/frame.rb +205 -35
  133. data/lib/carray/frame/group.rb +199 -40
  134. data/lib/carray/frame/io.rb +452 -60
  135. data/lib/carray/frame/join.rb +134 -46
  136. data/lib/carray/frame/records.rb +54 -19
  137. data/lib/carray/frame/reshape.rb +448 -0
  138. data/lib/carray/frame/sort.rb +26 -2
  139. data/lib/carray/frame/verbs.rb +726 -56
  140. data/lib/carray/frame.rb +2 -0
  141. data/lib/carray/fuse_source.rb +111 -2
  142. data/lib/carray/fusion.rb +229 -38
  143. data/lib/carray/inspect.rb +71 -20
  144. data/lib/carray/iterator.rb +157 -2
  145. data/lib/carray/lazy.rb +54 -67
  146. data/lib/carray/mask_gap_fill.rb +66 -50
  147. data/lib/carray/math.rb +32 -19
  148. data/lib/carray/meld_reduce.rb +40 -7
  149. data/lib/carray/methods/align_addr.rb +8 -4
  150. data/lib/carray/methods/bincount.rb +2 -2
  151. data/lib/carray/methods/bit_string.rb +14 -3
  152. data/lib/carray/methods/composition.rb +16 -10
  153. data/lib/carray/methods/discovery_along.rb +74 -0
  154. data/lib/carray/methods/factorize.rb +50 -0
  155. data/lib/carray/methods/gather_nd.rb +13 -2
  156. data/lib/carray/methods/insert_block.rb +9 -14
  157. data/lib/carray/methods/is_in.rb +130 -6
  158. data/lib/carray/methods/join.rb +1 -1
  159. data/lib/carray/methods/locate_addr.rb +235 -21
  160. data/lib/carray/methods/mask_duplicates.rb +35 -1
  161. data/lib/carray/methods/mode.rb +18 -1
  162. data/lib/carray/methods/nunique.rb +22 -1
  163. data/lib/carray/methods/repeat.rb +91 -0
  164. data/lib/carray/methods/resize.rb +21 -23
  165. data/lib/carray/methods/snap.rb +34 -12
  166. data/lib/carray/methods/unique.rb +52 -3
  167. data/lib/carray/record_order.rb +208 -0
  168. data/lib/carray/rng.rb +86 -0
  169. data/lib/carray/runtime.rb +14 -11
  170. data/lib/carray/segment_iterator.rb +990 -0
  171. data/lib/carray/serialize.rb +197 -27
  172. data/lib/carray/slab_iterator.rb +109 -40
  173. data/lib/carray/stack.rb +10 -4
  174. data/lib/carray/string_operation_extension.rb +9 -4
  175. data/lib/carray/struct.rb +142 -51
  176. data/lib/carray/struct_builder.rb +110 -14
  177. data/lib/carray/table.rb +2 -2
  178. data/lib/carray/time.rb +535 -105
  179. data/lib/carray/window_iterator.rb +259 -82
  180. data/lib/carray.rb +4 -2
  181. data/yard-stubs/ca_obj_array.rb +4 -4
  182. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  183. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  184. data/yard-stubs/ca_obj_block.rb +2 -7
  185. data/yard-stubs/ca_obj_fake.rb +1 -1
  186. data/yard-stubs/ca_obj_field.rb +1 -1
  187. data/yard-stubs/ca_obj_refer.rb +3 -3
  188. data/yard-stubs/ca_obj_roll.rb +0 -1
  189. data/yard-stubs/ca_obj_stride.rb +10 -7
  190. data/yard-stubs/ca_obj_transpose.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +11 -4
  192. data/yard-stubs/carray_access.rb +6 -5
  193. data/yard-stubs/carray_broadcast.rb +2 -2
  194. data/yard-stubs/carray_cast.rb +78 -43
  195. data/yard-stubs/carray_conversion.rb +13 -1
  196. data/yard-stubs/carray_copy.rb +8 -3
  197. data/yard-stubs/carray_core.rb +3 -83
  198. data/yard-stubs/carray_count.rb +16 -2
  199. data/yard-stubs/carray_lazy.rb +210 -1
  200. data/yard-stubs/carray_loop.rb +4 -1
  201. data/yard-stubs/carray_mask.rb +34 -10
  202. data/yard-stubs/carray_math.rb +1499 -4
  203. data/yard-stubs/carray_median_percentile.rb +26 -8
  204. data/yard-stubs/carray_order.rb +43 -82
  205. data/yard-stubs/carray_scatter.rb +10 -3
  206. data/yard-stubs/carray_segment.rb +72 -0
  207. data/yard-stubs/carray_slab.rb +11 -8
  208. data/yard-stubs/carray_sort.rb +50 -8
  209. data/yard-stubs/carray_test.rb +10 -0
  210. data/yard-stubs/carray_utils.rb +0 -26
  211. metadata +19 -19
  212. data/ext/ca_for_each_element.h +0 -239
  213. data/ext/carray_build_flags.h +0 -3
  214. data/ext/carray_config.h +0 -28
  215. data/ext/carray_kernels_bincmp.c +0 -4446
  216. data/ext/carray_kernels_binop.c +0 -11001
  217. data/ext/carray_kernels_init.c +0 -1131
  218. data/ext/carray_kernels_map.c +0 -3467
  219. data/ext/carray_kernels_moncmp.c +0 -2097
  220. data/ext/carray_kernels_monop.c +0 -18313
  221. data/ext/carray_kernels_reduce_aggregate.c +0 -25837
  222. data/ext/carray_kernels_reduce_boolean.c +0 -330
  223. data/ext/carray_kernels_reduce_cumulative.c +0 -14593
  224. data/ext/carray_kernels_reduce_extreme.c +0 -16948
  225. data/ext/carray_kernels_reduce_variance.c +0 -3910
  226. data/ext/carray_kernels_scan.c +0 -3693
  227. data/ext/carray_kernels_search.c +0 -32138
  228. data/ext/carray_kernels_sort.c +0 -10626
  229. data/ext/carray_kernels_triop.c +0 -1392
data/ext/carray_copy.c CHANGED
@@ -11,6 +11,7 @@
11
11
  #include "carray.h"
12
12
  #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
13
13
  #include "carray_internal.h" /* ca_gc_hold_push / ca_gc_hold_pop_to */
14
+ #include "ca_sweep_engine.h" /* ca_sweep_same_shape / ca_sweep_refuse_shapes */
14
15
  #include <stdarg.h>
15
16
 
16
17
  /* ------------------------------------------------------------------- */
@@ -19,15 +20,48 @@
19
20
  * and bytes as `ca`, copies the element payload, and reproduces the
20
21
  * mask state. Always copies even when `ca` is an entity; for view
21
22
  * sources the data path goes through `ca_copy_data`, otherwise a flat
22
- * memcpy of `ca_length(ca)` bytes.
23
+ * memcpy of `ca_length(ca)` bytes. If reading the source raises, the
24
+ * copy is freed before the raise propagates.
23
25
  *
24
26
  * Backs `CArray#copy` and is also reachable as a C-level utility from
25
27
  * other ext files that need an owned snapshot. */
28
+ void
29
+ ca_fill_or_free (CArray *co, VALUE (*fill)(VALUE), VALUE arg)
30
+ {
31
+ int tag = 0;
32
+ rb_protect(fill, arg, &tag);
33
+ if ( tag ) {
34
+ ca_free(co);
35
+ rb_jump_tag(tag);
36
+ }
37
+ }
38
+
39
+ static VALUE
40
+ ca_copy_fill (VALUE arg)
41
+ {
42
+ CArray **pair = (CArray **) arg;
43
+ CArray *ca = pair[0], *co = pair[1];
44
+
45
+ if ( ca_is_attached(ca) ) {
46
+ memcpy(co->ptr, ca->ptr, ca_length(ca));
47
+ }
48
+ else {
49
+ ca_copy_data(ca, co->ptr);
50
+ }
51
+
52
+ ca_update_mask(ca);
53
+ if ( ca->mask ) {
54
+ ca_copy_mask(co, ca);
55
+ }
56
+ return Qnil;
57
+ }
58
+
26
59
  CArray *
27
60
  ca_copy (void *ap)
28
61
  {
29
62
  CArray *ca = (CArray *) ap;
30
63
  CArray *co;
64
+ CArray *pair[2];
31
65
 
32
66
  if ( ca_is_scalar(ca) ) {
33
67
  co = (CArray *) cscalar_new(ca->data_type, ca->bytes, 0);
@@ -36,16 +70,26 @@ ca_copy (void *ap)
36
70
  co = carray_new(ca->data_type, ca->ndim, ca->dim, ca->bytes, 0);
37
71
  }
38
72
 
39
- if ( ca_is_attached(ca) ) {
40
- memcpy(co->ptr, ca->ptr, ca_length(ca));
73
+ pair[0] = ca;
74
+ pair[1] = co;
75
+
76
+ /* Object cells read from a view that computes them exist only in
77
+ co->ptr, and copying the mask afterwards can build it -- a lazy
78
+ expression's mask is computed from its operands -- which allocates.
79
+ Hold them until the copy is complete. carray_new has filled the
80
+ cells with valid VALUEs. */
81
+ if ( ca_is_object_type(co) ) {
82
+ int tag = 0;
83
+ int guard = ca_gc_hold_push(co->ptr, co->elements);
84
+ rb_protect(ca_copy_fill, (VALUE) pair, &tag);
85
+ ca_gc_hold_pop_to(guard);
86
+ if ( tag ) {
87
+ ca_free(co);
88
+ rb_jump_tag(tag);
89
+ }
41
90
  }
42
91
  else {
43
- ca_copy_data(ca, co->ptr);
44
- }
45
-
46
- ca_update_mask(ca);
47
- if ( ca->mask ) {
48
- ca_copy_mask(co, ca);
92
+ ca_fill_or_free(co, ca_copy_fill, (VALUE) pair);
49
93
  }
50
94
 
51
95
  return co;
@@ -53,7 +97,7 @@ ca_copy (void *ap)
53
97
 
54
98
  /* Ruby entry for `CArray#copy`. Wraps `ca_copy` and, when `self` is a
55
99
  * Face (e.g. CARecord), lifts the wrapped result so the derived class
56
- * identity is preserved on the copy. */
100
+ * identity is preserved on the copy. The copy keeps self's attributes. */
57
101
  VALUE
58
102
  rb_ca_copy (VALUE self)
59
103
  {
@@ -71,6 +115,7 @@ rb_ca_copy (VALUE self)
71
115
  obj = ca_wrap_struct(co);
72
116
  ca_gc_hold_pop_to(guard);
73
117
  CA_FACE_LIFT_IF_FACE(obj, self, ca);
118
+ rb_ca_inherit_attr(obj, self);
74
119
  return obj;
75
120
  }
76
121
 
@@ -128,7 +173,7 @@ rb_ca_to_ca (int argc, VALUE *argv, VALUE self)
128
173
  CArray *ca;
129
174
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
130
175
  if ( ca_is_readonly(ca) ) {
131
- rb_raise(rb_eRuntimeError, "can't modify read-only carray");
176
+ rb_raise(rb_eRuntimeError, "can not modify read-only array");
132
177
  }
133
178
  }
134
179
  return self;
@@ -194,9 +239,8 @@ ca_template_safe2 (void *ap, int8_t data_type, ca_size_t bytes)
194
239
  * The arity dispatch matches `CArray.new` (ca_obj_array.c) so the two
195
240
  * factories behave the same for block-driven initialisation. */
196
241
  static VALUE
197
- rb_ca_template_method (int argc, VALUE *argv, VALUE self)
242
+ rb_ca_template_kw (int argc, VALUE *argv, VALUE ropt, VALUE self)
198
243
  {
199
- volatile VALUE ropt = rb_pop_options(&argc, &argv);
200
244
  volatile VALUE obj, rtype, rbytes = Qnil;
201
245
  CArray *ca, *co;
202
246
  int8_t data_type;
@@ -230,10 +274,7 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
230
274
  if ( co->ndim > 0 ) {
231
275
  ca_size_t idx[CA_RANK_MAX];
232
276
  volatile VALUE ridx = rb_ary_new2(co->ndim);
233
- ca_attach(co);
234
277
  rb_ca_index_walk(obj, co, 0, idx, ridx, CA_LOOP_STORE);
235
- ca_sync(co);
236
- ca_detach(co);
237
278
  }
238
279
  else {
239
280
  volatile VALUE rval = rb_yield_values2(0, NULL);
@@ -257,6 +298,13 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
257
298
  return obj;
258
299
  }
259
300
 
301
+ static VALUE
302
+ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
303
+ {
304
+ volatile VALUE ropt = rb_pop_options(&argc, &argv);
305
+ return rb_ca_template_kw(argc, argv, ropt, self);
306
+ }
307
+
260
308
  VALUE
261
309
  rb_ca_template (VALUE self)
262
310
  {
@@ -266,22 +314,21 @@ rb_ca_template (VALUE self)
266
314
  VALUE
267
315
  rb_ca_template_with_type (VALUE self, VALUE rtype, VALUE rbytes)
268
316
  {
269
- VALUE ropt = rb_hash_new();
270
- VALUE args[2] = { rtype, ropt };
317
+ volatile VALUE ropt = rb_hash_new();
271
318
  rb_set_options(ropt, "bytes", rbytes);
272
- return rb_ca_template_method(2, args, self);
319
+ return rb_ca_template_kw(1, &rtype, ropt, self);
273
320
  }
274
321
 
275
- /* Picks the largest-shape CArray among `n` variadic CArray arguments
276
- * and returns `template(largest)`. Used by `carray_call_cfunc.c` to
277
- * size the output of vectorised scalar C-function calls, where the
278
- * inputs may be a mix of scalars and arrays. */
322
+ /* Returns `template` of the first non-scalar among `n` variadic CArray
323
+ * arguments (of the first argument when all are scalars). Used by
324
+ * `carray_call_cfunc.c` to size the output of vectorised scalar
325
+ * C-function calls: a scalar pairs with any array, two arrays only when
326
+ * their shapes agree. */
279
327
  VALUE
280
328
  rb_ca_template_n (int n, ...)
281
329
  {
282
- volatile VALUE varg, obj;
283
- CArray *ca;
284
- ca_size_t elements = -1;
330
+ volatile VALUE varg, obj = Qnil;
331
+ CArray *ca, *donor = NULL;
285
332
  va_list vargs;
286
333
  int i;
287
334
 
@@ -289,24 +336,23 @@ rb_ca_template_n (int n, ...)
289
336
  for (i=0; i<n; i++) {
290
337
  varg = va_arg(vargs, VALUE);
291
338
  if ( ! rb_obj_is_carray(varg) ) {
339
+ va_end(vargs);
292
340
  rb_raise(rb_eRuntimeError, "[BUG] not-carray object given to rb_ca_template_n");
293
341
  }
294
342
  TypedData_Get_Struct(varg, CArray, &carray_data_type, ca);
295
343
  if ( i == 0 ) {
296
344
  obj = varg;
297
- elements = ca->elements;
298
345
  }
299
- else {
300
- if ( rb_obj_is_cscalar(varg) ) {
301
- continue;
302
- }
303
- if ( rb_obj_is_cscalar(obj) ) {
304
- obj = varg;
305
- elements = ca->elements;
306
- }
307
- else if ( ca->elements != elements ) {
308
- rb_raise(rb_eRuntimeError, "size mismatch");
309
- }
346
+ if ( ca_is_scalar(ca) ) {
347
+ continue;
348
+ }
349
+ if ( ! donor ) {
350
+ donor = ca;
351
+ obj = varg;
352
+ }
353
+ else if ( ! ca_sweep_same_shape(donor, ca) ) {
354
+ va_end(vargs);
355
+ ca_sweep_refuse_shapes(donor, ca);
310
356
  }
311
357
  }
312
358
  va_end(vargs);