Skip to content

Commit

Permalink
[SpatialPartitioning] Change part of the kdtree API
Browse files Browse the repository at this point in the history
  • Loading branch information
Amael Marquez committed Dec 11, 2023
1 parent 9b42731 commit 7ef62b9
Show file tree
Hide file tree
Showing 9 changed files with 37 additions and 31 deletions.
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() const;
inline void print(std::ostream& os) 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, Ponca::KdTreeBase<Traits>& kdtree)
{
kdtree.print(os);
return os;
}
22 changes: 10 additions & 12 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,31 +95,29 @@ bool KdTreeBase<Traits>::valid() const
}

template<typename Traits>
std::string KdTreeBase<Traits>::to_string() const
void KdTreeBase<Traits>::print(std::ostream& os) const
{
if (m_indices.empty()) return "";
if (m_indices.empty()) return;

std::stringstream str;
str << "indices (" << index_count() << ") :\n";
for(IndexType i=0; i<index_count(); ++i)
os << "indices (" << sample_count() << ") :\n";
for(IndexType i=0; i<sample_count(); ++i)
{
str << " " << i << ": " << m_indices.operator[](i) << "\n";
os << " " << i << ": " << m_indices.operator[](i) << "\n";
}
str << "nodes (" << node_count() << ") :\n";
os << "nodes (" << node_count() << ") :\n";
for(NodeIndexType n=0; n< node_count(); ++n)
{
const NodeType& node = m_nodes.operator[](n);
if(node.is_leaf())
{
auto end = node.leaf_start() + node.leaf_size();
str << " leaf: start=" << node.leaf_start() << " end=" << end << " (size=" << node.leaf_size() << ")\n";
os << " leaf: start=" << node.leaf_start() << " end=" << end << " (size=" << node.leaf_size() << ")\n";
}
else
{
str << " node: dim=" << node.inner_dim() << " split=" << node.inner_split_value() << " child=" << node.inner_first_child_id() << "\n";
os << " node: dim=" << node.inner_dim() << " split=" << node.inner_split_value() << " child=" << node.inner_first_child_id() << "\n";
}
}
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
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 7ef62b9

Please sign in to comment.