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
@@ -13,7 +13,7 @@
13
13
  * OUTPUT (fsync=='1') -> ca_attach + use ca->ptr (sync on release)
14
14
  * INPUT (fsync=='0') alias-able -> ca_attach + use ca->ptr
15
15
  * INPUT (fsync=='0') non-alias -> xmalloc + ca_xfer_all(GET)
16
- * (2) broadcast shape check (scalar collapse + n_kernel agreement)
16
+ * (2) operand pairing (scalar collapse; arrays must agree in shape)
17
17
  * (3) mask OR across INPUT operands -> m0 (xmalloc, NULL if none)
18
18
  * (4) mask propagate to OUTPUT operands (overwrite output->mask)
19
19
  * (5) caller runs the per-cell loop using base[] + stride[]
@@ -84,12 +84,20 @@ typedef struct ca_sweep_state {
84
84
  ca_size_t chunk_n_max; /* max chunk size from ca_chunk_compute_n */
85
85
  ca_size_t inner; /* product of dims except outermost (= row
86
86
  size in elements for outer-axis chunking) */
87
- int chunked_state; /* 0=pre-init, 1=active, 2=done */
87
+ int chunked_state; /* 0=pre-init, 1=active, 2=done,
88
+ 3=aborted (a read raised; resources
89
+ already given back) */
90
+ boolean8_t *mask_scratch; /* chunk-sized staging for the per-chunk
91
+ mask OR; NULL when no INPUT is masked */
88
92
  } ca_sweep_state_t;
89
93
 
90
- /* Validate fsync length, acquire per-op buffers, compute broadcast shape +
91
- * strides, build mask m0, propagate mask to OUTPUTs. May raise (fsync
92
- * length mismatch, shape mismatch). */
94
+ /* Validate fsync length, pair the operands (shape), acquire per-op
95
+ * buffers, build mask m0, propagate mask to OUTPUTs. May raise: refusals
96
+ * (fsync length, shape mismatch, masked INPUT in a NO_MASK form) before
97
+ * anything is held, and a raising operand read after -- in which case
98
+ * everything acquired so far is detached / freed before the raise
99
+ * propagates, so the caller must not call release. The chunked path
100
+ * does the same for acquire_chunked and each ca_sweep_next_chunk. */
93
101
  void ca_sweep_acquire (ca_sweep_state_t *st);
94
102
 
95
103
  /* Reverse-order release: sync OUTPUTs, detach attached / xfree owned_buf,
@@ -97,6 +105,21 @@ void ca_sweep_acquire (ca_sweep_state_t *st);
97
105
  * state without re-initializing the caller-owned arrays. */
98
106
  void ca_sweep_release (ca_sweep_state_t *st);
99
107
 
108
+ /* Run walk(arg) -- the caller's loop over the acquired state -- and then
109
+ * release. If walk raises (a callback refusing a value), everything the
110
+ * engine holds is detached / freed without syncing before the raise
111
+ * propagates. Use in place of calling ca_sweep_release /
112
+ * ca_sweep_release_chunked yourself whenever the loop can raise. The
113
+ * chunked walk calls ca_sweep_next_chunk itself. */
114
+ void ca_sweep_run (ca_sweep_state_t *st, VALUE (*walk)(VALUE), VALUE arg);
115
+ void ca_sweep_run_chunked (ca_sweep_state_t *st, VALUE (*walk)(VALUE), VALUE arg);
116
+
117
+ /* Shape pairing shared with rb_ca_template_n: non-zero when a and b have
118
+ * the same ndim and dims; the refusal raises ArgumentError naming both
119
+ * shapes. */
120
+ int ca_sweep_same_shape (CArray *a, CArray *b);
121
+ NORETURN(void ca_sweep_refuse_shapes (CArray *a, CArray *b));
122
+
100
123
  /* Strict full-shape equality check used by INOUT macros (AC5: silent-
101
124
  * corruption seam prevention). Raises if ndim differs or any dim[k]
102
125
  * differs. Returns void; raises on mismatch. */
@@ -134,10 +157,17 @@ void ca_sweep_check_same_shape (CArray *ca_in, CArray *ca_out,
134
157
  * for the entire walk; ca_chunked_gather rewrites it per chunk.
135
158
  *
136
159
  * Mask handling (m0):
137
- * Built once in acquire_chunked at full size (= n_kernel bytes).
138
- * Macros that want per-cell mask read at m0[chunk_off + k].
139
- * Full-size m0 mirrors the whole path; per-chunk mask gather is a
140
- * future optim.
160
+ * Chunk-sized (= chunk_n_max bytes), re-gathered per chunk in
161
+ * ca_sweep_next_chunk. Read it at m0[k] for k < chunk_n -- it is
162
+ * indexed within the chunk, NOT by the flat cell index. (This differs
163
+ * from the whole-buffer path, where m0 spans n_kernel.)
164
+ *
165
+ * An author may WRITE m0[k] during the chunk loop (= the INOUT_MASKED
166
+ * forms' m_out). Those writes are flushed into the OUTPUT operands'
167
+ * masks when the chunk finishes -- at the top of the following
168
+ * ca_sweep_next_chunk, and once more in ca_sweep_release_chunked for
169
+ * the last chunk -- so the OUTPUT masks are created up front in
170
+ * acquire_chunked rather than propagated in one go at release.
141
171
  */
142
172
  void ca_sweep_acquire_chunked (ca_sweep_state_t *st);
143
173
  int ca_sweep_next_chunk (ca_sweep_state_t *st); /* 1 = chunk ready, 0 = done */
@@ -112,6 +112,13 @@ ca_xfer_stride_transform_fused (CArray *view,
112
112
  composed_strides, &composed_base);
113
113
  if ( !root->ptr ) return 0;
114
114
  if ( parent->bytes != root->bytes ) return 0;
115
+ /* Per-axis composition below is only meaningful for a request that walks
116
+ our own axes; a transposed / flat request over the view's addresses
117
+ (legal -- see ca_xfer_stride_request_is_axis_box in carray.h) declines
118
+ to the caller's per-cell path. */
119
+ if ( ! ca_xfer_stride_request_is_axis_box(view, starts, counts, strides) ) {
120
+ return 0;
121
+ }
115
122
 
116
123
  for ( k = 0; k < ndim; k++ ) {
117
124
  if ( view_native[k] == 0 ) return 0;