SpiecsEngine
 
Loading...
Searching...
No Matches
KDTree_test.h
Go to the documentation of this file.
1/**
2* @file KDTree_test.h.
3* @brief The KDTree_test Definitions.
4* @author Spices.
5*/
6
7#pragma once
8#include <gmock/gmock.h>
9#include <Core/Container/KDTree.h>
10#include <Core/Thread/ThreadPoolBasic.h>
11#include <random>
12#include "Instrumentor.h"
13
14namespace SpicesTest {
15
16 /**
17 * @brief The interface is inherited from testing::Test.
18 * Registry on Initialize.
19 */
20 class kd_tree_test : public testing::Test
21 {
22 protected:
23
24 /**
25 * @brief Testing class initialize function.
26 */
27 void SetUp() override {
28
30
31 /**
32 * @brief ThreadPool for build KDTree.
33 */
34 std::vector<scl::kd_tree<2>::item> points;
35 points.push_back({ 3.0, 6.0 });
36 points.push_back({ 2.0, 2.0 });
37 points.push_back({ 4.0, 7.0 });
38 points.push_back({ 1.0, 3.0 });
39 points.push_back({ 2.0, 4.0 });
40 points.push_back({ 5.0, 4.0 });
41 points.push_back({ 7.0, 2.0 });
42
43 /**
44 * @brief Insert points into the kd_tree.
45 */
46 m_KDTree.insert(points);
47 }
48
49 /**
50 * @brief Testing class TearDown function.
51 */
53
54 /**
55 * @brief Create a KDTree with 2 dimensions.
56 */
58 };
59
60 /**
61 * @brief Testing if Insert successfully.
62 */
64
66
67 EXPECT_EQ(m_KDTree.size(), 7);
68 m_KDTree.print();
69 }
70
71 /**
72 * @brief Testing if Search successfully.
73 */
75
77
78 /**
79 * @brief Search for specific points in the kd_tree.
80 */
81 EXPECT_EQ(m_KDTree.search({ 3.0, 6.0 }), true);
82 EXPECT_EQ(m_KDTree.search({ 2.0, 2.0 }), true);
83 EXPECT_EQ(m_KDTree.search({ 4.0, 7.0 }), true);
84 EXPECT_EQ(m_KDTree.search({ 1.0, 3.0 }), true);
85 EXPECT_EQ(m_KDTree.search({ 2.0, 4.0 }), true);
86 EXPECT_EQ(m_KDTree.search({ 5.0, 4.0 }), true);
87 EXPECT_EQ(m_KDTree.search({ 7.0, 2.0 }), true);
88
89 /**
90 * @brief Search for specific points not in the kd_tree.
91 */
92 EXPECT_EQ(m_KDTree.search({ 3.0 + 1, 6.0 }), false);
93 EXPECT_EQ(m_KDTree.search({ 2.0 + 1, 2.0 }), false);
94 EXPECT_EQ(m_KDTree.search({ 4.0 + 1, 7.0 }), false);
95 EXPECT_EQ(m_KDTree.search({ 1.0 + 1, 3.0 }), false);
96 EXPECT_EQ(m_KDTree.search({ 2.0 + 1, 4.0 }), false);
97 EXPECT_EQ(m_KDTree.search({ 5.0 + 1, 4.0 }), false);
98 EXPECT_EQ(m_KDTree.search({ 7.0 + 1, 2.0 }), false);
99 }
100
101 /**
102 * @brief Testing if NearestNeighbourSearch successfully.
103 */
105
107
108 /**
109 * @brief Search for specific points.
110 */
111 scl::kd_tree<2>::item val = { 2, 2 };
112
113 EXPECT_EQ(m_KDTree.nearest_neighbour_search({ 2.0, 0.0 }, { 3.0, 3.0 }), val);
114
115 constexpr int nPoints = 1000;
116 constexpr int nSearchs = 1000;
117 scl::kd_tree<3> modelKDTree;
118 std::vector<scl::kd_tree<3>::item> points;
119 const scl::kd_tree<3>::item findVal = { 50.2f, 87.3f, 12.6f };
120
121 {
122 SPICESTEST_PROFILE_SCOPE("Create Points Collection.");
123
124 points.resize(nPoints);
125 for (int i = 0; i < nPoints; i++)
126 {
127 points[i][0] = std::rand() / float(RAND_MAX) * 100.0f;
128 points[i][1] = std::rand() / float(RAND_MAX) * 100.0f;
129 points[i][2] = std::rand() / float(RAND_MAX) * 100.0f;
130 }
131 }
132
133 {
134 SPICESTEST_PROFILE_SCOPE("Insert to KDTree");
135
136 Spices::ThreadPool threadPool;
137 threadPool.SetMode(Spices::PoolMode::MODE_FIXED);
138 threadPool.Start(10);
139 modelKDTree.insert_async(points, &threadPool);
140 EXPECT_EQ(modelKDTree.size(), nPoints);
141 }
142
143 {
144 SPICESTEST_PROFILE_SCOPE("Search in KDTree");
145
146 for (int i = 0; i < nSearchs; i++)
147 {
148 auto rval = modelKDTree.nearest_neighbour_search(findVal, { 10.0f, 10.0f, 10.0f });
149 bool check = 10.0f - std::abs(rval[0] - findVal[0]) > 0.0f;
150 EXPECT_EQ(check, true);
151 }
152 }
153
154#if 1
155
156 {
157 SPICESTEST_PROFILE_SCOPE("Search in Loop");
158
159 for (int i = 0; i < nSearchs; i++)
160 {
161 scl::kd_tree<3>::item nearVal = { 1E11, 1E11, 1E11 };
162
163 for (int j = 0; j < nPoints; j++)
164 {
165 if (std::abs(points[j][0] - findVal[0]) < nearVal[0] &&
166 std::abs(points[j][1] - findVal[1]) < nearVal[1] &&
167 std::abs(points[j][2] - findVal[2]) < nearVal[2])
168 {
169 nearVal = points[j];
170 }
171 }
172
173 bool check = 10.0f - nearVal[0] > 0.0f;
174 EXPECT_EQ(check, true);
175 }
176 }
177
178#endif
179
180 }
181
182 /**
183 * @brief Testing if RangeSearch successfully.
184 */
186
188
189 /**
190 * @brief Search for specific points.
191 */
192 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 1.0, 1.0 }).size(), 0);
193 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 2.0, 2.0 }).size(), 1);
194 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 3.0, 3.0 }).size(), 2);
195 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 4.0, 4.0 }).size(), 3);
196 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 5.0, 5.0 }).size(), 4);
197 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 6.0, 6.0 }).size(), 5);
198 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 7.0, 7.0 }).size(), 7);
199
200 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 1.0, 100.0 }).size(), 1);
201 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 2.0, 100.0 }).size(), 3);
202 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 3.0, 100.0 }).size(), 4);
203 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 4.0, 100.0 }).size(), 5);
204 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 5.0, 100.0 }).size(), 6);
205 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 6.0, 100.0 }).size(), 6);
206 EXPECT_EQ(m_KDTree.range_search({ 0.0, 0.0 }, { 7.0, 100.0 }).size(), 7);
207 }
208}
#define SPICES_FUNC_SIG
#define SPICESTEST_PROFILE_SCOPE_LINE2(name, line)
#define SPICESTEST_PROFILE_SCOPE(name)
#define SPICES_PROFILE
#define SPICESTEST_PROFILE_END_SESSION()
#define SPICESTEST_PROFILE_BEGIN_SESSION(name, filepath)
#define SPICESTEST_PROFILE_SCOPE_LINE(name, line)
#define SPICESTEST_PROFILE_FUNCTION()
InstrumentationTimer(const char *name)
std::chrono::time_point< std::chrono::steady_clock > m_StartTimepoint
Instrumentor(Instrumentor &&)=delete
static Instrumentor & Get()
void BeginSession(const std::string &name, const std::string &filepath="results.json")
void WriteProfile(const ProfileResult &result)
InstrumentationSession * m_CurrentSession
std::ofstream m_OutputStream
Instrumentor(const Instrumentor &)=delete
void Test(float f)
Basic Override Class Function.
void Test()
Basic Override Class Function.
void TearDown() override
Testing class TearDown function.
std::vector< scl::directed_acyclic_node > m_Nodes
void SetUp() override
Testing class initialize function.
The interface is inherited from testing::Test. Registy on Initialize.
scl::kd_tree< 2 > m_KDTree
Create a KDTree with 2 dimensions.
Definition KDTree_test.h:57
void TearDown() override
Testing class TearDown function.
Definition KDTree_test.h:52
void SetUp() override
Testing class initialize function.
Definition KDTree_test.h:27
The interface is inherited from testing::Test. Registry on Initialize.
Definition KDTree_test.h:21
The kd_tree with K dimensions container Class. K the number of dimensions. Every node in the tree is ...
Definition KDTree.h:27
int main(int argc, char **argv)
The Entry of SpicesTest.
Definition main.cpp:76
constexpr auto CleanupOutputString(const char(&expr)[N], const char(&remove)[K])
TEST_F(directed_acyclic_graph_test, Addnode)
Testing if add node successfully.
TEST_F(kd_tree_test, Insert)
Testing if Insert successfully.
Definition KDTree_test.h:63
std::thread::id ThreadID
std::chrono::microseconds ElapsedTime
FloatingPointMicroseconds Start