summaryrefslogtreecommitdiff
path: root/src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h')
-rw-r--r--src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h400
1 files changed, 208 insertions, 192 deletions
diff --git a/src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h b/src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h
index d6d01439..49b0c022 100644
--- a/src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h
+++ b/src/Bottleneck_distance/include/gudhi/CGAL/Kd_tree_node.h
@@ -28,10 +28,10 @@
namespace CGAL {
- template <class SearchTraits, class Splitter, class UseExtendedNode>
+ template <class SearchTraits, class Splitter, class UseExtendedNode>
class Kd_tree;
- template < class TreeTraits, class Splitter, class UseExtendedNode >
+ template < class TreeTraits, class Splitter, class UseExtendedNode >
class Kd_tree_node {
friend class Kd_tree<TreeTraits,Splitter,UseExtendedNode>;
@@ -52,7 +52,7 @@ namespace CGAL {
bool leaf;
- public :
+ public :
Kd_tree_node(bool leaf_)
:leaf(leaf_){}
@@ -60,18 +60,18 @@ namespace CGAL {
return leaf;
}
- std::size_t
+ std::size_t
num_items() const
{
if (is_leaf()){
- Leaf_node_const_handle node =
+ Leaf_node_const_handle node =
static_cast<Leaf_node_const_handle>(this);
return node->size();
}
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- return node->lower()->num_items() + node->upper()->num_items();
+ return node->lower()->num_items() + node->upper()->num_items();
}
}
@@ -80,48 +80,48 @@ namespace CGAL {
{
if (is_leaf()) return 1;
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- return node->lower()->num_nodes() + node->upper()->num_nodes();
+ return node->lower()->num_nodes() + node->upper()->num_nodes();
}
}
- int
+ int
depth(const int current_max_depth) const
{
if (is_leaf()){
- return current_max_depth;
+ return current_max_depth;
}
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- return
- (std::max)( node->lower()->depth(current_max_depth + 1),
- node->upper()->depth(current_max_depth + 1));
+ return
+ (std::max)( node->lower()->depth(current_max_depth + 1),
+ node->upper()->depth(current_max_depth + 1));
}
}
- int
+ int
depth() const
{
- return depth(1);
+ return depth(1);
}
template <class OutputIterator>
- OutputIterator
+ OutputIterator
tree_items(OutputIterator it) const {
if (is_leaf()) {
- Leaf_node_const_handle node =
+ Leaf_node_const_handle node =
static_cast<Leaf_node_const_handle>(this);
- if (node->size()>0)
- for (iterator i=node->begin(); i != node->end(); i++)
- {*it=*i; ++it;}
- }
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ {*it=*i; ++it;}
+ }
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- it=node->lower()->tree_items(it);
- it=node->upper()->tree_items(it);
+ it=node->lower()->tree_items(it);
+ it=node->upper()->tree_items(it);
}
return it;
}
@@ -133,14 +133,14 @@ namespace CGAL {
if (is_leaf()) {
Leaf_node_const_handle node =
static_cast<Leaf_node_const_handle>(this);
- if (node->size()>0){
+ if (node->size()>0){
return boost::make_optional(*(node->begin()));
}
- }
+ }
else {
Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- result = node->lower()->any_tree_item();
+ result = node->lower()->any_tree_item();
if(! result){
result = node->upper()->any_tree_item();
}
@@ -149,75 +149,75 @@ namespace CGAL {
}
- void
+ void
indent(int d) const
{
for(int i = 0; i < d; i++){
- std::cout << " ";
+ std::cout << " ";
}
}
- void
- print(int d = 0) const
+ void
+ print(int d = 0) const
{
if (is_leaf()) {
- Leaf_node_const_handle node =
+ Leaf_node_const_handle node =
static_cast<Leaf_node_const_handle>(this);
- indent(d);
- std::cout << "leaf" << std::endl;
- if (node->size()>0)
- for (iterator i=node->begin(); i != node->end(); i++)
- {indent(d);std::cout << *i << std::endl;}
+ indent(d);
+ std::cout << "leaf" << std::endl;
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ {indent(d);std::cout << *i << std::endl;}
}
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- indent(d);
- std::cout << "lower tree" << std::endl;
- node->lower()->print(d+1);
- indent(d);
- std::cout << "separator: dim = " << node->cutting_dimension() << " val = " << node->cutting_value() << std::endl;
- indent(d);
- std::cout << "upper tree" << std::endl;
- node->upper()->print(d+1);
+ indent(d);
+ std::cout << "lower tree" << std::endl;
+ node->lower()->print(d+1);
+ indent(d);
+ std::cout << "separator: dim = " << node->cutting_dimension() << " val = " << node->cutting_value() << std::endl;
+ indent(d);
+ std::cout << "upper tree" << std::endl;
+ node->upper()->print(d+1);
}
}
template <class OutputIterator, class FuzzyQueryItem>
- OutputIterator
+ OutputIterator
search(OutputIterator it, const FuzzyQueryItem& q,
- Kd_tree_rectangle<FT,D>& b) const
+ Kd_tree_rectangle<FT,D>& b) const
{
- if (is_leaf()) {
- Leaf_node_const_handle node =
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
static_cast<Leaf_node_const_handle>(this);
- if (node->size()>0)
- for (iterator i=node->begin(); i != node->end(); i++)
- if (q.contains(*i))
- {*it++=*i;}
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ if (q.contains(*i))
+ {*it++=*i;}
}
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- // after splitting b denotes the lower part of b
- Kd_tree_rectangle<FT,D> b_upper(b);
- b.split(b_upper, node->cutting_dimension(),
- node->cutting_value());
-
- if (q.outer_range_contains(b))
- it=node->lower()->tree_items(it);
- else
- if (q.inner_range_intersects(b))
- it=node->lower()->search(it,q,b);
- if (q.outer_range_contains(b_upper))
- it=node->upper()->tree_items(it);
- else
- if (q.inner_range_intersects(b_upper))
- it=node->upper()->search(it,q,b_upper);
+ // after splitting b denotes the lower part of b
+ Kd_tree_rectangle<FT,D> b_upper(b);
+ b.split(b_upper, node->cutting_dimension(),
+ node->cutting_value());
+
+ if (q.outer_range_contains(b))
+ it=node->lower()->tree_items(it);
+ else
+ if (q.inner_range_intersects(b))
+ it=node->lower()->search(it,q,b);
+ if (q.outer_range_contains(b_upper))
+ it=node->upper()->tree_items(it);
+ else
+ if (q.inner_range_intersects(b_upper))
+ it=node->upper()->search(it,q,b_upper);
};
- return it;
+ return it;
}
@@ -227,99 +227,99 @@ namespace CGAL {
Kd_tree_rectangle<FT,D>& b) const
{
boost::optional<Point_d> result = boost::none;
- if (is_leaf()) {
- Leaf_node_const_handle node =
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
static_cast<Leaf_node_const_handle>(this);
- if (node->size()>0)
- for (iterator i=node->begin(); i != node->end(); i++)
- if (q.contains(*i))
- { result = *i; break; }
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ if (q.contains(*i))
+ { result = *i; break; }
}
else {
- Internal_node_const_handle node =
+ Internal_node_const_handle node =
static_cast<Internal_node_const_handle>(this);
- // after splitting b denotes the lower part of b
- Kd_tree_rectangle<FT,D> b_upper(b);
- b.split(b_upper, node->cutting_dimension(),
- node->cutting_value());
-
- if (q.outer_range_contains(b)){
+ // after splitting b denotes the lower part of b
+ Kd_tree_rectangle<FT,D> b_upper(b);
+ b.split(b_upper, node->cutting_dimension(),
+ node->cutting_value());
+
+ if (q.outer_range_contains(b)){
result = node->lower()->any_tree_item();
- }else{
- if (q.inner_range_intersects(b)){
- result = node->lower()->search_any_point(q,b);
+ }else{
+ if (q.inner_range_intersects(b)){
+ result = node->lower()->search_any_point(q,b);
}
}
if(result){
return result;
}
- if (q.outer_range_contains(b_upper)){
- result = node->upper()->any_tree_item();
- }else{
- if (q.inner_range_intersects(b_upper))
- result = node->upper()->search_any_point(q,b_upper);
+ if (q.outer_range_contains(b_upper)){
+ result = node->upper()->any_tree_item();
+ }else{
+ if (q.inner_range_intersects(b_upper))
+ result = node->upper()->search_any_point(q,b_upper);
}
}
- return result;
+ return result;
}
};
- template < class TreeTraits, class Splitter, class UseExtendedNode >
+ template < class TreeTraits, class Splitter, class UseExtendedNode >
class Kd_tree_leaf_node : public Kd_tree_node< TreeTraits, Splitter, UseExtendedNode >{
friend class Kd_tree<TreeTraits,Splitter,UseExtendedNode>;
-
+
typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::iterator iterator;
typedef Kd_tree_node< TreeTraits, Splitter, UseExtendedNode> Base;
typedef typename TreeTraits::Point_d Point_d;
private:
-
+
// private variables for leaf nodes
boost::int32_t n; // denotes number of items in a leaf node
iterator data; // iterator to data in leaf node
-
+
public:
-
+
// default constructor
- Kd_tree_leaf_node()
+ Kd_tree_leaf_node()
{}
- Kd_tree_leaf_node(bool leaf_ )
+ Kd_tree_leaf_node(bool leaf_ )
: Base(leaf_)
{}
- Kd_tree_leaf_node(bool leaf_,unsigned int n_ )
+ Kd_tree_leaf_node(bool leaf_,unsigned int n_ )
: Base(leaf_), n(n_)
{}
// members for all nodes
-
+
// members for leaf nodes only
- inline
- unsigned int
- size() const
- {
+ inline
+ unsigned int
+ size() const
+ {
return n;
}
-
- inline
+
+ inline
iterator
- begin() const
+ begin() const
{
return data;
}
- inline
- iterator
- end() const
+ inline
+ iterator
+ end() const
{
return data + n;
}
-
+
inline
void
drop_last_point()
@@ -331,7 +331,7 @@ namespace CGAL {
- template < class TreeTraits, class Splitter, class UseExtendedNode>
+ template < class TreeTraits, class Splitter, class UseExtendedNode>
class Kd_tree_internal_node : public Kd_tree_node< TreeTraits, Splitter, UseExtendedNode >{
friend class Kd_tree<TreeTraits,Splitter,UseExtendedNode>;
@@ -344,7 +344,7 @@ namespace CGAL {
typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Separator Separator;
private:
-
+
// private variables for internal nodes
boost::int32_t cut_dim;
FT cut_val;
@@ -352,50 +352,53 @@ namespace CGAL {
// private variables for extended internal nodes
- FT low_val;
- FT high_val;
-
+ FT upper_low_val;
+ FT upper_high_val;
+ FT lower_low_val;
+ FT lower_high_val;
+
+
public:
// default constructor
- Kd_tree_internal_node()
+ Kd_tree_internal_node()
{}
- Kd_tree_internal_node(bool leaf_)
+ Kd_tree_internal_node(bool leaf_)
: Base(leaf_)
{}
-
-
+
+
// members for internal node and extended internal node
- inline
- Node_const_handle
- lower() const
+ inline
+ Node_const_handle
+ lower() const
{
- return lower_ch;
+ return lower_ch;
}
- inline
- Node_const_handle
- upper() const
+ inline
+ Node_const_handle
+ upper() const
{
- return upper_ch;
+ return upper_ch;
}
- inline
- Node_handle
+ inline
+ Node_handle
lower()
{
- return lower_ch;
+ return lower_ch;
}
- inline
- Node_handle
+ inline
+ Node_handle
upper()
{
- return upper_ch;
+ return upper_ch;
}
-
+
inline
void
set_lower(Node_handle nh)
@@ -417,47 +420,60 @@ namespace CGAL {
cut_dim = sep.cutting_dimension();
cut_val = sep.cutting_value();
}
-
- inline
- FT
- cutting_value() const
+
+ inline
+ FT
+ cutting_value() const
{
return cut_val;
}
-
- inline
- int
- cutting_dimension() const
+
+ inline
+ int
+ cutting_dimension() const
{
return cut_dim;
}
// members for extended internal node only
- inline
+ inline
+ FT
+ upper_low_value() const
+ {
+ return upper_low_val;
+ }
+
+ inline
FT
- low_value() const
- {
- return low_val;
+ upper_high_value() const
+ {
+ return upper_high_val;
}
-
- inline
+
+ inline
FT
- high_value() const
+ lower_low_value() const
{
- return high_val;
+ return lower_low_val;
}
-
- /*Separator&
- separator()
+ inline
+ FT
+ lower_high_value() const
+ {
+ return lower_high_val;
+ }
+
+ /*Separator&
+ separator()
{
return Separator(cutting_dimension,cutting_value);
}*/
-
+
};//internal node
- template < class TreeTraits, class Splitter>
+ template < class TreeTraits, class Splitter>
class Kd_tree_internal_node<TreeTraits,Splitter,Tag_false> : public Kd_tree_node< TreeTraits, Splitter, Tag_false >{
friend class Kd_tree<TreeTraits,Splitter,Tag_false>;
@@ -470,54 +486,54 @@ namespace CGAL {
typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::Separator Separator;
private:
-
+
// private variables for internal nodes
boost::uint8_t cut_dim;
FT cut_val;
Node_handle lower_ch, upper_ch;
-
+
public:
// default constructor
- Kd_tree_internal_node()
+ Kd_tree_internal_node()
{}
- Kd_tree_internal_node(bool leaf_)
+ Kd_tree_internal_node(bool leaf_)
: Base(leaf_)
{}
-
-
+
+
// members for internal node and extended internal node
- inline
- Node_const_handle
- lower() const
+ inline
+ Node_const_handle
+ lower() const
{
- return lower_ch;
+ return lower_ch;
}
- inline
- Node_const_handle
- upper() const
+ inline
+ Node_const_handle
+ upper() const
{
- return upper_ch;
+ return upper_ch;
}
- inline
- Node_handle
+ inline
+ Node_handle
lower()
{
- return lower_ch;
+ return lower_ch;
}
- inline
- Node_handle
+ inline
+ Node_handle
upper()
{
- return upper_ch;
+ return upper_ch;
}
-
+
inline
void
set_lower(Node_handle nh)
@@ -540,27 +556,27 @@ namespace CGAL {
cut_dim = sep.cutting_dimension();
cut_val = sep.cutting_value();
}
-
- inline
- FT
- cutting_value() const
+
+ inline
+ FT
+ cutting_value() const
{
return cut_val;
}
-
- inline
- int
- cutting_dimension() const
+
+ inline
+ int
+ cutting_dimension() const
{
return cut_dim;
}
- /* Separator&
- separator()
+ /* Separator&
+ separator()
{
return Separator(cutting_dimension,cutting_value);
}*/
-
+
};//internal node