ATLAS Offline Software
Loading...
Searching...
No Matches
TrigVSI::DBScan< pointType > Class Template Reference

Class for operating DBSCAN clustering. More...

#include <DBScan.h>

Collaboration diagram for TrigVSI::DBScan< pointType >:

Public Types

using RegionFunc = std::function<std::vector<pointType>(const pointType&, double)>
 Function type for region query function.

Public Member Functions

 DBScan (const std::unordered_set< pointType > &, RegionFunc)
 Normal Constructor.
 DBScan ()
 Default constructor.
 ~DBScan ()
DBScanoperator= (DBScan &&) noexcept=default
 Move assignment operator.
 DBScan (DBScan &&) noexcept=default
 Move constructor.
std::vector< Cluster< pointType > > getClusters () const
 Retrun the list of clusters along with noise clusters.
size_t nClusters () const
const Cluster< pointType > & getCluster (size_t) const
 Retrieve cluster.
void clusterize (double, size_t)
 Generate clusters with DBSCAN algorithim.

Private Attributes

RegionFunc m_regionQuery
std::unordered_map< pointType, bool > m_pointsVisited
std::vector< Cluster< pointType > > m_clusters
std::unordered_set< pointType > m_noises
std::vector< Cluster< pointType > > m_noisesCluster

Detailed Description

template<typename pointType>
class TrigVSI::DBScan< pointType >

Class for operating DBSCAN clustering.

Pass set of points on construction, then execute clusterize() once. Set of points can only be read on construction so you need to make new DBSCAN instance when you want to add new points.

Definition at line 43 of file DBScan.h.

Member Typedef Documentation

◆ RegionFunc

template<typename pointType>
using TrigVSI::DBScan< pointType >::RegionFunc = std::function<std::vector<pointType>(const pointType&, double)>

Function type for region query function.

Definition at line 45 of file DBScan.h.

Constructor & Destructor Documentation

◆ DBScan() [1/3]

template<typename pointType>
TrigVSI::DBScan< pointType >::DBScan ( const std::unordered_set< pointType > & set,
RegionFunc regionQuery )

Normal Constructor.

Parameters
[in]setSet of points to be clustered.
[in]regionQueryRegion query function, which defines the algorithm to pick points nearby.

Definition at line 83 of file DBScan.h.

83 :
85{
86 m_pointsVisited.clear();
87 for (const auto& point : set) {
88 m_pointsVisited.emplace(point, false);
89 }
90}
Class for operating DBSCAN clustering.
Definition DBScan.h:43
std::unordered_map< pointType, bool > m_pointsVisited
Definition DBScan.h:61
RegionFunc m_regionQuery
Definition DBScan.h:60

◆ DBScan() [2/3]

template<typename pointType>
TrigVSI::DBScan< pointType >::DBScan ( )

Default constructor.

Definition at line 97 of file DBScan.h.

98{
99
100}

◆ ~DBScan()

template<typename pointType>
TrigVSI::DBScan< pointType >::~DBScan ( )
inline

Definition at line 48 of file DBScan.h.

48{};

◆ DBScan() [3/3]

template<typename pointType>
TrigVSI::DBScan< pointType >::DBScan ( DBScan< pointType > && )
defaultnoexcept

Move constructor.

Member Function Documentation

◆ clusterize()

template<typename pointType>
void TrigVSI::DBScan< pointType >::clusterize ( double eps,
size_t minN )

Generate clusters with DBSCAN algorithim.

Parameters
[in]epsRadius of region to find neighbor points.
[in]minNThreshold to determine point as core.

Definition at line 142 of file DBScan.h.

143{
144 m_clusters.clear();
145 m_noisesCluster.clear();
146 for (auto& pair : m_pointsVisited) {
147 const pointType& point = pair.first;
148
149 if ( pair.second ) continue; // Continue when the point is visited
150 pair.second = true; // Set the point as visited
152 if ( neighbor_points.size() < minN ) {
153 m_noises.emplace(point);
154 continue;
155 }
156
157 m_clusters.emplace_back( std::vector<pointType>{point} );
158 Cluster<pointType>& cls = *(--m_clusters.end());
159
160 for (size_t i = 0; i < neighbor_points.size(); i++) {
161 const auto& q = neighbor_points[i];
162
163 // Check if q is labeled as noise
164 // If so, remove q from noise lists and add q to cluster
165 auto q_itr_noise = m_noises.find(q);
166 if ( q_itr_noise != m_noises.end() ) {
167 m_noises.erase(q_itr_noise);
168 cls.Points().emplace_back(q);
169 }
170
171 // Check if q had been visited before
172 // If visited, q is already labeled as a noise or added to other cluster so skip it
173 // If not visited, label q as visited and add it to cluster
174 auto q_itr = m_pointsVisited.find(q);
175 if ( q_itr == m_pointsVisited.end() ) continue;
176 if ( q_itr->second ) continue;
177 q_itr->second = true;
178 cls.Points().emplace_back(q);
179
181 if ( q_neighbor_points.size() >= minN ) neighbor_points.insert( neighbor_points.end(), q_neighbor_points.begin(), q_neighbor_points.end() );
182 }
183
184 }
185
186 // Convert noises to one point clusters
187 for (const auto& q : m_noises) {
189 }
190}
std::vector< Cluster< pointType > > m_noisesCluster
Definition DBScan.h:64
std::unordered_set< pointType > m_noises
Definition DBScan.h:63
std::vector< Cluster< pointType > > m_clusters
Definition DBScan.h:62

◆ getCluster()

template<typename pointType>
const Cluster< pointType > & TrigVSI::DBScan< pointType >::getCluster ( size_t icls) const
inline

Retrieve cluster.

Parameters
[in]iclsIndex of the cluster.

Return different type of clusters depending on icls.

  • icls < size of cluster list; Return cluster
  • size of cluster list <= icls < (size of cluster list) + (size of noise list); Return cluster made from (icls - size of cluster list)th noise.

Definition at line 128 of file DBScan.h.

129{
131 return cls_tmp;
132}

◆ getClusters()

template<typename pointType>
std::vector< Cluster< pointType > > TrigVSI::DBScan< pointType >::getClusters ( ) const
inline

Retrun the list of clusters along with noise clusters.

Definition at line 107 of file DBScan.h.

108{
109 auto tmp = m_clusters;
110 const auto& tmp_noise = m_noisesCluster;
111 tmp.insert( tmp.end(), tmp_noise.begin(), tmp_noise.end() );
112 return tmp;
113}

◆ nClusters()

template<typename pointType>
size_t TrigVSI::DBScan< pointType >::nClusters ( ) const
inline

Definition at line 54 of file DBScan.h.

54{ return m_clusters.size() + m_noisesCluster.size(); };

◆ operator=()

template<typename pointType>
DBScan & TrigVSI::DBScan< pointType >::operator= ( DBScan< pointType > && )
defaultnoexcept

Move assignment operator.

Member Data Documentation

◆ m_clusters

template<typename pointType>
std::vector<Cluster<pointType> > TrigVSI::DBScan< pointType >::m_clusters
private

Definition at line 62 of file DBScan.h.

◆ m_noises

template<typename pointType>
std::unordered_set<pointType> TrigVSI::DBScan< pointType >::m_noises
private

Definition at line 63 of file DBScan.h.

◆ m_noisesCluster

template<typename pointType>
std::vector<Cluster<pointType> > TrigVSI::DBScan< pointType >::m_noisesCluster
private

Definition at line 64 of file DBScan.h.

◆ m_pointsVisited

template<typename pointType>
std::unordered_map<pointType, bool> TrigVSI::DBScan< pointType >::m_pointsVisited
private

Definition at line 61 of file DBScan.h.

◆ m_regionQuery

template<typename pointType>
RegionFunc TrigVSI::DBScan< pointType >::m_regionQuery
private

Definition at line 60 of file DBScan.h.


The documentation for this class was generated from the following file: