carray 3.0.3 → 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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +264 -0
  3. data/README.md +3 -2
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +1 -6
  7. data/ext/ca_axis_group.c +27 -27
  8. data/ext/ca_binop_dispatch.c +1 -29
  9. data/ext/ca_binop_dispatch.h +0 -1
  10. data/ext/ca_categorical_iterator.c +205 -134
  11. data/ext/ca_compare.c +7 -18
  12. data/ext/ca_group_iter.c +16 -17
  13. data/ext/ca_kernel_iterator.c +1234 -1994
  14. data/ext/ca_kernel_iterator.h +391 -437
  15. data/ext/ca_monop_dispatch.c +82 -59
  16. data/ext/ca_monop_dispatch.h +1 -0
  17. data/ext/ca_obj_array.c +96 -39
  18. data/ext/ca_obj_bincmp.c +24 -21
  19. data/ext/ca_obj_binop.c +15 -26
  20. data/ext/ca_obj_bitarray.c +3 -2
  21. data/ext/ca_obj_bitfield.c +5 -6
  22. data/ext/ca_obj_block.c +18 -9
  23. data/ext/ca_obj_byte_swap.c +5 -6
  24. data/ext/ca_obj_const_string.c +173 -19
  25. data/ext/ca_obj_face.c +238 -57
  26. data/ext/ca_obj_face.h +19 -0
  27. data/ext/ca_obj_fake.c +15 -29
  28. data/ext/ca_obj_farray.c +6 -3
  29. data/ext/ca_obj_field.c +17 -5
  30. data/ext/ca_obj_fixlen_string.c +2 -3
  31. data/ext/ca_obj_grid.c +406 -132
  32. data/ext/ca_obj_meld.c +172 -34
  33. data/ext/ca_obj_moncmp.c +23 -8
  34. data/ext/ca_obj_monop.c +67 -57
  35. data/ext/ca_obj_object.c +157 -51
  36. data/ext/ca_obj_record.c +12 -7
  37. data/ext/ca_obj_reduce.c +13 -8
  38. data/ext/ca_obj_refer.c +25 -27
  39. data/ext/ca_obj_remap.c +30 -9
  40. data/ext/ca_obj_repeat.c +9 -10
  41. data/ext/ca_obj_roll.c +6 -5
  42. data/ext/ca_obj_select.c +14 -9
  43. data/ext/ca_obj_select_axis.c +15 -47
  44. data/ext/ca_obj_shift.c +11 -1
  45. data/ext/ca_obj_stack.c +179 -34
  46. data/ext/ca_obj_stride.c +162 -115
  47. data/ext/ca_obj_string.c +71 -4
  48. data/ext/ca_obj_tile.c +6 -5
  49. data/ext/ca_obj_time.c +22 -6
  50. data/ext/ca_obj_timedelta.c +22 -6
  51. data/ext/ca_obj_transpose.c +5 -3
  52. data/ext/ca_obj_triop.c +23 -32
  53. data/ext/ca_obj_window.c +190 -26
  54. data/ext/ca_sweep_engine.c +2 -2
  55. data/ext/caframe_csv_reader.c +80 -1
  56. data/ext/carray.h +181 -75
  57. data/ext/carray_access.c +184 -96
  58. data/ext/carray_address_basis.c +343 -87
  59. data/ext/carray_attribute.c +89 -6
  60. data/ext/carray_bincount.c +10 -8
  61. data/ext/carray_broadcast.c +13 -8
  62. data/ext/carray_build_flags.h +3 -0
  63. data/ext/carray_call_cfunc.c +108 -0
  64. data/ext/carray_cast.c +142 -24
  65. data/ext/carray_cast_func.rb +46 -6
  66. data/ext/carray_class.c +4 -3
  67. data/ext/carray_config.h +28 -0
  68. data/ext/carray_conversion.c +16 -7
  69. data/ext/carray_copy.c +51 -14
  70. data/ext/carray_core.c +147 -55
  71. data/ext/carray_count.c +50 -20
  72. data/ext/carray_element.c +76 -33
  73. data/ext/carray_factorize.c +118 -64
  74. data/ext/carray_generate.c +191 -50
  75. data/ext/carray_histogram.c +62 -17
  76. data/ext/carray_hold.c +12 -15
  77. data/ext/carray_index_classifier.c +388 -176
  78. data/ext/carray_internal.h +336 -29
  79. data/ext/carray_kernels_bincmp.c +4453 -0
  80. data/ext/carray_kernels_binop.c +11368 -0
  81. data/ext/carray_kernels_init.c +1734 -0
  82. data/ext/carray_kernels_moncmp.c +2104 -0
  83. data/ext/carray_kernels_monop.c +18369 -0
  84. data/ext/carray_kernels_reduce_aggregate.c +23818 -0
  85. data/ext/carray_kernels_reduce_boolean.c +406 -0
  86. data/ext/carray_kernels_reduce_cumulative.c +10086 -0
  87. data/ext/carray_kernels_reduce_extreme.c +17634 -0
  88. data/ext/carray_kernels_reduce_variance.c +3849 -0
  89. data/ext/carray_kernels_scan.c +4302 -0
  90. data/ext/carray_kernels_search.c +33829 -0
  91. data/ext/carray_kernels_sort.c +10906 -0
  92. data/ext/carray_kernels_triop.c +1864 -0
  93. data/ext/carray_key_windows.c +216 -0
  94. data/ext/carray_lazy.c +170 -111
  95. data/ext/carray_mask.c +292 -72
  96. data/ext/carray_median_percentile.c +82 -28
  97. data/ext/carray_memory_view.c +669 -561
  98. data/ext/carray_operator.c +124 -47
  99. data/ext/carray_order.c +384 -76
  100. data/ext/carray_partition.c +28 -27
  101. data/ext/carray_random.c +67 -13
  102. data/ext/carray_round.c +273 -0
  103. data/ext/carray_scatter.c +63 -38
  104. data/ext/carray_segment.c +3 -3
  105. data/ext/carray_slab.c +91 -28
  106. data/ext/carray_sort.c +35 -35
  107. data/ext/carray_struct.c +19 -18
  108. data/ext/carray_test.c +26 -5
  109. data/ext/carray_undef.c +4 -0
  110. data/ext/carray_utils.c +246 -45
  111. data/ext/mk_call_cfunc.rb +19 -2
  112. data/ext/mkkernel.rb +198 -240
  113. data/ext/ruby_carray.c +10 -4
  114. data/ext/version.h +4 -4
  115. data/lib/carray/attribute.rb +126 -22
  116. data/lib/carray/autoload_carray.rb +8 -31
  117. data/lib/carray/autoload_method_extension.rb +14 -5
  118. data/lib/carray/axis_group.rb +255 -106
  119. data/lib/carray/basics.rb +78 -10
  120. data/lib/carray/bincount_nd.rb +12 -2
  121. data/lib/carray/block_iterator.rb +126 -23
  122. data/lib/carray/boolean_reduce.rb +17 -17
  123. data/lib/carray/categorical.rb +165 -43
  124. data/lib/carray/categorical_iterator.rb +130 -27
  125. data/lib/carray/complex.rb +5 -5
  126. data/lib/carray/conditional.rb +67 -18
  127. data/lib/carray/const_string.rb +14 -5
  128. data/lib/carray/construct.rb +15 -11
  129. data/lib/carray/data_type_extension.rb +1 -0
  130. data/lib/carray/distance_limit.rb +77 -0
  131. data/lib/carray/fixlen_string.rb +7 -1
  132. data/lib/carray/frame/column_verbs.rb +70 -0
  133. data/lib/carray/frame/convert.rb +69 -0
  134. data/lib/carray/frame/csv_parser.rb +111 -17
  135. data/lib/carray/frame/describe.rb +3 -2
  136. data/lib/carray/frame/frame.rb +246 -21
  137. data/lib/carray/frame/group.rb +510 -95
  138. data/lib/carray/frame/io.rb +115 -28
  139. data/lib/carray/frame/join.rb +312 -51
  140. data/lib/carray/frame/records.rb +83 -7
  141. data/lib/carray/frame/reshape.rb +42 -35
  142. data/lib/carray/frame/sort.rb +7 -19
  143. data/lib/carray/frame/verbs.rb +188 -48
  144. data/lib/carray/frame/windows.rb +117 -0
  145. data/lib/carray/frame.rb +2 -0
  146. data/lib/carray/fuse_source.rb +11 -4
  147. data/lib/carray/fusion.rb +40 -16
  148. data/lib/carray/histogram.rb +6 -1
  149. data/lib/carray/inspect.rb +31 -8
  150. data/lib/carray/iterator.rb +85 -7
  151. data/lib/carray/key_windows.rb +620 -0
  152. data/lib/carray/lazy.rb +182 -183
  153. data/lib/carray/mask_gap_fill.rb +63 -57
  154. data/lib/carray/meld_reduce.rb +12 -14
  155. data/lib/carray/methods/bin.rb +26 -18
  156. data/lib/carray/methods/bincount.rb +16 -0
  157. data/lib/carray/methods/bit_string.rb +1 -1
  158. data/lib/carray/methods/choose.rb +16 -3
  159. data/lib/carray/methods/composition.rb +3 -1
  160. data/lib/carray/methods/gather_nd.rb +14 -5
  161. data/lib/carray/methods/insert_block.rb +2 -2
  162. data/lib/carray/methods/is_between.rb +59 -0
  163. data/lib/carray/methods/is_in.rb +53 -36
  164. data/lib/carray/methods/join.rb +1 -6
  165. data/lib/carray/methods/lag.rb +49 -0
  166. data/lib/carray/methods/locate_addr.rb +47 -51
  167. data/lib/carray/methods/mode.rb +1 -1
  168. data/lib/carray/methods/nunique.rb +11 -6
  169. data/lib/carray/methods/resize.rb +3 -3
  170. data/lib/carray/methods/value_counts.rb +4 -11
  171. data/lib/carray/record_order.rb +3 -3
  172. data/lib/carray/rng.rb +3 -0
  173. data/lib/carray/runtime.rb +53 -8
  174. data/lib/carray/segment_iterator.rb +313 -82
  175. data/lib/carray/serialize.rb +24 -10
  176. data/lib/carray/slab_iterator.rb +50 -0
  177. data/lib/carray/string.rb +105 -5
  178. data/lib/carray/string_operation_extension.rb +8 -1
  179. data/lib/carray/struct.rb +9 -21
  180. data/lib/carray/struct_builder.rb +19 -8
  181. data/lib/carray/time.rb +726 -104
  182. data/lib/carray/window_iterator.rb +122 -16
  183. data/lib/carray.rb +7 -0
  184. data/yard-stubs/ca_obj_bitfield.rb +1 -1
  185. data/yard-stubs/ca_obj_field.rb +4 -0
  186. data/yard-stubs/ca_obj_grid.rb +21 -10
  187. data/yard-stubs/ca_obj_refer.rb +2 -1
  188. data/yard-stubs/ca_obj_roll.rb +2 -2
  189. data/yard-stubs/ca_obj_shift.rb +5 -1
  190. data/yard-stubs/ca_obj_tile.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +8 -3
  192. data/yard-stubs/carray_access.rb +6 -1
  193. data/yard-stubs/carray_attribute.rb +0 -5
  194. data/yard-stubs/carray_cast.rb +10 -0
  195. data/yard-stubs/carray_conversion.rb +2 -1
  196. data/yard-stubs/carray_copy.rb +4 -2
  197. data/yard-stubs/carray_count.rb +4 -4
  198. data/yard-stubs/carray_element.rb +10 -4
  199. data/yard-stubs/carray_generate.rb +21 -1
  200. data/yard-stubs/carray_mask.rb +26 -2
  201. data/yard-stubs/carray_math.rb +27 -1
  202. data/yard-stubs/carray_median_percentile.rb +5 -2
  203. data/yard-stubs/carray_memory_view.rb +40 -23
  204. data/yard-stubs/carray_order.rb +29 -18
  205. data/yard-stubs/carray_random.rb +13 -4
  206. data/yard-stubs/carray_scatter.rb +14 -9
  207. data/yard-stubs/carray_slab.rb +9 -2
  208. data/yard-stubs/carray_sort.rb +6 -5
  209. data/yard-stubs/carray_test.rb +5 -3
  210. metadata +25 -3
  211. data/lib/carray/arrow_tensor.rb +0 -401
  212. data/lib/carray/table.rb +0 -108
data/ext/carray_struct.c CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  C-native member access for CAStruct subclasses. The hooked
4
4
  methods (`[]`, `[]=`, `initialize`) are installed on a subclass by
5
- `CArray.__install_castruct_methods__(klass)` — called from the
5
+ `CArray.install_struct_methods(klass)` — called from the
6
6
  bottom of lib/carray/struct.rb once CAStruct is defined, so this
7
7
  ext can load before that file.
8
8
 
@@ -22,6 +22,7 @@
22
22
  ---------------------------------------------------------------------------- */
23
23
 
24
24
  #include "carray.h"
25
+ #include "carray_internal.h" /* ca_obj2integer_fitting */
25
26
  #include <string.h>
26
27
 
27
28
  /* ---------------------------------------------------------------------
@@ -130,42 +131,42 @@ ca_struct_write_primitive_fast (char *p, int type_code, VALUE val)
130
131
  return;
131
132
  }
132
133
  case CA_INT8: {
133
- int8_t v = (int8_t) NUM2INT(val);
134
+ int8_t v = (int8_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT8));
134
135
  memcpy(p, &v, 1);
135
136
  return;
136
137
  }
137
138
  case CA_UINT8: {
138
- uint8_t v = (uint8_t) NUM2UINT(val);
139
+ uint8_t v = (uint8_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT8));
139
140
  memcpy(p, &v, 1);
140
141
  return;
141
142
  }
142
143
  case CA_INT16: {
143
- int16_t v = (int16_t) NUM2INT(val);
144
+ int16_t v = (int16_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT16));
144
145
  memcpy(p, &v, 2);
145
146
  return;
146
147
  }
147
148
  case CA_UINT16: {
148
- uint16_t v = (uint16_t) NUM2UINT(val);
149
+ uint16_t v = (uint16_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT16));
149
150
  memcpy(p, &v, 2);
150
151
  return;
151
152
  }
152
153
  case CA_INT32: {
153
- int32_t v = (int32_t) NUM2LONG(val);
154
+ int32_t v = (int32_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT32));
154
155
  memcpy(p, &v, 4);
155
156
  return;
156
157
  }
157
158
  case CA_UINT32: {
158
- uint32_t v = (uint32_t) NUM2ULONG(val);
159
+ uint32_t v = (uint32_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT32));
159
160
  memcpy(p, &v, 4);
160
161
  return;
161
162
  }
162
163
  case CA_INT64: {
163
- int64_t v = (int64_t) NUM2LL(val);
164
+ int64_t v = (int64_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT64));
164
165
  memcpy(p, &v, 8);
165
166
  return;
166
167
  }
167
168
  case CA_UINT64: {
168
- uint64_t v = (uint64_t) NUM2ULL(val);
169
+ uint64_t v = (uint64_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT64));
169
170
  memcpy(p, &v, 8);
170
171
  return;
171
172
  }
@@ -333,32 +334,32 @@ ca_struct_write_endian_swapped_fast (char *p, int type_code, VALUE val)
333
334
  {
334
335
  switch (type_code) {
335
336
  case CA_INT16: {
336
- uint16_t v = (uint16_t) NUM2INT(val);
337
+ uint16_t v = (uint16_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT16));
337
338
  v = CA_BSWAP16(v); memcpy(p, &v, 2);
338
339
  return;
339
340
  }
340
341
  case CA_UINT16: {
341
- uint16_t v = (uint16_t) NUM2UINT(val);
342
+ uint16_t v = (uint16_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT16));
342
343
  v = CA_BSWAP16(v); memcpy(p, &v, 2);
343
344
  return;
344
345
  }
345
346
  case CA_INT32: {
346
- uint32_t v = (uint32_t) NUM2LONG(val);
347
+ uint32_t v = (uint32_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT32));
347
348
  v = CA_BSWAP32(v); memcpy(p, &v, 4);
348
349
  return;
349
350
  }
350
351
  case CA_UINT32: {
351
- uint32_t v = (uint32_t) NUM2ULONG(val);
352
+ uint32_t v = (uint32_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT32));
352
353
  v = CA_BSWAP32(v); memcpy(p, &v, 4);
353
354
  return;
354
355
  }
355
356
  case CA_INT64: {
356
- uint64_t v = (uint64_t) NUM2LL(val);
357
+ uint64_t v = (uint64_t) NUM2LL(ca_obj2integer_fitting(val, CA_INT64));
357
358
  v = CA_BSWAP64(v); memcpy(p, &v, 8);
358
359
  return;
359
360
  }
360
361
  case CA_UINT64: {
361
- uint64_t v = NUM2ULL(val);
362
+ uint64_t v = (uint64_t) rb_num2ull(ca_obj2integer_fitting(val, CA_UINT64));
362
363
  v = CA_BSWAP64(v); memcpy(p, &v, 8);
363
364
  return;
364
365
  }
@@ -767,7 +768,7 @@ void
767
768
  Init_carray_struct (void)
768
769
  {
769
770
  /* Singleton on rb_cCArray so lib/carray/struct.rb can call it as
770
- `CArray.__install_castruct_methods__(klass)`. */
771
- rb_define_singleton_method(rb_cCArray, "__install_castruct_methods__",
772
- rb_carray_install_castruct_methods, 1);
771
+ `CArray.install_struct_methods(klass)`. */
772
+ rb_define_private_method(rb_singleton_class(rb_cCArray), "install_struct_methods",
773
+ rb_carray_install_castruct_methods, 1);
773
774
  }
data/ext/carray_test.c CHANGED
@@ -82,7 +82,8 @@ ca_check_same_data_type (void *ap1, void *ap2)
82
82
  {
83
83
  CArray *ca1 = (CArray *) ap1;
84
84
  CArray *ca2 = (CArray *) ap2;
85
- if ( ca1->data_type != ca2->data_type ) {
85
+ if ( ca1->data_type != ca2->data_type ||
86
+ ( ca1->data_type == CA_FIXLEN && ca1->bytes != ca2->bytes ) ) {
86
87
  rb_raise(rb_eCADataTypeError, "data_type mismatch");
87
88
  }
88
89
  }
@@ -200,8 +201,9 @@ rb_ca_is_type (VALUE arg, int type)
200
201
  live in ca_obj_record.c; signatures stay in carray.h for cross-file
201
202
  extern use. */
202
203
 
203
- /* CArray#valid_index?(*idx) — 1 if the index tuple is in range, else 0.
204
- * The number of indices must equal ndim (raises otherwise). */
204
+ /* CArray#valid_index?(*idx) -- whether self[*idx] names a cell: a negative
205
+ * index counts from the end of its axis, as it does at every door. The
206
+ * number of indices must equal ndim (raises otherwise). */
205
207
  static VALUE
206
208
  rb_ca_is_valid_index (int argc, VALUE *argv, VALUE self)
207
209
  {
@@ -217,6 +219,9 @@ rb_ca_is_valid_index (int argc, VALUE *argv, VALUE self)
217
219
  }
218
220
  for (i=0; i<ca->ndim; i++) {
219
221
  idx = NUM2SIZE(argv[i]);
222
+ if ( idx < 0 ) {
223
+ idx += ca->dim[i];
224
+ }
220
225
  if ( idx < 0 || idx >= ca->dim[i] ) {
221
226
  return Qfalse;
222
227
  }
@@ -225,7 +230,8 @@ rb_ca_is_valid_index (int argc, VALUE *argv, VALUE self)
225
230
  return Qtrue;
226
231
  }
227
232
 
228
- /* CArray#valid_addr?(addr) — 1 if addr is in range 0...elements, else 0. */
233
+ /* CArray#valid_addr?(addr) -- whether addr names a cell: a negative address
234
+ * counts from the end. */
229
235
  static VALUE
230
236
  rb_ca_is_valid_addr (VALUE self, VALUE raddr)
231
237
  {
@@ -234,6 +240,9 @@ rb_ca_is_valid_addr (VALUE self, VALUE raddr)
234
240
 
235
241
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
236
242
  addr = NUM2SIZE(raddr);
243
+ if ( addr < 0 ) {
244
+ addr += ca->elements;
245
+ }
237
246
  if ( addr < 0 || addr >= ca->elements ) {
238
247
  return Qfalse;
239
248
  }
@@ -249,6 +258,7 @@ rb_ca_has_same_shape (VALUE self, VALUE other)
249
258
  {
250
259
  CArray *ca, *cb;
251
260
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
261
+ /* coerce: only the shape is compared */
252
262
  cb = ca_wrap_readonly(other, ca->data_type);
253
263
  return ca_has_same_shape(ca, cb) ? Qtrue : Qfalse;
254
264
  }
@@ -684,10 +694,21 @@ rb_ca_modify (VALUE self)
684
694
  rb_check_frozen(self);
685
695
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
686
696
  if ( ca_is_readonly(ca) ) {
687
- rb_raise(rb_eRuntimeError, "can not modify read-only array");
697
+ ca_refuse_read_only();
688
698
  }
689
699
  }
690
700
 
701
+ /* The refusal of a write into a read-only array that is not frozen (a
702
+ frozen one is Ruby's FrozenError, from rb_check_frozen): every guard
703
+ raises it, the entry points through rb_ca_modify and the transfers and
704
+ fills below them, which are the last line when an entry is missed. */
705
+ void
706
+ ca_refuse_read_only (void)
707
+ {
708
+ rb_raise(rb_eRuntimeError, "%s: can not modify read-only array",
709
+ ca_calling_method_name());
710
+ }
711
+
691
712
  /* CArray#freeze — freeze self and set CA_FLAG_READ_ONLY so subsequent
692
713
  * mutations raise FrozenError. */
693
714
  VALUE
data/ext/carray_undef.c CHANGED
@@ -18,6 +18,7 @@
18
18
  ---------------------------------------------------------------------------- */
19
19
 
20
20
  #include "ruby.h"
21
+ #include "ruby/ractor.h"
21
22
 
22
23
  static VALUE rb_cUNDEF;
23
24
 
@@ -63,6 +64,9 @@ Init_carray_undef (void)
63
64
  can be created. The identity invariant relies on this. */
64
65
  CA_UNDEF = rb_funcall(rb_cUNDEF, rb_intern("new"), 0);
65
66
  rb_undef_method(CLASS_OF(rb_cUNDEF), "new");
67
+ /* Frozen and shareable: masked reads hand the same object to every
68
+ Ractor. */
69
+ rb_ractor_make_shareable(CA_UNDEF);
66
70
  rb_const_set(rb_cObject, rb_intern("UNDEF"), CA_UNDEF);
67
71
 
68
72
  /* CAREFUL: CA_UNDEF is dereferenced via raw pointer compare