carray 3.0.0 → 3.0.2

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -1
  3. data/CHANGELOG.md +845 -3
  4. data/{NEWS.md → CHANGELOG.v1.md} +1 -1
  5. data/README.md +33 -33
  6. data/carray.gemspec +12 -8
  7. data/ext/ca_axis_dispatch.c +33 -4
  8. data/ext/ca_axis_group.c +256 -114
  9. data/ext/ca_binop_dispatch.c +5 -6
  10. data/ext/ca_binop_dispatch.h +0 -7
  11. data/ext/ca_categorical_iterator.c +121 -67
  12. data/ext/ca_for_each_element.h +6 -8
  13. data/ext/ca_group_iter.c +1 -1
  14. data/ext/ca_kernel_iterator.c +386 -74
  15. data/ext/ca_kernel_iterator.h +145 -45
  16. data/ext/ca_obj_array.c +62 -20
  17. data/ext/ca_obj_bincmp.c +57 -27
  18. data/ext/ca_obj_binop.c +86 -30
  19. data/ext/ca_obj_block.c +4 -4
  20. data/ext/ca_obj_const_string.c +88 -27
  21. data/ext/ca_obj_face.c +104 -0
  22. data/ext/ca_obj_face.h +48 -1
  23. data/ext/ca_obj_fake.c +11 -0
  24. data/ext/ca_obj_fixlen_string.c +21 -6
  25. data/ext/ca_obj_grid.c +11 -3
  26. data/ext/ca_obj_meld.c +125 -22
  27. data/ext/ca_obj_moncmp.c +33 -14
  28. data/ext/ca_obj_monop.c +19 -7
  29. data/ext/ca_obj_object.c +107 -4
  30. data/ext/ca_obj_record.c +3 -1
  31. data/ext/ca_obj_refer.c +30 -6
  32. data/ext/ca_obj_roll.c +13 -5
  33. data/ext/ca_obj_select.c +49 -34
  34. data/ext/ca_obj_select_axis.c +16 -6
  35. data/ext/ca_obj_shift.c +3 -3
  36. data/ext/ca_obj_stack.c +3 -8
  37. data/ext/ca_obj_stride.c +178 -24
  38. data/ext/ca_obj_string.c +11 -5
  39. data/ext/ca_obj_tile.c +13 -5
  40. data/ext/ca_obj_time.c +3 -1
  41. data/ext/ca_obj_timedelta.c +3 -1
  42. data/ext/ca_obj_transpose.c +1 -1
  43. data/ext/ca_obj_triop.c +62 -23
  44. data/ext/ca_obj_window.c +94 -19
  45. data/ext/ca_op_cmplx64.h +123 -0
  46. data/ext/ca_op_ipower.c +1 -5
  47. data/ext/ca_rng_normal.h +42 -0
  48. data/ext/ca_rng_xoshiro256pp.h +105 -0
  49. data/ext/ca_sort_kernels.h +5 -5
  50. data/ext/ca_sweep_engine.c +362 -155
  51. data/ext/ca_sweep_engine.h +39 -9
  52. data/ext/ca_transform_common.c +7 -0
  53. data/ext/carray.h +148 -132
  54. data/ext/carray_access.c +83 -49
  55. data/ext/carray_address_basis.c +590 -0
  56. data/ext/carray_bincount.c +8 -8
  57. data/ext/carray_broadcast.c +102 -9
  58. data/ext/carray_build_flags.h +3 -0
  59. data/ext/carray_call_cfunc.c +2010 -335
  60. data/ext/carray_call_cfunc.h +153 -0
  61. data/ext/carray_cast.c +184 -72
  62. data/ext/carray_conversion.c +22 -22
  63. data/ext/carray_copy.c +67 -32
  64. data/ext/carray_core.c +140 -13
  65. data/ext/carray_count.c +10 -11
  66. data/ext/carray_element.c +7 -7
  67. data/ext/carray_factorize.c +72 -51
  68. data/ext/carray_hold.c +1 -1
  69. data/ext/carray_index_classifier.c +7 -21
  70. data/ext/carray_internal.h +36 -3
  71. data/ext/carray_kernels_bincmp.c +1 -0
  72. data/ext/carray_kernels_binop.c +320 -298
  73. data/ext/carray_kernels_init.c +1095 -0
  74. data/ext/carray_kernels_map.c +1 -0
  75. data/ext/carray_kernels_moncmp.c +1 -0
  76. data/ext/carray_kernels_monop.c +412 -411
  77. data/ext/carray_kernels_reduce_aggregate.c +256 -87
  78. data/ext/carray_kernels_reduce_boolean.c +1 -0
  79. data/ext/carray_kernels_reduce_cumulative.c +324 -54
  80. data/ext/carray_kernels_reduce_extreme.c +605 -58
  81. data/ext/carray_kernels_reduce_variance.c +1 -0
  82. data/ext/carray_kernels_scan.c +5 -4
  83. data/ext/carray_kernels_search.c +187 -106
  84. data/ext/carray_kernels_sort.c +1 -0
  85. data/ext/carray_kernels_triop.c +1 -0
  86. data/ext/carray_lazy.c +175 -5
  87. data/ext/carray_loop.c +7 -1
  88. data/ext/carray_mask.c +29 -13
  89. data/ext/carray_median_percentile.c +56 -1
  90. data/ext/carray_memory_view.c +46 -21
  91. data/ext/carray_operator.c +50 -53
  92. data/ext/carray_order.c +1 -1
  93. data/ext/carray_partition.c +4 -4
  94. data/ext/carray_random.c +391 -47
  95. data/ext/carray_scatter.c +1 -1
  96. data/ext/carray_slab.c +13 -0
  97. data/ext/carray_sort.c +22 -24
  98. data/ext/carray_sort_kernel.c +10 -10
  99. data/ext/carray_test.c +1 -1
  100. data/ext/extconf.rb +18 -0
  101. data/ext/mk_call_cfunc.rb +323 -145
  102. data/ext/mkkernel.rb +651 -129
  103. data/ext/ruby_carray.c +28 -17
  104. data/ext/version.h +4 -4
  105. data/lib/carray/autoload_carray.rb +24 -3
  106. data/lib/carray/autoload_method_extension.rb +14 -1
  107. data/lib/carray/axis_group.rb +84 -7
  108. data/lib/carray/basics.rb +63 -59
  109. data/lib/carray/bincount_nd.rb +12 -12
  110. data/lib/carray/block_iterator.rb +111 -25
  111. data/lib/carray/categorical.rb +154 -37
  112. data/lib/carray/categorical_iterator.rb +300 -151
  113. data/lib/carray/conditional.rb +14 -14
  114. data/lib/carray/const_string.rb +131 -27
  115. data/lib/carray/construct.rb +61 -0
  116. data/lib/carray/core_extensions.rb +62 -5
  117. data/lib/carray/data_type_extension.rb +21 -1
  118. data/lib/carray/data_type_limits.rb +91 -0
  119. data/lib/carray/fixlen_string.rb +1 -1
  120. data/lib/carray/frame/concat.rb +3 -3
  121. data/lib/carray/frame/convert.rb +1 -1
  122. data/lib/carray/frame/csv_parser.rb +11 -4
  123. data/lib/carray/frame/frame.rb +85 -21
  124. data/lib/carray/frame/group.rb +36 -3
  125. data/lib/carray/frame/io.rb +224 -15
  126. data/lib/carray/frame/records.rb +18 -4
  127. data/lib/carray/frame/sort.rb +1 -1
  128. data/lib/carray/frame/verbs.rb +32 -12
  129. data/lib/carray/fuse_source.rb +123 -0
  130. data/lib/carray/fusion.rb +218 -0
  131. data/lib/carray/histogram.rb +16 -16
  132. data/lib/carray/inspect.rb +43 -16
  133. data/lib/carray/iterator.rb +147 -3
  134. data/lib/carray/lazy.rb +88 -73
  135. data/lib/carray/mask_gap_fill.rb +3 -1
  136. data/lib/carray/meld_reduce.rb +2 -2
  137. data/lib/carray/methods/align_addr.rb +1 -1
  138. data/lib/carray/methods/composition.rb +1 -1
  139. data/lib/carray/methods/discovery_along.rb +74 -0
  140. data/lib/carray/methods/factorize.rb +50 -0
  141. data/lib/carray/methods/is_in.rb +25 -14
  142. data/lib/carray/methods/locate_addr.rb +81 -3
  143. data/lib/carray/methods/mask_duplicates.rb +36 -2
  144. data/lib/carray/methods/meshgrid.rb +4 -5
  145. data/lib/carray/methods/mode.rb +2 -2
  146. data/lib/carray/methods/nunique.rb +23 -2
  147. data/lib/carray/methods/repeat.rb +110 -0
  148. data/lib/carray/methods/snap.rb +7 -2
  149. data/lib/carray/methods/unique.rb +44 -4
  150. data/lib/carray/methods/value_counts.rb +2 -2
  151. data/lib/carray/rng.rb +86 -0
  152. data/lib/carray/runtime.rb +0 -19
  153. data/lib/carray/slab_iterator.rb +77 -19
  154. data/lib/carray/string_operation_extension.rb +10 -6
  155. data/lib/carray/time.rb +906 -491
  156. data/lib/carray/window_iterator.rb +421 -27
  157. data/lib/carray.rb +7 -5
  158. data/yard-stubs/ca_obj_array.rb +385 -0
  159. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  160. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  161. data/yard-stubs/ca_obj_block.rb +68 -0
  162. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  163. data/yard-stubs/ca_obj_fake.rb +31 -0
  164. data/yard-stubs/ca_obj_farray.rb +32 -0
  165. data/yard-stubs/ca_obj_field.rb +45 -0
  166. data/yard-stubs/ca_obj_grid.rb +35 -0
  167. data/yard-stubs/ca_obj_refer.rb +72 -0
  168. data/yard-stubs/ca_obj_roll.rb +45 -0
  169. data/yard-stubs/ca_obj_shift.rb +43 -0
  170. data/yard-stubs/ca_obj_stride.rb +181 -0
  171. data/yard-stubs/ca_obj_tile.rb +29 -0
  172. data/yard-stubs/ca_obj_transpose.rb +40 -0
  173. data/yard-stubs/ca_obj_window.rb +57 -0
  174. data/yard-stubs/carray_access.rb +131 -0
  175. data/yard-stubs/carray_attribute.rb +246 -0
  176. data/yard-stubs/carray_broadcast.rb +37 -0
  177. data/yard-stubs/carray_cast.rb +489 -0
  178. data/yard-stubs/carray_class.rb +65 -0
  179. data/yard-stubs/carray_conversion.rb +76 -0
  180. data/yard-stubs/carray_copy.rb +79 -0
  181. data/yard-stubs/carray_core.rb +34 -0
  182. data/yard-stubs/carray_count.rb +84 -0
  183. data/yard-stubs/carray_element.rb +108 -0
  184. data/yard-stubs/carray_generate.rb +66 -0
  185. data/yard-stubs/carray_lazy.rb +228 -0
  186. data/yard-stubs/carray_loop.rb +140 -0
  187. data/yard-stubs/carray_mask.rb +259 -0
  188. data/yard-stubs/carray_math.rb +1615 -0
  189. data/yard-stubs/carray_mathfunc.rb +45 -0
  190. data/yard-stubs/carray_median_percentile.rb +103 -0
  191. data/yard-stubs/carray_memory_view.rb +163 -0
  192. data/yard-stubs/carray_order.rb +252 -0
  193. data/yard-stubs/carray_random.rb +89 -0
  194. data/yard-stubs/carray_scatter.rb +106 -0
  195. data/yard-stubs/carray_slab.rb +59 -0
  196. data/yard-stubs/carray_sort.rb +165 -0
  197. data/yard-stubs/carray_test.rb +85 -0
  198. data/yard-stubs/carray_undef.rb +64 -0
  199. data/yard-stubs/carray_utils.rb +97 -0
  200. data/yard-stubs/ruby_carray.rb +193 -0
  201. metadata +67 -10
  202. data/ext/ca_obj_unbound_repeat.c +0 -496
@@ -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
- }