2
3
4
5
8#include <gmock/gmock.h>
9#include <Core/Container/KDTree.h>
10#include <Core/Thread/ThreadPoolBasic.h>
17
18
19
25
26
32
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 });
44
45
46 m_KDTree.insert(points);
50
51
55
56
61
62
67 EXPECT_EQ(m_KDTree.size(), 7);
72
73
79
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);
90
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);
102
103
109
110
111 scl::kd_tree<2>::item val = { 2, 2 };
113 EXPECT_EQ(m_KDTree.nearest_neighbour_search({ 2.0, 0.0 }, { 3.0, 3.0 }), val);
115 constexpr int nPoints = 1000;
116 constexpr int nSearchs = 1000;
118 std::vector<scl::kd_tree<3>::item> points;
119 const scl::kd_tree<3>::item findVal = { 50.2f, 87.3f, 12.6f };
124 points.resize(nPoints);
125 for (
int i = 0; i < nPoints; i++)
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;
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);
146 for (
int i = 0; i < nSearchs; i++)
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);
159 for (
int i = 0; i < nSearchs; i++)
161 scl::kd_tree<3>::item nearVal = { 1E11, 1E11, 1E11 };
163 for (
int j = 0; j < nPoints; j++)
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])
173 bool check = 10.0f - nearVal[0] > 0.0f;
174 EXPECT_EQ(check,
true);
183
184
190
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);
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);
#define SPICESTEST_PROFILE_SCOPE_LINE2(name, line)
#define SPICESTEST_PROFILE_SCOPE(name)
#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 InternalEndSession()
void Test(float f)
Basic Override Class Function.
static void Test1()
Static 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.
scl::directed_acyclic_graph m_DAG
The interface is inherited from testing::Test. Registy on Initialize.
scl::kd_tree< 2 > m_KDTree
Create a KDTree with 2 dimensions.
void TearDown() override
Testing class TearDown function.
void SetUp() override
Testing class initialize function.
The interface is inherited from testing::Test. Registry on Initialize.
The kd_tree with K dimensions container Class. K the number of dimensions. Every node in the tree is ...
int main(int argc, char **argv)
The Entry of SpicesTest.
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.
std::chrono::microseconds ElapsedTime
FloatingPointMicroseconds Start