Skip to content

Commit 08da139

Browse files
authored
[tflchef] Extract operand_sparsity (#16107)
This will extract operand_sparsity() method from long cook_operands(). ONE-DCO-1.0-Signed-off-by: SaeHie Park <[email protected]>
1 parent 21aebcc commit 08da139

File tree

1 file changed

+48
-41
lines changed

1 file changed

+48
-41
lines changed

compiler/tflchef/core/src/ModelChef.cpp

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ class ModelChef
214214

215215
void operand_quant(const tflchef::Operand &operand, QuantParams_t &quant_index);
216216

217+
void operand_sparsity(const tflchef::Operand &operand, SparsityParams_t &sparsity_index);
218+
217219
template <typename T> void cook_operands(const T &graph);
218220

219221
template <typename T> void prepare_tensor_symbols(const T &graph, SymboleTable_t &symbol_table);
@@ -558,6 +560,51 @@ void ModelChef::operand_quant(const tflchef::Operand &operand, QuantParams_t &qu
558560
quant_index = quant_builder.Finish();
559561
}
560562

563+
void ModelChef::operand_sparsity(const tflchef::Operand &operand, SparsityParams_t &sparsity_index)
564+
{
565+
const auto &sparsity = operand.sparsity();
566+
567+
// Create traversal order
568+
std::vector<int> traversal_order_vec{sparsity.traversal_order().dim().begin(),
569+
sparsity.traversal_order().dim().end()};
570+
auto traversal_order = _flatbuffer_builder->CreateVector(traversal_order_vec);
571+
572+
// Create block map
573+
std::vector<int> block_map_vec{sparsity.block_map().dim().begin(),
574+
sparsity.block_map().dim().end()};
575+
auto block_map = _flatbuffer_builder->CreateVector(block_map_vec);
576+
577+
// Create dimension metadata
578+
std::vector<flatbuffers::Offset<tflite::DimensionMetadata>> dim_metadata_vec;
579+
auto recipe_dim_metadata = sparsity.dim_metadata();
580+
for (const auto &dm : recipe_dim_metadata)
581+
{
582+
// Create array segments
583+
auto tflite_array_segments =
584+
as_tflite_sparse_index_vec(*_flatbuffer_builder, dm.array_segments());
585+
586+
// Create array indices
587+
auto tflite_array_indices =
588+
as_tflite_sparse_index_vec(*_flatbuffer_builder, dm.array_indices());
589+
590+
auto tflite_dim_metadata_builder = tflite::DimensionMetadataBuilder{*_flatbuffer_builder};
591+
tflite_dim_metadata_builder.add_format(as_tflite_dimensiontype(dm.format()));
592+
tflite_dim_metadata_builder.add_dense_size(dm.dense_size());
593+
tflite_dim_metadata_builder.add_array_segments(tflite_array_segments);
594+
tflite_dim_metadata_builder.add_array_segments_type(
595+
as_tflite_sparse_idx_vec_type(dm.array_segments().type()));
596+
tflite_dim_metadata_builder.add_array_indices(tflite_array_indices);
597+
tflite_dim_metadata_builder.add_array_indices_type(
598+
as_tflite_sparse_idx_vec_type(dm.array_indices().type()));
599+
auto tflite_dim_metadata = tflite_dim_metadata_builder.Finish();
600+
dim_metadata_vec.emplace_back(tflite_dim_metadata);
601+
}
602+
auto dim_metadata = _flatbuffer_builder->CreateVector(dim_metadata_vec);
603+
604+
sparsity_index = tflite::CreateSparsityParameters(*_flatbuffer_builder, traversal_order,
605+
block_map, dim_metadata);
606+
}
607+
561608
template <typename T> void ModelChef::cook_operands(const T &graph)
562609
{
563610
int32_t buffer_start = _buffer_vec.size();
@@ -653,47 +700,7 @@ template <typename T> void ModelChef::cook_operands(const T &graph)
653700

654701
if (operand.has_sparsity())
655702
{
656-
const auto &sparsity = operand.sparsity();
657-
658-
// Create traversal order
659-
std::vector<int> traversal_order_vec{sparsity.traversal_order().dim().begin(),
660-
sparsity.traversal_order().dim().end()};
661-
auto traversal_order = _flatbuffer_builder->CreateVector(traversal_order_vec);
662-
663-
// Create block map
664-
std::vector<int> block_map_vec{sparsity.block_map().dim().begin(),
665-
sparsity.block_map().dim().end()};
666-
auto block_map = _flatbuffer_builder->CreateVector(block_map_vec);
667-
668-
// Create dimension metadata
669-
std::vector<flatbuffers::Offset<tflite::DimensionMetadata>> dim_metadata_vec;
670-
auto recipe_dim_metadata = sparsity.dim_metadata();
671-
for (const auto &dm : recipe_dim_metadata)
672-
{
673-
// Create array segments
674-
auto tflite_array_segments =
675-
as_tflite_sparse_index_vec(*_flatbuffer_builder, dm.array_segments());
676-
677-
// Create array indices
678-
auto tflite_array_indices =
679-
as_tflite_sparse_index_vec(*_flatbuffer_builder, dm.array_indices());
680-
681-
auto tflite_dim_metadata_builder = tflite::DimensionMetadataBuilder{*_flatbuffer_builder};
682-
tflite_dim_metadata_builder.add_format(as_tflite_dimensiontype(dm.format()));
683-
tflite_dim_metadata_builder.add_dense_size(dm.dense_size());
684-
tflite_dim_metadata_builder.add_array_segments(tflite_array_segments);
685-
tflite_dim_metadata_builder.add_array_segments_type(
686-
as_tflite_sparse_idx_vec_type(dm.array_segments().type()));
687-
tflite_dim_metadata_builder.add_array_indices(tflite_array_indices);
688-
tflite_dim_metadata_builder.add_array_indices_type(
689-
as_tflite_sparse_idx_vec_type(dm.array_indices().type()));
690-
auto tflite_dim_metadata = tflite_dim_metadata_builder.Finish();
691-
dim_metadata_vec.emplace_back(tflite_dim_metadata);
692-
}
693-
auto dim_metadata = _flatbuffer_builder->CreateVector(dim_metadata_vec);
694-
695-
sparsity_index = tflite::CreateSparsityParameters(*_flatbuffer_builder, traversal_order,
696-
block_map, dim_metadata);
703+
operand_sparsity(operand, sparsity_index);
697704
}
698705

699706
flatbuffers::Offset<flatbuffers::Vector<int32_t>> shape_signature;

0 commit comments

Comments
 (0)