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
@@ -330,7 +337,7 @@ ca_triop_fma_float32_t (ca_size_t n, boolean8_t *m,
330
337
  p2 = q2 + k*i2;
331
338
  p3 = q3 + k*i3;
332
339
  p4 = q4 + k*i4;
333
- { (*p4) = fma((*p1), (*p2), (*p3)); }
340
+ { (*p4) = fmaf((*p1), (*p2), (*p3)); }
334
341
  }
335
342
  }
336
343
  } else {
@@ -339,7 +346,7 @@ ca_triop_fma_float32_t (ca_size_t n, boolean8_t *m,
339
346
  p2 = q2 + k*i2;
340
347
  p3 = q3 + k*i3;
341
348
  p4 = q4 + k*i4;
342
- { (*p4) = fma((*p1), (*p2), (*p3)); }
349
+ { (*p4) = fmaf((*p1), (*p2), (*p3)); }
343
350
  }
344
351
  }
345
352
  }
@@ -801,7 +808,7 @@ ca_triop_fms_float32_t (ca_size_t n, boolean8_t *m,
801
808
  p2 = q2 + k*i2;
802
809
  p3 = q3 + k*i3;
803
810
  p4 = q4 + k*i4;
804
- { (*p4) = fma((*p1), (*p2), -(*p3)); }
811
+ { (*p4) = fmaf((*p1), (*p2), -(*p3)); }
805
812
  }
806
813
  }
807
814
  } else {
@@ -810,7 +817,7 @@ ca_triop_fms_float32_t (ca_size_t n, boolean8_t *m,
810
817
  p2 = q2 + k*i2;
811
818
  p3 = q3 + k*i3;
812
819
  p4 = q4 + k*i4;
813
- { (*p4) = fma((*p1), (*p2), -(*p3)); }
820
+ { (*p4) = fmaf((*p1), (*p2), -(*p3)); }
814
821
  }
815
822
  }
816
823
  }
@@ -1378,8 +1385,473 @@ ca_triop_clip[CA_NTYPE] = {
1378
1385
  VALUE rb_ca_clip (VALUE self, VALUE other2, VALUE other3)
1379
1386
  { return rb_ca_call_triop(self, other2, other3, ca_triop_clip); }
1380
1387
 
1381
- VALUE rb_ca_clip_bang (VALUE self, VALUE other2, VALUE other3)
1382
- { return rb_ca_call_triop_bang(self, other2, other3, ca_triop_clip); }
1388
+ /* ===== triop select ============================================ */
1389
+
1390
+ static void
1391
+ ca_triop_select_int8_t (ca_size_t n, boolean8_t *m,
1392
+ char *ptr1, ca_size_t i1,
1393
+ char *ptr2, ca_size_t i2,
1394
+ char *ptr3, ca_size_t i3,
1395
+ char *ptr4, ca_size_t i4)
1396
+ {
1397
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2,
1398
+ *q3 = (int8_t *) ptr3, *q4 = (int8_t *) ptr4;
1399
+ int8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1400
+ ca_size_t k;
1401
+ if ( m ) {
1402
+ boolean8_t *pm;
1403
+ for (k=0; k<n; k++) {
1404
+ pm = m + k;
1405
+ if ( ! *pm ) {
1406
+ p1 = q1 + k*i1;
1407
+ p2 = q2 + k*i2;
1408
+ p3 = q3 + k*i3;
1409
+ p4 = q4 + k*i4;
1410
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1411
+ }
1412
+ }
1413
+ } else {
1414
+ for (k=0; k<n; k++) {
1415
+ p1 = q1 + k*i1;
1416
+ p2 = q2 + k*i2;
1417
+ p3 = q3 + k*i3;
1418
+ p4 = q4 + k*i4;
1419
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1420
+ }
1421
+ }
1422
+ }
1423
+
1424
+ static void
1425
+ ca_triop_select_uint8_t (ca_size_t n, boolean8_t *m,
1426
+ char *ptr1, ca_size_t i1,
1427
+ char *ptr2, ca_size_t i2,
1428
+ char *ptr3, ca_size_t i3,
1429
+ char *ptr4, ca_size_t i4)
1430
+ {
1431
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2,
1432
+ *q3 = (uint8_t *) ptr3, *q4 = (uint8_t *) ptr4;
1433
+ uint8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1434
+ ca_size_t k;
1435
+ if ( m ) {
1436
+ boolean8_t *pm;
1437
+ for (k=0; k<n; k++) {
1438
+ pm = m + k;
1439
+ if ( ! *pm ) {
1440
+ p1 = q1 + k*i1;
1441
+ p2 = q2 + k*i2;
1442
+ p3 = q3 + k*i3;
1443
+ p4 = q4 + k*i4;
1444
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1445
+ }
1446
+ }
1447
+ } else {
1448
+ for (k=0; k<n; k++) {
1449
+ p1 = q1 + k*i1;
1450
+ p2 = q2 + k*i2;
1451
+ p3 = q3 + k*i3;
1452
+ p4 = q4 + k*i4;
1453
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1454
+ }
1455
+ }
1456
+ }
1457
+
1458
+ static void
1459
+ ca_triop_select_int16_t (ca_size_t n, boolean8_t *m,
1460
+ char *ptr1, ca_size_t i1,
1461
+ char *ptr2, ca_size_t i2,
1462
+ char *ptr3, ca_size_t i3,
1463
+ char *ptr4, ca_size_t i4)
1464
+ {
1465
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
1466
+ *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
1467
+ int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1468
+ ca_size_t k;
1469
+ if ( m ) {
1470
+ boolean8_t *pm;
1471
+ for (k=0; k<n; k++) {
1472
+ pm = m + k;
1473
+ if ( ! *pm ) {
1474
+ p1 = q1 + k*i1;
1475
+ p2 = q2 + k*i2;
1476
+ p3 = q3 + k*i3;
1477
+ p4 = q4 + k*i4;
1478
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1479
+ }
1480
+ }
1481
+ } else {
1482
+ for (k=0; k<n; k++) {
1483
+ p1 = q1 + k*i1;
1484
+ p2 = q2 + k*i2;
1485
+ p3 = q3 + k*i3;
1486
+ p4 = q4 + k*i4;
1487
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1488
+ }
1489
+ }
1490
+ }
1491
+
1492
+ static void
1493
+ ca_triop_select_uint16_t (ca_size_t n, boolean8_t *m,
1494
+ char *ptr1, ca_size_t i1,
1495
+ char *ptr2, ca_size_t i2,
1496
+ char *ptr3, ca_size_t i3,
1497
+ char *ptr4, ca_size_t i4)
1498
+ {
1499
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
1500
+ *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
1501
+ uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1502
+ ca_size_t k;
1503
+ if ( m ) {
1504
+ boolean8_t *pm;
1505
+ for (k=0; k<n; k++) {
1506
+ pm = m + k;
1507
+ if ( ! *pm ) {
1508
+ p1 = q1 + k*i1;
1509
+ p2 = q2 + k*i2;
1510
+ p3 = q3 + k*i3;
1511
+ p4 = q4 + k*i4;
1512
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1513
+ }
1514
+ }
1515
+ } else {
1516
+ for (k=0; k<n; k++) {
1517
+ p1 = q1 + k*i1;
1518
+ p2 = q2 + k*i2;
1519
+ p3 = q3 + k*i3;
1520
+ p4 = q4 + k*i4;
1521
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1522
+ }
1523
+ }
1524
+ }
1525
+
1526
+ static void
1527
+ ca_triop_select_int32_t (ca_size_t n, boolean8_t *m,
1528
+ char *ptr1, ca_size_t i1,
1529
+ char *ptr2, ca_size_t i2,
1530
+ char *ptr3, ca_size_t i3,
1531
+ char *ptr4, ca_size_t i4)
1532
+ {
1533
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
1534
+ *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
1535
+ int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1536
+ ca_size_t k;
1537
+ if ( m ) {
1538
+ boolean8_t *pm;
1539
+ for (k=0; k<n; k++) {
1540
+ pm = m + k;
1541
+ if ( ! *pm ) {
1542
+ p1 = q1 + k*i1;
1543
+ p2 = q2 + k*i2;
1544
+ p3 = q3 + k*i3;
1545
+ p4 = q4 + k*i4;
1546
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1547
+ }
1548
+ }
1549
+ } else {
1550
+ for (k=0; k<n; k++) {
1551
+ p1 = q1 + k*i1;
1552
+ p2 = q2 + k*i2;
1553
+ p3 = q3 + k*i3;
1554
+ p4 = q4 + k*i4;
1555
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1556
+ }
1557
+ }
1558
+ }
1559
+
1560
+ static void
1561
+ ca_triop_select_uint32_t (ca_size_t n, boolean8_t *m,
1562
+ char *ptr1, ca_size_t i1,
1563
+ char *ptr2, ca_size_t i2,
1564
+ char *ptr3, ca_size_t i3,
1565
+ char *ptr4, ca_size_t i4)
1566
+ {
1567
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
1568
+ *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
1569
+ uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1570
+ ca_size_t k;
1571
+ if ( m ) {
1572
+ boolean8_t *pm;
1573
+ for (k=0; k<n; k++) {
1574
+ pm = m + k;
1575
+ if ( ! *pm ) {
1576
+ p1 = q1 + k*i1;
1577
+ p2 = q2 + k*i2;
1578
+ p3 = q3 + k*i3;
1579
+ p4 = q4 + k*i4;
1580
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1581
+ }
1582
+ }
1583
+ } else {
1584
+ for (k=0; k<n; k++) {
1585
+ p1 = q1 + k*i1;
1586
+ p2 = q2 + k*i2;
1587
+ p3 = q3 + k*i3;
1588
+ p4 = q4 + k*i4;
1589
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1590
+ }
1591
+ }
1592
+ }
1593
+
1594
+ static void
1595
+ ca_triop_select_int64_t (ca_size_t n, boolean8_t *m,
1596
+ char *ptr1, ca_size_t i1,
1597
+ char *ptr2, ca_size_t i2,
1598
+ char *ptr3, ca_size_t i3,
1599
+ char *ptr4, ca_size_t i4)
1600
+ {
1601
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
1602
+ *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
1603
+ int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1604
+ ca_size_t k;
1605
+ if ( m ) {
1606
+ boolean8_t *pm;
1607
+ for (k=0; k<n; k++) {
1608
+ pm = m + k;
1609
+ if ( ! *pm ) {
1610
+ p1 = q1 + k*i1;
1611
+ p2 = q2 + k*i2;
1612
+ p3 = q3 + k*i3;
1613
+ p4 = q4 + k*i4;
1614
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1615
+ }
1616
+ }
1617
+ } else {
1618
+ for (k=0; k<n; k++) {
1619
+ p1 = q1 + k*i1;
1620
+ p2 = q2 + k*i2;
1621
+ p3 = q3 + k*i3;
1622
+ p4 = q4 + k*i4;
1623
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1624
+ }
1625
+ }
1626
+ }
1627
+
1628
+ static void
1629
+ ca_triop_select_uint64_t (ca_size_t n, boolean8_t *m,
1630
+ char *ptr1, ca_size_t i1,
1631
+ char *ptr2, ca_size_t i2,
1632
+ char *ptr3, ca_size_t i3,
1633
+ char *ptr4, ca_size_t i4)
1634
+ {
1635
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
1636
+ *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
1637
+ uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1638
+ ca_size_t k;
1639
+ if ( m ) {
1640
+ boolean8_t *pm;
1641
+ for (k=0; k<n; k++) {
1642
+ pm = m + k;
1643
+ if ( ! *pm ) {
1644
+ p1 = q1 + k*i1;
1645
+ p2 = q2 + k*i2;
1646
+ p3 = q3 + k*i3;
1647
+ p4 = q4 + k*i4;
1648
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1649
+ }
1650
+ }
1651
+ } else {
1652
+ for (k=0; k<n; k++) {
1653
+ p1 = q1 + k*i1;
1654
+ p2 = q2 + k*i2;
1655
+ p3 = q3 + k*i3;
1656
+ p4 = q4 + k*i4;
1657
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1658
+ }
1659
+ }
1660
+ }
1661
+
1662
+ static void
1663
+ ca_triop_select_float32_t (ca_size_t n, boolean8_t *m,
1664
+ char *ptr1, ca_size_t i1,
1665
+ char *ptr2, ca_size_t i2,
1666
+ char *ptr3, ca_size_t i3,
1667
+ char *ptr4, ca_size_t i4)
1668
+ {
1669
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
1670
+ *q3 = (float *) ptr3, *q4 = (float *) ptr4;
1671
+ float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1672
+ ca_size_t k;
1673
+ if ( m ) {
1674
+ boolean8_t *pm;
1675
+ for (k=0; k<n; k++) {
1676
+ pm = m + k;
1677
+ if ( ! *pm ) {
1678
+ p1 = q1 + k*i1;
1679
+ p2 = q2 + k*i2;
1680
+ p3 = q3 + k*i3;
1681
+ p4 = q4 + k*i4;
1682
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1683
+ }
1684
+ }
1685
+ } else {
1686
+ for (k=0; k<n; k++) {
1687
+ p1 = q1 + k*i1;
1688
+ p2 = q2 + k*i2;
1689
+ p3 = q3 + k*i3;
1690
+ p4 = q4 + k*i4;
1691
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1692
+ }
1693
+ }
1694
+ }
1695
+
1696
+ static void
1697
+ ca_triop_select_float64_t (ca_size_t n, boolean8_t *m,
1698
+ char *ptr1, ca_size_t i1,
1699
+ char *ptr2, ca_size_t i2,
1700
+ char *ptr3, ca_size_t i3,
1701
+ char *ptr4, ca_size_t i4)
1702
+ {
1703
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
1704
+ *q3 = (double *) ptr3, *q4 = (double *) ptr4;
1705
+ double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1706
+ ca_size_t k;
1707
+ if ( m ) {
1708
+ boolean8_t *pm;
1709
+ for (k=0; k<n; k++) {
1710
+ pm = m + k;
1711
+ if ( ! *pm ) {
1712
+ p1 = q1 + k*i1;
1713
+ p2 = q2 + k*i2;
1714
+ p3 = q3 + k*i3;
1715
+ p4 = q4 + k*i4;
1716
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1717
+ }
1718
+ }
1719
+ } else {
1720
+ for (k=0; k<n; k++) {
1721
+ p1 = q1 + k*i1;
1722
+ p2 = q2 + k*i2;
1723
+ p3 = q3 + k*i3;
1724
+ p4 = q4 + k*i4;
1725
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1726
+ }
1727
+ }
1728
+ }
1729
+
1730
+ static void
1731
+ ca_triop_select_cmplx64_t (ca_size_t n, boolean8_t *m,
1732
+ char *ptr1, ca_size_t i1,
1733
+ char *ptr2, ca_size_t i2,
1734
+ char *ptr3, ca_size_t i3,
1735
+ char *ptr4, ca_size_t i4)
1736
+ {
1737
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2,
1738
+ *q3 = (cmplx64_t *) ptr3, *q4 = (cmplx64_t *) ptr4;
1739
+ cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1740
+ ca_size_t k;
1741
+ if ( m ) {
1742
+ boolean8_t *pm;
1743
+ for (k=0; k<n; k++) {
1744
+ pm = m + k;
1745
+ if ( ! *pm ) {
1746
+ p1 = q1 + k*i1;
1747
+ p2 = q2 + k*i2;
1748
+ p3 = q3 + k*i3;
1749
+ p4 = q4 + k*i4;
1750
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1751
+ }
1752
+ }
1753
+ } else {
1754
+ for (k=0; k<n; k++) {
1755
+ p1 = q1 + k*i1;
1756
+ p2 = q2 + k*i2;
1757
+ p3 = q3 + k*i3;
1758
+ p4 = q4 + k*i4;
1759
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1760
+ }
1761
+ }
1762
+ }
1763
+
1764
+ static void
1765
+ ca_triop_select_cmplx128_t (ca_size_t n, boolean8_t *m,
1766
+ char *ptr1, ca_size_t i1,
1767
+ char *ptr2, ca_size_t i2,
1768
+ char *ptr3, ca_size_t i3,
1769
+ char *ptr4, ca_size_t i4)
1770
+ {
1771
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2,
1772
+ *q3 = (cmplx128_t *) ptr3, *q4 = (cmplx128_t *) ptr4;
1773
+ cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1774
+ ca_size_t k;
1775
+ if ( m ) {
1776
+ boolean8_t *pm;
1777
+ for (k=0; k<n; k++) {
1778
+ pm = m + k;
1779
+ if ( ! *pm ) {
1780
+ p1 = q1 + k*i1;
1781
+ p2 = q2 + k*i2;
1782
+ p3 = q3 + k*i3;
1783
+ p4 = q4 + k*i4;
1784
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1785
+ }
1786
+ }
1787
+ } else {
1788
+ for (k=0; k<n; k++) {
1789
+ p1 = q1 + k*i1;
1790
+ p2 = q2 + k*i2;
1791
+ p3 = q3 + k*i3;
1792
+ p4 = q4 + k*i4;
1793
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1794
+ }
1795
+ }
1796
+ }
1797
+
1798
+ static void
1799
+ ca_triop_select_boolean8_t (ca_size_t n, boolean8_t *m,
1800
+ char *ptr1, ca_size_t i1,
1801
+ char *ptr2, ca_size_t i2,
1802
+ char *ptr3, ca_size_t i3,
1803
+ char *ptr4, ca_size_t i4)
1804
+ {
1805
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2,
1806
+ *q3 = (boolean8_t *) ptr3, *q4 = (boolean8_t *) ptr4;
1807
+ boolean8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1808
+ ca_size_t k;
1809
+ if ( m ) {
1810
+ boolean8_t *pm;
1811
+ for (k=0; k<n; k++) {
1812
+ pm = m + k;
1813
+ if ( ! *pm ) {
1814
+ p1 = q1 + k*i1;
1815
+ p2 = q2 + k*i2;
1816
+ p3 = q3 + k*i3;
1817
+ p4 = q4 + k*i4;
1818
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1819
+ }
1820
+ }
1821
+ } else {
1822
+ for (k=0; k<n; k++) {
1823
+ p1 = q1 + k*i1;
1824
+ p2 = q2 + k*i2;
1825
+ p3 = q3 + k*i3;
1826
+ p4 = q4 + k*i4;
1827
+ { (*p4) = (*p1) ? (*p2) : (*p3); }
1828
+ }
1829
+ }
1830
+ }
1831
+
1832
+ ca_triop_func_t
1833
+ ca_triop_select[CA_NTYPE] = {
1834
+ ca_triop_not_implement,
1835
+ ca_triop_select_boolean8_t,
1836
+ ca_triop_select_int8_t,
1837
+ ca_triop_select_uint8_t,
1838
+ ca_triop_select_int16_t,
1839
+ ca_triop_select_uint16_t,
1840
+ ca_triop_select_int32_t,
1841
+ ca_triop_select_uint32_t,
1842
+ ca_triop_select_int64_t,
1843
+ ca_triop_select_uint64_t,
1844
+ ca_triop_select_float32_t,
1845
+ ca_triop_select_float64_t,
1846
+ ca_triop_not_implement,
1847
+ ca_triop_select_cmplx64_t,
1848
+ ca_triop_select_cmplx128_t,
1849
+ ca_triop_not_implement,
1850
+ ca_triop_not_implement,
1851
+ };
1852
+
1853
+ VALUE rb_ca_select (VALUE self, VALUE other2, VALUE other3)
1854
+ { return rb_ca_call_triop(self, other2, other3, ca_triop_select); }
1383
1855
 
1384
1856
  void
1385
1857
  Init_carray_kernels_triop (void)
@@ -1388,5 +1860,5 @@ Init_carray_kernels_triop (void)
1388
1860
  rb_define_method(rb_cCArray, "fma!", rb_ca_fma_bang, 2);
1389
1861
  rb_define_method(rb_cCArray, "fms", rb_ca_fms, 2);
1390
1862
  rb_define_method(rb_cCArray, "fms!", rb_ca_fms_bang, 2);
1391
- rb_define_method(rb_cCArray, "__clip_ki__", rb_ca_clip, 2);
1863
+ rb_define_method(rb_cCArray, "clamp_between", rb_ca_clip, 2);
1392
1864
  }