10b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
20b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
30b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleLicensed under the Apache License, Version 2.0 (the "License");
40b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleyou may not use this file except in compliance with the License.
50b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleYou may obtain a copy of the License at
60b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
70b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    http://www.apache.org/licenses/LICENSE-2.0
80b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
90b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleUnless required by applicable law or agreed to in writing, software
100b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selledistributed under the License is distributed on an "AS IS" BASIS,
110b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleSee the License for the specific language governing permissions and
130b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellelimitations under the License.
140b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle==============================================================================*/
150b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <algorithm>
160b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <cmath>
170b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <limits>
180b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
190b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/kernels/internal/compatibility.h"
200b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/kernels/internal/quantization_util.h"
210b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/kernels/internal/round.h"
220b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
230b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellenamespace tflite {
240b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
250255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlowervoid QuantizeMultiplier(double double_multiplier, int32_t* quantized_multiplier,
260255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower                        int* shift) {
270b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  if (double_multiplier == 0.) {
280b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    *quantized_multiplier = 0;
290255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower    *shift = 0;
300b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    return;
310b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
320255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  const double q = std::frexp(double_multiplier, shift);
330b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  auto q_fixed = static_cast<int64_t>(TfLiteRound(q * (1ll << 31)));
340b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TFLITE_CHECK(q_fixed <= (1ll << 31));
350b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  if (q_fixed == (1ll << 31)) {
360b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle    q_fixed /= 2;
370255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower    ++*shift;
380b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  }
390b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TFLITE_CHECK_LE(q_fixed, std::numeric_limits<int32_t>::max());
400b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  *quantized_multiplier = static_cast<int32_t>(q_fixed);
410b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
420b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
430b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellevoid QuantizeMultiplierGreaterThanOne(double double_multiplier,
440b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                                      int32_t* quantized_multiplier,
450b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                                      int* left_shift) {
460255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  TFLITE_CHECK_GT(double_multiplier, 1.);
470255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  QuantizeMultiplier(double_multiplier, quantized_multiplier, left_shift);
480b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  TFLITE_CHECK_GE(*left_shift, 0);
490255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower}
500255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower
510255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlowervoid QuantizeMultiplierSmallerThanOne(double double_multiplier,
520255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower                                      int32_t* quantized_multiplier,
530255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower                                      int* right_shift) {
540255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  TFLITE_CHECK_LT(double_multiplier, 1.);
550255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  TFLITE_CHECK_GT(double_multiplier, 0.);
560255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  int shift;
570255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  QuantizeMultiplier(double_multiplier, quantized_multiplier, &shift);
580255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  TFLITE_CHECK_LE(shift, 0);
590255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower  *right_shift = -shift;
600b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
610b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
620b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellevoid PreprocessSoftmaxScaling(double beta, double input_scale,
630b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                              int input_integer_bits,
640b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                              int32_t* quantized_multiplier, int* left_shift) {
650b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // If the overall multiplier (input and beta) is large, then exp() of an
660b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // input difference of 1 scaled by this will be large.  In other words, we
670b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // can cap the multiplier and know that, when it is used, the output will be
680b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // (round to) zero wherever the input is not at the maximum value.
690b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
700b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // If the overall scale is less than one, and input_integer_bits=0, then the
710b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // result is double equivalent of Q0.31 (actually with more precision). Thus
720b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // this generates a Q(input_integer_bits).(31-input_integer_bits)
730b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // representation.
740b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  const double input_beta_real_multiplier = std::min(
750b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle      beta * input_scale * (1 << (31 - input_integer_bits)), (1ll << 31) - 1.0);
760b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
770b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  QuantizeMultiplierGreaterThanOne(input_beta_real_multiplier,
780b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                                   quantized_multiplier, left_shift);
790b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
800b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
810b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleint CalculateInputRadius(int input_integer_bits, int input_left_shift) {
820b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  const double max_input_rescaled = 1.0 * ((1 << input_integer_bits) - 1) *
830b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                                    (1ll << (31 - input_integer_bits)) /
840b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle                                    (1ll << input_left_shift);
850b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // Tighten bound using floor.  Suppose that we could use the exact value.
860b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // After scaling the difference, the result would be at the maximum.  Thus we
870b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  // must ensure that our value has lower magnitude.
880b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle  return static_cast<int>(std::floor(max_input_rescaled));
890b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}
900b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle
910b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle}  // namespace tflite
92