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
@@ -12,23 +12,94 @@
12
12
  ca_broadcast_pair (&self, &other)
13
13
  Two-sided expansion for binary ops (case A only: same ndim,
14
14
  size-1 axes broadcast pairwise). Leaves both operands
15
- unchanged when shapes are already equal or when they are
16
- incompatible (the caller's existing elements-mismatch raise
17
- path then handles the error). Called by carray_cast.c's
18
- coercion path and by the binop dispatcher.
15
+ unchanged when shapes are already equal, and raises when they
16
+ cannot be paired: both operands of a binary operation are
17
+ equally authoritative, so a shape conflict has no resolution.
18
+ Called by carray_cast.c's coercion path and by the binop,
19
+ bincmp and triop builders, which is every place two operands
20
+ are brought together.
19
21
 
20
22
  rb_ca_broadcast_to -- backs the public CArray#broadcast_to method
21
23
  (right-to-left axis pairing; see the docstring at the function).
22
24
 
23
25
  Case B (cross-ndim dim-prepending) is not handled by the implicit
24
- helpers; users with cross-ndim operands keep using the explicit :*
25
- form or #broadcast_to (which does accept cross-ndim with target axes
26
- pinned to size 1). See PROPOSAL_BROADCASTING_AND_UNBOUND.md.
26
+ helpers; a cross-ndim operand has to declare the axis itself, either
27
+ with the newaxis sigil (`a + c[:_, nil]`) or with #broadcast_to (which
28
+ does accept cross-ndim with target axes pinned to size 1).
27
29
 
28
30
  ---------------------------------------------------------------------------- */
29
31
 
30
32
  #include "carray.h"
31
33
 
34
+ NORETURN(static void ca_broadcast_refuse_write (VALUE dst, VALUE src));
35
+
36
+ /* Report a source that cannot be brought to the destination's shape. */
37
+ static void
38
+ ca_broadcast_refuse_write (VALUE dst, VALUE src)
39
+ {
40
+ volatile VALUE dst_s = rb_inspect(rb_funcall(dst, rb_intern("shape"), 0));
41
+ volatile VALUE src_s = rb_inspect(rb_funcall(src, rb_intern("shape"), 0));
42
+ rb_raise(rb_eRuntimeError,
43
+ "shape mismatch writing to carray (%s <- %s); shapes must agree "
44
+ "once size-1 axes are dropped, or one side must be 1-D, or the "
45
+ "source must be smaller and broadcastable -- use .flatten to "
46
+ "write the values in the order they lie",
47
+ StringValueCStr(dst_s), StringValueCStr(src_s));
48
+ }
49
+
50
+ /* Bring `*src` to `dst`'s shape for a write into `dst` (assignment, and
51
+ the in-place operators, whose result shape is the destination's by
52
+ definition). The destination owns the shape and the source only
53
+ supplies values, so what is allowed here is wider than what two
54
+ operands of a binary operation may do -- but only where nothing is
55
+ duplicated. When the counts already agree the values land in the
56
+ order they lie and the shape is merely a reading of them: shapes that
57
+ both sides claim must agree once size-1 axes are dropped, since such
58
+ an axis moves no element, and a 1-D side claims no shape at all,
59
+ whether it is the flat source or the flat container. When the source
60
+ is smaller it is repeated instead, and that is held to same-ndim
61
+ size-1 and is one-sided: the destination never grows. Raises when
62
+ neither reading applies. */
63
+ void
64
+ ca_broadcast_to_destination (VALUE dst, volatile VALUE *src)
65
+ {
66
+ CArray *cd, *cs;
67
+
68
+ TypedData_Get_Struct(dst, CArray, &carray_data_type, cd);
69
+ TypedData_Get_Struct(*src, CArray, &carray_data_type, cs);
70
+
71
+ if ( cs->elements == cd->elements ) {
72
+ ca_size_t dst_dim[CA_RANK_MAX], src_dim[CA_RANK_MAX];
73
+ int dst_ndim = 0, src_ndim = 0, i, agree;
74
+ if ( cd->ndim <= 1 || cs->ndim <= 1 ) return;
75
+ for ( i = 0; i < cd->ndim; i++ ) {
76
+ if ( cd->dim[i] != 1 ) dst_dim[dst_ndim++] = cd->dim[i];
77
+ }
78
+ for ( i = 0; i < cs->ndim; i++ ) {
79
+ if ( cs->dim[i] != 1 ) src_dim[src_ndim++] = cs->dim[i];
80
+ }
81
+ agree = ( dst_ndim == src_ndim );
82
+ for ( i = 0; agree && i < dst_ndim; i++ ) {
83
+ if ( dst_dim[i] != src_dim[i] ) agree = 0;
84
+ }
85
+ if ( ! agree ) ca_broadcast_refuse_write(dst, *src);
86
+ return;
87
+ }
88
+
89
+ if ( cs->elements < cd->elements && cs->ndim == cd->ndim ) {
90
+ int i;
91
+ for ( i = 0; i < cd->ndim; i++ ) {
92
+ if ( cs->dim[i] != cd->dim[i] && cs->dim[i] != 1 ) break;
93
+ }
94
+ if ( i == cd->ndim ) {
95
+ *src = ca_broadcast_view(*src, cd->ndim, cd->dim);
96
+ return;
97
+ }
98
+ }
99
+
100
+ ca_broadcast_refuse_write(dst, *src);
101
+ }
102
+
32
103
  /* Build a CAStride view of `src` with shape `target_dim`. For each
33
104
  axis where src.dim[i] == target_dim[i], inherit the row-major byte
34
105
  stride; for src.dim[i] == 1 and target_dim[i] > 1, use stride 0.
@@ -99,6 +170,24 @@ ca_broadcast_view (VALUE src, int8_t ndim, ca_size_t *target_dim)
99
170
  pairwise equal, no-op. If any axis pair is incompatible (neither
100
171
  side is 1 nor equal), no-op (caller's existing element-count check
101
172
  raises). */
173
+ NORETURN(static void ca_broadcast_refuse (VALUE self, VALUE other));
174
+
175
+ /* Report a pair that cannot be brought to a common shape. Naming both
176
+ shapes is the point of the message: the caller wrote two arrays that
177
+ cannot be combined, and the only remedy is to say which two. */
178
+ static void
179
+ ca_broadcast_refuse (VALUE self, VALUE other)
180
+ {
181
+ volatile VALUE self_s = rb_inspect(rb_funcall(self, rb_intern("shape"), 0));
182
+ volatile VALUE other_s = rb_inspect(rb_funcall(other, rb_intern("shape"), 0));
183
+ rb_raise(rb_eArgError,
184
+ "shape mismatch between operands (%s and %s); shapes must "
185
+ "agree, or differ only in size-1 axes with equal ndim -- use "
186
+ ".flatten on both sides to operate on the values in the order "
187
+ "they lie",
188
+ StringValueCStr(self_s), StringValueCStr(other_s));
189
+ }
190
+
102
191
  void
103
192
  ca_broadcast_pair (volatile VALUE *self, volatile VALUE *other)
104
193
  {
@@ -111,8 +200,11 @@ ca_broadcast_pair (volatile VALUE *self, volatile VALUE *other)
111
200
  TypedData_Get_Struct(*self, CArray, &carray_data_type, ca);
112
201
  TypedData_Get_Struct(*other, CArray, &carray_data_type, cb);
113
202
 
203
+ /* A scalar carries no shape and reaches every cell; leave the pair to
204
+ the caller's own scalar handling. A one-element array is not a
205
+ scalar: it states a shape, and is held to it. */
114
206
  if (ca_is_scalar(ca) || ca_is_scalar(cb)) return;
115
- if (ca->ndim != cb->ndim) return;
207
+ if (ca->ndim != cb->ndim) ca_broadcast_refuse(*self, *other);
116
208
  if (ca->ndim == 0) return;
117
209
 
118
210
  for (i = 0; i < ca->ndim; i++) {
@@ -133,7 +225,8 @@ ca_broadcast_pair (volatile VALUE *self, volatile VALUE *other)
133
225
  }
134
226
  }
135
227
 
136
- if (!can_broadcast || !needs_broadcast) return;
228
+ if (!can_broadcast) ca_broadcast_refuse(*self, *other);
229
+ if (!needs_broadcast) return;
137
230
 
138
231
  *self = ca_broadcast_view(*self, ca->ndim, target_dim);
139
232
  *other = ca_broadcast_view(*other, ca->ndim, target_dim);
@@ -0,0 +1,3 @@
1
+ /* GENERATED by extconf.rb: the flags this build's arithmetic
2
+ was compiled with. See CArray::BUILD_FLAGS. */
3
+ #define CA_BUILD_FLAGS "-O3 -fno-fast-math -fopenmp-simd -march=native"