#include "hdbscanRunner.hpp" #include "hdbscanResult.hpp" #include "hdbscanParameters.hpp" #include "../Distance/EuclideanDistance.hpp" #include "../Distance/ManhattanDistance.hpp" #include "../HdbscanStar/hdbscanAlgorithm.hpp" #include "../HdbscanStar/undirectedGraph.hpp" #include "../HdbscanStar/cluster.hpp" #include "../HdbscanStar/outlierScore.hpp" using namespace hdbscanStar; hdbscanResult hdbscanRunner::run(hdbscanParameters parameters) { int numPoints = parameters.dataset.size() != 0 ? parameters.dataset.size() : parameters.distances.size(); hdbscanAlgorithm algorithm; hdbscanResult result; if (parameters.distances.size() == 0) { std::vector> distances(numPoints); for (int i = 0; i < numPoints; i++) { distances[i].resize(numPoints); // distances[i]=std::vector(numPoints); for (int j = 0; j < i; j++) { if (parameters.distanceFunction.length() == 0) { // Default to Euclidean EuclideanDistance EDistance; double distance; distance = EDistance.computeDistance(parameters.dataset[i], parameters.dataset[j]); distances[i][j] = distance; distances[j][i] = distance; } else if (parameters.distanceFunction == "Euclidean") { EuclideanDistance EDistance; double distance; distance = EDistance.computeDistance(parameters.dataset[i], parameters.dataset[j]); distances[i][j] = distance; distances[j][i] = distance; } else if (parameters.distanceFunction == "Manhattan") { ManhattanDistance MDistance; double distance; distance = MDistance.computeDistance(parameters.dataset[i], parameters.dataset[j]); distances[i][j] = distance; distances[j][i] = distance; } } } parameters.distances = distances; } std::vector coreDistances = algorithm.calculateCoreDistances(parameters.distances, parameters.minPoints); undirectedGraph mst = algorithm.constructMst(parameters.distances, coreDistances, true); mst.quicksortByEdgeWeight(); std::vector pointNoiseLevels(numPoints); std::vector pointLastClusters(numPoints); std::vector> hierarchy; std::vector clusters; algorithm.computeHierarchyAndClusterTree(&mst, parameters.minClusterSize, parameters.constraints, hierarchy, pointNoiseLevels, pointLastClusters, clusters); bool infiniteStability = algorithm.propagateTree(clusters); std::vector prominentClusters = algorithm.findProminentClusters(clusters, hierarchy, numPoints); std::vector membershipProbabilities = algorithm.findMembershipScore(prominentClusters, coreDistances); std::vector scores = algorithm.calculateOutlierScores( clusters, pointNoiseLevels, pointLastClusters, coreDistances); return hdbscanResult(prominentClusters, scores, membershipProbabilities, infiniteStability); }