carray 3.0.0 → 3.0.1
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/.yardopts +2 -1
- data/CHANGELOG.md +325 -3
- data/{NEWS.md → CHANGELOG.v1.md} +1 -1
- data/README.md +32 -32
- data/carray.gemspec +12 -8
- data/ext/ca_axis_group.c +55 -19
- data/ext/ca_binop_dispatch.c +5 -6
- data/ext/ca_binop_dispatch.h +0 -7
- data/ext/ca_categorical_iterator.c +13 -13
- data/ext/ca_for_each_element.h +6 -8
- data/ext/ca_group_iter.c +1 -1
- data/ext/ca_kernel_iterator.c +69 -23
- data/ext/ca_kernel_iterator.h +3 -10
- data/ext/ca_obj_bincmp.c +57 -27
- data/ext/ca_obj_binop.c +86 -30
- data/ext/ca_obj_const_string.c +3 -1
- data/ext/ca_obj_face.c +80 -0
- data/ext/ca_obj_face.h +33 -1
- data/ext/ca_obj_fake.c +11 -0
- data/ext/ca_obj_fixlen_string.c +3 -1
- data/ext/ca_obj_grid.c +11 -3
- data/ext/ca_obj_meld.c +13 -8
- data/ext/ca_obj_moncmp.c +33 -14
- data/ext/ca_obj_monop.c +19 -7
- data/ext/ca_obj_object.c +99 -4
- data/ext/ca_obj_record.c +3 -1
- data/ext/ca_obj_refer.c +30 -6
- data/ext/ca_obj_roll.c +13 -5
- data/ext/ca_obj_select_axis.c +16 -6
- data/ext/ca_obj_shift.c +3 -3
- data/ext/ca_obj_stride.c +106 -23
- data/ext/ca_obj_string.c +3 -1
- data/ext/ca_obj_tile.c +13 -5
- data/ext/ca_obj_time.c +3 -1
- data/ext/ca_obj_timedelta.c +3 -1
- data/ext/ca_obj_transpose.c +1 -1
- data/ext/ca_obj_triop.c +62 -23
- data/ext/ca_obj_window.c +86 -17
- data/ext/ca_op_cmplx64.h +123 -0
- data/ext/ca_op_ipower.c +0 -3
- data/ext/ca_sort_kernels.h +5 -5
- data/ext/ca_sweep_engine.c +78 -35
- data/ext/ca_sweep_engine.h +13 -4
- data/ext/ca_transform_common.c +7 -0
- data/ext/carray.h +127 -130
- data/ext/carray_access.c +56 -34
- data/ext/carray_bincount.c +8 -8
- data/ext/carray_broadcast.c +99 -6
- data/ext/carray_build_flags.h +3 -0
- data/ext/carray_call_cfunc.c +1491 -0
- data/ext/carray_call_cfunc.h +153 -0
- data/ext/carray_cast.c +69 -31
- data/ext/carray_conversion.c +22 -22
- data/ext/carray_copy.c +12 -2
- data/ext/carray_core.c +57 -10
- data/ext/carray_count.c +1 -1
- data/ext/carray_element.c +7 -7
- data/ext/carray_factorize.c +28 -28
- data/ext/carray_hold.c +1 -1
- data/ext/carray_index_classifier.c +7 -21
- data/ext/carray_internal.h +19 -3
- data/ext/carray_kernels_bincmp.c +1 -0
- data/ext/carray_kernels_binop.c +320 -298
- data/ext/carray_kernels_init.c +1095 -0
- data/ext/carray_kernels_map.c +1 -0
- data/ext/carray_kernels_moncmp.c +1 -0
- data/ext/carray_kernels_monop.c +412 -411
- data/ext/carray_kernels_reduce_aggregate.c +88 -87
- data/ext/carray_kernels_reduce_boolean.c +1 -0
- data/ext/carray_kernels_reduce_cumulative.c +54 -53
- data/ext/carray_kernels_reduce_extreme.c +51 -50
- data/ext/carray_kernels_reduce_variance.c +1 -0
- data/ext/carray_kernels_scan.c +1 -0
- data/ext/carray_kernels_search.c +93 -92
- data/ext/carray_kernels_sort.c +1 -0
- data/ext/carray_kernels_triop.c +1 -0
- data/ext/carray_lazy.c +175 -5
- data/ext/carray_mask.c +6 -5
- data/ext/carray_median_percentile.c +1 -1
- data/ext/carray_memory_view.c +46 -21
- data/ext/carray_operator.c +46 -49
- data/ext/carray_partition.c +4 -4
- data/ext/carray_random.c +7 -7
- data/ext/carray_scatter.c +1 -1
- data/ext/carray_sort.c +3 -3
- data/ext/carray_sort_kernel.c +10 -10
- data/ext/carray_test.c +1 -1
- data/ext/extconf.rb +18 -0
- data/ext/mk_call_cfunc.rb +243 -52
- data/ext/mkkernel.rb +354 -100
- data/ext/ruby_carray.c +18 -16
- data/ext/version.h +4 -4
- data/lib/carray/autoload_carray.rb +19 -0
- data/lib/carray/autoload_method_extension.rb +2 -1
- data/lib/carray/axis_group.rb +7 -7
- data/lib/carray/basics.rb +59 -59
- data/lib/carray/bincount_nd.rb +12 -12
- data/lib/carray/block_iterator.rb +24 -14
- data/lib/carray/categorical.rb +4 -4
- data/lib/carray/categorical_iterator.rb +98 -76
- data/lib/carray/conditional.rb +14 -14
- data/lib/carray/construct.rb +21 -0
- data/lib/carray/core_extensions.rb +62 -5
- data/lib/carray/data_type_extension.rb +18 -1
- data/lib/carray/frame/concat.rb +3 -3
- data/lib/carray/frame/convert.rb +1 -1
- data/lib/carray/frame/frame.rb +4 -11
- data/lib/carray/frame/io.rb +159 -2
- data/lib/carray/frame/sort.rb +1 -1
- data/lib/carray/frame/verbs.rb +18 -1
- data/lib/carray/fuse_source.rb +123 -0
- data/lib/carray/fusion.rb +218 -0
- data/lib/carray/histogram.rb +16 -16
- data/lib/carray/inspect.rb +1 -7
- data/lib/carray/iterator.rb +4 -3
- data/lib/carray/lazy.rb +125 -73
- data/lib/carray/meld_reduce.rb +2 -2
- data/lib/carray/methods/align_addr.rb +1 -1
- data/lib/carray/methods/composition.rb +1 -1
- data/lib/carray/methods/is_in.rb +12 -12
- data/lib/carray/methods/locate_addr.rb +6 -1
- data/lib/carray/methods/mask_duplicates.rb +1 -1
- data/lib/carray/methods/meshgrid.rb +4 -5
- data/lib/carray/methods/mode.rb +2 -2
- data/lib/carray/methods/nunique.rb +1 -1
- data/lib/carray/methods/snap.rb +7 -2
- data/lib/carray/methods/unique.rb +3 -3
- data/lib/carray/methods/value_counts.rb +2 -2
- data/lib/carray/runtime.rb +0 -19
- data/lib/carray/slab_iterator.rb +20 -7
- data/lib/carray/string_operation_extension.rb +5 -5
- data/lib/carray/time.rb +890 -491
- data/lib/carray/window_iterator.rb +285 -13
- data/lib/carray.rb +5 -5
- data/yard-stubs/ca_obj_array.rb +385 -0
- data/yard-stubs/ca_obj_bitarray.rb +38 -0
- data/yard-stubs/ca_obj_bitfield.rb +43 -0
- data/yard-stubs/ca_obj_block.rb +73 -0
- data/yard-stubs/ca_obj_byte_swap.rb +56 -0
- data/yard-stubs/ca_obj_fake.rb +31 -0
- data/yard-stubs/ca_obj_farray.rb +32 -0
- data/yard-stubs/ca_obj_field.rb +45 -0
- data/yard-stubs/ca_obj_grid.rb +35 -0
- data/yard-stubs/ca_obj_refer.rb +72 -0
- data/yard-stubs/ca_obj_roll.rb +45 -0
- data/yard-stubs/ca_obj_shift.rb +43 -0
- data/yard-stubs/ca_obj_stride.rb +181 -0
- data/yard-stubs/ca_obj_tile.rb +29 -0
- data/yard-stubs/ca_obj_transpose.rb +40 -0
- data/yard-stubs/ca_obj_window.rb +49 -0
- data/yard-stubs/carray_access.rb +131 -0
- data/yard-stubs/carray_attribute.rb +246 -0
- data/yard-stubs/carray_broadcast.rb +37 -0
- data/yard-stubs/carray_cast.rb +489 -0
- data/yard-stubs/carray_class.rb +65 -0
- data/yard-stubs/carray_conversion.rb +76 -0
- data/yard-stubs/carray_copy.rb +79 -0
- data/yard-stubs/carray_core.rb +114 -0
- data/yard-stubs/carray_count.rb +79 -0
- data/yard-stubs/carray_element.rb +108 -0
- data/yard-stubs/carray_generate.rb +66 -0
- data/yard-stubs/carray_lazy.rb +23 -0
- data/yard-stubs/carray_loop.rb +140 -0
- data/yard-stubs/carray_mask.rb +259 -0
- data/yard-stubs/carray_math.rb +132 -0
- data/yard-stubs/carray_mathfunc.rb +45 -0
- data/yard-stubs/carray_median_percentile.rb +89 -0
- data/yard-stubs/carray_memory_view.rb +163 -0
- data/yard-stubs/carray_order.rb +312 -0
- data/yard-stubs/carray_random.rb +89 -0
- data/yard-stubs/carray_scatter.rb +106 -0
- data/yard-stubs/carray_slab.rb +57 -0
- data/yard-stubs/carray_sort.rb +163 -0
- data/yard-stubs/carray_test.rb +85 -0
- data/yard-stubs/carray_undef.rb +64 -0
- data/yard-stubs/carray_utils.rb +97 -0
- data/yard-stubs/ruby_carray.rb +193 -0
- metadata +59 -10
- data/ext/ca_obj_unbound_repeat.c +0 -496
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: carray
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0.
|
|
4
|
+
version: 3.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- himotoyoshi
|
|
@@ -10,11 +10,14 @@ cert_chain: []
|
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies: []
|
|
12
12
|
description: |2
|
|
13
|
-
Ruby/CArray
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
Ruby/CArray adds multi-dimensional numerical arrays to Ruby. Elements are held
|
|
14
|
+
in a single flat memory block, so whole-array work -- element-wise arithmetic,
|
|
15
|
+
reductions along any axis, sorting, searching -- runs in C. Slicing, transposing,
|
|
16
|
+
reshaping, and selecting by a boolean condition all return views that share
|
|
17
|
+
storage with the original array and can be chained freely; nothing is copied
|
|
18
|
+
until you ask for a copy. Any array, view included, can carry a mask marking
|
|
19
|
+
individual elements as undefined, and arrays are exchanged with other numerical
|
|
20
|
+
libraries without copying through Ruby's MemoryView protocol.
|
|
18
21
|
email:
|
|
19
22
|
- himotoyoshi@users.noreply.github.com
|
|
20
23
|
executables: []
|
|
@@ -24,8 +27,8 @@ extra_rdoc_files: []
|
|
|
24
27
|
files:
|
|
25
28
|
- ".yardopts"
|
|
26
29
|
- CHANGELOG.md
|
|
30
|
+
- CHANGELOG.v1.md
|
|
27
31
|
- LICENSE
|
|
28
|
-
- NEWS.md
|
|
29
32
|
- README.md
|
|
30
33
|
- carray.gemspec
|
|
31
34
|
- ext/ca_array_pool.c
|
|
@@ -88,9 +91,9 @@ files:
|
|
|
88
91
|
- ext/ca_obj_timedelta.c
|
|
89
92
|
- ext/ca_obj_transpose.c
|
|
90
93
|
- ext/ca_obj_triop.c
|
|
91
|
-
- ext/ca_obj_unbound_repeat.c
|
|
92
94
|
- ext/ca_obj_window.c
|
|
93
95
|
- ext/ca_op_byte_swap.c
|
|
96
|
+
- ext/ca_op_cmplx64.h
|
|
94
97
|
- ext/ca_op_ipower.c
|
|
95
98
|
- ext/ca_op_powi.h
|
|
96
99
|
- ext/ca_sort_kernels.h
|
|
@@ -104,6 +107,7 @@ files:
|
|
|
104
107
|
- ext/carray_attribute.c
|
|
105
108
|
- ext/carray_bincount.c
|
|
106
109
|
- ext/carray_broadcast.c
|
|
110
|
+
- ext/carray_build_flags.h
|
|
107
111
|
- ext/carray_call_cfunc.c
|
|
108
112
|
- ext/carray_call_cfunc.h
|
|
109
113
|
- ext/carray_cast.c
|
|
@@ -194,6 +198,8 @@ files:
|
|
|
194
198
|
- lib/carray/frame/records.rb
|
|
195
199
|
- lib/carray/frame/sort.rb
|
|
196
200
|
- lib/carray/frame/verbs.rb
|
|
201
|
+
- lib/carray/fuse_source.rb
|
|
202
|
+
- lib/carray/fusion.rb
|
|
197
203
|
- lib/carray/histogram.rb
|
|
198
204
|
- lib/carray/inspect.rb
|
|
199
205
|
- lib/carray/iterator.rb
|
|
@@ -235,6 +241,49 @@ files:
|
|
|
235
241
|
- lib/carray/table.rb
|
|
236
242
|
- lib/carray/time.rb
|
|
237
243
|
- lib/carray/window_iterator.rb
|
|
244
|
+
- yard-stubs/ca_obj_array.rb
|
|
245
|
+
- yard-stubs/ca_obj_bitarray.rb
|
|
246
|
+
- yard-stubs/ca_obj_bitfield.rb
|
|
247
|
+
- yard-stubs/ca_obj_block.rb
|
|
248
|
+
- yard-stubs/ca_obj_byte_swap.rb
|
|
249
|
+
- yard-stubs/ca_obj_fake.rb
|
|
250
|
+
- yard-stubs/ca_obj_farray.rb
|
|
251
|
+
- yard-stubs/ca_obj_field.rb
|
|
252
|
+
- yard-stubs/ca_obj_grid.rb
|
|
253
|
+
- yard-stubs/ca_obj_refer.rb
|
|
254
|
+
- yard-stubs/ca_obj_roll.rb
|
|
255
|
+
- yard-stubs/ca_obj_shift.rb
|
|
256
|
+
- yard-stubs/ca_obj_stride.rb
|
|
257
|
+
- yard-stubs/ca_obj_tile.rb
|
|
258
|
+
- yard-stubs/ca_obj_transpose.rb
|
|
259
|
+
- yard-stubs/ca_obj_window.rb
|
|
260
|
+
- yard-stubs/carray_access.rb
|
|
261
|
+
- yard-stubs/carray_attribute.rb
|
|
262
|
+
- yard-stubs/carray_broadcast.rb
|
|
263
|
+
- yard-stubs/carray_cast.rb
|
|
264
|
+
- yard-stubs/carray_class.rb
|
|
265
|
+
- yard-stubs/carray_conversion.rb
|
|
266
|
+
- yard-stubs/carray_copy.rb
|
|
267
|
+
- yard-stubs/carray_core.rb
|
|
268
|
+
- yard-stubs/carray_count.rb
|
|
269
|
+
- yard-stubs/carray_element.rb
|
|
270
|
+
- yard-stubs/carray_generate.rb
|
|
271
|
+
- yard-stubs/carray_lazy.rb
|
|
272
|
+
- yard-stubs/carray_loop.rb
|
|
273
|
+
- yard-stubs/carray_mask.rb
|
|
274
|
+
- yard-stubs/carray_math.rb
|
|
275
|
+
- yard-stubs/carray_mathfunc.rb
|
|
276
|
+
- yard-stubs/carray_median_percentile.rb
|
|
277
|
+
- yard-stubs/carray_memory_view.rb
|
|
278
|
+
- yard-stubs/carray_order.rb
|
|
279
|
+
- yard-stubs/carray_random.rb
|
|
280
|
+
- yard-stubs/carray_scatter.rb
|
|
281
|
+
- yard-stubs/carray_slab.rb
|
|
282
|
+
- yard-stubs/carray_sort.rb
|
|
283
|
+
- yard-stubs/carray_test.rb
|
|
284
|
+
- yard-stubs/carray_undef.rb
|
|
285
|
+
- yard-stubs/carray_utils.rb
|
|
286
|
+
- yard-stubs/ruby_carray.rb
|
|
238
287
|
homepage: https://github.com/himotoyoshi/carray
|
|
239
288
|
licenses:
|
|
240
289
|
- MIT
|
|
@@ -254,7 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
254
303
|
- !ruby/object:Gem::Version
|
|
255
304
|
version: '0'
|
|
256
305
|
requirements: []
|
|
257
|
-
rubygems_version: 4.0.
|
|
306
|
+
rubygems_version: 4.0.17
|
|
258
307
|
specification_version: 4
|
|
259
|
-
summary: Multi-
|
|
308
|
+
summary: Multi-dimensional numerical array class for Ruby
|
|
260
309
|
test_files: []
|
data/ext/ca_obj_unbound_repeat.c
DELETED
|
@@ -1,496 +0,0 @@
|
|
|
1
|
-
/* ---------------------------------------------------------------------------
|
|
2
|
-
|
|
3
|
-
CAUnboundRepeat — a CAStride subclass representing the "shape
|
|
4
|
-
pending" broadcast view. Each `:*` axis becomes a size-1 stride-0
|
|
5
|
-
entry in the CAStride prefix; each sized axis inherits the parent's
|
|
6
|
-
contiguous byte stride. The original spec is preserved in the
|
|
7
|
-
rep_dim[] tail (0 = `*`, n = sized) so #spec / #bind / #bind_with /
|
|
8
|
-
#shave observe the user's original layout.
|
|
9
|
-
|
|
10
|
-
---------------------------------------------------------------------------- */
|
|
11
|
-
|
|
12
|
-
#include "carray.h"
|
|
13
|
-
#include "carray_internal.h" /* per-obj_type view constructors */
|
|
14
|
-
#include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
|
|
15
|
-
|
|
16
|
-
extern ca_operation_function_t ca_stride_func;
|
|
17
|
-
|
|
18
|
-
VALUE rb_cCAUnboundRepeat;
|
|
19
|
-
VALUE rb_cCAUnboundRepeatMask;
|
|
20
|
-
|
|
21
|
-
/* Filled in by Init_ca_obj_unbound_repeat as `ca_stride_func` plus
|
|
22
|
-
custom free / clone / create_mask. */
|
|
23
|
-
ca_operation_function_t ca_ubrep_func;
|
|
24
|
-
|
|
25
|
-
static size_t
|
|
26
|
-
ca_ubrep_dsize (const void *ap)
|
|
27
|
-
{
|
|
28
|
-
const CAUnboundRepeat *ca = (const CAUnboundRepeat *) ap;
|
|
29
|
-
/* dim + strides + rep_dim, each ndim cells (legacy ALLOC_N x3 or one
|
|
30
|
-
framework-managed _pool buffer; same byte total). */
|
|
31
|
-
return sizeof(CAUnboundRepeat) + 3 * ca->ndim * sizeof(ca_size_t);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/* Pool framework hooks (CABlock pattern: CAStride base + one extra
|
|
35
|
-
tail). The view ndim equals rep_ndim, so dim, strides and rep_dim
|
|
36
|
-
are all ndim-sized. CAREFUL: dim/strides must stay at CAStride
|
|
37
|
-
base offsets (0, n) so ca_stride_setup's pool branch finds them;
|
|
38
|
-
the rep_dim tail follows at 2n. */
|
|
39
|
-
static size_t
|
|
40
|
-
ca_ubrep_pool_bytes (int8_t ndim)
|
|
41
|
-
{
|
|
42
|
-
ca_size_t n = (ndim > 0) ? ndim : 1;
|
|
43
|
-
return 3 * (size_t) n * sizeof(ca_size_t);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
static void
|
|
47
|
-
ca_ubrep_pool_init (void *ap, int8_t ndim)
|
|
48
|
-
{
|
|
49
|
-
CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
|
|
50
|
-
ca_size_t n = (ndim > 0) ? ndim : 1;
|
|
51
|
-
ca_size_t *base = (ca_size_t *) ca->_pool;
|
|
52
|
-
ca->dim = base + 0 * n; /* CAStride prefix */
|
|
53
|
-
ca->strides = base + 1 * n; /* CAStride prefix */
|
|
54
|
-
ca->rep_dim = base + 2 * n; /* CAUnboundRepeat tail */
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const rb_data_type_t caunboundrepeat_data_type = {
|
|
58
|
-
.parent = &castride_data_type,
|
|
59
|
-
.wrap_struct_name = "CAUnboundRepeat",
|
|
60
|
-
.function = {
|
|
61
|
-
.dmark = ca_mark,
|
|
62
|
-
.dfree = ca_free,
|
|
63
|
-
.dsize = ca_ubrep_dsize,
|
|
64
|
-
.dcompact = NULL
|
|
65
|
-
},
|
|
66
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const rb_data_type_t caunboundrepeat_mask_data_type = {
|
|
70
|
-
.parent = &caunboundrepeat_data_type,
|
|
71
|
-
.wrap_struct_name = "CAUnboundRepeatMask",
|
|
72
|
-
.function = {
|
|
73
|
-
.dmark = NULL,
|
|
74
|
-
.dfree = ca_free_nop,
|
|
75
|
-
.dsize = ca_ubrep_dsize,
|
|
76
|
-
.dcompact = NULL
|
|
77
|
-
},
|
|
78
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
int
|
|
82
|
-
ca_ubrep_setup (CAUnboundRepeat *ca, CArray *parent,
|
|
83
|
-
int32_t rep_ndim, ca_size_t *rep_dim)
|
|
84
|
-
{
|
|
85
|
-
ca_size_t parent_byte_stride[CA_RANK_MAX];
|
|
86
|
-
ca_size_t newdim[CA_RANK_MAX];
|
|
87
|
-
ca_size_t strides[CA_RANK_MAX];
|
|
88
|
-
int8_t data_ndim = 0;
|
|
89
|
-
int8_t i, j;
|
|
90
|
-
|
|
91
|
-
CA_CHECK_RANK(rep_ndim);
|
|
92
|
-
|
|
93
|
-
/* parent_byte_stride[k] = bytes * Π_{i>k} parent->dim[i]. Only the
|
|
94
|
-
[0, parent->ndim) entries are touched; the array is private to this
|
|
95
|
-
setup call. */
|
|
96
|
-
{
|
|
97
|
-
ca_size_t s = parent->bytes;
|
|
98
|
-
for (i = parent->ndim - 1; i >= 0; i--) {
|
|
99
|
-
parent_byte_stride[i] = s;
|
|
100
|
-
s *= parent->dim[i];
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
j = 0;
|
|
105
|
-
for (i = 0; i < rep_ndim; i++) {
|
|
106
|
-
if (rep_dim[i] == 0) {
|
|
107
|
-
/* `*` (unbound) axis: size 1 placeholder, stride 0. */
|
|
108
|
-
newdim[i] = 1;
|
|
109
|
-
strides[i] = 0;
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
if (j >= parent->ndim) {
|
|
113
|
-
rb_raise(rb_eArgError,
|
|
114
|
-
"too many sized axes for parent of ndim %d",
|
|
115
|
-
(int) parent->ndim);
|
|
116
|
-
}
|
|
117
|
-
if (rep_dim[i] != parent->dim[j]) {
|
|
118
|
-
rb_raise(rb_eArgError,
|
|
119
|
-
"mismatch in entity dim at axis %d (%lld vs parent %lld)",
|
|
120
|
-
(int) i,
|
|
121
|
-
(long long) rep_dim[i], (long long) parent->dim[j]);
|
|
122
|
-
}
|
|
123
|
-
newdim[i] = parent->dim[j];
|
|
124
|
-
strides[i] = parent_byte_stride[j];
|
|
125
|
-
data_ndim += 1;
|
|
126
|
-
j++;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (data_ndim != parent->ndim) {
|
|
130
|
-
rb_raise(rb_eArgError,
|
|
131
|
-
"mismatch in number of sized axes (%d for parent ndim %d)",
|
|
132
|
-
(int) data_ndim, (int) parent->ndim);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/* CAREFUL: initialise the rep_dim tail before ca_stride_setup.
|
|
136
|
-
ca_stride_setup may call ca_create_mask when the parent has a
|
|
137
|
-
mask, which dispatches into ca_ubrep_func_create_mask — and that
|
|
138
|
-
reads ca->rep_dim. */
|
|
139
|
-
if ( ! ca->_pool ) {
|
|
140
|
-
ca->rep_dim = ALLOC_N(ca_size_t, rep_ndim > 0 ? rep_ndim : 1);
|
|
141
|
-
}
|
|
142
|
-
for (i = 0; i < rep_ndim; i++) {
|
|
143
|
-
ca->rep_dim[i] = rep_dim[i];
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
ca_stride_setup((CAStride *) ca, CA_OBJ_UNBOUND_REPEAT, parent,
|
|
147
|
-
parent->data_type, parent->bytes,
|
|
148
|
-
(int8_t) rep_ndim, newdim, strides, 0);
|
|
149
|
-
|
|
150
|
-
return 0;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
CAUnboundRepeat *
|
|
154
|
-
ca_ubrep_new (CArray *parent, int32_t rep_ndim, ca_size_t *rep_dim)
|
|
155
|
-
{
|
|
156
|
-
CAUnboundRepeat *ca =
|
|
157
|
-
(CAUnboundRepeat *) ca_array_alloc(CA_OBJ_UNBOUND_REPEAT, (int8_t) rep_ndim);
|
|
158
|
-
ca_ubrep_setup(ca, parent, rep_ndim, rep_dim);
|
|
159
|
-
return ca;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
static void
|
|
163
|
-
free_ca_ubrep (void *ap)
|
|
164
|
-
{
|
|
165
|
-
CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
|
|
166
|
-
if (ca == NULL) return;
|
|
167
|
-
ca_free(ca->mask);
|
|
168
|
-
if (ca->_pool) {
|
|
169
|
-
/* dim/strides/rep_dim all live in ca->_pool. */
|
|
170
|
-
ca_array_free(ca);
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
xfree(ca->rep_dim);
|
|
174
|
-
xfree(ca->strides);
|
|
175
|
-
xfree(ca->dim);
|
|
176
|
-
xfree(ca);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
static void *
|
|
181
|
-
ca_ubrep_func_clone (void *ap)
|
|
182
|
-
{
|
|
183
|
-
CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
|
|
184
|
-
return ca_ubrep_new(ca->parent, ca->ndim, ca->rep_dim);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
static void
|
|
188
|
-
ca_ubrep_func_create_mask (void *ap)
|
|
189
|
-
{
|
|
190
|
-
CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
|
|
191
|
-
ca_update_mask(ca->parent);
|
|
192
|
-
if (!ca->parent->mask) {
|
|
193
|
-
ca_create_mask(ca->parent);
|
|
194
|
-
}
|
|
195
|
-
ca->mask =
|
|
196
|
-
(CArray *) ca_ubrep_new(ca->parent->mask, ca->ndim, ca->rep_dim);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/* ------------------------------------------------------------------- */
|
|
200
|
-
|
|
201
|
-
/* rb_ca_rewrap_unbound_repeat(src, out) — when src is an unresolved
|
|
202
|
-
* CAUnboundRepeat, re-wrap out so the result carries the same `*`
|
|
203
|
-
* markers; otherwise return out unchanged. Called from the unary /
|
|
204
|
-
* binary operator and math paths so downstream `.bind` / `.bind_with`
|
|
205
|
-
* on the operator result still see the `*` axes. */
|
|
206
|
-
VALUE
|
|
207
|
-
rb_ca_rewrap_unbound_repeat (VALUE src, VALUE out)
|
|
208
|
-
{
|
|
209
|
-
CArray *ca;
|
|
210
|
-
CAUnboundRepeat *cx;
|
|
211
|
-
TypedData_Get_Struct(src, CArray, &carray_data_type, ca);
|
|
212
|
-
if (ca->obj_type != CA_OBJ_UNBOUND_REPEAT) return out;
|
|
213
|
-
cx = (CAUnboundRepeat *) ca;
|
|
214
|
-
return rb_ca_ubrep_new(rb_ca_ubrep_shave(src, out), cx->ndim, cx->rep_dim);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
VALUE
|
|
218
|
-
rb_ca_ubrep_shave (VALUE self, VALUE other)
|
|
219
|
-
{
|
|
220
|
-
CAUnboundRepeat *ca;
|
|
221
|
-
CArray *co;
|
|
222
|
-
int8_t ndim, i;
|
|
223
|
-
ca_size_t dim[CA_RANK_MAX];
|
|
224
|
-
|
|
225
|
-
rb_check_carray_object(self);
|
|
226
|
-
rb_check_carray_object(other);
|
|
227
|
-
|
|
228
|
-
TypedData_Get_Struct(self, CAUnboundRepeat, &caunboundrepeat_data_type, ca);
|
|
229
|
-
TypedData_Get_Struct(other, CArray, &carray_data_type, co);
|
|
230
|
-
|
|
231
|
-
if (ca->elements != co->elements) {
|
|
232
|
-
rb_raise(rb_eRuntimeError, "mismatch in # of elements");
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
ndim = 0;
|
|
236
|
-
for (i = 0; i < ca->ndim; i++) {
|
|
237
|
-
if (ca->rep_dim[i]) {
|
|
238
|
-
dim[ndim] = ca->rep_dim[i];
|
|
239
|
-
ndim += 1;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return rb_ca_refer_new(other, co->data_type, ndim, dim, co->bytes, 0);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
VALUE
|
|
247
|
-
rb_ca_ubrep_new (VALUE cary, int32_t rep_ndim, ca_size_t *rep_dim)
|
|
248
|
-
{
|
|
249
|
-
volatile VALUE obj;
|
|
250
|
-
CArray *parent;
|
|
251
|
-
CAUnboundRepeat *ca;
|
|
252
|
-
rb_check_carray_object(cary);
|
|
253
|
-
TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
|
|
254
|
-
ca = ca_ubrep_new(parent, rep_ndim, rep_dim);
|
|
255
|
-
obj = ca_wrap_struct(ca);
|
|
256
|
-
rb_ca_set_parent(obj, cary);
|
|
257
|
-
return obj;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
VALUE
|
|
261
|
-
rb_ca_unbound_repeat (int argc, VALUE *argv, VALUE self)
|
|
262
|
-
{
|
|
263
|
-
CArray *ca;
|
|
264
|
-
int8_t ndim;
|
|
265
|
-
int32_t rep_ndim;
|
|
266
|
-
ca_size_t rep_dim[CA_RANK_MAX];
|
|
267
|
-
ca_size_t elements, count, i;
|
|
268
|
-
|
|
269
|
-
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
270
|
-
|
|
271
|
-
rep_ndim = argc;
|
|
272
|
-
|
|
273
|
-
count = 0;
|
|
274
|
-
ndim = 0;
|
|
275
|
-
elements = 1;
|
|
276
|
-
for (i = 0; i < rep_ndim; i++) {
|
|
277
|
-
if (TYPE(argv[i]) == T_SYMBOL) {
|
|
278
|
-
if (argv[i] == ID2SYM(rb_intern("*"))) {
|
|
279
|
-
rep_dim[i] = 0;
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
rb_raise(rb_eArgError, "unknown symbol (!= ':*') in arguments");
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
if (!NIL_P(argv[i])) {
|
|
287
|
-
rb_raise(rb_eArgError, "invalid argument");
|
|
288
|
-
}
|
|
289
|
-
rep_dim[i] = ca->dim[count];
|
|
290
|
-
elements *= ca->dim[count];
|
|
291
|
-
count++; ndim++;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
if (elements != ca->elements) {
|
|
296
|
-
rb_raise(rb_eArgError, "mismatch in entity elements (%lli for %lli)",
|
|
297
|
-
(long long) elements, (long long) ca->elements);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
if (ndim != ca->ndim) {
|
|
301
|
-
rb_raise(rb_eArgError, "invalid number of nil's (%i for %i)",
|
|
302
|
-
(int) ndim, (int) ca->ndim);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
{
|
|
306
|
-
VALUE obj = rb_ca_ubrep_new(self, rep_ndim, rep_dim);
|
|
307
|
-
CA_FACE_LIFT_IF_FACE(obj, self, ca);
|
|
308
|
-
return obj;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
static VALUE
|
|
313
|
-
rb_ca_ubrep_s_allocate (VALUE klass)
|
|
314
|
-
{
|
|
315
|
-
CAUnboundRepeat *ca;
|
|
316
|
-
return TypedData_Make_Struct(klass, CAUnboundRepeat,
|
|
317
|
-
&caunboundrepeat_data_type, ca);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
static VALUE
|
|
321
|
-
rb_ca_ubrep_initialize_copy (VALUE self, VALUE other)
|
|
322
|
-
{
|
|
323
|
-
CAUnboundRepeat *ca, *cs;
|
|
324
|
-
|
|
325
|
-
TypedData_Get_Struct(self, CAUnboundRepeat, &caunboundrepeat_data_type, ca);
|
|
326
|
-
TypedData_Get_Struct(other, CAUnboundRepeat, &caunboundrepeat_data_type, cs);
|
|
327
|
-
|
|
328
|
-
if ( ca_func[CA_OBJ_UNBOUND_REPEAT].pool_init ) {
|
|
329
|
-
ca_array_pool_alloc(ca, CA_OBJ_UNBOUND_REPEAT, cs->ndim);
|
|
330
|
-
}
|
|
331
|
-
ca_ubrep_setup(ca, cs->parent, cs->ndim, cs->rep_dim);
|
|
332
|
-
|
|
333
|
-
return self;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
VALUE
|
|
337
|
-
ca_ubrep_bind2 (VALUE self, int32_t new_ndim, ca_size_t *new_dim)
|
|
338
|
-
{
|
|
339
|
-
CAUnboundRepeat *ca;
|
|
340
|
-
ca_size_t rep_spec[CA_RANK_MAX];
|
|
341
|
-
ca_size_t upr_spec[CA_RANK_MAX];
|
|
342
|
-
ca_size_t srp_spec[CA_RANK_MAX];
|
|
343
|
-
int uprep = 0, srp_ndim;
|
|
344
|
-
int ndim_real;
|
|
345
|
-
int i;
|
|
346
|
-
|
|
347
|
-
TypedData_Get_Struct(self, CAUnboundRepeat, &caunboundrepeat_data_type, ca);
|
|
348
|
-
|
|
349
|
-
if (ca->ndim != new_ndim) {
|
|
350
|
-
rb_raise(rb_eArgError, "invalid new_ndim (%i <-> %i)",
|
|
351
|
-
(int) ca->ndim, (int) new_ndim);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
srp_ndim = 0;
|
|
355
|
-
ndim_real = 0;
|
|
356
|
-
for (i = 0; i < new_ndim; i++) {
|
|
357
|
-
if (ca->rep_dim[i] == 0) {
|
|
358
|
-
if (new_dim[i] == 0) {
|
|
359
|
-
uprep = 1;
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
srp_spec[srp_ndim++] = new_dim[i];
|
|
363
|
-
}
|
|
364
|
-
rep_spec[i] = new_dim[i];
|
|
365
|
-
upr_spec[i] = new_dim[i];
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
ndim_real++;
|
|
369
|
-
rep_spec[i] = 0;
|
|
370
|
-
srp_spec[srp_ndim++] = 0;
|
|
371
|
-
upr_spec[i] = ca->rep_dim[i];
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
if (uprep) {
|
|
376
|
-
volatile VALUE rep;
|
|
377
|
-
if (srp_ndim >= ndim_real) {
|
|
378
|
-
rep = rb_ca_repeat_new(rb_ca_parent(self), srp_ndim, srp_spec);
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
rep = rb_ca_parent(self);
|
|
382
|
-
}
|
|
383
|
-
return rb_ca_ubrep_new(rep, new_ndim, upr_spec);
|
|
384
|
-
}
|
|
385
|
-
else {
|
|
386
|
-
return rb_ca_repeat_new(rb_ca_parent(self), new_ndim, rep_spec);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
/* CAUnboundRepeat#bind_with(other) — bind `*` axes to shape borrowed
|
|
391
|
-
* from `other` (CArray, another CAUnboundRepeat, or a scalar). */
|
|
392
|
-
VALUE
|
|
393
|
-
ca_ubrep_bind_with (VALUE self, VALUE other)
|
|
394
|
-
{
|
|
395
|
-
CAUnboundRepeat *cup;
|
|
396
|
-
CArray *co;
|
|
397
|
-
|
|
398
|
-
rb_check_carray_object(other);
|
|
399
|
-
|
|
400
|
-
TypedData_Get_Struct(other, CArray, &carray_data_type, co);
|
|
401
|
-
|
|
402
|
-
if (co->obj_type == CA_OBJ_UNBOUND_REPEAT) {
|
|
403
|
-
TypedData_Get_Struct(other, CAUnboundRepeat,
|
|
404
|
-
&caunboundrepeat_data_type, cup);
|
|
405
|
-
return ca_ubrep_bind2(self, cup->ndim, cup->rep_dim);
|
|
406
|
-
}
|
|
407
|
-
else if (ca_is_scalar(co)) {
|
|
408
|
-
return self;
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
return ca_ubrep_bind2(self, co->ndim, co->dim);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
/* CAUnboundRepeat#bind(*sizes) (alias broadcast_to) — bind each `*`
|
|
416
|
-
* axis to an explicit size and return the resulting CARepeat view. */
|
|
417
|
-
static VALUE
|
|
418
|
-
rb_ca_ubrep_bind (int argc, VALUE *argv, VALUE self)
|
|
419
|
-
{
|
|
420
|
-
CAUnboundRepeat *ca;
|
|
421
|
-
ca_size_t rep_spec[CA_RANK_MAX];
|
|
422
|
-
int i;
|
|
423
|
-
|
|
424
|
-
TypedData_Get_Struct(self, CAUnboundRepeat, &caunboundrepeat_data_type, ca);
|
|
425
|
-
|
|
426
|
-
if (ca->ndim != argc) {
|
|
427
|
-
rb_raise(rb_eArgError, "invalid new_ndim");
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
for (i = 0; i < argc; i++) {
|
|
431
|
-
if (ca->rep_dim[i] == 0) {
|
|
432
|
-
rep_spec[i] = NUM2SIZE(argv[i]);
|
|
433
|
-
}
|
|
434
|
-
else {
|
|
435
|
-
rep_spec[i] = 0;
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
return rb_ca_repeat_new(rb_ca_parent(self), argc, rep_spec);
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
static VALUE
|
|
443
|
-
rb_ca_ubrep_spec (VALUE self)
|
|
444
|
-
{
|
|
445
|
-
volatile VALUE spec;
|
|
446
|
-
CAUnboundRepeat *ca;
|
|
447
|
-
int i;
|
|
448
|
-
|
|
449
|
-
TypedData_Get_Struct(self, CAUnboundRepeat, &caunboundrepeat_data_type, ca);
|
|
450
|
-
|
|
451
|
-
spec = rb_ary_new2(ca->ndim);
|
|
452
|
-
for (i = 0; i < ca->ndim; i++) {
|
|
453
|
-
if (ca->rep_dim[i]) {
|
|
454
|
-
rb_ary_store(spec, i, SIZE2NUM(ca->rep_dim[i]));
|
|
455
|
-
}
|
|
456
|
-
else {
|
|
457
|
-
rb_ary_store(spec, i, ID2SYM(rb_intern("*")));
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
return spec;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
void
|
|
465
|
-
Init_ca_obj_unbound_repeat (void)
|
|
466
|
-
{
|
|
467
|
-
/* rb_cCAUnboundRepeat, CA_OBJ_UNBOUND_REPEAT are defined in
|
|
468
|
-
ruby_carray.c / carray.h. Build the custom op table by copying
|
|
469
|
-
ca_stride_func and overriding only the slots that need to know
|
|
470
|
-
about the rep_dim tail (free + clone + create_mask). */
|
|
471
|
-
ca_ubrep_func = ca_stride_func;
|
|
472
|
-
ca_ubrep_func.free_object = free_ca_ubrep;
|
|
473
|
-
ca_ubrep_func.clone = ca_ubrep_func_clone;
|
|
474
|
-
ca_ubrep_func.create_mask = ca_ubrep_func_create_mask;
|
|
475
|
-
/* CAUnboundRepeat owns 3*ndim cells (dim/strides + rep_dim); override the
|
|
476
|
-
2*ndim CAStride base pool hooks and the struct_size so ca_array_alloc
|
|
477
|
-
reserves room for the rep_dim tail too. */
|
|
478
|
-
ca_ubrep_func.struct_size = sizeof(CAUnboundRepeat);
|
|
479
|
-
ca_ubrep_func.pool_bytes = ca_ubrep_pool_bytes;
|
|
480
|
-
ca_ubrep_func.pool_init = ca_ubrep_pool_init;
|
|
481
|
-
ca_func[CA_OBJ_UNBOUND_REPEAT] = ca_ubrep_func;
|
|
482
|
-
|
|
483
|
-
rb_define_const(rb_cObject, "CA_OBJ_UNBOUND_REPEAT",
|
|
484
|
-
INT2NUM(CA_OBJ_UNBOUND_REPEAT));
|
|
485
|
-
|
|
486
|
-
rb_define_method(rb_cCArray, "unbound_repeat", rb_ca_unbound_repeat, -1);
|
|
487
|
-
|
|
488
|
-
rb_define_alloc_func(rb_cCAUnboundRepeat, rb_ca_ubrep_s_allocate);
|
|
489
|
-
rb_define_method(rb_cCAUnboundRepeat, "initialize_copy",
|
|
490
|
-
rb_ca_ubrep_initialize_copy, 1);
|
|
491
|
-
|
|
492
|
-
rb_define_method(rb_cCAUnboundRepeat, "bind", rb_ca_ubrep_bind, -1);
|
|
493
|
-
rb_define_alias(rb_cCAUnboundRepeat, "broadcast_to", "bind");
|
|
494
|
-
rb_define_method(rb_cCAUnboundRepeat, "bind_with", ca_ubrep_bind_with, 1);
|
|
495
|
-
rb_define_method(rb_cCAUnboundRepeat, "spec", rb_ca_ubrep_spec, 0);
|
|
496
|
-
}
|