carray 3.0.3 → 3.0.5

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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +469 -0
  3. data/README.md +3 -2
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_array_pool.c +25 -1
  6. data/ext/ca_axis_descriptor.h +27 -24
  7. data/ext/ca_axis_dispatch.c +14 -26
  8. data/ext/ca_axis_group.c +27 -27
  9. data/ext/ca_binop_dispatch.c +1 -29
  10. data/ext/ca_binop_dispatch.h +0 -1
  11. data/ext/ca_categorical_iterator.c +231 -153
  12. data/ext/ca_compare.c +9 -20
  13. data/ext/ca_composite_dispatch.c +9 -9
  14. data/ext/ca_group_iter.c +16 -17
  15. data/ext/ca_kernel_iterator.c +1240 -2000
  16. data/ext/ca_kernel_iterator.h +502 -519
  17. data/ext/ca_monop_dispatch.c +82 -59
  18. data/ext/ca_monop_dispatch.h +1 -0
  19. data/ext/ca_obj_array.c +152 -45
  20. data/ext/ca_obj_bincmp.c +25 -21
  21. data/ext/ca_obj_binop.c +16 -26
  22. data/ext/ca_obj_bitarray.c +8 -3
  23. data/ext/ca_obj_bitfield.c +63 -49
  24. data/ext/ca_obj_block.c +18 -9
  25. data/ext/ca_obj_byte_swap.c +7 -7
  26. data/ext/ca_obj_const_string.c +188 -22
  27. data/ext/ca_obj_face.c +280 -58
  28. data/ext/ca_obj_face.h +19 -0
  29. data/ext/ca_obj_fake.c +15 -29
  30. data/ext/ca_obj_farray.c +6 -3
  31. data/ext/ca_obj_field.c +30 -8
  32. data/ext/ca_obj_fixlen_string.c +2 -3
  33. data/ext/ca_obj_grid.c +455 -134
  34. data/ext/ca_obj_meld.c +172 -34
  35. data/ext/ca_obj_moncmp.c +23 -8
  36. data/ext/ca_obj_monop.c +113 -67
  37. data/ext/ca_obj_object.c +210 -52
  38. data/ext/ca_obj_record.c +15 -7
  39. data/ext/ca_obj_reduce.c +17 -8
  40. data/ext/ca_obj_refer.c +42 -35
  41. data/ext/ca_obj_remap.c +30 -9
  42. data/ext/ca_obj_repeat.c +9 -10
  43. data/ext/ca_obj_roll.c +31 -10
  44. data/ext/ca_obj_select.c +48 -14
  45. data/ext/ca_obj_select_axis.c +15 -47
  46. data/ext/ca_obj_shift.c +41 -7
  47. data/ext/ca_obj_stack.c +180 -34
  48. data/ext/ca_obj_stride.c +190 -134
  49. data/ext/ca_obj_string.c +80 -4
  50. data/ext/ca_obj_tile.c +32 -11
  51. data/ext/ca_obj_time.c +22 -6
  52. data/ext/ca_obj_timedelta.c +22 -6
  53. data/ext/ca_obj_transpose.c +13 -7
  54. data/ext/ca_obj_triop.c +26 -32
  55. data/ext/ca_obj_window.c +267 -74
  56. data/ext/ca_op_ipower.c +4 -4
  57. data/ext/ca_sort_kernels.h +6 -3
  58. data/ext/ca_sweep_engine.c +2 -2
  59. data/ext/caframe_csv_reader.c +80 -1
  60. data/ext/carray.h +214 -75
  61. data/ext/carray_access.c +200 -99
  62. data/ext/carray_address_basis.c +343 -87
  63. data/ext/carray_attribute.c +113 -6
  64. data/ext/carray_bincount.c +10 -8
  65. data/ext/carray_broadcast.c +13 -8
  66. data/ext/carray_build_flags.h +3 -0
  67. data/ext/carray_call_cfunc.c +108 -0
  68. data/ext/carray_cast.c +375 -96
  69. data/ext/carray_cast_func.rb +90 -20
  70. data/ext/carray_class.c +4 -3
  71. data/ext/carray_config.h +28 -0
  72. data/ext/carray_conversion.c +18 -9
  73. data/ext/carray_copy.c +51 -14
  74. data/ext/carray_core.c +150 -55
  75. data/ext/carray_count.c +56 -20
  76. data/ext/carray_element.c +81 -33
  77. data/ext/carray_factorize.c +138 -84
  78. data/ext/carray_generate.c +199 -52
  79. data/ext/carray_histogram.c +63 -18
  80. data/ext/carray_hold.c +12 -15
  81. data/ext/carray_index_classifier.c +388 -176
  82. data/ext/carray_internal.h +348 -29
  83. data/ext/carray_kernels_bincmp.c +4453 -0
  84. data/ext/carray_kernels_binop.c +11368 -0
  85. data/ext/carray_kernels_init.c +1734 -0
  86. data/ext/carray_kernels_moncmp.c +2104 -0
  87. data/ext/carray_kernels_monop.c +18369 -0
  88. data/ext/carray_kernels_reduce_aggregate.c +23818 -0
  89. data/ext/carray_kernels_reduce_boolean.c +406 -0
  90. data/ext/carray_kernels_reduce_cumulative.c +10086 -0
  91. data/ext/carray_kernels_reduce_extreme.c +17634 -0
  92. data/ext/carray_kernels_reduce_variance.c +3849 -0
  93. data/ext/carray_kernels_scan.c +4302 -0
  94. data/ext/carray_kernels_search.c +33829 -0
  95. data/ext/carray_kernels_sort.c +10897 -0
  96. data/ext/carray_kernels_triop.c +1864 -0
  97. data/ext/carray_key_windows.c +220 -0
  98. data/ext/carray_lazy.c +170 -111
  99. data/ext/carray_mask.c +337 -94
  100. data/ext/carray_median_percentile.c +82 -28
  101. data/ext/carray_memory_view.c +669 -561
  102. data/ext/carray_operator.c +129 -52
  103. data/ext/carray_order.c +604 -77
  104. data/ext/carray_partition.c +28 -27
  105. data/ext/carray_random.c +85 -31
  106. data/ext/carray_round.c +273 -0
  107. data/ext/carray_scatter.c +87 -45
  108. data/ext/carray_segment.c +3 -3
  109. data/ext/carray_slab.c +123 -37
  110. data/ext/carray_sort.c +259 -51
  111. data/ext/carray_sort_kernel.c +5 -7
  112. data/ext/carray_struct.c +54 -61
  113. data/ext/carray_test.c +26 -5
  114. data/ext/carray_time_text.c +4 -2
  115. data/ext/carray_undef.c +4 -0
  116. data/ext/carray_utils.c +309 -66
  117. data/ext/mk_call_cfunc.rb +19 -2
  118. data/ext/mkkernel.rb +403 -350
  119. data/ext/ruby_carray.c +10 -4
  120. data/ext/version.h +4 -4
  121. data/lib/carray/attribute.rb +139 -22
  122. data/lib/carray/autoload_carray.rb +8 -31
  123. data/lib/carray/autoload_method_extension.rb +14 -5
  124. data/lib/carray/axis_group.rb +255 -106
  125. data/lib/carray/basics.rb +105 -17
  126. data/lib/carray/bincount_nd.rb +12 -2
  127. data/lib/carray/block_iterator.rb +126 -23
  128. data/lib/carray/boolean_reduce.rb +17 -17
  129. data/lib/carray/categorical.rb +195 -59
  130. data/lib/carray/categorical_iterator.rb +132 -29
  131. data/lib/carray/complex.rb +5 -5
  132. data/lib/carray/conditional.rb +67 -18
  133. data/lib/carray/const_string.rb +24 -5
  134. data/lib/carray/construct.rb +15 -11
  135. data/lib/carray/data_type_extension.rb +9 -1
  136. data/lib/carray/distance_limit.rb +77 -0
  137. data/lib/carray/fixlen_string.rb +48 -3
  138. data/lib/carray/frame/column_verbs.rb +71 -0
  139. data/lib/carray/frame/concat.rb +17 -3
  140. data/lib/carray/frame/convert.rb +69 -0
  141. data/lib/carray/frame/csv_parser.rb +111 -17
  142. data/lib/carray/frame/describe.rb +3 -2
  143. data/lib/carray/frame/frame.rb +252 -28
  144. data/lib/carray/frame/group.rb +603 -101
  145. data/lib/carray/frame/io.rb +117 -28
  146. data/lib/carray/frame/join.rb +312 -51
  147. data/lib/carray/frame/records.rb +83 -7
  148. data/lib/carray/frame/reshape.rb +42 -35
  149. data/lib/carray/frame/sort.rb +7 -19
  150. data/lib/carray/frame/verbs.rb +188 -48
  151. data/lib/carray/frame/windows.rb +117 -0
  152. data/lib/carray/frame.rb +2 -0
  153. data/lib/carray/fuse_source.rb +42 -6
  154. data/lib/carray/fusion.rb +40 -16
  155. data/lib/carray/histogram.rb +6 -1
  156. data/lib/carray/inspect.rb +31 -8
  157. data/lib/carray/iterator.rb +85 -7
  158. data/lib/carray/key_windows.rb +620 -0
  159. data/lib/carray/lazy.rb +217 -183
  160. data/lib/carray/mask_gap_fill.rb +63 -57
  161. data/lib/carray/meld_reduce.rb +12 -14
  162. data/lib/carray/methods/bin.rb +26 -18
  163. data/lib/carray/methods/bincount.rb +16 -0
  164. data/lib/carray/methods/bit_string.rb +1 -1
  165. data/lib/carray/methods/choose.rb +16 -3
  166. data/lib/carray/methods/composition.rb +3 -1
  167. data/lib/carray/methods/gather_nd.rb +14 -5
  168. data/lib/carray/methods/insert_block.rb +2 -2
  169. data/lib/carray/methods/is_between.rb +59 -0
  170. data/lib/carray/methods/is_in.rb +61 -37
  171. data/lib/carray/methods/join.rb +1 -6
  172. data/lib/carray/methods/lag.rb +49 -0
  173. data/lib/carray/methods/locate_addr.rb +47 -51
  174. data/lib/carray/methods/mode.rb +1 -1
  175. data/lib/carray/methods/nunique.rb +11 -6
  176. data/lib/carray/methods/resize.rb +3 -3
  177. data/lib/carray/methods/value_counts.rb +4 -11
  178. data/lib/carray/record_order.rb +3 -3
  179. data/lib/carray/rng.rb +3 -0
  180. data/lib/carray/runtime.rb +53 -8
  181. data/lib/carray/segment_iterator.rb +323 -88
  182. data/lib/carray/serialize.rb +45 -14
  183. data/lib/carray/slab_iterator.rb +50 -0
  184. data/lib/carray/stack.rb +15 -12
  185. data/lib/carray/string.rb +113 -5
  186. data/lib/carray/string_operation_extension.rb +21 -6
  187. data/lib/carray/struct.rb +9 -21
  188. data/lib/carray/struct_builder.rb +24 -11
  189. data/lib/carray/time.rb +819 -158
  190. data/lib/carray/window_iterator.rb +122 -16
  191. data/lib/carray.rb +7 -0
  192. data/yard-stubs/ca_obj_bitfield.rb +1 -1
  193. data/yard-stubs/ca_obj_field.rb +4 -0
  194. data/yard-stubs/ca_obj_grid.rb +21 -10
  195. data/yard-stubs/ca_obj_refer.rb +2 -1
  196. data/yard-stubs/ca_obj_roll.rb +2 -2
  197. data/yard-stubs/ca_obj_shift.rb +5 -1
  198. data/yard-stubs/ca_obj_tile.rb +1 -1
  199. data/yard-stubs/ca_obj_transpose.rb +5 -4
  200. data/yard-stubs/ca_obj_window.rb +8 -3
  201. data/yard-stubs/carray_access.rb +6 -1
  202. data/yard-stubs/carray_attribute.rb +3 -6
  203. data/yard-stubs/carray_cast.rb +12 -0
  204. data/yard-stubs/carray_conversion.rb +7 -2
  205. data/yard-stubs/carray_copy.rb +4 -2
  206. data/yard-stubs/carray_count.rb +4 -4
  207. data/yard-stubs/carray_element.rb +17 -10
  208. data/yard-stubs/carray_generate.rb +21 -1
  209. data/yard-stubs/carray_mask.rb +32 -3
  210. data/yard-stubs/carray_math.rb +41 -5
  211. data/yard-stubs/carray_median_percentile.rb +5 -2
  212. data/yard-stubs/carray_memory_view.rb +40 -23
  213. data/yard-stubs/carray_order.rb +129 -22
  214. data/yard-stubs/carray_random.rb +13 -4
  215. data/yard-stubs/carray_scatter.rb +17 -10
  216. data/yard-stubs/carray_slab.rb +9 -2
  217. data/yard-stubs/carray_sort.rb +6 -5
  218. data/yard-stubs/carray_test.rb +5 -3
  219. metadata +25 -3
  220. data/lib/carray/arrow_tensor.rb +0 -401
  221. data/lib/carray/table.rb +0 -108
@@ -647,15 +647,15 @@ ca_axis_dispatch_percell_gather (CArray *parent,
647
647
  break;
648
648
  case 2:
649
649
  for (j = 0; j < inner_count; j++)
650
- *(uint16_t *)(row_dst + j*2) = *(uint16_t *)(src + j*inner_step);
650
+ __builtin_memcpy(row_dst + j*2, src + j*inner_step, 2);
651
651
  break;
652
652
  case 4:
653
653
  for (j = 0; j < inner_count; j++)
654
- *(uint32_t *)(row_dst + j*4) = *(uint32_t *)(src + j*inner_step);
654
+ __builtin_memcpy(row_dst + j*4, src + j*inner_step, 4);
655
655
  break;
656
656
  case 8:
657
657
  for (j = 0; j < inner_count; j++)
658
- *(uint64_t *)(row_dst + j*8) = *(uint64_t *)(src + j*inner_step);
658
+ __builtin_memcpy(row_dst + j*8, src + j*inner_step, 8);
659
659
  break;
660
660
  default:
661
661
  for (j = 0; j < inner_count; j++)
@@ -672,18 +672,15 @@ ca_axis_dispatch_percell_gather (CArray *parent,
672
672
  break;
673
673
  case 2:
674
674
  for (j = 0; j < inner_count; j++)
675
- *(uint16_t *)(row_dst + j*2) =
676
- *(uint16_t *)(row_src_base + inner_indices[j]*inner_pstride);
675
+ __builtin_memcpy(row_dst + j*2, row_src_base + inner_indices[j]*inner_pstride, 2);
677
676
  break;
678
677
  case 4:
679
678
  for (j = 0; j < inner_count; j++)
680
- *(uint32_t *)(row_dst + j*4) =
681
- *(uint32_t *)(row_src_base + inner_indices[j]*inner_pstride);
679
+ __builtin_memcpy(row_dst + j*4, row_src_base + inner_indices[j]*inner_pstride, 4);
682
680
  break;
683
681
  case 8:
684
682
  for (j = 0; j < inner_count; j++)
685
- *(uint64_t *)(row_dst + j*8) =
686
- *(uint64_t *)(row_src_base + inner_indices[j]*inner_pstride);
683
+ __builtin_memcpy(row_dst + j*8, row_src_base + inner_indices[j]*inner_pstride, 8);
687
684
  break;
688
685
  default:
689
686
  for (j = 0; j < inner_count; j++)
@@ -761,8 +758,7 @@ ca_axis_dispatch_gather (CArray *parent,
761
758
  so clang lowers to NEON ldp/stp directly (no libc memcpy call). */
762
759
  if ( sbytes == 8 ) {
763
760
  for ( i = 0; i < n; i++ ) {
764
- *(uint64_t *)(out_buf + i*8) =
765
- *(uint64_t *)(base + indices[i] * pstride);
761
+ __builtin_memcpy(out_buf + i*8, base + indices[i] * pstride, 8);
766
762
  }
767
763
  } else if ( sbytes == 16 ) {
768
764
  for ( i = 0; i < n; i++ ) {
@@ -887,15 +883,15 @@ ca_axis_dispatch_percell_scatter (CArray *parent,
887
883
  break;
888
884
  case 2:
889
885
  for (j = 0; j < inner_count; j++)
890
- *(uint16_t *)(dst + j*inner_step) = *(uint16_t *)(row_src + j*2);
886
+ __builtin_memcpy(dst + j*inner_step, row_src + j*2, 2);
891
887
  break;
892
888
  case 4:
893
889
  for (j = 0; j < inner_count; j++)
894
- *(uint32_t *)(dst + j*inner_step) = *(uint32_t *)(row_src + j*4);
890
+ __builtin_memcpy(dst + j*inner_step, row_src + j*4, 4);
895
891
  break;
896
892
  case 8:
897
893
  for (j = 0; j < inner_count; j++)
898
- *(uint64_t *)(dst + j*inner_step) = *(uint64_t *)(row_src + j*8);
894
+ __builtin_memcpy(dst + j*inner_step, row_src + j*8, 8);
899
895
  break;
900
896
  default:
901
897
  for (j = 0; j < inner_count; j++)
@@ -912,18 +908,15 @@ ca_axis_dispatch_percell_scatter (CArray *parent,
912
908
  break;
913
909
  case 2:
914
910
  for (j = 0; j < inner_count; j++)
915
- *(uint16_t *)(row_dst_base + inner_indices[j]*inner_pstride) =
916
- *(uint16_t *)(row_src + j*2);
911
+ __builtin_memcpy(row_dst_base + inner_indices[j]*inner_pstride, row_src + j*2, 2);
917
912
  break;
918
913
  case 4:
919
914
  for (j = 0; j < inner_count; j++)
920
- *(uint32_t *)(row_dst_base + inner_indices[j]*inner_pstride) =
921
- *(uint32_t *)(row_src + j*4);
915
+ __builtin_memcpy(row_dst_base + inner_indices[j]*inner_pstride, row_src + j*4, 4);
922
916
  break;
923
917
  case 8:
924
918
  for (j = 0; j < inner_count; j++)
925
- *(uint64_t *)(row_dst_base + inner_indices[j]*inner_pstride) =
926
- *(uint64_t *)(row_src + j*8);
919
+ __builtin_memcpy(row_dst_base + inner_indices[j]*inner_pstride, row_src + j*8, 8);
927
920
  break;
928
921
  default:
929
922
  for (j = 0; j < inner_count; j++)
@@ -1158,15 +1151,10 @@ ca_axis_view_attach_owned (void *ap)
1158
1151
  CArray *ca = (CArray *) ap;
1159
1152
  char *buf = xmalloc(ca_length(ca) > 0 ? ca_length(ca) : 1);
1160
1153
  void *args[2];
1161
- int tag = 0;
1162
1154
 
1163
1155
  args[0] = ca;
1164
1156
  args[1] = buf;
1165
- rb_protect(ca_axis_view_fill_owned, (VALUE) args, &tag);
1166
- if ( tag ) {
1167
- xfree(buf);
1168
- rb_jump_tag(tag);
1169
- }
1157
+ ca_fill_or_xfree(buf, ca_axis_view_fill_owned, (VALUE) args);
1170
1158
  ca->ptr = buf;
1171
1159
  }
1172
1160
 
data/ext/ca_axis_group.c CHANGED
@@ -283,7 +283,7 @@ group_op_code (VALUE vop)
283
283
  #define GACC_XOR \
284
284
  ( ((boolean8_t *) co->ptr)[o] ^= (*(boolean8_t *)(p + gw_doff[e]) ? 1 : 0) )
285
285
 
286
- /* __axis_group_reduce__(group_axes, bundles, op) — group-reduces self along
286
+ /* __reduce_by_axis_groups__(group_axes, bundles, op) — group-reduces self along
287
287
  * the union of `group_axes` (ascending source-axis indices = the slab) into
288
288
  * composite groups described by `bundles`, preserving the band (= non-grouped)
289
289
  * axes. Internal: the Ruby surface is CAGroupIterator.
@@ -352,7 +352,7 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
352
352
  /* --- bundles: small per-group code tables (metadata, kept alive) --- */
353
353
  Check_Type(vbundles, T_ARRAY);
354
354
  int n_bundles = (int) RARRAY_LEN(vbundles);
355
- if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) {
355
+ if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) { /* rank-check: a count of key bundles */
356
356
  rb_raise(rb_eArgError, "axis_group_reduce: bad bundle count %d", n_bundles);
357
357
  }
358
358
  int32_t *bundle_codes[CA_RANK_MAX];
@@ -362,7 +362,8 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
362
362
  int bundle_slot[CA_RANK_MAX][CA_RANK_MAX];
363
363
  ca_size_t bundle_cstride[CA_RANK_MAX][CA_RANK_MAX];
364
364
  CArray *bundle_ca[CA_RANK_MAX];
365
- volatile VALUE keep = rb_ary_new(); /* GC-pin int32 code views */
365
+ volatile VALUE keep = rb_ary_new(); /* keeps the int32 code views alive */
366
+ volatile VALUE h_codes[CA_RANK_MAX]; /* holders of the copied code tables */
366
367
 
367
368
  ca_size_t K_total = 1;
368
369
  long consumed_total = 0;
@@ -385,18 +386,16 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
385
386
  and the end of the walk can raise -- a validation just below, a gather
386
387
  that cannot convert a cell, an object-lane callback into Ruby -- and a
387
388
  raise jumps over every detach, leaving the source materialised with
388
- nothing left to release it. The copy rides a temporary buffer that the
389
- unwind collects. */
389
+ nothing left to release it. The copy rides ALLOCV, a temporary buffer
390
+ that the unwind collects. Not a String: a String held only by `keep`
391
+ can be moved by compaction, taking the bytes under bundle_codes with
392
+ it. */
390
393
  VALUE v32 = rb_ca_wrap_readonly(vcodes, INT2NUM(CA_INT32));
391
394
  rb_ary_push((VALUE) keep, v32);
392
395
  GetCArray(v32, bundle_ca[bi]);
393
- {
394
- size_t nbytes = (size_t) bundle_ca[bi]->elements * sizeof(int32_t);
395
- VALUE vbuf = rb_str_tmp_new((long) nbytes);
396
- rb_ary_push((VALUE) keep, vbuf);
397
- ca_copy_data(bundle_ca[bi], RSTRING_PTR(vbuf));
398
- bundle_codes[bi] = (int32_t *) RSTRING_PTR(vbuf);
399
- }
396
+ h_codes[bi] = 0;
397
+ bundle_codes[bi] = ALLOCV_N(int32_t, h_codes[bi], bundle_ca[bi]->elements);
398
+ ca_copy_data(bundle_ca[bi], (char *) bundle_codes[bi]);
400
399
 
401
400
  int nb = (int) RARRAY_LEN(vbaxes);
402
401
  if ( nb <= 0 || nb > src->ndim ) {
@@ -682,6 +681,7 @@ rb_ca_axis_group_reduce (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
682
681
  ALLOCV_END(h_prod); ALLOCV_END(h_seen); ALLOCV_END(h_xbuf);
683
682
  ALLOCV_END(h_nz); ALLOCV_END(h_mnaddr); ALLOCV_END(h_mxaddr);
684
683
  ALLOCV_END(h_band);
684
+ for ( int bi = 0; bi < n_bundles; bi++ ) ALLOCV_END(h_codes[bi]);
685
685
 
686
686
  RB_GC_GUARD(keep);
687
687
  return vout;
@@ -983,7 +983,7 @@ group_scan_build_plan (ca_iter_state *st, boolean8_t *m,
983
983
  omask[o] = 1; \
984
984
  } while (0)
985
985
 
986
- /* The CA_OBJECT lane of __axis_group_scan__. Every cell calls into Ruby,
986
+ /* The CA_OBJECT lane of __scan_by_axis_groups__. Every cell calls into Ruby,
987
987
  so the walk can raise part way; its state lives in the caller's frame, in
988
988
  c->st, and ca_iter_ensure finishes it however this body leaves. The
989
989
  buffers are ALLOCV-backed, so the unwind collects them. */
@@ -1115,9 +1115,9 @@ group_scan_op_code (VALUE vop)
1115
1115
  rb_raise(rb_eArgError, "axis_group_scan: unsupported op :%"PRIsVALUE, rb_id2str(id));
1116
1116
  }
1117
1117
 
1118
- /* __axis_group_scan__(group_axes, bundles, op) — group-keyed segment scan of
1118
+ /* __scan_by_axis_groups__(group_axes, bundles, op) — group-keyed segment scan of
1119
1119
  * self over the union of `group_axes` into composite groups described by
1120
- * `bundles` (same argument shape as __axis_group_reduce__). Internal.
1120
+ * `bundles` (same argument shape as __reduce_by_axis_groups__). Internal.
1121
1121
  *
1122
1122
  * Unlike the reduce the grouped axes are not collapsed: the result is a new
1123
1123
  * CArray of the same shape as self, each cell holding the running statistic of
@@ -1187,7 +1187,7 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
1187
1187
  /* --- bundles: small per-group code tables (same as reduce) --- */
1188
1188
  Check_Type(vbundles, T_ARRAY);
1189
1189
  int n_bundles = (int) RARRAY_LEN(vbundles);
1190
- if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) {
1190
+ if ( n_bundles <= 0 || n_bundles > CA_RANK_MAX ) { /* rank-check: a count of key bundles */
1191
1191
  rb_raise(rb_eArgError, "axis_group_scan: bad bundle count %d", n_bundles);
1192
1192
  }
1193
1193
  int32_t *bundle_codes[CA_RANK_MAX];
@@ -1198,6 +1198,7 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
1198
1198
  ca_size_t bundle_cstride[CA_RANK_MAX][CA_RANK_MAX];
1199
1199
  CArray *bundle_ca[CA_RANK_MAX];
1200
1200
  volatile VALUE keep = rb_ary_new();
1201
+ volatile VALUE h_codes[CA_RANK_MAX];
1201
1202
 
1202
1203
  ca_size_t K_total = 1;
1203
1204
  long consumed_total = 0;
@@ -1220,18 +1221,16 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
1220
1221
  and the end of the walk can raise -- a validation just below, a gather
1221
1222
  that cannot convert a cell, an object-lane callback into Ruby -- and a
1222
1223
  raise jumps over every detach, leaving the source materialised with
1223
- nothing left to release it. The copy rides a temporary buffer that the
1224
- unwind collects. */
1224
+ nothing left to release it. The copy rides ALLOCV, a temporary buffer
1225
+ that the unwind collects. Not a String: a String held only by `keep`
1226
+ can be moved by compaction, taking the bytes under bundle_codes with
1227
+ it. */
1225
1228
  VALUE v32 = rb_ca_wrap_readonly(vcodes, INT2NUM(CA_INT32));
1226
1229
  rb_ary_push((VALUE) keep, v32);
1227
1230
  GetCArray(v32, bundle_ca[bi]);
1228
- {
1229
- size_t nbytes = (size_t) bundle_ca[bi]->elements * sizeof(int32_t);
1230
- VALUE vbuf = rb_str_tmp_new((long) nbytes);
1231
- rb_ary_push((VALUE) keep, vbuf);
1232
- ca_copy_data(bundle_ca[bi], RSTRING_PTR(vbuf));
1233
- bundle_codes[bi] = (int32_t *) RSTRING_PTR(vbuf);
1234
- }
1231
+ h_codes[bi] = 0;
1232
+ bundle_codes[bi] = ALLOCV_N(int32_t, h_codes[bi], bundle_ca[bi]->elements);
1233
+ ca_copy_data(bundle_ca[bi], (char *) bundle_codes[bi]);
1235
1234
 
1236
1235
  int nb = (int) RARRAY_LEN(vbaxes);
1237
1236
  if ( nb <= 0 || nb > src->ndim ) {
@@ -1413,6 +1412,7 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
1413
1412
  ALLOCV_END(h_band2); ALLOCV_END(h_code); ALLOCV_END(h_doff);
1414
1413
  ALLOCV_END(h_moff); ALLOCV_END(h_addr); ALLOCV_END(h_accd);
1415
1414
  ALLOCV_END(h_accn); ALLOCV_END(h_seen); ALLOCV_END(h_acco);
1415
+ for ( int bi = 0; bi < n_bundles; bi++ ) ALLOCV_END(h_codes[bi]);
1416
1416
 
1417
1417
  RB_GC_GUARD(keep);
1418
1418
  return vout;
@@ -1421,8 +1421,8 @@ rb_ca_axis_group_scan (VALUE self, VALUE vgaxes, VALUE vbundles, VALUE vop)
1421
1421
  void
1422
1422
  Init_ca_axis_group (void)
1423
1423
  {
1424
- rb_define_method(rb_cCArray, "__axis_group_reduce__",
1424
+ rb_define_method(rb_cCArray, "__reduce_by_axis_groups__",
1425
1425
  rb_ca_axis_group_reduce, 3);
1426
- rb_define_method(rb_cCArray, "__axis_group_scan__",
1426
+ rb_define_method(rb_cCArray, "__scan_by_axis_groups__",
1427
1427
  rb_ca_axis_group_scan, 3);
1428
1428
  }
@@ -29,7 +29,7 @@
29
29
 
30
30
  /* The kernel table of each op id. The eager operators hold the tables
31
31
  themselves; ca_binop_op_id_of_table maps one back to its op id, so that
32
- both ask ca_binop_is_trapping the same question. */
32
+ both ask ca_op_raises_on_cell the same question. */
33
33
  static ca_binop_func_t * const ca_binop_tables[CA_BINOP_COUNT] = {
34
34
  [CA_BINOP_ADD] = ca_binop_add,
35
35
  [CA_BINOP_SUB] = ca_binop_sub,
@@ -116,31 +116,3 @@ ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
116
116
  if ( out_r_in_dt ) *out_r_in_dt = common;
117
117
  }
118
118
 
119
- /* ------------------------------------------------------------------- */
120
- /* trapping-op predicate */
121
- /* ------------------------------------------------------------------- */
122
-
123
- int
124
- ca_binop_is_trapping (uint16_t op_id, int8_t common_dt)
125
- {
126
- /* An object cell calls Ruby, which can raise for any op. Integer
127
- DIV / MOD / QUO / FMOD / RCP_MUL raise on a zero divisor, and POW /
128
- IPOWER on zero to a negative power. Float division returns NaN/Inf
129
- and does not trap. */
130
- int is_integer = ( common_dt >= CA_INT8 && common_dt <= CA_UINT64 );
131
- if ( common_dt == CA_OBJECT ) return 1;
132
- if ( ! is_integer ) return 0;
133
-
134
- switch (op_id) {
135
- case CA_BINOP_DIV:
136
- case CA_BINOP_MOD:
137
- case CA_BINOP_QUO:
138
- case CA_BINOP_FMOD:
139
- case CA_BINOP_RCP_MUL:
140
- case CA_BINOP_POW:
141
- case CA_BINOP_IPOWER:
142
- return 1;
143
- default:
144
- return 0;
145
- }
146
- }
@@ -147,7 +147,6 @@ void ca_binop_kernel_input_data_types (uint16_t op_id, int8_t l_dt, int8_t r_dt,
147
147
  When trapping AND either operand has a mask, xfer_stride must pass
148
148
  a slab mask to the kernel so masked cells are skipped (otherwise
149
149
  masked-zero divisors crash with SIGFPE). See §3.4 rev3. */
150
- int ca_binop_is_trapping (uint16_t op_id, int8_t common_dt);
151
150
  int ca_binop_op_id_of_table (ca_binop_func_t table[]);
152
151
 
153
152
  #endif /* CA_BINOP_DISPATCH_H */