1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/optimization_guide/core/delivery/model_info.h"
#include "base/containers/contains.h"
#include "base/memory/ptr_util.h"
#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "components/optimization_guide/core/delivery/model_util.h"
namespace optimization_guide {
ModelInfo::ModelInfo(const base::FilePath& model_file_path,
const base::flat_map<base::FilePath::StringType,
base::FilePath>& additional_files,
const int64_t version,
const std::optional<proto::Any>& model_metadata)
: model_file_path_(model_file_path),
additional_files_(additional_files),
version_(version),
model_metadata_(model_metadata) {}
ModelInfo::~ModelInfo() = default;
ModelInfo::ModelInfo(const ModelInfo&) = default;
// static
std::unique_ptr<ModelInfo> ModelInfo::Create(
const proto::PredictionModel& model) {
std::optional<base::FilePath> model_file_path =
StringToFilePath(model.model().download_url());
if (!model_file_path) {
return nullptr;
}
if (!model.model_info().has_version()) {
return nullptr;
}
base::flat_map<base::FilePath::StringType, base::FilePath> additional_files;
for (const proto::AdditionalModelFile& additional_file :
model.model_info().additional_files()) {
std::optional<base::FilePath> additional_file_path =
StringToFilePath(additional_file.file_path());
if (!additional_file_path) {
continue;
}
if (!additional_file_path->IsAbsolute()) {
NOTREACHED() << FilePathToString(*additional_file_path);
}
additional_files[additional_file_path->BaseName().value()] =
*additional_file_path;
}
std::optional<proto::Any> model_metadata;
if (model.model_info().has_model_metadata()) {
model_metadata = model.model_info().model_metadata();
}
// Private ctor, so we can't use std::make_unique.
return base::WrapUnique(new ModelInfo(*model_file_path, additional_files,
model.model_info().version(),
model_metadata));
}
base::FilePath ModelInfo::GetModelFilePath() const {
return model_file_path_;
}
base::flat_set<base::FilePath> ModelInfo::GetAdditionalFiles() const {
base::flat_set<base::FilePath> files;
for (auto it = additional_files_.begin(); it != additional_files_.end();
it++) {
files.insert(it->second);
}
return files;
}
std::optional<base::FilePath> ModelInfo::GetAdditionalFileWithBaseName(
const base::FilePath::StringType& base_name) const {
if (base::Contains(additional_files_, base_name)) {
return additional_files_.at(base_name);
}
return std::nullopt;
}
int64_t ModelInfo::GetVersion() const {
return version_;
}
std::optional<proto::Any> ModelInfo::GetModelMetadata() const {
return model_metadata_;
}
} // namespace optimization_guide
|