aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-10-10 19:11:07 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-10-10 19:11:07 +0000
commitb3a755ea84fe965fb6257adc1ca22f062eb82b60 (patch)
tree07b68d4ae705996c4108bd38802de9b428d662f8
parent8d1ed8f490d0d10817ace0c147f1e555d687939b (diff)
parent2d7e052d3203129b682419883495a6739bfadac6 (diff)
downloadtensorflow-aml_odp_341610000.tar.gz
Snap for 10927977 from 2d7e052d3203129b682419883495a6739bfadac6 to mainline-odp-releaseaml_odp_341610000
Change-Id: I831f9957afcc09d758765aef1a18a706af5c1215
-rw-r--r--Android.bp12
-rw-r--r--tensorflow/core/data/Android.bp39
-rw-r--r--tensorflow/core/data/dataset_utils.cc1
-rw-r--r--tensorflow/core/kernels/Android.bp28
-rw-r--r--tensorflow/core/kernels/checkpoint_callback_manager.cc34
-rw-r--r--tensorflow/core/kernels/constant_op.cc1
-rw-r--r--tensorflow/core/platform/env.cc6
-rw-r--r--tensorflow/core/platform/env.h9
-rw-r--r--tensorflow/core/platform/file_system.cc6
-rw-r--r--tensorflow/core/platform/file_system.h9
-rw-r--r--tensorflow/core/platform/file_system_test.cc8
-rw-r--r--tensorflow/core/platform/retrying_file_system.h6
-rw-r--r--tensorflow/core/platform/test.h6
-rw-r--r--tensorflow/core/util/Android.bp2
-rw-r--r--tensorflow/core/util/tensor_slice_writer.cc34
-rw-r--r--tensorflow/core/util/tensor_slice_writer.h3
-rw-r--r--tensorflow/lite/delegates/Android.bp1
-rw-r--r--tensorflow/lite/delegates/nnapi/nnapi_delegate_test.cc263
-rw-r--r--third_party/absl/abseil-cpp/Android.bp44
19 files changed, 347 insertions, 165 deletions
diff --git a/Android.bp b/Android.bp
index c3a054f3557..da6cec5b88b 100644
--- a/Android.bp
+++ b/Android.bp
@@ -140,6 +140,8 @@ cc_library_static {
":tflite_flex_delegate",
":tensorflow_c_srcs",
":tensorflow_c_eager_srcs",
+ ":tensorflow_core_data_mobile_srcs_no_runtime",
+ ":tensorflow_core_kernels_mobile_srcs",
":tensorflow_core_common_runtime_mobile_srcs_only_runtime",
":tensorflow_core_framework_mobile_srcs_only_runtime",
":tensorflow_core_framework_mobile_srcs_no_runtime",
@@ -157,6 +159,14 @@ cc_library_static {
":tensorflow_core_lib_mobile_src_no_runtime",
"tensorflow/core/nccl/collective_communicator.cc",
"tensorflow/core/example/feature_util.cc",
+ "tensorflow/core/ops/no_op.cc",
+ "tensorflow/core/ops/array_ops.cc",
+ "tensorflow/core/ops/parsing_ops.cc",
+ "tensorflow/core/ops/dataset_ops.cc",
+ "tensorflow/core/ops/function_ops.cc",
+ "tensorflow/core/ops/io_ops.cc",
+ "tensorflow/core/ops/nn_ops.cc",
+ "tensorflow/core/ops/string_ops.cc",
"tensorflow/core/lib/wav/wav_io.cc",
"tensorflow/compiler/jit/defs.cc",
],
@@ -194,6 +204,8 @@ cc_library_static {
"-DENABLE_ABSL_IN_TENSORFLOW",
"-DIS_MOBILE_PLATFORM",
"-DTF_ANDROID_ENABLE_LOG_EVERY_N_SECONDS",
+ // Used to support int64, string type in //tensorflow/core/framework/register_types.h.
+ "-D__ANDROID_TYPES_FULL__",
"-Wno-defaulted-function-deleted",
"-Wno-deprecated-builtins",
"-Wno-deprecated-declarations",
diff --git a/tensorflow/core/data/Android.bp b/tensorflow/core/data/Android.bp
new file mode 100644
index 00000000000..c10e64f1c82
--- /dev/null
+++ b/tensorflow/core/data/Android.bp
@@ -0,0 +1,39 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "external_tensorflow_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["external_tensorflow_license"],
+}
+
+filegroup(
+ name = "tensorflow_core_data_mobile_srcs_no_runtime",
+ srcs = [
+ "name_utils.cc",
+ "captured_function.cc",
+ "dataset_utils.cc",
+ "stats_utils.cc",
+ "metric_utils.cc",
+ "finalization_utils.cc",
+ "serialization_utils.cc",
+ "unbounded_thread_pool.cc",
+ "root_dataset.cc",
+ "rewrite_utils.cc",
+ "utils.cc",
+ ],
+) \ No newline at end of file
diff --git a/tensorflow/core/data/dataset_utils.cc b/tensorflow/core/data/dataset_utils.cc
index 4ed4d4e9e28..1d3619250b8 100644
--- a/tensorflow/core/data/dataset_utils.cc
+++ b/tensorflow/core/data/dataset_utils.cc
@@ -42,7 +42,6 @@ limitations under the License.
#include "tensorflow/core/lib/hash/hash.h"
#include "tensorflow/core/lib/strings/proto_serialization.h"
#include "tensorflow/core/platform/host_info.h"
-#include "tensorflow/core/platform/regexp.h"
#include "tensorflow/core/util/determinism.h"
#include "tensorflow/core/util/work_sharder.h"
diff --git a/tensorflow/core/kernels/Android.bp b/tensorflow/core/kernels/Android.bp
index 886cd392737..062f03f5fd9 100644
--- a/tensorflow/core/kernels/Android.bp
+++ b/tensorflow/core/kernels/Android.bp
@@ -25,7 +25,35 @@ filegroup(
name = "tensorflow_core_kernels_mobile_srcs",
srcs = [
"initializable_lookup_table.cc",
+ "checkpoint_callback_manager.cc",
+ "constant_op.cc",
"lookup_util.cc",
+ "function_ops.cc",
+ "fill_functor.cc",
+ "example_parsing_ops.cc",
+ "no_op.cc",
"pooling_ops_common.cc",
+ "save_restore_v2_ops.cc",
+ "save_restore_tensor.cc",
+ "save_op.cc",
+ "split_op.cc",
+ "split_lib_cpu.cc",
+ "string_to_hash_bucket_fast_op.cc",
+ "as_string_op.cc",
+ "tensor_to_hash_bucket_op.cc",
+ "bcast_ops.cc",
+ "shape_ops.cc",
+ "concat_op.cc",
+ "concat_lib_cpu.cc",
+ "relu_op.cc",
+ "data/take_dataset_op.cc",
+ "data/map_dataset_op.cc",
+ "data/reduce_dataset_op.cc",
+ "data/iterator_ops.cc",
+ "data/prefetch_dataset_op.cc",
+ "data/prefetch_autotuner.cc",
+ "data/optional_ops.cc",
+ "data/optional_ops_util.cc",
+ "data/batch_dataset_op.cc",
],
)
diff --git a/tensorflow/core/kernels/checkpoint_callback_manager.cc b/tensorflow/core/kernels/checkpoint_callback_manager.cc
index fb94c19dcda..0e0fae0f91d 100644
--- a/tensorflow/core/kernels/checkpoint_callback_manager.cc
+++ b/tensorflow/core/kernels/checkpoint_callback_manager.cc
@@ -14,6 +14,7 @@ limitations under the License.
==============================================================================*/
#include "tensorflow/core/kernels/checkpoint_callback_manager.h"
+#include <regex>
#include <string>
#include <utility>
@@ -24,7 +25,8 @@ limitations under the License.
#include "tensorflow/core/platform/errors.h"
#include "tensorflow/core/platform/mutex.h"
#include "tensorflow/core/platform/path.h"
-#include "tensorflow/core/platform/regexp.h"
+// Remove RE2 usage
+// #include "tensorflow/core/platform/regexp.h"
#include "tensorflow/core/platform/status.h"
#include "tensorflow/core/platform/statusor.h"
#include "tensorflow/core/platform/stringpiece.h"
@@ -38,9 +40,9 @@ const absl::string_view kCheckpointCallbackManagerResourceName =
namespace {
-const absl::string_view kCheckpointFileRegex = "^part-[0-9]*-of-[0-9]*$";
-const absl::string_view kCheckpointTempDirRegex = "-[0-9]*_temp$";
-const absl::string_view kCheckpointDirRegex = "-[0-9]*$";
+const char* kCheckpointFileRegex = "^part-[0-9]*-of-[0-9]*$";
+const char* kCheckpointTempDirRegex = "-[0-9]*_temp$";
+const char* kCheckpointDirRegex = "-[0-9]*$";
const absl::string_view kCheckpointTempDirSuffix = "_temp";
void TriggerSaveCallbackIfFileNotExist(absl::string_view checkpoint_id,
@@ -115,17 +117,26 @@ StatusOr<std::pair<std::string, std::string>>
CheckpointCallbackManager::GetCheckpointIdAndPathFromPrefix(
absl::string_view prefix) {
for (absl::string_view path = prefix;; path = io::Dirname(path)) {
- absl::string_view basename = io::Basename(path);
+ std::string basename = std::string(io::Basename(path));
// Failed to find checkpoint_id
if (basename.empty()) break;
// Skip known checkpoint file: e.g., part-00000-of-00001
- if (RE2::PartialMatch(basename, kCheckpointFileRegex)) continue;
+ // if (RE2::PartialMatch(basename, kCheckpointFileRegex)) continue;
+ std::regex checkpoint_file_regex(kCheckpointFileRegex);
+ if (std::regex_search(basename, checkpoint_file_regex)) continue;
// With _temp suffix: e.g., checkpoint-1_temp
- if (RE2::PartialMatch(basename, kCheckpointTempDirRegex)) {
- // Trim suffix, "_temp".
+ // if (RE2::PartialMatch(basename, kCheckpointTempDirRegex)) {
+ // // Trim suffix, "_temp".
+ // return std::make_pair(
+ // std::string(basename.substr(
+ // 0, basename.length() - kCheckpointTempDirSuffix.length())),
+ // std::string(io::Dirname(path)));
+ // }
+ std::regex checkpoint_temp_dir_regex(kCheckpointTempDirRegex);
+ if (std::regex_search(basename, checkpoint_temp_dir_regex)) {
return std::make_pair(
std::string(basename.substr(
0, basename.length() - kCheckpointTempDirSuffix.length())),
@@ -133,7 +144,12 @@ CheckpointCallbackManager::GetCheckpointIdAndPathFromPrefix(
}
// Without _temp suffix: e.g., checkpoint-1
- if (RE2::PartialMatch(basename, kCheckpointDirRegex)) {
+ // if (RE2::PartialMatch(basename, kCheckpointDirRegex)) {
+ // return std::make_pair(std::string(basename),
+ // std::string(io::Dirname(path)));
+ // }
+ std::regex checkpoint_dir_regex(kCheckpointDirRegex);
+ if (std::regex_search(basename, checkpoint_dir_regex)) {
return std::make_pair(std::string(basename),
std::string(io::Dirname(path)));
}
diff --git a/tensorflow/core/kernels/constant_op.cc b/tensorflow/core/kernels/constant_op.cc
index 74fe21dcbaa..8917f922b46 100644
--- a/tensorflow/core/kernels/constant_op.cc
+++ b/tensorflow/core/kernels/constant_op.cc
@@ -24,7 +24,6 @@ limitations under the License.
#include "tensorflow/core/kernels/constant_op.h"
-#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor"
#include "tensorflow/core/framework/allocator.h"
#include "tensorflow/core/framework/bounds_check.h"
#include "tensorflow/core/framework/node_def.pb.h"
diff --git a/tensorflow/core/platform/env.cc b/tensorflow/core/platform/env.cc
index 9961fff0b24..93b9037258d 100644
--- a/tensorflow/core/platform/env.cc
+++ b/tensorflow/core/platform/env.cc
@@ -327,6 +327,12 @@ Status Env::HasAtomicMove(const string& path, bool* has_atomic_move) {
return fs->HasAtomicMove(path, has_atomic_move);
}
+Status Env::CanCreateTempFile(const string& fname, bool* can_create_temp_file) {
+ FileSystem* fs;
+ TF_RETURN_IF_ERROR(GetFileSystemForFile(fname, &fs));
+ return fs->CanCreateTempFile(fname, can_create_temp_file);
+}
+
Status Env::DeleteRecursively(const string& dirname, int64_t* undeleted_files,
int64_t* undeleted_dirs) {
FileSystem* fs;
diff --git a/tensorflow/core/platform/env.h b/tensorflow/core/platform/env.h
index 86b107759a5..67b45c69244 100644
--- a/tensorflow/core/platform/env.h
+++ b/tensorflow/core/platform/env.h
@@ -333,6 +333,15 @@ class Env {
/// TF
Status HasAtomicMove(const std::string& path, bool* has_atomic_move);
+ /// Returns whether the give path is on a file system
+ /// that has ability to create a new temp file. This can be used
+ /// to determine if there needs to be a temp location to safely write objects.
+ /// If this returns false, TensorFlow will write directly to output files
+ /// instead of creating a temporary file and swapping it in. This may mean
+ /// that incomplete writes are visible to consumers.
+ Status CanCreateTempFile(const std::string& fname,
+ bool* can_create_temp_file);
+
/// Stores the size of `fname` in `*file_size`.
Status GetFileSize(const std::string& fname, uint64* file_size);
diff --git a/tensorflow/core/platform/file_system.cc b/tensorflow/core/platform/file_system.cc
index e170b091985..5847e76bfc7 100644
--- a/tensorflow/core/platform/file_system.cc
+++ b/tensorflow/core/platform/file_system.cc
@@ -87,6 +87,12 @@ Status FileSystem::HasAtomicMove(const string& path, bool* has_atomic_move) {
return OkStatus();
}
+Status FileSystem::CanCreateTempFile(const std::string& fname,
+ bool* can_create_temp_file) {
+ *can_create_temp_file = true;
+ return OkStatus();
+}
+
void FileSystem::FlushCaches(TransactionToken* token) {}
bool FileSystem::FilesExist(const std::vector<string>& files,
diff --git a/tensorflow/core/platform/file_system.h b/tensorflow/core/platform/file_system.h
index 3b74a47ccbc..be0266d0d99 100644
--- a/tensorflow/core/platform/file_system.h
+++ b/tensorflow/core/platform/file_system.h
@@ -386,6 +386,15 @@ class FileSystem {
/// TF
virtual Status HasAtomicMove(const std::string& path, bool* has_atomic_move);
+ /// Returns whether the give path is on a file system
+ /// that has ability to create a new temp file. This can be used
+ /// to determine if there needs to be a temp location to safely write objects.
+ /// If this returns false, TensorFlow will write directly to output files
+ /// instead of creating a temporary file and swapping it in. This may mean
+ /// that incomplete writes are visible to consumers.
+ virtual Status CanCreateTempFile(const std::string& fname,
+ bool* can_create_temp_file);
+
/// \brief Flushes any cached filesystem objects from memory.
virtual void FlushCaches() { FlushCaches(nullptr); }
diff --git a/tensorflow/core/platform/file_system_test.cc b/tensorflow/core/platform/file_system_test.cc
index f5ca57bda5c..d49a252ea05 100644
--- a/tensorflow/core/platform/file_system_test.cc
+++ b/tensorflow/core/platform/file_system_test.cc
@@ -273,6 +273,14 @@ TEST(InterPlanetaryFileSystemTest, HasAtomicMove) {
EXPECT_EQ(has_atomic_move, true);
}
+TEST(InterPlanetaryFileSystemTest, CanCreateTempFile) {
+ InterPlanetaryFileSystem ipfs;
+ const string dirname = io::JoinPath(kPrefix, "match-00/abc/00");
+ bool can_create_temp_file;
+ TF_EXPECT_OK(ipfs.CanCreateTempFile(dirname, &can_create_temp_file));
+ EXPECT_EQ(can_create_temp_file, true);
+}
+
// A simple file system with a root directory and a single file underneath it.
class TestFileSystem : public NullFileSystem {
public:
diff --git a/tensorflow/core/platform/retrying_file_system.h b/tensorflow/core/platform/retrying_file_system.h
index 15433459fb4..ec739fb215a 100644
--- a/tensorflow/core/platform/retrying_file_system.h
+++ b/tensorflow/core/platform/retrying_file_system.h
@@ -144,6 +144,12 @@ class RetryingFileSystem : public FileSystem {
return base_file_system_->HasAtomicMove(path, has_atomic_move);
}
+ Status CanCreateTempFile(const std::string& fname,
+ bool* can_create_temp_file) override {
+ // this method does not need to be retried
+ return base_file_system_->CanCreateTempFile(fname, can_create_temp_file);
+ }
+
Status DeleteRecursively(const string& dirname, TransactionToken* token,
int64_t* undeleted_files,
int64_t* undeleted_dirs) override {
diff --git a/tensorflow/core/platform/test.h b/tensorflow/core/platform/test.h
index b598b6ee1e4..e49f479cac7 100644
--- a/tensorflow/core/platform/test.h
+++ b/tensorflow/core/platform/test.h
@@ -16,10 +16,11 @@ limitations under the License.
#ifndef TENSORFLOW_CORE_PLATFORM_TEST_H_
#define TENSORFLOW_CORE_PLATFORM_TEST_H_
+#include <gtest/gtest.h> // IWYU pragma: export
+
#include <memory>
#include <vector>
-#include <gtest/gtest.h> // IWYU pragma: export
#include "tensorflow/core/platform/macros.h"
#include "tensorflow/core/platform/platform.h"
#include "tensorflow/core/platform/types.h"
@@ -39,7 +40,8 @@ limitations under the License.
// The advantages of using gmock matchers instead of self defined matchers are
// better error messages, more maintainable tests and more test coverage.
#if !defined(PLATFORM_GOOGLE) && !defined(PLATFORM_GOOGLE_ANDROID) && \
- !defined(PLATFORM_CHROMIUMOS)
+ !defined(PLATFORM_CHROMIUMOS) && \
+ !defined(IS_MOBILE_PLATFORM) // We have gmock.h in AOSP.
#include <gmock/gmock-generated-matchers.h>
#include <gmock/gmock-matchers.h>
#include <gmock/gmock-more-matchers.h>
diff --git a/tensorflow/core/util/Android.bp b/tensorflow/core/util/Android.bp
index 87395ef019f..e9466a449f6 100644
--- a/tensorflow/core/util/Android.bp
+++ b/tensorflow/core/util/Android.bp
@@ -63,6 +63,6 @@ filegroup(
"sparse/sparse_tensor.cc",
"tensor_bundle/naming.cc",
"tensor_bundle/tensor_bundle.cc",
-
+ "tensor_bundle/byte_swap.cc",
],
)
diff --git a/tensorflow/core/util/tensor_slice_writer.cc b/tensorflow/core/util/tensor_slice_writer.cc
index 75197a52c6d..0880b65aa58 100644
--- a/tensorflow/core/util/tensor_slice_writer.cc
+++ b/tensorflow/core/util/tensor_slice_writer.cc
@@ -85,8 +85,17 @@ TensorSliceWriter::TensorSliceWriter(const string& filename,
CreateBuilderFunction create_builder)
: filename_(filename),
create_builder_(std::move(create_builder)),
- tmpname_(strings::StrCat(filename, ".tempstate", random::New64())),
slices_(0) {
+ Env* env = Env::Default();
+ Status status = env->CanCreateTempFile(filename_, &use_temp_file_);
+ if (!status.ok()) {
+ LOG(ERROR) << "Failed to get CanCreateTempFile attribute: " << filename_;
+ use_temp_file_ = true;
+ }
+ data_filename_ = filename_;
+ if (use_temp_file_) {
+ data_filename_ = strings::StrCat(filename_, ".tempstate", random::New64());
+ }
VersionDef* versions = sts_.mutable_meta()->mutable_versions();
versions->set_producer(TF_CHECKPOINT_VERSION);
versions->set_min_consumer(TF_CHECKPOINT_VERSION_MIN_CONSUMER);
@@ -94,7 +103,7 @@ TensorSliceWriter::TensorSliceWriter(const string& filename,
Status TensorSliceWriter::Finish() {
Builder* b;
- Status s = create_builder_(tmpname_, &b);
+ Status s = create_builder_(data_filename_, &b);
if (!s.ok()) {
delete b;
return s;
@@ -113,18 +122,21 @@ Status TensorSliceWriter::Finish() {
int64_t file_size;
s = builder->Finish(&file_size);
- // We need to rename the file to the proper name
- if (s.ok()) {
- s = Env::Default()->RenameFile(tmpname_, filename_);
+ // If use temp file, we need to rename the file to the proper name.
+ if (use_temp_file_) {
if (s.ok()) {
- VLOG(1) << "Written " << slices_ << " slices for "
- << sts_.meta().tensor_size() << " tensors (" << file_size
- << " bytes) to " << filename_;
+ s = Env::Default()->RenameFile(data_filename_, filename_);
+ if (s.ok()) {
+ VLOG(1) << "Written " << slices_ << " slices for "
+ << sts_.meta().tensor_size() << " tensors (" << file_size
+ << " bytes) to " << filename_;
+ } else {
+ LOG(ERROR) << "Failed to rename file " << data_filename_ << " to "
+ << filename_;
+ }
} else {
- LOG(ERROR) << "Failed to rename file " << tmpname_ << " to " << filename_;
+ Env::Default()->DeleteFile(data_filename_).IgnoreError();
}
- } else {
- Env::Default()->DeleteFile(tmpname_).IgnoreError();
}
return s;
}
diff --git a/tensorflow/core/util/tensor_slice_writer.h b/tensorflow/core/util/tensor_slice_writer.h
index 34aa7c0b916..887db9d5c09 100644
--- a/tensorflow/core/util/tensor_slice_writer.h
+++ b/tensorflow/core/util/tensor_slice_writer.h
@@ -83,7 +83,8 @@ class TensorSliceWriter {
const string filename_;
const CreateBuilderFunction create_builder_;
- const string tmpname_;
+ string data_filename_;
+ bool use_temp_file_;
// A mapping from the tensor names to their index in meta_.saved_slice_meta()
std::unordered_map<string, int> name_to_index_;
diff --git a/tensorflow/lite/delegates/Android.bp b/tensorflow/lite/delegates/Android.bp
index 8c5a76fe188..8409b677575 100644
--- a/tensorflow/lite/delegates/Android.bp
+++ b/tensorflow/lite/delegates/Android.bp
@@ -30,6 +30,7 @@ filegroup(
"flex/delegate_data.cc",
"flex/kernel.cc",
"flex/util.cc",
+ "flex/tflite_subgraph_execute.cc",
"utils/simple_delegate.cc",
],
)
diff --git a/tensorflow/lite/delegates/nnapi/nnapi_delegate_test.cc b/tensorflow/lite/delegates/nnapi/nnapi_delegate_test.cc
index beccac3bedf..448e253f5a6 100644
--- a/tensorflow/lite/delegates/nnapi/nnapi_delegate_test.cc
+++ b/tensorflow/lite/delegates/nnapi/nnapi_delegate_test.cc
@@ -37,6 +37,8 @@ namespace {
using ::testing::ElementsAre;
using ::testing::ElementsAreArray;
+using ::testing::FloatNear;
+using ::testing::Matcher;
// TODO(b/110368244): figure out how to share the existing tests in kernels/ but
// with the delegation on. Also, add more unit tests to improve code coverage.
@@ -51,6 +53,21 @@ MATCHER(QuantizedNear, "") {
return true;
}
+auto NnapiArrayFloatNear(const std::vector<float>& values,
+ bool relaxed = false) {
+ // Uses the same tolerance as NNAPI generated tests.
+ const float atol = relaxed ? 5 * 0.0009765625f : 1e-5f;
+ const float rtol = relaxed ? 5 * 0.0009765625f : 5 * 1.1920928955078125e-7f;
+
+ std::vector<Matcher<float>> matchers;
+ matchers.reserve(values.size());
+ for (const float& v : values) {
+ const float tolerance = atol + rtol * std::abs(v);
+ matchers.emplace_back(FloatNear(v, tolerance));
+ }
+ return ElementsAreArray(matchers);
+}
+
class SingleOpModelWithNNAPI : public SingleOpModel {
public:
SingleOpModelWithNNAPI() { options_.disallow_nnapi_cpu = false; }
@@ -196,7 +213,7 @@ TEST(NNAPIDelegate, AddWithNoActivation) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
}
// Do a test with scalar input using no activation.
@@ -207,7 +224,7 @@ TEST(NNAPIDelegate, AddScalarWithNoActivation) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.7});
m.PopulateTensor<float>(m.input2(), {0.1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.3, 0.8, 0.8}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.3, 0.8, 0.8}));
}
// Do a test with the NN API using no activation.
@@ -220,7 +237,8 @@ TEST(NNAPIDelegate, AddWithNoActivationRelaxed) {
m.PopulateTensor<float>(m.input1(), {-2.0, -1.0, 1.0, 2.0});
m.PopulateTensor<float>(m.input2(), {1.0, 2.0, 3.0, 4.0});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.0, 1.0, 4.0, 6.0}));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-1.0, 1.0, 4.0, 6.0}, /*relaxed=*/true));
}
// Do a test with the NN api with relu.
@@ -231,7 +249,7 @@ TEST(NNAPIDelegate, AddWithRelu) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({0.0, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({0.0, 0.4, 1.0, 1.3}));
}
// Verify that resize attempts succeed.
@@ -246,7 +264,8 @@ TEST(NNAPIDelegate, ResizeInputTensorsWorks) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8, 0.9, 0.7});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5, 0.2, 0.8});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3, 1.1, 1.5}));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3, 1.1, 1.5}));
EXPECT_EQ(m.ResizeInputTensor(m.input1(), {1, 2, 2, 1}), kTfLiteOk);
EXPECT_EQ(m.ResizeInputTensor(m.input2(), {1, 2, 2, 1}), kTfLiteOk);
@@ -254,7 +273,7 @@ TEST(NNAPIDelegate, ResizeInputTensorsWorks) {
m.PopulateTensor<float>(m.input1(), {0.7, 0.8, 0.9, 0.7});
m.PopulateTensor<float>(m.input2(), {0.3, 0.5, 0.2, 0.8});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1.0, 1.3, 1.1, 1.5}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1.0, 1.3, 1.1, 1.5}));
}
TEST(NNAPIDelegate, ResizeDynamicBatchInputTensorsWorks) {
@@ -337,7 +356,7 @@ TEST(NNAPIDelegate, StatefulDelegate) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
}
// Sanity check for the state-ful NNAPI delegate with accelerator_name
@@ -354,7 +373,7 @@ TEST(NNAPIDelegate, StatefulDelegateWithAcceleratorName) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
}
// Sanity check for the state-ful NNAPI delegate with invalid accelerator_name
@@ -380,7 +399,7 @@ TEST(NNAPIDelegate, StatefulDelegateWithInvalidAcceleratorName) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
}
// Sanity check for the state-ful NNAPI delegate with compilation caching
@@ -398,7 +417,7 @@ TEST(NNAPIDelegate, StatefulDelegateWithCompilationCaching) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
}
// Sanity check for the state-ful NNAPI delegate with QoS hints.
@@ -416,7 +435,7 @@ TEST(NNAPIDelegate, StatefulDelegateWithQoS) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
}
// Sanity check for the state-ful NNAPI delegate using TfLiteBufferHandle.
@@ -480,7 +499,7 @@ TEST(NNAPIDelegate, StatefulDelegateWithBufferHandles) {
m.MarkInputTensorDataStale(m.input1());
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9, 0.4, 1.0, 1.3}));
// Run the inference multiple times with the same buffer so that the execution
// can be reused.
@@ -490,7 +509,7 @@ TEST(NNAPIDelegate, StatefulDelegateWithBufferHandles) {
memcpy(input1_memory_data, input1_data, kInput1ByteSize);
m.MarkInputTensorDataStale(m.input1());
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9 + i, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-1.9f + i, 0.4f, 1.0f, 1.3f}));
}
// Run the inference multiple times and each time register a buffer.
@@ -505,7 +524,8 @@ TEST(NNAPIDelegate, StatefulDelegateWithBufferHandles) {
m.MarkInputTensorDataStale(m.input1());
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({-1.9 + i, 0.4, 1.0, 1.3}));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-1.9f + i, 0.4f, 1.0f, 1.3f}));
}
}
@@ -540,8 +560,7 @@ TEST(NNAPIDelegate, MulWithNoActivation) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(),
- ElementsAreArray(ArrayFloatNear({-0.2, 0.04, 0.21, 0.4})));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-0.2, 0.04, 0.21, 0.4}));
}
class FloatPoolingOpModel : public SingleOpModelWithNNAPI {
@@ -582,7 +601,7 @@ TEST(NNAPIDelegate, AveragePoolWithNoActivation) {
3, 2, 10, 7, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({2.75, 5.75}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({2.75, 5.75}));
}
TEST(NNAPIDelegate, MaxPoolWithNoActivation) {
@@ -595,7 +614,7 @@ TEST(NNAPIDelegate, MaxPoolWithNoActivation) {
3, 2, 10, 7, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({6, 10}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({6, 10}));
}
TEST(NNAPIDelegate, L2PoolWithNoActivation) {
@@ -608,7 +627,7 @@ TEST(NNAPIDelegate, L2PoolWithNoActivation) {
3, 2, 10, 7, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({3.5, 6.5}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({3.5, 6.5}));
}
class ConvolutionOpModel : public SingleOpModelWithNNAPI {
@@ -814,7 +833,7 @@ TEST(ConvolutionOpTest, NoActivation) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
18, 2, 5, // first batch, left
18, 2, 5, // first batch, right
17, 4, 3, // second batch, left
@@ -914,7 +933,7 @@ TEST(ConvolutionOpTest, SimpleTestFloatWithDilation) {
// | 5 | 5 | 5 |
// | 5 | 5 | 5 |
// | 5 | 5 | 5 |
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({5, 5, 5, 5, 5, 5, 5, 5, 5}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({5, 5, 5, 5, 5, 5, 5, 5, 5}));
}
class QuantizedConvolutionOpModel : public ConvolutionOpModel {
@@ -1200,7 +1219,7 @@ TEST(NNAPIDelegate, DepthwiseConv2DWithNoActivation) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
71, -34, 99, -20, //
91, -26, 127, -4, //
}));
@@ -1412,10 +1431,9 @@ TEST(SoftmaxOpTest, SimpleTest) {
EXPECT_THAT(
m.GetOutput(),
- ElementsAreArray(ArrayFloatNear(
- {0.011656231, 0.031684921, 0.086128544, 0.234121657, 0.636408647,
- 0.636408647, 0.234121657, 0.086128544, 0.031684921, 0.011656231},
- 1e-6)));
+ NnapiArrayFloatNear({0.011656231, 0.031684921, 0.086128544, 0.234121657,
+ 0.636408647, 0.636408647, 0.234121657, 0.086128544,
+ 0.031684921, 0.011656231}));
}
TEST(SoftmaxOpTest, Beta2) {
@@ -1426,11 +1444,9 @@ TEST(SoftmaxOpTest, Beta2) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(
- m.GetOutput(),
- ElementsAreArray(ArrayFloatNear(
- {0.000290076, 0.002143387, 0.015837606, 0.117024957, 0.864703974},
- 1e-6)));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({0.000290076, 0.002143387, 0.015837606,
+ 0.117024957, 0.864703974}));
}
TEST(SoftmaxOpTest, 3dInput) {
@@ -1446,12 +1462,11 @@ TEST(SoftmaxOpTest, 3dInput) {
EXPECT_THAT(
m.GetOutput(),
- ElementsAreArray(ArrayFloatNear(
+ NnapiArrayFloatNear(
{0.011656231, 0.031684921, 0.086128544, 0.234121657, 0.636408647,
0.636408647, 0.234121657, 0.086128544, 0.031684921, 0.011656231,
0.636408647, 0.011656231, 0.031684921, 0.086128544, 0.234121657,
- 0.011656231, 0.636408647, 0.234121657, 0.086128544, 0.031684921},
- 1e-6)));
+ 0.011656231, 0.636408647, 0.234121657, 0.086128544, 0.031684921}));
}
TEST(SoftmaxOpTest, 4dInput) {
@@ -1467,12 +1482,11 @@ TEST(SoftmaxOpTest, 4dInput) {
EXPECT_THAT(
m.GetOutput(),
- ElementsAreArray(ArrayFloatNear(
+ NnapiArrayFloatNear(
{0.011656231, 0.031684921, 0.086128544, 0.234121657, 0.636408647,
0.636408647, 0.234121657, 0.086128544, 0.031684921, 0.011656231,
0.636408647, 0.011656231, 0.031684921, 0.086128544, 0.234121657,
- 0.011656231, 0.636408647, 0.234121657, 0.086128544, 0.031684921},
- 1e-6)));
+ 0.011656231, 0.636408647, 0.234121657, 0.086128544, 0.031684921}));
}
class ReshapeOpModel : public SingleOpModelWithNNAPI {
@@ -1507,7 +1521,7 @@ TEST(NNAPIDelegate, ReshapeSimpleTest) {
ReshapeOpModel m({1, 2, 4, 1}, {2, 2, 2});
m.SetInput({1, 2, 3, 4, 5, 6, 7, 8});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1, 2, 3, 4, 5, 6, 7, 8}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1, 2, 3, 4, 5, 6, 7, 8}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({2, 2, 2}));
}
@@ -1548,9 +1562,9 @@ TEST(NNAPIDelegate, DISABLED_SqueezeSimpleTest) {
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({24}));
EXPECT_THAT(
m.GetOutput(),
- ElementsAreArray({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
- 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
- 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}));
+ NnapiArrayFloatNear({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
+ 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}));
}
TEST(NNAPIDelegate, SqueezeWithAxisTest) {
@@ -1564,9 +1578,9 @@ TEST(NNAPIDelegate, SqueezeWithAxisTest) {
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 24}));
EXPECT_THAT(
m.GetOutput(),
- ElementsAreArray({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
- 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
- 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}));
+ NnapiArrayFloatNear({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
+ 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}));
}
class L2NormOpModel : public SingleOpModelWithNNAPI {
@@ -1601,7 +1615,7 @@ TEST(NNAPIDelegate, L2NormSimpleTest) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 1, 1, 6}));
EXPECT_THAT(m.GetOutput(),
- ElementsAreArray({-0.55, 0.3, 0.35, 0.6, -0.35, 0.05}));
+ NnapiArrayFloatNear({-0.55, 0.3, 0.35, 0.6, -0.35, 0.05}));
}
class TransposeSimpleModel : public SingleOpModelWithNNAPI {
@@ -1636,9 +1650,9 @@ TEST(NNAPIDelegate, TransposeSimpleTest) {
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({4, 2, 3}));
- EXPECT_THAT(m.GetOutput(),
- ElementsAreArray({0, 4, 8, 12, 16, 20, 1, 5, 9, 13, 17, 21,
- 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear(
+ {0, 4, 8, 12, 16, 20, 1, 5, 9, 13, 17, 21,
+ 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23}));
}
class ElementwiseOpBaseModel : public SingleOpModelWithNNAPI {
@@ -1669,7 +1683,7 @@ TEST(Elementwise, Abs) {
3.f, -2.f, 10.f, 1.f, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.ExtractVector<float>(m.output()), ElementsAreArray({
+ EXPECT_THAT(m.ExtractVector<float>(m.output()), NnapiArrayFloatNear({
0.f, 6.2f, 2.f, 4.f, //
3.f, 2.f, 10.f, 1.f, //
}));
@@ -1680,9 +1694,9 @@ TEST(Elementwise, Exp) {
ElementwiseOpFloatModel m(BuiltinOperator_EXP, {3, 1, 2});
m.PopulateTensor<float>(m.input(), {1.0, 0.0, -1.0, 1.0, 1.0, -1.0});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.ExtractVector<float>(m.output()),
- ElementsAreArray(ArrayFloatNear(
- {2.71828, 1, 0.367879, 2.71828, 2.71828, 0.367879})));
+ EXPECT_THAT(
+ m.ExtractVector<float>(m.output()),
+ NnapiArrayFloatNear({2.71828, 1, 0.367879, 2.71828, 2.71828, 0.367879}));
EXPECT_THAT(m.GetTensorShape(m.output()), ElementsAreArray({3, 1, 2}));
}
@@ -1691,7 +1705,7 @@ TEST(Elementwise, Log) {
m.PopulateTensor<float>(m.input(), {1, 3.1415926, 1, 1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.ExtractVector<float>(m.output()),
- ElementsAreArray(ArrayFloatNear({0, 1.14473, 0, 0})));
+ NnapiArrayFloatNear({0, 1.14473, 0, 0}));
EXPECT_THAT(m.GetTensorShape(m.output()), ElementsAreArray({1, 1, 4, 1}));
}
@@ -1700,7 +1714,7 @@ TEST(Elementwise, Rsqrt) {
m.PopulateTensor<float>(m.input(), {1, 2, 4, 9});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.ExtractVector<float>(m.output()),
- ElementsAreArray(ArrayFloatNear({1, 0.7071, 0.5, 0.33333})));
+ NnapiArrayFloatNear({1, 0.7071, 0.5, 0.33333}));
EXPECT_THAT(m.GetTensorShape(m.output()), ElementsAreArray({1, 1, 4, 1}));
}
@@ -1709,7 +1723,7 @@ TEST(Elementwise, Sin) {
m.PopulateTensor<float>(m.input(), {0, 3.1415926, -3.1415926, 1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.ExtractVector<float>(m.output()),
- ElementsAreArray(ArrayFloatNear({0, 0, 0, 0.84147})));
+ NnapiArrayFloatNear({0, 0, 0, 0.84147}));
EXPECT_THAT(m.GetTensorShape(m.output()), ElementsAreArray({1, 1, 4, 1}));
}
@@ -1718,7 +1732,7 @@ TEST(Elementwise, Sqrt) {
m.PopulateTensor<float>(m.input(), {0, 1, 2, 4});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.ExtractVector<float>(m.output()),
- ElementsAreArray(ArrayFloatNear({0, 1, 1.41421, 2})));
+ NnapiArrayFloatNear({0, 1, 1.41421, 2}));
EXPECT_THAT(m.GetTensorShape(m.output()), ElementsAreArray({1, 1, 4, 1}));
}
@@ -1753,8 +1767,7 @@ TEST(NNAPIDelegate, SubWithNoActivation) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.7, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.3, 0.5});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(),
- ElementsAreArray(ArrayFloatNear({-2.1, 0.0, 0.4, 0.3})));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-2.1, 0.0, 0.4, 0.3}));
}
class FloatDivOpModel : public SingleOpModelWithNNAPI {
@@ -1788,7 +1801,7 @@ TEST(NNAPIDelegate, DivWithNoActivation) {
m.PopulateTensor<float>(m.input1(), {-2.0, 0.2, 0.8, 0.8});
m.PopulateTensor<float>(m.input2(), {0.1, 0.2, 0.4, 0.2});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray(ArrayFloatNear({-20, 1, 2, 4})));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({-20, 1, 2, 4}));
}
class BaseConcatenationOpModel : public SingleOpModelWithNNAPI {
@@ -1828,7 +1841,7 @@ TEST(NNAPIDelegate, ConcatenationThreeDimensionalOneInput) {
/*num_inputs=*/1);
m0.SetInput(0, {1.0f, 3.0f, 4.0f, 7.0f});
ASSERT_EQ(m0.Invoke(), kTfLiteOk);
- EXPECT_THAT(m0.GetOutput(), ElementsAreArray({1, 3, 4, 7}));
+ EXPECT_THAT(m0.GetOutput(), NnapiArrayFloatNear({1, 3, 4, 7}));
}
TEST(NNAPIDelegate, ConcatenationFourInputs) {
@@ -1840,7 +1853,7 @@ TEST(NNAPIDelegate, ConcatenationFourInputs) {
m0.SetInput(3, {1.3f, 3.3f, 4.3f, 7.3f});
ASSERT_EQ(m0.Invoke(), kTfLiteOk);
EXPECT_THAT(m0.GetOutput(),
- ElementsAreArray({
+ NnapiArrayFloatNear({
1.0f, 3.0f, 1.1f, 3.1f, 1.2f, 3.2f, 1.3f, 3.3f, //
4.0f, 7.0f, 4.1f, 7.1f, 4.2f, 7.2f, 4.3f, 7.3f, //
}));
@@ -1991,7 +2004,7 @@ TEST(NNAPIDelegate, FloorSingleDim) {
FloorOpModel model({2}, TensorType_FLOAT32);
model.PopulateTensor<float>(model.input(), {8.5, 0.0});
ASSERT_EQ(model.Invoke(), kTfLiteOk);
- EXPECT_THAT(model.GetOutput(), ElementsAreArray({8, 0}));
+ EXPECT_THAT(model.GetOutput(), NnapiArrayFloatNear({8, 0}));
EXPECT_THAT(model.GetOutputShape(), ElementsAreArray({2}));
}
@@ -2011,7 +2024,7 @@ TEST(NNAPIDelegate, FloorMultiDims) {
});
ASSERT_EQ(model.Invoke(), kTfLiteOk);
EXPECT_THAT(model.GetOutput(),
- ElementsAreArray({0, 8, 0, 9, 0, -1, -9, -1, -10, -1}));
+ NnapiArrayFloatNear({0, 8, 0, 9, 0, -1, -9, -1, -10, -1}));
EXPECT_THAT(model.GetOutputShape(), ElementsAreArray({2, 1, 1, 5}));
}
@@ -2046,9 +2059,8 @@ TEST(NNAPIDelegate, LocalResponseNormSameAsL2Norm) {
m.SetInput({-1.1, 0.6, 0.7, 1.2, -0.7, 0.1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
// The result is every input divided by 2.
- EXPECT_THAT(
- m.GetOutput(),
- ElementsAreArray(ArrayFloatNear({-0.55, 0.3, 0.35, 0.6, -0.35, 0.05})));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-0.55, 0.3, 0.35, 0.6, -0.35, 0.05}));
}
TEST(NNAPIDelegate, LocalResponseNormWithAlpha) {
@@ -2057,8 +2069,8 @@ TEST(NNAPIDelegate, LocalResponseNormWithAlpha) {
m.SetInput({-1.1, 0.6, 0.7, 1.2, -0.7, 0.1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
// The result is every input divided by 3.
- EXPECT_THAT(m.GetOutput(), ElementsAreArray(ArrayFloatNear(
- {-0.275, 0.15, 0.175, 0.3, -0.175, 0.025})));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-0.275, 0.15, 0.175, 0.3, -0.175, 0.025}));
}
TEST(NNAPIDelegate, LocalResponseNormWithBias) {
@@ -2067,9 +2079,8 @@ TEST(NNAPIDelegate, LocalResponseNormWithBias) {
m.SetInput({-1.1, 0.6, 0.7, 1.2, -0.7, 0.1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
// The result is every input divided by 5.
- EXPECT_THAT(
- m.GetOutput(),
- ElementsAreArray(ArrayFloatNear({-0.22, 0.12, 0.14, 0.24, -0.14, 0.02})));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-0.22, 0.12, 0.14, 0.24, -0.14, 0.02}));
}
TEST(NNAPIDelegate, LocalResponseNormSmallRadius) {
@@ -2077,10 +2088,9 @@ TEST(NNAPIDelegate, LocalResponseNormSmallRadius) {
/*alpha=*/4.0, /*beta=*/0.5);
m.SetInput({-1.1, 0.6, 0.7, 1.2, -0.7, 0.1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(
- m.GetOutput(),
- ElementsAreArray(ArrayFloatNear(
- {-0.264926, 0.125109, 0.140112, 0.267261, -0.161788, 0.0244266})));
+ EXPECT_THAT(m.GetOutput(),
+ NnapiArrayFloatNear({-0.264926, 0.125109, 0.140112, 0.267261,
+ -0.161788, 0.0244266}));
}
class LSHProjectionOpModel : public SingleOpModelWithNNAPI {
@@ -2256,7 +2266,7 @@ TEST(NNAPIDelegate, Relu) {
3, -2, 10, 1, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0, 0, 2, 4, //
3, 0, 10, 1, //
}));
@@ -2270,7 +2280,7 @@ TEST(NNAPIDelegate, Relu1) {
0.3, -2.0, 1.1, -0.1, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0.0, -0.6, 0.2, -0.4, //
0.3, -1.0, 1.0, -0.1, //
}));
@@ -2284,7 +2294,7 @@ TEST(NNAPIDelegate, Relu6) {
3, -2, 10, 1, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0, 0, 2, 4, //
3, 0, 6, 1, //
}));
@@ -2298,10 +2308,10 @@ TEST(NNAPIDelegate, LogisticFloat) {
3, -2, 10, 1, //
});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray(ArrayFloatNear({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0.5, 0.002473, 0.880797, 0.982014, //
0.952574, 0.119203, 0.999955, 0.731059, //
- })));
+ }));
}
TEST(NNAPIDelegate, LogisticQuantized) {
@@ -2369,16 +2379,14 @@ TEST(ResizeBilinear, Horizontal) {
m.SetInput<float>({3, 6});
m.SetSize({1, 3});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput<float>(),
- ElementsAreArray(ArrayFloatNear({3, 5, 6})));
+ EXPECT_THAT(m.GetOutput<float>(), NnapiArrayFloatNear({3, 5, 6}));
}
TEST(ResizeBilinear, HorizontalConstant) {
ResizeBilinearOpModel const_m({TensorType_FLOAT32, {1, 1, 2, 1}}, {1, 3});
const_m.SetInput<float>({3, 6});
ASSERT_EQ(const_m.Invoke(), kTfLiteOk);
- EXPECT_THAT(const_m.GetOutput<float>(),
- ElementsAreArray(ArrayFloatNear({3, 5, 6})));
+ EXPECT_THAT(const_m.GetOutput<float>(), NnapiArrayFloatNear({3, 5, 6}));
}
TEST(ResizeBilinear, Vertical) {
@@ -2386,16 +2394,14 @@ TEST(ResizeBilinear, Vertical) {
m.SetInput<float>({3, 9});
m.SetSize({3, 1});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput<float>(),
- ElementsAreArray(ArrayFloatNear({3, 7, 9})));
+ EXPECT_THAT(m.GetOutput<float>(), NnapiArrayFloatNear({3, 7, 9}));
}
TEST(ResizeBilinear, VerticalConstant) {
ResizeBilinearOpModel const_m({TensorType_FLOAT32, {1, 2, 1, 1}}, {3, 1});
const_m.SetInput<float>({3, 9});
ASSERT_EQ(const_m.Invoke(), kTfLiteOk);
- EXPECT_THAT(const_m.GetOutput<float>(),
- ElementsAreArray(ArrayFloatNear({3, 7, 9})));
+ EXPECT_THAT(const_m.GetOutput<float>(), NnapiArrayFloatNear({3, 7, 9}));
}
TEST(ResizeBilinear, TwoDimensional) {
@@ -2406,11 +2412,11 @@ TEST(ResizeBilinear, TwoDimensional) {
});
m.SetSize({3, 3});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput<float>(), ElementsAreArray(ArrayFloatNear({
+ EXPECT_THAT(m.GetOutput<float>(), NnapiArrayFloatNear({
3, 5, 6, //
7, 9, 10, //
9, 11, 12, //
- })));
+ }));
}
TEST(ResizeBilinear, TwoDimensionalConstant) {
@@ -2420,11 +2426,11 @@ TEST(ResizeBilinear, TwoDimensionalConstant) {
9, 12 //
});
ASSERT_EQ(const_m.Invoke(), kTfLiteOk);
- EXPECT_THAT(const_m.GetOutput<float>(), ElementsAreArray(ArrayFloatNear({
+ EXPECT_THAT(const_m.GetOutput<float>(), NnapiArrayFloatNear({
3, 5, 6, //
7, 9, 10, //
9, 11, 12, //
- })));
+ }));
}
template <typename T>
@@ -2487,8 +2493,8 @@ TEST(NNAPIDelegate, PadAdvancedConstTest) {
m.SetInput({1, 2, 3, 4, 5, 6});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutput(),
- ElementsAreArray({0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
+ NnapiArrayFloatNear({0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 7, 1}));
}
@@ -2538,8 +2544,8 @@ TEST(NNAPIDelegate, SpaceToBatchNDSimpleConstTest) {
m.SetInput({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({4, 2, 2, 1}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1, 3, 9, 11, 2, 4, 10, 12, 5, 7,
- 13, 15, 6, 8, 14, 16}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1, 3, 9, 11, 2, 4, 10, 12, 5,
+ 7, 13, 15, 6, 8, 14, 16}));
}
TEST(NNAPIDelegate, SpaceToBatchNDMultipleInputBatchesConstTest) {
@@ -2547,8 +2553,8 @@ TEST(NNAPIDelegate, SpaceToBatchNDMultipleInputBatchesConstTest) {
m.SetInput({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({8, 1, 2, 1}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1, 3, 9, 11, 2, 4, 10, 12, 5, 7,
- 13, 15, 6, 8, 14, 16}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1, 3, 9, 11, 2, 4, 10, 12, 5,
+ 7, 13, 15, 6, 8, 14, 16}));
}
TEST(NNAPIDelegate, SpaceToBatchNDSimplePaddingConstTest) {
@@ -2556,7 +2562,7 @@ TEST(NNAPIDelegate, SpaceToBatchNDSimplePaddingConstTest) {
m.SetInput({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({6, 2, 2, 1}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0, 0, 0, 5, 0, 0, 0, 6, 0, 1, 0, 7,
0, 2, 0, 8, 0, 3, 0, 9, 0, 4, 0, 10,
}));
@@ -2567,7 +2573,7 @@ TEST(NNAPIDelegate, SpaceToBatchNDComplexPaddingConstTest) {
m.SetInput({1, 2, 3, 4, 5, 6, 7, 8});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({6, 2, 4, 1}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0,
0, 1, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0,
0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
@@ -2623,7 +2629,7 @@ TEST(StridedSliceOpTest, In1D) {
m.SetInput({1, 2, 3, 4});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({2}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({2, 3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({2, 3}));
}
TEST(StridedSliceOpTest, In1D_BeginMask) {
@@ -2631,7 +2637,7 @@ TEST(StridedSliceOpTest, In1D_BeginMask) {
m.SetInput({1, 2, 3, 4});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({3}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1, 2, 3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1, 2, 3}));
}
TEST(StridedSliceOpTest, In2D_Stride2) {
@@ -2640,7 +2646,7 @@ TEST(StridedSliceOpTest, In2D_Stride2) {
m.SetInput({1, 2, 3, 4, 5, 6});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 2}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1, 3}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1, 3}));
}
TEST(StridedSliceOpTest, In2D_EndMask) {
@@ -2649,7 +2655,7 @@ TEST(StridedSliceOpTest, In2D_EndMask) {
m.SetInput({1, 2, 3, 4, 5, 6});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 3}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({4, 5, 6}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({4, 5, 6}));
}
TEST(StridedSliceOpTest, In3D_IdentityShrinkAxis4) {
@@ -2658,7 +2664,7 @@ TEST(StridedSliceOpTest, In3D_IdentityShrinkAxis4) {
m.SetInput({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({2, 3}));
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({1, 3, 5, 7, 9, 11}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({1, 3, 5, 7, 9, 11}));
}
static float rnn_input[] = {
@@ -2885,7 +2891,7 @@ TEST(NNAPIDelegate, RnnBlackBoxTest) {
expected.insert(expected.end(), golden_start, golden_end);
expected.insert(expected.end(), golden_start, golden_end);
- EXPECT_THAT(rnn.GetOutput(), ElementsAreArray(ArrayFloatNear(expected)));
+ EXPECT_THAT(rnn.GetOutput(), NnapiArrayFloatNear(expected));
}
}
@@ -4803,7 +4809,7 @@ TEST(NNAPIDelegate, MeanFloatNotKeepDims) {
m.SetInput(data);
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({2}));
- EXPECT_THAT(m.GetOutput<float>(), ElementsAreArray(ArrayFloatNear({12, 13})));
+ EXPECT_THAT(m.GetOutput<float>(), NnapiArrayFloatNear({12, 13}));
}
TEST(NNAPIDelegate, MeanFloatKeepDims) {
@@ -4815,8 +4821,7 @@ TEST(NNAPIDelegate, MeanFloatKeepDims) {
m.SetInput(data);
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 3, 1}));
- EXPECT_THAT(m.GetOutput<float>(),
- ElementsAreArray(ArrayFloatNear({10.5, 12.5, 14.5})));
+ EXPECT_THAT(m.GetOutput<float>(), NnapiArrayFloatNear({10.5, 12.5, 14.5}));
}
class BaseEmbeddingLookupOpModel : public SingleOpModelWithNNAPI {
@@ -4871,11 +4876,11 @@ TEST(NNAPIDelegate, EmbeddingLookupSimpleTest) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutput(),
- ElementsAreArray(ArrayFloatNear({
+ NnapiArrayFloatNear({
1.00, 1.01, 1.02, 1.03, 1.10, 1.11, 1.12, 1.13, // Row 1
0.00, 0.01, 0.02, 0.03, 0.10, 0.11, 0.12, 0.13, // Row 0
2.00, 2.01, 2.02, 2.03, 2.10, 2.11, 2.12, 2.13, // Row 2
- })));
+ }));
}
class HashtableLookupOpModel : public SingleOpModelWithNNAPI {
@@ -4955,12 +4960,12 @@ TEST(NNAPIDelegate, HashtableLookupTest2DInput) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray(ArrayFloatNear({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
2.0, 2.1, // 2-nd item
0, 0, // Not found
0.0, 0.1, // 0-th item
1.0, 1.1, // 1-st item
- })));
+ }));
EXPECT_THAT(m.GetHit(), ElementsAreArray({
1,
0,
@@ -4978,12 +4983,12 @@ TEST(NNAPIDelegate, HashtableLookupTest1DInput) {
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray(ArrayFloatNear({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0.4, // 2-nd item
0, // Not found
0.0, // 0-th item
0.1, // 1-st item
- })));
+ }));
EXPECT_THAT(m.GetHit(), ElementsAreArray({
1,
0,
@@ -5039,7 +5044,7 @@ TEST(NNAPIDelegate, PReluFloat) {
});
m.SetAlpha({0.0f, 1.0f, 2.0f});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({
0.0f, 0.0f, 0.0f, // Row 1, Column 1
1.0f, 1.0f, 1.0f, // Row 1, Column 2
0.0f, -1.0f, -2.0f, // Row 2, Column 1
@@ -5150,8 +5155,8 @@ TEST(PadV2OpTest, SimpleConstTest) {
{TensorType_FLOAT32});
m.SetInput({1, 2, 3, 4});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({0, 0, 0, 0, 0, 1, 2, 0, 0, 3, 4,
- 0, 0, 0, 0, 0}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({0, 0, 0, 0, 0, 1, 2, 0, 0, 3,
+ 4, 0, 0, 0, 0, 0}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 4, 1}));
}
@@ -5162,8 +5167,8 @@ TEST(PadV2OpTest, SimpleConstFloat32ValuedTestUint8) {
{0, 0, 1, 1, 1, 1, 0, 0}, 5, {TensorType_FLOAT32});
m.SetInput({1, 2, 3, 4});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({5, 5, 5, 5, 5, 1, 2, 5, 5, 3, 4,
- 5, 5, 5, 5, 5}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({5, 5, 5, 5, 5, 1, 2, 5, 5, 3,
+ 4, 5, 5, 5, 5, 5}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 4, 1}));
}
@@ -5174,7 +5179,7 @@ TEST(PadV2OpTest, Simple4DConstFloat32ValuedTest) {
{0, 1, 0, 0, 0, 0, 0, 1}, 5, {TensorType_FLOAT32});
m.SetInput({3, 3});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({3, 5, 3, 5, 5, 5, 5, 5}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({3, 5, 3, 5, 5, 5, 5, 5}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({2, 1, 2, 2}));
}
@@ -5184,8 +5189,8 @@ TEST(PadV2OpTest, SimpleDynamicTest) {
m.SetInput({1, 2, 3, 4});
m.SetPaddings({0, 0, 1, 1, 1, 1, 0, 0});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({0, 0, 0, 0, 0, 1, 2, 0, 0, 3, 4,
- 0, 0, 0, 0, 0}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({0, 0, 0, 0, 0, 1, 2, 0, 0, 3,
+ 4, 0, 0, 0, 0, 0}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 4, 1}));
}
@@ -5195,8 +5200,8 @@ TEST(PadV2OpTest, SimpleDynamicValuedTest) {
m.SetInput({1, 2, 3, 4});
m.SetPaddings({0, 0, 1, 1, 1, 1, 0, 0});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
- EXPECT_THAT(m.GetOutput(), ElementsAreArray({5, 5, 5, 5, 5, 1, 2, 5, 5, 3, 4,
- 5, 5, 5, 5, 5}));
+ EXPECT_THAT(m.GetOutput(), NnapiArrayFloatNear({5, 5, 5, 5, 5, 1, 2, 5, 5, 3,
+ 4, 5, 5, 5, 5, 5}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 4, 1}));
}
@@ -5206,8 +5211,8 @@ TEST(PadV2OpTest, AdvancedConstTest) {
m.SetInput({1, 2, 3, 4, 5, 6});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutput(),
- ElementsAreArray({0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
+ NnapiArrayFloatNear({0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 7, 1}));
}
@@ -5218,8 +5223,8 @@ TEST(PadV2OpTest, AdvancedDynamicTest) {
m.SetPaddings({0, 0, 0, 2, 1, 3, 0, 0});
ASSERT_EQ(m.Invoke(), kTfLiteOk);
EXPECT_THAT(m.GetOutput(),
- ElementsAreArray({0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
+ NnapiArrayFloatNear({0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
EXPECT_THAT(m.GetOutputShape(), ElementsAreArray({1, 4, 7, 1}));
}
diff --git a/third_party/absl/abseil-cpp/Android.bp b/third_party/absl/abseil-cpp/Android.bp
index 0b0ea6befe9..c45a8404651 100644
--- a/third_party/absl/abseil-cpp/Android.bp
+++ b/third_party/absl/abseil-cpp/Android.bp
@@ -30,29 +30,53 @@ license {
],
}
+filegroup {
+ name: "absl_srcs",
+ srcs: [
+ "absl/**/*.cc",
+ ],
+ exclude_srcs: [
+ "absl/random/**/*.cc",
+ "**/*_test.cc",
+ "**/*_test_common.cc",
+ "**/*test_util.cc",
+ "**/*test_utils.cc",
+ "**/*benchmark.cc",
+ "absl/hash/internal/print_hash_of.cc",
+ ],
+}
+
+// Only include necessary random files here. If include "absl/random/*.cc", we
+// will get "duplicate symbol: main" error because both
+// gaussian_distribution_gentables.cc and randen_benchmarks.cc have main
+// function.
+filegroup {
+ name: "absl_random",
+ srcs: [
+ "absl/random/discrete_distribution.cc",
+ "absl/random/gaussian_distribution.cc",
+ "absl/random/seed_sequences.cc",
+ "absl/random/internal/pool_urbg.cc",
+ "absl/random/internal/seed_material.cc",
+ ],
+}
+
cc_library_static {
name: "tensorflow_abseil",
export_include_dirs: ["."],
visibility: [
"//external/tensorflow:__subpackages__",
+ "//external/federated-compute:__subpackages__",
"//packages/modules/OnDevicePersonalization:__subpackages__",
],
apex_available: [
"com.android.ondevicepersonalization",
],
srcs: [
- "absl/**/*.cc",
+ ":absl_srcs",
+ ":absl_random",
],
sdk_version: "current",
min_sdk_version: "30",
stl: "libc++_static",
- exclude_srcs: [
- "**/*_test.cc",
- "**/*_test_common.cc",
- "**/*test_util.cc",
- "**/*test_utils.cc",
- "**/*benchmark.cc",
- "absl/random/benchmarks.cc",
- "absl/hash/internal/print_hash_of.cc",
- ],
}