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_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)
@@ -120,6 +121,13 @@ rb_ca_index_walk (VALUE self, CArray *ca, int8_t level,
120
121
  volatile VALUE ret = Qnil;
121
122
  ca_size_t i;
122
123
  if ( level == ca->ndim - 1 ) {
124
+ /* One value-yield buffer for the whole innermost run. It was once an
125
+ ALLOCA_N inside the loop, which never releases per iteration: the C
126
+ stack grew by (ndim + 1) VALUEs per cell and a long enough axis
127
+ raised SystemStackError (a 1-D each_with_index / map_with_index!
128
+ died around a million cells on the main stack, and far earlier on a
129
+ Thread's smaller one). */
130
+ VALUE argv[CA_RANK_MAX + 1];
123
131
  for (i=0; i<ca->dim[level]; i++) {
124
132
  volatile VALUE obj;
125
133
  idx[level] = i;
@@ -132,7 +140,6 @@ rb_ca_index_walk (VALUE self, CArray *ca, int8_t level,
132
140
  that want the whole subscript should write |*idx|. */
133
141
  if ( mode & CA_LOOP_WITH_VALUE ) {
134
142
  int argc = (int)ca->ndim + 1;
135
- VALUE *argv = ALLOCA_N(VALUE, argc);
136
143
  argv[0] = rb_ca_fetch_index(self, idx);
137
144
  MEMCPY(argv + 1, RARRAY_CONST_PTR(ridx), VALUE, ca->ndim);
138
145
  obj = rb_yield_values2(argc, argv);
@@ -170,29 +177,89 @@ rb_ca_each_index (VALUE self)
170
177
  return rb_ca_index_walk(self, ca, 0, idx, ridx, 0);
171
178
  }
172
179
 
173
- /* CArray#map! {|elem| ... } -- yield each cell value, store the
174
- block's return back at the same flat address. Mutates self;
175
- 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
+
176
192
  static VALUE
177
- rb_ca_map_bang (VALUE self)
193
+ ca_map_bang_body (VALUE arg)
178
194
  {
195
+ ca_map_ctx_t *c = (ca_map_ctx_t *) arg;
179
196
  volatile VALUE obj;
180
- CArray *ca;
181
- ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
182
197
  ca_size_t i;
183
- RETURN_ENUMERATOR(self, 0, 0);
184
- rb_ca_modify(self);
185
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
186
- ca_attach(ca);
187
- for (i=0; i<elements; i++) {
188
- obj = rb_yield(rb_ca_fetch_addr(self, i));
189
- 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);
190
227
  }
191
- ca_sync(ca);
192
- 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);
193
251
  return self;
194
252
  }
195
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
+
196
263
  /* CArray#each_with_index {|elem, i, j, ...| ... } -- yield each cell
197
264
  value followed by its multi-dim index components (individual args;
198
265
  see rb_ca_index_walk header). */
@@ -215,18 +282,9 @@ rb_ca_each_with_index (VALUE self)
215
282
  static VALUE
216
283
  rb_ca_map_with_index_bang (VALUE self)
217
284
  {
218
- CArray *ca;
219
- ca_size_t idx[CA_RANK_MAX];
220
- volatile VALUE ridx;
221
285
  RETURN_ENUMERATOR(self, 0, 0);
222
- rb_ca_modify(self);
223
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
224
- ca_attach(ca);
225
- ridx = rb_ary_new2(ca->ndim);
226
- rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_WITH_VALUE | CA_LOOP_STORE);
227
- ca_sync(ca);
228
- ca_detach(ca);
229
- return self;
286
+ return ca_map_bang_run(self, ca_map_index_walk_body,
287
+ CA_LOOP_WITH_VALUE | CA_LOOP_STORE);
230
288
  }
231
289
 
232
290
 
@@ -236,18 +294,8 @@ rb_ca_map_with_index_bang (VALUE self)
236
294
  static VALUE
237
295
  rb_ca_map_index_bang (VALUE self)
238
296
  {
239
- CArray *ca;
240
- ca_size_t idx[CA_RANK_MAX];
241
- volatile VALUE ridx;
242
297
  RETURN_ENUMERATOR(self, 0, 0);
243
- rb_ca_modify(self);
244
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
245
- ca_attach(ca);
246
- ridx = rb_ary_new2(ca->ndim);
247
- rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_STORE);
248
- ca_sync(ca);
249
- ca_detach(ca);
250
- return self;
298
+ return ca_map_bang_run(self, ca_map_index_walk_body, CA_LOOP_STORE);
251
299
  }
252
300
 
253
301
  /* CArray#map_with_addr! {|elem, addr| ... } -- yield (value, flat
@@ -255,21 +303,8 @@ rb_ca_map_index_bang (VALUE self)
255
303
  static VALUE
256
304
  rb_ca_map_with_addr_bang (VALUE self)
257
305
  {
258
- volatile VALUE obj;
259
- CArray *ca;
260
- ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
261
- ca_size_t i;
262
306
  RETURN_ENUMERATOR(self, 0, 0);
263
- rb_ca_modify(self);
264
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
265
- ca_attach(ca);
266
- for (i=0; i<elements; i++) {
267
- obj = rb_yield_values(2, rb_ca_fetch_addr(self, i), SIZE2NUM(i));
268
- rb_ca_store_addr(self, i, obj);
269
- }
270
- ca_sync(ca);
271
- ca_detach(ca);
272
- return self;
307
+ return ca_map_bang_run(self, ca_map_with_addr_bang_body, 0);
273
308
  }
274
309
 
275
310
 
@@ -278,21 +313,8 @@ rb_ca_map_with_addr_bang (VALUE self)
278
313
  static VALUE
279
314
  rb_ca_map_addr_bang (VALUE self)
280
315
  {
281
- volatile VALUE obj;
282
- CArray *ca;
283
- ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
284
- ca_size_t i;
285
316
  RETURN_ENUMERATOR(self, 0, 0);
286
- rb_ca_modify(self);
287
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
288
- ca_attach(ca);
289
- for (i=0; i<elements; i++) {
290
- obj = rb_yield(SIZE2NUM(i));
291
- rb_ca_store_addr(self, i, obj);
292
- }
293
- ca_sync(ca);
294
- ca_detach(ca);
295
- return self;
317
+ return ca_map_bang_run(self, ca_map_addr_bang_body, 0);
296
318
  }
297
319
 
298
320