Files
algorithms/src/tmp/ImplementingUsefulAlgorithms/ComputationalGeometry/ComputationalGeometryTestAuto.h
2026-01-25 09:28:09 +03:00

87 lines
2.3 KiB
C++

#ifndef IGMDK_COMPUTATIONAL_GEOMETRY_TEST_AUTO_H
#define IGMDK_COMPUTATIONAL_GEOMETRY_TEST_AUTO_H
#include "KDTree.h"
#include "Point.h"
#include <cassert>
using namespace std;
namespace igmdk{
template<typename MAP2D> void testPointMapAutoHelper(MAP2D& trie)
{
int n = 100000;
Vector<int> permutation(n);
for(int i = 0; i < n; ++i) permutation[i] = i;
GlobalRNG().randomPermutation(permutation.getArray(), n);
for(int j = 0; j < n; ++j)
{
int i = permutation[j];
Vector<int> key(2, i);
trie.insert(key, -i);
assert(trie.find(key));
assert(*trie.find(key) == -i);
}
}
template<typename N> void testAutoCheckRange(Vector<N*> const& v, int from,
int to)
{
for(int i = from; i < to; ++i)
{
bool found = false;
for(int j = 0; j < v.getSize(); ++j)
if(v[j]->key[0] == i)
{
found = true;
break;
}
assert(found);
}
}
void testKDTreeAuto()
{
DEBUG("testKDTreeAuto");
typedef KDTree<Vector<int>, int> TREE;
TREE tree(2);
testPointMapAutoHelper(tree);
EuclideanDistance<Vector<int> >::DistanceIncremental di;
Vector<int> p1(2, 100);
//radius test; 7 * 7 + 7 * 7 = 98, so just makes it in 10^2
testAutoCheckRange(tree.distanceQuery(p1, 100, di), 93, 107);
//nn tests
typename TREE::NodeType* nn = tree.nearestNeighbor(p1, di);
assert(nn && nn->key == p1);
testAutoCheckRange(tree.kNN(p1, 5, di), 98, 102);
//range test
testAutoCheckRange(tree.rangeQuery(Vector<int>(2, 97), Vector<int>(2, 103),
Vector<bool>(2, true)), 97, 103);
DEBUG("testKDTreeAuto passed");
}
void testVPTreeAuto()
{
DEBUG("testVPTreeAuto");
typedef VpTree<Vector<int>, int, EuclideanDistance<Vector<int> >::Distance>
TREE;
TREE tree;
testPointMapAutoHelper(tree);
Vector<int> p1(2, 100);
//radius test; 7 * 7 + 7 * 7 = 98, so just makes it in 10^2
testAutoCheckRange(tree.distanceQuery(p1, 10), 93, 107);
//nn tests
typename TREE::NodeType* nn = tree.nearestNeighbor(p1);
assert(nn && nn->key == p1);
testAutoCheckRange(tree.kNN(p1, 5), 98, 102);
DEBUG("testVPTreeAuto passed");
}
void testAllAutoComputationalGeometry()
{
DEBUG("testAllAutoComputationalGeometry");
testKDTreeAuto();
testVPTreeAuto();
}
}//end namespace
#endif