29 const circle::Tensor *filter,
const circle::Tensor *output,
30 circle::ActivationFunctionType act_type)
32 assert(input->quantization() !=
nullptr);
33 assert(filter->quantization() !=
nullptr);
34 assert(output->quantization() !=
nullptr);
36 const auto *input_scales = input->quantization()->scale();
37 const auto *filter_scales = filter->quantization()->scale();
38 const auto *output_scales = output->quantization()->scale();
40 assert(input_scales !=
nullptr);
41 assert(filter_scales !=
nullptr);
42 assert(output_scales !=
nullptr);
44 assert(input_scales->size() != 0);
45 assert(filter_scales->size() != 0);
46 assert(output_scales->size() != 0);
48 const auto input_zero_points = input->quantization()->zero_point();
49 const auto filter_zero_points = filter->quantization()->zero_point();
50 const auto output_zero_points = output->quantization()->zero_point();
52 assert(input_zero_points !=
nullptr);
53 assert(filter_zero_points !=
nullptr);
54 assert(output_zero_points !=
nullptr);
56 assert(input_zero_points->size() != 0);
57 assert(filter_zero_points->size() != 0);
58 assert(output_zero_points->size() != 0);
60 const auto input_zp = input_zero_points->operator[](0);
61 const auto filter_zp = filter_zero_points->operator[](0);
62 const auto output_zp = output_zero_points->operator[](0);
64 const auto output_scale = output_scales->operator[](0);
66 int32_t activation_min{};
67 int32_t activation_max{};
69 act_type,
static_cast<int32_t
>(output_zp), output_scale, output->type(), &activation_min,
82 assert(filter_scales->size() > 1);
84 const auto input_scale = input_scales->operator[](0);
85 const std::vector<double> effective_output_scale =
88 size_t n = effective_output_scale.size();
91 for (
size_t i = 0; i < n; ++i)
OMStatus calculateActivationRangeQuantized(circle::ActivationFunctionType activation, int32_t output_zero_point, float output_scale, circle::TensorType data_type, int32_t *activation_min, int32_t *activation_max)