blob: bc73dde2ef10101887c5a9348dcc698a8aa4fd69 [file] [log] [blame]
Sadik Armagan3c24f432020-10-19 17:35:30 +01001//
2// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Sadik Armagan3c24f432020-10-19 17:35:30 +01006#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
Sadik Armagan3c24f432020-10-19 17:35:30 +01007#include <doctest/doctest.h>
8
Sadik Armagan62483be2020-10-23 17:14:43 +01009#include <armnn_delegate.hpp>
10
Sadik Armagan3c24f432020-10-19 17:35:30 +010011#include "tensorflow/lite/kernels/builtin_op_kernels.h"
12#include <tensorflow/lite/interpreter.h>
Keith Davis892fafe2020-11-26 17:40:35 +000013#include <tensorflow/lite/kernels/register.h>
Sadik Armagan3c24f432020-10-19 17:35:30 +010014
Sadik Armagan62483be2020-10-23 17:14:43 +010015namespace armnnDelegate
Sadik Armagan3c24f432020-10-19 17:35:30 +010016{
17
Sadik Armagan3c24f432020-10-19 17:35:30 +010018TEST_SUITE("ArmnnDelegate")
19{
20
21TEST_CASE ("ArmnnDelegate Registered")
22{
Sadik Armagan67e95f22020-10-29 16:14:54 +000023 using namespace tflite;
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000024 auto tfLiteInterpreter = std::make_unique<Interpreter>();
Sadik Armagan3c24f432020-10-19 17:35:30 +010025
Sadik Armagan3c24f432020-10-19 17:35:30 +010026 tfLiteInterpreter->AddTensors(3);
Sadik Armagan67e95f22020-10-29 16:14:54 +000027 tfLiteInterpreter->SetInputs({0, 1});
Sadik Armagan3c24f432020-10-19 17:35:30 +010028 tfLiteInterpreter->SetOutputs({2});
29
Sadik Armagan67e95f22020-10-29 16:14:54 +000030 tfLiteInterpreter->SetTensorParametersReadWrite(0, kTfLiteFloat32, "input1", {1,2,2,1}, TfLiteQuantization());
31 tfLiteInterpreter->SetTensorParametersReadWrite(1, kTfLiteFloat32, "input2", {1,2,2,1}, TfLiteQuantization());
32 tfLiteInterpreter->SetTensorParametersReadWrite(2, kTfLiteFloat32, "output", {1,2,2,1}, TfLiteQuantization());
Sadik Armagan3c24f432020-10-19 17:35:30 +010033
Sadik Armagan67e95f22020-10-29 16:14:54 +000034 tflite::ops::builtin::BuiltinOpResolver opResolver;
35 const TfLiteRegistration* opRegister = opResolver.FindOp(BuiltinOperator_ADD, 1);
36 tfLiteInterpreter->AddNodeWithParameters({0, 1}, {2}, "", 0, nullptr, opRegister);
Sadik Armagan3c24f432020-10-19 17:35:30 +010037
Sadik Armagan4189cc52020-11-11 18:01:48 +000038 // Create the Armnn Delegate
Sadik Armagan67e95f22020-10-29 16:14:54 +000039 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Sadik Armagan4189cc52020-11-11 18:01:48 +000040 std::vector<armnn::BackendOptions> backendOptions;
41 backendOptions.emplace_back(
42 armnn::BackendOptions{ "BackendName",
43 {
44 { "Option1", 42 },
45 { "Option2", true }
46 }}
47 );
48
49 armnnDelegate::DelegateOptions delegateOptions(backends, backendOptions);
Sadik Armagan67e95f22020-10-29 16:14:54 +000050 std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)>
51 theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions),
52 armnnDelegate::TfLiteArmnnDelegateDelete);
53
54 auto status = tfLiteInterpreter->ModifyGraphWithDelegate(std::move(theArmnnDelegate));
Sadik Armagan3c24f432020-10-19 17:35:30 +010055 CHECK(status == kTfLiteOk);
56 CHECK(tfLiteInterpreter != nullptr);
Sadik Armagan3c24f432020-10-19 17:35:30 +010057}
58
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000059TEST_CASE ("ArmnnDelegateOptimizerOptionsRegistered")
60{
61 using namespace tflite;
62 auto tfLiteInterpreter = std::make_unique<Interpreter>();
63
64 tfLiteInterpreter->AddTensors(3);
65 tfLiteInterpreter->SetInputs({0, 1});
66 tfLiteInterpreter->SetOutputs({2});
67
68 tfLiteInterpreter->SetTensorParametersReadWrite(0, kTfLiteFloat32, "input1", {1,2,2,1}, TfLiteQuantization());
69 tfLiteInterpreter->SetTensorParametersReadWrite(1, kTfLiteFloat32, "input2", {1,2,2,1}, TfLiteQuantization());
70 tfLiteInterpreter->SetTensorParametersReadWrite(2, kTfLiteFloat32, "output", {1,2,2,1}, TfLiteQuantization());
71
72 tflite::ops::builtin::BuiltinOpResolver opResolver;
73 const TfLiteRegistration* opRegister = opResolver.FindOp(BuiltinOperator_ADD, 1);
74 tfLiteInterpreter->AddNodeWithParameters({0, 1}, {2}, "", 0, nullptr, opRegister);
75
76 // Create the Armnn Delegate
77 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
78
79 armnn::OptimizerOptions optimizerOptions(true, true, false, true);
80
81 armnnDelegate::DelegateOptions delegateOptions(backends, optimizerOptions);
82 std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)>
83 theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions),
84 armnnDelegate::TfLiteArmnnDelegateDelete);
85
86 auto status = tfLiteInterpreter->ModifyGraphWithDelegate(std::move(theArmnnDelegate));
87 CHECK(status == kTfLiteOk);
88 CHECK(tfLiteInterpreter != nullptr);
89}
90
Sadik Armagan3c24f432020-10-19 17:35:30 +010091}
92
Sadik Armagan62483be2020-10-23 17:14:43 +010093} // namespace armnnDelegate