123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "ceres/single_linkage_clustering.h"
- #include <unordered_map>
- #include <unordered_set>
- #include "ceres/graph.h"
- #include "ceres/graph_algorithms.h"
- namespace ceres::internal {
- int ComputeSingleLinkageClustering(
- const SingleLinkageClusteringOptions& options,
- const WeightedGraph<int>& graph,
- std::unordered_map<int, int>* membership) {
- CHECK(membership != nullptr);
- membership->clear();
-
- const std::unordered_set<int>& vertices = graph.vertices();
- for (const int v : vertices) {
- (*membership)[v] = v;
- }
- for (const int vertex1 : vertices) {
- const std::unordered_set<int>& neighbors = graph.Neighbors(vertex1);
- for (const int vertex2 : neighbors) {
-
-
- if ((vertex1 > vertex2) ||
- (graph.EdgeWeight(vertex1, vertex2) < options.min_similarity)) {
- continue;
- }
-
- const int c1 = FindConnectedComponent(vertex1, membership);
- const int c2 = FindConnectedComponent(vertex2, membership);
- if (c1 == c2) {
- continue;
- }
- if (c1 < c2) {
- (*membership)[c2] = c1;
- } else {
- (*membership)[c1] = c2;
- }
- }
- }
-
-
- int num_clusters = 0;
- for (auto& m : *membership) {
- m.second = FindConnectedComponent(m.first, membership);
- if (m.first == m.second) {
- ++num_clusters;
- }
- }
- return num_clusters;
- }
- }
|