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
|
// 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.
#ifndef CHROME_BROWSER_ASH_POWER_ML_SMART_DIM_ML_AGENT_H_
#define CHROME_BROWSER_ASH_POWER_ML_SMART_DIM_ML_AGENT_H_
#include <optional>
#include "base/cancelable_callback.h"
#include "base/no_destructor.h"
#include "chrome/browser/ash/power/ml/smart_dim/builtin_worker.h"
#include "chrome/browser/ash/power/ml/smart_dim/download_worker.h"
#include "chrome/browser/ash/power/ml/smart_dim/smart_dim_worker.h"
#include "chrome/browser/ash/power/ml/user_activity_event.pb.h"
namespace ash {
namespace power {
namespace ml {
using DimDecisionCallback =
base::OnceCallback<void(std::optional<UserActivityEvent::ModelPrediction>)>;
// SmartDimMlAgent is responsible for preprocessing the features and requesting
// the inference from machine learning service.
// Usage:
//
// SmartDimMlAgent::GetInstance()->RequestDimDecision(
// features_, dim_decision_callback);
class SmartDimMlAgent {
public:
static SmartDimMlAgent* GetInstance();
SmartDimMlAgent(const SmartDimMlAgent&) = delete;
SmartDimMlAgent& operator=(const SmartDimMlAgent&) = delete;
// Post a request to determine whether an upcoming dim should go ahead based
// on input |features|. When a decision is arrived at, it is returned via
// |callback|.
//
// If this method is called again before the |callback| from a previous call
// has completed, or if the dim decision is explicitly canceled via
// |CancelPreviousRequest()| below, the previous |callback| will be invoked
// with an empty optional<ModelPrediction>.
void RequestDimDecision(const UserActivityEvent::Features& features,
DimDecisionCallback callback);
void CancelPreviousRequest();
// Called by CUS(component update service). When new version of the component
// downloaded, CUS first uses IsDownloadWorkerReady to see if download worker
// is ready. If it's not, CUS then uses OnComponentReady to update the
// download metainfo, preprocessor and model.
bool IsDownloadWorkerReady();
void OnComponentReady(const ComponentFileContents& contents);
// Called by ml_agent_unittest.cc to reset the builtin and download worker.
void ResetForTesting();
DownloadWorker* download_worker_for_test() { return &download_worker_; }
protected:
SmartDimMlAgent();
virtual ~SmartDimMlAgent();
private:
friend base::NoDestructor<SmartDimMlAgent>;
// Return download_worker_ if it's ready, otherwise builtin_worker_.
SmartDimWorker* GetWorker();
BuiltinWorker builtin_worker_;
DownloadWorker download_worker_;
base::CancelableOnceCallback<void(
std::optional<UserActivityEvent::ModelPrediction>)>
cancelable_dim_decision_callback_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace ml
} // namespace power
} // namespace ash
#endif // CHROME_BROWSER_ASH_POWER_ML_SMART_DIM_ML_AGENT_H_
|