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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +568 -0
- data/README.md +6 -6
- data/carray.gemspec +1 -1
- data/ext/ca_axis_descriptor.h +27 -24
- data/ext/ca_axis_dispatch.c +220 -0
- data/ext/ca_axis_group.c +201 -123
- data/ext/ca_binop_dispatch.c +46 -52
- data/ext/ca_binop_dispatch.h +1 -1
- data/ext/ca_categorical_iterator.c +249 -183
- data/ext/ca_compare.c +7 -12
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +38 -23
- data/ext/ca_kernel_iterator.c +1765 -2076
- data/ext/ca_kernel_iterator.h +584 -566
- data/ext/ca_monop_dispatch.c +86 -63
- data/ext/ca_monop_dispatch.h +5 -0
- data/ext/ca_obj_array.c +223 -56
- data/ext/ca_obj_bincmp.c +172 -138
- data/ext/ca_obj_binop.c +116 -230
- data/ext/ca_obj_bitarray.c +40 -26
- data/ext/ca_obj_bitfield.c +100 -68
- data/ext/ca_obj_block.c +19 -9
- data/ext/ca_obj_byte_swap.c +45 -46
- data/ext/ca_obj_const_string.c +269 -44
- data/ext/ca_obj_face.c +612 -89
- data/ext/ca_obj_face.h +111 -47
- data/ext/ca_obj_fake.c +36 -79
- data/ext/ca_obj_farray.c +7 -3
- data/ext/ca_obj_field.c +33 -8
- data/ext/ca_obj_fixlen_string.c +23 -24
- data/ext/ca_obj_grid.c +541 -210
- data/ext/ca_obj_meld.c +331 -111
- data/ext/ca_obj_moncmp.c +80 -65
- data/ext/ca_obj_monop.c +177 -149
- data/ext/ca_obj_object.c +664 -248
- data/ext/ca_obj_record.c +63 -23
- data/ext/ca_obj_reduce.c +18 -16
- data/ext/ca_obj_refer.c +140 -58
- data/ext/ca_obj_remap.c +85 -24
- data/ext/ca_obj_repeat.c +24 -9
- data/ext/ca_obj_roll.c +121 -16
- data/ext/ca_obj_select.c +61 -58
- data/ext/ca_obj_select_axis.c +73 -107
- data/ext/ca_obj_shift.c +32 -102
- data/ext/ca_obj_stack.c +372 -122
- data/ext/ca_obj_stride.c +348 -140
- data/ext/ca_obj_string.c +88 -22
- data/ext/ca_obj_tile.c +38 -21
- data/ext/ca_obj_time.c +45 -31
- data/ext/ca_obj_timedelta.c +43 -29
- data/ext/ca_obj_transpose.c +17 -6
- data/ext/ca_obj_triop.c +125 -141
- data/ext/ca_obj_window.c +330 -44
- data/ext/ca_op_ipower.c +24 -11
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +104 -81
- data/ext/ca_sweep_engine.h +7 -20
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +542 -0
- data/ext/carray.h +241 -92
- data/ext/carray_access.c +608 -276
- data/ext/carray_address_basis.c +494 -97
- data/ext/carray_attribute.c +129 -4
- data/ext/carray_bincount.c +39 -7
- data/ext/carray_broadcast.c +56 -19
- data/ext/carray_build_flags.h +1 -1
- data/ext/carray_call_cfunc.c +108 -28
- data/ext/carray_cast.c +1576 -223
- data/ext/carray_cast_func.rb +77 -24
- data/ext/carray_class.c +4 -3
- data/ext/carray_conversion.c +208 -75
- data/ext/carray_copy.c +82 -24
- data/ext/carray_core.c +646 -162
- data/ext/carray_count.c +171 -88
- data/ext/carray_element.c +94 -60
- data/ext/carray_factorize.c +670 -324
- data/ext/carray_generate.c +260 -83
- data/ext/carray_histogram.c +209 -106
- data/ext/carray_hold.c +14 -16
- data/ext/carray_index_classifier.c +422 -243
- data/ext/carray_internal.h +692 -3
- data/ext/carray_kernels_bincmp.c +7 -0
- data/ext/carray_kernels_binop.c +487 -120
- data/ext/carray_kernels_init.c +653 -50
- data/ext/carray_kernels_moncmp.c +15 -8
- data/ext/carray_kernels_monop.c +99 -43
- data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
- data/ext/carray_kernels_reduce_boolean.c +112 -36
- data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
- data/ext/carray_kernels_reduce_extreme.c +3032 -2892
- data/ext/carray_kernels_reduce_variance.c +439 -500
- data/ext/carray_kernels_scan.c +1097 -488
- data/ext/carray_kernels_search.c +3787 -2176
- data/ext/carray_kernels_sort.c +1200 -920
- data/ext/carray_kernels_triop.c +479 -7
- data/ext/carray_key_windows.c +216 -0
- data/ext/carray_lazy.c +967 -153
- data/ext/carray_loop.c +81 -65
- data/ext/carray_mask.c +910 -324
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +299 -100
- data/ext/carray_memory_view.c +872 -758
- data/ext/carray_operator.c +1171 -364
- data/ext/carray_order.c +505 -133
- data/ext/carray_partition.c +112 -65
- data/ext/carray_random.c +327 -239
- data/ext/carray_round.c +273 -0
- data/ext/carray_scatter.c +346 -78
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +249 -86
- data/ext/carray_sort.c +224 -227
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +118 -39
- data/ext/carray_test.c +193 -69
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_undef.c +4 -0
- data/ext/carray_utils.c +579 -113
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +19 -4
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1202 -1014
- data/ext/ruby_carray.c +17 -5
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +160 -17
- data/lib/carray/autoload_carray.rb +23 -27
- data/lib/carray/autoload_method_extension.rb +20 -5
- data/lib/carray/axis_group.rb +360 -63
- data/lib/carray/basics.rb +162 -28
- data/lib/carray/bincount_nd.rb +18 -2
- data/lib/carray/block_iterator.rb +231 -58
- data/lib/carray/boolean_reduce.rb +34 -42
- data/lib/carray/categorical.rb +242 -52
- data/lib/carray/categorical_iterator.rb +437 -827
- data/lib/carray/complex.rb +41 -34
- data/lib/carray/conditional.rb +150 -14
- data/lib/carray/const_string.rb +59 -4
- data/lib/carray/construct.rb +15 -11
- data/lib/carray/data_type_extension.rb +1 -0
- data/lib/carray/distance_limit.rb +77 -0
- data/lib/carray/fixlen_string.rb +7 -1
- data/lib/carray/frame/column_verbs.rb +70 -0
- data/lib/carray/frame/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +82 -7
- data/lib/carray/frame/csv_parser.rb +688 -87
- data/lib/carray/frame/describe.rb +80 -0
- data/lib/carray/frame/frame.rb +369 -45
- data/lib/carray/frame/group.rb +631 -90
- data/lib/carray/frame/io.rb +506 -79
- data/lib/carray/frame/join.rb +411 -62
- data/lib/carray/frame/records.rb +116 -19
- data/lib/carray/frame/reshape.rb +455 -0
- data/lib/carray/frame/sort.rb +30 -18
- data/lib/carray/frame/verbs.rb +868 -61
- data/lib/carray/frame/windows.rb +117 -0
- data/lib/carray/frame.rb +4 -0
- data/lib/carray/fuse_source.rb +118 -2
- data/lib/carray/fusion.rb +257 -42
- data/lib/carray/histogram.rb +6 -1
- data/lib/carray/inspect.rb +54 -13
- data/lib/carray/iterator.rb +99 -9
- data/lib/carray/key_windows.rb +620 -0
- data/lib/carray/lazy.rb +216 -193
- data/lib/carray/mask_gap_fill.rb +112 -92
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +52 -21
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bin.rb +26 -18
- data/lib/carray/methods/bincount.rb +18 -2
- data/lib/carray/methods/bit_string.rb +15 -4
- data/lib/carray/methods/choose.rb +16 -3
- data/lib/carray/methods/composition.rb +18 -10
- data/lib/carray/methods/factorize.rb +2 -2
- data/lib/carray/methods/gather_nd.rb +25 -5
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_between.rb +59 -0
- data/lib/carray/methods/is_in.rb +140 -10
- data/lib/carray/methods/join.rb +2 -7
- data/lib/carray/methods/lag.rb +49 -0
- data/lib/carray/methods/locate_addr.rb +182 -45
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/nunique.rb +11 -6
- data/lib/carray/methods/repeat.rb +1 -20
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +11 -2
- data/lib/carray/methods/value_counts.rb +4 -11
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/rng.rb +3 -0
- data/lib/carray/runtime.rb +65 -17
- data/lib/carray/segment_iterator.rb +1221 -0
- data/lib/carray/serialize.rb +214 -30
- data/lib/carray/slab_iterator.rb +101 -27
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string.rb +105 -5
- data/lib/carray/string_operation_extension.rb +12 -4
- data/lib/carray/struct.rb +137 -58
- data/lib/carray/struct_builder.rb +124 -17
- data/lib/carray/time.rb +1222 -186
- data/lib/carray/window_iterator.rb +242 -81
- data/lib/carray.rb +9 -2
- data/yard-stubs/ca_obj_array.rb +4 -4
- data/yard-stubs/ca_obj_bitarray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +23 -12
- data/yard-stubs/ca_obj_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +5 -1
- data/yard-stubs/ca_obj_grid.rb +21 -10
- data/yard-stubs/ca_obj_refer.rb +5 -4
- data/yard-stubs/ca_obj_roll.rb +2 -3
- data/yard-stubs/ca_obj_shift.rb +5 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_tile.rb +1 -1
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +9 -5
- data/yard-stubs/carray_access.rb +11 -5
- data/yard-stubs/carray_attribute.rb +0 -5
- data/yard-stubs/carray_broadcast.rb +1 -1
- data/yard-stubs/carray_cast.rb +88 -43
- data/yard-stubs/carray_conversion.rb +15 -2
- data/yard-stubs/carray_copy.rb +12 -5
- data/yard-stubs/carray_core.rb +3 -3
- data/yard-stubs/carray_count.rb +9 -0
- data/yard-stubs/carray_element.rb +10 -4
- data/yard-stubs/carray_generate.rb +21 -1
- data/yard-stubs/carray_lazy.rb +5 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +60 -12
- data/yard-stubs/carray_math.rb +52 -14
- data/yard-stubs/carray_median_percentile.rb +15 -8
- data/yard-stubs/carray_memory_view.rb +40 -23
- data/yard-stubs/carray_order.rb +61 -29
- data/yard-stubs/carray_random.rb +13 -4
- data/yard-stubs/carray_scatter.rb +21 -9
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +10 -2
- data/yard-stubs/carray_sort.rb +49 -8
- data/yard-stubs/carray_test.rb +15 -3
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +19 -5
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_kernels_map.c +0 -3467
- data/lib/carray/arrow_tensor.rb +0 -401
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|