MCPcopy Create free account
hub / github.com/DeepRec-AI/DeepRec / Prepare

Function Prepare

tensorflow/lite/kernels/add.cc:75–176  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

73}
74
75TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node) {
76 auto* params = reinterpret_cast<TfLiteAddParams*>(node->builtin_data);
77 OpData* data = reinterpret_cast<OpData*>(node->user_data);
78
79 TF_LITE_ENSURE_EQ(context, NumInputs(node), 2);
80 TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1);
81
82 const TfLiteTensor* input1 = GetInput(context, node, kInputTensor1);
83 const TfLiteTensor* input2 = GetInput(context, node, kInputTensor2);
84 TfLiteTensor* output = GetOutput(context, node, kOutputTensor);
85
86 TF_LITE_ENSURE_EQ(context, input1->type, input2->type);
87 output->type = input2->type;
88
89 data->requires_broadcast = !HaveSameShapes(input1, input2);
90
91 TfLiteIntArray* output_size = nullptr;
92 if (data->requires_broadcast) {
93 TF_LITE_ENSURE_OK(context, CalculateShapeForBroadcast(
94 context, input1, input2, &output_size));
95 } else {
96 output_size = TfLiteIntArrayCopy(input1->dims);
97 }
98
99 if (output->type == kTfLiteUInt8 || output->type == kTfLiteInt8) {
100 // 8bit -> 8bit general quantized path, with general rescalings
101 data->input1_offset = -input1->params.zero_point;
102 data->input2_offset = -input2->params.zero_point;
103 data->output_offset = output->params.zero_point;
104 data->left_shift = 20;
105 const double twice_max_input_scale =
106 2 * std::max(input1->params.scale, input2->params.scale);
107 const double real_input1_multiplier =
108 input1->params.scale / twice_max_input_scale;
109 const double real_input2_multiplier =
110 input2->params.scale / twice_max_input_scale;
111 const double real_output_multiplier =
112 twice_max_input_scale /
113 ((1 << data->left_shift) * output->params.scale);
114
115 QuantizeMultiplierSmallerThanOneExp(
116 real_input1_multiplier, &data->input1_multiplier, &data->input1_shift);
117
118 QuantizeMultiplierSmallerThanOneExp(
119 real_input2_multiplier, &data->input2_multiplier, &data->input2_shift);
120
121 QuantizeMultiplierSmallerThanOneExp(
122 real_output_multiplier, &data->output_multiplier, &data->output_shift);
123
124 if (output->type == kTfLiteUInt8) {
125 CalculateActivationRangeUint8(params->activation, output,
126 &data->output_activation_min,
127 &data->output_activation_max);
128 } else {
129 CalculateActivationRangeInt8(params->activation, output,
130 &data->output_activation_min,
131 &data->output_activation_max);
132 }

Callers

nothing calls this directly

Calls 14

NumInputsFunction · 0.85
GetInputFunction · 0.85
GetOutputFunction · 0.85
HaveSameShapesFunction · 0.85
TfLiteIntArrayCopyFunction · 0.85
CheckedLog2Function · 0.85
ResizeTensorMethod · 0.80

Tested by

no test coverage detected