chromium/ash/public/cpp/tab_cluster/clusterer.h

// 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_