SourceXtractorPlusPlus
1.0.3
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
SEUtils
SEUtils
_impl
KdTree.icpp
Go to the documentation of this file.
1
17
18
namespace
SourceXtractor
{
19
20
template
<
typename
T,
size_t
N,
size_t
S>
21
class
KdTree
<T, N,
S
>::
Node
{
22
public
:
23
virtual
std::vector<T>
findPointsWithinRadius
(
Coord
coord,
double
radius)
const
= 0;
24
virtual
~Node
() =
default
;
25
};
26
27
template
<
typename
T,
size_t
N,
size_t
S>
28
class
KdTree
<T, N,
S
>::
Leaf
:
public
KdTree::Node
{
29
public
:
30
explicit
Leaf
(
const
std::vector<T>
&& data) :
m_data
(data) {}
31
virtual
~Leaf
() =
default
;
32
33
virtual
std::vector<T>
findPointsWithinRadius
(
Coord
coord,
double
radius)
const
{
34
std::vector<T>
selection;
35
for
(
auto
& entry :
m_data
) {
36
double
square_dist = 0.0;
37
for
(
size_t
i =0; i < N; i++) {
38
double
delta =
Traits::getCoord
(entry, i) - coord.
coord
[i];
39
square_dist += delta * delta;
40
}
41
if
(square_dist < radius*radius) {
42
selection.
push_back
(entry);
43
}
44
}
45
return
selection;
46
}
47
48
private
:
49
const
std::vector<T>
m_data
;
50
};
51
52
template
<
typename
T,
size_t
N,
size_t
S>
53
class
KdTree
<T, N,
S
>::
Split
:
public
KdTree::Node
{
54
public
:
55
virtual
~Split
() =
default
;
56
explicit
Split
(
std::vector<T>
data,
size_t
axis) :
m_axis
(axis) {
57
std::sort
(data.
begin
(), data.
end
(), [axis](
const
T& a,
const
T& b) ->
bool
{
58
return Traits::getCoord(a, axis) < Traits::getCoord(b, axis);
59
});
60
61
double
a =
Traits::getCoord
(data.
at
(data.
size
() / 2 - 1), axis);
62
double
b =
Traits::getCoord
(data.
at
(data.
size
() / 2), axis);
63
64
if
(a == b) {
65
// avoid a possible rounding issue
66
m_split_value
= a;
67
}
else
{
68
m_split_value
= (a + b) / 2.0;
69
}
70
71
std::vector<T>
left
(data.
begin
(), data.
begin
() + data.
size
() / 2);
72
std::vector<T>
right
(data.
begin
() + data.
size
() / 2, data.
end
());
73
74
if
(
left
.size() >
S
) {
75
m_left_child
=
std::make_shared<Split>
(
std::move
(
left
), (axis+1) % N);
76
}
else
{
77
m_left_child
=
std::make_shared<Leaf>
(
std::move
(
left
));
78
}
79
if
(
right
.size() >
S
) {
80
m_right_child
=
std::make_shared<Split>
(
std::move
(
right
), (axis+1) % N);
81
}
else
{
82
m_right_child
=
std::make_shared<Leaf>
(
std::move
(
right
));
83
}
84
}
85
86
virtual
std::vector<T>
findPointsWithinRadius
(
Coord
coord,
double
radius)
const
{
87
if
(coord.
coord
[
m_axis
] + radius <
m_split_value
) {
88
return
m_left_child
->findPointsWithinRadius(coord, radius);
89
}
else
if
(coord.
coord
[
m_axis
] - radius >
m_split_value
) {
90
return
m_right_child
->findPointsWithinRadius(coord, radius);
91
}
else
{
92
auto
left
=
m_left_child
->findPointsWithinRadius(coord, radius);
93
auto
right
=
m_right_child
->findPointsWithinRadius(coord, radius);
94
95
std::vector<T>
merge
;
96
merge
.reserve(
left
.size() +
right
.size());
97
merge
.insert(
merge
.end(),
left
.begin(),
left
.end());
98
merge
.insert(
merge
.end(),
right
.begin(),
right
.end());
99
100
return
merge
;
101
}
102
}
103
104
private
:
105
size_t
m_axis
;
106
double
m_split_value
;
107
108
std::shared_ptr<Node>
m_left_child
;
109
std::shared_ptr<Node>
m_right_child
;
110
};
111
112
template
<
typename
T,
size_t
N,
size_t
S>
113
KdTree<T, N, S>::KdTree
(
const
std::vector<T>
& data) {
114
if
(data.
size
() >
S
) {
115
m_root
=
std::make_shared<Split>
(data, 0);
116
}
else
{
117
std::vector<T>
data_copy(data);
118
m_root
=
std::make_shared<Leaf>
(
std::move
(data_copy));
119
}
120
}
121
122
template
<
typename
T,
size_t
N,
size_t
S>
123
std::vector<T>
KdTree<T, N, S>::findPointsWithinRadius
(
Coord
coord,
double
radius)
const
{
124
return
m_root
->findPointsWithinRadius(coord, radius);
125
}
126
127
}
std::vector::at
T at(T... args)
std::vector::begin
T begin(T... args)
SourceXtractor::KdTree::Leaf::~Leaf
virtual ~Leaf()=default
SourceXtractor::KdTree::Leaf::m_data
const std::vector< T > m_data
Definition
KdTree.icpp:49
SourceXtractor::KdTree::Leaf::Leaf
Leaf(const std::vector< T > &&data)
Definition
KdTree.icpp:30
SourceXtractor::KdTree::Leaf::findPointsWithinRadius
virtual std::vector< T > findPointsWithinRadius(Coord coord, double radius) const
Definition
KdTree.icpp:33
SourceXtractor::KdTree::Node
Definition
KdTree.icpp:21
SourceXtractor::KdTree::Node::findPointsWithinRadius
virtual std::vector< T > findPointsWithinRadius(Coord coord, double radius) const =0
SourceXtractor::KdTree::Node::~Node
virtual ~Node()=default
SourceXtractor::KdTree::Split::m_right_child
std::shared_ptr< Node > m_right_child
Definition
KdTree.icpp:109
SourceXtractor::KdTree::Split::m_split_value
double m_split_value
Definition
KdTree.icpp:106
SourceXtractor::KdTree::Split::m_left_child
std::shared_ptr< Node > m_left_child
Definition
KdTree.icpp:108
SourceXtractor::KdTree::Split::findPointsWithinRadius
virtual std::vector< T > findPointsWithinRadius(Coord coord, double radius) const
Definition
KdTree.icpp:86
SourceXtractor::KdTree::Split::Split
Split(std::vector< T > data, size_t axis)
Definition
KdTree.icpp:56
SourceXtractor::KdTree::Split::~Split
virtual ~Split()=default
SourceXtractor::KdTree::Split::m_axis
size_t m_axis
Definition
KdTree.icpp:105
SourceXtractor::KdTree::findPointsWithinRadius
std::vector< T > findPointsWithinRadius(Coord coord, double radius) const
Definition
KdTree.icpp:123
SourceXtractor::KdTree::KdTree
KdTree(const std::vector< T > &data)
Definition
KdTree.icpp:113
SourceXtractor::KdTree::m_root
std::shared_ptr< Node > m_root
Definition
KdTree.h:58
std::vector::end
T end(T... args)
std::left
T left(T... args)
std::make_shared
T make_shared(T... args)
std::merge
T merge(T... args)
std::move
T move(T... args)
KdTree
SourceXtractor
Definition
Aperture.h:30
SourceXtractor::LutzMarker::S
@ S
Definition
Lutz.cpp:52
std::vector::push_back
T push_back(T... args)
std::shared_ptr
std::vector::size
T size(T... args)
std::sort
T sort(T... args)
SourceXtractor::KdTreeTraits::getCoord
static double getCoord(const T &t, size_t index)
SourceXtractor::KdTree::Coord
Definition
KdTree.h:46
SourceXtractor::KdTree::Coord::coord
double coord[N]
Definition
KdTree.h:47
std::vector
Generated by
1.14.0