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.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -1
  3. data/CHANGELOG.md +325 -3
  4. data/{NEWS.md → CHANGELOG.v1.md} +1 -1
  5. data/README.md +32 -32
  6. data/carray.gemspec +12 -8
  7. data/ext/ca_axis_group.c +55 -19
  8. data/ext/ca_binop_dispatch.c +5 -6
  9. data/ext/ca_binop_dispatch.h +0 -7
  10. data/ext/ca_categorical_iterator.c +13 -13
  11. data/ext/ca_for_each_element.h +6 -8
  12. data/ext/ca_group_iter.c +1 -1
  13. data/ext/ca_kernel_iterator.c +69 -23
  14. data/ext/ca_kernel_iterator.h +3 -10
  15. data/ext/ca_obj_bincmp.c +57 -27
  16. data/ext/ca_obj_binop.c +86 -30
  17. data/ext/ca_obj_const_string.c +3 -1
  18. data/ext/ca_obj_face.c +80 -0
  19. data/ext/ca_obj_face.h +33 -1
  20. data/ext/ca_obj_fake.c +11 -0
  21. data/ext/ca_obj_fixlen_string.c +3 -1
  22. data/ext/ca_obj_grid.c +11 -3
  23. data/ext/ca_obj_meld.c +13 -8
  24. data/ext/ca_obj_moncmp.c +33 -14
  25. data/ext/ca_obj_monop.c +19 -7
  26. data/ext/ca_obj_object.c +99 -4
  27. data/ext/ca_obj_record.c +3 -1
  28. data/ext/ca_obj_refer.c +30 -6
  29. data/ext/ca_obj_roll.c +13 -5
  30. data/ext/ca_obj_select_axis.c +16 -6
  31. data/ext/ca_obj_shift.c +3 -3
  32. data/ext/ca_obj_stride.c +106 -23
  33. data/ext/ca_obj_string.c +3 -1
  34. data/ext/ca_obj_tile.c +13 -5
  35. data/ext/ca_obj_time.c +3 -1
  36. data/ext/ca_obj_timedelta.c +3 -1
  37. data/ext/ca_obj_transpose.c +1 -1
  38. data/ext/ca_obj_triop.c +62 -23
  39. data/ext/ca_obj_window.c +86 -17
  40. data/ext/ca_op_cmplx64.h +123 -0
  41. data/ext/ca_op_ipower.c +0 -3
  42. data/ext/ca_sort_kernels.h +5 -5
  43. data/ext/ca_sweep_engine.c +78 -35
  44. data/ext/ca_sweep_engine.h +13 -4
  45. data/ext/ca_transform_common.c +7 -0
  46. data/ext/carray.h +127 -130
  47. data/ext/carray_access.c +56 -34
  48. data/ext/carray_bincount.c +8 -8
  49. data/ext/carray_broadcast.c +99 -6
  50. data/ext/carray_build_flags.h +3 -0
  51. data/ext/carray_call_cfunc.c +1491 -0
  52. data/ext/carray_call_cfunc.h +153 -0
  53. data/ext/carray_cast.c +69 -31
  54. data/ext/carray_conversion.c +22 -22
  55. data/ext/carray_copy.c +12 -2
  56. data/ext/carray_core.c +57 -10
  57. data/ext/carray_count.c +1 -1
  58. data/ext/carray_element.c +7 -7
  59. data/ext/carray_factorize.c +28 -28
  60. data/ext/carray_hold.c +1 -1
  61. data/ext/carray_index_classifier.c +7 -21
  62. data/ext/carray_internal.h +19 -3
  63. data/ext/carray_kernels_bincmp.c +1 -0
  64. data/ext/carray_kernels_binop.c +320 -298
  65. data/ext/carray_kernels_init.c +1095 -0
  66. data/ext/carray_kernels_map.c +1 -0
  67. data/ext/carray_kernels_moncmp.c +1 -0
  68. data/ext/carray_kernels_monop.c +412 -411
  69. data/ext/carray_kernels_reduce_aggregate.c +88 -87
  70. data/ext/carray_kernels_reduce_boolean.c +1 -0
  71. data/ext/carray_kernels_reduce_cumulative.c +54 -53
  72. data/ext/carray_kernels_reduce_extreme.c +51 -50
  73. data/ext/carray_kernels_reduce_variance.c +1 -0
  74. data/ext/carray_kernels_scan.c +1 -0
  75. data/ext/carray_kernels_search.c +93 -92
  76. data/ext/carray_kernels_sort.c +1 -0
  77. data/ext/carray_kernels_triop.c +1 -0
  78. data/ext/carray_lazy.c +175 -5
  79. data/ext/carray_mask.c +6 -5
  80. data/ext/carray_median_percentile.c +1 -1
  81. data/ext/carray_memory_view.c +46 -21
  82. data/ext/carray_operator.c +46 -49
  83. data/ext/carray_partition.c +4 -4
  84. data/ext/carray_random.c +7 -7
  85. data/ext/carray_scatter.c +1 -1
  86. data/ext/carray_sort.c +3 -3
  87. data/ext/carray_sort_kernel.c +10 -10
  88. data/ext/carray_test.c +1 -1
  89. data/ext/extconf.rb +18 -0
  90. data/ext/mk_call_cfunc.rb +243 -52
  91. data/ext/mkkernel.rb +354 -100
  92. data/ext/ruby_carray.c +18 -16
  93. data/ext/version.h +4 -4
  94. data/lib/carray/autoload_carray.rb +19 -0
  95. data/lib/carray/autoload_method_extension.rb +2 -1
  96. data/lib/carray/axis_group.rb +7 -7
  97. data/lib/carray/basics.rb +59 -59
  98. data/lib/carray/bincount_nd.rb +12 -12
  99. data/lib/carray/block_iterator.rb +24 -14
  100. data/lib/carray/categorical.rb +4 -4
  101. data/lib/carray/categorical_iterator.rb +98 -76
  102. data/lib/carray/conditional.rb +14 -14
  103. data/lib/carray/construct.rb +21 -0
  104. data/lib/carray/core_extensions.rb +62 -5
  105. data/lib/carray/data_type_extension.rb +18 -1
  106. data/lib/carray/frame/concat.rb +3 -3
  107. data/lib/carray/frame/convert.rb +1 -1
  108. data/lib/carray/frame/frame.rb +4 -11
  109. data/lib/carray/frame/io.rb +159 -2
  110. data/lib/carray/frame/sort.rb +1 -1
  111. data/lib/carray/frame/verbs.rb +18 -1
  112. data/lib/carray/fuse_source.rb +123 -0
  113. data/lib/carray/fusion.rb +218 -0
  114. data/lib/carray/histogram.rb +16 -16
  115. data/lib/carray/inspect.rb +1 -7
  116. data/lib/carray/iterator.rb +4 -3
  117. data/lib/carray/lazy.rb +125 -73
  118. data/lib/carray/meld_reduce.rb +2 -2
  119. data/lib/carray/methods/align_addr.rb +1 -1
  120. data/lib/carray/methods/composition.rb +1 -1
  121. data/lib/carray/methods/is_in.rb +12 -12
  122. data/lib/carray/methods/locate_addr.rb +6 -1
  123. data/lib/carray/methods/mask_duplicates.rb +1 -1
  124. data/lib/carray/methods/meshgrid.rb +4 -5
  125. data/lib/carray/methods/mode.rb +2 -2
  126. data/lib/carray/methods/nunique.rb +1 -1
  127. data/lib/carray/methods/snap.rb +7 -2
  128. data/lib/carray/methods/unique.rb +3 -3
  129. data/lib/carray/methods/value_counts.rb +2 -2
  130. data/lib/carray/runtime.rb +0 -19
  131. data/lib/carray/slab_iterator.rb +20 -7
  132. data/lib/carray/string_operation_extension.rb +5 -5
  133. data/lib/carray/time.rb +890 -491
  134. data/lib/carray/window_iterator.rb +285 -13
  135. data/lib/carray.rb +5 -5
  136. data/yard-stubs/ca_obj_array.rb +385 -0
  137. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  138. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  139. data/yard-stubs/ca_obj_block.rb +73 -0
  140. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  141. data/yard-stubs/ca_obj_fake.rb +31 -0
  142. data/yard-stubs/ca_obj_farray.rb +32 -0
  143. data/yard-stubs/ca_obj_field.rb +45 -0
  144. data/yard-stubs/ca_obj_grid.rb +35 -0
  145. data/yard-stubs/ca_obj_refer.rb +72 -0
  146. data/yard-stubs/ca_obj_roll.rb +45 -0
  147. data/yard-stubs/ca_obj_shift.rb +43 -0
  148. data/yard-stubs/ca_obj_stride.rb +181 -0
  149. data/yard-stubs/ca_obj_tile.rb +29 -0
  150. data/yard-stubs/ca_obj_transpose.rb +40 -0
  151. data/yard-stubs/ca_obj_window.rb +49 -0
  152. data/yard-stubs/carray_access.rb +131 -0
  153. data/yard-stubs/carray_attribute.rb +246 -0
  154. data/yard-stubs/carray_broadcast.rb +37 -0
  155. data/yard-stubs/carray_cast.rb +489 -0
  156. data/yard-stubs/carray_class.rb +65 -0
  157. data/yard-stubs/carray_conversion.rb +76 -0
  158. data/yard-stubs/carray_copy.rb +79 -0
  159. data/yard-stubs/carray_core.rb +114 -0
  160. data/yard-stubs/carray_count.rb +79 -0
  161. data/yard-stubs/carray_element.rb +108 -0
  162. data/yard-stubs/carray_generate.rb +66 -0
  163. data/yard-stubs/carray_lazy.rb +23 -0
  164. data/yard-stubs/carray_loop.rb +140 -0
  165. data/yard-stubs/carray_mask.rb +259 -0
  166. data/yard-stubs/carray_math.rb +132 -0
  167. data/yard-stubs/carray_mathfunc.rb +45 -0
  168. data/yard-stubs/carray_median_percentile.rb +89 -0
  169. data/yard-stubs/carray_memory_view.rb +163 -0
  170. data/yard-stubs/carray_order.rb +312 -0
  171. data/yard-stubs/carray_random.rb +89 -0
  172. data/yard-stubs/carray_scatter.rb +106 -0
  173. data/yard-stubs/carray_slab.rb +57 -0
  174. data/yard-stubs/carray_sort.rb +163 -0
  175. data/yard-stubs/carray_test.rb +85 -0
  176. data/yard-stubs/carray_undef.rb +64 -0
  177. data/yard-stubs/carray_utils.rb +97 -0
  178. data/yard-stubs/ruby_carray.rb +193 -0
  179. metadata +59 -10
  180. 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.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 is an extension library for the multi-dimensional numerical array
14
- class. The name "CArray" comes from the meaning of a wrapper to a numerical array
15
- handled by the C language. CArray stores integers or floating-point numbers in
16
- memory block and treats them collectively to ensure efficient performance.
17
- Therefore, Ruby/CArray is suitable for numerical computation and data analysis.
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.8
306
+ rubygems_version: 4.0.17
258
307
  specification_version: 4
259
- summary: Multi-dimesional array class for Ruby
308
+ summary: Multi-dimensional numerical array class for Ruby
260
309
  test_files: []
@@ -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
- }