Add graph compressor unit tests

This commit is contained in:
Patrick Niklaus 2015-06-28 15:30:40 +02:00
parent 3ef34fbb56
commit fd30e82836
9 changed files with 249 additions and 8 deletions

View File

@ -64,7 +64,7 @@ add_executable(osrm-extract ${ExtractorSources} $<TARGET_OBJECTS:COORDINATE> $<T
add_library(RESTRICTION OBJECT data_structures/restriction_map.cpp)
file(GLOB PrepareGlob contractor/*.cpp data_structures/hilbert_value.cpp data_structures/compressed_edge_container.cpp {RestrictionMapGlob})
file(GLOB PrepareGlob contractor/*.cpp data_structures/hilbert_value.cpp data_structures/compressed_edge_container.cpp algorithms/graph_compressor.cpp {RestrictionMapGlob})
set(PrepareSources prepare.cpp ${PrepareGlob})
add_executable(osrm-prepare ${PrepareSources} $<TARGET_OBJECTS:ANGLE> $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:IMPORT> $<TARGET_OBJECTS:LOGGER> $<TARGET_OBJECTS:RESTRICTION> $<TARGET_OBJECTS:EXCEPTION> $<TARGET_OBJECTS:MERCATOR>)
@ -77,7 +77,7 @@ file(GLOB AlgorithmGlob algorithms/*.cpp)
file(GLOB HttpGlob server/http/*.cpp)
file(GLOB LibOSRMGlob library/*.cpp)
file(GLOB DataStructureTestsGlob unit_tests/data_structures/*.cpp data_structures/hilbert_value.cpp data_structures/compressed_edge_container.cpp)
file(GLOB AlgorithmTestsGlob unit_tests/algorithms/*.cpp)
file(GLOB AlgorithmTestsGlob unit_tests/algorithms/*.cpp algorithms/graph_compressor.cpp data_structures/compressed_edge_container.cpp data_structures/restriction_map.cpp)
set(
OSRMSources

View File

@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../typedefs.h"
#include "speed_profile.hpp"
#include "../contractor/speed_profile.hpp"
#include "../data_structures/node_based_graph.hpp"
#include <memory>

View File

@ -266,7 +266,6 @@ void EdgeBasedGraphFactory::RenumberEdges()
BOOST_ASSERT(SPECIAL_NODEID != edge_data.edgeBasedNodeID);
}
}
m_number_of_edge_based_nodes = numbered_edges_count;
}
/// Creates the nodes in the edge expanded graph from edges in the node-based graph.

View File

@ -81,8 +81,6 @@ class EdgeBasedGraphFactory
private:
using EdgeData = NodeBasedDynamicGraph::EdgeData;
unsigned m_number_of_edge_based_nodes;
std::vector<EdgeBasedNode> m_edge_based_node_list;
DeallocatingVector<EdgeBasedEdge> m_edge_based_edge_list;

View File

@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "processing_chain.hpp"
#include "contractor.hpp"
#include "graph_compressor.hpp"
#include "../algorithms/graph_compressor.hpp"
#include "../algorithms/crc32_processor.hpp"
#include "../data_structures/compressed_edge_container.hpp"

View File

@ -90,9 +90,11 @@ template <typename EdgeDataT> class DynamicGraph
*/
template <class ContainerT> DynamicGraph(const NodeIterator nodes, const ContainerT &graph)
{
// we need to cast here because DeallocatingVector does not have a valid const iterator
BOOST_ASSERT(std::is_sorted(const_cast<ContainerT&>(graph).begin(), const_cast<ContainerT&>(graph).end()));
number_of_nodes = nodes;
number_of_edges = static_cast<EdgeIterator>(graph.size());
// node_array.reserve(number_of_nodes + 1);
node_array.resize(number_of_nodes + 1);
EdgeIterator edge = 0;
EdgeIterator position = 0;

View File

@ -46,6 +46,16 @@ struct NodeBasedEdgeData
{
}
NodeBasedEdgeData(int distance, unsigned edgeBasedNodeID, unsigned nameID,
bool isAccessRestricted, bool shortcut, bool forward, bool backward,
bool roundabout, bool ignore_in_grid, TravelMode travel_mode)
: distance(distance), edgeBasedNodeID(edgeBasedNodeID),
nameID(nameID), isAccessRestricted(isAccessRestricted), shortcut(shortcut),
forward(forward), backward(backward), roundabout(roundabout), ignore_in_grid(ignore_in_grid),
travel_mode(travel_mode)
{
}
int distance;
unsigned edgeBasedNodeID;
unsigned nameID;

View File

@ -0,0 +1,232 @@
#include "../../algorithms/graph_compressor.hpp"
#include "../../data_structures/compressed_edge_container.hpp"
#include "../../data_structures/restriction_map.hpp"
#include "../../data_structures/node_based_graph.hpp"
#include "../../contractor/speed_profile.hpp"
#include "../../typedefs.h"
#include <boost/test/unit_test.hpp>
#include <boost/test/test_case_template.hpp>
#include <iostream>
BOOST_AUTO_TEST_SUITE(graph_compressor)
void dumpGraph(const NodeBasedDynamicGraph& graph)
{
for (auto i = 0u; i < graph.GetNumberOfNodes(); ++i)
{
std::cout << "## node " << i << " degree: " << graph.GetOutDegree(i) << std::endl;
for (auto e = graph.BeginEdges(i); e < graph.EndEdges(i); ++e)
{
const auto& data = graph.GetEdgeData(e);
auto target = graph.GetTarget(e);
if (data.forward && !data.backward)
std::cout << i << "->" << target << std::endl;
if (!data.forward && data.backward)
std::cout << i << "<-" << target << std::endl;
if (data.forward && data.backward)
std::cout << i << "--" << target << std::endl;
}
}
}
BOOST_AUTO_TEST_CASE(long_road_test)
{
//
// 0---1---2---3---4
//
SpeedProfileProperties speed_profile;
GraphCompressor compressor(speed_profile);
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
RestrictionMap map;
CompressedEdgeContainer container;
using InputEdge = NodeBasedDynamicGraph::InputEdge;
std::vector<InputEdge> edges = {
// source, target, distance, edgeBasedNodeID, nameID, isAccessRestricted, shortcut, forward, backward, roundabout, ignore_in_grid, travel_mode
{0, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 0, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 2, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 3, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{3, 2, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{3, 4, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{4, 3, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT}
};
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[2].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[4].data));
BOOST_ASSERT(edges[4].data.IsCompatibleTo(edges[6].data));
NodeBasedDynamicGraph graph(5, edges);
compressor.Compress(barrier_nodes, traffic_lights, map, graph, container);
BOOST_CHECK_EQUAL(graph.FindEdge(0, 1), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(1, 2), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(2, 3), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(3, 4), SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(0, 4) != SPECIAL_EDGEID);
}
BOOST_AUTO_TEST_CASE(loop_test)
{
//
// 0---1---2
// | |
// 5---4---3
//
SpeedProfileProperties speed_profile;
GraphCompressor compressor(speed_profile);
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
RestrictionMap map;
CompressedEdgeContainer container;
using InputEdge = NodeBasedDynamicGraph::InputEdge;
std::vector<InputEdge> edges = {
// source, target, distance, edgeBasedNodeID, nameID, isAccessRestricted, shortcut, forward, backward, roundabout, ignore_in_grid, travel_mode
{0, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{0, 5, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 0, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 2, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 3, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{3, 2, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{3, 4, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{4, 3, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{4, 5, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{5, 0, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{5, 4, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
};
BOOST_ASSERT(edges.size() == 12);
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[1].data));
BOOST_ASSERT(edges[1].data.IsCompatibleTo(edges[2].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[3].data));
BOOST_ASSERT(edges[3].data.IsCompatibleTo(edges[4].data));
BOOST_ASSERT(edges[4].data.IsCompatibleTo(edges[5].data));
BOOST_ASSERT(edges[5].data.IsCompatibleTo(edges[6].data));
BOOST_ASSERT(edges[6].data.IsCompatibleTo(edges[7].data));
BOOST_ASSERT(edges[7].data.IsCompatibleTo(edges[8].data));
BOOST_ASSERT(edges[8].data.IsCompatibleTo(edges[9].data));
BOOST_ASSERT(edges[9].data.IsCompatibleTo(edges[10].data));
BOOST_ASSERT(edges[10].data.IsCompatibleTo(edges[11].data));
NodeBasedDynamicGraph graph(6, edges);
compressor.Compress(barrier_nodes, traffic_lights, map, graph, container);
BOOST_CHECK_EQUAL(graph.FindEdge(5, 0), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(0, 1), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(1, 2), SPECIAL_EDGEID);
BOOST_CHECK_EQUAL(graph.FindEdge(2, 3), SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(5, 3) != SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(3, 4) != SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(4, 5) != SPECIAL_EDGEID);
}
BOOST_AUTO_TEST_CASE(t_intersection)
{
//
// 0---1---2
// |
// 3
//
SpeedProfileProperties speed_profile;
GraphCompressor compressor(speed_profile);
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
RestrictionMap map;
CompressedEdgeContainer container;
using InputEdge = NodeBasedDynamicGraph::InputEdge;
std::vector<InputEdge> edges = {
// source, target, distance, edgeBasedNodeID, nameID, isAccessRestricted, shortcut, forward, backward, roundabout, ignore_in_grid, travel_mode
{0, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 0, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 2, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 3, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{3, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
};
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[1].data));
BOOST_ASSERT(edges[1].data.IsCompatibleTo(edges[2].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[3].data));
BOOST_ASSERT(edges[3].data.IsCompatibleTo(edges[4].data));
BOOST_ASSERT(edges[4].data.IsCompatibleTo(edges[5].data));
NodeBasedDynamicGraph graph(4, edges);
compressor.Compress(barrier_nodes, traffic_lights, map, graph, container);
BOOST_CHECK(graph.FindEdge(0, 1) != SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(1, 2) != SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(1, 3) != SPECIAL_EDGEID);
}
BOOST_AUTO_TEST_CASE(street_name_changes)
{
//
// 0---1---2
//
SpeedProfileProperties speed_profile;
GraphCompressor compressor(speed_profile);
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
RestrictionMap map;
CompressedEdgeContainer container;
using InputEdge = NodeBasedDynamicGraph::InputEdge;
std::vector<InputEdge> edges = {
// source, target, distance, edgeBasedNodeID, nameID, isAccessRestricted, shortcut, forward, backward, roundabout, ignore_in_grid, travel_mode
{0, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 0, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 2, 1, SPECIAL_EDGEID, 1, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 1, 1, SPECIAL_EDGEID, 1, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
};
BOOST_ASSERT(edges[0].data.IsCompatibleTo(edges[1].data));
BOOST_ASSERT(edges[2].data.IsCompatibleTo(edges[3].data));
NodeBasedDynamicGraph graph(5, edges);
compressor.Compress(barrier_nodes, traffic_lights, map, graph, container);
BOOST_CHECK(graph.FindEdge(0, 1) != SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(1, 2) != SPECIAL_EDGEID);
}
BOOST_AUTO_TEST_CASE(direction_changes)
{
//
// 0-->1---2
//
SpeedProfileProperties speed_profile;
GraphCompressor compressor(speed_profile);
std::unordered_set<NodeID> barrier_nodes;
std::unordered_set<NodeID> traffic_lights;
RestrictionMap map;
CompressedEdgeContainer container;
using InputEdge = NodeBasedDynamicGraph::InputEdge;
std::vector<InputEdge> edges = {
// source, target, distance, edgeBasedNodeID, nameID, isAccessRestricted, shortcut, forward, backward, roundabout, ignore_in_grid, travel_mode
{0, 1, 1, SPECIAL_EDGEID, 0, false, false, true, false, false, false, TRAVEL_MODE_DEFAULT},
{1, 0, 1, SPECIAL_EDGEID, 0, false, false, false, true, false, false, TRAVEL_MODE_DEFAULT},
{1, 2, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
{2, 1, 1, SPECIAL_EDGEID, 0, false, false, true, true, false, false, TRAVEL_MODE_DEFAULT},
};
NodeBasedDynamicGraph graph(5, edges);
compressor.Compress(barrier_nodes, traffic_lights, map, graph, container);
BOOST_CHECK(graph.FindEdge(0, 1) != SPECIAL_EDGEID);
BOOST_CHECK(graph.FindEdge(1, 2) != SPECIAL_EDGEID);
}
BOOST_AUTO_TEST_SUITE_END()