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_loop.c CHANGED
@@ -11,6 +11,7 @@
11
11
  ---------------------------------------------------------------------------- */
12
12
 
13
13
  #include "carray.h"
14
+ #include "carray_internal.h" /* ca_attach_window */
14
15
 
15
16
  static VALUE
16
17
  rb_ca_s_each_index_internal (int ndim, VALUE *dim, uint8_t indim, VALUE ridx)
@@ -176,29 +177,89 @@ rb_ca_each_index (VALUE self)
176
177
  return rb_ca_index_walk(self, ca, 0, idx, ridx, 0);
177
178
  }
178
179
 
179
- /* CArray#map! {|elem| ... } -- yield each cell value, store the
180
- block's return back at the same flat address. Mutates self;
181
- attach / sync / detach around the loop for view-safety. */
180
+ /* The map! family yields inside self's attach window and converts
181
+ what the block returns, so each loop runs through ca_attach_window:
182
+ a raise, a break or a throw out of the block still syncs the cells
183
+ already stored and detaches self. */
184
+
185
+ typedef struct {
186
+ VALUE self;
187
+ CArray *ca;
188
+ volatile VALUE ridx;
189
+ int mode;
190
+ } ca_map_ctx_t;
191
+
182
192
  static VALUE
183
- rb_ca_map_bang (VALUE self)
193
+ ca_map_bang_body (VALUE arg)
184
194
  {
195
+ ca_map_ctx_t *c = (ca_map_ctx_t *) arg;
185
196
  volatile VALUE obj;
186
- CArray *ca;
187
- ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
188
197
  ca_size_t i;
189
- RETURN_ENUMERATOR(self, 0, 0);
190
- rb_ca_modify(self);
191
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
192
- ca_attach(ca);
193
- for (i=0; i<elements; i++) {
194
- obj = rb_yield(rb_ca_fetch_addr(self, i));
195
- rb_ca_store_addr(self, i, obj);
198
+ for (i=0; i<c->ca->elements; i++) {
199
+ obj = rb_yield(rb_ca_fetch_addr(c->self, i));
200
+ rb_ca_store_addr(c->self, i, obj);
201
+ }
202
+ return Qnil;
203
+ }
204
+
205
+ static VALUE
206
+ ca_map_with_addr_bang_body (VALUE arg)
207
+ {
208
+ ca_map_ctx_t *c = (ca_map_ctx_t *) arg;
209
+ volatile VALUE obj;
210
+ ca_size_t i;
211
+ for (i=0; i<c->ca->elements; i++) {
212
+ obj = rb_yield_values(2, rb_ca_fetch_addr(c->self, i), SIZE2NUM(i));
213
+ rb_ca_store_addr(c->self, i, obj);
214
+ }
215
+ return Qnil;
216
+ }
217
+
218
+ static VALUE
219
+ ca_map_addr_bang_body (VALUE arg)
220
+ {
221
+ ca_map_ctx_t *c = (ca_map_ctx_t *) arg;
222
+ volatile VALUE obj;
223
+ ca_size_t i;
224
+ for (i=0; i<c->ca->elements; i++) {
225
+ obj = rb_yield(SIZE2NUM(i));
226
+ rb_ca_store_addr(c->self, i, obj);
196
227
  }
197
- ca_sync(ca);
198
- ca_detach(ca);
228
+ return Qnil;
229
+ }
230
+
231
+ static VALUE
232
+ ca_map_index_walk_body (VALUE arg)
233
+ {
234
+ ca_map_ctx_t *c = (ca_map_ctx_t *) arg;
235
+ ca_size_t idx[CA_RANK_MAX];
236
+ rb_ca_index_walk(c->self, c->ca, 0, idx, c->ridx, c->mode);
237
+ return Qnil;
238
+ }
239
+
240
+ /* Runs body over self in a write window. mode is for the index walk. */
241
+ static VALUE
242
+ ca_map_bang_run (VALUE self, VALUE (*body)(VALUE), int mode)
243
+ {
244
+ ca_map_ctx_t c;
245
+ rb_ca_modify(self);
246
+ TypedData_Get_Struct(self, CArray, &carray_data_type, c.ca);
247
+ c.self = self;
248
+ c.ridx = rb_ary_new2(c.ca->ndim);
249
+ c.mode = mode;
250
+ ca_attach_window(1, &c.ca, "w", body, (VALUE) &c);
199
251
  return self;
200
252
  }
201
253
 
254
+ /* CArray#map! {|elem| ... } -- yield each cell value, store the
255
+ block's return back at the same flat address. Mutates self. */
256
+ static VALUE
257
+ rb_ca_map_bang (VALUE self)
258
+ {
259
+ RETURN_ENUMERATOR(self, 0, 0);
260
+ return ca_map_bang_run(self, ca_map_bang_body, 0);
261
+ }
262
+
202
263
  /* CArray#each_with_index {|elem, i, j, ...| ... } -- yield each cell
203
264
  value followed by its multi-dim index components (individual args;
204
265
  see rb_ca_index_walk header). */
@@ -221,18 +282,9 @@ rb_ca_each_with_index (VALUE self)
221
282
  static VALUE
222
283
  rb_ca_map_with_index_bang (VALUE self)
223
284
  {
224
- CArray *ca;
225
- ca_size_t idx[CA_RANK_MAX];
226
- volatile VALUE ridx;
227
285
  RETURN_ENUMERATOR(self, 0, 0);
228
- rb_ca_modify(self);
229
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
230
- ca_attach(ca);
231
- ridx = rb_ary_new2(ca->ndim);
232
- rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_WITH_VALUE | CA_LOOP_STORE);
233
- ca_sync(ca);
234
- ca_detach(ca);
235
- return self;
286
+ return ca_map_bang_run(self, ca_map_index_walk_body,
287
+ CA_LOOP_WITH_VALUE | CA_LOOP_STORE);
236
288
  }
237
289
 
238
290
 
@@ -242,18 +294,8 @@ rb_ca_map_with_index_bang (VALUE self)
242
294
  static VALUE
243
295
  rb_ca_map_index_bang (VALUE self)
244
296
  {
245
- CArray *ca;
246
- ca_size_t idx[CA_RANK_MAX];
247
- volatile VALUE ridx;
248
297
  RETURN_ENUMERATOR(self, 0, 0);
249
- rb_ca_modify(self);
250
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
251
- ca_attach(ca);
252
- ridx = rb_ary_new2(ca->ndim);
253
- rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_STORE);
254
- ca_sync(ca);
255
- ca_detach(ca);
256
- return self;
298
+ return ca_map_bang_run(self, ca_map_index_walk_body, CA_LOOP_STORE);
257
299
  }
258
300
 
259
301
  /* CArray#map_with_addr! {|elem, addr| ... } -- yield (value, flat
@@ -261,21 +303,8 @@ rb_ca_map_index_bang (VALUE self)
261
303
  static VALUE
262
304
  rb_ca_map_with_addr_bang (VALUE self)
263
305
  {
264
- volatile VALUE obj;
265
- CArray *ca;
266
- ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
267
- ca_size_t i;
268
306
  RETURN_ENUMERATOR(self, 0, 0);
269
- rb_ca_modify(self);
270
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
271
- ca_attach(ca);
272
- for (i=0; i<elements; i++) {
273
- obj = rb_yield_values(2, rb_ca_fetch_addr(self, i), SIZE2NUM(i));
274
- rb_ca_store_addr(self, i, obj);
275
- }
276
- ca_sync(ca);
277
- ca_detach(ca);
278
- return self;
307
+ return ca_map_bang_run(self, ca_map_with_addr_bang_body, 0);
279
308
  }
280
309
 
281
310
 
@@ -284,21 +313,8 @@ rb_ca_map_with_addr_bang (VALUE self)
284
313
  static VALUE
285
314
  rb_ca_map_addr_bang (VALUE self)
286
315
  {
287
- volatile VALUE obj;
288
- CArray *ca;
289
- ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
290
- ca_size_t i;
291
316
  RETURN_ENUMERATOR(self, 0, 0);
292
- rb_ca_modify(self);
293
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
294
- ca_attach(ca);
295
- for (i=0; i<elements; i++) {
296
- obj = rb_yield(SIZE2NUM(i));
297
- rb_ca_store_addr(self, i, obj);
298
- }
299
- ca_sync(ca);
300
- ca_detach(ca);
301
- return self;
317
+ return ca_map_bang_run(self, ca_map_addr_bang_body, 0);
302
318
  }
303
319
 
304
320