151 template <
class TFLPool2D>
152 void export_pool_2d(TFLPool2D *node, circle::BuiltinOperator builtin_op);
164 auto inputs = builder.CreateVector(inputs_vec);
165 auto outputs = builder.CreateVector(outputs_vec);
167 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
168 circle::BuiltinOptions_AddOptions,
options.Union());
169 gd._operators.push_back(op_offset);
174 export_pool_2d<locoex::TFLAveragePool2D>(node, circle::BuiltinOperator_AVERAGE_POOL_2D);
179 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_CONCATENATION);
180 std::vector<int32_t> inputs_vec;
183 for (uint32_t i = 0; i < node->
numValues(); ++i)
186 auto inputs = builder.CreateVector(inputs_vec);
187 auto outputs = builder.CreateVector(outputs_vec);
188 auto options = CreateConcatenationOptions(builder, node->
axis(),
190 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
191 circle::BuiltinOptions_ConcatenationOptions,
options.Union());
192 gd._operators.push_back(op_offset);
197 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_CONV_2D);
203 auto inputs = builder.CreateVector(inputs_vec);
204 auto outputs = builder.CreateVector(outputs_vec);
210 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
211 circle::BuiltinOptions_Conv2DOptions,
options.Union());
212 gd._operators.push_back(op_offset);
217 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_DEPTHWISE_CONV_2D);
223 auto inputs = builder.CreateVector(inputs_vec);
224 auto outputs = builder.CreateVector(outputs_vec);
226 auto options = CreateDepthwiseConv2DOptions(builder, padding, node->
stride()->
w(),
231 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
232 circle::BuiltinOptions_DepthwiseConv2DOptions,
options.Union());
233 gd._operators.push_back(op_offset);
238 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_DIV);
241 auto inputs = builder.CreateVector(inputs_vec);
242 auto outputs = builder.CreateVector(outputs_vec);
244 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
245 circle::BuiltinOptions_DivOptions,
options.Union());
246 gd._operators.push_back(op_offset);
251 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_FULLY_CONNECTED);
258 auto inputs = builder.CreateVector(inputs_vec);
259 auto outputs = builder.CreateVector(outputs_vec);
264 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
265 circle::BuiltinOptions_FullyConnectedOptions,
options.Union());
266 gd._operators.push_back(op_offset);
271 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MAXIMUM);
274 auto inputs = builder.CreateVector(inputs_vec);
275 auto outputs = builder.CreateVector(outputs_vec);
276 auto options = CreateMaximumMinimumOptions(builder);
277 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
278 circle::BuiltinOptions_MaximumMinimumOptions,
options.Union());
279 gd._operators.push_back(op_offset);
284 export_pool_2d<locoex::TFLMaxPool2D>(node, circle::BuiltinOperator_MAX_POOL_2D);
289 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MEAN);
293 auto inputs = builder.CreateVector(inputs_vec);
294 auto outputs = builder.CreateVector(outputs_vec);
296 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
297 circle::BuiltinOptions_ReducerOptions,
options.Union());
298 gd._operators.push_back(op_offset);
303 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MUL);
306 auto inputs = builder.CreateVector(inputs_vec);
307 auto outputs = builder.CreateVector(outputs_vec);
309 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
310 circle::BuiltinOptions_MulOptions,
options.Union());
311 gd._operators.push_back(op_offset);
316 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_RELU);
319 auto inputs = builder.CreateVector(inputs_vec);
320 auto outputs = builder.CreateVector(outputs_vec);
321 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
322 gd._operators.push_back(op_offset);
327 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_RELU6);
330 auto inputs = builder.CreateVector(inputs_vec);
331 auto outputs = builder.CreateVector(outputs_vec);
332 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
333 gd._operators.push_back(op_offset);
340 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_RSQRT);
343 auto inputs = builder.CreateVector(inputs_vec);
344 auto outputs = builder.CreateVector(outputs_vec);
345 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
346 gd._operators.push_back(op_offset);
353 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_SQRT);
356 auto inputs = builder.CreateVector(inputs_vec);
357 auto outputs = builder.CreateVector(outputs_vec);
358 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
359 gd._operators.push_back(op_offset);
364 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_SQUARED_DIFFERENCE);
367 auto inputs = builder.CreateVector(inputs_vec);
368 auto outputs = builder.CreateVector(outputs_vec);
369 auto options = CreateSquaredDifferenceOptions(builder);
370 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
371 circle::BuiltinOptions_SquaredDifferenceOptions,
options.Union());
372 gd._operators.push_back(op_offset);
377 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_SUB);
380 auto inputs = builder.CreateVector(inputs_vec);
381 auto outputs = builder.CreateVector(outputs_vec);
383 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
384 circle::BuiltinOptions_SubOptions,
options.Union());
385 gd._operators.push_back(op_offset);
392 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_TRANSPOSE);
396 auto inputs = builder.CreateVector(inputs_vec);
397 auto outputs = builder.CreateVector(outputs_vec);
398 auto options = CreateTransposeOptions(builder);
401 CreateOperator(builder, op_idx, inputs, outputs,
402 circle::BuiltinOptions::BuiltinOptions_TransposeOptions,
options.Union());
403 gd._operators.push_back(op_offset);
408 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_TRANSPOSE_CONV);
415 auto inputs = builder.CreateVector(inputs_vec);
416 auto outputs = builder.CreateVector(outputs_vec);
419 CreateTransposeConvOptions(builder, padding, node->
stride()->
w(), node->
stride()->
h());
422 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
423 circle::BuiltinOptions_TransposeConvOptions,
options.Union());
424 gd._operators.push_back(op_offset);
427template <
class TFLPool2D>
428void OperationExporter::export_pool_2d(TFLPool2D *node, circle::BuiltinOperator builtin_op)
430 EXO_ASSERT(builtin_op == circle::BuiltinOperator_MAX_POOL_2D ||
431 builtin_op == circle::BuiltinOperator_AVERAGE_POOL_2D,
432 "should be maxpool or avgpool");
435 uint32_t op_idx = gd.registerBuiltinOpcode(builtin_op);
438 auto inputs = builder.CreateVector(inputs_vec);
439 auto outputs = builder.CreateVector(outputs_vec);
441 circle::Padding padding =
getOpPadding(node->padding());
443 auto options = CreatePool2DOptions(builder, padding, node->stride()->w(), node->stride()->h(),
444 node->filter()->w(), node->filter()->h(),
446 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
447 circle::BuiltinOptions_Pool2DOptions,
options.Union());
448 gd._operators.push_back(op_offset);
453 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_INSTANCE_NORM);
457 auto inputs = builder.CreateVector(inputs_vec);
458 auto outputs = builder.CreateVector(outputs_vec);
459 auto options = CreateInstanceNormOptions(builder, node->
epsilon(),
461 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
462 circle::BuiltinOptions_InstanceNormOptions,
options.Union());
463 gd._operators.push_back(op_offset);
466void OperationExporter::visit(
loco::ReLU *node)
468 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_RELU);
471 auto inputs = builder.CreateVector(inputs_vec);
472 auto outputs = builder.CreateVector(outputs_vec);
473 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
474 gd._operators.push_back(op_offset);
479 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_RELU6);
482 auto inputs = builder.CreateVector(inputs_vec);
483 auto outputs = builder.CreateVector(outputs_vec);
484 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
485 gd._operators.push_back(op_offset);
488void OperationExporter::visit(
loco::Tanh *node)
490 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_TANH);
493 auto inputs = builder.CreateVector(inputs_vec);
494 auto outputs = builder.CreateVector(outputs_vec);
495 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
496 gd._operators.push_back(op_offset);
501 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MAX_POOL_2D);
504 auto inputs = builder.CreateVector(inputs_vec);
505 auto outputs = builder.CreateVector(outputs_vec);
511 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
512 circle::BuiltinOptions_Pool2DOptions,
options.Union());
513 gd._operators.push_back(op_offset);
521 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_AVERAGE_POOL_2D);
524 auto inputs = builder.CreateVector(inputs_vec);
525 auto outputs = builder.CreateVector(outputs_vec);
531 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
532 circle::BuiltinOptions_Pool2DOptions,
options.Union());
533 gd._operators.push_back(op_offset);
538 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_CONV_2D);
547 auto bias_vec_shape_offset = builder.CreateVector(std::vector<int32_t>{bias_vec_size});
548 size_t raw_bias_vec_size = bias_vec_size *
sizeof(int32_t);
550 std::vector<float> bias_vec_data(bias_vec_size);
552 auto bias_vec_offset =
553 builder.CreateVector(
reinterpret_cast<uint8_t *
>(bias_vec_data.data()), raw_bias_vec_size);
555 auto bias_buffer_offset = CreateBuffer(builder, bias_vec_offset);
557 const auto bias_buffer_id =
static_cast<uint32_t
>(gd._buffers.size());
559 gd._buffers.push_back(bias_buffer_offset);
561 auto bias_tensor_id =
static_cast<int32_t
>(gd._tensors.size());
562 auto name_offset = builder.CreateString(
"t_" + std::to_string(bias_tensor_id));
564 auto bias_tensor_offset =
565 CreateTensor(builder, bias_vec_shape_offset, TensorType_FLOAT32, bias_buffer_id, name_offset);
566 gd._tensors.push_back(bias_tensor_offset);
572 auto inputs = builder.CreateVector(inputs_vec);
573 auto outputs = builder.CreateVector(outputs_vec);
580 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
581 circle::BuiltinOptions_Conv2DOptions,
options.Union());
582 gd._operators.push_back(op_offset);
587 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_TRANSPOSE_CONV);
590 const int32_t outshape_vec_size = 4;
591 auto outshape_vec_shape_offset = builder.CreateVector(std::vector<int32_t>{outshape_vec_size});
592 size_t raw_outshape_vec_size = outshape_vec_size *
sizeof(int32_t);
594 std::vector<int32_t> outshape_vec_data(outshape_vec_size);
600 outshape_vec_data.at(0) = out_feature_shape.
count().
value();
601 outshape_vec_data.at(1) = out_feature_shape.height().value();
602 outshape_vec_data.at(2) = out_feature_shape.width().value();
603 outshape_vec_data.at(3) = out_feature_shape.depth().value();
606 auto outshape_vec_offset = builder.CreateVector(
607 reinterpret_cast<uint8_t *
>(outshape_vec_data.data()), raw_outshape_vec_size);
609 auto outshape_buffer_offset = CreateBuffer(builder, outshape_vec_offset);
611 const auto outshape_buffer_id =
static_cast<uint32_t
>(gd._buffers.size());
613 gd._buffers.push_back(outshape_buffer_offset);
615 auto outshape_tensor_id =
static_cast<int32_t
>(gd._tensors.size());
616 auto name_offset = builder.CreateString(
"t_" + std::to_string(outshape_tensor_id));
618 auto outshape_tensor_offset = CreateTensor(builder, outshape_vec_shape_offset, TensorType_INT32,
619 outshape_buffer_id, name_offset);
620 gd._tensors.push_back(outshape_tensor_offset);
626 auto inputs = builder.CreateVector(inputs_vec);
627 auto outputs = builder.CreateVector(outputs_vec);
635 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
636 circle::BuiltinOptions_TransposeConvOptions,
options.Union());
637 gd._operators.push_back(op_offset);
642 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_DEPTHWISE_CONV_2D);
651 auto bias_vec_shape_offset = builder.CreateVector(std::vector<int32_t>{bias_vec_size});
653 size_t raw_bias_vec_size = bias_vec_size *
sizeof(int32_t);
654 std::vector<float> bias_vec_data(bias_vec_size);
655 auto bias_vec_offset =
656 builder.CreateVector(
reinterpret_cast<uint8_t *
>(bias_vec_data.data()), raw_bias_vec_size);
658 auto bias_buffer_offset = CreateBuffer(builder, bias_vec_offset);
660 const auto bias_buffer_id =
static_cast<uint32_t
>(gd._buffers.size());
662 gd._buffers.push_back(bias_buffer_offset);
664 auto bias_tensor_id =
static_cast<int32_t
>(gd._tensors.size());
665 auto name_offset = builder.CreateString(
"t_" + std::to_string(bias_tensor_id));
667 auto bias_tensor_offset =
668 CreateTensor(builder, bias_vec_shape_offset, TensorType_FLOAT32, bias_buffer_id, name_offset);
669 gd._tensors.push_back(bias_tensor_offset);
674 auto inputs = builder.CreateVector(inputs_vec);
675 auto outputs = builder.CreateVector(outputs_vec);
682 CreateDepthwiseConv2DOptions(builder, padding, node->
stride()->
horizontal(),
685 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
686 circle::BuiltinOptions_DepthwiseConv2DOptions,
options.Union());
687 gd._operators.push_back(op_offset);
694 switch (node->
func())
697 op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MEAN);
706 std::vector<int32_t> axes_vec;
708 for (uint32_t i = 0; i < rank; ++i)
710 axes_vec.push_back(i);
712 int32_t axes_vec_size = axes_vec.size();
713 auto axes_vec_shape_offset = builder.CreateVector(std::vector<int32_t>{axes_vec_size});
715 size_t raw_axes_vec_size = axes_vec_size *
sizeof(int32_t);
716 auto axes_vec_offset =
717 builder.CreateVector(
reinterpret_cast<uint8_t *
>(axes_vec.data()), raw_axes_vec_size);
719 auto axes_buffer_offset = CreateBuffer(builder, axes_vec_offset);
721 const auto axes_buffer_id =
static_cast<uint32_t
>(gd._buffers.size());
723 gd._buffers.push_back(axes_buffer_offset);
725 auto axes_tensor_id =
static_cast<int32_t
>(gd._tensors.size());
726 auto name_offset = builder.CreateString(
"t_" + std::to_string(axes_tensor_id));
728 auto axes_tensor_offset =
729 CreateTensor(builder, axes_vec_shape_offset, TensorType_INT32, axes_buffer_id, name_offset);
730 gd._tensors.push_back(axes_tensor_offset);
734 auto inputs = builder.CreateVector(inputs_vec);
735 auto outputs = builder.CreateVector(outputs_vec);
736 auto options = CreateReducerOptions(builder,
true);
737 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
738 circle::BuiltinOptions_ReducerOptions,
options.Union());
739 gd._operators.push_back(op_offset);
750 uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_SOFTMAX);
753 auto inputs = builder.CreateVector(inputs_vec);
754 auto outputs = builder.CreateVector(outputs_vec);
755 auto options = CreateSoftmaxOptions(builder, 1.0f);
756 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
757 circle::BuiltinOptions_SoftmaxOptions,
options.Union());
758 gd._operators.push_back(op_offset);
762template <
typename NodeT>
770 auto options = CreateConcatenationOptions(builder);
771 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
772 circle::BuiltinOptions_ConcatenationOptions,
options.Union());
783 auto options = CreateTransposeOptions(builder);
786 constexpr int perm_vec_size = 4;
787 assert(perm_vec_data.size() == perm_vec_size);
788 auto perm_vec_shape_offset = builder.
CreateVector(std::vector<int32_t>{perm_vec_size});
789 constexpr size_t raw_perm_vec_size = perm_vec_size *
sizeof(int32_t);
791 auto perm_vec_offset =
792 builder.
CreateVector(
reinterpret_cast<uint8_t *
>(perm_vec_data.data()), raw_perm_vec_size);
794 auto perm_buffer_offset = CreateBuffer(builder, perm_vec_offset);
796 const auto perm_buffer_id =
static_cast<uint32_t
>(gd.
_buffers.size());
798 gd.
_buffers.push_back(perm_buffer_offset);
800 auto perm_tensor_id =
static_cast<int32_t
>(gd.
_tensors.size());
801 auto name_offset = builder.
CreateString(
"t_" + std::to_string(perm_tensor_id));
803 auto perm_tensor_offset =
804 CreateTensor(builder, perm_vec_shape_offset, TensorType_INT32, perm_buffer_id, name_offset);
805 gd.
_tensors.push_back(perm_tensor_offset);
815 constexpr auto options_type = circle::BuiltinOptions::BuiltinOptions_TransposeOptions;
817 auto transpose_offset =
818 CreateOperator(builder, op_idx, inputs, outputs, options_type,
options.Union());
825 auto perm = encoder->perm();
830 exportIdentity(node, builder, gd);
834 std::vector<int32_t> perm_vec_data(4);
840 exportAsTranspose(node, builder, perm_vec_data, gd);
847 auto perm = decoder->perm();
852 exportIdentity(node, builder, gd);
856 std::vector<int32_t> perm_vec_data(4);
862 exportAsTranspose(node, builder, perm_vec_data, gd);
869 auto perm = encoder->perm();
874 exportIdentity(node, builder, gd);
878 std::vector<int32_t> perm_vec_data(4);
885 exportAsTranspose(node, builder, perm_vec_data, gd);
903 auto input_shape_shape_vec_offset =
904 builder.
CreateVector(std::vector<int32_t>{(int32_t)new_shape_vec.size()});
906 size_t input_shape_vec_size = new_shape_vec.size() *
sizeof(int32_t);
907 auto input_shape_input_vec_offset =
908 builder.
CreateVector(
reinterpret_cast<uint8_t *
>(new_shape_vec.data()), input_shape_vec_size);
909 auto input_shape_buffer_offset = CreateBuffer(builder, input_shape_input_vec_offset);
911 const auto input_shape_buffer_id =
static_cast<uint32_t
>(gd.
_buffers.size());
912 gd.
_buffers.push_back(input_shape_buffer_offset);
914 auto input_shape_tensor_id =
static_cast<int32_t
>(gd.
_tensors.size());
915 auto name_offset = builder.
CreateString(
"t_" + std::to_string(input_shape_tensor_id));
916 auto input_shape_tensor_offset = CreateTensor(
917 builder, input_shape_shape_vec_offset, TensorType_INT32, input_shape_buffer_id, name_offset);
918 gd.
_tensors.push_back(input_shape_tensor_offset);
927 auto new_shape_vec_offset = builder.
CreateVector(new_shape_vec);
928 auto options = CreateReshapeOptions(builder, new_shape_vec_offset);
930 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
931 circle::BuiltinOptions_ReshapeOptions,
options.Union());
938 auto ker = node->
input();
941 std::vector<int32_t> new_shape_vec(4);
942 new_shape_vec[0] = 1;
947 exportAsReshape(node, builder, new_shape_vec, gd);
957 auto options = CreateAddOptions(builder);
958 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
959 circle::BuiltinOptions_AddOptions,
options.Union());
970 auto options = CreateAddOptions(builder);
971 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
972 circle::BuiltinOptions_AddOptions,
options.Union());
984 auto options = CreateConcatenationOptions(builder, node->
axis());
985 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
986 circle::BuiltinOptions_ConcatenationOptions,
options.Union());
991void OperationExporter::visit(
loco::BiasEncode *encode) { exportIdentity(encode, builder, gd); }
1000 auto options = CreateAddOptions(builder);
1001 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
1002 circle::BuiltinOptions_AddOptions,
options.Union());
1013 auto options = CreateMaximumMinimumOptions(builder);
1014 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
1015 circle::BuiltinOptions_MaximumMinimumOptions,
options.Union());
1026 auto options = CreateMulOptions(builder);
1027 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
1028 circle::BuiltinOptions_MulOptions,
options.Union());
1039 auto options = CreateSubOptions(builder);
1040 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
1041 circle::BuiltinOptions_SubOptions,
options.Union());
1052 auto options = CreateDivOptions(builder);
1053 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
1054 circle::BuiltinOptions_DivOptions,
options.Union());
1065 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
1071 std::vector<int32_t> new_shape_vec;
1072 for (uint32_t axis = 0; axis < node->rank(); ++axis)
1074 assert(node->dim(axis).known());
1075 new_shape_vec.push_back(node->dim(axis).value());
1078 exportAsReshape(node, builder, new_shape_vec, gd);
1083 INTERNAL_EXN(
"loco graph has loco::TensorBroadcast, which should not exist in the graph");
1091 auto padding = node->
padding();
1093 int32_t padding_vec_size = padding->
rank();
1095 size_t padding_vec_byte_size = padding_vec_size *
sizeof(int32_t) * 2;
1097 std::vector<int32_t> padding_vec_data(padding_vec_size * 2);
1099 for (int32_t i = 0; i < padding_vec_size; i++)
1101 padding_vec_data.at(i * 2) = padding->front(i);
1102 padding_vec_data.at(i * 2 + 1) = padding->back(i);
1105 auto padding_vec_ptr = builder.
CreateVector(
reinterpret_cast<uint8_t *
>(padding_vec_data.data()),
1106 padding_vec_byte_size);
1109 auto padding_buffer_ptr = CreateBuffer(builder, padding_vec_ptr);
1111 const auto padding_buffer_id =
static_cast<uint32_t
>(gd.
_buffers.size());
1113 gd.
_buffers.push_back(padding_buffer_ptr);
1116 auto padding_shape_vec_ptr = builder.
CreateVector(std::vector<int32_t>{padding_vec_size, 2});
1118 auto padding_tensor_ptr =
1119 CreateTensor(builder, padding_shape_vec_ptr, TensorType_INT32, padding_buffer_id);
1121 const auto padding_tensor_id =
static_cast<int32_t
>(gd.
_tensors.size());
1123 gd.
_tensors.push_back(padding_tensor_ptr);
1129 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs);
1137 flexbuffers::Builder flexbuf;
1139 size_t map_start = flexbuf.StartMap();
1143 for (
auto name : names)
1146 flexbuf.Int(
name.c_str(), int_val->val());
1148 flexbuf.Float(
name.c_str(), float_val->val());
1151 INTERNAL_EXN_V(
"Unsupported dtype while writing flexbuffer for customop attr", name);
1154 flexbuf.EndMap(map_start);
1168 std::vector<int32_t> inputs_vec;
1170 inputs_vec.resize(call->
arity());
1171 for (uint32_t i = 0; i < call->
arity(); i++)
1180 auto custom_options = CreateCOpCallOptions(builder, call);
1181 auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
1182 circle::BuiltinOptions_NONE,
1185 circle::CustomOptionsFormat_FLEXBUFFERS);
1195 if (node->
arity() == 1)
1197 assert(node->
arg(0) !=
nullptr);
1211 OperationExporter exporter{builder,
data};
1212 canonical_node->accept(&exporter);
1216 OperationExporter exporter{builder,
data};
1217 tfl_node->accept(&exporter);
1221 OperationExporter exporter{builder,
data};
1222 circle_node->accept(&exporter);
1226 OperationExporter exporter{builder,
data};
1239namespace circle_detail
1246 exportNode(node, builder, gd);
#define INTERNAL_EXN(msg)
@ brief throw internal exception with message
#define INTERNAL_EXN_V(msg, val)
@ brief throw internal exception with message and value
Helper class to hold data needed in creation of a FlatBuffer. To serialize data, you typically call o...
Offset< String > CreateString(const char *str, size_t len)
Store a string in the buffer, which can contain any binary data.
Offset< Vector< T > > CreateVector(const T *v, size_t len)
Serialize an array into a FlatBuffer vector.
Convention convention(void) const
const Stride< 2 > * stride(void) const
const Padding2D * pad(void) const
const Window< 2 > * window(void) const
Add Feature and Bias along "depth" axis.
Produce a value of domain D from an input value (of domain D) and a bias.
Create a "Tensor" from a "Bias".
Create a "Bias" from a "Tensor".
Create a value from constant byte array.
const Stride< 2 > * stride(void) const
const Padding2D * pad(void) const
Depthwise 2D Convolution.
const Stride< 2 > * stride(void) const
const Padding2D * pad(void) const
Create a tensor from a depthwise filter.
Create a depthwise filter from a tensor.
uint32_t value(void) const
Return the value.
Elementwise Add lhs and rhs.
Elementwise Div lhs and rhs.
Elementwise Maximum of lhs and rhs.
Elementwise Mul lhs and rhs.
Elementwise Sqrt of input.
Elementwise Sub lhs and rhs.
Create a tensor from a feature map.
FeatureDecoder * decoder(void) const
Create a feature map from a tensor.
FeatureEncoder * encoder(void) const
const Dimension & count(void) const
Create a tensor from a filter.
Create a filter from a tensor.
FilterEncoder * encoder(void) const
Create a new value identical to its input.
Matrix Multiplication lhs and rhs.
Create Tensor from Matrix.
Create Matrix from Tensor.
const Padding2D * pad(void) const
const Stride< 2 > * stride(void) const
const Window< 2 > * window(void) const
Logical unit of computation.
virtual Node * arg(uint32_t N) const =0
Access N-th argument node.
virtual uint32_t arity(void) const =0
Return the number of arguments.
uint32_t rank(void) const
Create a value from user data.
Make a value visible to user.
Create a new value that rectifies its input capping the units at 6.
Create a new value that rectifies its input.
Reshape a tensor to another tensor whose shape is known at compile time.
Computes softmax activations for Tensor domain.
uint32_t axis(void) const
uint32_t horizontal(void) const
uint32_t vertical(void) const
Create a new value that rectifies its input by tanh.
bool defined(const TensorAxis &axis) const
Duplicate elements along specified axes.
uint32_t axis(void) const
Pads a tensor with constant value.
const PaddingND * padding(void) const
Computes ReduceFunc operations for Tensor domain.
ReduceFunc func(void) const
const TensorAxisSet * axes(void) const
2D Transposed Convolution
const Stride< 2 > * stride(void) const
const Padding2D * pad(void) const
uint32_t horizontal(void) const
uint32_t vertical(void) const
Class to calls custom operation.
std::vector< std::string > attr_names() const
get all the names of attr
void op(const std::string &op)
void attr(const std::string &attr_name, std::unique_ptr< COpAttrData > &&attr_data)
Store [attr_name, attr_data].
loco::Node * input(void) const
loco::Node * gamma(void) const
loco::Node * beta(void) const
FusedActFunc fusedActivationFunction() const
loco::Node * arg(uint32_t n) const final
loco::Node * y(void) const
loco::Node * x(void) const
AVERAGE_POOL_2D in TensorFlow Lite.
CONCATENATION in TensorFlow Lite.
uint32_t axis(void) const
Node * values(uint32_t index) const
uint32_t numValues(void) const
Class to build tensor data.
CONV_2D in TensorFlow Lite.
loco::Node * filter(void) const
const Stride * stride(void) const
loco::Node * bias(void) const override
loco::Node * input(void) const
DEPTHWISE_CONV_2D in TensorFlow Lite.
loco::Node * filter(void) const
loco::Node * input(void) const
int32_t depthMultiplier(void) const
const Stride * stride(void) const
loco::Node * bias(void) const override
loco::Node * x(void) const
loco::Node * y(void) const
FULLY_CONNECTED in TensorFlow Lite.
loco::Node * bias(void) const override
loco::Node * weights(void) const
loco::Node * input(void) const
MAX_POOL_2D in TensorFlow Lite.
MAXIMUM in TensorFlow Lite.
loco::Node * x(void) const
loco::Node * y(void) const
loco::Node * input(void) const
bool keep_dims(void) const
loco::Node * reduction_indices(void) const
loco::Node * y(void) const
loco::Node * x(void) const
FusedActFunc fusedActivationFunction() const
loco::Node * features(void) const
loco::Node * features(void) const
loco::Node * x(void) const
loco::Node * x(void) const
loco::Node * x(void) const
loco::Node * y(void) const
loco::Node * y(void) const
loco::Node * x(void) const
TRANSPOSE_CONV in TensorFlow Lite.
const Stride * stride(void) const
const Padding & padding(void) const
loco::Node * filter(void) const
loco::Node * inputSizes(void) const
loco::Node * outBackprop(void) const
TRANSPOSE in TensorFlow Lite.
loco::Node * arg(uint32_t n) const final
uint32_t arity(void) const final
#define EXO_ASSERT(condition, msg)
__global uchar * offset(const Image *img, int x, int y)
circle::Padding getOpPadding(const loco::Padding2D *pad, const loco::Stride< 2 > *stride, const ShapeDescription &ifm, const ShapeDescription &ofm)
TFLTensorIndex get_tensor_index(loco::Node *node)
circle::ActivationFunctionType to_circle_actfunc(locoex::FusedActFunc func)
bool isNHWC(Permutation *perm)
const T * data(const std::vector< T, Alloc > &v)
std::vector< loco::Node * > postorder_traversal(const std::vector< loco::Node * > &roots)
Generate postorder traversal sequence starting from "roots".
std::vector< Node * > output_nodes(Graph *)
NodeShape shape_get(const Node *node)
std::vector< int32_t > _dims
static ShapeDescription get(loco::Node *node)
uint32_t registerBuiltinOpcode(circle::BuiltinOperator builtin_code)
if opcode is not registered in table of opcodes add it
std::vector< flatbuffers::Offset< circle::Tensor > > _tensors
std::vector< flatbuffers::Offset< circle::Operator > > _operators
std::vector< flatbuffers::Offset< circle::Buffer > > _buffers
uint32_t registerCustomOpcode(const std::string &custom_op)
virtual T visit(TFLNode *)
Default fallback.