@@ -214,6 +214,8 @@ class ModelChef
214
214
215
215
void operand_quant (const tflchef::Operand &operand, QuantParams_t &quant_index);
216
216
217
+ void operand_sparsity (const tflchef::Operand &operand, SparsityParams_t &sparsity_index);
218
+
217
219
template <typename T> void cook_operands (const T &graph);
218
220
219
221
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
558
560
quant_index = quant_builder.Finish ();
559
561
}
560
562
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
+
561
608
template <typename T> void ModelChef::cook_operands (const T &graph)
562
609
{
563
610
int32_t buffer_start = _buffer_vec.size ();
@@ -653,47 +700,7 @@ template <typename T> void ModelChef::cook_operands(const T &graph)
653
700
654
701
if (operand.has_sparsity ())
655
702
{
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);
697
704
}
698
705
699
706
flatbuffers::Offset<flatbuffers::Vector<int32_t >> shape_signature;
0 commit comments