/*
|
* Copyright (C) 2018 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.
|
*/
|
|
#include "annotator/types.h"
|
|
namespace libtextclassifier3 {
|
|
logging::LoggingStringStream& operator<<(logging::LoggingStringStream& stream,
|
const Token& token) {
|
if (!token.is_padding) {
|
return stream << "Token(\"" << token.value << "\", " << token.start << ", "
|
<< token.end << ")";
|
} else {
|
return stream << "Token()";
|
}
|
}
|
|
namespace {
|
std::string FormatMillis(int64 time_ms_utc) {
|
long time_seconds = time_ms_utc / 1000; // NOLINT
|
char buffer[512];
|
strftime(buffer, sizeof(buffer), "%a %Y-%m-%d %H:%M:%S %Z",
|
localtime(&time_seconds));
|
return std::string(buffer);
|
}
|
} // namespace
|
|
logging::LoggingStringStream& operator<<(logging::LoggingStringStream& stream,
|
const DatetimeParseResultSpan& value) {
|
stream << "DatetimeParseResultSpan({" << value.span.first << ", "
|
<< value.span.second << "}, {";
|
for (const DatetimeParseResult& data : value.data) {
|
stream << "{/*time_ms_utc=*/ " << data.time_ms_utc << " /* "
|
<< FormatMillis(data.time_ms_utc) << " */, /*granularity=*/ "
|
<< data.granularity << "}, ";
|
}
|
stream << "})";
|
return stream;
|
}
|
|
logging::LoggingStringStream& operator<<(logging::LoggingStringStream& stream,
|
const ClassificationResult& result) {
|
return stream << "ClassificationResult(" << result.collection
|
<< ", /*score=*/ " << result.score << ", /*priority_score=*/ "
|
<< result.priority_score << ")";
|
}
|
|
logging::LoggingStringStream& operator<<(
|
logging::LoggingStringStream& stream,
|
const std::vector<ClassificationResult>& results) {
|
stream = stream << "{\n";
|
for (const ClassificationResult& result : results) {
|
stream = stream << " " << result << "\n";
|
}
|
stream = stream << "}";
|
return stream;
|
}
|
|
logging::LoggingStringStream& operator<<(logging::LoggingStringStream& stream,
|
const AnnotatedSpan& span) {
|
std::string best_class;
|
float best_score = -1;
|
if (!span.classification.empty()) {
|
best_class = span.classification[0].collection;
|
best_score = span.classification[0].score;
|
}
|
return stream << "Span(" << span.span.first << ", " << span.span.second
|
<< ", " << best_class << ", " << best_score << ")";
|
}
|
|
logging::LoggingStringStream& operator<<(logging::LoggingStringStream& stream,
|
const DateParseData& data) {
|
// TODO(zilka): Add human-readable form of field_set_mask and the enum fields.
|
stream = stream << "DateParseData {\n";
|
stream = stream << " field_set_mask: " << data.field_set_mask << "\n";
|
stream = stream << " year: " << data.year << "\n";
|
stream = stream << " month: " << data.month << "\n";
|
stream = stream << " day_of_month: " << data.day_of_month << "\n";
|
stream = stream << " hour: " << data.hour << "\n";
|
stream = stream << " minute: " << data.minute << "\n";
|
stream = stream << " second: " << data.second << "\n";
|
stream = stream << " ampm: " << static_cast<int>(data.ampm) << "\n";
|
stream = stream << " zone_offset: " << data.zone_offset << "\n";
|
stream = stream << " dst_offset: " << data.dst_offset << "\n";
|
stream = stream << " relation: " << static_cast<int>(data.relation) << "\n";
|
stream = stream << " relation_type: " << static_cast<int>(data.relation_type)
|
<< "\n";
|
stream = stream << " relation_distance: " << data.relation_distance << "\n";
|
stream = stream << "}";
|
return stream;
|
}
|
|
} // namespace libtextclassifier3
|