From 19ad816539037a095749cdd41852292a3d87dd2b Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Wed, 4 Oct 2023 11:17:03 +0100 Subject: IVGCVSW-8060 Add ArmNNSettings parser function for Opaque Delegate * Add Unit Tests * Update DelegateOptions constructor Signed-off-by: Teresa Charlin Change-Id: I0e88403ac280e4cf8710ae7ee38b3b56dba42adc --- delegate/opaque/src/armnn_delegate.cpp | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'delegate/opaque/src/armnn_delegate.cpp') diff --git a/delegate/opaque/src/armnn_delegate.cpp b/delegate/opaque/src/armnn_delegate.cpp index 83e90a0026..8e3597d1d3 100644 --- a/delegate/opaque/src/armnn_delegate.cpp +++ b/delegate/opaque/src/armnn_delegate.cpp @@ -55,6 +55,7 @@ #include #include #include +#include namespace armnnOpaqueDelegate { @@ -63,6 +64,69 @@ static auto* g_delegate_plugin_ArmnnDelegatePlugin_ = new tflite::delegates::DelegatePluginRegistry::Register("armnn_delegate", ArmnnDelegatePlugin::New); +armnnDelegate::DelegateOptions ParseArmNNSettings(const tflite::TFLiteSettings* tfLiteSettings) +{ + const tflite::ArmNNSettings* settings = tfLiteSettings->armnn_settings(); + ARMNN_THROW_INVALIDARG_MSG_IF_FALSE(settings, + "The passed TFLiteSettings did not contain a valid ArmNNSettings"); + + // Extract settings fields + bool fastmath = settings->fastmath(); + std::string backends_str = (settings->backends()) ? settings->backends()->str() : ""; + const ::flatbuffers::String* additional_parameters = settings->additional_parameters(); + + // Build additional parameters string + std::string additional_parameters_str; + if (additional_parameters) + { + additional_parameters_str = additional_parameters->str(); + + // Apply a regex to remove spaces around the = and , signs + std::regex regex_equals_str("[ ]*=[ ]*"); + std::regex regex_comma_str("[ ]*,[ ]*"); + additional_parameters_str = std::regex_replace(additional_parameters_str, regex_equals_str, "="); + additional_parameters_str = std::regex_replace(additional_parameters_str, regex_comma_str, ","); + } + + // Build a std::pair list of option names and values + std::vector> options; + options.emplace_back(std::pair("backends", backends_str)); + options.emplace_back(std::pair("enable-fast-math", (fastmath) ? "true" : "false")); + + std::stringstream additional_parameters_ss(additional_parameters_str); + while (additional_parameters_ss.good()) + { + std::string option_str; + getline( additional_parameters_ss, option_str, ',' ); + size_t n = option_str.find("="); + if (n != std::string::npos) + { + std::string name = option_str.substr(0, n); + std::string value = option_str.substr(n + 1, std::string::npos); + options.emplace_back(std::pair(name, value)); + } + } + + // Build the key and value lists to pass into the constructor of the DelegateOptions + size_t num_options = options.size(); + std::unique_ptr options_keys = std::unique_ptr(new const char*[num_options + 1]); + std::unique_ptr options_values = std::unique_ptr(new const char*[num_options + 1]); + + for (size_t i=0; i