/***************************************************************************
* Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht *
* Copyright (c) QuantStack *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
****************************************************************************/
#include "xtensor/chunk/xchunked_array.hpp"
#include "xtensor/core/xnoalias.hpp"
#include "xtensor/io/xcsv.hpp"
#include "xtensor/views/xbroadcast.hpp"
#include "test_common_macros.hpp"
namespace xt
{
using in_memory_chunked_array = xchunked_array;
TEST(xchunked_array, indexed_access)
{
auto a = chunked_array({10, 10, 10}, {2, 3, 4});
std::vector idx = {3, 9, 8};
double val;
val = 1.;
a[idx] = val;
ASSERT_EQ(a[idx], val);
ASSERT_EQ(a(3, 9, 8), val);
val = 2.;
a(3, 9, 8) = val;
ASSERT_EQ(a(3, 9, 8), val);
ASSERT_EQ(a[idx], val);
val = 3.;
for (auto& it : a)
{
it = val;
}
for (auto it : a)
{
ASSERT_EQ(it, val);
}
}
TEST(xchunked_array, assign_expression)
{
std::vector shape1 = {2, 2, 2};
std::vector chunk_shape1 = {2, 3, 4};
auto a1 = chunked_array(shape1, chunk_shape1);
double val;
val = 3.;
a1 = broadcast(val, a1.shape());
for (const auto& v : a1)
{
EXPECT_EQ(v, val);
}
std::vector shape2 = {32, 10, 10};
auto a2 = chunked_array(shape2, chunk_shape1);
a2 = broadcast(val, a2.shape());
for (const auto& v : a2)
{
EXPECT_EQ(v, val);
}
a2 += a2;
for (const auto& v : a2)
{
EXPECT_EQ(v, 2. * val);
}
a2 += 2.;
for (const auto& v : a2)
{
EXPECT_EQ(v, 2. * val + 2.);
}
xarray a3{{1., 2., 3.}, {4., 5., 6.}, {7., 8., 9.}};
EXPECT_EQ(is_chunked(a3), false);
std::vector chunk_shape4 = {2, 2};
auto a4 = chunked_array(a3, chunk_shape4);
EXPECT_EQ(is_chunked(a4), true);
double i = 1.;
for (const auto& v : a4)
{
EXPECT_EQ(v, i);
i += 1.;
}
auto a5 = in_memory_chunked_array(a4);
EXPECT_EQ(is_chunked(a5), true);
for (const auto& v : a5.chunk_shape())
{
EXPECT_EQ(v, 2);
}
auto a6 = chunked_array(a3);
EXPECT_EQ(is_chunked(a6), true);
for (const auto& v : a6.chunk_shape())
{
EXPECT_EQ(v, 3);
}
std::vector shape3 = {3, 3};
std::vector chunk_shape3 = {1, 2};
auto a7 = chunked_array(shape3, chunk_shape3);
for (auto it = a7.chunks().begin(); it != a7.chunks().end(); ++it)
{
it->resize(chunk_shape3);
}
a7 = a3;
for (auto it = a7.chunks().begin(); it != a7.chunks().end(); ++it)
{
EXPECT_EQ(it->shape(), chunk_shape3);
}
}
TEST(xchunked_array, noalias)
{
std::vector shape = {10, 10, 10};
std::vector chunk_shape = {2, 2, 2};
auto a = chunked_array(shape, chunk_shape);
xt::xarray b = arange(1000).reshape({10, 10, 10});
noalias(a) = b;
EXPECT_EQ(a, b);
}
TEST(xchunked_array, chunk_iterator)
{
std::vector shape = {10, 10, 10};
std::vector chunk_shape = {2, 2, 2};
auto a = chunked_array(shape, chunk_shape);
xt::xarray b = arange(1000).reshape({10, 10, 10});
noalias(a) = b;
auto it = a.chunk_begin();
auto cit = a.chunk_cbegin();
for (size_t i = 0; i < 5; ++i)
{
for (size_t j = 0; j < 5; ++j)
{
for (size_t k = 0; k < 5; ++k)
{
EXPECT_EQ(*((*it).begin()), a(2 * i, 2 * j, 2 * k));
EXPECT_EQ(*((*cit).cbegin()), a(2 * i, 2 * j, 2 * k));
++it;
++cit;
}
}
}
it = a.chunk_begin();
std::advance(it, 2);
EXPECT_EQ(*((*it).begin()), a(0, 0, 4));
}
}