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
@@ -24,6 +24,13 @@
24
24
  probed by operation-table function pointer (obj_type is runtime-
25
25
  assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
26
  extern ca_operation_function_t ca_stack_func;
27
+ /* The square root of a variance: an ε-negative from rounding becomes 0,
28
+ a NaN stays NaN (fmax(NaN, 0.0) is 0.0). */
29
+ #ifndef CARRAY_SQRT_CLAMP_DEFINED
30
+ #define CARRAY_SQRT_CLAMP_DEFINED
31
+ static inline double ca_sqrt_clamp (double v) { return sqrt(v < 0.0 ? 0.0 : v); }
32
+ #endif
33
+
27
34
  /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
35
  for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
36
  return real true/false, not Integer 0/1. (BOOL2OBJ already exists
@@ -38,13 +45,16 @@ static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
38
45
 
39
46
  /* ===== all_ki ============================================ */
40
47
 
48
+ typedef struct {
49
+ void *chunk;
50
+ CArray *ca;
51
+ } all_ki_stream_bool_t;
52
+
41
53
  static VALUE
42
- all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
54
+ all_ki_stream_bool (VALUE arg)
43
55
  {
44
- /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
45
- /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
46
- if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
47
- ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
56
+ all_ki_stream_bool_t *__ctx = (all_ki_stream_bool_t *) arg;
57
+ CArray *ca = __ctx->ca;
48
58
  ca_size_t __inner = 1;
49
59
  int __k;
50
60
  for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
@@ -65,8 +75,8 @@ all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
65
75
  ca_size_t __outer_off = 0;
66
76
  boolean8_t acc;
67
77
  acc = (1);
68
- ca_lazy_arena_enter();
69
78
  boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
79
+ __ctx->chunk = __chunk;
70
80
  while ( __outer_off < __outer ) {
71
81
  ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
72
82
  ca_size_t __n = __r * __inner;
@@ -80,9 +90,21 @@ all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
80
90
  }
81
91
  __outer_off += __r;
82
92
  }
83
- ca_lazy_arena_release(__chunk);
84
- ca_lazy_arena_exit();
85
93
  return BOOL2VAL((boolean8_t) (acc));
94
+ }
95
+
96
+ static VALUE
97
+ all_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
98
+ {
99
+ if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
100
+ ca->elements > 0 &&
101
+ ca_is_lazy_view(ca) && ! ca_has_mask(ca) &&
102
+ ca_fast_paths_enabled() ) {
103
+ all_ki_stream_bool_t __ctx;
104
+ __ctx.chunk = NULL;
105
+ __ctx.ca = ca;
106
+ return ca_lazy_arena_protect(all_ki_stream_bool, ca_lazy_arena_release_held,
107
+ (VALUE) &__ctx);
86
108
  }
87
109
  VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
88
110
  CArray *co;
@@ -93,7 +115,7 @@ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
93
115
  slab_axes, naxes, 0);
94
116
  if ( rc != CA_ITER_OK ) {
95
117
  rb_raise(rb_eRuntimeError,
96
- "all_ki: kernel_iterator init failed rc=%d", rc);
118
+ "%s: kernel_iterator init failed rc=%d", ca_calling_method_name(), rc);
97
119
  }
98
120
  char *p;
99
121
  boolean8_t *m;
@@ -119,26 +141,37 @@ rb_ca_all_ki (int argc, VALUE *argv, VALUE self)
119
141
  int keep_axis = RTEST(rkeep_axis);
120
142
  int8_t slab_axes[CA_RANK_MAX];
121
143
  int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
144
+ if ( ca_is_lazy_view(src) && ! ( naxes == src->ndim && src->ndim >= 1 && ! keep_axis && ! ca_has_mask(src) ) ) {
145
+ volatile VALUE evaluated = ca_lazy_evaluated(self);
146
+ if ( ! NIL_P(evaluated) ) {
147
+ self = evaluated;
148
+ GetCArray(self, src);
149
+ }
150
+ }
122
151
  if ( argc > 0 ) {
123
- rb_raise(rb_eArgError, "all_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.all(axis: 0) or a.all(axis: [0, 1])", argc);
152
+ rb_raise(rb_eArgError, "%s: positional axis arguments are no longer accepted (got %d); use the axis: keyword, e.g. a.%s(axis: 0) or a.%s(axis: [0, 1])", ca_calling_method_name(), argc, ca_calling_method_name(), ca_calling_method_name());
124
153
  }
125
154
  switch ( src->data_type ) {
126
- case CA_BOOLEAN: return all_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
155
+ case CA_BOOLEAN: CA_RETURN_KEEPING(self, all_ki_native_bool(self, src, slab_axes, naxes, keep_axis));
127
156
  default:
128
- rb_raise(rb_eCADataTypeError, "all_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
157
+ ca_face_refuse_numeric(self, ca_calling_method_name(), rb_eCADataTypeError);
158
+ rb_raise(rb_eCADataTypeError, "%s: source data_type :%s not supported (expected one of: boolean)", ca_calling_method_name(), ca_type_name[src->data_type]);
129
159
  }
130
160
  return Qnil; /* unreachable */
131
161
  }
132
162
 
133
163
  /* ===== any_ki ============================================ */
134
164
 
165
+ typedef struct {
166
+ void *chunk;
167
+ CArray *ca;
168
+ } any_ki_stream_bool_t;
169
+
135
170
  static VALUE
136
- any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
171
+ any_ki_stream_bool (VALUE arg)
137
172
  {
138
- /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
139
- /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
140
- if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
141
- ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
173
+ any_ki_stream_bool_t *__ctx = (any_ki_stream_bool_t *) arg;
174
+ CArray *ca = __ctx->ca;
142
175
  ca_size_t __inner = 1;
143
176
  int __k;
144
177
  for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
@@ -159,8 +192,8 @@ any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
159
192
  ca_size_t __outer_off = 0;
160
193
  boolean8_t acc;
161
194
  acc = (0);
162
- ca_lazy_arena_enter();
163
195
  boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
196
+ __ctx->chunk = __chunk;
164
197
  while ( __outer_off < __outer ) {
165
198
  ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
166
199
  ca_size_t __n = __r * __inner;
@@ -174,9 +207,21 @@ any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
174
207
  }
175
208
  __outer_off += __r;
176
209
  }
177
- ca_lazy_arena_release(__chunk);
178
- ca_lazy_arena_exit();
179
210
  return BOOL2VAL((boolean8_t) (acc));
211
+ }
212
+
213
+ static VALUE
214
+ any_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
215
+ {
216
+ if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
217
+ ca->elements > 0 &&
218
+ ca_is_lazy_view(ca) && ! ca_has_mask(ca) &&
219
+ ca_fast_paths_enabled() ) {
220
+ any_ki_stream_bool_t __ctx;
221
+ __ctx.chunk = NULL;
222
+ __ctx.ca = ca;
223
+ return ca_lazy_arena_protect(any_ki_stream_bool, ca_lazy_arena_release_held,
224
+ (VALUE) &__ctx);
180
225
  }
181
226
  VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
182
227
  CArray *co;
@@ -187,7 +232,7 @@ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
187
232
  slab_axes, naxes, 0);
188
233
  if ( rc != CA_ITER_OK ) {
189
234
  rb_raise(rb_eRuntimeError,
190
- "any_ki: kernel_iterator init failed rc=%d", rc);
235
+ "%s: kernel_iterator init failed rc=%d", ca_calling_method_name(), rc);
191
236
  }
192
237
  char *p;
193
238
  boolean8_t *m;
@@ -213,26 +258,37 @@ rb_ca_any_ki (int argc, VALUE *argv, VALUE self)
213
258
  int keep_axis = RTEST(rkeep_axis);
214
259
  int8_t slab_axes[CA_RANK_MAX];
215
260
  int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
261
+ if ( ca_is_lazy_view(src) && ! ( naxes == src->ndim && src->ndim >= 1 && ! keep_axis && ! ca_has_mask(src) ) ) {
262
+ volatile VALUE evaluated = ca_lazy_evaluated(self);
263
+ if ( ! NIL_P(evaluated) ) {
264
+ self = evaluated;
265
+ GetCArray(self, src);
266
+ }
267
+ }
216
268
  if ( argc > 0 ) {
217
- rb_raise(rb_eArgError, "any_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.any(axis: 0) or a.any(axis: [0, 1])", argc);
269
+ rb_raise(rb_eArgError, "%s: positional axis arguments are no longer accepted (got %d); use the axis: keyword, e.g. a.%s(axis: 0) or a.%s(axis: [0, 1])", ca_calling_method_name(), argc, ca_calling_method_name(), ca_calling_method_name());
218
270
  }
219
271
  switch ( src->data_type ) {
220
- case CA_BOOLEAN: return any_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
272
+ case CA_BOOLEAN: CA_RETURN_KEEPING(self, any_ki_native_bool(self, src, slab_axes, naxes, keep_axis));
221
273
  default:
222
- rb_raise(rb_eCADataTypeError, "any_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
274
+ ca_face_refuse_numeric(self, ca_calling_method_name(), rb_eCADataTypeError);
275
+ rb_raise(rb_eCADataTypeError, "%s: source data_type :%s not supported (expected one of: boolean)", ca_calling_method_name(), ca_type_name[src->data_type]);
223
276
  }
224
277
  return Qnil; /* unreachable */
225
278
  }
226
279
 
227
280
  /* ===== none_ki ============================================ */
228
281
 
282
+ typedef struct {
283
+ void *chunk;
284
+ CArray *ca;
285
+ } none_ki_stream_bool_t;
286
+
229
287
  static VALUE
230
- none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
288
+ none_ki_stream_bool (VALUE arg)
231
289
  {
232
- /* P.4.5.3b/c streaming chunked reduce: full reduction over lazy unmasked. */
233
- /* P.4.5.3c (N-D): outer-axis chunking, 1-D is the natural sub-case. */
234
- if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
235
- ca_is_lazy_view(ca) && ! ca_has_mask(ca) ) {
290
+ none_ki_stream_bool_t *__ctx = (none_ki_stream_bool_t *) arg;
291
+ CArray *ca = __ctx->ca;
236
292
  ca_size_t __inner = 1;
237
293
  int __k;
238
294
  for ( __k = 1; __k < ca->ndim; __k++ ) __inner *= ca->dim[__k];
@@ -253,8 +309,8 @@ none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, in
253
309
  ca_size_t __outer_off = 0;
254
310
  boolean8_t acc;
255
311
  acc = (1);
256
- ca_lazy_arena_enter();
257
312
  boolean8_t *__chunk = (boolean8_t *) ca_lazy_arena_acquire(__chunk_elems * sizeof(boolean8_t));
313
+ __ctx->chunk = __chunk;
258
314
  while ( __outer_off < __outer ) {
259
315
  ca_size_t __r = (__outer - __outer_off < __rows) ? (__outer - __outer_off) : __rows;
260
316
  ca_size_t __n = __r * __inner;
@@ -268,9 +324,21 @@ none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, in
268
324
  }
269
325
  __outer_off += __r;
270
326
  }
271
- ca_lazy_arena_release(__chunk);
272
- ca_lazy_arena_exit();
273
327
  return BOOL2VAL((boolean8_t) (acc));
328
+ }
329
+
330
+ static VALUE
331
+ none_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int keep_axis)
332
+ {
333
+ if ( naxes == ca->ndim && ca->ndim >= 1 && !keep_axis &&
334
+ ca->elements > 0 &&
335
+ ca_is_lazy_view(ca) && ! ca_has_mask(ca) &&
336
+ ca_fast_paths_enabled() ) {
337
+ none_ki_stream_bool_t __ctx;
338
+ __ctx.chunk = NULL;
339
+ __ctx.ca = ca;
340
+ return ca_lazy_arena_protect(none_ki_stream_bool, ca_lazy_arena_release_held,
341
+ (VALUE) &__ctx);
274
342
  }
275
343
  VALUE vout = rb_ca_new_reduced(self, slab_axes, naxes, CA_BOOLEAN, keep_axis);
276
344
  CArray *co;
@@ -281,7 +349,7 @@ int rc = ca_iter_state_init_l2(&st, ca, CA_SLAB_AXES,
281
349
  slab_axes, naxes, 0);
282
350
  if ( rc != CA_ITER_OK ) {
283
351
  rb_raise(rb_eRuntimeError,
284
- "none_ki: kernel_iterator init failed rc=%d", rc);
352
+ "%s: kernel_iterator init failed rc=%d", ca_calling_method_name(), rc);
285
353
  }
286
354
  char *p;
287
355
  boolean8_t *m;
@@ -307,13 +375,21 @@ rb_ca_none_ki (int argc, VALUE *argv, VALUE self)
307
375
  int keep_axis = RTEST(rkeep_axis);
308
376
  int8_t slab_axes[CA_RANK_MAX];
309
377
  int8_t naxes = rb_ca_parse_reduce_axes_kw(raxis, src, slab_axes);
378
+ if ( ca_is_lazy_view(src) && ! ( naxes == src->ndim && src->ndim >= 1 && ! keep_axis && ! ca_has_mask(src) ) ) {
379
+ volatile VALUE evaluated = ca_lazy_evaluated(self);
380
+ if ( ! NIL_P(evaluated) ) {
381
+ self = evaluated;
382
+ GetCArray(self, src);
383
+ }
384
+ }
310
385
  if ( argc > 0 ) {
311
- rb_raise(rb_eArgError, "none_ki: positional axis arguments are no longer accepted (got %d); use axis: kwarg, e.g. a.none(axis: 0) or a.none(axis: [0, 1])", argc);
386
+ rb_raise(rb_eArgError, "%s: positional axis arguments are no longer accepted (got %d); use the axis: keyword, e.g. a.%s(axis: 0) or a.%s(axis: [0, 1])", ca_calling_method_name(), argc, ca_calling_method_name(), ca_calling_method_name());
312
387
  }
313
388
  switch ( src->data_type ) {
314
- case CA_BOOLEAN: return none_ki_native_bool(self, src, slab_axes, naxes, keep_axis);
389
+ case CA_BOOLEAN: CA_RETURN_KEEPING(self, none_ki_native_bool(self, src, slab_axes, naxes, keep_axis));
315
390
  default:
316
- rb_raise(rb_eCADataTypeError, "none_ki: source data_type :%s not supported (expected one of: bool)", ca_type_name[src->data_type]);
391
+ ca_face_refuse_numeric(self, ca_calling_method_name(), rb_eCADataTypeError);
392
+ rb_raise(rb_eCADataTypeError, "%s: source data_type :%s not supported (expected one of: boolean)", ca_calling_method_name(), ca_type_name[src->data_type]);
317
393
  }
318
394
  return Qnil; /* unreachable */
319
395
  }