Skip to content

Commit fd501d5

Browse files
committed
Fix xview data offsets with multiple leading newaxis slices
1 parent c9125c9 commit fd501d5

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

‎include/xtensor/views/xview.hpp‎

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,14 +1316,10 @@ namespace xt
13161316
);
13171317

13181318
std::ptrdiff_t result = 0;
1319-
std::size_t i = 0;
1320-
for (; i < std::min(sizeof...(S), m_e.strides().size()); ++i)
1319+
for (std::size_t i = 0; i < sizeof...(S); ++i)
13211320
{
1322-
result += temp[i] * m_e.strides()[i - newaxis_count_before<S...>(i)];
1323-
}
1324-
for (; i < sizeof...(S); ++i)
1325-
{
1326-
result += temp[i];
1321+
std::size_t index = i - newaxis_count_before<S...>(i);
1322+
result += temp[i] * (index < m_e.strides().size() ? m_e.strides()[index] : 1);
13271323
}
13281324
return static_cast<std::size_t>(result) + m_e.data_offset();
13291325
}

‎test/test_xview.cpp‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,6 +1457,26 @@ namespace xt
14571457
EXPECT_EQ(static_cast<std::size_t>(doe2), do2);
14581458
}
14591459

1460+
TEST(xview, multiple_leading_newaxis_data_offset)
1461+
{
1462+
xarray<int, layout_type::row_major> a = {{0, 1}, {2, 3}};
1463+
auto v = view(a, newaxis(), newaxis(), range(1, 2), all());
1464+
1465+
view_shape_type expected_shape = {1, 1, 1, 2};
1466+
EXPECT_EQ(v.shape(), expected_shape);
1467+
EXPECT_EQ(v.data_offset(), size_t(2));
1468+
EXPECT_EQ(v(0, 0, 0, 0), 2);
1469+
EXPECT_EQ(v(0, 0, 0, 1), 3);
1470+
1471+
xarray<int> copied = v;
1472+
xarray<int> expected_copy = {{{{2, 3}}}};
1473+
EXPECT_EQ(copied, expected_copy);
1474+
1475+
v = 100;
1476+
xarray<int> expected_parent = {{0, 1}, {100, 100}};
1477+
EXPECT_EQ(a, expected_parent);
1478+
}
1479+
14601480
TEST(xview, view_simd_test)
14611481
{
14621482
if (XTENSOR_DEFAULT_LAYOUT == layout_type::row_major)

0 commit comments

Comments
 (0)