Add regression test for 'gap' querry bug
This commit is contained in:
parent
bc013925b8
commit
2a6585e664
@ -231,6 +231,35 @@ struct RandomGraphFixture
|
|||||||
std::vector<TestData> edges;
|
std::vector<TestData> edges;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GraphFixture
|
||||||
|
{
|
||||||
|
GraphFixture(const std::vector<std::pair<float, float>>& input_coords,
|
||||||
|
const std::vector<std::pair<unsigned, unsigned>>& input_edges)
|
||||||
|
: coords(std::make_shared<std::vector<FixedPointCoordinate>>())
|
||||||
|
{
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < input_coords.size(); i++)
|
||||||
|
{
|
||||||
|
FixedPointCoordinate c(input_coords[i].first * COORDINATE_PRECISION, input_coords[i].second * COORDINATE_PRECISION);
|
||||||
|
coords->emplace_back(c);
|
||||||
|
nodes.emplace_back(NodeInfo(c.lat, c.lon, i));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& pair : input_edges)
|
||||||
|
{
|
||||||
|
TestData d;
|
||||||
|
d.u = pair.first;
|
||||||
|
d.v = pair.second;
|
||||||
|
edges.emplace_back(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<NodeInfo> nodes;
|
||||||
|
std::shared_ptr<std::vector<FixedPointCoordinate>> coords;
|
||||||
|
std::vector<TestData> edges;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*3, TEST_LEAF_NODE_SIZE/2> TestRandomGraphFixture_LeafHalfFull;
|
typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*3, TEST_LEAF_NODE_SIZE/2> TestRandomGraphFixture_LeafHalfFull;
|
||||||
typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*5, TEST_LEAF_NODE_SIZE> TestRandomGraphFixture_LeafFull;
|
typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*5, TEST_LEAF_NODE_SIZE> TestRandomGraphFixture_LeafFull;
|
||||||
@ -240,7 +269,8 @@ typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*TEST_BRANCHING_FACTOR*3,
|
|||||||
typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*TEST_BRANCHING_FACTOR*3,
|
typedef RandomGraphFixture<TEST_LEAF_NODE_SIZE*TEST_BRANCHING_FACTOR*3,
|
||||||
TEST_LEAF_NODE_SIZE*TEST_BRANCHING_FACTOR*2> TestRandomGraphFixture_MultipleLevels;
|
TEST_LEAF_NODE_SIZE*TEST_BRANCHING_FACTOR*2> TestRandomGraphFixture_MultipleLevels;
|
||||||
|
|
||||||
void simple_verify_rtree(TestStaticRTree& rtree, const std::shared_ptr<std::vector<FixedPointCoordinate>>& coords, const std::vector<TestData>& edges)
|
template<typename RTreeT>
|
||||||
|
void simple_verify_rtree(RTreeT& rtree, const std::shared_ptr<std::vector<FixedPointCoordinate>>& coords, const std::vector<TestData>& edges)
|
||||||
{
|
{
|
||||||
BOOST_TEST_MESSAGE("Verify end points");
|
BOOST_TEST_MESSAGE("Verify end points");
|
||||||
for (const auto& e : edges)
|
for (const auto& e : edges)
|
||||||
@ -266,7 +296,8 @@ void simple_verify_rtree(TestStaticRTree& rtree, const std::shared_ptr<std::vect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sampling_verify_rtree(TestStaticRTree& rtree, LinearSearchNN& lsnn, unsigned num_samples)
|
template<typename RTreeT>
|
||||||
|
void sampling_verify_rtree(RTreeT& rtree, LinearSearchNN& lsnn, unsigned num_samples)
|
||||||
{
|
{
|
||||||
std::mt19937 g(RANDOM_SEED);
|
std::mt19937 g(RANDOM_SEED);
|
||||||
std::uniform_int_distribution<> lat_udist(WORLD_MIN_LAT, WORLD_MAX_LAT);
|
std::uniform_int_distribution<> lat_udist(WORLD_MIN_LAT, WORLD_MAX_LAT);
|
||||||
@ -296,11 +327,11 @@ void sampling_verify_rtree(TestStaticRTree& rtree, LinearSearchNN& lsnn, unsigne
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FixtureT>
|
template<typename FixtureT, typename RTreeT=TestStaticRTree>
|
||||||
void construction_test(const std::string& prefix, FixtureT* fixture)
|
void build_rtree(const std::string& prefix, FixtureT* fixture, std::string& leaves_path, std::string& nodes_path)
|
||||||
{
|
{
|
||||||
const std::string nodes_path = prefix + ".ramIndex";
|
nodes_path = prefix + ".ramIndex";
|
||||||
const std::string leaves_path = prefix + ".fileIndex";
|
leaves_path = prefix + ".fileIndex";
|
||||||
const std::string coords_path = prefix + ".nodes";
|
const std::string coords_path = prefix + ".nodes";
|
||||||
|
|
||||||
boost::filesystem::ofstream node_stream(coords_path, std::ios::binary);
|
boost::filesystem::ofstream node_stream(coords_path, std::ios::binary);
|
||||||
@ -309,12 +340,20 @@ void construction_test(const std::string& prefix, FixtureT* fixture)
|
|||||||
node_stream.write((char *)&(fixture->nodes[0]), num_nodes * sizeof(NodeInfo));
|
node_stream.write((char *)&(fixture->nodes[0]), num_nodes * sizeof(NodeInfo));
|
||||||
node_stream.close();
|
node_stream.close();
|
||||||
|
|
||||||
TestStaticRTree::Build(fixture->edges, nodes_path, leaves_path, fixture->nodes);
|
RTreeT::Build(fixture->edges, nodes_path, leaves_path, fixture->nodes);
|
||||||
TestStaticRTree rtree_querry(nodes_path, leaves_path, fixture->coords);
|
}
|
||||||
|
|
||||||
|
template<typename FixtureT, typename RTreeT=TestStaticRTree>
|
||||||
|
void construction_test(const std::string& prefix, FixtureT* fixture)
|
||||||
|
{
|
||||||
|
std::string leaves_path;
|
||||||
|
std::string nodes_path;
|
||||||
|
build_rtree<FixtureT, RTreeT>(prefix, fixture, leaves_path, nodes_path);
|
||||||
|
RTreeT rtree(nodes_path, leaves_path, fixture->coords);
|
||||||
LinearSearchNN lsnn(fixture->coords, fixture->edges);
|
LinearSearchNN lsnn(fixture->coords, fixture->edges);
|
||||||
|
|
||||||
simple_verify_rtree(rtree_querry, fixture->coords, fixture->edges);
|
simple_verify_rtree(rtree, fixture->coords, fixture->edges);
|
||||||
sampling_verify_rtree(rtree_querry, lsnn, 100);
|
sampling_verify_rtree(rtree, lsnn, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(construct_half_leaf_test, TestRandomGraphFixture_LeafHalfFull)
|
BOOST_FIXTURE_TEST_CASE(construct_half_leaf_test, TestRandomGraphFixture_LeafHalfFull)
|
||||||
@ -342,6 +381,60 @@ BOOST_FIXTURE_TEST_CASE(construct_multiple_levels_test, TestRandomGraphFixture_M
|
|||||||
construction_test("test_5", this);
|
construction_test("test_5", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bug: If you querry a point that lies between two BBs that have a gap,
|
||||||
|
* one BB will be pruned, even if it could contain a nearer match.
|
||||||
|
*/
|
||||||
|
BOOST_AUTO_TEST_CASE(regression_test)
|
||||||
|
{
|
||||||
|
typedef std::pair<float, float> Coord;
|
||||||
|
typedef std::pair<unsigned, unsigned> Edge;
|
||||||
|
GraphFixture fixture({
|
||||||
|
Coord(40.0, 0.0),
|
||||||
|
Coord(35.0, 5.0),
|
||||||
|
|
||||||
|
Coord(5.0, 5.0),
|
||||||
|
Coord(0.0, 10.0),
|
||||||
|
|
||||||
|
Coord(20.0, 10.0),
|
||||||
|
Coord(20.0, 5.0),
|
||||||
|
|
||||||
|
Coord(40.0, 100.0),
|
||||||
|
Coord(35.0, 105.0),
|
||||||
|
|
||||||
|
Coord(5.0, 105.0),
|
||||||
|
Coord(0.0, 110.0),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Edge(0, 1),
|
||||||
|
Edge(2, 3),
|
||||||
|
Edge(4, 5),
|
||||||
|
Edge(6, 7),
|
||||||
|
Edge(8, 9)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef StaticRTree<TestData,
|
||||||
|
std::vector<FixedPointCoordinate>,
|
||||||
|
false,
|
||||||
|
2,
|
||||||
|
3> MiniStaticRTree;
|
||||||
|
|
||||||
|
std::string leaves_path;
|
||||||
|
std::string nodes_path;
|
||||||
|
build_rtree<GraphFixture, MiniStaticRTree>("test_regression", &fixture, leaves_path, nodes_path);
|
||||||
|
MiniStaticRTree rtree(nodes_path, leaves_path, fixture.coords);
|
||||||
|
|
||||||
|
// query a node just right of the center of the gap
|
||||||
|
FixedPointCoordinate input(20.0 * COORDINATE_PRECISION, 55.1 * COORDINATE_PRECISION);
|
||||||
|
FixedPointCoordinate result;
|
||||||
|
rtree.LocateClosestEndPointForCoordinate(input, result, 1);
|
||||||
|
FixedPointCoordinate result_ln;
|
||||||
|
LinearSearchNN lsnn(fixture.coords, fixture.edges);
|
||||||
|
lsnn.LocateClosestEndPointForCoordinate(input, result_ln, 1);
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(result_ln, result);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user