xref: /aosp_15_r20/external/armnn/delegate/classic/src/test/ArmnnClassicDelegateTest.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
7 #include <doctest/doctest.h>
8 
9 #include <classic/include/armnn_delegate.hpp>
10 
11 #include <tensorflow/lite/kernels/builtin_op_kernels.h>
12 #include <tensorflow/lite/interpreter.h>
13 #include <tensorflow/lite/kernels/register.h>
14 
15 namespace armnnDelegate
16 {
17 
18 TEST_SUITE("ArmnnDelegate")
19 {
20 
21 TEST_CASE ("ArmnnDelegate Registered")
22 {
23     using namespace tflite;
24     auto tfLiteInterpreter = std::make_unique<Interpreter>();
25 
26     tfLiteInterpreter->AddTensors(3);
27     tfLiteInterpreter->SetInputs({0, 1});
28     tfLiteInterpreter->SetOutputs({2});
29 
30     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());
33 
34     tflite::ops::builtin::BuiltinOpResolver opResolver;
35     const TfLiteRegistration* opRegister = opResolver.FindOp(BuiltinOperator_ADD, 1);
36     tfLiteInterpreter->AddNodeWithParameters({0, 1}, {2}, "", 0, nullptr, opRegister);
37 
38     // Create the Armnn Delegate
39     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
40     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);
50     std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)>
51                        theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions),
52                                         armnnDelegate::TfLiteArmnnDelegateDelete);
53 
54     auto status = tfLiteInterpreter->ModifyGraphWithDelegate(std::move(theArmnnDelegate));
55     CHECK(status == kTfLiteOk);
56     CHECK(tfLiteInterpreter != nullptr);
57 }
58 
59 TEST_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::OptimizerOptionsOpaque 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 
91 TEST_CASE ("DelegateOptions_ClassicDelegateDefault")
92 {
93     // Check default options can be created
94     auto options = TfLiteArmnnDelegateOptionsDefault();
95 
96     // Check Classic delegate created
97     auto classicDelegate = armnnDelegate::TfLiteArmnnDelegateCreate(options);
98     CHECK(classicDelegate);
99 
100     // Check Classic Delegate can be deleted
101     CHECK(classicDelegate->data_);
102     armnnDelegate::TfLiteArmnnDelegateDelete(classicDelegate);
103 }
104 
105 }
106 
107 } // namespace armnnDelegate
108