95 std::vector<flatbuffers::Offset<circle::SubGraph>> subgprahs_vec;
97 int32_t subgraph_index = 0;
99 for (
auto it_sg : *tflite_flatbuffer_vec)
102 std::vector<flatbuffers::Offset<circle::Tensor>> tensor_vec;
104 auto tflite_tensors = it_sg->tensors();
105 for (
auto it : *tflite_tensors)
111 auto shape_vec = std::vector<int32_t>({it->shape()->
begin(), it->shape()->end()});
112 shape = _fb->CreateVector(shape_vec);
117 name = _fb->CreateString(it->name()->str());
120 if (it->quantization())
122 std::vector<float> tfmin;
123 std::vector<float> tfmax;
124 std::vector<float> tfscale;
125 std::vector<int64_t> tfzerop;
130 int32_t quantized_dimension = it->quantization()->quantized_dimension();
132 if (it->quantization()->min() && it->quantization()->max())
134 auto rmin = it->quantization()->min();
135 auto rmax = it->quantization()->max();
136 tfmin = std::vector<float>{rmin->begin(), rmin->end()};
137 tfmax = std::vector<float>{rmax->begin(), rmax->end()};
138 min = _fb->CreateVector(tfmin);
139 max = _fb->CreateVector(tfmax);
142 if (it->quantization()->scale() && it->quantization()->zero_point())
144 auto rs = it->quantization()->scale();
145 auto rz = it->quantization()->zero_point();
146 tfscale = std::vector<float>{rs->begin(), rs->end()};
147 tfzerop = std::vector<int64_t>{rz->begin(), rz->end()};
148 scale = _fb->CreateVector(tfscale);
149 zero_point = _fb->CreateVector(tfzerop);
152 quantization = circle::CreateQuantizationParameters(*_fb, min, max, scale, zero_point,
153 circle::QuantizationDetails_NONE, 0,
154 quantized_dimension);
157 bool is_variable = it->is_variable();
169 if (it->sparsity()->traversal_order())
171 auto traversal_order_vec = std::vector<int32_t>{
172 it->sparsity()->traversal_order()->begin(), it->sparsity()->traversal_order()->end()};
173 traversal_order = _fb->CreateVector(traversal_order_vec);
177 if (it->sparsity()->block_map())
179 auto block_map_vec = std::vector<int32_t>{it->sparsity()->block_map()->begin(),
180 it->sparsity()->block_map()->end()};
181 block_map = _fb->CreateVector(block_map_vec);
185 std::vector<flatbuffers::Offset<circle::DimensionMetadata>> dim_metadata_vec;
186 auto tflite_dim_metadata = it->sparsity()->dim_metadata();
187 for (
auto it : *tflite_dim_metadata)
190 auto tflite_array_segments_type = it->array_segments_type();
191 auto circle_array_segments =
193 auto circle_array_segments_type =
197 auto tflite_array_indices_type = it->array_indices_type();
198 auto circle_array_indices =
200 auto circle_array_indices_type =
203 auto circle_dim_metadata_builder = circle::DimensionMetadataBuilder{*_fb};
206 circle_dim_metadata_builder.add_dense_size(it->dense_size());
207 circle_dim_metadata_builder.add_array_segments(circle_array_segments);
208 circle_dim_metadata_builder.add_array_segments_type(circle_array_segments_type);
209 circle_dim_metadata_builder.add_array_indices(circle_array_indices);
210 circle_dim_metadata_builder.add_array_indices_type(circle_array_indices_type);
211 auto dim_metadata = circle_dim_metadata_builder.Finish();
212 dim_metadata_vec.emplace_back(dim_metadata);
214 dim_metadata = _fb->CreateVector(dim_metadata_vec);
216 sparsity = circle::CreateSparsityParameters(*_fb, traversal_order, block_map, dim_metadata);
221 if (it->shape_signature())
223 auto shape_signature_vec =
224 std::vector<int32_t>({it->shape_signature()->
begin(), it->shape_signature()->end()});
225 shape_signature = _fb->CreateVector(shape_signature_vec);
228 circle::TensorBuilder tensor_builder{*_fb};
229 tensor_builder.add_shape(shape);
231 tensor_builder.add_buffer(it->buffer());
232 tensor_builder.add_name(name);
233 tensor_builder.add_quantization(quantization);
234 tensor_builder.add_is_variable(is_variable);
235 tensor_builder.add_sparsity(
sparsity);
236 tensor_builder.add_shape_signature(shape_signature);
237 auto tensor = tensor_builder.Finish();
238 tensor_vec.emplace_back(tensor);
240 auto circle_tensors = _fb->CreateVector(tensor_vec);
243 auto tflite_inputs = it_sg->inputs();
244 std::vector<int32_t> input_vec{tflite_inputs->begin(), tflite_inputs->end()};
249 if (_tfl_signature_def_offsets !=
nullptr)
251 for (
auto it_signdef : *_tfl_signature_def_offsets)
253 if (it_signdef->subgraph_index() == subgraph_index)
255 auto inputs = it_signdef->inputs();
256 assert(inputs->size() == input_vec.size());
258 std::map<std::string, uint32_t> map_name_index;
259 for (
auto it_tm : *inputs)
261 map_name_index[it_tm->name()->str()] = it_tm->tensor_index();
263 uint32_t input_vec_idx = 0;
264 for (
auto &item : map_name_index)
266 input_vec[input_vec_idx++] = item.second;
272 auto circle_inputs = _fb->CreateVector(input_vec);
275 auto tflite_outputs = it_sg->outputs();
276 std::vector<int32_t> output_vec{tflite_outputs->begin(), tflite_outputs->end()};
278 if (_tfl_signature_def_offsets !=
nullptr)
281 for (
auto it_signdef : *_tfl_signature_def_offsets)
283 if (it_signdef->subgraph_index() == subgraph_index)
285 auto outputs = it_signdef->outputs();
286 assert(outputs->size() == output_vec.size());
288 std::map<std::string, uint32_t> map_name_index;
289 for (
auto it_tm : *outputs)
291 map_name_index[it_tm->name()->str()] = it_tm->tensor_index();
293 uint32_t output_vec_idx = 0;
294 for (
auto &item : map_name_index)
296 output_vec[output_vec_idx++] = item.second;
302 auto circle_outputs = _fb->CreateVector(output_vec);
305 std::vector<flatbuffers::Offset<circle::Operator>> operator_vec;
307 auto tflite_operators = it_sg->operators();
308 if (tflite_operators !=
nullptr)
310 for (
auto it : *tflite_operators)
313 std::vector<int32_t> input_vec{it->inputs()->begin(), it->inputs()->end()};
314 auto circle_inputs = _fb->CreateVector(input_vec);
316 std::vector<int32_t> output_vec{it->outputs()->begin(), it->outputs()->end()};
317 auto circle_outputs = _fb->CreateVector(output_vec);
323 if (it->custom_options())
325 std::vector<uint8_t> custom_options_vec{it->custom_options()->begin(),
326 it->custom_options()->end()};
327 circle_custom_options = _fb->CreateVector(custom_options_vec);
331 assert(it->custom_options_format() == tflite::CustomOptionsFormat_FLEXBUFFERS);
332 auto circle_custom_options_format = circle::CustomOptionsFormat_FLEXBUFFERS;
334 circle::OperatorBuilder operator_builder{*_fb};
335 operator_builder.add_opcode_index(it->opcode_index());
336 operator_builder.add_inputs(circle_inputs);
337 operator_builder.add_outputs(circle_outputs);
338 operator_builder.add_builtin_options(circle_builtin_options);
339 operator_builder.add_builtin_options_type(circle_builtin_options_type);
340 operator_builder.add_custom_options(circle_custom_options);
341 operator_builder.add_custom_options_format(circle_custom_options_format);
343 auto opeartor = operator_builder.Finish();
344 operator_vec.emplace_back(opeartor);
347 auto circle_operators = _fb->CreateVector(operator_vec);
350 auto subgraphs_name = _fb->CreateString(it_sg->name());
353 auto circle_subgraph_builder = circle::SubGraphBuilder{*_fb};
355 circle_subgraph_builder.add_tensors(circle_tensors);
356 circle_subgraph_builder.add_inputs(circle_inputs);
357 circle_subgraph_builder.add_outputs(circle_outputs);
358 circle_subgraph_builder.add_operators(circle_operators);
359 circle_subgraph_builder.add_name(subgraphs_name);
361 auto circle_subgraph = circle_subgraph_builder.Finish();
362 subgprahs_vec.emplace_back(circle_subgraph);
365 subgraph_index = subgraph_index + 1;
367 _circle_flatbuffer_vec_offset = _fb->CreateVector(subgprahs_vec);