Calc mean squere error correctly.

MODEL_NAME_mean_squere_error gives MSE for a value in an
output vector measured against expected outputs.

Test: NeuralNetworksApiBenchmark
Bug: 109953668
Change-Id: I713360107e0133a603c8f22e15acfffaf589c173
Merged-In: I713360107e0133a603c8f22e15acfffaf589c173
(cherry picked from commit e71e349061b411359089c1af31c9479f7f8e97c2)
diff --git a/libnnbenchmark/run_tflite.cpp b/libnnbenchmark/run_tflite.cpp
index aa9f09d..5a108db 100644
--- a/libnnbenchmark/run_tflite.cpp
+++ b/libnnbenchmark/run_tflite.cpp
@@ -80,7 +80,6 @@
     return true;
 }
 
-
 float BenchmarkModel::getOutputError(const uint8_t* expected_data, size_t length) {
       int output = mTfliteInterpreter->outputs()[0];
       auto* output_tensor = mTfliteInterpreter->tensor(output);
@@ -88,10 +87,12 @@
           FATAL("Wrong size of output tensor, expected %zu, is %zu", output_tensor->bytes, length);
       }
 
+      size_t elements_count = 0;
       float err_sum = 0.0;
       switch (output_tensor->type) {
           case kTfLiteUInt8: {
               uint8_t* output_raw = mTfliteInterpreter->typed_tensor<uint8_t>(output);
+              elements_count = output_tensor->bytes;
               for (size_t i = 0;i < output_tensor->bytes; ++i) {
                   float err = ((float)output_raw[i]) - ((float)expected_data[i]);
                   err_sum += err*err;
@@ -101,6 +102,7 @@
           case kTfLiteFloat32: {
               const float* expected = reinterpret_cast<const float*>(expected_data);
               float* output_raw = mTfliteInterpreter->typed_tensor<float>(output);
+              elements_count = output_tensor->bytes / sizeof(float);
               for (size_t i = 0;i < output_tensor->bytes / sizeof(float); ++i) {
                   float err = output_raw[i] - expected[i];
                   err_sum += err*err;
@@ -110,8 +112,7 @@
           default:
               FATAL("Output sensor type %d not supported", output_tensor->type);
       }
-
-      return err_sum;
+      return err_sum / elements_count;
 }
 
 bool BenchmarkModel::resizeInputTensors(std::vector<int> shape) {
diff --git a/src/com/example/android/nn/benchmark/NNTest.java b/src/com/example/android/nn/benchmark/NNTest.java
index 08c3819..0258294 100644
--- a/src/com/example/android/nn/benchmark/NNTest.java
+++ b/src/com/example/android/nn/benchmark/NNTest.java
@@ -152,7 +152,7 @@
         results.putFloat(testName + "_avg", bmValue.getMeanTimeSec() * 1000.0f);
         results.putFloat(testName + "_std_dev", bmValue.mTimeStdDeviation * 1000.0f);
         results.putFloat(testName + "_total_time", bmValue.mTotalTimeSec * 1000.0f);
-        results.putFloat(testName + "_error", bmValue.mTotalError);
+        results.putFloat(testName + "_mean_square_error", bmValue.mTotalError / bmValue.mIterations);
         results.putInt(testName + "_iterations", bmValue.mIterations);
         getInstrumentation().sendStatus(Activity.RESULT_OK, results);
     }