sequenzo 0.1.17__cp39-cp39-win_amd64.whl → 0.1.18__cp39-cp39-win_amd64.whl

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.

Potentially problematic release.


This version of sequenzo might be problematic. Click here for more details.

Files changed (101) hide show
  1. sequenzo/__init__.py +25 -1
  2. sequenzo/big_data/clara/clara.py +1 -1
  3. sequenzo/big_data/clara/utils/get_weighted_diss.c +156 -156
  4. sequenzo/big_data/clara/utils/get_weighted_diss.cp39-win_amd64.pyd +0 -0
  5. sequenzo/clustering/clustering_c_code.cp39-win_amd64.pyd +0 -0
  6. sequenzo/clustering/hierarchical_clustering.py +202 -8
  7. sequenzo/define_sequence_data.py +34 -2
  8. sequenzo/dissimilarity_measures/c_code.cp39-win_amd64.pyd +0 -0
  9. sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +1 -1
  10. sequenzo/dissimilarity_measures/src/DHDdistance.cpp +13 -37
  11. sequenzo/dissimilarity_measures/src/LCPdistance.cpp +13 -37
  12. sequenzo/dissimilarity_measures/src/OMdistance.cpp +12 -47
  13. sequenzo/dissimilarity_measures/src/OMspellDistance.cpp +103 -67
  14. sequenzo/dissimilarity_measures/src/dp_utils.h +160 -0
  15. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_arithmetic.hpp +41 -16
  16. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_complex.hpp +4 -0
  17. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_details.hpp +7 -0
  18. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_logical.hpp +10 -0
  19. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_math.hpp +127 -43
  20. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_memory.hpp +30 -2
  21. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_swizzle.hpp +174 -0
  22. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_trigo.hpp +14 -5
  23. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx.hpp +111 -54
  24. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx2.hpp +131 -9
  25. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512bw.hpp +11 -113
  26. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512dq.hpp +39 -7
  27. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512f.hpp +336 -30
  28. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi.hpp +9 -37
  29. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi2.hpp +58 -0
  30. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common.hpp +1 -0
  31. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common_fwd.hpp +35 -2
  32. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_constants.hpp +3 -1
  33. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_emulated.hpp +17 -0
  34. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx.hpp +13 -0
  35. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_sse.hpp +18 -0
  36. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma4.hpp +13 -0
  37. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_isa.hpp +8 -0
  38. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon.hpp +363 -34
  39. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon64.hpp +7 -0
  40. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_rvv.hpp +13 -0
  41. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_scalar.hpp +41 -4
  42. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse2.hpp +252 -16
  43. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse3.hpp +9 -0
  44. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_ssse3.hpp +12 -1
  45. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sve.hpp +7 -0
  46. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_vsx.hpp +892 -0
  47. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_wasm.hpp +78 -1
  48. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_arch.hpp +3 -1
  49. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_config.hpp +13 -2
  50. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_cpuid.hpp +5 -0
  51. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_inline.hpp +5 -1
  52. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_all_registers.hpp +2 -0
  53. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_api.hpp +64 -1
  54. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch.hpp +36 -0
  55. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_rvv_register.hpp +40 -31
  56. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_traits.hpp +8 -0
  57. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_vsx_register.hpp +77 -0
  58. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/xsimd.hpp +6 -0
  59. sequenzo/dissimilarity_measures/src/xsimd/test/test_basic_math.cpp +6 -0
  60. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch.cpp +54 -2
  61. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_bool.cpp +8 -0
  62. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_cast.cpp +11 -4
  63. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_complex.cpp +18 -0
  64. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_int.cpp +8 -14
  65. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_manip.cpp +216 -173
  66. sequenzo/dissimilarity_measures/src/xsimd/test/test_load_store.cpp +6 -0
  67. sequenzo/dissimilarity_measures/src/xsimd/test/test_memory.cpp +1 -1
  68. sequenzo/dissimilarity_measures/src/xsimd/test/test_power.cpp +7 -4
  69. sequenzo/dissimilarity_measures/src/xsimd/test/test_select.cpp +6 -2
  70. sequenzo/dissimilarity_measures/src/xsimd/test/test_shuffle.cpp +32 -18
  71. sequenzo/dissimilarity_measures/src/xsimd/test/test_utils.hpp +21 -24
  72. sequenzo/dissimilarity_measures/src/xsimd/test/test_xsimd_api.cpp +69 -9
  73. sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.c +156 -156
  74. sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.cp39-win_amd64.pyd +0 -0
  75. sequenzo/dissimilarity_measures/utils/seqconc.c +156 -156
  76. sequenzo/dissimilarity_measures/utils/seqconc.cp39-win_amd64.pyd +0 -0
  77. sequenzo/dissimilarity_measures/utils/seqdss.c +156 -156
  78. sequenzo/dissimilarity_measures/utils/seqdss.cp39-win_amd64.pyd +0 -0
  79. sequenzo/dissimilarity_measures/utils/seqdur.c +156 -156
  80. sequenzo/dissimilarity_measures/utils/seqdur.cp39-win_amd64.pyd +0 -0
  81. sequenzo/dissimilarity_measures/utils/seqlength.c +156 -156
  82. sequenzo/dissimilarity_measures/utils/seqlength.cp39-win_amd64.pyd +0 -0
  83. sequenzo/sequence_characteristics/__init__.py +4 -0
  84. sequenzo/sequence_characteristics/complexity_index.py +17 -57
  85. sequenzo/sequence_characteristics/overall_cross_sectional_entropy.py +177 -111
  86. sequenzo/sequence_characteristics/plot_characteristics.py +30 -11
  87. sequenzo/sequence_characteristics/simple_characteristics.py +1 -0
  88. sequenzo/sequence_characteristics/state_frequencies_and_entropy_per_sequence.py +9 -3
  89. sequenzo/sequence_characteristics/turbulence.py +47 -67
  90. sequenzo/sequence_characteristics/variance_of_spell_durations.py +19 -9
  91. sequenzo/sequence_characteristics/within_sequence_entropy.py +5 -58
  92. sequenzo/visualization/plot_sequence_index.py +58 -35
  93. sequenzo/visualization/plot_state_distribution.py +57 -36
  94. sequenzo/with_event_history_analysis/__init__.py +35 -0
  95. sequenzo/with_event_history_analysis/sequence_analysis_multi_state_model.py +850 -0
  96. sequenzo/with_event_history_analysis/sequence_history_analysis.py +283 -0
  97. {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/METADATA +7 -6
  98. {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/RECORD +101 -94
  99. {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/WHEEL +0 -0
  100. {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/licenses/LICENSE +0 -0
  101. {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/top_level.txt +0 -0
@@ -14,6 +14,13 @@
14
14
 
15
15
  #include "test_utils.hpp"
16
16
 
17
+ #ifdef __linux__
18
+ #include "endian.h"
19
+ #if BYTE_ORDER == BIG_ENDIAN
20
+ #define XSIMD_NO_SLIDE
21
+ #endif
22
+ #endif
23
+
17
24
  #include <numeric>
18
25
 
19
26
  namespace
@@ -166,7 +173,6 @@ namespace
166
173
  };
167
174
  }
168
175
 
169
- #if !XSIMD_WITH_AVX512F || XSIMD_WITH_AVX512BW
170
176
  template <class B>
171
177
  struct slide_test : public init_slide_base<typename B::value_type, B::size>
172
178
  {
@@ -198,6 +204,7 @@ struct slide_test : public init_slide_base<typename B::value_type, B::size>
198
204
  INFO("slide_left full");
199
205
  CHECK_BATCH_EQ(b_res_left_full, b_left_full);
200
206
 
207
+ #ifndef XSIMD_NO_SLIDE
201
208
  B b_res_left_half = xsimd::slide_left<half_slide>(b_in);
202
209
  INFO("slide_left half_slide");
203
210
  CHECK_BATCH_EQ(b_res_left_half, b_left_half);
@@ -216,6 +223,7 @@ struct slide_test : public init_slide_base<typename B::value_type, B::size>
216
223
  INFO("slide_left below_half_slide");
217
224
  CHECK_BATCH_EQ(b_res_left_below_half, b_left_below_half);
218
225
  }
226
+ #endif
219
227
  }
220
228
 
221
229
  void slide_right()
@@ -236,6 +244,7 @@ struct slide_test : public init_slide_base<typename B::value_type, B::size>
236
244
  INFO("slide_right full");
237
245
  CHECK_BATCH_EQ(b_res_right_full, b_right_full);
238
246
 
247
+ #ifndef XSIMD_NO_SLIDE
239
248
  B b_res_right_half = xsimd::slide_right<half_slide>(b_in);
240
249
  INFO("slide_right half_slide");
241
250
  CHECK_BATCH_EQ(b_res_right_half, b_right_half);
@@ -254,6 +263,7 @@ struct slide_test : public init_slide_base<typename B::value_type, B::size>
254
263
  INFO("slide_right below_half_slide");
255
264
  CHECK_BATCH_EQ(b_res_right_below_half, b_right_below_half);
256
265
  }
266
+ #endif
257
267
  }
258
268
  };
259
269
 
@@ -270,8 +280,6 @@ TEST_CASE_TEMPLATE("[slide]", B, BATCH_INT_TYPES)
270
280
  }
271
281
  }
272
282
 
273
- #endif
274
-
275
283
  template <class B>
276
284
  struct compress_test
277
285
  {
@@ -347,7 +355,9 @@ struct compress_test
347
355
  }
348
356
  };
349
357
 
350
- TEST_CASE_TEMPLATE("[compress]", B, BATCH_FLOAT_TYPES, xsimd::batch<uint8_t>, xsimd::batch<int8_t>, xsimd::batch<uint16_t>, xsimd::batch<int16_t>, xsimd::batch<uint32_t>, xsimd::batch<int32_t>, xsimd::batch<uint64_t>, xsimd::batch<int64_t>)
358
+ #define XSIMD_COMPRESS_TYPES BATCH_FLOAT_TYPES, xsimd::batch<uint8_t>, xsimd::batch<int8_t>, xsimd::batch<uint16_t>, xsimd::batch<int16_t>, xsimd::batch<uint32_t>, xsimd::batch<int32_t>, xsimd::batch<uint64_t>, xsimd::batch<int64_t>
359
+
360
+ TEST_CASE_TEMPLATE("[compress]", B, XSIMD_COMPRESS_TYPES)
351
361
  {
352
362
  compress_test<B> Test;
353
363
  SUBCASE("empty")
@@ -443,7 +453,9 @@ struct expand_test
443
453
  }
444
454
  };
445
455
 
446
- TEST_CASE_TEMPLATE("[expand]", B, BATCH_FLOAT_TYPES, xsimd::batch<uint8_t>, xsimd::batch<int8_t>, xsimd::batch<uint16_t>, xsimd::batch<int16_t>, xsimd::batch<uint32_t>, xsimd::batch<int32_t>, xsimd::batch<uint64_t>, xsimd::batch<int64_t>)
456
+ #define XSIMD_EXPAND_TYPES XSIMD_COMPRESS_TYPES
457
+
458
+ TEST_CASE_TEMPLATE("[expand]", B, XSIMD_EXPAND_TYPES)
447
459
  {
448
460
  expand_test<B> Test;
449
461
  SUBCASE("empty")
@@ -561,13 +573,13 @@ struct shuffle_test
561
573
  CHECK_BATCH_EQ(b_res, b_ref);
562
574
  }
563
575
 
564
- void swizzle()
576
+ void shuffle()
565
577
  {
566
578
  B b_lhs = B::load_unaligned(lhs.data());
567
579
  B b_rhs = B::load_unaligned(rhs.data());
568
580
 
569
581
  {
570
- struct swizzle_lo_generator
582
+ struct shuffle_lo_generator
571
583
  {
572
584
  static constexpr size_t get(size_t index, size_t size)
573
585
  {
@@ -580,13 +592,13 @@ struct shuffle_test
580
592
  ref[i] = lhs[size - i - 1];
581
593
  B b_ref = B::load_unaligned(ref.data());
582
594
 
583
- INFO("swizzle first batch");
584
- B b_res = xsimd::shuffle(b_lhs, b_rhs, xsimd::make_batch_constant<mask_type, swizzle_lo_generator, arch_type>());
595
+ INFO("shuffle first batch");
596
+ B b_res = xsimd::shuffle(b_lhs, b_rhs, xsimd::make_batch_constant<mask_type, shuffle_lo_generator, arch_type>());
585
597
  CHECK_BATCH_EQ(b_res, b_ref);
586
598
  }
587
599
 
588
600
  {
589
- struct swizzle_hi_generator
601
+ struct shuffle_hi_generator
590
602
  {
591
603
  static constexpr size_t get(size_t index, size_t size)
592
604
  {
@@ -599,8 +611,8 @@ struct shuffle_test
599
611
  ref[i] = rhs[size - i - 1];
600
612
  B b_ref = B::load_unaligned(ref.data());
601
613
 
602
- INFO("swizzle second batch");
603
- B b_res = xsimd::shuffle(b_lhs, b_rhs, xsimd::make_batch_constant<mask_type, swizzle_hi_generator, arch_type>());
614
+ INFO("shuffle second batch");
615
+ B b_res = xsimd::shuffle(b_lhs, b_rhs, xsimd::make_batch_constant<mask_type, shuffle_hi_generator, arch_type>());
604
616
  CHECK_BATCH_EQ(b_res, b_ref);
605
617
  }
606
618
  }
@@ -690,7 +702,9 @@ struct shuffle_test
690
702
  }
691
703
  };
692
704
 
693
- TEST_CASE_TEMPLATE("[shuffle]", B, BATCH_FLOAT_TYPES, xsimd::batch<uint32_t>, xsimd::batch<int32_t>, xsimd::batch<uint64_t>, xsimd::batch<int64_t>)
705
+ #define XSIMD_SHUFFLE_TYPES BATCH_FLOAT_TYPES, xsimd::batch<uint32_t>, xsimd::batch<int32_t>, xsimd::batch<uint64_t>, xsimd::batch<int64_t>
706
+
707
+ TEST_CASE_TEMPLATE("[shuffle]", B, XSIMD_SHUFFLE_TYPES)
694
708
  {
695
709
  shuffle_test<B> Test;
696
710
  SUBCASE("no-op")
@@ -709,9 +723,9 @@ TEST_CASE_TEMPLATE("[shuffle]", B, BATCH_FLOAT_TYPES, xsimd::batch<uint32_t>, xs
709
723
  {
710
724
  Test.select();
711
725
  }
712
- SUBCASE("swizzle")
726
+ SUBCASE("shuffle")
713
727
  {
714
- Test.swizzle();
728
+ Test.shuffle();
715
729
  }
716
730
  SUBCASE("transpose")
717
731
  {
@@ -733,12 +747,12 @@ TEST_CASE_TEMPLATE("[small integer transpose]", B, xsimd::batch<uint16_t>, xsimd
733
747
  }
734
748
 
735
749
  #if (XSIMD_WITH_SSE2 && !XSIMD_WITH_AVX)
736
- TEST_CASE_TEMPLATE("[small integer swizzle]", B, xsimd::batch<uint16_t>, xsimd::batch<int16_t>)
750
+ TEST_CASE_TEMPLATE("[small integer shuffle]", B, xsimd::batch<uint16_t>, xsimd::batch<int16_t>)
737
751
  {
738
752
  shuffle_test<B> Test;
739
- SUBCASE("swizzle")
753
+ SUBCASE("shuffle")
740
754
  {
741
- Test.swizzle();
755
+ Test.shuffle();
742
756
  }
743
757
  }
744
758
  #endif
@@ -152,8 +152,8 @@ namespace xsimd
152
152
  template <class T, class A, size_t N>
153
153
  inline bool operator==(const batch<T, A>& lhs, const std::array<T, N>& rhs)
154
154
  {
155
- std::array<T, N> tmp;
156
- lhs.store_unaligned(tmp.data());
155
+ alignas(A::alignment()) std::array<T, N> tmp;
156
+ lhs.store_aligned(tmp.data());
157
157
  return tmp == rhs;
158
158
  }
159
159
 
@@ -166,8 +166,8 @@ namespace xsimd
166
166
  template <class T, class A, size_t N, bool i3ec>
167
167
  inline bool operator==(const batch<std::complex<T>, A>& lhs, const std::array<xtl::xcomplex<T, T, i3ec>, N>& rhs)
168
168
  {
169
- std::array<xtl::xcomplex<T, T, i3ec>, N> tmp;
170
- lhs.store_unaligned(tmp.data());
169
+ alignas(A::alignment()) std::array<xtl::xcomplex<T, T, i3ec>, N> tmp;
170
+ lhs.store_aligned(tmp.data());
171
171
  return tmp == rhs;
172
172
  }
173
173
 
@@ -181,6 +181,7 @@ namespace xsimd
181
181
 
182
182
  namespace detail
183
183
  {
184
+ #ifndef __FAST_MATH__
184
185
  namespace utils
185
186
  {
186
187
  // define some overloads here as integer versions do not exist for msvc
@@ -208,6 +209,7 @@ namespace detail
208
209
  return false;
209
210
  }
210
211
  }
212
+ #endif
211
213
 
212
214
  inline unsigned char uabs(unsigned char val)
213
215
  {
@@ -289,7 +291,7 @@ namespace detail
289
291
  {
290
292
  return lhs == rhs;
291
293
  }
292
-
294
+ #ifndef __FAST_MATH__
293
295
  if (utils::isnan(lhs))
294
296
  {
295
297
  return utils::isnan(rhs);
@@ -299,6 +301,7 @@ namespace detail
299
301
  {
300
302
  return utils::isinf(rhs) && (lhs * rhs > 0) /* same sign */;
301
303
  }
304
+ #endif
302
305
 
303
306
  T relative_precision = precision_t::max * std::numeric_limits<T>::epsilon();
304
307
  T absolute_zero_prox = precision_t::max * std::numeric_limits<T>::epsilon();
@@ -398,16 +401,16 @@ namespace detail
398
401
  template <class T, size_t N, class A>
399
402
  bool expect_batch_near(const ::xsimd::batch<T, A>& lhs, const std::array<T, N>& rhs)
400
403
  {
401
- std::array<T, N> tmp;
402
- lhs.store_unaligned(tmp.data());
404
+ alignas(A::alignment()) std::array<T, N> tmp;
405
+ lhs.store_aligned(tmp.data());
403
406
  return expect_array_near(tmp, rhs);
404
407
  }
405
408
 
406
409
  template <class T, size_t N, class A>
407
410
  bool expect_batch_near(const std::array<T, N>& lhs, const ::xsimd::batch<T, A>& rhs)
408
411
  {
409
- std::array<T, N> tmp;
410
- rhs.store_unaligned(tmp.data());
412
+ alignas(A::alignment()) std::array<T, N> tmp;
413
+ rhs.store_aligned(tmp.data());
411
414
  return expect_array_near(lhs, tmp);
412
415
  }
413
416
 
@@ -415,24 +418,24 @@ namespace detail
415
418
  bool expect_batch_near(const ::xsimd::batch<T, A>& lhs, const ::xsimd::batch<T, A>& rhs)
416
419
  {
417
420
  constexpr auto N = xsimd::batch<T, A>::size;
418
- std::array<T, N> tmp;
419
- lhs.store_unaligned(tmp.data());
421
+ alignas(A::alignment()) std::array<T, N> tmp;
422
+ lhs.store_aligned(tmp.data());
420
423
  return expect_batch_near(tmp, rhs);
421
424
  }
422
425
 
423
426
  template <class T, size_t N, class A>
424
427
  bool expect_batch_near(const ::xsimd::batch_bool<T, A>& lhs, const std::array<bool, N>& rhs)
425
428
  {
426
- std::array<bool, N> tmp;
427
- lhs.store_unaligned(tmp.data());
429
+ alignas(A::alignment()) std::array<bool, N> tmp;
430
+ lhs.store_aligned(tmp.data());
428
431
  return expect_array_near(tmp, rhs);
429
432
  }
430
433
 
431
434
  template <class T, size_t N, class A>
432
435
  bool expect_batch_near(const std::array<bool, N>& lhs, const ::xsimd::batch_bool<T, A>& rhs)
433
436
  {
434
- std::array<bool, N> tmp;
435
- rhs.store_unaligned(tmp.data());
437
+ alignas(A::alignment()) std::array<bool, N> tmp;
438
+ rhs.store_aligned(tmp.data());
436
439
  return expect_array_near(lhs, tmp);
437
440
  }
438
441
 
@@ -440,8 +443,8 @@ namespace detail
440
443
  bool expect_batch_near(const ::xsimd::batch_bool<T, A>& lhs, const ::xsimd::batch_bool<T, A>& rhs)
441
444
  {
442
445
  constexpr auto N = xsimd::batch<T, A>::size;
443
- std::array<bool, N> tmp;
444
- lhs.store_unaligned(tmp.data());
446
+ alignas(A::alignment()) std::array<bool, N> tmp;
447
+ lhs.store_aligned(tmp.data());
445
448
  return expect_batch_near(tmp, rhs);
446
449
  }
447
450
 
@@ -591,13 +594,7 @@ namespace xsimd
591
594
  #define BATCH_TYPES BATCH_INT_TYPES, BATCH_FLOAT_TYPES
592
595
  #define BATCH_MATH_TYPES xsimd::batch<int32_t>, BATCH_FLOAT_TYPES
593
596
 
594
- #if !XSIMD_WITH_AVX || XSIMD_WITH_AVX2
595
- #define BATCH_SWIZZLE_TAIL , xsimd::batch<uint32_t>, xsimd::batch<int32_t>, xsimd::batch<uint64_t>, xsimd::batch<int64_t>
596
- #else
597
- #define BATCH_SWIZZLE_TAIL
598
- #endif
599
-
600
- #define BATCH_SWIZZLE_TYPES BATCH_FLOAT_TYPES, BATCH_COMPLEX_TYPES BATCH_SWIZZLE_TAIL
597
+ #define BATCH_SWIZZLE_TYPES BATCH_FLOAT_TYPES, BATCH_COMPLEX_TYPES, BATCH_INT_TYPES
601
598
 
602
599
  /********************
603
600
  * conversion utils *
@@ -353,18 +353,28 @@ struct xsimd_api_integral_types_functions
353
353
 
354
354
  void test_bitwise_lshift()
355
355
  {
356
+ constexpr int shift = 3;
356
357
  value_type val0(12);
357
- value_type val1(3);
358
+ value_type val1(shift);
358
359
  value_type r = val0 << val1;
360
+ value_type ir = val0 << shift;
361
+ value_type cr = xsimd::bitwise_lshift<shift>(val0);
359
362
  CHECK_EQ(extract(xsimd::bitwise_lshift(T(val0), T(val1))), r);
363
+ CHECK_EQ(extract(ir), r);
364
+ CHECK_EQ(extract(cr), r);
360
365
  }
361
366
 
362
367
  void test_bitwise_rshift()
363
368
  {
369
+ constexpr int shift = 3;
364
370
  value_type val0(12);
365
- value_type val1(3);
371
+ value_type val1(shift);
366
372
  value_type r = val0 >> val1;
373
+ value_type ir = val0 >> shift;
374
+ value_type cr = xsimd::bitwise_rshift<shift>(val0);
367
375
  CHECK_EQ(extract(xsimd::bitwise_rshift(T(val0), T(val1))), r);
376
+ CHECK_EQ(extract(ir), r);
377
+ CHECK_EQ(extract(cr), r);
368
378
  }
369
379
 
370
380
  void test_mod()
@@ -376,20 +386,26 @@ struct xsimd_api_integral_types_functions
376
386
 
377
387
  void test_rotl()
378
388
  {
379
- constexpr auto N = std::numeric_limits<value_type>::digits;
389
+ constexpr auto N = std::numeric_limits<value_type>::digits + std::numeric_limits<value_type>::is_signed;
390
+ constexpr int count = 3;
380
391
  value_type val0(12);
381
- value_type val1(3);
392
+ value_type val1(count);
382
393
  value_type r = (val0 << val1) | (val0 >> (N - val1));
394
+ value_type cr = xsimd::rotl<count>(val0);
383
395
  CHECK_EQ(extract(xsimd::rotl(T(val0), T(val1))), r);
396
+ CHECK_EQ(extract(cr), r);
384
397
  }
385
398
 
386
399
  void test_rotr()
387
400
  {
388
- constexpr auto N = std::numeric_limits<value_type>::digits;
401
+ constexpr auto N = std::numeric_limits<value_type>::digits + std::numeric_limits<value_type>::is_signed;
402
+ constexpr int count = 3;
389
403
  value_type val0(12);
390
- value_type val1(3);
404
+ value_type val1(count);
391
405
  value_type r = (val0 >> val1) | (val0 << (N - val1));
406
+ value_type cr = xsimd::rotr<3>(val0);
392
407
  CHECK_EQ(extract(xsimd::rotr(T(val0), T(val1))), r);
408
+ CHECK_EQ(extract(cr), r);
393
409
  }
394
410
 
395
411
  void test_sadd()
@@ -488,8 +504,12 @@ struct xsimd_api_float_types_functions
488
504
  }
489
505
  void test_atanh()
490
506
  {
491
- value_type val(1);
492
- CHECK_EQ(extract(xsimd::atanh(T(val))), std::atanh(val));
507
+ value_type val0(0);
508
+ CHECK_EQ(extract(xsimd::atanh(T(val0))), std::atanh(val0));
509
+ #ifndef __FAST_MATH__
510
+ value_type val1(1);
511
+ CHECK_EQ(extract(xsimd::atanh(T(val1))), std::atanh(val1));
512
+ #endif
493
513
  }
494
514
  void test_cbrt()
495
515
  {
@@ -654,6 +674,29 @@ struct xsimd_api_float_types_functions
654
674
  value_type val(0);
655
675
  CHECK_EQ(extract(xsimd::log1p(T(val))), std::log1p(val));
656
676
  }
677
+
678
+ void test_max_nan()
679
+ {
680
+ value_type val0(2.7818);
681
+ value_type valN(NAN);
682
+ #if XSIMD_WITH_AVX || XSIMD_WITH_SSE2
683
+ using isnan = doctest::IsNaN<value_type>;
684
+ CHECK_EQ(isnan(extract(xsimd::max(T(val0), T(valN)))), isnan(std::max(val0, valN)));
685
+ CHECK_EQ(isnan(extract(xsimd::max(T(valN), T(val0)))), isnan(std::max(valN, val0)));
686
+ #endif
687
+ }
688
+
689
+ void test_min_nan()
690
+ {
691
+ value_type val0(2.7818);
692
+ value_type valN(NAN);
693
+ #if XSIMD_WITH_AVX || XSIMD_WITH_SSE2
694
+ using isnan = doctest::IsNaN<value_type>;
695
+ CHECK_EQ(isnan(extract(xsimd::min(T(val0), T(valN)))), isnan(std::min(val0, valN)));
696
+ CHECK_EQ(isnan(extract(xsimd::min(T(valN), T(val0)))), isnan(std::min(valN, val0)));
697
+ #endif
698
+ }
699
+
657
700
  void test_nearbyint()
658
701
  {
659
702
  value_type val(3.1);
@@ -925,6 +968,16 @@ TEST_CASE_TEMPLATE("[xsimd api | float types functions]", B, FLOAT_TYPES)
925
968
  Test.test_log1p();
926
969
  }
927
970
 
971
+ SUBCASE("max_nan")
972
+ {
973
+ Test.test_max_nan();
974
+ }
975
+
976
+ SUBCASE("min_nan")
977
+ {
978
+ Test.test_min_nan();
979
+ }
980
+
928
981
  SUBCASE("nearbyint")
929
982
  {
930
983
  Test.test_nearbyint();
@@ -1044,6 +1097,7 @@ struct xsimd_api_complex_types_functions
1044
1097
  CHECK_EQ(extract(xsimd::proj(T(val))), std::proj(val));
1045
1098
  }
1046
1099
 
1100
+ #ifndef __FAST_MATH__
1047
1101
  void test_isinf()
1048
1102
  {
1049
1103
  value_type val(4);
@@ -1061,6 +1115,7 @@ struct xsimd_api_complex_types_functions
1061
1115
  value_type val(4);
1062
1116
  CHECK_EQ(extract(xsimd::isnan(T(val))), std::isnan(std::real(val)));
1063
1117
  }
1118
+ #endif
1064
1119
  };
1065
1120
 
1066
1121
  TEST_CASE_TEMPLATE("[xsimd api | complex types functions]", B, COMPLEX_TYPES)
@@ -1086,6 +1141,8 @@ TEST_CASE_TEMPLATE("[xsimd api | complex types functions]", B, COMPLEX_TYPES)
1086
1141
  Test.test_proj();
1087
1142
  }
1088
1143
 
1144
+ #ifndef __FAST_MATH__
1145
+
1089
1146
  SUBCASE("isinf")
1090
1147
  {
1091
1148
  Test.test_isinf();
@@ -1100,6 +1157,7 @@ TEST_CASE_TEMPLATE("[xsimd api | complex types functions]", B, COMPLEX_TYPES)
1100
1157
  {
1101
1158
  Test.test_isnan();
1102
1159
  }
1160
+ #endif
1103
1161
  }
1104
1162
 
1105
1163
  /*
@@ -1194,7 +1252,7 @@ struct xsimd_api_all_types_functions
1194
1252
  void test_div()
1195
1253
  {
1196
1254
  value_type val0(1);
1197
- value_type val1(3);
1255
+ value_type val1(2);
1198
1256
  CHECK_EQ(extract(xsimd::div(T(val0), T(val1))), val0 / val1);
1199
1257
  }
1200
1258
 
@@ -1345,6 +1403,7 @@ TEST_CASE_TEMPLATE("[xsimd api | all types functions]", B, ALL_TYPES)
1345
1403
  /*
1346
1404
  * Functions that apply only to floating point types
1347
1405
  */
1406
+ #ifndef __FAST_MATH__
1348
1407
  template <typename T>
1349
1408
  struct xsimd_api_all_floating_point_types_functions
1350
1409
  {
@@ -1363,6 +1422,7 @@ TEST_CASE_TEMPLATE("[xsimd api | all floating point types functions]", B, ALL_FL
1363
1422
  xsimd_api_all_floating_point_types_functions<B> Test;
1364
1423
  Test.test_neq_nan();
1365
1424
  }
1425
+ #endif
1366
1426
 
1367
1427
  /*
1368
1428
  * Functions that apply only to mask type