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.
- sequenzo/__init__.py +25 -1
- sequenzo/big_data/clara/clara.py +1 -1
- sequenzo/big_data/clara/utils/get_weighted_diss.c +156 -156
- sequenzo/big_data/clara/utils/get_weighted_diss.cp39-win_amd64.pyd +0 -0
- sequenzo/clustering/clustering_c_code.cp39-win_amd64.pyd +0 -0
- sequenzo/clustering/hierarchical_clustering.py +202 -8
- sequenzo/define_sequence_data.py +34 -2
- sequenzo/dissimilarity_measures/c_code.cp39-win_amd64.pyd +0 -0
- sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +1 -1
- sequenzo/dissimilarity_measures/src/DHDdistance.cpp +13 -37
- sequenzo/dissimilarity_measures/src/LCPdistance.cpp +13 -37
- sequenzo/dissimilarity_measures/src/OMdistance.cpp +12 -47
- sequenzo/dissimilarity_measures/src/OMspellDistance.cpp +103 -67
- sequenzo/dissimilarity_measures/src/dp_utils.h +160 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_arithmetic.hpp +41 -16
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_complex.hpp +4 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_details.hpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_logical.hpp +10 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_math.hpp +127 -43
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_memory.hpp +30 -2
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_swizzle.hpp +174 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_trigo.hpp +14 -5
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx.hpp +111 -54
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx2.hpp +131 -9
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512bw.hpp +11 -113
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512dq.hpp +39 -7
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512f.hpp +336 -30
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi.hpp +9 -37
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi2.hpp +58 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common.hpp +1 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common_fwd.hpp +35 -2
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_constants.hpp +3 -1
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_emulated.hpp +17 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx.hpp +13 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_sse.hpp +18 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma4.hpp +13 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_isa.hpp +8 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon.hpp +363 -34
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon64.hpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_rvv.hpp +13 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_scalar.hpp +41 -4
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse2.hpp +252 -16
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse3.hpp +9 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_ssse3.hpp +12 -1
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sve.hpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_vsx.hpp +892 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_wasm.hpp +78 -1
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_arch.hpp +3 -1
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_config.hpp +13 -2
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_cpuid.hpp +5 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_inline.hpp +5 -1
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_all_registers.hpp +2 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_api.hpp +64 -1
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch.hpp +36 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_rvv_register.hpp +40 -31
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_traits.hpp +8 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_vsx_register.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/xsimd.hpp +6 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_basic_math.cpp +6 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch.cpp +54 -2
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_bool.cpp +8 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_cast.cpp +11 -4
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_complex.cpp +18 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_int.cpp +8 -14
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_manip.cpp +216 -173
- sequenzo/dissimilarity_measures/src/xsimd/test/test_load_store.cpp +6 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_memory.cpp +1 -1
- sequenzo/dissimilarity_measures/src/xsimd/test/test_power.cpp +7 -4
- sequenzo/dissimilarity_measures/src/xsimd/test/test_select.cpp +6 -2
- sequenzo/dissimilarity_measures/src/xsimd/test/test_shuffle.cpp +32 -18
- sequenzo/dissimilarity_measures/src/xsimd/test/test_utils.hpp +21 -24
- sequenzo/dissimilarity_measures/src/xsimd/test/test_xsimd_api.cpp +69 -9
- sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.c +156 -156
- sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.cp39-win_amd64.pyd +0 -0
- sequenzo/dissimilarity_measures/utils/seqconc.c +156 -156
- sequenzo/dissimilarity_measures/utils/seqconc.cp39-win_amd64.pyd +0 -0
- sequenzo/dissimilarity_measures/utils/seqdss.c +156 -156
- sequenzo/dissimilarity_measures/utils/seqdss.cp39-win_amd64.pyd +0 -0
- sequenzo/dissimilarity_measures/utils/seqdur.c +156 -156
- sequenzo/dissimilarity_measures/utils/seqdur.cp39-win_amd64.pyd +0 -0
- sequenzo/dissimilarity_measures/utils/seqlength.c +156 -156
- sequenzo/dissimilarity_measures/utils/seqlength.cp39-win_amd64.pyd +0 -0
- sequenzo/sequence_characteristics/__init__.py +4 -0
- sequenzo/sequence_characteristics/complexity_index.py +17 -57
- sequenzo/sequence_characteristics/overall_cross_sectional_entropy.py +177 -111
- sequenzo/sequence_characteristics/plot_characteristics.py +30 -11
- sequenzo/sequence_characteristics/simple_characteristics.py +1 -0
- sequenzo/sequence_characteristics/state_frequencies_and_entropy_per_sequence.py +9 -3
- sequenzo/sequence_characteristics/turbulence.py +47 -67
- sequenzo/sequence_characteristics/variance_of_spell_durations.py +19 -9
- sequenzo/sequence_characteristics/within_sequence_entropy.py +5 -58
- sequenzo/visualization/plot_sequence_index.py +58 -35
- sequenzo/visualization/plot_state_distribution.py +57 -36
- sequenzo/with_event_history_analysis/__init__.py +35 -0
- sequenzo/with_event_history_analysis/sequence_analysis_multi_state_model.py +850 -0
- sequenzo/with_event_history_analysis/sequence_history_analysis.py +283 -0
- {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/METADATA +7 -6
- {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/RECORD +101 -94
- {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/WHEEL +0 -0
- {sequenzo-0.1.17.dist-info → sequenzo-0.1.18.dist-info}/licenses/LICENSE +0 -0
- {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 ? -
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
289
|
-
|
|
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
|
-
|
|
299
|
-
|
|
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
|
|