| 169 | // found between expected and actual. |
| 170 | template <typename NativeT> |
| 171 | Status Equal(LiteralSlice expected, LiteralSlice actual, |
| 172 | absl::Span<int64> multi_index, int64 dimension, |
| 173 | Literal* mismatched = nullptr) { |
| 174 | if (dimension == expected.shape().dimensions_size()) { |
| 175 | NativeT expected_value = expected.Get<NativeT>(multi_index); |
| 176 | NativeT actual_value = actual.Get<NativeT>(multi_index); |
| 177 | bool result = |
| 178 | CompareEqual<NativeT>(expected_value, actual_value, multi_index); |
| 179 | if (mismatched) { |
| 180 | mismatched->Set<bool>(multi_index, !result); |
| 181 | } |
| 182 | return result ? Status::OK() |
| 183 | : MakeErrorStatus<NativeT>(expected_value, actual_value, |
| 184 | multi_index); |
| 185 | } |
| 186 | |
| 187 | Status result; |
| 188 | for (int64 i = 0; i < expected.shape().dimensions(dimension); ++i) { |
| 189 | multi_index[dimension] = i; |
| 190 | if (mismatched != nullptr) { |
| 191 | result.Update(Equal<NativeT>(expected, actual, multi_index, dimension + 1, |
| 192 | mismatched)); |
| 193 | } else { |
| 194 | TF_RETURN_IF_ERROR(Equal<NativeT>(expected, actual, multi_index, |
| 195 | dimension + 1, mismatched)); |
| 196 | } |
| 197 | } |
| 198 | return result; |
| 199 | } |
| 200 | |
| 201 | // Gets the total element count. For tuples, this is not the count of tuple |
| 202 | // elements, but the sum of elements of each tuple element. |
no test coverage detected