Skip to content

Commit

Permalink
Disallow different bounding volumes for internal and leaf nodes for now
Browse files Browse the repository at this point in the history
  • Loading branch information
aprokop committed May 10, 2023
1 parent 72da1f2 commit a730a00
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 121 deletions.
28 changes: 4 additions & 24 deletions src/details/ArborX_DetailsHalfTraversal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,30 +65,10 @@ struct HalfTraversal
auto const leaf_node = HappyTreeFriends::leafIndex(_bvh, node);
bool const is_leaf = HappyTreeFriends::isLeaf(_bvh, node);

bool satisfied = false;
constexpr bool same_bounding_volume =
std::is_same_v<decltype(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, std::declval<BVH>(), 0)),
decltype(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, std::declval<BVH>(), 0))>;
if constexpr (same_bounding_volume)
{
satisfied = predicate((is_leaf ? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, _bvh, leaf_node)
: HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, _bvh, node)));
}
else
{
if (is_leaf)
satisfied = predicate(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, _bvh, leaf_node));
else
satisfied = predicate(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, _bvh, node));
}

if (satisfied)
if (predicate((is_leaf ? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, _bvh, leaf_node)
: HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, _bvh, node))))
{
if (is_leaf)
{
Expand Down
3 changes: 3 additions & 0 deletions src/details/ArborX_DetailsHappyTreeFriends.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ struct HappyTreeFriends
#endif
getBoundingVolume(Tag, BVH const &bvh, int i)
{
static_assert(
std::is_same_v<decltype(bvh._internal_nodes(0).bounding_volume),
decltype(bvh._leaf_nodes(0).bounding_volume)>);
if constexpr (std::is_same_v<Tag, InternalNodeTag>)
return bvh._internal_nodes(i).bounding_volume;
else
Expand Down
84 changes: 14 additions & 70 deletions src/details/ArborX_DetailsTreeTraversal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,30 +95,10 @@ struct TreeTraversal<BVH, Predicates, Callback, SpatialPredicateTag>
auto const leaf_node = HappyTreeFriends::leafIndex(_bvh, node);
bool const is_leaf = HappyTreeFriends::isLeaf(_bvh, node);

bool satisfied = false;
constexpr bool same_bounding_volume =
std::is_same_v<decltype(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, std::declval<BVH>(), 0)),
decltype(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, std::declval<BVH>(), 0))>;
if constexpr (same_bounding_volume)
{
satisfied = predicate((is_leaf ? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, _bvh, leaf_node)
: HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, _bvh, node)));
}
else
{
if (is_leaf)
satisfied = predicate(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, _bvh, leaf_node));
else
satisfied = predicate(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, _bvh, node));
}

if (satisfied)
if (predicate((is_leaf ? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, _bvh, leaf_node)
: HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, _bvh, node))))
{
if (is_leaf)
{
Expand Down Expand Up @@ -286,29 +266,11 @@ struct TreeTraversal<BVH, Predicates, Callback, NearestPredicateTag>
auto &bvh = _bvh;
auto const distance = [&predicate, &bvh](int j) {
using Details::distance;
constexpr bool same_bounding_volume =
std::is_same_v<decltype(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, std::declval<BVH>(), 0)),
decltype(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, std::declval<BVH>(), 0))>;
if constexpr (same_bounding_volume)
{
return predicate.distance(
HappyTreeFriends::isLeaf(bvh, j)
? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j))
: HappyTreeFriends::getBoundingVolume(InternalNodeTag{}, bvh,
j));
}
else
{
if (HappyTreeFriends::isLeaf(bvh, j))
return predicate.distance(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j)));
else
return predicate.distance(
HappyTreeFriends::getBoundingVolume(InternalNodeTag{}, bvh, j));
}
return predicate.distance(
HappyTreeFriends::isLeaf(bvh, j)
? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j))
: HappyTreeFriends::getBoundingVolume(InternalNodeTag{}, bvh, j));
};

constexpr int SENTINEL = -1;
Expand Down Expand Up @@ -516,29 +478,11 @@ struct TreeTraversal<BVH, Predicates, Callback,
auto &bvh = _bvh;
auto const distance = [&predicate, &bvh](int j) {
using Details::distance;
constexpr bool same_bounding_volume =
std::is_same_v<decltype(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, std::declval<BVH>(), 0)),
decltype(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, std::declval<BVH>(), 0))>;
if constexpr (same_bounding_volume)
{
return predicate.distance(
HappyTreeFriends::isLeaf(bvh, j)
? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j))
: HappyTreeFriends::getBoundingVolume(InternalNodeTag{}, bvh,
j));
}
else
{
if (HappyTreeFriends::isLeaf(bvh, j))
return predicate.distance(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j)));
else
return predicate.distance(
HappyTreeFriends::getBoundingVolume(InternalNodeTag{}, bvh, j));
}
return predicate.distance(
HappyTreeFriends::isLeaf(bvh, j)
? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j))
: HappyTreeFriends::getBoundingVolume(InternalNodeTag{}, bvh, j));
};

int node = HappyTreeFriends::getRoot(_bvh);
Expand Down
34 changes: 7 additions & 27 deletions src/details/ArborX_MinimumSpanningTree.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,33 +179,13 @@ struct FindComponentNearestNeighbors
LeafNodeTag{}, _bvh, HappyTreeFriends::leafIndex(_bvh, i)),
&bvh = _bvh](int j) {
using Details::distance;
constexpr bool same_bounding_volume =
std::is_same_v<decltype(HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, std::declval<BVH>(), 0)),
decltype(HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, std::declval<BVH>(), 0))>;
if constexpr (same_bounding_volume)
{
return distance(bounding_volume_i,
(HappyTreeFriends::isLeaf(bvh, j)
? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh,
HappyTreeFriends::leafIndex(bvh, j))
: HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, bvh, j)));
}
else
{
if (HappyTreeFriends::isLeaf(bvh, j))
return distance(
bounding_volume_i,
HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh, HappyTreeFriends::leafIndex(bvh, j)));
else
return distance(bounding_volume_i,
HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, bvh, j));
}
return distance(bounding_volume_i,
(HappyTreeFriends::isLeaf(bvh, j)
? HappyTreeFriends::getBoundingVolume(
LeafNodeTag{}, bvh,
HappyTreeFriends::leafIndex(bvh, j))
: HappyTreeFriends::getBoundingVolume(
InternalNodeTag{}, bvh, j)));
};

auto const component = _labels(i);
Expand Down

0 comments on commit a730a00

Please # to comment.