#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 {
int cluster_id = -1;
double boundary_strength = 0.0;
ClusterResult() = default;
~ClusterResult() = default;
ClusterResult(const ClusterResult&) = default;
};
class ASH_PUBLIC_EXPORT Clusterer {
public:
Clusterer();
~Clusterer();
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_;
std::map<std::string, ClusterResult> Cluster();
void AddEdge(const std::string& from_source, const std::string& to_source);
size_t GetNodeForSource(const std::string& source);
std::vector<std::string> GetSourcesFromCluster(std::vector<int> cluster);
};
}
#endif