carray 3.0.3 → 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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +264 -0
  3. data/README.md +3 -2
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +1 -6
  7. data/ext/ca_axis_group.c +27 -27
  8. data/ext/ca_binop_dispatch.c +1 -29
  9. data/ext/ca_binop_dispatch.h +0 -1
  10. data/ext/ca_categorical_iterator.c +205 -134
  11. data/ext/ca_compare.c +7 -18
  12. data/ext/ca_group_iter.c +16 -17
  13. data/ext/ca_kernel_iterator.c +1234 -1994
  14. data/ext/ca_kernel_iterator.h +391 -437
  15. data/ext/ca_monop_dispatch.c +82 -59
  16. data/ext/ca_monop_dispatch.h +1 -0
  17. data/ext/ca_obj_array.c +96 -39
  18. data/ext/ca_obj_bincmp.c +24 -21
  19. data/ext/ca_obj_binop.c +15 -26
  20. data/ext/ca_obj_bitarray.c +3 -2
  21. data/ext/ca_obj_bitfield.c +5 -6
  22. data/ext/ca_obj_block.c +18 -9
  23. data/ext/ca_obj_byte_swap.c +5 -6
  24. data/ext/ca_obj_const_string.c +173 -19
  25. data/ext/ca_obj_face.c +238 -57
  26. data/ext/ca_obj_face.h +19 -0
  27. data/ext/ca_obj_fake.c +15 -29
  28. data/ext/ca_obj_farray.c +6 -3
  29. data/ext/ca_obj_field.c +17 -5
  30. data/ext/ca_obj_fixlen_string.c +2 -3
  31. data/ext/ca_obj_grid.c +406 -132
  32. data/ext/ca_obj_meld.c +172 -34
  33. data/ext/ca_obj_moncmp.c +23 -8
  34. data/ext/ca_obj_monop.c +67 -57
  35. data/ext/ca_obj_object.c +157 -51
  36. data/ext/ca_obj_record.c +12 -7
  37. data/ext/ca_obj_reduce.c +13 -8
  38. data/ext/ca_obj_refer.c +25 -27
  39. data/ext/ca_obj_remap.c +30 -9
  40. data/ext/ca_obj_repeat.c +9 -10
  41. data/ext/ca_obj_roll.c +6 -5
  42. data/ext/ca_obj_select.c +14 -9
  43. data/ext/ca_obj_select_axis.c +15 -47
  44. data/ext/ca_obj_shift.c +11 -1
  45. data/ext/ca_obj_stack.c +179 -34
  46. data/ext/ca_obj_stride.c +162 -115
  47. data/ext/ca_obj_string.c +71 -4
  48. data/ext/ca_obj_tile.c +6 -5
  49. data/ext/ca_obj_time.c +22 -6
  50. data/ext/ca_obj_timedelta.c +22 -6
  51. data/ext/ca_obj_transpose.c +5 -3
  52. data/ext/ca_obj_triop.c +23 -32
  53. data/ext/ca_obj_window.c +190 -26
  54. data/ext/ca_sweep_engine.c +2 -2
  55. data/ext/caframe_csv_reader.c +80 -1
  56. data/ext/carray.h +181 -75
  57. data/ext/carray_access.c +184 -96
  58. data/ext/carray_address_basis.c +343 -87
  59. data/ext/carray_attribute.c +89 -6
  60. data/ext/carray_bincount.c +10 -8
  61. data/ext/carray_broadcast.c +13 -8
  62. data/ext/carray_build_flags.h +3 -0
  63. data/ext/carray_call_cfunc.c +108 -0
  64. data/ext/carray_cast.c +142 -24
  65. data/ext/carray_cast_func.rb +46 -6
  66. data/ext/carray_class.c +4 -3
  67. data/ext/carray_config.h +28 -0
  68. data/ext/carray_conversion.c +16 -7
  69. data/ext/carray_copy.c +51 -14
  70. data/ext/carray_core.c +147 -55
  71. data/ext/carray_count.c +50 -20
  72. data/ext/carray_element.c +76 -33
  73. data/ext/carray_factorize.c +118 -64
  74. data/ext/carray_generate.c +191 -50
  75. data/ext/carray_histogram.c +62 -17
  76. data/ext/carray_hold.c +12 -15
  77. data/ext/carray_index_classifier.c +388 -176
  78. data/ext/carray_internal.h +336 -29
  79. data/ext/carray_kernels_bincmp.c +4453 -0
  80. data/ext/carray_kernels_binop.c +11368 -0
  81. data/ext/carray_kernels_init.c +1734 -0
  82. data/ext/carray_kernels_moncmp.c +2104 -0
  83. data/ext/carray_kernels_monop.c +18369 -0
  84. data/ext/carray_kernels_reduce_aggregate.c +23818 -0
  85. data/ext/carray_kernels_reduce_boolean.c +406 -0
  86. data/ext/carray_kernels_reduce_cumulative.c +10086 -0
  87. data/ext/carray_kernels_reduce_extreme.c +17634 -0
  88. data/ext/carray_kernels_reduce_variance.c +3849 -0
  89. data/ext/carray_kernels_scan.c +4302 -0
  90. data/ext/carray_kernels_search.c +33829 -0
  91. data/ext/carray_kernels_sort.c +10906 -0
  92. data/ext/carray_kernels_triop.c +1864 -0
  93. data/ext/carray_key_windows.c +216 -0
  94. data/ext/carray_lazy.c +170 -111
  95. data/ext/carray_mask.c +292 -72
  96. data/ext/carray_median_percentile.c +82 -28
  97. data/ext/carray_memory_view.c +669 -561
  98. data/ext/carray_operator.c +124 -47
  99. data/ext/carray_order.c +384 -76
  100. data/ext/carray_partition.c +28 -27
  101. data/ext/carray_random.c +67 -13
  102. data/ext/carray_round.c +273 -0
  103. data/ext/carray_scatter.c +63 -38
  104. data/ext/carray_segment.c +3 -3
  105. data/ext/carray_slab.c +91 -28
  106. data/ext/carray_sort.c +35 -35
  107. data/ext/carray_struct.c +19 -18
  108. data/ext/carray_test.c +26 -5
  109. data/ext/carray_undef.c +4 -0
  110. data/ext/carray_utils.c +246 -45
  111. data/ext/mk_call_cfunc.rb +19 -2
  112. data/ext/mkkernel.rb +198 -240
  113. data/ext/ruby_carray.c +10 -4
  114. data/ext/version.h +4 -4
  115. data/lib/carray/attribute.rb +126 -22
  116. data/lib/carray/autoload_carray.rb +8 -31
  117. data/lib/carray/autoload_method_extension.rb +14 -5
  118. data/lib/carray/axis_group.rb +255 -106
  119. data/lib/carray/basics.rb +78 -10
  120. data/lib/carray/bincount_nd.rb +12 -2
  121. data/lib/carray/block_iterator.rb +126 -23
  122. data/lib/carray/boolean_reduce.rb +17 -17
  123. data/lib/carray/categorical.rb +165 -43
  124. data/lib/carray/categorical_iterator.rb +130 -27
  125. data/lib/carray/complex.rb +5 -5
  126. data/lib/carray/conditional.rb +67 -18
  127. data/lib/carray/const_string.rb +14 -5
  128. data/lib/carray/construct.rb +15 -11
  129. data/lib/carray/data_type_extension.rb +1 -0
  130. data/lib/carray/distance_limit.rb +77 -0
  131. data/lib/carray/fixlen_string.rb +7 -1
  132. data/lib/carray/frame/column_verbs.rb +70 -0
  133. data/lib/carray/frame/convert.rb +69 -0
  134. data/lib/carray/frame/csv_parser.rb +111 -17
  135. data/lib/carray/frame/describe.rb +3 -2
  136. data/lib/carray/frame/frame.rb +246 -21
  137. data/lib/carray/frame/group.rb +510 -95
  138. data/lib/carray/frame/io.rb +115 -28
  139. data/lib/carray/frame/join.rb +312 -51
  140. data/lib/carray/frame/records.rb +83 -7
  141. data/lib/carray/frame/reshape.rb +42 -35
  142. data/lib/carray/frame/sort.rb +7 -19
  143. data/lib/carray/frame/verbs.rb +188 -48
  144. data/lib/carray/frame/windows.rb +117 -0
  145. data/lib/carray/frame.rb +2 -0
  146. data/lib/carray/fuse_source.rb +11 -4
  147. data/lib/carray/fusion.rb +40 -16
  148. data/lib/carray/histogram.rb +6 -1
  149. data/lib/carray/inspect.rb +31 -8
  150. data/lib/carray/iterator.rb +85 -7
  151. data/lib/carray/key_windows.rb +620 -0
  152. data/lib/carray/lazy.rb +182 -183
  153. data/lib/carray/mask_gap_fill.rb +63 -57
  154. data/lib/carray/meld_reduce.rb +12 -14
  155. data/lib/carray/methods/bin.rb +26 -18
  156. data/lib/carray/methods/bincount.rb +16 -0
  157. data/lib/carray/methods/bit_string.rb +1 -1
  158. data/lib/carray/methods/choose.rb +16 -3
  159. data/lib/carray/methods/composition.rb +3 -1
  160. data/lib/carray/methods/gather_nd.rb +14 -5
  161. data/lib/carray/methods/insert_block.rb +2 -2
  162. data/lib/carray/methods/is_between.rb +59 -0
  163. data/lib/carray/methods/is_in.rb +53 -36
  164. data/lib/carray/methods/join.rb +1 -6
  165. data/lib/carray/methods/lag.rb +49 -0
  166. data/lib/carray/methods/locate_addr.rb +47 -51
  167. data/lib/carray/methods/mode.rb +1 -1
  168. data/lib/carray/methods/nunique.rb +11 -6
  169. data/lib/carray/methods/resize.rb +3 -3
  170. data/lib/carray/methods/value_counts.rb +4 -11
  171. data/lib/carray/record_order.rb +3 -3
  172. data/lib/carray/rng.rb +3 -0
  173. data/lib/carray/runtime.rb +53 -8
  174. data/lib/carray/segment_iterator.rb +313 -82
  175. data/lib/carray/serialize.rb +24 -10
  176. data/lib/carray/slab_iterator.rb +50 -0
  177. data/lib/carray/string.rb +105 -5
  178. data/lib/carray/string_operation_extension.rb +8 -1
  179. data/lib/carray/struct.rb +9 -21
  180. data/lib/carray/struct_builder.rb +19 -8
  181. data/lib/carray/time.rb +726 -104
  182. data/lib/carray/window_iterator.rb +122 -16
  183. data/lib/carray.rb +7 -0
  184. data/yard-stubs/ca_obj_bitfield.rb +1 -1
  185. data/yard-stubs/ca_obj_field.rb +4 -0
  186. data/yard-stubs/ca_obj_grid.rb +21 -10
  187. data/yard-stubs/ca_obj_refer.rb +2 -1
  188. data/yard-stubs/ca_obj_roll.rb +2 -2
  189. data/yard-stubs/ca_obj_shift.rb +5 -1
  190. data/yard-stubs/ca_obj_tile.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +8 -3
  192. data/yard-stubs/carray_access.rb +6 -1
  193. data/yard-stubs/carray_attribute.rb +0 -5
  194. data/yard-stubs/carray_cast.rb +10 -0
  195. data/yard-stubs/carray_conversion.rb +2 -1
  196. data/yard-stubs/carray_copy.rb +4 -2
  197. data/yard-stubs/carray_count.rb +4 -4
  198. data/yard-stubs/carray_element.rb +10 -4
  199. data/yard-stubs/carray_generate.rb +21 -1
  200. data/yard-stubs/carray_mask.rb +26 -2
  201. data/yard-stubs/carray_math.rb +27 -1
  202. data/yard-stubs/carray_median_percentile.rb +5 -2
  203. data/yard-stubs/carray_memory_view.rb +40 -23
  204. data/yard-stubs/carray_order.rb +29 -18
  205. data/yard-stubs/carray_random.rb +13 -4
  206. data/yard-stubs/carray_scatter.rb +14 -9
  207. data/yard-stubs/carray_slab.rb +9 -2
  208. data/yard-stubs/carray_sort.rb +6 -5
  209. data/yard-stubs/carray_test.rb +5 -3
  210. metadata +25 -3
  211. data/lib/carray/arrow_tensor.rb +0 -401
  212. data/lib/carray/table.rb +0 -108
data/ext/ca_obj_tile.c CHANGED
@@ -116,9 +116,6 @@ ca_tile_setup (CATile *ca, CArray *parent, ca_size_t *reps)
116
116
  ca->dim[i] = parent->dim[i] * reps[i];
117
117
  }
118
118
 
119
- if ( ca_has_mask(parent) ) {
120
- ca_create_mask(ca);
121
- }
122
119
 
123
120
  return 0;
124
121
  }
@@ -130,6 +127,7 @@ ca_tile_new (CArray *parent, ca_size_t *reps)
130
127
  ca_tile_setup(NULL, parent, reps);
131
128
  ca = ALLOC(CATile);
132
129
  ca_tile_setup(ca, parent, reps);
130
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
133
131
  return ca;
134
132
  }
135
133
 
@@ -244,6 +242,7 @@ ca_tile_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
244
242
  ca_size_t idx[CA_RANK_MAX], doff = 0, base = 0;
245
243
  for (k = 0; k < ndim; k++) base += starts[k] * tnative[k];
246
244
  for (k = 0; k < ndim; k++) idx[k] = 0;
245
+ /* empty: the slot returns on an empty region at its entry */
247
246
  while (1) {
248
247
  ca_size_t toff = base, tidx[CA_RANK_MAX];
249
248
  for (k = 0; k < ndim; k++) toff += idx[k] * strides[k];
@@ -258,6 +257,7 @@ ca_tile_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
258
257
  }
259
258
 
260
259
  for (k = 0; k < ndim; k++) o[k] = 0;
260
+ /* empty: the slot returns on an empty region at its entry */
261
261
  while (1) {
262
262
  ca_size_t pbase = 0, doff = 0, i;
263
263
  for (k = 0; k < inner; k++) {
@@ -403,7 +403,7 @@ ca_tile_func_allocate (void *ap)
403
403
  {
404
404
  CATile *ca = (CATile *) ap;
405
405
  ca_attach(ca->parent);
406
- ca->ptr = xmalloc(ca_length(ca));
406
+ ca->ptr = ca_alloc_cells((CArray *) ca);
407
407
  }
408
408
 
409
409
  static void
@@ -411,7 +411,7 @@ ca_tile_func_attach (void *ap)
411
411
  {
412
412
  CATile *ca = (CATile *) ap;
413
413
  ca_attach(ca->parent);
414
- ca->ptr = xmalloc(ca_length(ca));
414
+ ca->ptr = ca_alloc_cells((CArray *) ca);
415
415
  ca_tile_attach_into(ca, ca->ptr);
416
416
  }
417
417
 
@@ -585,6 +585,7 @@ rb_ca_tile_initialize_copy (VALUE self, VALUE other)
585
585
  ca_check_uninitialized(ca);
586
586
  TypedData_Get_Struct(other, CATile, &catile_data_type, cs);
587
587
  ca_tile_setup(ca, cs->parent, cs->reps);
588
+ ca_view_inherit_mask((VALUE) ca);
588
589
  return self;
589
590
  }
590
591
 
data/ext/ca_obj_time.c CHANGED
@@ -154,6 +154,21 @@ rb_ca_time_element_initialize (VALUE self, VALUE value, VALUE unit)
154
154
  return self;
155
155
  }
156
156
 
157
+ /* dup / clone copy the value and the unit (the allocator leaves both 0). */
158
+ static VALUE
159
+ rb_ca_time_element_initialize_copy (VALUE self, VALUE orig)
160
+ {
161
+ CATimeElement *s, *o;
162
+ if ( self == orig ) {
163
+ return self;
164
+ }
165
+ rb_check_frozen(self);
166
+ TypedData_Get_Struct(self, CATimeElement, &catime_element_data_type, s);
167
+ TypedData_Get_Struct(orig, CATimeElement, &catime_element_data_type, o);
168
+ *s = *o;
169
+ return self;
170
+ }
171
+
157
172
  static VALUE
158
173
  rb_ca_time_element_value (VALUE self)
159
174
  {
@@ -216,9 +231,6 @@ ca_time_setup (CATime *ca, CArray *parent, int8_t unit, int64_t count)
216
231
  ca->unit = unit;
217
232
  ca->count = count;
218
233
 
219
- if ( ca_has_mask(parent) ) {
220
- ca_create_mask((CArray *) ca);
221
- }
222
234
 
223
235
  if ( ca_is_scalar(parent) ) {
224
236
  ca_set_flag(ca, CA_FLAG_SCALAR);
@@ -238,6 +250,7 @@ ca_time_new (CArray *parent, int8_t unit, int64_t count)
238
250
  ca_time_setup(NULL, parent, unit, count);
239
251
  ca = (CATime *) ca_array_alloc(CA_OBJ_TIME, parent->ndim);
240
252
  ca_time_setup(ca, parent, unit, count);
253
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
241
254
  return ca;
242
255
  }
243
256
 
@@ -398,7 +411,7 @@ rb_ca_time_wrap (VALUE parent_val, int8_t unit, int64_t count)
398
411
  return obj;
399
412
  }
400
413
 
401
- /* __wrap__(raw, unit_spec) — primitive; unit_spec is Symbol / String /
414
+ /* wrap_storage(raw, unit_spec) — primitive; unit_spec is Symbol / String /
402
415
  Resolution / nil (normalized here). */
403
416
  static VALUE
404
417
  rb_ca_time_wrap_method (VALUE klass, VALUE raw, VALUE unit_spec)
@@ -479,6 +492,7 @@ rb_ca_time_initialize_copy (VALUE self, VALUE other)
479
492
  ca_array_pool_alloc(ca, CA_OBJ_TIME, cs->parent->ndim);
480
493
  }
481
494
  ca_time_setup(ca, cs->parent, cs->unit, cs->count);
495
+ ca_view_inherit_mask((VALUE) ca);
482
496
  return self;
483
497
  }
484
498
 
@@ -512,8 +526,8 @@ Init_ca_obj_time (void)
512
526
  rb_define_method(rb_cCATime, "initialize_copy",
513
527
  rb_ca_time_initialize_copy, 1);
514
528
 
515
- rb_define_singleton_method(rb_cCATime, "__wrap__",
516
- rb_ca_time_wrap_method, 2);
529
+ rb_define_private_method(rb_singleton_class(rb_cCATime), "wrap_storage",
530
+ rb_ca_time_wrap_method, 2);
517
531
  rb_define_method(rb_cCATime, "unit", rb_ca_time_unit, 0);
518
532
  rb_define_method(rb_cCATime, "storage_to_element",
519
533
  rb_ca_time_storage_to_element, 1);
@@ -539,6 +553,8 @@ Init_ca_obj_time (void)
539
553
  rb_ca_time_element_s_allocate);
540
554
  rb_define_method(rb_cCATimeElement, "initialize",
541
555
  rb_ca_time_element_initialize, 2);
556
+ rb_define_method(rb_cCATimeElement, "initialize_copy",
557
+ rb_ca_time_element_initialize_copy, 1);
542
558
  rb_define_method(rb_cCATimeElement, "value",
543
559
  rb_ca_time_element_value, 0);
544
560
  rb_define_method(rb_cCATimeElement, "unit",
@@ -133,6 +133,21 @@ rb_ca_timedelta_element_initialize (VALUE self, VALUE value, VALUE unit)
133
133
  return self;
134
134
  }
135
135
 
136
+ /* dup / clone copy the value and the unit (the allocator leaves both 0). */
137
+ static VALUE
138
+ rb_ca_timedelta_element_initialize_copy (VALUE self, VALUE orig)
139
+ {
140
+ CATimedeltaElement *s, *o;
141
+ if ( self == orig ) {
142
+ return self;
143
+ }
144
+ rb_check_frozen(self);
145
+ TypedData_Get_Struct(self, CATimedeltaElement, &catimedelta_element_data_type, s);
146
+ TypedData_Get_Struct(orig, CATimedeltaElement, &catimedelta_element_data_type, o);
147
+ *s = *o;
148
+ return self;
149
+ }
150
+
136
151
  static VALUE
137
152
  rb_ca_timedelta_element_value (VALUE self)
138
153
  {
@@ -197,9 +212,6 @@ ca_timedelta_setup (CATimedelta *ca, CArray *parent, int8_t unit, int64_t count)
197
212
  ca->unit = unit;
198
213
  ca->count = count;
199
214
 
200
- if ( ca_has_mask(parent) ) {
201
- ca_create_mask((CArray *) ca);
202
- }
203
215
 
204
216
  if ( ca_is_scalar(parent) ) {
205
217
  ca_set_flag(ca, CA_FLAG_SCALAR);
@@ -219,6 +231,7 @@ ca_timedelta_new (CArray *parent, int8_t unit, int64_t count)
219
231
  ca_timedelta_setup(NULL, parent, unit, count);
220
232
  ca = (CATimedelta *) ca_array_alloc(CA_OBJ_TIMEDELTA, parent->ndim);
221
233
  ca_timedelta_setup(ca, parent, unit, count);
234
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
222
235
  return ca;
223
236
  }
224
237
 
@@ -293,7 +306,7 @@ rb_ca_timedelta_wrap (VALUE parent_val, int8_t unit, int64_t count)
293
306
  return obj;
294
307
  }
295
308
 
296
- /* __wrap__(raw, unit_spec) — primitive; unit_spec is Symbol / String /
309
+ /* wrap_storage(raw, unit_spec) — primitive; unit_spec is Symbol / String /
297
310
  Resolution / nil (normalized here). */
298
311
  static VALUE
299
312
  rb_ca_timedelta_wrap_method (VALUE klass, VALUE raw, VALUE unit_spec)
@@ -333,6 +346,7 @@ rb_ca_timedelta_initialize_copy (VALUE self, VALUE other)
333
346
  ca_array_pool_alloc(ca, CA_OBJ_TIMEDELTA, cs->parent->ndim);
334
347
  }
335
348
  ca_timedelta_setup(ca, cs->parent, cs->unit, cs->count);
349
+ ca_view_inherit_mask((VALUE) ca);
336
350
  return self;
337
351
  }
338
352
 
@@ -403,8 +417,8 @@ Init_ca_obj_timedelta (void)
403
417
  rb_define_method(rb_cCATimedelta, "initialize_copy",
404
418
  rb_ca_timedelta_initialize_copy, 1);
405
419
 
406
- rb_define_singleton_method(rb_cCATimedelta, "__wrap__",
407
- rb_ca_timedelta_wrap_method, 2);
420
+ rb_define_private_method(rb_singleton_class(rb_cCATimedelta), "wrap_storage",
421
+ rb_ca_timedelta_wrap_method, 2);
408
422
  rb_define_method(rb_cCATimedelta, "unit", rb_ca_timedelta_unit, 0);
409
423
  rb_define_method(rb_cCATimedelta, "storage_to_element",
410
424
  rb_ca_timedelta_storage_to_element, 1);
@@ -428,6 +442,8 @@ Init_ca_obj_timedelta (void)
428
442
  rb_ca_timedelta_element_s_allocate);
429
443
  rb_define_method(rb_cCATimedeltaElement, "initialize",
430
444
  rb_ca_timedelta_element_initialize, 2);
445
+ rb_define_method(rb_cCATimedeltaElement, "initialize_copy",
446
+ rb_ca_timedelta_element_initialize_copy, 1);
431
447
  rb_define_method(rb_cCATimedeltaElement, "value",
432
448
  rb_ca_timedelta_element_value, 0);
433
449
  rb_define_method(rb_cCATimedeltaElement, "unit",
@@ -7,6 +7,7 @@
7
7
  ---------------------------------------------------------------------------- */
8
8
 
9
9
  #include "carray.h"
10
+ #include "carray_internal.h" /* ca_view_inherit_mask */
10
11
  #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
11
12
 
12
13
  extern ca_operation_function_t ca_stride_func;
@@ -64,9 +65,9 @@ ca_trans_setup (CAStride *ca, CArray *parent, ca_size_t *imap)
64
65
  return 0;
65
66
  }
66
67
 
67
- ca_stride_setup(ca, CA_OBJ_TRANSPOSE, parent,
68
- parent->data_type, parent->bytes,
69
- ndim, newdim, strides, 0);
68
+ ca_stride_setup_view(ca, CA_OBJ_TRANSPOSE, parent,
69
+ parent->data_type, parent->bytes,
70
+ ndim, newdim, strides, 0);
70
71
  return 0;
71
72
  }
72
73
 
@@ -77,6 +78,7 @@ ca_trans_new (CArray *parent, ca_size_t *imap)
77
78
  ca_trans_setup(NULL, parent, imap);
78
79
  ca = (CAStride *) ca_array_alloc(CA_OBJ_TRANSPOSE, parent->ndim);
79
80
  ca_trans_setup(ca, parent, imap);
81
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
80
82
  return ca;
81
83
  }
82
84
 
data/ext/ca_obj_triop.c CHANGED
@@ -163,6 +163,7 @@ ca_triop_setup (CATriOp *ca, CArray *op1, CArray *op2, CArray *op3,
163
163
  CATriOp *
164
164
  ca_triop_new (CArray *op1, CArray *op2, CArray *op3, uint16_t op_id)
165
165
  {
166
+ /* check: the setup checks nothing */
166
167
  CATriOp *ca = (CATriOp *) ca_array_alloc(CA_OBJ_TRIOP, op1->ndim);
167
168
  ca_triop_setup(ca, op1, op2, op3, op_id);
168
169
  return ca;
@@ -210,7 +211,7 @@ ca_triop_func_xfer_index (void *ap, ca_size_t *idx, void *data, int dir)
210
211
  ca_size_t s;
211
212
 
212
213
  if ( dir != CA_XFER_GET ) {
213
- rb_raise(rb_eRuntimeError, "CATriOp is read-only (xfer_index PUT)");
214
+ ca_refuse_read_only();
214
215
  }
215
216
 
216
217
  s = ca->bytes;
@@ -296,7 +297,7 @@ ca_triop_eval (CATriOp *to, const ca_lazy_req_t *req, void *data)
296
297
  "CATriOp: kernel not implemented (op_id=%u data_type=%d)",
297
298
  (unsigned) to->op_id, (int) to->data_type);
298
299
  }
299
- if ( to->data_type == CA_OBJECT ) {
300
+ if ( ca_op_raises_on_cell(CA_OP_KIND_TRIOP, to->op_id, to->data_type) ) {
300
301
  CArray *ops[3];
301
302
  ops[0] = to->parent;
302
303
  ops[1] = to->op2;
@@ -322,7 +323,7 @@ ca_triop_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
322
323
  if ( ca_region_is_empty(((CArray *) ap)->ndim, counts) ) return;
323
324
  ca_lazy_req_t req;
324
325
  if ( dir != CA_XFER_GET ) {
325
- rb_raise(rb_eRuntimeError, "CATriOp is read-only (xfer_stride PUT)");
326
+ ca_refuse_read_only();
326
327
  }
327
328
  ca_lazy_req_region(&req, ap, starts, counts, strides);
328
329
  ca_triop_eval((CATriOp *) ap, &req, data);
@@ -335,7 +336,7 @@ ca_triop_func_xfer_addrs (void *ap, ca_size_t n, ca_size_t *addrs,
335
336
  {
336
337
  ca_lazy_req_t req;
337
338
  if ( dir != CA_XFER_GET ) {
338
- rb_raise(rb_eRuntimeError, "CATriOp is read-only (xfer_addrs PUT)");
339
+ ca_refuse_read_only();
339
340
  }
340
341
  ca_lazy_req_addrs(&req, n, addrs);
341
342
  ca_triop_eval((CATriOp *) ap, &req, data);
@@ -358,15 +359,7 @@ static void
358
359
  ca_triop_func_allocate (void *ap)
359
360
  {
360
361
  CATriOp *ca = (CATriOp *) ap;
361
- ca->ptr = xmalloc(ca_length(ca));
362
- /* CA_OBJECT cells are VALUEs and this buffer is about to be marked as
363
- soon as the view is, so it must not be handed to the GC as raw
364
- xmalloc garbage. */
365
- if ( ca->data_type == CA_OBJECT ) {
366
- VALUE *p = (VALUE *) ca->ptr;
367
- ca_size_t i;
368
- for ( i = 0; i < ca->elements; i++ ) *p++ = Qnil;
369
- }
362
+ ca->ptr = ca_alloc_cells((CArray *) ca);
370
363
  }
371
364
 
372
365
  static void
@@ -381,19 +374,11 @@ ca_triop_func_attach (void *ap)
381
374
  int8_t k;
382
375
  ca_size_t s;
383
376
 
384
- ca->ptr = xmalloc(ca_length(ca));
377
+ ca->ptr = ca_alloc_cells((CArray *) ca);
385
378
 
386
379
  s = ca->bytes;
387
380
  for ( k = ca->ndim - 1; k >= 0; k-- ) { native[k] = s; s *= ca->dim[k]; }
388
381
  for ( k = 0; k < ca->ndim; k++ ) starts[k] = 0;
389
- /* CA_OBJECT cells are VALUEs and this buffer is about to be marked as
390
- soon as the view is, so it must not be handed to the GC as raw
391
- xmalloc garbage. */
392
- if ( ca->data_type == CA_OBJECT ) {
393
- VALUE *p = (VALUE *) ca->ptr;
394
- ca_size_t i;
395
- for ( i = 0; i < ca->elements; i++ ) *p++ = Qnil;
396
- }
397
382
  ca_triop_func_xfer_stride(ca, starts, ca->dim, native, ca->ptr, CA_XFER_GET);
398
383
  }
399
384
 
@@ -416,7 +401,7 @@ static void
416
401
  ca_triop_func_fill_data (void *ap, void *ptr)
417
402
  {
418
403
  (void) ap; (void) ptr;
419
- rb_raise(rb_eRuntimeError, "CATriOp is read-only (fill_data)");
404
+ ca_refuse_read_only();
420
405
  }
421
406
 
422
407
  /* Build out.mask on each read (CAMaskOfOperands): the three operands'
@@ -575,8 +560,7 @@ rb_ca_triop_build (VALUE cary1, VALUE cary2, VALUE cary3, uint16_t op_id)
575
560
 
576
561
  /* No kernel for that data_type: raise as the eager triop does. */
577
562
  if ( ca_triop_kernel_lookup_vvv(op_id, dt1) == ca_triop_not_implement ) {
578
- rb_raise(rb_eCADataTypeError,
579
- "invalid data_type for triop (not implemented)");
563
+ ca_op_refuse_unimplemented(cary1, dt1, rb_eCADataTypeError);
580
564
  }
581
565
  r1 = insert_cast(r1, dt1, &op1);
582
566
  r2 = insert_cast(r2, dt2, &op2);
@@ -589,10 +573,11 @@ rb_ca_triop_build (VALUE cary1, VALUE cary2, VALUE cary3, uint16_t op_id)
589
573
  CArray *anchor = NULL;
590
574
  volatile VALUE r_anchor = Qnil;
591
575
  int8_t anchor_ndim;
592
- /* Pick the largest-ndim non-scalar operand as anchor. */
593
- if ( op1->elements > 1 ) { anchor = op1; r_anchor = r1; }
594
- else if ( op2->elements > 1 ) { anchor = op2; r_anchor = r2; }
595
- else if ( op3->elements > 1 ) { anchor = op3; r_anchor = r3; }
576
+ /* The first operand that is not a scalar is the anchor. An array of
577
+ no cells is one (its shape is the walk's), not a scalar. */
578
+ if ( ! ca_is_scalar(op1) ) { anchor = op1; r_anchor = r1; }
579
+ else if ( ! ca_is_scalar(op2) ) { anchor = op2; r_anchor = r2; }
580
+ else if ( ! ca_is_scalar(op3) ) { anchor = op3; r_anchor = r3; }
596
581
  if ( anchor && anchor != op1 ) {
597
582
  /* op1 is a CScalar but the walk shape is determined by another
598
583
  operand. Lift op1 up to anchor's shape via
@@ -642,6 +627,7 @@ static VALUE
642
627
  rb_ca_triop_s_build (VALUE klass, VALUE cary1, VALUE cary2, VALUE cary3,
643
628
  VALUE op_id_val)
644
629
  {
630
+ /* fits: an operation number from the library's own table */
645
631
  uint16_t op_id = (uint16_t) NUM2UINT(op_id_val);
646
632
  (void) klass;
647
633
  return rb_ca_triop_build(cary1, cary2, cary3, op_id);
@@ -653,9 +639,10 @@ rb_ca_triop_s_build (VALUE klass, VALUE cary1, VALUE cary2, VALUE cary3,
653
639
  static VALUE
654
640
  rb_ca_triop_trapping (VALUE self)
655
641
  {
656
- CArray *ca;
657
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
658
- return ( ca->data_type == CA_OBJECT ) ? Qtrue : Qfalse;
642
+ CATriOp *to;
643
+ TypedData_Get_Struct(self, CATriOp, &catriop_data_type, to);
644
+ return ca_op_raises_on_cell(CA_OP_KIND_TRIOP, to->op_id, to->data_type)
645
+ ? Qtrue : Qfalse;
659
646
  }
660
647
 
661
648
  static VALUE
@@ -679,6 +666,7 @@ rb_ca_triop_op3 (VALUE self)
679
666
  }
680
667
 
681
668
  /* Test instrumentation. */
669
+ #ifdef CARRAY_DEV_BUILD
682
670
  static VALUE
683
671
  rb_ca_triop_s_reset_scratch_counter (VALUE klass)
684
672
  {
@@ -708,6 +696,7 @@ rb_ca_triop_s_materialise_count (VALUE klass)
708
696
  (void) klass;
709
697
  return SIZE2NUM(ca_triop_materialise_call_count);
710
698
  }
699
+ #endif /* CARRAY_DEV_BUILD */
711
700
 
712
701
  static VALUE
713
702
  rb_ca_triop_s_allocate (VALUE klass)
@@ -767,6 +756,7 @@ Init_ca_obj_triop (void)
767
756
  rb_ca_triop_op3, 0);
768
757
 
769
758
  /* Test instrumentation. */
759
+ #ifdef CARRAY_DEV_BUILD
770
760
  rb_define_singleton_method(rb_cCATriOp, "__reset_scratch_counter__",
771
761
  rb_ca_triop_s_reset_scratch_counter, 0);
772
762
  rb_define_singleton_method(rb_cCATriOp, "__scratch_count__",
@@ -775,4 +765,5 @@ Init_ca_obj_triop (void)
775
765
  rb_ca_triop_s_reset_materialise_counter, 0);
776
766
  rb_define_singleton_method(rb_cCATriOp, "__materialise_count__",
777
767
  rb_ca_triop_s_materialise_count, 0);
768
+ #endif
778
769
  }