blob: 96cac280ba16ca9b204323995ce8b562367aba61 [file] [log] [blame]
// 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_