carray 3.0.2 → 3.0.4

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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
@@ -24,6 +24,13 @@
24
24
  probed by operation-table function pointer (obj_type is runtime-
25
25
  assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
26
  extern ca_operation_function_t ca_stack_func;
27
+ /* The square root of a variance: an ε-negative from rounding becomes 0,
28
+ a NaN stays NaN (fmax(NaN, 0.0) is 0.0). */
29
+ #ifndef CARRAY_SQRT_CLAMP_DEFINED
30
+ #define CARRAY_SQRT_CLAMP_DEFINED
31
+ static inline double ca_sqrt_clamp (double v) { return sqrt(v < 0.0 ? 0.0 : v); }
32
+ #endif
33
+
27
34
  /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
35
  for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
36
  return real true/false, not Integer 0/1. (BOOL2OBJ already exists
@@ -416,14 +423,14 @@ ca_moncmp_is_nan_VALUE (ca_size_t n, boolean8_t *m,
416
423
  if ( ! *pm ) {
417
424
  p1 = q1 + k*i1;
418
425
  p2 = q2 + k*i2;
419
- { (*p2) = rb_funcall((*p1), rb_intern("nan?"), 0); }
426
+ { (*p2) = RB_FLOAT_TYPE_P(*p1) ? isnan(RFLOAT_VALUE(*p1)) : (RB_INTEGER_TYPE_P(*p1) || RB_TYPE_P((*p1), T_RATIONAL)) ? 0 : RTEST(rb_funcall((*p1), rb_intern("nan?"), 0)); }
420
427
  }
421
428
  }
422
429
  } else {
423
430
  for (k=0; k<n; k++) {
424
431
  p1 = q1 + k*i1;
425
432
  p2 = q2 + k*i2;
426
- { (*p2) = rb_funcall((*p1), rb_intern("nan?"), 0); }
433
+ { (*p2) = RB_FLOAT_TYPE_P(*p1) ? isnan(RFLOAT_VALUE(*p1)) : (RB_INTEGER_TYPE_P(*p1) || RB_TYPE_P((*p1), T_RATIONAL)) ? 0 : RTEST(rb_funcall((*p1), rb_intern("nan?"), 0)); }
427
434
  }
428
435
  }
429
436
  }
@@ -832,14 +839,14 @@ ca_moncmp_is_inf_VALUE (ca_size_t n, boolean8_t *m,
832
839
  if ( ! *pm ) {
833
840
  p1 = q1 + k*i1;
834
841
  p2 = q2 + k*i2;
835
- { (*p2) = rb_funcall((*p1), rb_intern("infinite?"), 0); }
842
+ { (*p2) = RTEST(rb_funcall((*p1), rb_intern("infinite?"), 0)); }
836
843
  }
837
844
  }
838
845
  } else {
839
846
  for (k=0; k<n; k++) {
840
847
  p1 = q1 + k*i1;
841
848
  p2 = q2 + k*i2;
842
- { (*p2) = rb_funcall((*p1), rb_intern("infinite?"), 0); }
849
+ { (*p2) = RTEST(rb_funcall((*p1), rb_intern("infinite?"), 0)); }
843
850
  }
844
851
  }
845
852
  }
@@ -1248,14 +1255,14 @@ ca_moncmp_is_finite_VALUE (ca_size_t n, boolean8_t *m,
1248
1255
  if ( ! *pm ) {
1249
1256
  p1 = q1 + k*i1;
1250
1257
  p2 = q2 + k*i2;
1251
- { (*p2) = rb_funcall((*p1), rb_intern("finite?"), 0); }
1258
+ { (*p2) = RTEST(rb_funcall((*p1), rb_intern("finite?"), 0)); }
1252
1259
  }
1253
1260
  }
1254
1261
  } else {
1255
1262
  for (k=0; k<n; k++) {
1256
1263
  p1 = q1 + k*i1;
1257
1264
  p2 = q2 + k*i2;
1258
- { (*p2) = rb_funcall((*p1), rb_intern("finite?"), 0); }
1265
+ { (*p2) = RTEST(rb_funcall((*p1), rb_intern("finite?"), 0)); }
1259
1266
  }
1260
1267
  }
1261
1268
  }
@@ -2050,14 +2057,14 @@ ca_moncmp_signbit_VALUE (ca_size_t n, boolean8_t *m,
2050
2057
  if ( ! *pm ) {
2051
2058
  p1 = q1 + k*i1;
2052
2059
  p2 = q2 + k*i2;
2053
- { (*p2) = (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
2060
+ { (*p2) = RB_FLOAT_TYPE_P(*p1) ? (signbit(RFLOAT_VALUE(*p1)) != 0) : (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
2054
2061
  }
2055
2062
  }
2056
2063
  } else {
2057
2064
  for (k=0; k<n; k++) {
2058
2065
  p1 = q1 + k*i1;
2059
2066
  p2 = q2 + k*i2;
2060
- { (*p2) = (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
2067
+ { (*p2) = RB_FLOAT_TYPE_P(*p1) ? (signbit(RFLOAT_VALUE(*p1)) != 0) : (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
2061
2068
  }
2062
2069
  }
2063
2070
  }
@@ -24,6 +24,13 @@
24
24
  probed by operation-table function pointer (obj_type is runtime-
25
25
  assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
26
  extern ca_operation_function_t ca_stack_func;
27
+ /* The square root of a variance: an ε-negative from rounding becomes 0,
28
+ a NaN stays NaN (fmax(NaN, 0.0) is 0.0). */
29
+ #ifndef CARRAY_SQRT_CLAMP_DEFINED
30
+ #define CARRAY_SQRT_CLAMP_DEFINED
31
+ static inline double ca_sqrt_clamp (double v) { return sqrt(v < 0.0 ? 0.0 : v); }
32
+ #endif
33
+
27
34
  /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
35
  for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
36
  return real true/false, not Integer 0/1. (BOOL2OBJ already exists
@@ -3857,6 +3864,51 @@ ca_monop_abs_cmplx128_t (ca_size_t n, boolean8_t *m,
3857
3864
  }
3858
3865
  }
3859
3866
 
3867
+ static void
3868
+ ca_monop_abs_VALUE (ca_size_t n, boolean8_t *m,
3869
+ char * __restrict__ ptr1, ca_size_t i1,
3870
+ char * __restrict__ ptr2, ca_size_t i2)
3871
+ {
3872
+ VALUE * __restrict__ q1 = (VALUE *) ptr1;
3873
+ VALUE * __restrict__ q2 = (VALUE *) ptr2;
3874
+ ca_size_t k;
3875
+ if ( m ) {
3876
+ VALUE *p1 = q1;
3877
+ VALUE *p2 = q2;
3878
+ boolean8_t *pm;
3879
+ for (k=0; k<n; k++) {
3880
+ pm = m + k;
3881
+ if ( ! *pm ) {
3882
+ p1 = q1 + k*i1;
3883
+ p2 = q2 + k*i2;
3884
+ { (*p2) = rb_funcall((*p1), rb_intern("abs"), 0); }
3885
+ }
3886
+ }
3887
+ } else if ( i1 == 1 && i2 == 1 ) {
3888
+ /* contig branch: SIMD-friendly form. Index-form `q[k]` exposes
3889
+ the unit-stride access to the vectorizer; `__restrict__` on
3890
+ q1/q2 promises no aliasing so the omp simd pragma can license
3891
+ lane-parallel loads/stores. Element-wise monop has no
3892
+ reassoc, so ε-close numeric contract is unaffected. */
3893
+ VALUE *p1;
3894
+ VALUE *p2;
3895
+ (void)p1; (void)p2;
3896
+ #pragma omp simd
3897
+ for (k=0; k<n; k++) {
3898
+ p1 = q1 + k; p2 = q2 + k;
3899
+ { (*p2) = rb_funcall((*p1), rb_intern("abs"), 0); }
3900
+ }
3901
+ } else {
3902
+ /* strided branch: numo-shape `p += s` increment form. */
3903
+ VALUE *p1 = q1;
3904
+ VALUE *p2 = q2;
3905
+ for (k=0; k<n; k++) {
3906
+ { (*p2) = rb_funcall((*p1), rb_intern("abs"), 0); }
3907
+ p1 += i1; p2 += i2;
3908
+ }
3909
+ }
3910
+ }
3911
+
3860
3912
  ca_monop_func_t
3861
3913
  ca_monop_abs[CA_NTYPE] = {
3862
3914
  ca_monop_not_implement,
@@ -3875,7 +3927,7 @@ ca_monop_abs[CA_NTYPE] = {
3875
3927
  ca_monop_abs_cmplx64_t,
3876
3928
  ca_monop_abs_cmplx128_t,
3877
3929
  ca_monop_not_implement,
3878
- ca_monop_not_implement,
3930
+ ca_monop_abs_VALUE,
3879
3931
  };
3880
3932
 
3881
3933
  int8_t ca_monop_abs_out_data_type[CA_NTYPE] = {
@@ -3895,7 +3947,7 @@ int8_t ca_monop_abs_out_data_type[CA_NTYPE] = {
3895
3947
  CA_FLOAT32,
3896
3948
  CA_FLOAT64,
3897
3949
  -1,
3898
- -1,
3950
+ CA_OBJECT,
3899
3951
  };
3900
3952
 
3901
3953
  VALUE rb_ca_abs (VALUE self)
@@ -3911,11 +3963,15 @@ VALUE rb_ca_abs_bang (VALUE self)
3911
3963
  int8_t in_dt;
3912
3964
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
3913
3965
  in_dt = ca->data_type;
3966
+ if ( ca_monop_abs_out_data_type[in_dt] <= CA_NONE ) {
3967
+ rb_raise(rb_eCADataTypeError,
3968
+ "abs!: source data_type :%s not supported", ca_type_name[in_dt]);
3969
+ }
3914
3970
  if ( ca_monop_abs_out_data_type[in_dt] != in_dt ) {
3915
- rb_raise(rb_eRuntimeError,
3916
- "abs!: in-place form is not available when output "
3917
- "data_type differs from input (input data_type %d -> output data_type %d); "
3918
- "use non-bang form", in_dt, ca_monop_abs_out_data_type[in_dt]);
3971
+ rb_raise(rb_eCADataTypeError,
3972
+ "abs!: abs of :%s is :%s, which cannot be written back in place; "
3973
+ "use abs", ca_type_name[in_dt],
3974
+ ca_type_name[ca_monop_abs_out_data_type[in_dt]]);
3919
3975
  }
3920
3976
  return rb_ca_call_monop_bang(self, ca_monop_abs);
3921
3977
  }
@@ -4519,11 +4575,15 @@ VALUE rb_ca_abs2_bang (VALUE self)
4519
4575
  int8_t in_dt;
4520
4576
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
4521
4577
  in_dt = ca->data_type;
4578
+ if ( ca_monop_abs2_out_data_type[in_dt] <= CA_NONE ) {
4579
+ rb_raise(rb_eCADataTypeError,
4580
+ "abs2!: source data_type :%s not supported", ca_type_name[in_dt]);
4581
+ }
4522
4582
  if ( ca_monop_abs2_out_data_type[in_dt] != in_dt ) {
4523
- rb_raise(rb_eRuntimeError,
4524
- "abs2!: in-place form is not available when output "
4525
- "data_type differs from input (input data_type %d -> output data_type %d); "
4526
- "use non-bang form", in_dt, ca_monop_abs2_out_data_type[in_dt]);
4583
+ rb_raise(rb_eCADataTypeError,
4584
+ "abs2!: abs2 of :%s is :%s, which cannot be written back in place; "
4585
+ "use abs2", ca_type_name[in_dt],
4586
+ ca_type_name[ca_monop_abs2_out_data_type[in_dt]]);
4527
4587
  }
4528
4588
  return rb_ca_call_monop_bang(self, ca_monop_abs2);
4529
4589
  }
@@ -6361,11 +6421,15 @@ VALUE rb_ca_arg_bang (VALUE self)
6361
6421
  int8_t in_dt;
6362
6422
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
6363
6423
  in_dt = ca->data_type;
6424
+ if ( ca_monop_arg_out_data_type[in_dt] <= CA_NONE ) {
6425
+ rb_raise(rb_eCADataTypeError,
6426
+ "arg!: source data_type :%s not supported", ca_type_name[in_dt]);
6427
+ }
6364
6428
  if ( ca_monop_arg_out_data_type[in_dt] != in_dt ) {
6365
- rb_raise(rb_eRuntimeError,
6366
- "arg!: in-place form is not available when output "
6367
- "data_type differs from input (input data_type %d -> output data_type %d); "
6368
- "use non-bang form", in_dt, ca_monop_arg_out_data_type[in_dt]);
6429
+ rb_raise(rb_eCADataTypeError,
6430
+ "arg!: arg of :%s is :%s, which cannot be written back in place; "
6431
+ "use arg", ca_type_name[in_dt],
6432
+ ca_type_name[ca_monop_arg_out_data_type[in_dt]]);
6369
6433
  }
6370
6434
  return rb_ca_call_monop_bang(self, ca_monop_arg);
6371
6435
  }
@@ -6929,7 +6993,7 @@ ca_monop_arg_i_float32_t (ca_size_t n, boolean8_t *m,
6929
6993
  if ( ! *pm ) {
6930
6994
  p1 = q1 + k*i1;
6931
6995
  p2 = q2 + k*i2;
6932
- { (*p2) = cargf((cmplx64_t)(*p1)); }
6996
+ { (*p2) = carg((cmplx128_t)(*p1)); }
6933
6997
  }
6934
6998
  }
6935
6999
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -6944,14 +7008,14 @@ ca_monop_arg_i_float32_t (ca_size_t n, boolean8_t *m,
6944
7008
  #pragma omp simd
6945
7009
  for (k=0; k<n; k++) {
6946
7010
  p1 = q1 + k; p2 = q2 + k;
6947
- { (*p2) = cargf((cmplx64_t)(*p1)); }
7011
+ { (*p2) = carg((cmplx128_t)(*p1)); }
6948
7012
  }
6949
7013
  } else {
6950
7014
  /* strided branch: numo-shape `p += s` increment form. */
6951
7015
  float *p1 = q1;
6952
7016
  float *p2 = q2;
6953
7017
  for (k=0; k<n; k++) {
6954
- { (*p2) = cargf((cmplx64_t)(*p1)); }
7018
+ { (*p2) = carg((cmplx128_t)(*p1)); }
6955
7019
  p1 += i1; p2 += i2;
6956
7020
  }
6957
7021
  }
@@ -9079,7 +9143,7 @@ ca_monop_round_float32_t (ca_size_t n, boolean8_t *m,
9079
9143
  if ( ! *pm ) {
9080
9144
  p1 = q1 + k*i1;
9081
9145
  p2 = q2 + k*i2;
9082
- { (*p2) = ((*p1)>0.0) ? floor((*p1)+0.5) : ((*p1)<0.0) ? ceil((*p1)-0.5) : (*p1); }
9146
+ { (*p2) = round(*p1); }
9083
9147
  }
9084
9148
  }
9085
9149
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -9094,14 +9158,14 @@ ca_monop_round_float32_t (ca_size_t n, boolean8_t *m,
9094
9158
  #pragma omp simd
9095
9159
  for (k=0; k<n; k++) {
9096
9160
  p1 = q1 + k; p2 = q2 + k;
9097
- { (*p2) = ((*p1)>0.0) ? floor((*p1)+0.5) : ((*p1)<0.0) ? ceil((*p1)-0.5) : (*p1); }
9161
+ { (*p2) = round(*p1); }
9098
9162
  }
9099
9163
  } else {
9100
9164
  /* strided branch: numo-shape `p += s` increment form. */
9101
9165
  float *p1 = q1;
9102
9166
  float *p2 = q2;
9103
9167
  for (k=0; k<n; k++) {
9104
- { (*p2) = ((*p1)>0.0) ? floor((*p1)+0.5) : ((*p1)<0.0) ? ceil((*p1)-0.5) : (*p1); }
9168
+ { (*p2) = round(*p1); }
9105
9169
  p1 += i1; p2 += i2;
9106
9170
  }
9107
9171
  }
@@ -9124,7 +9188,7 @@ ca_monop_round_float64_t (ca_size_t n, boolean8_t *m,
9124
9188
  if ( ! *pm ) {
9125
9189
  p1 = q1 + k*i1;
9126
9190
  p2 = q2 + k*i2;
9127
- { (*p2) = ((*p1)>0.0) ? floor((*p1)+0.5) : ((*p1)<0.0) ? ceil((*p1)-0.5) : (*p1); }
9191
+ { (*p2) = round(*p1); }
9128
9192
  }
9129
9193
  }
9130
9194
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -9139,14 +9203,14 @@ ca_monop_round_float64_t (ca_size_t n, boolean8_t *m,
9139
9203
  #pragma omp simd
9140
9204
  for (k=0; k<n; k++) {
9141
9205
  p1 = q1 + k; p2 = q2 + k;
9142
- { (*p2) = ((*p1)>0.0) ? floor((*p1)+0.5) : ((*p1)<0.0) ? ceil((*p1)-0.5) : (*p1); }
9206
+ { (*p2) = round(*p1); }
9143
9207
  }
9144
9208
  } else {
9145
9209
  /* strided branch: numo-shape `p += s` increment form. */
9146
9210
  double *p1 = q1;
9147
9211
  double *p2 = q2;
9148
9212
  for (k=0; k<n; k++) {
9149
- { (*p2) = ((*p1)>0.0) ? floor((*p1)+0.5) : ((*p1)<0.0) ? ceil((*p1)-0.5) : (*p1); }
9213
+ { (*p2) = round(*p1); }
9150
9214
  p1 += i1; p2 += i2;
9151
9215
  }
9152
9216
  }
@@ -9246,7 +9310,7 @@ ca_monop_rcp_int8_t (ca_size_t n, boolean8_t *m,
9246
9310
  if ( ! *pm ) {
9247
9311
  p1 = q1 + k*i1;
9248
9312
  p2 = q2 + k*i2;
9249
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9313
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9250
9314
  }
9251
9315
  }
9252
9316
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -9261,14 +9325,14 @@ ca_monop_rcp_int8_t (ca_size_t n, boolean8_t *m,
9261
9325
  #pragma omp simd
9262
9326
  for (k=0; k<n; k++) {
9263
9327
  p1 = q1 + k; p2 = q2 + k;
9264
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9328
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9265
9329
  }
9266
9330
  } else {
9267
9331
  /* strided branch: numo-shape `p += s` increment form. */
9268
9332
  int8_t *p1 = q1;
9269
9333
  int8_t *p2 = q2;
9270
9334
  for (k=0; k<n; k++) {
9271
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9335
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9272
9336
  p1 += i1; p2 += i2;
9273
9337
  }
9274
9338
  }
@@ -9336,7 +9400,7 @@ ca_monop_rcp_int16_t (ca_size_t n, boolean8_t *m,
9336
9400
  if ( ! *pm ) {
9337
9401
  p1 = q1 + k*i1;
9338
9402
  p2 = q2 + k*i2;
9339
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9403
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9340
9404
  }
9341
9405
  }
9342
9406
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -9351,14 +9415,14 @@ ca_monop_rcp_int16_t (ca_size_t n, boolean8_t *m,
9351
9415
  #pragma omp simd
9352
9416
  for (k=0; k<n; k++) {
9353
9417
  p1 = q1 + k; p2 = q2 + k;
9354
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9418
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9355
9419
  }
9356
9420
  } else {
9357
9421
  /* strided branch: numo-shape `p += s` increment form. */
9358
9422
  int16_t *p1 = q1;
9359
9423
  int16_t *p2 = q2;
9360
9424
  for (k=0; k<n; k++) {
9361
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9425
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9362
9426
  p1 += i1; p2 += i2;
9363
9427
  }
9364
9428
  }
@@ -9426,7 +9490,7 @@ ca_monop_rcp_int32_t (ca_size_t n, boolean8_t *m,
9426
9490
  if ( ! *pm ) {
9427
9491
  p1 = q1 + k*i1;
9428
9492
  p2 = q2 + k*i2;
9429
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9493
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9430
9494
  }
9431
9495
  }
9432
9496
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -9441,14 +9505,14 @@ ca_monop_rcp_int32_t (ca_size_t n, boolean8_t *m,
9441
9505
  #pragma omp simd
9442
9506
  for (k=0; k<n; k++) {
9443
9507
  p1 = q1 + k; p2 = q2 + k;
9444
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9508
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9445
9509
  }
9446
9510
  } else {
9447
9511
  /* strided branch: numo-shape `p += s` increment form. */
9448
9512
  int32_t *p1 = q1;
9449
9513
  int32_t *p2 = q2;
9450
9514
  for (k=0; k<n; k++) {
9451
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9515
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9452
9516
  p1 += i1; p2 += i2;
9453
9517
  }
9454
9518
  }
@@ -9516,7 +9580,7 @@ ca_monop_rcp_int64_t (ca_size_t n, boolean8_t *m,
9516
9580
  if ( ! *pm ) {
9517
9581
  p1 = q1 + k*i1;
9518
9582
  p2 = q2 + k*i2;
9519
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9583
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9520
9584
  }
9521
9585
  }
9522
9586
  } else if ( i1 == 1 && i2 == 1 ) {
@@ -9531,14 +9595,14 @@ ca_monop_rcp_int64_t (ca_size_t n, boolean8_t *m,
9531
9595
  #pragma omp simd
9532
9596
  for (k=0; k<n; k++) {
9533
9597
  p1 = q1 + k; p2 = q2 + k;
9534
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9598
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9535
9599
  }
9536
9600
  } else {
9537
9601
  /* strided branch: numo-shape `p += s` increment form. */
9538
9602
  int64_t *p1 = q1;
9539
9603
  int64_t *p2 = q2;
9540
9604
  for (k=0; k<n; k++) {
9541
- { if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1/(*p1); }
9605
+ { if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
9542
9606
  p1 += i1; p2 += i2;
9543
9607
  }
9544
9608
  }
@@ -15487,9 +15551,6 @@ VALUE rb_ca_expm1 (VALUE self)
15487
15551
  VALUE rb_ca_expm1_bang (VALUE self)
15488
15552
  { return rb_ca_call_monop_bang(self, ca_monop_expm1); }
15489
15553
 
15490
- VALUE rb_cmath_expm1 (VALUE mod, VALUE arg)
15491
- { return ca_math_call(mod, arg, rb_intern("expm1")); }
15492
-
15493
15554
  /* ===== monop log1p ============================================ */
15494
15555
 
15495
15556
  static void
@@ -15683,9 +15744,6 @@ VALUE rb_ca_log1p (VALUE self)
15683
15744
  VALUE rb_ca_log1p_bang (VALUE self)
15684
15745
  { return rb_ca_call_monop_bang(self, ca_monop_log1p); }
15685
15746
 
15686
- VALUE rb_cmath_log1p (VALUE mod, VALUE arg)
15687
- { return ca_math_call(mod, arg, rb_intern("log1p")); }
15688
-
15689
15747
  /* ===== monop rsqrt ============================================ */
15690
15748
 
15691
15749
  static void
@@ -18285,10 +18343,8 @@ Init_carray_kernels_monop (void)
18285
18343
  rb_define_module_function(rb_mCAMath, "atanh", rb_cmath_atanh, 1);
18286
18344
  rb_define_method(rb_cCArray, "expm1", rb_ca_expm1, 0);
18287
18345
  rb_define_method(rb_cCArray, "expm1!", rb_ca_expm1_bang, 0);
18288
- rb_define_module_function(rb_mCAMath, "expm1", rb_cmath_expm1, 1);
18289
18346
  rb_define_method(rb_cCArray, "log1p", rb_ca_log1p, 0);
18290
18347
  rb_define_method(rb_cCArray, "log1p!", rb_ca_log1p_bang, 0);
18291
- rb_define_module_function(rb_mCAMath, "log1p", rb_cmath_log1p, 1);
18292
18348
  rb_define_method(rb_cCArray, "rsqrt", rb_ca_rsqrt, 0);
18293
18349
  rb_define_method(rb_cCArray, "rsqrt!", rb_ca_rsqrt_bang, 0);
18294
18350
  rb_define_module_function(rb_mCAMath, "rsqrt", rb_cmath_rsqrt, 1);