// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_PUBLIC_CPP_TAB_CLUSTER_CLUSTERER_H_
#define ASH_PUBLIC_CPP_TAB_CLUSTER_CLUSTERER_H_
#include <vector>
#include "ash/public/cpp/ash_public_export.h"
#include "ash/public/cpp/tab_cluster/correlation_clusterer.h"
#include "ash/public/cpp/tab_cluster/undirected_graph.h"
namespace ash {
class TabClusterUIItem;
using TabItems = std::vector<std::unique_ptr<TabClusterUIItem>>;
struct ASH_PUBLIC_EXPORT ClusterResult {
// The cluster_id of the node.
int cluster_id = -1;
// Boundary Strength of the cluster the node belong to, S = Iu/Eu
// Iu is the sum of internal edge weights of a cluster
// Eu is the sum of external edge weights of a cluster
// Refer to go/bento-suggest-metrics
double boundary_strength = 0.0;
ClusterResult() = default;
~ClusterResult() = default;
ClusterResult(const ClusterResult&) = default;
};
// The main class in charge of giving cluster result to `TabClusterUIController`
class ASH_PUBLIC_EXPORT Clusterer {
public:
Clusterer();
~Clusterer();
// Updates Cluster info based on given information and returns
// a list of tab items that are updated.
std::vector<TabClusterUIItem*> GetUpdatedClusterInfo(
const TabItems& tab_items,
TabClusterUIItem* old_active_item,
TabClusterUIItem* new_active_item);
private:
UndirectedGraph graph_;
CorrelationClusterer correlation_clusterer_;
std::map<std::string, size_t> source_to_node_;
std::map<size_t, std::string> node_to_source_;
// Clusters the current graph and return `ClusterResult` for all sources.
std::map<std::string, ClusterResult> Cluster();
// Adds tab switch as an edge in `graph_`.
void AddEdge(const std::string& from_source, const std::string& to_source);
// Returns the node_id of a given `source`, adds to `source_to_node_` if not
// yet existed.
size_t GetNodeForSource(const std::string& source);
// Given a cluster of node_id, returns a cluster of sources.
std::vector<std::string> GetSourcesFromCluster(std::vector<int> cluster);
};
} // namespace ash
#endif // ASH_PUBLIC_CPP_TAB_CLUSTER_CLUSTERER_H_