carray 3.0.2 → 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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +304 -0
  3. data/README.md +3 -4
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +225 -0
  6. data/ext/ca_axis_group.c +177 -99
  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 +66 -71
  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 +663 -214
  14. data/ext/ca_kernel_iterator.h +231 -167
  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 +132 -22
  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 +1 -0
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +96 -25
  25. data/ext/ca_obj_face.c +406 -64
  26. data/ext/ca_obj_face.h +92 -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 +21 -21
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +189 -107
  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 +543 -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 +47 -49
  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 -118
  46. data/ext/ca_obj_stride.c +195 -34
  47. data/ext/ca_obj_string.c +17 -18
  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 +149 -27
  54. data/ext/ca_op_ipower.c +24 -11
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_sort_kernels.h +70 -0
  58. data/ext/ca_sweep_engine.c +102 -79
  59. data/ext/ca_sweep_engine.h +7 -20
  60. data/ext/ca_triop_dispatch.c +4 -1
  61. data/ext/ca_triop_dispatch.h +5 -2
  62. data/ext/caframe_csv_reader.c +463 -0
  63. data/ext/carray.h +70 -27
  64. data/ext/carray_access.c +455 -211
  65. data/ext/carray_address_basis.c +177 -36
  66. data/ext/carray_attribute.c +45 -3
  67. data/ext/carray_bincount.c +32 -2
  68. data/ext/carray_broadcast.c +46 -14
  69. data/ext/carray_call_cfunc.c +0 -28
  70. data/ext/carray_cast.c +1444 -209
  71. data/ext/carray_cast_func.rb +34 -21
  72. data/ext/carray_conversion.c +197 -73
  73. data/ext/carray_copy.c +32 -11
  74. data/ext/carray_core.c +514 -122
  75. data/ext/carray_count.c +140 -87
  76. data/ext/carray_element.c +18 -27
  77. data/ext/carray_factorize.c +569 -277
  78. data/ext/carray_generate.c +76 -40
  79. data/ext/carray_histogram.c +152 -94
  80. data/ext/carray_hold.c +2 -1
  81. data/ext/carray_index_classifier.c +63 -96
  82. data/ext/carray_internal.h +385 -3
  83. data/ext/carray_lazy.c +834 -79
  84. data/ext/carray_loop.c +81 -65
  85. data/ext/carray_mask.c +682 -316
  86. data/ext/carray_math_kernel.h +1 -0
  87. data/ext/carray_median_percentile.c +221 -76
  88. data/ext/carray_memory_view.c +254 -248
  89. data/ext/carray_operator.c +1089 -359
  90. data/ext/carray_order.c +133 -69
  91. data/ext/carray_partition.c +102 -56
  92. data/ext/carray_random.c +273 -239
  93. data/ext/carray_scatter.c +308 -65
  94. data/ext/carray_segment.c +257 -0
  95. data/ext/carray_slab.c +170 -70
  96. data/ext/carray_sort.c +215 -218
  97. data/ext/carray_sort_kernel.c +8 -1
  98. data/ext/carray_struct.c +99 -21
  99. data/ext/carray_test.c +167 -64
  100. data/ext/carray_time_text.c +1182 -0
  101. data/ext/carray_utils.c +363 -98
  102. data/ext/extconf.rb +27 -2
  103. data/ext/mk_call_cfunc.rb +0 -2
  104. data/ext/mk_pow5_table.rb +35 -0
  105. data/ext/mkkernel.rb +1076 -846
  106. data/ext/ruby_carray.c +7 -1
  107. data/ext/version.h +4 -4
  108. data/ext/version.rb +4 -2
  109. data/lib/carray/attribute.rb +39 -0
  110. data/lib/carray/autoload_carray.rb +19 -0
  111. data/lib/carray/autoload_method_extension.rb +6 -0
  112. data/lib/carray/axis_group.rb +174 -26
  113. data/lib/carray/basics.rb +91 -25
  114. data/lib/carray/bincount_nd.rb +6 -0
  115. data/lib/carray/block_iterator.rb +118 -48
  116. data/lib/carray/boolean_reduce.rb +21 -29
  117. data/lib/carray/categorical.rb +94 -26
  118. data/lib/carray/categorical_iterator.rb +333 -826
  119. data/lib/carray/complex.rb +36 -29
  120. data/lib/carray/conditional.rb +94 -7
  121. data/lib/carray/const_string.rb +46 -0
  122. data/lib/carray/frame/concat.rb +157 -6
  123. data/lib/carray/frame/convert.rb +13 -7
  124. data/lib/carray/frame/csv_parser.rb +589 -82
  125. data/lib/carray/frame/describe.rb +79 -0
  126. data/lib/carray/frame/frame.rb +124 -25
  127. data/lib/carray/frame/group.rb +189 -63
  128. data/lib/carray/frame/io.rb +412 -72
  129. data/lib/carray/frame/join.rb +134 -46
  130. data/lib/carray/frame/records.rb +37 -16
  131. data/lib/carray/frame/reshape.rb +448 -0
  132. data/lib/carray/frame/sort.rb +26 -2
  133. data/lib/carray/frame/verbs.rb +715 -48
  134. data/lib/carray/frame.rb +2 -0
  135. data/lib/carray/fuse_source.rb +111 -2
  136. data/lib/carray/fusion.rb +229 -38
  137. data/lib/carray/inspect.rb +29 -11
  138. data/lib/carray/iterator.rb +14 -2
  139. data/lib/carray/lazy.rb +54 -30
  140. data/lib/carray/mask_gap_fill.rb +66 -52
  141. data/lib/carray/math.rb +32 -19
  142. data/lib/carray/meld_reduce.rb +40 -7
  143. data/lib/carray/methods/align_addr.rb +8 -4
  144. data/lib/carray/methods/bincount.rb +2 -2
  145. data/lib/carray/methods/bit_string.rb +14 -3
  146. data/lib/carray/methods/composition.rb +16 -10
  147. data/lib/carray/methods/factorize.rb +2 -2
  148. data/lib/carray/methods/gather_nd.rb +13 -2
  149. data/lib/carray/methods/insert_block.rb +9 -14
  150. data/lib/carray/methods/is_in.rb +117 -4
  151. data/lib/carray/methods/join.rb +1 -1
  152. data/lib/carray/methods/locate_addr.rb +177 -36
  153. data/lib/carray/methods/mode.rb +18 -1
  154. data/lib/carray/methods/repeat.rb +1 -20
  155. data/lib/carray/methods/resize.rb +21 -23
  156. data/lib/carray/methods/snap.rb +34 -12
  157. data/lib/carray/methods/unique.rb +11 -2
  158. data/lib/carray/record_order.rb +208 -0
  159. data/lib/carray/runtime.rb +14 -11
  160. data/lib/carray/segment_iterator.rb +990 -0
  161. data/lib/carray/serialize.rb +197 -27
  162. data/lib/carray/slab_iterator.rb +51 -27
  163. data/lib/carray/stack.rb +10 -4
  164. data/lib/carray/string_operation_extension.rb +4 -3
  165. data/lib/carray/struct.rb +142 -51
  166. data/lib/carray/struct_builder.rb +110 -14
  167. data/lib/carray/table.rb +2 -2
  168. data/lib/carray/time.rb +517 -103
  169. data/lib/carray/window_iterator.rb +127 -72
  170. data/lib/carray.rb +2 -2
  171. data/yard-stubs/ca_obj_array.rb +4 -4
  172. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  173. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  174. data/yard-stubs/ca_obj_fake.rb +1 -1
  175. data/yard-stubs/ca_obj_field.rb +1 -1
  176. data/yard-stubs/ca_obj_refer.rb +3 -3
  177. data/yard-stubs/ca_obj_roll.rb +0 -1
  178. data/yard-stubs/ca_obj_stride.rb +10 -7
  179. data/yard-stubs/ca_obj_transpose.rb +1 -1
  180. data/yard-stubs/ca_obj_window.rb +1 -2
  181. data/yard-stubs/carray_access.rb +5 -4
  182. data/yard-stubs/carray_broadcast.rb +1 -1
  183. data/yard-stubs/carray_cast.rb +78 -43
  184. data/yard-stubs/carray_conversion.rb +13 -1
  185. data/yard-stubs/carray_copy.rb +8 -3
  186. data/yard-stubs/carray_core.rb +3 -3
  187. data/yard-stubs/carray_count.rb +9 -0
  188. data/yard-stubs/carray_lazy.rb +5 -1
  189. data/yard-stubs/carray_loop.rb +4 -1
  190. data/yard-stubs/carray_mask.rb +34 -10
  191. data/yard-stubs/carray_math.rb +25 -13
  192. data/yard-stubs/carray_median_percentile.rb +10 -6
  193. data/yard-stubs/carray_order.rb +34 -13
  194. data/yard-stubs/carray_scatter.rb +10 -3
  195. data/yard-stubs/carray_segment.rb +72 -0
  196. data/yard-stubs/carray_slab.rb +2 -1
  197. data/yard-stubs/carray_sort.rb +43 -3
  198. data/yard-stubs/carray_test.rb +10 -0
  199. data/yard-stubs/carray_utils.rb +0 -26
  200. metadata +11 -19
  201. data/ext/ca_for_each_element.h +0 -239
  202. data/ext/carray_build_flags.h +0 -3
  203. data/ext/carray_config.h +0 -28
  204. data/ext/carray_kernels_bincmp.c +0 -4446
  205. data/ext/carray_kernels_binop.c +0 -11001
  206. data/ext/carray_kernels_init.c +0 -1131
  207. data/ext/carray_kernels_map.c +0 -3467
  208. data/ext/carray_kernels_moncmp.c +0 -2097
  209. data/ext/carray_kernels_monop.c +0 -18313
  210. data/ext/carray_kernels_reduce_aggregate.c +0 -26005
  211. data/ext/carray_kernels_reduce_boolean.c +0 -330
  212. data/ext/carray_kernels_reduce_cumulative.c +0 -14862
  213. data/ext/carray_kernels_reduce_extreme.c +0 -17494
  214. data/ext/carray_kernels_reduce_variance.c +0 -3910
  215. data/ext/carray_kernels_scan.c +0 -3693
  216. data/ext/carray_kernels_search.c +0 -32218
  217. data/ext/carray_kernels_sort.c +0 -10626
  218. 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)
@@ -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