diff --git a/tensorflow/lite/core/c/common.cc b/tensorflow/lite/core/c/common.cc index baa6282fd5b..84883d2fd19 100644 --- a/tensorflow/lite/core/c/common.cc +++ b/tensorflow/lite/core/c/common.cc @@ -104,6 +104,41 @@ void TfLiteVarArrayFree(T* a) { #ifndef TF_LITE_STATIC_MEMORY +TfLiteSparsity TfLiteSparsityClone(const TfLiteSparsity& src) { + TfLiteSparsity dst = src; + dst.traversal_order = TfLiteIntArrayCopy(src.traversal_order); + dst.block_map = TfLiteIntArrayCopy(src.block_map); + if (src.dim_metadata) { + dst.dim_metadata = reinterpret_cast( + calloc(1, sizeof(TfLiteDimensionMetadata) * src.dim_metadata_size)); + for (int i = 0; i < src.dim_metadata_size; ++i) { + dst.dim_metadata[i] = src.dim_metadata[i]; + dst.dim_metadata[i].array_segments = + TfLiteIntArrayCopy(src.dim_metadata[i].array_segments); + dst.dim_metadata[i].array_indices = + TfLiteIntArrayCopy(src.dim_metadata[i].array_indices); + } + } + return dst; +} + +// Clones the source sparsity to a newly allocated object. +TfLiteSparsity* TfLiteSparsityClone(const TfLiteSparsity* const src) { + if (!src) { + return nullptr; + } + TfLiteSparsity* dst = + reinterpret_cast(calloc(1, sizeof(TfLiteSparsity))); + *dst = TfLiteSparsityClone(*src); + return dst; +} + +#endif // TF_LITE_STATIC_MEMORY + +} // namespace + +#ifndef TF_LITE_STATIC_MEMORY + TfLiteQuantization TfLiteQuantizationClone(const TfLiteQuantization& src) { TfLiteQuantization dst; dst.type = src.type; @@ -136,39 +171,8 @@ TfLiteQuantization TfLiteQuantizationClone(const TfLiteQuantization& src) { return dst; } -TfLiteSparsity TfLiteSparsityClone(const TfLiteSparsity& src) { - TfLiteSparsity dst = src; - dst.traversal_order = TfLiteIntArrayCopy(src.traversal_order); - dst.block_map = TfLiteIntArrayCopy(src.block_map); - if (src.dim_metadata) { - dst.dim_metadata = reinterpret_cast( - calloc(1, sizeof(TfLiteDimensionMetadata) * src.dim_metadata_size)); - for (int i = 0; i < src.dim_metadata_size; ++i) { - dst.dim_metadata[i] = src.dim_metadata[i]; - dst.dim_metadata[i].array_segments = - TfLiteIntArrayCopy(src.dim_metadata[i].array_segments); - dst.dim_metadata[i].array_indices = - TfLiteIntArrayCopy(src.dim_metadata[i].array_indices); - } - } - return dst; -} - -// Clones the source sparsity to a newly allocated object. -TfLiteSparsity* TfLiteSparsityClone(const TfLiteSparsity* const src) { - if (!src) { - return nullptr; - } - TfLiteSparsity* dst = - reinterpret_cast(calloc(1, sizeof(TfLiteSparsity))); - *dst = TfLiteSparsityClone(*src); - return dst; -} - #endif // TF_LITE_STATIC_MEMORY -} // namespace - extern "C" { size_t TfLiteIntArrayGetSizeInBytes(int size) { @@ -247,6 +251,11 @@ void TfLiteQuantizationFree(TfLiteQuantization* quantization) { } free(q_params); } + if (quantization->type == kTfLiteBlockwiseQuantization) { + TfLiteBlockwiseQuantization* q_params = + reinterpret_cast(quantization->params); + free(q_params); + } quantization->params = nullptr; quantization->type = kTfLiteNoQuantization; } diff --git a/tensorflow/lite/core/c/common.h b/tensorflow/lite/core/c/common.h index 3f1fe32b8b4..c3e00cc0972 100644 --- a/tensorflow/lite/core/c/common.h +++ b/tensorflow/lite/core/c/common.h @@ -788,6 +788,7 @@ TfLiteStatus TfLiteTensorRealloc(size_t num_bytes, TfLiteTensor* tensor); /// If all dimensions are known, this is the same as `t->dims`. /// (`dims_signature` is NULL or empty if all dimensions are known.) const TfLiteIntArray* TfLiteTensorGetDimsSignature(const TfLiteTensor* t); + #endif // TF_LITE_STATIC_MEMORY /// WARNING: This is an experimental interface that is subject to change. @@ -1633,5 +1634,8 @@ TfLiteStatus TfLiteTensorVariantRealloc(TfLiteTensor* t, return kTfLiteOk; } +// Returns a copy of the quantization parameters of the tensor. +TfLiteQuantization TfLiteQuantizationClone(const TfLiteQuantization& src); + #endif // __cplusplus #endif // TENSORFLOW_LITE_CORE_C_COMMON_H_