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
@@ -0,0 +1,77 @@
1
+ /***************************************************************************
2
+ * Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
3
+ * Martin Renou *
4
+ * Copyright (c) QuantStack *
5
+ * Copyright (c) Serge Guelton *
6
+ * *
7
+ * Distributed under the terms of the BSD 3-Clause License. *
8
+ * *
9
+ * The full license is in the file LICENSE, distributed with this software. *
10
+ ****************************************************************************/
11
+
12
+ #ifndef XSIMD_VSX_REGISTER_HPP
13
+ #define XSIMD_VSX_REGISTER_HPP
14
+
15
+ #include "./xsimd_common_arch.hpp"
16
+ #include "./xsimd_register.hpp"
17
+
18
+ #if XSIMD_WITH_VSX
19
+ #include <altivec.h>
20
+ #endif
21
+
22
+ namespace xsimd
23
+ {
24
+ /**
25
+ * @ingroup architectures
26
+ *
27
+ * VSX instructions
28
+ */
29
+ struct vsx : common
30
+ {
31
+ static constexpr bool supported() noexcept { return XSIMD_WITH_VSX; }
32
+ static constexpr bool available() noexcept { return true; }
33
+ static constexpr bool requires_alignment() noexcept { return true; }
34
+ static constexpr std::size_t alignment() noexcept { return 16; }
35
+ static constexpr char const* name() noexcept { return "vmx+vsx"; }
36
+ };
37
+
38
+ #if XSIMD_WITH_VSX
39
+ namespace types
40
+ {
41
+
42
+ #define XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(T, Tb) \
43
+ template <> \
44
+ struct get_bool_simd_register<T, vsx> \
45
+ { \
46
+ struct type \
47
+ { \
48
+ using register_type = __vector __bool Tb; \
49
+ register_type data; \
50
+ type() = default; \
51
+ type(register_type r) \
52
+ : data(r) \
53
+ { \
54
+ } \
55
+ operator register_type() const noexcept { return data; } \
56
+ }; \
57
+ }; \
58
+ XSIMD_DECLARE_SIMD_REGISTER(T, vsx, __vector T)
59
+
60
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(signed char, char);
61
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(unsigned char, char);
62
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(char, char);
63
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(unsigned short, short);
64
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(short, short);
65
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(unsigned int, int);
66
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(int, int);
67
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(unsigned long, long);
68
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(long, long);
69
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(float, int);
70
+ XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER(double, long);
71
+
72
+ #undef XSIMD_DECLARE_SIMD_BOOL_VSX_REGISTER
73
+ }
74
+ #endif
75
+ }
76
+
77
+ #endif
@@ -12,6 +12,12 @@
12
12
  #ifndef XSIMD_HPP
13
13
  #define XSIMD_HPP
14
14
 
15
+ #if defined(__FAST_MATH__)
16
+ #define XSIMD_NO_DENORMALS
17
+ #define XSIMD_NO_INFINITIES
18
+ #define XSIMD_NO_NANS
19
+ #endif
20
+
15
21
  #if defined(__has_cpp_attribute)
16
22
  // if this check passes, then the compiler supports feature test macros
17
23
  #if __has_cpp_attribute(nodiscard) >= 201603L
@@ -14,6 +14,7 @@
14
14
 
15
15
  #include "test_utils.hpp"
16
16
 
17
+ #ifndef __FAST_MATH__
17
18
  namespace detail
18
19
  {
19
20
  template <class T, bool is_int = std::is_integral<typename T::value_type>::value>
@@ -49,6 +50,7 @@ namespace detail
49
50
  }
50
51
  };
51
52
  }
53
+ #endif
52
54
 
53
55
  template <class B>
54
56
  struct basic_math_test
@@ -120,6 +122,7 @@ struct basic_math_test
120
122
  CHECK_BATCH_EQ(res, expected);
121
123
  }
122
124
 
125
+ #ifndef __FAST_MATH__
123
126
  void test_isfinite()
124
127
  {
125
128
  detail::infinity_tester<batch_type>::test_isfinite();
@@ -129,6 +132,7 @@ struct basic_math_test
129
132
  {
130
133
  detail::infinity_tester<batch_type>::test_isinf();
131
134
  }
135
+ #endif
132
136
 
133
137
  void test_nextafter()
134
138
  {
@@ -170,8 +174,10 @@ TEST_CASE_TEMPLATE("[basic math tests]", B, BATCH_MATH_TYPES)
170
174
  SUBCASE("remainder") { Test.test_remainder(); }
171
175
  SUBCASE("fdim") { Test.test_fdim(); }
172
176
  SUBCASE("clip") { Test.test_clip(); }
177
+ #ifndef __FAST_MATH__
173
178
  SUBCASE("isfinite") { Test.test_isfinite(); }
174
179
  SUBCASE("isinf") { Test.test_isinf(); }
180
+ #endif
175
181
  SUBCASE("nextafter") { Test.test_nextafter(); }
176
182
  }
177
183
  #endif
@@ -152,6 +152,12 @@ struct batch_test
152
152
  }
153
153
  }
154
154
 
155
+ void test_first_element() const
156
+ {
157
+ batch_type res = batch_lhs();
158
+ CHECK_EQ(res.first(), lhs[0]);
159
+ }
160
+
155
161
  void test_arithmetic() const
156
162
  {
157
163
  // +batch
@@ -471,6 +477,11 @@ struct batch_test
471
477
  auto res = batch_lhs() < batch_rhs();
472
478
  INFO("batch < batch");
473
479
  CHECK_BATCH_EQ(res, expected);
480
+
481
+ std::fill(expected.begin(), expected.end(), false);
482
+ res = batch_lhs() < batch_lhs();
483
+ INFO("batch < (self)");
484
+ CHECK_BATCH_EQ(res, expected);
474
485
  }
475
486
  // batch < scalar
476
487
  {
@@ -496,6 +507,11 @@ struct batch_test
496
507
  auto res = batch_lhs() <= batch_rhs();
497
508
  INFO("batch <= batch");
498
509
  CHECK_BATCH_EQ(res, expected);
510
+
511
+ std::fill(expected.begin(), expected.end(), true);
512
+ res = batch_lhs() <= batch_lhs();
513
+ INFO("batch < (self)");
514
+ CHECK_BATCH_EQ(res, expected);
499
515
  }
500
516
  // batch <= scalar
501
517
  {
@@ -521,6 +537,11 @@ struct batch_test
521
537
  auto res = batch_lhs() > batch_rhs();
522
538
  INFO("batch > batch");
523
539
  CHECK_BATCH_EQ(res, expected);
540
+
541
+ std::fill(expected.begin(), expected.end(), false);
542
+ res = batch_lhs() > batch_lhs();
543
+ INFO("batch > (self)");
544
+ CHECK_BATCH_EQ(res, expected);
524
545
  }
525
546
  // batch > scalar
526
547
  {
@@ -545,6 +566,11 @@ struct batch_test
545
566
  auto res = batch_lhs() >= batch_rhs();
546
567
  INFO("batch >= batch");
547
568
  CHECK_BATCH_EQ(res, expected);
569
+
570
+ std::fill(expected.begin(), expected.end(), true);
571
+ res = batch_lhs() >= batch_lhs();
572
+ INFO("batch >= (self)");
573
+ CHECK_BATCH_EQ(res, expected);
548
574
  }
549
575
  // batch >= scalar
550
576
  {
@@ -711,6 +737,20 @@ struct batch_test
711
737
  INFO("fnms");
712
738
  CHECK_BATCH_EQ(res, expected);
713
739
  }
740
+ // fmas
741
+ {
742
+ array_type expected;
743
+ for (std::size_t i = 0; i < expected.size(); ++i)
744
+ {
745
+ // even lanes: x*y - z, odd lanes: x*y + z
746
+ expected[i] = (i & 1u) == 0
747
+ ? lhs[i] * rhs[i] - rhs[i]
748
+ : lhs[i] * rhs[i] + rhs[i];
749
+ }
750
+ batch_type res = fmas(batch_lhs(), batch_rhs(), batch_rhs());
751
+ INFO("fmas");
752
+ CHECK_BATCH_EQ(res, expected);
753
+ }
714
754
  }
715
755
 
716
756
  void test_abs() const
@@ -800,6 +840,13 @@ struct batch_test
800
840
  INFO("reduce_min");
801
841
  CHECK_SCALAR_EQ(res, expected);
802
842
  }
843
+ // reduce_mul
844
+ {
845
+ value_type expected = std::accumulate(lhs.cbegin(), lhs.cend(), value_type(1), std::multiplies<value_type>());
846
+ value_type res = reduce_mul(batch_lhs());
847
+ INFO("reduce_mul");
848
+ CHECK_SCALAR_EQ(res, expected);
849
+ }
803
850
  }
804
851
 
805
852
  template <size_t N>
@@ -879,12 +926,12 @@ private:
879
926
  for (size_t i = 0; i < size; ++i)
880
927
  {
881
928
  bool negative_lhs = std::is_signed<T>::value && (i % 2 == 1);
882
- lhs[i] = value_type(i) * (negative_lhs ? -10 : 10);
929
+ lhs[i] = value_type(i) * (negative_lhs ? -3 : 3);
883
930
  if (lhs[i] == value_type(0))
884
931
  {
885
932
  lhs[i] += value_type(1);
886
933
  }
887
- rhs[i] = value_type(i) + value_type(4);
934
+ rhs[i] = value_type(i) + value_type(2);
888
935
  }
889
936
  scalar = value_type(3);
890
937
  }
@@ -934,6 +981,11 @@ TEST_CASE_TEMPLATE("[batch]", B, BATCH_TYPES)
934
981
  Test.test_access_operator();
935
982
  }
936
983
 
984
+ SUBCASE("first element")
985
+ {
986
+ Test.test_first_element();
987
+ }
988
+
937
989
  SUBCASE("arithmetic")
938
990
  {
939
991
  Test.test_arithmetic();
@@ -381,6 +381,10 @@ struct batch_bool_test
381
381
  INFO("operator&");
382
382
  CHECK_BATCH_EQ(bool_g.half & bool_g.ihalf, bool_g.all_false);
383
383
  }
384
+ {
385
+ INFO("operator^");
386
+ CHECK_BATCH_EQ(bool_g.half ^ bool_g.all_true, bool_g.ihalf);
387
+ }
384
388
  // free function version
385
389
  {
386
390
  INFO("bitwise_not");
@@ -394,6 +398,10 @@ struct batch_bool_test
394
398
  INFO("bitwise_and");
395
399
  CHECK_BATCH_EQ(xsimd::bitwise_and(bool_g.half, bool_g.ihalf), bool_g.all_false);
396
400
  }
401
+ {
402
+ INFO("bitwise_xor");
403
+ CHECK_BATCH_EQ(xsimd::bitwise_xor(bool_g.half, bool_g.all_true), bool_g.ihalf);
404
+ }
397
405
  }
398
406
 
399
407
  void test_update_operations() const
@@ -29,7 +29,7 @@ namespace detail
29
29
  is_convertible(T_in value)
30
30
  {
31
31
  int64_t signed_value = static_cast<int64_t>(value);
32
- return signed_value <= static_cast<int64_t>(std::numeric_limits<T_out>::max()) && signed_value >= static_cast<int64_t>(std::numeric_limits<T_out>::lowest());
32
+ return signed_value < static_cast<int64_t>(std::numeric_limits<T_out>::max()) && signed_value >= static_cast<int64_t>(std::numeric_limits<T_out>::lowest());
33
33
  }
34
34
 
35
35
  template <class T_out, class T_in>
@@ -43,7 +43,7 @@ namespace detail
43
43
  inline typename std::enable_if<std::is_floating_point<T_in>::value && std::is_integral<T_out>::value, bool>::type
44
44
  is_convertible(T_in value)
45
45
  {
46
- return value <= static_cast<T_in>(std::numeric_limits<T_out>::max()) && value >= static_cast<T_in>(std::numeric_limits<T_out>::lowest());
46
+ return value < static_cast<T_in>(std::numeric_limits<T_out>::max()) && value >= static_cast<T_in>(std::numeric_limits<T_out>::lowest());
47
47
  }
48
48
 
49
49
  template <class T_out, class T_in>
@@ -328,12 +328,19 @@ private:
328
328
  using B_common_in = xsimd::batch<T_in>;
329
329
  using B_common_out = xsimd::batch<T_out>;
330
330
 
331
- T_in in_test_value = static_cast<T_in>(test_value);
331
+ auto clamp = [](T v)
332
+ {
333
+ return static_cast<T_in>(xsimd::min(v, static_cast<T>(std::numeric_limits<T_in>::max() - 1)));
334
+ };
335
+
336
+ T_in in_test_value = clamp(test_value);
332
337
  if (detail::is_convertible<T_out>(in_test_value))
333
338
  {
334
339
  B_common_out res = xsimd::batch_cast<T_out>(B_common_in(in_test_value));
335
340
  INFO(name);
336
- CHECK_SCALAR_EQ(res.get(0), static_cast<T_out>(in_test_value));
341
+ T_out scalar_ref = static_cast<T_out>(in_test_value);
342
+ T_out scalar_res = res.get(0);
343
+ CHECK_SCALAR_EQ(scalar_ref, scalar_res);
337
344
  }
338
345
  }
339
346
 
@@ -176,6 +176,12 @@ struct batch_complex_test
176
176
  }
177
177
  }
178
178
 
179
+ void test_first_element() const
180
+ {
181
+ batch_type res = batch_lhs();
182
+ CHECK_EQ(res.first(), lhs[0]);
183
+ }
184
+
179
185
  void test_arithmetic() const
180
186
  {
181
187
  // +batch
@@ -572,6 +578,12 @@ struct batch_complex_test
572
578
  value_type res = reduce_add(batch_lhs());
573
579
  CHECK_SCALAR_EQ(res, expected);
574
580
  }
581
+ // reduce_mul
582
+ {
583
+ value_type expected = std::accumulate(lhs.cbegin(), lhs.cend(), value_type(1), std::multiplies<value_type>());
584
+ value_type res = reduce_mul(batch_lhs());
585
+ CHECK_SCALAR_EQ(res, expected);
586
+ }
575
587
  }
576
588
 
577
589
  void test_fused_operations() const
@@ -628,6 +640,7 @@ struct batch_complex_test
628
640
  }
629
641
  }
630
642
 
643
+ #ifndef __FAST_MATH__
631
644
  void test_isnan() const
632
645
  {
633
646
  {
@@ -639,6 +652,7 @@ struct batch_complex_test
639
652
  CHECK_BATCH_EQ(res, expected);
640
653
  }
641
654
  }
655
+ #endif
642
656
 
643
657
  private:
644
658
  batch_type batch_lhs() const
@@ -673,6 +687,8 @@ TEST_CASE_TEMPLATE("[xsimd complex batches]", B, BATCH_COMPLEX_TYPES)
673
687
 
674
688
  SUBCASE("access_operator") { Test.test_access_operator(); }
675
689
 
690
+ SUBCASE("first element") { Test.test_first_element(); }
691
+
676
692
  SUBCASE("arithmetic") { Test.test_arithmetic(); }
677
693
 
678
694
  SUBCASE("computed_assignment") { Test.test_computed_assignment(); }
@@ -689,6 +705,8 @@ TEST_CASE_TEMPLATE("[xsimd complex batches]", B, BATCH_COMPLEX_TYPES)
689
705
 
690
706
  SUBCASE("boolean_conversion") { Test.test_boolean_conversion(); }
691
707
 
708
+ #ifndef __FAST_MATH__
692
709
  SUBCASE("isnan") { Test.test_isnan(); }
710
+ #endif
693
711
  }
694
712
  #endif
@@ -239,8 +239,8 @@ struct batch_int_test
239
239
  array_type expected;
240
240
  std::transform(lhs.cbegin(), lhs.cend(), expected.begin(),
241
241
  [nb_sh](const value_type& v)
242
- { return v << nb_sh; });
243
- batch_type res = batch_lhs() << nb_sh;
242
+ { return xsimd::abs(v) << nb_sh; });
243
+ batch_type res = abs(batch_lhs()) << nb_sh;
244
244
  INFO("batch << scalar");
245
245
  CHECK_BATCH_EQ(res, expected);
246
246
  }
@@ -249,8 +249,8 @@ struct batch_int_test
249
249
  array_type expected;
250
250
  std::transform(lhs.cbegin(), lhs.cend(), shift.cbegin(), expected.begin(),
251
251
  [](const value_type& l, const value_type& r)
252
- { return l << r; });
253
- batch_type res = batch_lhs() << batch_shift();
252
+ { return xsimd::abs(l) << r; });
253
+ batch_type res = abs(batch_lhs()) << batch_shift();
254
254
  INFO("batch << batch");
255
255
  CHECK_BATCH_EQ(res, expected);
256
256
  }
@@ -285,21 +285,15 @@ struct batch_int_test
285
285
  for (int32_t i = 0; i < s; ++i)
286
286
  {
287
287
  res = lhs << i;
288
- value_type expected = value_type(1) << i;
289
- for (std::size_t j = 0; j < size; ++j)
290
- {
291
- CHECK_EQ(res.get(j), expected);
292
- }
288
+ batch_type expected(value_type(1) << i);
289
+ CHECK_BATCH_EQ(res, expected);
293
290
  }
294
291
  lhs = batch_type(std::numeric_limits<value_type>::max());
295
292
  for (int32_t i = 0; i < s; ++i)
296
293
  {
297
294
  res = lhs >> i;
298
- value_type expected = std::numeric_limits<value_type>::max() >> i;
299
- for (std::size_t j = 0; j < size; ++j)
300
- {
301
- CHECK_EQ(res.get(j), expected);
302
- }
295
+ batch_type expected(std::numeric_limits<value_type>::max() >> i);
296
+ CHECK_BATCH_EQ(res, expected);
303
297
  }
304
298
  }
305
299