ml: use approximate equality for text suggester tests

We are currently in the process of enabling the text suggestion model
for all boards (excluding 2gb boards). This includes a number of arm, x86_64
and arm64 devices.

The current integration tests written for the text suggester model have
been written for and run on x86_64 devices. When running the same
integration tests on arm boards the scoring emitted for candidates is
approximately the same but not EXACTLY equal.

In light of this upcoming change, this CL updates the integration tests
to use an EXPECT_NEAR assertion for candidate scoring with a allowable
delta of 0.0015 which covers both arm and x86_64 boards.

BUG=chromium:1146266
TEST=cros_run_unit_tests --board=${BOARD} --packages chromeos-base/ml
TEST=The above line has been run on the following boards;
TEST=nocturne -> x86_64
TEST=strongbad -> arm
TEST=trogdor64 -> arm64

Change-Id: Ic04568493e66c2f1fb9403bc21fa71779c5bebec
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/3239291
Tested-by: Curtis McMullan <curtismcmullan@chromium.org>
Commit-Queue: Curtis McMullan <curtismcmullan@chromium.org>
Reviewed-by: Andrew Moylan <amoylan@chromium.org>
diff --git a/ml/machine_learning_service_impl_test.cc b/ml/machine_learning_service_impl_test.cc
index 01bb6cb..dc3c4d3 100644
--- a/ml/machine_learning_service_impl_test.cc
+++ b/ml/machine_learning_service_impl_test.cc
@@ -1728,6 +1728,8 @@
 
  protected:
   mojo::Remote<TextSuggester> suggester_;
+
+  const float scoring_equality_delta_ = 0.0015f;
 };
 
 TEST_F(TextSuggesterTest, LoadModelAndGenerateCompletionCandidate) {
@@ -1751,18 +1753,19 @@
   suggester_->Suggest(
       std::move(query),
       base::BindOnce(
-          [](bool* infer_callback_done, const TextSuggesterResultPtr result) {
+          [](bool* infer_callback_done, float equality_delta,
+             const TextSuggesterResultPtr result) {
             EXPECT_EQ(result->status, TextSuggesterResult::Status::OK);
             ASSERT_EQ(result->candidates.size(), 1);
             ASSERT_TRUE(result->candidates.at(0)->is_multi_word());
             EXPECT_EQ(result->candidates.at(0)->get_multi_word()->text,
                       "you doing");
-            EXPECT_EQ(
+            EXPECT_NEAR(
                 result->candidates.at(0)->get_multi_word()->normalized_score,
-                -0.680989f);
+                -0.680989f, equality_delta);
             *infer_callback_done = true;
           },
-          &infer_callback_done));
+          &infer_callback_done, scoring_equality_delta_));
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(infer_callback_done);
 }
@@ -1782,18 +1785,19 @@
   suggester_->Suggest(
       std::move(query),
       base::BindOnce(
-          [](bool* infer_callback_done, const TextSuggesterResultPtr result) {
+          [](bool* infer_callback_done, float equality_delta,
+             const TextSuggesterResultPtr result) {
             EXPECT_EQ(result->status, TextSuggesterResult::Status::OK);
             ASSERT_EQ(result->candidates.size(), 1);
             ASSERT_TRUE(result->candidates.at(0)->is_multi_word());
             EXPECT_EQ(result->candidates.at(0)->get_multi_word()->text,
                       "you doing");
-            EXPECT_EQ(
+            EXPECT_NEAR(
                 result->candidates.at(0)->get_multi_word()->normalized_score,
-                -0.8141749f);
+                -0.8141749f, equality_delta);
             *infer_callback_done = true;
           },
-          &infer_callback_done));
+          &infer_callback_done, scoring_equality_delta_));
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(infer_callback_done);
 }
@@ -1856,18 +1860,19 @@
   suggester_->Suggest(
       std::move(query),
       base::BindOnce(
-          [](bool* infer_callback_done, const TextSuggesterResultPtr result) {
+          [](bool* infer_callback_done, float equality_delta,
+             const TextSuggesterResultPtr result) {
             EXPECT_EQ(result->status, TextSuggesterResult::Status::OK);
             ASSERT_EQ(result->candidates.size(), 1);
             ASSERT_TRUE(result->candidates.at(0)->is_multi_word());
             EXPECT_EQ(result->candidates.at(0)->get_multi_word()->text,
                       "aren\'t you");
-            EXPECT_EQ(
+            EXPECT_NEAR(
                 result->candidates.at(0)->get_multi_word()->normalized_score,
-                -0.13418171f);
+                -0.13418171f, equality_delta);
             *infer_callback_done = true;
           },
-          &infer_callback_done));
+          &infer_callback_done, scoring_equality_delta_));
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(infer_callback_done);
 }
diff --git a/ml/text_suggestions_test.cc b/ml/text_suggestions_test.cc
index 8eb3d02..c7e3e93 100644
--- a/ml/text_suggestions_test.cc
+++ b/ml/text_suggestions_test.cc
@@ -10,6 +10,8 @@
 namespace ml {
 namespace {
 
+const float kScoringEqualityDelta = 0.0015f;
+
 TEST(TextSuggestionsTest, CanLoadLibrary) {
   auto* const instance = ml::TextSuggestions::GetInstance();
   if (IsAsan()) {
@@ -56,8 +58,8 @@
   ASSERT_GT(result.candidates_size(), 0);
   EXPECT_EQ(result.candidates(0).has_multi_word(), true);
   EXPECT_EQ(result.candidates(0).multi_word().text(), "you doing");
-  EXPECT_FLOAT_EQ(result.candidates(0).multi_word().normalized_score(),
-                  -0.680989f);
+  EXPECT_NEAR(result.candidates(0).multi_word().normalized_score(), -0.680989f,
+              kScoringEqualityDelta);
 
   instance->DestroyTextSuggester(suggester);
 }
@@ -86,8 +88,8 @@
   ASSERT_GT(result.candidates_size(), 0);
   ASSERT_EQ(result.candidates(0).has_multi_word(), true);
   EXPECT_EQ(result.candidates(0).multi_word().text(), "you doing");
-  EXPECT_FLOAT_EQ(result.candidates(0).multi_word().normalized_score(),
-                  -0.8141749f);
+  EXPECT_NEAR(result.candidates(0).multi_word().normalized_score(), -0.8141749f,
+              kScoringEqualityDelta);
 
   instance->DestroyTextSuggester(suggester);
 }
@@ -149,8 +151,8 @@
   ASSERT_GT(result.candidates_size(), 0);
   EXPECT_EQ(result.candidates(0).has_multi_word(), true);
   EXPECT_EQ(result.candidates(0).multi_word().text(), "aren\'t you");
-  EXPECT_FLOAT_EQ(result.candidates(0).multi_word().normalized_score(),
-                  -0.13418171f);
+  EXPECT_NEAR(result.candidates(0).multi_word().normalized_score(),
+              -0.13418171f, kScoringEqualityDelta);
 
   instance->DestroyTextSuggester(suggester);
 }
@@ -185,8 +187,8 @@
   ASSERT_GT(result.candidates_size(), 0);
   EXPECT_EQ(result.candidates(0).has_multi_word(), true);
   EXPECT_EQ(result.candidates(0).multi_word().text(), "aren\'t you");
-  EXPECT_FLOAT_EQ(result.candidates(0).multi_word().normalized_score(),
-                  -0.13418171f);
+  EXPECT_NEAR(result.candidates(0).multi_word().normalized_score(),
+              -0.13418171f, kScoringEqualityDelta);
 
   instance->DestroyTextSuggester(suggester);
 }
@@ -221,8 +223,8 @@
   ASSERT_GT(result.candidates_size(), 0);
   EXPECT_EQ(result.candidates(0).has_multi_word(), true);
   EXPECT_EQ(result.candidates(0).multi_word().text(), "the morning");
-  EXPECT_FLOAT_EQ(result.candidates(0).multi_word().normalized_score(),
-                  -0.5560128f);
+  EXPECT_NEAR(result.candidates(0).multi_word().normalized_score(), -0.5560128f,
+              kScoringEqualityDelta);
 
   instance->DestroyTextSuggester(suggester);
 }
@@ -257,8 +259,8 @@
   ASSERT_GT(result.candidates_size(), 0);
   EXPECT_EQ(result.candidates(0).has_multi_word(), true);
   EXPECT_EQ(result.candidates(0).multi_word().text(), "the morning");
-  EXPECT_FLOAT_EQ(result.candidates(0).multi_word().normalized_score(),
-                  -0.5560128f);
+  EXPECT_NEAR(result.candidates(0).multi_word().normalized_score(), -0.5560128f,
+              kScoringEqualityDelta);
 
   instance->DestroyTextSuggester(suggester);
 }