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/ca_obj_record.c CHANGED
@@ -20,6 +20,7 @@
20
20
 
21
21
  #include "carray.h"
22
22
  #include "ca_obj_face.h"
23
+ #include "carray_internal.h"
23
24
 
24
25
  typedef struct {
25
26
  /* === CAView prefix === */
@@ -99,6 +100,12 @@ ca_record_setup (CARecord *ca, CArray *parent, VALUE data_class)
99
100
  parent->data_type);
100
101
  }
101
102
 
103
+ /* ca == NULL asks for the checks above only, so that a constructor can
104
+ run them before it allocates. */
105
+ if ( ca == NULL ) {
106
+ return 0;
107
+ }
108
+
102
109
  ca->obj_type = CA_OBJ_RECORD;
103
110
  ca->data_type = CA_FIXLEN;
104
111
  ca->flags = CA_FLAG_IS_FACE;
@@ -118,9 +125,6 @@ ca_record_setup (CARecord *ca, CArray *parent, VALUE data_class)
118
125
 
119
126
  ca->data_class = data_class;
120
127
 
121
- if ( ca_has_mask(parent) ) {
122
- ca_create_mask((CArray *) ca);
123
- }
124
128
 
125
129
  if ( ca_is_scalar(parent) ) {
126
130
  ca_set_flag(ca, CA_FLAG_SCALAR);
@@ -136,8 +140,11 @@ ca_record_setup (CARecord *ca, CArray *parent, VALUE data_class)
136
140
  CARecord *
137
141
  ca_record_new (CArray *parent, VALUE data_class)
138
142
  {
139
- CARecord *ca = (CARecord *) ca_array_alloc(CA_OBJ_RECORD, parent->ndim);
143
+ CARecord *ca;
144
+ ca_record_setup(NULL, parent, data_class);
145
+ ca = (CARecord *) ca_array_alloc(CA_OBJ_RECORD, parent->ndim);
140
146
  ca_record_setup(ca, parent, data_class);
147
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
141
148
  return ca;
142
149
  }
143
150
 
@@ -175,18 +182,6 @@ ca_record_func_allocate (void *ap)
175
182
  ca->ptr = ca->parent->ptr;
176
183
  }
177
184
 
178
- static void
179
- ca_record_func_create_mask (void *ap)
180
- {
181
- CARecord *ca = (CARecord *) ap;
182
- ca_update_mask(ca->parent);
183
- if ( ! ca->parent->mask ) {
184
- ca_create_mask(ca->parent);
185
- }
186
- ca->mask = (CArray *) ca_refer_new(ca->parent->mask,
187
- CA_BOOLEAN, ca->ndim, ca->dim, 0, 0);
188
- }
189
-
190
185
  ca_operation_function_t ca_record_func = {
191
186
  -1, /* CA_OBJ_RECORD — filled by ca_install_obj_type */
192
187
  CA_VIEW_ARRAY,
@@ -197,7 +192,7 @@ ca_operation_function_t ca_record_func = {
197
192
  ca_face_sync,
198
193
  ca_face_detach,
199
194
  ca_face_fill_data,
200
- ca_record_func_create_mask,
195
+ ca_view_func_create_mask,
201
196
  ca_face_xfer_index,
202
197
  ca_face_xfer_addrs,
203
198
  NULL, /* fold_stride: identity Face is not foldable */
@@ -230,6 +225,19 @@ ca_record_build (VALUE klass, VALUE data_class, VALUE parent_val)
230
225
  "CARecord requires a CA_FIXLEN parent (got data_type=%d)",
231
226
  parent_ca->data_type);
232
227
  }
228
+ /* Each record is read and written at the data_class's member offsets,
229
+ so the parent's cells have to be exactly that size. */
230
+ {
231
+ ca_size_t record_bytes =
232
+ NUM2SIZE(rb_const_get(data_class, rb_intern("DATA_SIZE")));
233
+ if ( parent_ca->bytes != record_bytes ) {
234
+ rb_raise(rb_eArgError,
235
+ "CARecord: %"PRIsVALUE" records are %lld bytes, the array's "
236
+ "elements are %lld bytes",
237
+ data_class, (long long) record_bytes,
238
+ (long long) parent_ca->bytes);
239
+ }
240
+ }
233
241
  ca = ca_record_new(parent_ca, data_class);
234
242
  obj = TypedData_Wrap_Struct(klass, &carecord_data_type, ca);
235
243
  rb_ca_set_parent(obj, parent_val);
@@ -268,9 +276,7 @@ rb_ca_record_s_new (int argc, VALUE *argv, VALUE klass)
268
276
  shape_offset = 1;
269
277
  }
270
278
  ndim = argc - shape_offset;
271
- if ( ndim < 0 || ndim > CA_RANK_MAX ) {
272
- rb_raise(rb_eArgError, "invalid number of shape arguments (%d)", ndim);
273
- }
279
+ ca_check_rank_fits(ndim, NULL);
274
280
  for ( i = 0; i < ndim; i++ ) {
275
281
  dim[i] = NUM2SIZE(argv[shape_offset + i]);
276
282
  }
@@ -280,7 +286,9 @@ rb_ca_record_s_new (int argc, VALUE *argv, VALUE klass)
280
286
  }
281
287
  bytes = NUM2SIZE(rb_const_get(data_class, rb_intern("DATA_SIZE")));
282
288
 
283
- parent_val = rb_carray_new(CA_FIXLEN, ndim, dim, bytes, NULL);
289
+ /* Zero-filled, as CArray.new is: a new record holds zeros, not the bytes
290
+ the allocator last handed out. */
291
+ parent_val = rb_carray_new_safe(CA_FIXLEN, ndim, dim, bytes, NULL);
284
292
  return ca_record_build(klass, data_class, parent_val);
285
293
  }
286
294
 
@@ -328,7 +336,7 @@ rb_ca_record_s_data_class_dsl (int argc, VALUE *argv, VALUE klass)
328
336
  }
329
337
  rb_scan_args(argc, argv, "1", &given);
330
338
  if ( ! NIL_P(current) ) {
331
- rb_raise(rb_eRuntimeError,
339
+ rb_raise(rb_eArgError,
332
340
  "data_class already fixed to %"PRIsVALUE
333
341
  "; CARecord subclass data_class is immutable once set",
334
342
  current);
@@ -352,11 +360,17 @@ rb_ca_record_initialize_copy (VALUE self, VALUE other)
352
360
  {
353
361
  CARecord *ca, *cs;
354
362
  TypedData_Get_Struct(self, CARecord, &carecord_data_type, ca);
363
+ ca_check_uninitialized(ca);
355
364
  TypedData_Get_Struct(other, CARecord, &carecord_data_type, cs);
356
365
  if ( ca_func[CA_OBJ_RECORD].pool_init ) {
357
366
  ca_array_pool_alloc(ca, CA_OBJ_RECORD, cs->parent->ndim);
358
367
  }
359
368
  ca_record_setup(ca, cs->parent, cs->data_class);
369
+ ca_view_inherit_mask((VALUE) ca);
370
+ /* Marshal loads into an empty instance through here without copying
371
+ ivars, so the parent pin is set from `other`, not inherited. */
372
+ rb_ca_set_parent(self, rb_ca_parent(other));
373
+ rb_ivar_set(self, rb_intern("member"), rb_hash_new());
360
374
  return self;
361
375
  }
362
376
 
@@ -401,7 +415,7 @@ ca_check_data_class (VALUE rtype)
401
415
  {
402
416
  if ( ! rb_obj_is_data_class(rtype) ) {
403
417
  VALUE inspect = rb_inspect(rtype);
404
- rb_raise(rb_eRuntimeError,
418
+ rb_raise(rb_eTypeError,
405
419
  "<%s> is not a data_class, which should has the features\n" \
406
420
  " * constant data_class::DATA_SIZE -> integer\n" \
407
421
  " * constant data_class::MEMBERS -> array of string\n" \
@@ -429,6 +443,26 @@ ca_record_state_compatible (CArray *a, CArray *b)
429
443
  return (ra->data_class == rb->data_class) ? 1 : 0;
430
444
  }
431
445
 
446
+ /* Write hook: a struct element becomes its bytes, on every store path (a
447
+ block or index store writes to the storage, below the Face, where the
448
+ element itself could not be cast). A struct of another data_class is
449
+ refused; anything else is left to the fixlen store (a String is bytes). */
450
+ static VALUE
451
+ ca_record_element_to_storage (VALUE self, VALUE obj)
452
+ {
453
+ volatile VALUE data_class = rb_ca_data_class(self);
454
+ if ( rb_obj_is_kind_of(obj, data_class) ) {
455
+ return rb_funcall(obj, rb_intern("encode"), 0);
456
+ }
457
+ if ( RB_TYPE_P(obj, T_OBJECT) && ! RB_TYPE_P(obj, T_STRING)
458
+ && RTEST(rb_obj_is_data_class(rb_obj_class(obj))) ) {
459
+ rb_raise(rb_eTypeError,
460
+ "a %"PRIsVALUE" is not an element of a record array of %"PRIsVALUE,
461
+ rb_obj_class(obj), data_class);
462
+ }
463
+ return obj;
464
+ }
465
+
432
466
  /* ------------------------------------------------------------------------- */
433
467
 
434
468
  void
@@ -454,6 +488,12 @@ Init_ca_obj_record (void)
454
488
  ca_face_register_state_compatible(CA_OBJ_RECORD,
455
489
  ca_record_state_compatible);
456
490
 
491
+ /* The record's bytes are its members: a MemoryView consumer reads them
492
+ through the T{...} struct format built from the data_class. */
493
+ ca_face_register_memory_view(CA_OBJ_RECORD, 1);
494
+ ca_face_register_element_to_storage(CA_OBJ_RECORD,
495
+ ca_record_element_to_storage);
496
+
457
497
  rb_define_alloc_func(rb_cCARecord, rb_ca_record_s_allocate);
458
498
  rb_define_method(rb_cCARecord, "initialize_copy",
459
499
  rb_ca_record_initialize_copy, 1);
data/ext/ca_obj_reduce.c CHANGED
@@ -56,6 +56,12 @@ ca_reduce_setup (CAReduce *ca, CArray *parent, ca_size_t count, ca_size_t offset
56
56
  "[BUG] CAReduce can't inherit other than boolean array");
57
57
  }
58
58
 
59
+ /* ca == NULL asks for the checks above only, so that a constructor can
60
+ run them before it allocates. */
61
+ if ( ca == NULL ) {
62
+ return 0;
63
+ }
64
+
59
65
  elements = parent->elements / count;
60
66
 
61
67
  ca->obj_type = CA_OBJ_REDUCE;
@@ -75,9 +81,6 @@ ca_reduce_setup (CAReduce *ca, CArray *parent, ca_size_t count, ca_size_t offset
75
81
  ca->count = count;
76
82
  ca->offset = offset;
77
83
 
78
- if ( ca_has_mask(parent) ) {
79
- ca_create_mask(ca);
80
- }
81
84
 
82
85
  if ( ca_is_scalar(parent) ) {
83
86
  ca_set_flag(ca, CA_FLAG_SCALAR);
@@ -89,8 +92,11 @@ ca_reduce_setup (CAReduce *ca, CArray *parent, ca_size_t count, ca_size_t offset
89
92
  CAReduce *
90
93
  ca_reduce_new (CArray *parent, ca_size_t count, ca_size_t offset)
91
94
  {
92
- CAReduce *ca = ALLOC(CAReduce);
95
+ CAReduce *ca;
96
+ ca_reduce_setup(NULL, parent, count, offset);
97
+ ca = ALLOC(CAReduce);
93
98
  ca_reduce_setup(ca, parent, count, offset);
99
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
94
100
  return ca;
95
101
  }
96
102
 
@@ -162,6 +168,7 @@ static void
162
168
  ca_reduce_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
163
169
  ca_size_t *strides, void *data, int dir)
164
170
  {
171
+ if ( ca_region_is_empty(((CArray *) ap)->ndim, counts) ) return;
165
172
  CAReduce *ca = (CAReduce *) ap;
166
173
  int8_t ndim = ca->ndim;
167
174
  ca_size_t native[CA_RANK_MAX], idx[CA_RANK_MAX];
@@ -192,8 +199,7 @@ ca_reduce_func_allocate (void *ap)
192
199
  {
193
200
  CAReduce *ca = (CAReduce *) ap;
194
201
  ca_attach(ca->parent);
195
- /* ca->ptr = ALLOC_N(char, ca->elements); */
196
- ca->ptr = xmalloc(ca_length(ca));
202
+ ca->ptr = ca_alloc_cells((CArray *) ca);
197
203
  }
198
204
 
199
205
  static void
@@ -203,8 +209,7 @@ ca_reduce_func_attach (void *ap)
203
209
  char *p;
204
210
  ca_size_t i;
205
211
  ca_attach(ca->parent);
206
- /* ca->ptr = ALLOC_N(char, ca->elements); */
207
- ca->ptr = xmalloc(ca_length(ca));
212
+ ca->ptr = ca_alloc_cells((CArray *) ca);
208
213
  p = ca->ptr;
209
214
  for (i=0; i<ca->elements; i++) {
210
215
  ca_reduce_func_xfer_addrs(ca, 1, &i, p, CA_XFER_GET);
@@ -224,8 +229,7 @@ ca_reduce_func_sync (void *ap)
224
229
  ca_reduce_func_xfer_addrs(ca, 1, &i, p, CA_XFER_PUT);
225
230
  p++;
226
231
  }
227
- ca_sync(ca->parent);
228
- ca_detach(ca->parent);
232
+ ca_sync_detach(ca->parent);
229
233
  }
230
234
 
231
235
  static void
@@ -264,8 +268,7 @@ ca_reduce_func_fill_data (void *ap, void *ptr)
264
268
  for (i=0; i<ca->elements; i++) {
265
269
  ca_reduce_func_xfer_addrs(ca, 1, &i, ptr, CA_XFER_PUT);
266
270
  }
267
- ca_sync(ca->parent);
268
- ca_detach(ca->parent);
271
+ ca_sync_detach(ca->parent);
269
272
  }
270
273
 
271
274
  static void
@@ -273,10 +276,7 @@ ca_reduce_func_create_mask (void *ap)
273
276
  {
274
277
  CAReduce *ca = (CAReduce *) ap;
275
278
 
276
- ca_update_mask(ca->parent);
277
- if ( ! ca->parent->mask ) {
278
- ca_create_mask(ca->parent);
279
- }
279
+ ca_create_mask(ca->parent);
280
280
 
281
281
  ca->mask = (CArray *) ca_reduce_new(ca->parent->mask, ca->count, ca->offset);
282
282
  }
@@ -314,9 +314,11 @@ rb_ca_reduce_initialize_copy (VALUE self, VALUE other)
314
314
  CAReduce *ca, *cs;
315
315
 
316
316
  TypedData_Get_Struct(self, CAReduce, &careduce_data_type, ca);
317
+ ca_check_uninitialized(ca);
317
318
  TypedData_Get_Struct(other, CAReduce, &careduce_data_type, cs);
318
319
 
319
320
  ca_reduce_setup(ca, cs->parent, cs->count, cs->offset);
321
+ ca_view_inherit_mask((VALUE) ca);
320
322
 
321
323
  return self;
322
324
  }