18#ifndef LUCI_INTERPRETER_KERNELS_UTILS_H
19#define LUCI_INTERPRETER_KERNELS_UTILS_H
22#include "luci_interpreter/core/Tensor.h"
24#include <tensorflow/lite/kernels/internal/tensor_utils.h>
25#include <tensorflow/lite/kernels/internal/types.h>
36#define LUCI_INTERPRETER_CHECK(cond) \
38 throw std::runtime_error(std::string(__FILE__) + ":" + std::to_string(__LINE__) + +"(" + \
39 std::string(#cond) + ") was not true.");
46 return padding > 0 ? padding : 0;
86 int32_t *activation_min, int32_t *activation_max);
88template <
typename T>
constexpr bool one_of_types() {
return false; }
110 if (std::is_same<T, float>::value)
112 if (std::is_same<T, int32_t>::value)
154 for (
size_t i = 0;
i <
n; ++
i)
169inline std::vector<ChannelQuantMultipliers>
173 std::vector<ChannelQuantMultipliers> params(
n);
174 for (
size_t i = 0;
i <
n; ++
i)
190 const std::vector<T> &_v;
196 if (tensor ==
nullptr)
197 return tflite::RuntimeShape();
199 const Shape &shape = tensor->shape();
210 return tensor !=
nullptr ? tensor->data<T>() :
nullptr;
215 return tensor !=
nullptr ? tensor->data<T>() :
nullptr;
223 using ElementT =
typename std::conditional<is_const, const T, T>::type;
224 using TensorT =
typename std::conditional<is_const, const Tensor, Tensor>::type;
244 for (tflite::RuntimeShape &shape : all_shape_)
246 all_shape_ptr_.push_back(&shape);
259 const tflite::RuntimeShape *
const *
shapes()
const {
return all_shape_ptr_.data(); }
262 std::vector<ElementT *> all_data_;
263 std::vector<tflite::RuntimeShape> all_shape_;
264 std::vector<tflite::RuntimeShape *> all_shape_ptr_;
280 zero_point_.push_back(tensor->zero_point());
281 scale_.push_back(tensor->scale());
285 const float *
scale()
const {
return scale_.data(); }
286 const int32_t *
zero_point()
const {
return zero_point_.data(); }
289 std::vector<int32_t> zero_point_;
290 std::vector<float> scale_;
BroadcastableWrapper(const std::vector< T > &v)
const float * scale() const
const int32_t * zero_point() const
VectorOfQuantizedTensors(const std::vector< TensorT * > &tensor_list)
VectorOfTensors(const std::vector< TensorT * > &tensor_list)
const tflite::RuntimeShape *const * shapes() const
ElementT *const * data() const
typename std::conditional< is_const, const Tensor, Tensor >::type TensorT
typename std::conditional< is_const, const T, T >::type ElementT
#define LUCI_INTERPRETER_CHECK(cond)
__global uchar * offset(const Image *img, int x, int y)
int32_t computePadding(int32_t stride, int32_t dilation_rate, int32_t in_size, int32_t filter_size, int32_t out_size)
int32_t calcOffset(const Shape &shape, int32_t d0, int32_t d1, int32_t d2, int32_t d3)
Shape calculateShapeForBroadcast(const Shape &input1_shape, const Shape &input2_shape)
TfLiteFusedActivation getTfLiteActivation(Activation activation)
const T * getTensorData(const Tensor *tensor)
std::vector< ChannelQuantMultipliers > quantizeMultipliers(const std::vector< double > &effective_scale)
tflite::RuntimeShape getTensorShape(const Tensor *tensor)
void calculateActivationRange(Activation activation, T *activation_min, T *activation_max)
void quantizeMultiplierSmallerThanOneExp(double double_multiplier, int32_t *quantized_multiplier, int *left_shift)
void calculateActivationRangeQuantized(Activation activation, const Tensor *output, int32_t *activation_min, int32_t *activation_max)
constexpr bool one_of_types()
double getQuantizedConvolutionMultipler(float input_scale, float filter_scale, float output_scale)
int32_t computePaddingWithOffset(int32_t stride, int32_t dilation_rate, int32_t in_size, int32_t filter_size, int32_t out_size, int32_t *offset)
void quantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift)
int32_t computeOutputSize(Padding padding, int32_t image_size, int32_t filter_size, int32_t stride, int32_t dilation_rate=1)
std::vector< double > getQuantizedConvolutionMultiplers(float input_scale, const std::vector< float > &filter_scale, float output_scale)
void fillArithmeticActivationRange(tflite::ArithmeticParams &p, Activation act)
T must_cast(loco::Node *node)
ChannelQuantMultipliers()=default