Change data accessor to return const ref to avoid copy.

PiperOrigin-RevId: 346664852
Change-Id: Ica1af6d41c9167b846758a0f4746481563c84a4e
This commit is contained in:
Yunlu Li 2020-12-09 16:39:23 -08:00 committed by TensorFlower Gardener
parent 01caefefc0
commit a019f0d125
7 changed files with 75 additions and 76 deletions

View File

@ -244,8 +244,8 @@ std::vector<T> BuildSparsityParameterAttribute(
tflite::optimize::sparsity::FormatConverter<T> format_converter(
shape, traversal_order, format, b_size, b_map);
format_converter.DenseToSparse(dense_buffer);
auto metadata = format_converter.GetDimMetadata();
auto compressed_data = format_converter.GetData();
const auto& metadata = format_converter.GetDimMetadata();
const auto& compressed_data = format_converter.GetData();
const int dim_size = metadata.size() / 2;
std::vector<Attribute> dim_metadata(traversal_order.size());
for (int i = 0; i < dim_size; i++) {

View File

@ -80,21 +80,21 @@ TfLiteStatus Eval(TfLiteContext* context, TfLiteNode* node) {
GetTensorShape(op_context.input),
GetTensorData<float>(op_context.input),
GetTensorShape(op_context.output),
GetTensorData<float>(op_context.output));
GetTensorData<float>(op_context.output), context);
break;
case kTfLiteFloat16:
reference_ops::Densify(op_context.input->sparsity,
GetTensorShape(op_context.input),
GetTensorData<Eigen::half>(op_context.input),
GetTensorShape(op_context.output),
GetTensorData<Eigen::half>(op_context.output));
reference_ops::Densify(
op_context.input->sparsity, GetTensorShape(op_context.input),
GetTensorData<Eigen::half>(op_context.input),
GetTensorShape(op_context.output),
GetTensorData<Eigen::half>(op_context.output), context);
break;
case kTfLiteInt8:
reference_ops::Densify(op_context.input->sparsity,
GetTensorShape(op_context.input),
GetTensorData<int8_t>(op_context.input),
GetTensorShape(op_context.output),
GetTensorData<int8_t>(op_context.output));
GetTensorData<int8_t>(op_context.output), context);
break;
default:

View File

@ -28,7 +28,8 @@ namespace reference_ops {
template <typename T>
inline void Densify(const TfLiteSparsity* sparsity,
const RuntimeShape& input_shape, const T* input_data,
const RuntimeShape& output_shape, T* output_data) {
const RuntimeShape& output_shape, T* output_data,
TfLiteContext* context) {
const int dims_count = output_shape.DimensionsCount();
std::vector<int> vector_shape(dims_count);
for (int i = 0; i < dims_count; i++) {
@ -37,11 +38,8 @@ inline void Densify(const TfLiteSparsity* sparsity,
tflite::optimize::sparsity::FormatConverter<T> converter(vector_shape,
*sparsity);
converter.SparseToDense(input_data);
const std::vector<T> out = converter.GetData();
for (int i = 0; i < out.size(); i++) {
output_data[i] = out[i];
}
converter.SparseToDense(input_data, output_shape.FlatSize(), output_data,
context);
}
} // namespace reference_ops

View File

@ -35,7 +35,7 @@ inline void FullyConnectedSparseWeight(
tflite::optimize::sparsity::FormatConverter<float> converter(
weights_shape_vector, sparsity);
converter.SparseToDense(weights_data);
const std::vector<float> dense_weights_data = converter.GetData();
const std::vector<float>& dense_weights_data = converter.GetData();
FullyConnected(params, input_shape, input_data, weights_shape,
dense_weights_data.data(), bias_shape, bias_data, output_shape,
output_data);

View File

@ -225,8 +225,8 @@ class SingleOpModel {
t.shape, t.traversal_order, t.format, t.block_size, t.block_map);
converter.DenseToSparse(dense_data.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto sparse_data = converter.GetData();
const auto& dim_metadata = converter.GetDimMetadata();
const auto& sparse_data = converter.GetData();
// Build sparsity parameter.
std::vector<flatbuffers::Offset<DimensionMetadata>> fb_dim_metadata(

View File

@ -54,9 +54,10 @@ class FormatConverter {
FormatConverter(const std::vector<int>& shape,
const TfLiteSparsity& sparsity);
// TODO(b/175040247): Return const reference to avoid copy.
std::vector<T> GetData() { return data_; }
std::vector<std::vector<int>> GetDimMetadata() { return dim_metadata_; }
const std::vector<T>& GetData() { return data_; }
const std::vector<std::vector<int>>& GetDimMetadata() {
return dim_metadata_;
}
// Method for dense to sparse conversion. Need to call GetData() method to get
// the compressed data.
@ -68,7 +69,7 @@ class FormatConverter {
// Method for sparse to dense conversion with caller provided buffer. No need
// to call GetData() with this method.
TfLiteStatus SparseToDense(const T* src_data, const size_t dest_size,
T* dest_data, TfLiteContext* context);
T* dest_data, TfLiteContext* context = nullptr);
private:
// A recursive function to fetch data from the compressed src_data buffer and

View File

@ -31,18 +31,18 @@ TEST(FormatConverterTest, SimpleTestD0D1) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0 = {3};
const std::vector<int> dm1 = {4};
EXPECT_EQ(dm0, dim_metadata[0]);
EXPECT_EQ(dm1, dim_metadata[2]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 0, 9, 8, 0, 0, 0, 0, 5, 0, 0, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -60,7 +60,7 @@ TEST(FormatConverterTest, SimpleTestS0D1) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 2};
const std::vector<int> dm0_1 = {0, 2};
const std::vector<int> dm1 = {4};
@ -68,12 +68,12 @@ TEST(FormatConverterTest, SimpleTestS0D1) {
EXPECT_EQ(dm0_1, dim_metadata[1]);
EXPECT_EQ(dm1, dim_metadata[2]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 0, 9, 8, 5, 0, 0, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -91,7 +91,7 @@ TEST(FormatConverterTest, SimpleTestD0S1) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0 = {3};
const std::vector<int> dm1_0 = {0, 3, 3, 5};
const std::vector<int> dm1_1 = {0, 2, 3, 0, 3};
@ -99,12 +99,12 @@ TEST(FormatConverterTest, SimpleTestD0S1) {
EXPECT_EQ(dm1_0, dim_metadata[2]);
EXPECT_EQ(dm1_1, dim_metadata[3]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 9, 8, 5, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -122,7 +122,7 @@ TEST(FormatConverterTest, SimpleTestS0S1) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 2};
const std::vector<int> dm0_1 = {0, 2};
const std::vector<int> dm1_0 = {0, 3, 5};
@ -132,12 +132,12 @@ TEST(FormatConverterTest, SimpleTestS0S1) {
EXPECT_EQ(dm1_0, dim_metadata[2]);
EXPECT_EQ(dm1_1, dim_metadata[3]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 9, 8, 5, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -155,18 +155,18 @@ TEST(FormatConverterTest, SimpleTestD1D0) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0 = {4};
const std::vector<int> dm1 = {3};
EXPECT_EQ(dm0, dim_metadata[0]);
EXPECT_EQ(dm1, dim_metadata[2]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 0, 5, 0, 0, 0, 9, 0, 0, 8, 0, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -184,7 +184,7 @@ TEST(FormatConverterTest, SimpleTestS1D0) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 3};
const std::vector<int> dm0_1 = {0, 2, 3};
const std::vector<int> dm1 = {3};
@ -192,12 +192,12 @@ TEST(FormatConverterTest, SimpleTestS1D0) {
EXPECT_EQ(dm0_1, dim_metadata[1]);
EXPECT_EQ(dm1, dim_metadata[2]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 0, 5, 9, 0, 0, 8, 0, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -215,7 +215,7 @@ TEST(FormatConverterTest, SimpleTestD1S0) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0 = {4};
const std::vector<int> dm1_0 = {0, 2, 2, 3, 5};
const std::vector<int> dm1_1 = {0, 2, 0, 0, 2};
@ -223,12 +223,12 @@ TEST(FormatConverterTest, SimpleTestD1S0) {
EXPECT_EQ(dm1_0, dim_metadata[2]);
EXPECT_EQ(dm1_1, dim_metadata[3]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 5, 9, 8, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -246,7 +246,7 @@ TEST(FormatConverterTest, SimpleTestS1S0) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 3};
const std::vector<int> dm0_1 = {0, 2, 3};
const std::vector<int> dm1_0 = {0, 2, 3, 5};
@ -256,12 +256,12 @@ TEST(FormatConverterTest, SimpleTestS1S0) {
EXPECT_EQ(dm1_0, dim_metadata[2]);
EXPECT_EQ(dm1_1, dim_metadata[3]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 5, 9, 8, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -279,7 +279,7 @@ TEST(FormatConverterTest, 3DTestS0D1S2) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 2};
const std::vector<int> dm0_1 = {0, 2};
const std::vector<int> dm1 = {2};
@ -292,12 +292,12 @@ TEST(FormatConverterTest, 3DTestS0D1S2) {
EXPECT_EQ(dm2_0, dim_metadata[4]);
EXPECT_EQ(dm2_1, dim_metadata[5]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 9, 8, 5, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -315,7 +315,7 @@ TEST(FormatConverterTest, 3DTestD0D1S2) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0 = {3};
const std::vector<int> dm1 = {2};
const std::vector<int> dm2_0 = {0, 1, 3, 3, 3, 4, 5};
@ -326,12 +326,12 @@ TEST(FormatConverterTest, 3DTestD0D1S2) {
EXPECT_EQ(dm2_0, dim_metadata[4]);
EXPECT_EQ(dm2_1, dim_metadata[5]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {6, 9, 8, 5, 7};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -350,7 +350,7 @@ TEST(FormatConverterTest, 3DTestS0S1S2) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 2};
const std::vector<int> dm0_1 = {0, 2};
const std::vector<int> dm1_0 = {0, 2, 5};
@ -364,12 +364,12 @@ TEST(FormatConverterTest, 3DTestS0S1S2) {
EXPECT_EQ(dm2_0, dim_metadata[4]);
EXPECT_EQ(dm2_1, dim_metadata[5]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 7, 5, 2, 4, 8, 3, 9};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -388,7 +388,7 @@ TEST(FormatConverterTest, 3DTestS0S2S1) {
FormatConverter<int> converter(dense_shape, traversal_order, format);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0_0 = {0, 2};
const std::vector<int> dm0_1 = {0, 2};
const std::vector<int> dm1_0 = {0, 2, 5};
@ -402,12 +402,12 @@ TEST(FormatConverterTest, 3DTestS0S2S1) {
EXPECT_EQ(dm2_0, dim_metadata[4]);
EXPECT_EQ(dm2_1, dim_metadata[5]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 7, 5, 2, 4, 8, 3, 9};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -429,20 +429,20 @@ TEST(FormatConverterTest, BlockTestD0D1) {
block_size, block_map);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm = {2};
EXPECT_EQ(dm, dim_metadata[0]);
EXPECT_EQ(dm, dim_metadata[2]);
EXPECT_EQ(dm, dim_metadata[4]);
EXPECT_EQ(dm, dim_metadata[6]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 0, 0, 4, 2, 3, 0, 0,
0, 0, 0, 0, 5, 0, 0, 6};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -465,7 +465,7 @@ TEST(FormatConverterTest, BlockTestD0S11DBlock) {
block_size, block_map);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm0 = {4};
const std::vector<int> dm2 = {2};
const std::vector<int> dm1_0 = {0, 2, 3, 4, 5};
@ -475,12 +475,12 @@ TEST(FormatConverterTest, BlockTestD0S11DBlock) {
EXPECT_EQ(dm1_1, dim_metadata[3]);
EXPECT_EQ(dm2, dim_metadata[4]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 0, 2, 3, 0, 4, 5, 0, 0, 6};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -503,7 +503,7 @@ TEST(FormatConverterTest, BlockTestD0S12DBlock) {
block_size, block_map);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm = {2};
const std::vector<int> dm1_0 = {0, 2, 3};
const std::vector<int> dm1_1 = {0, 1, 1};
@ -513,12 +513,12 @@ TEST(FormatConverterTest, BlockTestD0S12DBlock) {
EXPECT_EQ(dm, dim_metadata[4]);
EXPECT_EQ(dm, dim_metadata[6]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 0, 0, 4, 2, 3, 0, 0, 5, 0, 0, 6};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -541,7 +541,7 @@ TEST(FormatConverterTest, BlockTestD1S0) {
block_size, block_map);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm = {2};
const std::vector<int> dm1_0 = {0, 1, 3};
const std::vector<int> dm1_1 = {0, 0, 1};
@ -551,12 +551,12 @@ TEST(FormatConverterTest, BlockTestD1S0) {
EXPECT_EQ(dm, dim_metadata[4]);
EXPECT_EQ(dm, dim_metadata[6]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 0, 0, 4, 2, 0, 3, 0, 5, 0, 0, 6};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -579,7 +579,7 @@ TEST(FormatConverterTest, BlockTestD0S1LastBlockEmpty) {
block_size, block_map);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm = {2};
const std::vector<int> dm1_0 = {0, 2, 2};
const std::vector<int> dm1_1 = {0, 1};
@ -589,12 +589,12 @@ TEST(FormatConverterTest, BlockTestD0S1LastBlockEmpty) {
EXPECT_EQ(dm, dim_metadata[4]);
EXPECT_EQ(dm, dim_metadata[6]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 0, 0, 4, 2, 3, 0, 0};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());
@ -617,7 +617,7 @@ TEST(FormatConverterTest, BlockTestD0S1ColMajorBlock) {
block_size, block_map);
converter.DenseToSparse(dense_values.data());
const auto dim_metadata = converter.GetDimMetadata();
const auto& dim_metadata = converter.GetDimMetadata();
const std::vector<int> dm = {2};
const std::vector<int> dm1_0 = {0, 3, 4};
const std::vector<int> dm1_1 = {0, 1, 2, 1};
@ -627,13 +627,13 @@ TEST(FormatConverterTest, BlockTestD0S1ColMajorBlock) {
EXPECT_EQ(dm, dim_metadata[4]);
EXPECT_EQ(dm, dim_metadata[6]);
const auto data = converter.GetData();
const auto& data = converter.GetData();
const std::vector<int> expected_data = {1, 1, 0, 0, 2, 2, 3, 3,
0, 0, 4, 4, 5, 0, 0, 0};
EXPECT_EQ(expected_data, data);
converter.SparseToDense(expected_data.data());
const auto data_back = converter.GetData();
const auto& data_back = converter.GetData();
EXPECT_EQ(data_back, dense_values);
std::vector<int> dense_data(dense_values.size());