Skip to content

Commit

Permalink
Merge pull request #123 from azaleostu/kdtree-api-changes
Browse files Browse the repository at this point in the history
[SpatialPartitioning] Change part of the kdtree API
  • Loading branch information
nmellado authored Dec 18, 2023
2 parents 32bffeb + bf61fde commit 8f9df5f
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 48 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ Ponca changelog
--------------------------------------------------------------------------------
Current head (v.1.3 RC)

- API
- [SpatialPartitioning] Change part of the kdtree API (#123)

--------------------------------------------------------------------------------
v.1.2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class KdTreeKNearestQueryBase : public KdTreeQuery<Traits>, public QueryType

protected:
inline void search(){
KdTreeQuery<Traits>::search_internal(QueryType::getInputPosition(QueryAccelType::m_kdtree->point_data()),
KdTreeQuery<Traits>::search_internal(QueryType::getInputPosition(QueryAccelType::m_kdtree->points()),
[](IndexType, IndexType){},
[this](){return QueryType::descentDistanceThreshold();},
[this](IndexType idx){return QueryType::skipIndexFunctor(idx);},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class KdTreeNearestQueryBase : public KdTreeQuery<Traits>, public QueryType

protected:
inline void search(){
KdTreeQuery<Traits>::search_internal(QueryType::getInputPosition(QueryAccelType::m_kdtree->point_data()),
KdTreeQuery<Traits>::search_internal(QueryType::getInputPosition(QueryAccelType::m_kdtree->points()),
[](IndexType, IndexType){},
[this](){return QueryType::descentDistanceThreshold();},
[this](IndexType idx){return QueryType::skipIndexFunctor(idx);},
Expand Down
6 changes: 3 additions & 3 deletions Ponca/src/SpatialPartitioning/KdTree/Query/kdTreeQuery.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ class KdTreeQuery
ProcessNeighborFunctor processNeighborFunctor
)
{
const auto& nodes = m_kdtree->node_data();
const auto& points = m_kdtree->point_data();
const auto& indices = m_kdtree->index_data();
const auto& nodes = m_kdtree->nodes();
const auto& points = m_kdtree->points();
const auto& indices = m_kdtree->samples();

if (nodes.empty() || points.empty() || indices.empty())
throw std::invalid_argument("Empty KdTree");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ class KdTreeRangeQueryBase : public KdTreeQuery<Traits>, public QueryType

protected:
inline void advance(Iterator& it){
const auto& points = QueryAccelType::m_kdtree->point_data();
const auto& indices = QueryAccelType::m_kdtree->index_data();
const auto& points = QueryAccelType::m_kdtree->points();
const auto& indices = QueryAccelType::m_kdtree->samples();
const auto& point = QueryType::getInputPosition(points);

auto descentDistanceThreshold = [this](){return QueryType::descentDistanceThreshold();};
Expand Down
20 changes: 14 additions & 6 deletions Ponca/src/SpatialPartitioning/KdTree/kdTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include "./kdTreeTraits.h"

#include <iostream>
#include <memory>
#include <numeric>
#include <type_traits>
Expand Down Expand Up @@ -186,7 +187,7 @@ class KdTreeBase
Converter c);

inline bool valid() const;
inline std::string to_string(bool verbose = false) const;
inline void print(std::ostream& os, bool verbose = false) const;

// Accessors ---------------------------------------------------------------
public:
Expand All @@ -195,7 +196,7 @@ class KdTreeBase
return m_nodes.size();
}

inline IndexType index_count() const
inline IndexType sample_count() const
{
return (IndexType)m_indices.size();
}
Expand All @@ -210,22 +211,22 @@ class KdTreeBase
return m_leaf_count;
}

inline PointContainer& point_data()
inline PointContainer& points()
{
return m_points;
};

inline const PointContainer& point_data() const
inline const PointContainer& points() const
{
return m_points;
};

inline const NodeContainer& node_data() const
inline const NodeContainer& nodes() const
{
return m_nodes;
}

inline const IndexContainer& index_data() const
inline const IndexContainer& samples() const
{
return m_indices;
}
Expand Down Expand Up @@ -295,3 +296,10 @@ public :

#include "./kdTree.hpp"
} // namespace Ponca

template <typename Traits>
std::ostream& operator<<(std::ostream& os, const Ponca::KdTreeBase<Traits>& kdtree)
{
kdtree.print(os);
return os;
}
52 changes: 24 additions & 28 deletions Ponca/src/SpatialPartitioning/KdTree/kdTree.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ inline void KdTreeBase<Traits>::buildWithSampling(PointUserContainer&& points,

m_indices = std::move(sampling);

this->build_rec(0, 0, index_count(), 1);
this->build_rec(0, 0, sample_count(), 1);

PONCA_DEBUG_ASSERT(this->valid());
}
Expand Down Expand Up @@ -73,7 +73,7 @@ bool KdTreeBase<Traits>::valid() const
const NodeType& node = m_nodes[n];
if(node.is_leaf())
{
if(index_count() <= node.leaf_start() || node.leaf_start()+node.leaf_size() > index_count())
if(sample_count() <= node.leaf_start() || node.leaf_start()+node.leaf_size() > sample_count())
{
return false;
}
Expand All @@ -95,52 +95,48 @@ bool KdTreeBase<Traits>::valid() const
}

template<typename Traits>
std::string KdTreeBase<Traits>::to_string(bool verbose) const
void KdTreeBase<Traits>::print(std::ostream& os, bool verbose) const
{
std::stringstream str;

str << "KdTree:";
str << "\n MaxNodes: " << MAX_NODE_COUNT;
str << "\n MaxPoints: " << MAX_POINT_COUNT;
str << "\n MaxDepth: " << Traits::MAX_DEPTH;
str << "\n PointCount: " << point_count();
str << "\n SampleCount: " << index_count();
str << "\n NodeCount: " << node_count();
os << "KdTree:";
os << "\n MaxNodes: " << MAX_NODE_COUNT;
os << "\n MaxPoints: " << MAX_POINT_COUNT;
os << "\n MaxDepth: " << Traits::MAX_DEPTH;
os << "\n PointCount: " << point_count();
os << "\n SampleCount: " << sample_count();
os << "\n NodeCount: " << node_count();

if (!verbose)
{
return str.str();
return;
}

str << "\n Samples: [";
os << "\n Samples: [";
static constexpr IndexType SAMPLES_PER_LINE = 10;
for (IndexType i = 0; i < index_count(); ++i)
for (IndexType i = 0; i < sample_count(); ++i)
{
str << (i == 0 ? "" : ",");
str << (i % SAMPLES_PER_LINE == 0 ? "\n " : " ");
str << m_indices[i];
os << (i == 0 ? "" : ",");
os << (i % SAMPLES_PER_LINE == 0 ? "\n " : " ");
os << m_indices[i];
}

str << "]\n Nodes:";
os << "]\n Nodes:";
for (NodeIndexType n = 0; n < node_count(); ++n)
{
const NodeType& node = m_nodes[n];
if (node.is_leaf())
{
str << "\n - Type: Leaf";
str << "\n Start: " << node.leaf_start();
str << "\n Size: " << node.leaf_size();
os << "\n - Type: Leaf";
os << "\n Start: " << node.leaf_start();
os << "\n Size: " << node.leaf_size();
}
else
{
str << "\n - Type: Inner";
str << "\n SplitDim: " << node.inner_split_dim();
str << "\n SplitValue: " << node.inner_split_value();
str << "\n FirstChild: " << node.inner_first_child_id();
os << "\n - Type: Inner";
os << "\n SplitDim: " << node.inner_split_dim();
os << "\n SplitValue: " << node.inner_split_value();
os << "\n FirstChild: " << node.inner_first_child_id();
}
}

return str.str();
}

template<typename Traits>
Expand Down
6 changes: 3 additions & 3 deletions Ponca/src/SpatialPartitioning/KnnGraph/knnGraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ template <typename Traits> class KnnGraphBase
/// \warning KdTreeTraits compatibility is checked with static assertion
template<typename KdTreeTraits>
inline KnnGraphBase(const KdTreeBase<KdTreeTraits>& kdtree, int k = 6)
: m_k(std::min(k,kdtree.index_count()-1)),
m_kdTreePoints(kdtree.point_data())
: m_k(std::min(k,kdtree.sample_count()-1)),
m_kdTreePoints(kdtree.points())
{
static_assert( std::is_same<typename Traits::DataPoint, typename KdTreeTraits::DataPoint>::value,
"KdTreeTraits::DataPoint is not equal to Traits::DataPoint" );
Expand All @@ -85,7 +85,7 @@ template <typename Traits> class KnnGraphBase
// \fixme Update API to properly handle kdtree subsampling
const int cloudSize = kdtree.point_count();
{
const int samplesSize = kdtree.index_count();
const int samplesSize = kdtree.sample_count();
eigen_assert(cloudSize == samplesSize);
}

Expand Down
2 changes: 1 addition & 1 deletion examples/cpp/ponca_basic_cpu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void test_fit(Fit& _fit, const KdTree<MyPoint>& tree, const VectorType& _p)
// Iterate over samples and _fit the primitive
for(int i : tree.range_neighbors(_p, tmax) )
{
_fit.addNeighbor( tree.point_data()[i] );
_fit.addNeighbor( tree.points()[i] );
}

//finalize fitting
Expand Down
2 changes: 1 addition & 1 deletion examples/cpp/ponca_customize_kdtree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ int main()
<< *kdtree.nearest_neighbor(query_pt).begin() << std::endl;

//! [ReadCustomProperties]
auto bbox = kdtree.node_data()[0].getAabb();
auto bbox = kdtree.nodes()[0].getAabb();
if (bbox) {
std::cout << "Root bounding box is as follows: \n"
<< " Center: " << bbox->center()
Expand Down
4 changes: 2 additions & 2 deletions tests/src/basket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ void testBasicFunctionalities(const KdTree<typename Fit::DataPoint>& tree, typen
typedef typename DataPoint::VectorType VectorType;
typedef typename Fit::WFunctor WeightFunc;

const auto& vectorPoints = tree.point_data();
const auto& vectorPoints = tree.points();

// Test for each point if the fitted sphere correspond to the theoretical sphere
#ifdef NDEBUG
Expand Down Expand Up @@ -135,7 +135,7 @@ void testIsSame(const KdTree<typename Fit1::DataPoint>& tree,
typedef typename Fit1::Scalar Scalar;
typedef typename Fit1::VectorType VectorType;
typedef typename Fit1::WFunctor WeightFunc;
const auto& vectorPoints = tree.point_data();
const auto& vectorPoints = tree.points();

// Test for each point if the fitted sphere correspond to the theoretical sphere
#ifdef NDEBUG
Expand Down

0 comments on commit 8f9df5f

Please sign in to comment.