carray 3.0.1 → 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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +520 -0
  3. data/README.md +2 -2
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +33 -4
  6. data/ext/ca_axis_group.c +202 -96
  7. data/ext/ca_categorical_iterator.c +108 -54
  8. data/ext/ca_kernel_iterator.c +317 -51
  9. data/ext/ca_kernel_iterator.h +142 -35
  10. data/ext/ca_obj_array.c +62 -20
  11. data/ext/ca_obj_block.c +4 -4
  12. data/ext/ca_obj_const_string.c +85 -26
  13. data/ext/ca_obj_face.c +24 -0
  14. data/ext/ca_obj_face.h +15 -0
  15. data/ext/ca_obj_fixlen_string.c +18 -5
  16. data/ext/ca_obj_meld.c +123 -25
  17. data/ext/ca_obj_object.c +8 -0
  18. data/ext/ca_obj_select.c +49 -34
  19. data/ext/ca_obj_stack.c +3 -8
  20. data/ext/ca_obj_stride.c +72 -1
  21. data/ext/ca_obj_string.c +8 -4
  22. data/ext/ca_obj_window.c +8 -2
  23. data/ext/ca_op_ipower.c +1 -2
  24. data/ext/ca_rng_normal.h +42 -0
  25. data/ext/ca_rng_xoshiro256pp.h +105 -0
  26. data/ext/ca_sweep_engine.c +307 -143
  27. data/ext/ca_sweep_engine.h +26 -5
  28. data/ext/carray.h +21 -2
  29. data/ext/carray_access.c +32 -20
  30. data/ext/carray_address_basis.c +590 -0
  31. data/ext/carray_broadcast.c +3 -3
  32. data/ext/carray_call_cfunc.c +667 -483
  33. data/ext/carray_cast.c +115 -41
  34. data/ext/carray_copy.c +55 -30
  35. data/ext/carray_core.c +83 -3
  36. data/ext/carray_count.c +9 -10
  37. data/ext/carray_factorize.c +46 -25
  38. data/ext/carray_internal.h +17 -0
  39. data/ext/carray_kernels_reduce_aggregate.c +168 -0
  40. data/ext/carray_kernels_reduce_cumulative.c +270 -1
  41. data/ext/carray_kernels_reduce_extreme.c +554 -8
  42. data/ext/carray_kernels_scan.c +4 -4
  43. data/ext/carray_kernels_search.c +94 -14
  44. data/ext/carray_loop.c +7 -1
  45. data/ext/carray_mask.c +23 -8
  46. data/ext/carray_median_percentile.c +55 -0
  47. data/ext/carray_operator.c +4 -4
  48. data/ext/carray_order.c +1 -1
  49. data/ext/carray_random.c +384 -40
  50. data/ext/carray_slab.c +13 -0
  51. data/ext/carray_sort.c +20 -22
  52. data/ext/mk_call_cfunc.rb +103 -116
  53. data/ext/mkkernel.rb +297 -29
  54. data/ext/ruby_carray.c +10 -1
  55. data/ext/version.h +4 -4
  56. data/lib/carray/autoload_carray.rb +5 -3
  57. data/lib/carray/autoload_method_extension.rb +12 -0
  58. data/lib/carray/axis_group.rb +77 -0
  59. data/lib/carray/basics.rb +4 -0
  60. data/lib/carray/block_iterator.rb +92 -16
  61. data/lib/carray/categorical.rb +150 -33
  62. data/lib/carray/categorical_iterator.rb +207 -80
  63. data/lib/carray/const_string.rb +131 -27
  64. data/lib/carray/construct.rb +40 -0
  65. data/lib/carray/data_type_extension.rb +3 -0
  66. data/lib/carray/data_type_limits.rb +91 -0
  67. data/lib/carray/fixlen_string.rb +1 -1
  68. data/lib/carray/frame/csv_parser.rb +11 -4
  69. data/lib/carray/frame/frame.rb +81 -10
  70. data/lib/carray/frame/group.rb +36 -3
  71. data/lib/carray/frame/io.rb +67 -15
  72. data/lib/carray/frame/records.rb +18 -4
  73. data/lib/carray/frame/verbs.rb +14 -11
  74. data/lib/carray/inspect.rb +42 -9
  75. data/lib/carray/iterator.rb +143 -0
  76. data/lib/carray/lazy.rb +0 -37
  77. data/lib/carray/mask_gap_fill.rb +3 -1
  78. data/lib/carray/methods/discovery_along.rb +74 -0
  79. data/lib/carray/methods/factorize.rb +50 -0
  80. data/lib/carray/methods/is_in.rb +13 -2
  81. data/lib/carray/methods/locate_addr.rb +75 -2
  82. data/lib/carray/methods/mask_duplicates.rb +35 -1
  83. data/lib/carray/methods/nunique.rb +22 -1
  84. data/lib/carray/methods/repeat.rb +110 -0
  85. data/lib/carray/methods/unique.rb +41 -1
  86. data/lib/carray/rng.rb +86 -0
  87. data/lib/carray/slab_iterator.rb +58 -13
  88. data/lib/carray/string_operation_extension.rb +5 -1
  89. data/lib/carray/time.rb +18 -2
  90. data/lib/carray/window_iterator.rb +142 -20
  91. data/lib/carray.rb +2 -0
  92. data/yard-stubs/ca_obj_block.rb +2 -7
  93. data/yard-stubs/ca_obj_window.rb +10 -2
  94. data/yard-stubs/carray_access.rb +1 -1
  95. data/yard-stubs/carray_broadcast.rb +1 -1
  96. data/yard-stubs/carray_core.rb +0 -80
  97. data/yard-stubs/carray_count.rb +7 -2
  98. data/yard-stubs/carray_lazy.rb +205 -0
  99. data/yard-stubs/carray_math.rb +1486 -3
  100. data/yard-stubs/carray_median_percentile.rb +16 -2
  101. data/yard-stubs/carray_order.rb +9 -69
  102. data/yard-stubs/carray_slab.rb +9 -7
  103. data/yard-stubs/carray_sort.rb +7 -5
  104. metadata +9 -1
@@ -137,6 +137,7 @@ min_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
137
137
  (void) v;
138
138
  }
139
139
  }
140
+
140
141
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
141
142
  op[__li_o * __li_INNER + __li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
142
143
  }
@@ -216,6 +217,7 @@ min_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
216
217
  (void) v;
217
218
  }
218
219
  }
220
+
219
221
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
220
222
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
221
223
  }
@@ -341,6 +343,7 @@ min_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
341
343
  (void) v;
342
344
  }
343
345
  }
346
+
344
347
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
345
348
  __li_op_k[__li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
346
349
  }
@@ -501,6 +504,7 @@ min_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
501
504
  (void) v;
502
505
  }
503
506
  }
507
+
504
508
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
505
509
  __li_op_k[__li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
506
510
  }
@@ -656,6 +660,7 @@ min_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
656
660
  (void) v;
657
661
  }
658
662
  }
663
+
659
664
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
660
665
  op[__li_o * __li_INNER + __li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
661
666
  }
@@ -735,6 +740,7 @@ min_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
735
740
  (void) v;
736
741
  }
737
742
  }
743
+
738
744
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
739
745
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
740
746
  }
@@ -860,6 +866,7 @@ min_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
860
866
  (void) v;
861
867
  }
862
868
  }
869
+
863
870
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
864
871
  __li_op_k[__li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
865
872
  }
@@ -1020,6 +1027,7 @@ min_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
1020
1027
  (void) v;
1021
1028
  }
1022
1029
  }
1030
+
1023
1031
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1024
1032
  __li_op_k[__li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
1025
1033
  }
@@ -1175,6 +1183,7 @@ min_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1175
1183
  (void) v;
1176
1184
  }
1177
1185
  }
1186
+
1178
1187
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1179
1188
  op[__li_o * __li_INNER + __li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
1180
1189
  }
@@ -1254,6 +1263,7 @@ min_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1254
1263
  (void) v;
1255
1264
  }
1256
1265
  }
1266
+
1257
1267
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1258
1268
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
1259
1269
  }
@@ -1379,6 +1389,7 @@ min_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1379
1389
  (void) v;
1380
1390
  }
1381
1391
  }
1392
+
1382
1393
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1383
1394
  __li_op_k[__li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
1384
1395
  }
@@ -1539,6 +1550,7 @@ min_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1539
1550
  (void) v;
1540
1551
  }
1541
1552
  }
1553
+
1542
1554
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1543
1555
  __li_op_k[__li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
1544
1556
  }
@@ -1694,6 +1706,7 @@ min_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1694
1706
  (void) v;
1695
1707
  }
1696
1708
  }
1709
+
1697
1710
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1698
1711
  op[__li_o * __li_INNER + __li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
1699
1712
  }
@@ -1773,6 +1786,7 @@ min_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1773
1786
  (void) v;
1774
1787
  }
1775
1788
  }
1789
+
1776
1790
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1777
1791
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
1778
1792
  }
@@ -1898,6 +1912,7 @@ min_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
1898
1912
  (void) v;
1899
1913
  }
1900
1914
  }
1915
+
1901
1916
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
1902
1917
  __li_op_k[__li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
1903
1918
  }
@@ -2058,6 +2073,7 @@ min_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2058
2073
  (void) v;
2059
2074
  }
2060
2075
  }
2076
+
2061
2077
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2062
2078
  __li_op_k[__li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
2063
2079
  }
@@ -2213,6 +2229,7 @@ min_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2213
2229
  (void) v;
2214
2230
  }
2215
2231
  }
2232
+
2216
2233
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2217
2234
  op[__li_o * __li_INNER + __li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
2218
2235
  }
@@ -2292,6 +2309,7 @@ min_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2292
2309
  (void) v;
2293
2310
  }
2294
2311
  }
2312
+
2295
2313
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2296
2314
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
2297
2315
  }
@@ -2417,6 +2435,7 @@ min_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2417
2435
  (void) v;
2418
2436
  }
2419
2437
  }
2438
+
2420
2439
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2421
2440
  __li_op_k[__li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
2422
2441
  }
@@ -2577,6 +2596,7 @@ min_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2577
2596
  (void) v;
2578
2597
  }
2579
2598
  }
2599
+
2580
2600
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2581
2601
  __li_op_k[__li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
2582
2602
  }
@@ -2732,6 +2752,7 @@ min_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2732
2752
  (void) v;
2733
2753
  }
2734
2754
  }
2755
+
2735
2756
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2736
2757
  op[__li_o * __li_INNER + __li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
2737
2758
  }
@@ -2811,6 +2832,7 @@ min_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2811
2832
  (void) v;
2812
2833
  }
2813
2834
  }
2835
+
2814
2836
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2815
2837
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
2816
2838
  }
@@ -2936,6 +2958,7 @@ min_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
2936
2958
  (void) v;
2937
2959
  }
2938
2960
  }
2961
+
2939
2962
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
2940
2963
  __li_op_k[__li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
2941
2964
  }
@@ -3096,6 +3119,7 @@ min_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3096
3119
  (void) v;
3097
3120
  }
3098
3121
  }
3122
+
3099
3123
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3100
3124
  __li_op_k[__li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
3101
3125
  }
@@ -3251,6 +3275,7 @@ min_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3251
3275
  (void) v;
3252
3276
  }
3253
3277
  }
3278
+
3254
3279
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3255
3280
  op[__li_o * __li_INNER + __li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
3256
3281
  }
@@ -3330,6 +3355,7 @@ min_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3330
3355
  (void) v;
3331
3356
  }
3332
3357
  }
3358
+
3333
3359
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3334
3360
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
3335
3361
  }
@@ -3455,6 +3481,7 @@ min_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3455
3481
  (void) v;
3456
3482
  }
3457
3483
  }
3484
+
3458
3485
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3459
3486
  __li_op_k[__li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
3460
3487
  }
@@ -3615,6 +3642,7 @@ min_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3615
3642
  (void) v;
3616
3643
  }
3617
3644
  }
3645
+
3618
3646
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3619
3647
  __li_op_k[__li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
3620
3648
  }
@@ -3770,6 +3798,7 @@ min_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3770
3798
  (void) v;
3771
3799
  }
3772
3800
  }
3801
+
3773
3802
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3774
3803
  op[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
3775
3804
  }
@@ -3849,6 +3878,7 @@ min_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3849
3878
  (void) v;
3850
3879
  }
3851
3880
  }
3881
+
3852
3882
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3853
3883
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
3854
3884
  }
@@ -3974,6 +4004,7 @@ min_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
3974
4004
  (void) v;
3975
4005
  }
3976
4006
  }
4007
+
3977
4008
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
3978
4009
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
3979
4010
  }
@@ -4134,6 +4165,7 @@ min_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4134
4165
  (void) v;
4135
4166
  }
4136
4167
  }
4168
+
4137
4169
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4138
4170
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
4139
4171
  }
@@ -4217,6 +4249,7 @@ min_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4217
4249
  ca_size_t __outer_off = 0;
4218
4250
  float acc;
4219
4251
  acc = (INFINITY);
4252
+ int64_t __anf_seen = 0;
4220
4253
  ca_size_t masked_cnt = 0; /* unused on streaming (no mask) */
4221
4254
  (void) masked_cnt;
4222
4255
  ca_lazy_arena_enter();
@@ -4231,11 +4264,13 @@ min_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4231
4264
  for ( __i = 0; __i < __n; __i++ ) {
4232
4265
  float v = __chunk[__i];
4233
4266
  acc = (v < acc) ? v : acc;
4267
+ __anf_seen |= (v == v);
4234
4268
  }
4235
4269
  __outer_off += __r;
4236
4270
  }
4237
4271
  ca_lazy_arena_release(__chunk);
4238
4272
  ca_lazy_arena_exit();
4273
+ if ( ! __anf_seen && ca->elements > 0 ) acc = (float) NAN;
4239
4274
  return rb_float_new((float) (acc));
4240
4275
  }
4241
4276
  /* L.1 / L.7: loop-interchange fast path with inner-tiling
@@ -4289,6 +4324,25 @@ min_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4289
4324
  (void) v;
4290
4325
  }
4291
4326
  }
4327
+ {
4328
+ int __li_susp = 0;
4329
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4330
+ if ( __li_buf_acc[__j] == (float) (INFINITY) ) { __li_susp = 1; break; }
4331
+ }
4332
+ if ( __li_susp ) {
4333
+ int8_t __li_buf_seen[512];
4334
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
4335
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
4336
+ const float *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
4337
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4338
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
4339
+ }
4340
+ }
4341
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4342
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
4343
+ }
4344
+ }
4345
+ }
4292
4346
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4293
4347
  op[__li_o * __li_INNER + __li_tile + __j] = (float) (__li_buf_acc[__j]);
4294
4348
  }
@@ -4368,6 +4422,25 @@ min_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4368
4422
  (void) v;
4369
4423
  }
4370
4424
  }
4425
+ {
4426
+ int __li_susp = 0;
4427
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4428
+ if ( __li_buf_acc[__j] == (float) (INFINITY) ) { __li_susp = 1; break; }
4429
+ }
4430
+ if ( __li_susp ) {
4431
+ int8_t __li_buf_seen[512];
4432
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
4433
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
4434
+ const float *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
4435
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4436
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
4437
+ }
4438
+ }
4439
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4440
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
4441
+ }
4442
+ }
4443
+ }
4371
4444
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4372
4445
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (float) (__li_buf_acc[__j]);
4373
4446
  }
@@ -4493,6 +4566,25 @@ min_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4493
4566
  (void) v;
4494
4567
  }
4495
4568
  }
4569
+ {
4570
+ int __li_susp = 0;
4571
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4572
+ if ( __li_buf_acc[__j] == (float) (INFINITY) ) { __li_susp = 1; break; }
4573
+ }
4574
+ if ( __li_susp ) {
4575
+ int8_t __li_buf_seen[512];
4576
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
4577
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
4578
+ const float *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
4579
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4580
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
4581
+ }
4582
+ }
4583
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4584
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
4585
+ }
4586
+ }
4587
+ }
4496
4588
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4497
4589
  __li_op_k[__li_tile + __j] = (float) (__li_buf_acc[__j]);
4498
4590
  }
@@ -4653,6 +4745,25 @@ min_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4653
4745
  (void) v;
4654
4746
  }
4655
4747
  }
4748
+ {
4749
+ int __li_susp = 0;
4750
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4751
+ if ( __li_buf_acc[__j] == (float) (INFINITY) ) { __li_susp = 1; break; }
4752
+ }
4753
+ if ( __li_susp ) {
4754
+ int8_t __li_buf_seen[512];
4755
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
4756
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
4757
+ const float *__li_row = __li_plane + __li_i * __li_M_stride + __li_tile;
4758
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4759
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
4760
+ }
4761
+ }
4762
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4763
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
4764
+ }
4765
+ }
4766
+ }
4656
4767
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4657
4768
  __li_op_k[__li_tile + __j] = (float) (__li_buf_acc[__j]);
4658
4769
  }
@@ -4690,6 +4801,16 @@ ca_size_t out_i = 0;
4690
4801
  #define __min_f32_EXPR(__x) ((float)(__x))
4691
4802
  CA_SLAB_REDUCE_MIN8_EX(float, float, st, p, m, acc, INFINITY, __min_f32_EXPR, masked_cnt);
4692
4803
  #undef __min_f32_EXPR
4804
+ /* all-NaN fix-up (all_nan_result: :nan). */
4805
+ if ( (acc == (INFINITY)) && masked_cnt < st.slab_elements ) {
4806
+ int64_t __anf_seen = 0;
4807
+ ca_size_t __anf_mc = 0;
4808
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
4809
+ (void) __anf_mc;
4810
+ if ( ! __anf_seen ) {
4811
+ acc = (float) NAN;
4812
+ }
4813
+ }
4693
4814
  if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
4694
4815
  if ( ! op_mask ) {
4695
4816
  ca_create_mask(co);
@@ -4736,6 +4857,7 @@ min_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4736
4857
  ca_size_t __outer_off = 0;
4737
4858
  double acc;
4738
4859
  acc = (INFINITY);
4860
+ int64_t __anf_seen = 0;
4739
4861
  ca_size_t masked_cnt = 0; /* unused on streaming (no mask) */
4740
4862
  (void) masked_cnt;
4741
4863
  ca_lazy_arena_enter();
@@ -4750,11 +4872,13 @@ min_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4750
4872
  for ( __i = 0; __i < __n; __i++ ) {
4751
4873
  double v = __chunk[__i];
4752
4874
  acc = (v < acc) ? v : acc;
4875
+ __anf_seen |= (v == v);
4753
4876
  }
4754
4877
  __outer_off += __r;
4755
4878
  }
4756
4879
  ca_lazy_arena_release(__chunk);
4757
4880
  ca_lazy_arena_exit();
4881
+ if ( ! __anf_seen && ca->elements > 0 ) acc = (double) NAN;
4758
4882
  return rb_float_new((double) (acc));
4759
4883
  }
4760
4884
  /* L.1 / L.7: loop-interchange fast path with inner-tiling
@@ -4808,6 +4932,25 @@ min_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4808
4932
  (void) v;
4809
4933
  }
4810
4934
  }
4935
+ {
4936
+ int __li_susp = 0;
4937
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4938
+ if ( __li_buf_acc[__j] == (double) (INFINITY) ) { __li_susp = 1; break; }
4939
+ }
4940
+ if ( __li_susp ) {
4941
+ int8_t __li_buf_seen[512];
4942
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
4943
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
4944
+ const double *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
4945
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4946
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
4947
+ }
4948
+ }
4949
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4950
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
4951
+ }
4952
+ }
4953
+ }
4811
4954
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4812
4955
  op[__li_o * __li_INNER + __li_tile + __j] = (double) (__li_buf_acc[__j]);
4813
4956
  }
@@ -4887,6 +5030,25 @@ min_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
4887
5030
  (void) v;
4888
5031
  }
4889
5032
  }
5033
+ {
5034
+ int __li_susp = 0;
5035
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5036
+ if ( __li_buf_acc[__j] == (double) (INFINITY) ) { __li_susp = 1; break; }
5037
+ }
5038
+ if ( __li_susp ) {
5039
+ int8_t __li_buf_seen[512];
5040
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
5041
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
5042
+ const double *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
5043
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5044
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
5045
+ }
5046
+ }
5047
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5048
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
5049
+ }
5050
+ }
5051
+ }
4890
5052
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
4891
5053
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (double) (__li_buf_acc[__j]);
4892
5054
  }
@@ -5012,6 +5174,25 @@ min_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
5012
5174
  (void) v;
5013
5175
  }
5014
5176
  }
5177
+ {
5178
+ int __li_susp = 0;
5179
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5180
+ if ( __li_buf_acc[__j] == (double) (INFINITY) ) { __li_susp = 1; break; }
5181
+ }
5182
+ if ( __li_susp ) {
5183
+ int8_t __li_buf_seen[512];
5184
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
5185
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
5186
+ const double *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
5187
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5188
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
5189
+ }
5190
+ }
5191
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5192
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
5193
+ }
5194
+ }
5195
+ }
5015
5196
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5016
5197
  __li_op_k[__li_tile + __j] = (double) (__li_buf_acc[__j]);
5017
5198
  }
@@ -5172,6 +5353,25 @@ min_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
5172
5353
  (void) v;
5173
5354
  }
5174
5355
  }
5356
+ {
5357
+ int __li_susp = 0;
5358
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5359
+ if ( __li_buf_acc[__j] == (double) (INFINITY) ) { __li_susp = 1; break; }
5360
+ }
5361
+ if ( __li_susp ) {
5362
+ int8_t __li_buf_seen[512];
5363
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
5364
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
5365
+ const double *__li_row = __li_plane + __li_i * __li_M_stride + __li_tile;
5366
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5367
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
5368
+ }
5369
+ }
5370
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5371
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
5372
+ }
5373
+ }
5374
+ }
5175
5375
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5176
5376
  __li_op_k[__li_tile + __j] = (double) (__li_buf_acc[__j]);
5177
5377
  }
@@ -5209,6 +5409,16 @@ ca_size_t out_i = 0;
5209
5409
  #define __min_f64_EXPR(__x) ((double)(__x))
5210
5410
  CA_SLAB_REDUCE_MIN8_EX(double, double, st, p, m, acc, INFINITY, __min_f64_EXPR, masked_cnt);
5211
5411
  #undef __min_f64_EXPR
5412
+ /* all-NaN fix-up (all_nan_result: :nan). */
5413
+ if ( (acc == (INFINITY)) && masked_cnt < st.slab_elements ) {
5414
+ int64_t __anf_seen = 0;
5415
+ ca_size_t __anf_mc = 0;
5416
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
5417
+ (void) __anf_mc;
5418
+ if ( ! __anf_seen ) {
5419
+ acc = (double) NAN;
5420
+ }
5421
+ }
5212
5422
  if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
5213
5423
  if ( ! op_mask ) {
5214
5424
  ca_create_mask(co);
@@ -5327,6 +5537,7 @@ min_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
5327
5537
  (void) v;
5328
5538
  }
5329
5539
  }
5540
+
5330
5541
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5331
5542
  op[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
5332
5543
  }
@@ -5406,6 +5617,7 @@ min_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
5406
5617
  (void) v;
5407
5618
  }
5408
5619
  }
5620
+
5409
5621
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5410
5622
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
5411
5623
  }
@@ -5531,6 +5743,7 @@ min_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
5531
5743
  (void) v;
5532
5744
  }
5533
5745
  }
5746
+
5534
5747
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5535
5748
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
5536
5749
  }
@@ -5691,6 +5904,7 @@ min_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
5691
5904
  (void) v;
5692
5905
  }
5693
5906
  }
5907
+
5694
5908
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5695
5909
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
5696
5910
  }
@@ -5846,6 +6060,7 @@ min_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
5846
6060
  (void) v;
5847
6061
  }
5848
6062
  }
6063
+
5849
6064
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5850
6065
  op[__li_o * __li_INNER + __li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
5851
6066
  }
@@ -5925,6 +6140,7 @@ min_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
5925
6140
  (void) v;
5926
6141
  }
5927
6142
  }
6143
+
5928
6144
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
5929
6145
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
5930
6146
  }
@@ -6050,6 +6266,7 @@ min_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
6050
6266
  (void) v;
6051
6267
  }
6052
6268
  }
6269
+
6053
6270
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
6054
6271
  __li_op_k[__li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
6055
6272
  }
@@ -6210,6 +6427,7 @@ min_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
6210
6427
  (void) v;
6211
6428
  }
6212
6429
  }
6430
+
6213
6431
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
6214
6432
  __li_op_k[__li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
6215
6433
  }
@@ -6573,6 +6791,7 @@ max_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
6573
6791
  (void) v;
6574
6792
  }
6575
6793
  }
6794
+
6576
6795
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
6577
6796
  op[__li_o * __li_INNER + __li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
6578
6797
  }
@@ -6652,6 +6871,7 @@ max_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
6652
6871
  (void) v;
6653
6872
  }
6654
6873
  }
6874
+
6655
6875
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
6656
6876
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
6657
6877
  }
@@ -6777,6 +6997,7 @@ max_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
6777
6997
  (void) v;
6778
6998
  }
6779
6999
  }
7000
+
6780
7001
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
6781
7002
  __li_op_k[__li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
6782
7003
  }
@@ -6937,6 +7158,7 @@ max_ki_native_i8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
6937
7158
  (void) v;
6938
7159
  }
6939
7160
  }
7161
+
6940
7162
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
6941
7163
  __li_op_k[__li_tile + __j] = (int8_t) (__li_buf_acc[__j]);
6942
7164
  }
@@ -7092,6 +7314,7 @@ max_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
7092
7314
  (void) v;
7093
7315
  }
7094
7316
  }
7317
+
7095
7318
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7096
7319
  op[__li_o * __li_INNER + __li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
7097
7320
  }
@@ -7171,6 +7394,7 @@ max_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
7171
7394
  (void) v;
7172
7395
  }
7173
7396
  }
7397
+
7174
7398
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7175
7399
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
7176
7400
  }
@@ -7296,6 +7520,7 @@ max_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
7296
7520
  (void) v;
7297
7521
  }
7298
7522
  }
7523
+
7299
7524
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7300
7525
  __li_op_k[__li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
7301
7526
  }
@@ -7456,6 +7681,7 @@ max_ki_native_u8 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int k
7456
7681
  (void) v;
7457
7682
  }
7458
7683
  }
7684
+
7459
7685
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7460
7686
  __li_op_k[__li_tile + __j] = (uint8_t) (__li_buf_acc[__j]);
7461
7687
  }
@@ -7611,6 +7837,7 @@ max_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
7611
7837
  (void) v;
7612
7838
  }
7613
7839
  }
7840
+
7614
7841
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7615
7842
  op[__li_o * __li_INNER + __li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
7616
7843
  }
@@ -7690,6 +7917,7 @@ max_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
7690
7917
  (void) v;
7691
7918
  }
7692
7919
  }
7920
+
7693
7921
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7694
7922
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
7695
7923
  }
@@ -7815,6 +8043,7 @@ max_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
7815
8043
  (void) v;
7816
8044
  }
7817
8045
  }
8046
+
7818
8047
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7819
8048
  __li_op_k[__li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
7820
8049
  }
@@ -7975,6 +8204,7 @@ max_ki_native_i16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
7975
8204
  (void) v;
7976
8205
  }
7977
8206
  }
8207
+
7978
8208
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
7979
8209
  __li_op_k[__li_tile + __j] = (int16_t) (__li_buf_acc[__j]);
7980
8210
  }
@@ -8130,6 +8360,7 @@ max_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8130
8360
  (void) v;
8131
8361
  }
8132
8362
  }
8363
+
8133
8364
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8134
8365
  op[__li_o * __li_INNER + __li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
8135
8366
  }
@@ -8209,6 +8440,7 @@ max_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8209
8440
  (void) v;
8210
8441
  }
8211
8442
  }
8443
+
8212
8444
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8213
8445
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
8214
8446
  }
@@ -8334,6 +8566,7 @@ max_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8334
8566
  (void) v;
8335
8567
  }
8336
8568
  }
8569
+
8337
8570
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8338
8571
  __li_op_k[__li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
8339
8572
  }
@@ -8494,6 +8727,7 @@ max_ki_native_u16 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8494
8727
  (void) v;
8495
8728
  }
8496
8729
  }
8730
+
8497
8731
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8498
8732
  __li_op_k[__li_tile + __j] = (uint16_t) (__li_buf_acc[__j]);
8499
8733
  }
@@ -8649,6 +8883,7 @@ max_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8649
8883
  (void) v;
8650
8884
  }
8651
8885
  }
8886
+
8652
8887
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8653
8888
  op[__li_o * __li_INNER + __li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
8654
8889
  }
@@ -8728,6 +8963,7 @@ max_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8728
8963
  (void) v;
8729
8964
  }
8730
8965
  }
8966
+
8731
8967
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8732
8968
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
8733
8969
  }
@@ -8853,6 +9089,7 @@ max_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
8853
9089
  (void) v;
8854
9090
  }
8855
9091
  }
9092
+
8856
9093
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
8857
9094
  __li_op_k[__li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
8858
9095
  }
@@ -9013,6 +9250,7 @@ max_ki_native_i32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9013
9250
  (void) v;
9014
9251
  }
9015
9252
  }
9253
+
9016
9254
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9017
9255
  __li_op_k[__li_tile + __j] = (int32_t) (__li_buf_acc[__j]);
9018
9256
  }
@@ -9168,6 +9406,7 @@ max_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9168
9406
  (void) v;
9169
9407
  }
9170
9408
  }
9409
+
9171
9410
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9172
9411
  op[__li_o * __li_INNER + __li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
9173
9412
  }
@@ -9247,6 +9486,7 @@ max_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9247
9486
  (void) v;
9248
9487
  }
9249
9488
  }
9489
+
9250
9490
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9251
9491
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
9252
9492
  }
@@ -9372,6 +9612,7 @@ max_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9372
9612
  (void) v;
9373
9613
  }
9374
9614
  }
9615
+
9375
9616
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9376
9617
  __li_op_k[__li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
9377
9618
  }
@@ -9532,6 +9773,7 @@ max_ki_native_u32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9532
9773
  (void) v;
9533
9774
  }
9534
9775
  }
9776
+
9535
9777
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9536
9778
  __li_op_k[__li_tile + __j] = (uint32_t) (__li_buf_acc[__j]);
9537
9779
  }
@@ -9687,6 +9929,7 @@ max_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9687
9929
  (void) v;
9688
9930
  }
9689
9931
  }
9932
+
9690
9933
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9691
9934
  op[__li_o * __li_INNER + __li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
9692
9935
  }
@@ -9766,6 +10009,7 @@ max_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9766
10009
  (void) v;
9767
10010
  }
9768
10011
  }
10012
+
9769
10013
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9770
10014
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
9771
10015
  }
@@ -9891,6 +10135,7 @@ max_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
9891
10135
  (void) v;
9892
10136
  }
9893
10137
  }
10138
+
9894
10139
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
9895
10140
  __li_op_k[__li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
9896
10141
  }
@@ -10051,6 +10296,7 @@ max_ki_native_i64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10051
10296
  (void) v;
10052
10297
  }
10053
10298
  }
10299
+
10054
10300
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10055
10301
  __li_op_k[__li_tile + __j] = (int64_t) (__li_buf_acc[__j]);
10056
10302
  }
@@ -10206,6 +10452,7 @@ max_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10206
10452
  (void) v;
10207
10453
  }
10208
10454
  }
10455
+
10209
10456
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10210
10457
  op[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
10211
10458
  }
@@ -10285,6 +10532,7 @@ max_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10285
10532
  (void) v;
10286
10533
  }
10287
10534
  }
10535
+
10288
10536
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10289
10537
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
10290
10538
  }
@@ -10410,6 +10658,7 @@ max_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10410
10658
  (void) v;
10411
10659
  }
10412
10660
  }
10661
+
10413
10662
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10414
10663
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
10415
10664
  }
@@ -10570,6 +10819,7 @@ max_ki_native_u64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10570
10819
  (void) v;
10571
10820
  }
10572
10821
  }
10822
+
10573
10823
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10574
10824
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
10575
10825
  }
@@ -10653,6 +10903,7 @@ max_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10653
10903
  ca_size_t __outer_off = 0;
10654
10904
  float acc;
10655
10905
  acc = (-INFINITY);
10906
+ int64_t __anf_seen = 0;
10656
10907
  ca_size_t masked_cnt = 0; /* unused on streaming (no mask) */
10657
10908
  (void) masked_cnt;
10658
10909
  ca_lazy_arena_enter();
@@ -10667,11 +10918,13 @@ max_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10667
10918
  for ( __i = 0; __i < __n; __i++ ) {
10668
10919
  float v = __chunk[__i];
10669
10920
  acc = (v > acc) ? v : acc;
10921
+ __anf_seen |= (v == v);
10670
10922
  }
10671
10923
  __outer_off += __r;
10672
10924
  }
10673
10925
  ca_lazy_arena_release(__chunk);
10674
10926
  ca_lazy_arena_exit();
10927
+ if ( ! __anf_seen && ca->elements > 0 ) acc = (float) NAN;
10675
10928
  return rb_float_new((float) (acc));
10676
10929
  }
10677
10930
  /* L.1 / L.7: loop-interchange fast path with inner-tiling
@@ -10725,6 +10978,25 @@ max_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10725
10978
  (void) v;
10726
10979
  }
10727
10980
  }
10981
+ {
10982
+ int __li_susp = 0;
10983
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10984
+ if ( __li_buf_acc[__j] == (float) (-INFINITY) ) { __li_susp = 1; break; }
10985
+ }
10986
+ if ( __li_susp ) {
10987
+ int8_t __li_buf_seen[512];
10988
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
10989
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
10990
+ const float *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
10991
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10992
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
10993
+ }
10994
+ }
10995
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10996
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
10997
+ }
10998
+ }
10999
+ }
10728
11000
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10729
11001
  op[__li_o * __li_INNER + __li_tile + __j] = (float) (__li_buf_acc[__j]);
10730
11002
  }
@@ -10804,6 +11076,25 @@ max_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10804
11076
  (void) v;
10805
11077
  }
10806
11078
  }
11079
+ {
11080
+ int __li_susp = 0;
11081
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11082
+ if ( __li_buf_acc[__j] == (float) (-INFINITY) ) { __li_susp = 1; break; }
11083
+ }
11084
+ if ( __li_susp ) {
11085
+ int8_t __li_buf_seen[512];
11086
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
11087
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
11088
+ const float *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
11089
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11090
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
11091
+ }
11092
+ }
11093
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11094
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
11095
+ }
11096
+ }
11097
+ }
10807
11098
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10808
11099
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (float) (__li_buf_acc[__j]);
10809
11100
  }
@@ -10929,6 +11220,25 @@ max_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
10929
11220
  (void) v;
10930
11221
  }
10931
11222
  }
11223
+ {
11224
+ int __li_susp = 0;
11225
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11226
+ if ( __li_buf_acc[__j] == (float) (-INFINITY) ) { __li_susp = 1; break; }
11227
+ }
11228
+ if ( __li_susp ) {
11229
+ int8_t __li_buf_seen[512];
11230
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
11231
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
11232
+ const float *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
11233
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11234
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
11235
+ }
11236
+ }
11237
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11238
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
11239
+ }
11240
+ }
11241
+ }
10932
11242
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
10933
11243
  __li_op_k[__li_tile + __j] = (float) (__li_buf_acc[__j]);
10934
11244
  }
@@ -11089,6 +11399,25 @@ max_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11089
11399
  (void) v;
11090
11400
  }
11091
11401
  }
11402
+ {
11403
+ int __li_susp = 0;
11404
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11405
+ if ( __li_buf_acc[__j] == (float) (-INFINITY) ) { __li_susp = 1; break; }
11406
+ }
11407
+ if ( __li_susp ) {
11408
+ int8_t __li_buf_seen[512];
11409
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
11410
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
11411
+ const float *__li_row = __li_plane + __li_i * __li_M_stride + __li_tile;
11412
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11413
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
11414
+ }
11415
+ }
11416
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11417
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (float) NAN;
11418
+ }
11419
+ }
11420
+ }
11092
11421
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11093
11422
  __li_op_k[__li_tile + __j] = (float) (__li_buf_acc[__j]);
11094
11423
  }
@@ -11126,6 +11455,16 @@ ca_size_t out_i = 0;
11126
11455
  #define __max_f32_EXPR(__x) ((float)(__x))
11127
11456
  CA_SLAB_REDUCE_MAX8_EX(float, float, st, p, m, acc, -INFINITY, __max_f32_EXPR, masked_cnt);
11128
11457
  #undef __max_f32_EXPR
11458
+ /* all-NaN fix-up (all_nan_result: :nan). */
11459
+ if ( (acc == (-INFINITY)) && masked_cnt < st.slab_elements ) {
11460
+ int64_t __anf_seen = 0;
11461
+ ca_size_t __anf_mc = 0;
11462
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
11463
+ (void) __anf_mc;
11464
+ if ( ! __anf_seen ) {
11465
+ acc = (float) NAN;
11466
+ }
11467
+ }
11129
11468
  if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
11130
11469
  if ( ! op_mask ) {
11131
11470
  ca_create_mask(co);
@@ -11172,6 +11511,7 @@ max_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11172
11511
  ca_size_t __outer_off = 0;
11173
11512
  double acc;
11174
11513
  acc = (-INFINITY);
11514
+ int64_t __anf_seen = 0;
11175
11515
  ca_size_t masked_cnt = 0; /* unused on streaming (no mask) */
11176
11516
  (void) masked_cnt;
11177
11517
  ca_lazy_arena_enter();
@@ -11186,11 +11526,13 @@ max_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11186
11526
  for ( __i = 0; __i < __n; __i++ ) {
11187
11527
  double v = __chunk[__i];
11188
11528
  acc = (v > acc) ? v : acc;
11529
+ __anf_seen |= (v == v);
11189
11530
  }
11190
11531
  __outer_off += __r;
11191
11532
  }
11192
11533
  ca_lazy_arena_release(__chunk);
11193
11534
  ca_lazy_arena_exit();
11535
+ if ( ! __anf_seen && ca->elements > 0 ) acc = (double) NAN;
11194
11536
  return rb_float_new((double) (acc));
11195
11537
  }
11196
11538
  /* L.1 / L.7: loop-interchange fast path with inner-tiling
@@ -11244,6 +11586,25 @@ max_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11244
11586
  (void) v;
11245
11587
  }
11246
11588
  }
11589
+ {
11590
+ int __li_susp = 0;
11591
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11592
+ if ( __li_buf_acc[__j] == (double) (-INFINITY) ) { __li_susp = 1; break; }
11593
+ }
11594
+ if ( __li_susp ) {
11595
+ int8_t __li_buf_seen[512];
11596
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
11597
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
11598
+ const double *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
11599
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11600
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
11601
+ }
11602
+ }
11603
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11604
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
11605
+ }
11606
+ }
11607
+ }
11247
11608
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11248
11609
  op[__li_o * __li_INNER + __li_tile + __j] = (double) (__li_buf_acc[__j]);
11249
11610
  }
@@ -11323,6 +11684,25 @@ max_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11323
11684
  (void) v;
11324
11685
  }
11325
11686
  }
11687
+ {
11688
+ int __li_susp = 0;
11689
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11690
+ if ( __li_buf_acc[__j] == (double) (-INFINITY) ) { __li_susp = 1; break; }
11691
+ }
11692
+ if ( __li_susp ) {
11693
+ int8_t __li_buf_seen[512];
11694
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
11695
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
11696
+ const double *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
11697
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11698
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
11699
+ }
11700
+ }
11701
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11702
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
11703
+ }
11704
+ }
11705
+ }
11326
11706
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11327
11707
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (double) (__li_buf_acc[__j]);
11328
11708
  }
@@ -11448,6 +11828,25 @@ max_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11448
11828
  (void) v;
11449
11829
  }
11450
11830
  }
11831
+ {
11832
+ int __li_susp = 0;
11833
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11834
+ if ( __li_buf_acc[__j] == (double) (-INFINITY) ) { __li_susp = 1; break; }
11835
+ }
11836
+ if ( __li_susp ) {
11837
+ int8_t __li_buf_seen[512];
11838
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
11839
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
11840
+ const double *__li_row = __li_plane + __li_i * __li_INNER + __li_tile;
11841
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11842
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
11843
+ }
11844
+ }
11845
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11846
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
11847
+ }
11848
+ }
11849
+ }
11451
11850
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11452
11851
  __li_op_k[__li_tile + __j] = (double) (__li_buf_acc[__j]);
11453
11852
  }
@@ -11608,6 +12007,25 @@ max_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11608
12007
  (void) v;
11609
12008
  }
11610
12009
  }
12010
+ {
12011
+ int __li_susp = 0;
12012
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12013
+ if ( __li_buf_acc[__j] == (double) (-INFINITY) ) { __li_susp = 1; break; }
12014
+ }
12015
+ if ( __li_susp ) {
12016
+ int8_t __li_buf_seen[512];
12017
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) __li_buf_seen[__j] = 0;
12018
+ for ( ca_size_t __li_i = 0; __li_i < __li_M; __li_i++ ) {
12019
+ const double *__li_row = __li_plane + __li_i * __li_M_stride + __li_tile;
12020
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12021
+ __li_buf_seen[__j] |= (__li_row[__j] == __li_row[__j]);
12022
+ }
12023
+ }
12024
+ for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12025
+ if ( ! __li_buf_seen[__j] ) __li_buf_acc[__j] = (double) NAN;
12026
+ }
12027
+ }
12028
+ }
11611
12029
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11612
12030
  __li_op_k[__li_tile + __j] = (double) (__li_buf_acc[__j]);
11613
12031
  }
@@ -11645,6 +12063,16 @@ ca_size_t out_i = 0;
11645
12063
  #define __max_f64_EXPR(__x) ((double)(__x))
11646
12064
  CA_SLAB_REDUCE_MAX8_EX(double, double, st, p, m, acc, -INFINITY, __max_f64_EXPR, masked_cnt);
11647
12065
  #undef __max_f64_EXPR
12066
+ /* all-NaN fix-up (all_nan_result: :nan). */
12067
+ if ( (acc == (-INFINITY)) && masked_cnt < st.slab_elements ) {
12068
+ int64_t __anf_seen = 0;
12069
+ ca_size_t __anf_mc = 0;
12070
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
12071
+ (void) __anf_mc;
12072
+ if ( ! __anf_seen ) {
12073
+ acc = (double) NAN;
12074
+ }
12075
+ }
11648
12076
  if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
11649
12077
  if ( ! op_mask ) {
11650
12078
  ca_create_mask(co);
@@ -11763,6 +12191,7 @@ max_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11763
12191
  (void) v;
11764
12192
  }
11765
12193
  }
12194
+
11766
12195
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11767
12196
  op[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
11768
12197
  }
@@ -11842,6 +12271,7 @@ max_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11842
12271
  (void) v;
11843
12272
  }
11844
12273
  }
12274
+
11845
12275
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11846
12276
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
11847
12277
  }
@@ -11967,6 +12397,7 @@ max_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
11967
12397
  (void) v;
11968
12398
  }
11969
12399
  }
12400
+
11970
12401
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
11971
12402
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
11972
12403
  }
@@ -12127,6 +12558,7 @@ max_ki_native_bool (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, int
12127
12558
  (void) v;
12128
12559
  }
12129
12560
  }
12561
+
12130
12562
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12131
12563
  __li_op_k[__li_tile + __j] = (uint64_t) (__li_buf_acc[__j]);
12132
12564
  }
@@ -12282,6 +12714,7 @@ max_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
12282
12714
  (void) v;
12283
12715
  }
12284
12716
  }
12717
+
12285
12718
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12286
12719
  op[__li_o * __li_INNER + __li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
12287
12720
  }
@@ -12361,6 +12794,7 @@ max_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
12361
12794
  (void) v;
12362
12795
  }
12363
12796
  }
12797
+
12364
12798
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12365
12799
  __li_op_k[__li_o * __li_INNER + __li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
12366
12800
  }
@@ -12486,6 +12920,7 @@ max_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
12486
12920
  (void) v;
12487
12921
  }
12488
12922
  }
12923
+
12489
12924
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12490
12925
  __li_op_k[__li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
12491
12926
  }
@@ -12646,6 +13081,7 @@ max_ki_native_object (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
12646
13081
  (void) v;
12647
13082
  }
12648
13083
  }
13084
+
12649
13085
  for ( ca_size_t __j = 0; __j < __li_tile_len; __j++ ) {
12650
13086
  __li_op_k[__li_tile + __j] = (VALUE) (__li_buf_acc[__j]);
12651
13087
  }
@@ -13377,6 +13813,17 @@ minmax_ki_native_f32 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
13377
13813
  float hi = -INFINITY;
13378
13814
  ca_size_t masked_cnt = 0;
13379
13815
  CA_SLAB_REDUCE_T_EX(float, st, p, m, lo, INFINITY, if (v < lo) lo = v; if (v > hi) hi = v;, masked_cnt);
13816
+ /* all-NaN fix-up (all_nan_result: :nan). */
13817
+ if ( (lo == (INFINITY) && hi == (-INFINITY)) && masked_cnt < st.slab_elements ) {
13818
+ int64_t __anf_seen = 0;
13819
+ ca_size_t __anf_mc = 0;
13820
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
13821
+ (void) __anf_mc;
13822
+ if ( ! __anf_seen ) {
13823
+ lo = (float) NAN;
13824
+ hi = (float) NAN;
13825
+ }
13826
+ }
13380
13827
  if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
13381
13828
  if ( ! op_mask_a ) {
13382
13829
  ca_create_mask(co_a);
@@ -13432,6 +13879,17 @@ minmax_ki_native_f64 (VALUE self, CArray *ca, int8_t *slab_axes, int8_t naxes, i
13432
13879
  double hi = -INFINITY;
13433
13880
  ca_size_t masked_cnt = 0;
13434
13881
  CA_SLAB_REDUCE_T_EX(double, st, p, m, lo, INFINITY, if (v < lo) lo = v; if (v > hi) hi = v;, masked_cnt);
13882
+ /* all-NaN fix-up (all_nan_result: :nan). */
13883
+ if ( (lo == (INFINITY) && hi == (-INFINITY)) && masked_cnt < st.slab_elements ) {
13884
+ int64_t __anf_seen = 0;
13885
+ ca_size_t __anf_mc = 0;
13886
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
13887
+ (void) __anf_mc;
13888
+ if ( ! __anf_seen ) {
13889
+ lo = (double) NAN;
13890
+ hi = (double) NAN;
13891
+ }
13892
+ }
13435
13893
  if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
13436
13894
  if ( ! op_mask_a ) {
13437
13895
  ca_create_mask(co_a);
@@ -14021,7 +14479,18 @@ ca_size_t out_i = 0;
14021
14479
  int64_t best_i = 0;
14022
14480
  ca_size_t masked_cnt = 0;
14023
14481
  CA_SLAB_REDUCE_T_EX(float, st, p, m, best_v, INFINITY, if (v < best_v) { best_v = v; best_i = idx; }, masked_cnt);
14024
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
14482
+ int __anf_all_nan = 0;
14483
+ /* all-NaN fix-up (all_nan_result: :undef). */
14484
+ if ( (best_v == (INFINITY)) && masked_cnt < st.slab_elements ) {
14485
+ int64_t __anf_seen = 0;
14486
+ ca_size_t __anf_mc = 0;
14487
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
14488
+ (void) __anf_mc;
14489
+ if ( ! __anf_seen ) {
14490
+ __anf_all_nan = 1;
14491
+ }
14492
+ }
14493
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
14025
14494
  if ( ! op_mask ) {
14026
14495
  ca_create_mask(co);
14027
14496
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -14063,7 +14532,18 @@ ca_size_t out_i = 0;
14063
14532
  int64_t best_i = 0;
14064
14533
  ca_size_t masked_cnt = 0;
14065
14534
  CA_SLAB_REDUCE_T_EX(double, st, p, m, best_v, INFINITY, if (v < best_v) { best_v = v; best_i = idx; }, masked_cnt);
14066
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
14535
+ int __anf_all_nan = 0;
14536
+ /* all-NaN fix-up (all_nan_result: :undef). */
14537
+ if ( (best_v == (INFINITY)) && masked_cnt < st.slab_elements ) {
14538
+ int64_t __anf_seen = 0;
14539
+ ca_size_t __anf_mc = 0;
14540
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
14541
+ (void) __anf_mc;
14542
+ if ( ! __anf_seen ) {
14543
+ __anf_all_nan = 1;
14544
+ }
14545
+ }
14546
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
14067
14547
  if ( ! op_mask ) {
14068
14548
  ca_create_mask(co);
14069
14549
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -14708,7 +15188,18 @@ ca_size_t out_i = 0;
14708
15188
  int64_t best_i = 0;
14709
15189
  ca_size_t masked_cnt = 0;
14710
15190
  CA_SLAB_REDUCE_T_EX(float, st, p, m, best_v, -INFINITY, if (v > best_v) { best_v = v; best_i = idx; }, masked_cnt);
14711
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
15191
+ int __anf_all_nan = 0;
15192
+ /* all-NaN fix-up (all_nan_result: :undef). */
15193
+ if ( (best_v == (-INFINITY)) && masked_cnt < st.slab_elements ) {
15194
+ int64_t __anf_seen = 0;
15195
+ ca_size_t __anf_mc = 0;
15196
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
15197
+ (void) __anf_mc;
15198
+ if ( ! __anf_seen ) {
15199
+ __anf_all_nan = 1;
15200
+ }
15201
+ }
15202
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
14712
15203
  if ( ! op_mask ) {
14713
15204
  ca_create_mask(co);
14714
15205
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -14750,7 +15241,18 @@ ca_size_t out_i = 0;
14750
15241
  int64_t best_i = 0;
14751
15242
  ca_size_t masked_cnt = 0;
14752
15243
  CA_SLAB_REDUCE_T_EX(double, st, p, m, best_v, -INFINITY, if (v > best_v) { best_v = v; best_i = idx; }, masked_cnt);
14753
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
15244
+ int __anf_all_nan = 0;
15245
+ /* all-NaN fix-up (all_nan_result: :undef). */
15246
+ if ( (best_v == (-INFINITY)) && masked_cnt < st.slab_elements ) {
15247
+ int64_t __anf_seen = 0;
15248
+ ca_size_t __anf_mc = 0;
15249
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
15250
+ (void) __anf_mc;
15251
+ if ( ! __anf_seen ) {
15252
+ __anf_all_nan = 1;
15253
+ }
15254
+ }
15255
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
14754
15256
  if ( ! op_mask ) {
14755
15257
  ca_create_mask(co);
14756
15258
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -15641,7 +16143,18 @@ ca_size_t out_i = 0;
15641
16143
  int64_t best_i = 0;
15642
16144
  ca_size_t masked_cnt = 0;
15643
16145
  CA_SLAB_REDUCE_T_EX(float, st, p, m, best_v, INFINITY, if (v < best_v) { best_v = v; best_i = idx; }, masked_cnt);
15644
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
16146
+ int __anf_all_nan = 0;
16147
+ /* all-NaN fix-up (all_nan_result: :undef). */
16148
+ if ( (best_v == (INFINITY)) && masked_cnt < st.slab_elements ) {
16149
+ int64_t __anf_seen = 0;
16150
+ ca_size_t __anf_mc = 0;
16151
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
16152
+ (void) __anf_mc;
16153
+ if ( ! __anf_seen ) {
16154
+ __anf_all_nan = 1;
16155
+ }
16156
+ }
16157
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
15645
16158
  if ( ! op_mask ) {
15646
16159
  ca_create_mask(co);
15647
16160
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -15711,7 +16224,18 @@ ca_size_t out_i = 0;
15711
16224
  int64_t best_i = 0;
15712
16225
  ca_size_t masked_cnt = 0;
15713
16226
  CA_SLAB_REDUCE_T_EX(double, st, p, m, best_v, INFINITY, if (v < best_v) { best_v = v; best_i = idx; }, masked_cnt);
15714
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
16227
+ int __anf_all_nan = 0;
16228
+ /* all-NaN fix-up (all_nan_result: :undef). */
16229
+ if ( (best_v == (INFINITY)) && masked_cnt < st.slab_elements ) {
16230
+ int64_t __anf_seen = 0;
16231
+ ca_size_t __anf_mc = 0;
16232
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
16233
+ (void) __anf_mc;
16234
+ if ( ! __anf_seen ) {
16235
+ __anf_all_nan = 1;
16236
+ }
16237
+ }
16238
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
15715
16239
  if ( ! op_mask ) {
15716
16240
  ca_create_mask(co);
15717
16241
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -16588,7 +17112,18 @@ ca_size_t out_i = 0;
16588
17112
  int64_t best_i = 0;
16589
17113
  ca_size_t masked_cnt = 0;
16590
17114
  CA_SLAB_REDUCE_T_EX(float, st, p, m, best_v, -INFINITY, if (v > best_v) { best_v = v; best_i = idx; }, masked_cnt);
16591
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
17115
+ int __anf_all_nan = 0;
17116
+ /* all-NaN fix-up (all_nan_result: :undef). */
17117
+ if ( (best_v == (-INFINITY)) && masked_cnt < st.slab_elements ) {
17118
+ int64_t __anf_seen = 0;
17119
+ ca_size_t __anf_mc = 0;
17120
+ CA_SLAB_REDUCE_T_EX(float, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
17121
+ (void) __anf_mc;
17122
+ if ( ! __anf_seen ) {
17123
+ __anf_all_nan = 1;
17124
+ }
17125
+ }
17126
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
16592
17127
  if ( ! op_mask ) {
16593
17128
  ca_create_mask(co);
16594
17129
  op_mask = (boolean8_t *) co->mask->ptr;
@@ -16658,7 +17193,18 @@ ca_size_t out_i = 0;
16658
17193
  int64_t best_i = 0;
16659
17194
  ca_size_t masked_cnt = 0;
16660
17195
  CA_SLAB_REDUCE_T_EX(double, st, p, m, best_v, -INFINITY, if (v > best_v) { best_v = v; best_i = idx; }, masked_cnt);
16661
- if ( (min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count) ) {
17196
+ int __anf_all_nan = 0;
17197
+ /* all-NaN fix-up (all_nan_result: :undef). */
17198
+ if ( (best_v == (-INFINITY)) && masked_cnt < st.slab_elements ) {
17199
+ int64_t __anf_seen = 0;
17200
+ ca_size_t __anf_mc = 0;
17201
+ CA_SLAB_REDUCE_T_EX(double, st, p, m, __anf_seen, 0, __anf_seen |= (v == v), __anf_mc);
17202
+ (void) __anf_mc;
17203
+ if ( ! __anf_seen ) {
17204
+ __anf_all_nan = 1;
17205
+ }
17206
+ }
17207
+ if ( ((min_count < 0 ? masked_cnt == st.slab_elements : st.slab_elements - masked_cnt < min_count)) || __anf_all_nan ) {
16662
17208
  if ( ! op_mask ) {
16663
17209
  ca_create_mask(co);
16664
17210
  op_mask = (boolean8_t *) co->mask->ptr;