|
Boost-Commit : |
From: franklin.jonathan_at_[hidden]
Date: 2008-05-08 16:05:47
Author: jfranklin
Date: 2008-05-08 16:05:46 EDT (Thu, 08 May 2008)
New Revision: 45227
URL: http://svn.boost.org/trac/boost/changeset/45227
Log:
Added some concept checking, and renamed a few template parameters.
Added:
sandbox/boost/algorithm/cluster/concept.hpp (contents, props changed)
Text files modified:
sandbox/boost/algorithm/cluster/cluster_data.hpp | 9 ++++-
sandbox/boost/algorithm/cluster/dbscan.hpp | 65 +++++++++++++++++++++++----------------
2 files changed, 45 insertions(+), 29 deletions(-)
Modified: sandbox/boost/algorithm/cluster/cluster_data.hpp
==============================================================================
--- sandbox/boost/algorithm/cluster/cluster_data.hpp (original)
+++ sandbox/boost/algorithm/cluster/cluster_data.hpp 2008-05-08 16:05:46 EDT (Thu, 08 May 2008)
@@ -1,3 +1,8 @@
+// (C) Copyright Jonathan Franklin 2008.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
#if ! defined BOOST_ALGORITHM_CLUSTER_CLUSTER_DATA_HPP
#define BOOST_ALGORITHM_CLUSTER_CLUSTER_DATA_HPP
@@ -13,10 +18,10 @@
/*! TODO: Document this type.
*/
-template<typename Cluster>
+template<typename ClusterT>
struct cluster_data
{
- typedef Cluster value_type;
+ typedef ClusterT value_type;
typedef std::vector<value_type> clusters;
cluster_data() : m_pClusters(new clusters) {}
~cluster_data() {}
Added: sandbox/boost/algorithm/cluster/concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/boost/algorithm/cluster/concept.hpp 2008-05-08 16:05:46 EDT (Thu, 08 May 2008)
@@ -0,0 +1,38 @@
+// (C) Copyright Jonathan Franklin 2008.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if ! defined BOOST_ALGORITHM_CLUSTER_CONCEPT_HPP
+#define BOOST_ALGORITHM_CLUSTER_CONCEPT_HPP
+
+#include <boost/concept_check.hpp>
+
+namespace boost
+{
+namespace algorithm
+{
+namespace cluster
+{
+
+ // TODO: Document the purpose of this concept.
+ template<typename T, typename DistanceFunT>
+ struct DistanceComparableConcept
+ {
+ void constraints()
+ {
+ // Operation
+ d(t, t);
+ }
+ private:
+ T t;
+ DistanceFunT d;
+ };
+
+ // TODO: Add concepts here, then delete this comment.
+
+} // End of namespace cluster;
+} // End of namespace algorithm;
+} // End of namespace boost;
+
+#endif // BOOST_ALGORITHM_CLUSTER_CONCEPT_HPP
Modified: sandbox/boost/algorithm/cluster/dbscan.hpp
==============================================================================
--- sandbox/boost/algorithm/cluster/dbscan.hpp (original)
+++ sandbox/boost/algorithm/cluster/dbscan.hpp 2008-05-08 16:05:46 EDT (Thu, 08 May 2008)
@@ -1,7 +1,13 @@
+// (C) Copyright Jonathan Franklin 2008.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
#if ! defined BOOST_ALGORITHM_CLUSTER_DBSCAN_HPP
#define BOOST_ALGORITHM_CLUSTER_DBSCAN_HPP
#include <boost/algorithm/cluster/cluster_data.hpp>
+#include <boost/algorithm/cluster/concept.hpp>
#include <vector>
namespace boost
@@ -13,19 +19,22 @@
namespace detail
{
+// TODO: Where should we put these?
+int const UNCLASSIFIED = -1;
+int const NOISE = 0;
// TODO: Replace this naive query function w/ R*-tree or fractional cascading.
// This query mechanism makes the runtime quadratic.
-template<typename NTupleIter, typename DistFun>
+template<typename NTupleIterT, typename DistFunT>
static void query(
- NTupleIter const & query_pt,
- NTupleIter const & begin,
- NTupleIter const & end,
- typename NTupleIter::difference_type eps,
- DistFun const & d,
- std::vector<NTupleIter> & v)
+ NTupleIterT const & query_pt,
+ NTupleIterT const & begin,
+ NTupleIterT const & end,
+ typename NTupleIterT::difference_type eps,
+ DistFunT const & d,
+ std::vector<NTupleIterT> & v)
{
- for(NTupleIter cur_pt = begin; cur_pt != end; ++cur_pt)
+ for(NTupleIterT cur_pt = begin; cur_pt != end; ++cur_pt)
{
if (query_pt == cur_pt)
continue;
@@ -38,12 +47,12 @@
}
// TODO: Replace this so we don't have to store the cluster info for each tuple?
-template<typename NTupleIter>
+template<typename NTupleIterT>
struct node
{
- node(NTupleIter const & t) : tuple(t), cluster(UNCLASSIFIED) {}
+ node(NTupleIterT const & t) : tuple(t), cluster(UNCLASSIFIED) {}
- NTupleIter tuple;
+ NTupleIterT tuple;
int cluster;
};
@@ -58,31 +67,33 @@
* \param[in] d
* \return The cluster data (partitioning of the tuples).
*/
-template<typename Cluster, typename NTupleIter, typename DistFun>
-cluster_data<Cluster>
-dbscan(NTupleIter const & begin,
- NTupleIter const & end,
- typename NTupleIter::difference_type const & eps,
+template<typename ClusterT, typename NTupleIterT, typename DistFunT>
+cluster_data<ClusterT>
+dbscan(NTupleIterT const & begin,
+ NTupleIterT const & end,
+ typename NTupleIterT::difference_type const & eps,
size_t min_points,
- DistFun const & d)
+ DistFunT const & d)
{
- int const UNCLASSIFIED = -1;
- int const NOISE = 0;
+ // Concept check.
+ function_requires<
+ DistanceComparableConcept<typename NTupleIterT::value_type, DistFunT> >();
+ //DistanceComparableConcept<int, DistFunT> >();
// TODO: Rework the algorithm to NOT make this extra collection?
- typedef detail::node<NTupleIter> node;
+ typedef detail::node<NTupleIterT> node;
typedef std::vector<node> ntuple_nodes;
ntuple_nodes tuples;
// Initialize algorithm.
//size_t num_elems = 0;
- for(NTupleIter it = begin; it != end; ++it)
+ for(NTupleIterT it = begin; it != end; ++it)
{
//++num_elems;
tuples.push_back(node(it));
}
- typedef cluster_data<std::vector<NTupleIter> > cluster_data;
+ typedef cluster_data<std::vector<NTupleIterT> > cluster_data;
cluster_data p;
// TODO: We should try to make cluster_num go away.
@@ -90,7 +101,7 @@
for(ntuple_nodes::iterator it = tuples.begin(); it != tuples.end(); ++it)
{
// Skip this tuple if its already been classified as a cluster or noise.
- if (it->cluster != UNCLASSIFIED)
+ if (it->cluster != detail::UNCLASSIFIED)
continue;
// Expand cluster.
@@ -100,14 +111,14 @@
// If the neighborhood of this tuple is too small, then mark it as noise.
if (seeds.size() < min_points)
{
- it->cluster = NOISE;
+ it->cluster = detail::NOISE;
continue;
}
// Start the next cluster.
++cluster_num;
- p.push_back(Cluster()); // TODO: This is goofy.
- Cluster & cur_cluster = p.back();
+ p.push_back(ClusterT()); // TODO: This is goofy.
+ ClusterT & cur_cluster = p.back();
// Mark entire neighborhood as part of the current cluster.
it->cluster = cluster_num;
@@ -134,7 +145,7 @@
{
if (results[n]->cluster < 1) // Not assigned to cluster yet.
{
- if (UNCLASSIFIED == results[n]->cluster)
+ if (detail::UNCLASSIFIED == results[n]->cluster)
seeds.push_back(results[n]);
results[n]->cluster = cluster_num;
cur_cluster.push_back(results[n]->tuple);
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk