#include "test/common/index.h"
#include "test/common/utils.h"
namespace megdnn {
namespace test {
Index::Index(TensorLayout layout, size_t linear) : m_layout(layout), m_linear(linear) {
linear_to_array();
array_to_offset();
}
Index::Index(TensorLayout layout, TensorShape array)
: m_layout(layout), m_array(array) {
array_to_linear();
array_to_offset();
}
void Index::linear_to_array() {
auto linear = m_linear;
auto& array = m_array;
array.ndim = m_layout.ndim;
for (size_t j = m_layout.ndim; j > 0; --j) {
size_t i = j - 1;
array[i] = linear % m_layout[i];
linear /= m_layout[i];
}
megdnn_assert(linear == 0);
}
void Index::array_to_linear() {
auto& linear = m_linear;
megdnn_assert(m_array.ndim == m_layout.ndim);
linear = 0;
for (size_t i = 0; i < m_array.ndim; ++i) {
megdnn_assert(m_array[i] < m_layout[i]);
linear = linear * m_layout[i] + m_array[i];
}
}
void Index::array_to_offset() {
auto& offset = m_offset;
megdnn_assert(m_array.ndim == m_layout.ndim);
offset = 0;
for (size_t i = 0; i < m_array.ndim; ++i) {
megdnn_assert(m_array[i] < m_layout[i]);
offset += m_array[i] * m_layout.stride[i];
}
}
std::string Index::to_string() const {
std::string res = "";
res.append("{");
res.append("array=");
res.append(m_array.to_string());
res.append(",linear=");
res.append(std::to_string(m_linear));
res.append(",offset=");
res.append(std::to_string(m_offset));
res.append("}");
return res;
}
} }