Skip to content

Commit 2dba9d1

Browse files
authored
Merge pull request #252 from adriendelsalle/test-assign-traits
Test `pyarray` assign traits
2 parents 1e922c5 + 63d083a commit 2dba9d1

File tree

2 files changed

+167
-0
lines changed

2 files changed

+167
-0
lines changed

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ include_directories(${GTEST_INCLUDE_DIRS})
8686
set(XTENSOR_PYTHON_TESTS
8787
main.cpp
8888
test_pyarray.cpp
89+
test_pyarray_traits.cpp
8990
test_pytensor.cpp
9091
test_pyvectorize.cpp
9192
)

test/test_pyarray_traits.cpp

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/***************************************************************************
2+
* Copyright (c) Wolf Vollprecht, Johan Mabille and Sylvain Corlay *
3+
* Copyright (c) QuantStack *
4+
* *
5+
* Distributed under the terms of the BSD 3-Clause License. *
6+
* *
7+
* The full license is in the file LICENSE, distributed with this software. *
8+
****************************************************************************/
9+
10+
#include "gtest/gtest.h"
11+
12+
#include "xtensor-python/pyarray.hpp"
13+
14+
15+
16+
namespace xt
17+
{
18+
namespace testing
19+
{
20+
class pyarray_traits: public ::testing::Test
21+
{
22+
protected:
23+
24+
using dynamic_type = xt::pyarray<double>;
25+
using row_major_type = xt::pyarray<double, xt::layout_type::row_major>;
26+
using column_major_type = xt::pyarray<double, xt::layout_type::column_major>;
27+
28+
dynamic_type d1 = {{0., 1.}, {0., 10.}, {0., 100.}};
29+
dynamic_type d2 = {{0., 2.}, {0., 20.}, {0., 200.}};
30+
31+
row_major_type r1 = {{0., 1.}, {0., 10.}, {0., 100.}};
32+
row_major_type r2 = {{0., 2.}, {0., 20.}, {0., 200.}};
33+
34+
column_major_type c1 = {{0., 1.}, {0., 10.}, {0., 100.}};
35+
column_major_type c2 = {{0., 2.}, {0., 20.}, {0., 200.}};
36+
37+
template <class T>
38+
bool test_has_strides(T const&)
39+
{
40+
return xt::has_strides<T>::value;
41+
}
42+
43+
template <class T>
44+
xt::layout_type test_result_layout(T const& a1, T const& a2)
45+
{
46+
auto tmp1 = pow(sin((a2 - a1) / 2.), 2.);
47+
auto tmp2 = cos(a1);
48+
return (tmp1 + tmp2).layout();
49+
}
50+
51+
template <class T>
52+
bool test_linear_assign(T const& a1, T const& a2)
53+
{
54+
auto tmp1 = pow(sin((a2 - a1) / 2.), 2.);
55+
auto tmp2 = cos(a1);
56+
T res = tmp1 + tmp2;
57+
return xt::xassign_traits<T, decltype(tmp1 + tmp2)>::linear_assign(res, tmp1 + tmp2, true);
58+
}
59+
60+
template <class T>
61+
bool test_static_simd_linear_assign(T const& a1, T const& a2)
62+
{
63+
auto tmp1 = pow(sin((a2 - a1) / 2.), 2.);
64+
auto tmp2 = cos(a1);
65+
return xt::xassign_traits<T, decltype(tmp2)>::simd_linear_assign();
66+
}
67+
68+
template <class T>
69+
bool test_dynamic_simd_linear_assign(T const& a1, T const& a2)
70+
{
71+
auto tmp1 = pow(sin((a2 - a1) / 2.), 2.);
72+
auto tmp2 = cos(a1);
73+
return xt::xassign_traits<T, decltype(tmp2)>::simd_linear_assign(a1, tmp2);
74+
}
75+
76+
template <class T>
77+
bool test_linear_static_layout(T const& a1, T const& a2)
78+
{
79+
auto tmp1 = pow(sin((a2 - a1) / 2.), 2.);
80+
auto tmp2 = cos(a1);
81+
return xt::detail::linear_static_layout<decltype(tmp1), decltype(tmp2)>();
82+
}
83+
84+
template <class T>
85+
bool test_contiguous_layout(T const& a1, T const& a2)
86+
{
87+
auto tmp1 = pow(sin((a2 - a1) / 2.), 2.);
88+
auto tmp2 = cos(a1);
89+
return decltype(tmp1)::contiguous_layout && decltype(tmp2)::contiguous_layout;
90+
}
91+
};
92+
93+
TEST_F(pyarray_traits, result_layout)
94+
{
95+
EXPECT_TRUE(d1.layout() == layout_type::row_major);
96+
EXPECT_TRUE(test_result_layout(d1, d2) == layout_type::row_major);
97+
98+
EXPECT_TRUE(r1.layout() == layout_type::row_major);
99+
EXPECT_TRUE(test_result_layout(r1, r2) == layout_type::row_major);
100+
101+
EXPECT_TRUE(c1.layout() == layout_type::column_major);
102+
EXPECT_TRUE(test_result_layout(c1, c2) == layout_type::column_major);
103+
}
104+
105+
TEST_F(pyarray_traits, has_strides)
106+
{
107+
EXPECT_TRUE(test_has_strides(d1));
108+
EXPECT_TRUE(test_has_strides(r1));
109+
EXPECT_TRUE(test_has_strides(c1));
110+
}
111+
112+
TEST_F(pyarray_traits, has_linear_assign)
113+
{
114+
EXPECT_TRUE(d2.has_linear_assign(d1.strides()));
115+
EXPECT_TRUE(r2.has_linear_assign(r1.strides()));
116+
EXPECT_TRUE(c2.has_linear_assign(c1.strides()));
117+
}
118+
119+
TEST_F(pyarray_traits, linear_assign)
120+
{
121+
EXPECT_TRUE(test_linear_assign(d1, d2));
122+
EXPECT_TRUE(test_linear_assign(r1, r2));
123+
EXPECT_TRUE(test_linear_assign(c1, c2));
124+
}
125+
126+
TEST_F(pyarray_traits, static_simd_linear_assign)
127+
{
128+
#ifdef XTENSOR_USE_XSIMD
129+
EXPECT_FALSE(test_static_simd_linear_assign(d1, d2));
130+
EXPECT_TRUE(test_static_simd_linear_assign(r1, r2));
131+
EXPECT_TRUE(test_static_simd_linear_assign(c1, c2));
132+
#else
133+
EXPECT_FALSE(test_static_simd_linear_assign(d1, d2));
134+
EXPECT_FALSE(test_static_simd_linear_assign(r1, r2));
135+
EXPECT_FALSE(test_static_simd_linear_assign(c1, c2));
136+
#endif
137+
}
138+
139+
TEST_F(pyarray_traits, dynamic_simd_linear_assign)
140+
{
141+
#ifdef XTENSOR_USE_XSIMD
142+
EXPECT_TRUE(test_dynamic_simd_linear_assign(d1, d2));
143+
EXPECT_TRUE(test_dynamic_simd_linear_assign(r1, r2));
144+
EXPECT_TRUE(test_dynamic_simd_linear_assign(c1, c2));
145+
#else
146+
EXPECT_FALSE(test_dynamic_simd_linear_assign(d1, d2));
147+
EXPECT_FALSE(test_dynamic_simd_linear_assign(r1, r2));
148+
EXPECT_FALSE(test_dynamic_simd_linear_assign(c1, c2));
149+
#endif
150+
}
151+
152+
TEST_F(pyarray_traits, linear_static_layout)
153+
{
154+
EXPECT_FALSE(test_linear_static_layout(d1, d2));
155+
EXPECT_TRUE(test_linear_static_layout(r1, r2));
156+
EXPECT_TRUE(test_linear_static_layout(c1, c2));
157+
}
158+
159+
TEST_F(pyarray_traits, contiguous_layout)
160+
{
161+
EXPECT_FALSE(test_contiguous_layout(d1, d2));
162+
EXPECT_TRUE(test_contiguous_layout(r1, r2));
163+
EXPECT_TRUE(test_contiguous_layout(c1, c2));
164+
}
165+
}
166+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy