#pragma once
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#include <executorch/runtime/core/evalue.h>
#include <executorch/runtime/core/exec_aten/exec_aten.h>
#include <executorch/runtime/executor/memory_manager.h>
#include <executorch/runtime/executor/program.h>
#include <executorch/schema/program_generated.h>
namespace executorch {
namespace ET_RUNTIME_NAMESPACE {
namespace deserialization {
struct NamedData {
const char* key;
FreeableBuffer buffer;
};
NamedData* get_data_by_key(const char* key, Span<NamedData> entries);
ET_NODISCARD Result<executorch::aten::Tensor> parseTensor(
const Program* program,
MemoryManager* memory_manager,
const executorch_flatbuffer::Tensor* s_tensor,
const NamedDataMap* named_data_map = nullptr,
Span<NamedData> external_constants = {});
ET_NODISCARD Result<BoxedEvalueList<executorch::aten::Tensor>> parseTensorList(
const flatbuffers::Vector<int32_t>* tensor_indices,
EValue* values,
size_t values_len,
MemoryManager* memory_manager);
ET_NODISCARD Error validateTensorLayout(
const executorch_flatbuffer::Tensor* s_tensor,
const TensorLayout& expected_layout);
template <typename T>
ET_NODISCARD Result<BoxedEvalueList<std::optional<T>>> parseListOptionalType(
const flatbuffers::Vector<int32_t>* value_indices,
EValue* values,
size_t values_len,
MemoryManager* memory_manager) {
auto* evalp_list = memory_manager->method_allocator()->allocateList<EValue*>(
value_indices->size());
if (evalp_list == nullptr) {
return Error::MemoryAllocationFailed;
}
auto* optional_tensor_list =
memory_manager->method_allocator()->allocateList<std::optional<T>>(
value_indices->size());
if (optional_tensor_list == nullptr) {
return Error::MemoryAllocationFailed;
}
size_t output_idx = 0;
for (int32_t index : *value_indices) {
if (index == -1) {
new (&optional_tensor_list[output_idx])
std::optional<T>(executorch::aten::nullopt);
evalp_list[output_idx] = nullptr;
} else {
ET_CHECK_OR_RETURN_ERROR(
index >= 0 && static_cast<size_t>(index) < values_len,
InvalidProgram,
"Invalid value index %" PRId32 " for ListOptional",
index);
auto optional_result = values[index].tryToOptional<T>();
if (!optional_result.ok()) {
return optional_result.error();
}
new (&optional_tensor_list[output_idx])
std::optional<T>(std::move(optional_result.get()));
evalp_list[output_idx] = &values[static_cast<size_t>(index)];
}
output_idx++;
}
return BoxedEvalueList<std::optional<T>>(
evalp_list, optional_tensor_list, value_indices->size());
}
ET_NODISCARD Result<void*> getTensorDataPtr(
const executorch_flatbuffer::Tensor* s_tensor,
const Program* program,
size_t nbytes,
HierarchicalAllocator* allocator,
const NamedDataMap* named_data_map = nullptr,
Span<NamedData> external_constants = {});
} } }
namespace torch {
namespace executor {
namespace deserialization {
using ::executorch::ET_RUNTIME_NAMESPACE::deserialization::getTensorDataPtr;
using ::executorch::ET_RUNTIME_NAMESPACE::deserialization::
parseListOptionalType;
using ::executorch::ET_RUNTIME_NAMESPACE::deserialization::parseTensor;
using ::executorch::ET_RUNTIME_NAMESPACE::deserialization::parseTensorList;
} } }
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif