Refactoring PathData class
This commit is contained in:
parent
2edf4906a4
commit
009f08dca3
@ -32,10 +32,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "../DataStructures/PhantomNodes.h"
|
#include "../DataStructures/PhantomNodes.h"
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
struct _PathData {
|
struct PathData {
|
||||||
_PathData(NodeID no, unsigned na, unsigned tu, unsigned dur) : node(no), name_id(na), durationOfSegment(dur), turnInstruction(tu) { }
|
PathData(
|
||||||
|
NodeID no,
|
||||||
|
unsigned na,
|
||||||
|
unsigned tu,
|
||||||
|
unsigned dur
|
||||||
|
) :
|
||||||
|
node(no),
|
||||||
|
name_id(na),
|
||||||
|
durationOfSegment(dur),
|
||||||
|
turnInstruction(tu)
|
||||||
|
{ }
|
||||||
NodeID node;
|
NodeID node;
|
||||||
unsigned name_id;
|
unsigned name_id;
|
||||||
unsigned durationOfSegment;
|
unsigned durationOfSegment;
|
||||||
@ -43,14 +55,18 @@ struct _PathData {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct RawRouteData {
|
struct RawRouteData {
|
||||||
std::vector< _PathData > computedShortestPath;
|
std::vector< PathData > computedShortestPath;
|
||||||
std::vector< _PathData > computedAlternativePath;
|
std::vector< PathData > computedAlternativePath;
|
||||||
std::vector< PhantomNodes > segmentEndCoordinates;
|
std::vector< PhantomNodes > segmentEndCoordinates;
|
||||||
std::vector< FixedPointCoordinate > rawViaNodeCoordinates;
|
std::vector< FixedPointCoordinate > rawViaNodeCoordinates;
|
||||||
unsigned checkSum;
|
unsigned checkSum;
|
||||||
int lengthOfShortestPath;
|
int lengthOfShortestPath;
|
||||||
int lengthOfAlternativePath;
|
int lengthOfAlternativePath;
|
||||||
RawRouteData() : checkSum(UINT_MAX), lengthOfShortestPath(INT_MAX), lengthOfAlternativePath(INT_MAX) {}
|
RawRouteData() :
|
||||||
|
checkSum(UINT_MAX),
|
||||||
|
lengthOfShortestPath(INT_MAX),
|
||||||
|
lengthOfAlternativePath(INT_MAX)
|
||||||
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* RAWROUTEDATA_H_ */
|
#endif /* RAWROUTEDATA_H_ */
|
||||||
|
@ -64,7 +64,7 @@ void DescriptionFactory::SetStartSegment(const PhantomNode & sph) {
|
|||||||
start_phantom = sph;
|
start_phantom = sph;
|
||||||
AppendSegment(
|
AppendSegment(
|
||||||
sph.location,
|
sph.location,
|
||||||
_PathData(0, sph.nodeBasedEdgeNameID, 10, sph.weight1)
|
PathData(0, sph.nodeBasedEdgeNameID, 10, sph.weight1)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ void DescriptionFactory::SetEndSegment(const PhantomNode & tph) {
|
|||||||
|
|
||||||
void DescriptionFactory::AppendSegment(
|
void DescriptionFactory::AppendSegment(
|
||||||
const FixedPointCoordinate & coordinate,
|
const FixedPointCoordinate & coordinate,
|
||||||
const _PathData & data
|
const PathData & data
|
||||||
) {
|
) {
|
||||||
if(1 == pathDescription.size() && pathDescription.back().location == coordinate) {
|
if(1 == pathDescription.size() && pathDescription.back().location == coordinate) {
|
||||||
pathDescription.back().name_id = data.name_id;
|
pathDescription.back().name_id = data.name_id;
|
||||||
|
@ -84,7 +84,7 @@ public:
|
|||||||
double GetBearing(const FixedPointCoordinate& C, const FixedPointCoordinate& B) const;
|
double GetBearing(const FixedPointCoordinate& C, const FixedPointCoordinate& B) const;
|
||||||
void AppendEncodedPolylineString(std::vector<std::string> &output) const;
|
void AppendEncodedPolylineString(std::vector<std::string> &output) const;
|
||||||
void AppendUnencodedPolylineString(std::vector<std::string> &output) const;
|
void AppendUnencodedPolylineString(std::vector<std::string> &output) const;
|
||||||
void AppendSegment(const FixedPointCoordinate & coordinate, const _PathData & data);
|
void AppendSegment(const FixedPointCoordinate & coordinate, const PathData & data);
|
||||||
void BuildRouteSummary(const double distance, const unsigned time);
|
void BuildRouteSummary(const double distance, const unsigned time);
|
||||||
void SetStartSegment(const PhantomNode & start_phantom);
|
void SetStartSegment(const PhantomNode & start_phantom);
|
||||||
void SetEndSegment(const PhantomNode & start_phantom);
|
void SetEndSegment(const PhantomNode & start_phantom);
|
||||||
|
@ -76,7 +76,7 @@ public:
|
|||||||
reply.content.push_back("lon=\"" + tmp + "\"></rtept>");
|
reply.content.push_back("lon=\"" + tmp + "\"></rtept>");
|
||||||
|
|
||||||
BOOST_FOREACH(
|
BOOST_FOREACH(
|
||||||
const _PathData & pathData,
|
const PathData & pathData,
|
||||||
rawRoute.computedShortestPath
|
rawRoute.computedShortestPath
|
||||||
) {
|
) {
|
||||||
current = facade->GetCoordinateOfNode(pathData.node);
|
current = facade->GetCoordinateOfNode(pathData.node);
|
||||||
|
@ -96,7 +96,7 @@ public:
|
|||||||
"\"status_message\": \"Found route between points\",");
|
"\"status_message\": \"Found route between points\",");
|
||||||
|
|
||||||
//Get all the coordinates for the computed route
|
//Get all the coordinates for the computed route
|
||||||
BOOST_FOREACH(const _PathData & path_data, raw_route_information.computedShortestPath) {
|
BOOST_FOREACH(const PathData & path_data, raw_route_information.computedShortestPath) {
|
||||||
current = facade->GetCoordinateOfNode(path_data.node);
|
current = facade->GetCoordinateOfNode(path_data.node);
|
||||||
description_factory.AppendSegment(current, path_data );
|
description_factory.AppendSegment(current, path_data );
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ public:
|
|||||||
if(raw_route_information.lengthOfAlternativePath != INT_MAX) {
|
if(raw_route_information.lengthOfAlternativePath != INT_MAX) {
|
||||||
alternateDescriptionFactory.SetStartSegment(phantom_nodes.startPhantom);
|
alternateDescriptionFactory.SetStartSegment(phantom_nodes.startPhantom);
|
||||||
//Get all the coordinates for the computed route
|
//Get all the coordinates for the computed route
|
||||||
BOOST_FOREACH(const _PathData & path_data, raw_route_information.computedAlternativePath) {
|
BOOST_FOREACH(const PathData & path_data, raw_route_information.computedAlternativePath) {
|
||||||
current = facade->GetCoordinateOfNode(path_data.node);
|
current = facade->GetCoordinateOfNode(path_data.node);
|
||||||
alternateDescriptionFactory.AppendSegment(current, path_data );
|
alternateDescriptionFactory.AppendSegment(current, path_data );
|
||||||
}
|
}
|
||||||
|
@ -274,7 +274,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
//unpack <s,..,v,..,t> by exploring search spaces from v
|
//unpack <s,..,v,..,t> by exploring search spaces from v
|
||||||
inline void retrievePackedViaPath(QueryHeap & _forwardHeap1, QueryHeap & _backwardHeap1, QueryHeap & _forwardHeap2, QueryHeap & _backwardHeap2,
|
inline void retrievePackedViaPath(QueryHeap & _forwardHeap1, QueryHeap & _backwardHeap1, QueryHeap & _forwardHeap2, QueryHeap & _backwardHeap2,
|
||||||
const NodeID s_v_middle, const NodeID v_t_middle, std::vector<_PathData> & unpackedPath) {
|
const NodeID s_v_middle, const NodeID v_t_middle, std::vector<PathData> & unpackedPath) {
|
||||||
//unpack [s,v)
|
//unpack [s,v)
|
||||||
std::vector<NodeID> packed_s_v_path, packed_v_t_path;
|
std::vector<NodeID> packed_s_v_path, packed_v_t_path;
|
||||||
super::RetrievePackedPathFromHeap(_forwardHeap1, _backwardHeap2, s_v_middle, packed_s_v_path);
|
super::RetrievePackedPathFromHeap(_forwardHeap1, _backwardHeap2, s_v_middle, packed_s_v_path);
|
||||||
@ -305,19 +305,19 @@ private:
|
|||||||
std::vector<NodeID> partiallyUnpackedViaPath;
|
std::vector<NodeID> partiallyUnpackedViaPath;
|
||||||
|
|
||||||
NodeID s_v_middle = UINT_MAX;
|
NodeID s_v_middle = UINT_MAX;
|
||||||
int upperBoundFor_s_v_Path = INT_MAX;//compute path <s,..,v> by reusing forward search from s
|
int upperBoundFor_s_vPath = INT_MAX;//compute path <s,..,v> by reusing forward search from s
|
||||||
newBackwardHeap.Insert(via_node, 0, via_node);
|
newBackwardHeap.Insert(via_node, 0, via_node);
|
||||||
while (0 < newBackwardHeap.Size()) {
|
while (0 < newBackwardHeap.Size()) {
|
||||||
super::RoutingStep(newBackwardHeap, existingForwardHeap, &s_v_middle, &upperBoundFor_s_v_Path, 2 * offset, false);
|
super::RoutingStep(newBackwardHeap, existingForwardHeap, &s_v_middle, &upperBoundFor_s_vPath, 2 * offset, false);
|
||||||
}
|
}
|
||||||
//compute path <v,..,t> by reusing backward search from node t
|
//compute path <v,..,t> by reusing backward search from node t
|
||||||
NodeID v_t_middle = UINT_MAX;
|
NodeID v_t_middle = UINT_MAX;
|
||||||
int upperBoundFor_v_t_Path = INT_MAX;
|
int upperBoundFor_v_tPath = INT_MAX;
|
||||||
newForwardHeap.Insert(via_node, 0, via_node);
|
newForwardHeap.Insert(via_node, 0, via_node);
|
||||||
while (0 < newForwardHeap.Size() ) {
|
while (0 < newForwardHeap.Size() ) {
|
||||||
super::RoutingStep(newForwardHeap, existingBackwardHeap, &v_t_middle, &upperBoundFor_v_t_Path, 2 * offset, true);
|
super::RoutingStep(newForwardHeap, existingBackwardHeap, &v_t_middle, &upperBoundFor_v_tPath, 2 * offset, true);
|
||||||
}
|
}
|
||||||
*real_length_of_via_path = upperBoundFor_s_v_Path + upperBoundFor_v_t_Path;
|
*real_length_of_via_path = upperBoundFor_s_vPath + upperBoundFor_v_tPath;
|
||||||
|
|
||||||
if(UINT_MAX == s_v_middle || UINT_MAX == v_t_middle)
|
if(UINT_MAX == s_v_middle || UINT_MAX == v_t_middle)
|
||||||
return;
|
return;
|
||||||
@ -469,28 +469,28 @@ private:
|
|||||||
std::vector < NodeID > packed_v_t_path;
|
std::vector < NodeID > packed_v_t_path;
|
||||||
|
|
||||||
*s_v_middle = UINT_MAX;
|
*s_v_middle = UINT_MAX;
|
||||||
int upperBoundFor_s_v_Path = INT_MAX;
|
int upperBoundFor_s_vPath = INT_MAX;
|
||||||
//compute path <s,..,v> by reusing forward search from s
|
//compute path <s,..,v> by reusing forward search from s
|
||||||
newBackwardHeap.Insert(candidate.node, 0, candidate.node);
|
newBackwardHeap.Insert(candidate.node, 0, candidate.node);
|
||||||
while (newBackwardHeap.Size() > 0) {
|
while (newBackwardHeap.Size() > 0) {
|
||||||
super::RoutingStep(newBackwardHeap, existingForwardHeap, s_v_middle, &upperBoundFor_s_v_Path, 2*offset, false);
|
super::RoutingStep(newBackwardHeap, existingForwardHeap, s_v_middle, &upperBoundFor_s_vPath, 2*offset, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(INT_MAX == upperBoundFor_s_v_Path)
|
if(INT_MAX == upperBoundFor_s_vPath)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//compute path <v,..,t> by reusing backward search from t
|
//compute path <v,..,t> by reusing backward search from t
|
||||||
*v_t_middle = UINT_MAX;
|
*v_t_middle = UINT_MAX;
|
||||||
int upperBoundFor_v_t_Path = INT_MAX;
|
int upperBoundFor_v_tPath = INT_MAX;
|
||||||
newForwardHeap.Insert(candidate.node, 0, candidate.node);
|
newForwardHeap.Insert(candidate.node, 0, candidate.node);
|
||||||
while (newForwardHeap.Size() > 0) {
|
while (newForwardHeap.Size() > 0) {
|
||||||
super::RoutingStep(newForwardHeap, existingBackwardHeap, v_t_middle, &upperBoundFor_v_t_Path, 2*offset, true);
|
super::RoutingStep(newForwardHeap, existingBackwardHeap, v_t_middle, &upperBoundFor_v_tPath, 2*offset, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(INT_MAX == upperBoundFor_v_t_Path)
|
if(INT_MAX == upperBoundFor_v_tPath)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*lengthOfViaPath = upperBoundFor_s_v_Path + upperBoundFor_v_t_Path;
|
*lengthOfViaPath = upperBoundFor_s_vPath + upperBoundFor_v_tPath;
|
||||||
|
|
||||||
//retrieve packed paths
|
//retrieve packed paths
|
||||||
super::RetrievePackedPathFromHeap(existingForwardHeap, newBackwardHeap, *s_v_middle, packed_s_v_path);
|
super::RetrievePackedPathFromHeap(existingForwardHeap, newBackwardHeap, *s_v_middle, packed_s_v_path);
|
||||||
@ -547,7 +547,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int lengthOfPathT_Test_Path = unpackedUntilDistance;
|
int lengthOfPathT_TestPath = unpackedUntilDistance;
|
||||||
unpackedUntilDistance = 0;
|
unpackedUntilDistance = 0;
|
||||||
//Traverse path s-->v
|
//Traverse path s-->v
|
||||||
for (unsigned i = 0, lengthOfPackedPath = packed_v_t_path.size() - 1; (i < lengthOfPackedPath) && unpackStack.empty(); ++i) {
|
for (unsigned i = 0, lengthOfPackedPath = packed_v_t_path.size() - 1; (i < lengthOfPackedPath) && unpackStack.empty(); ++i) {
|
||||||
@ -587,7 +587,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lengthOfPathT_Test_Path += unpackedUntilDistance;
|
lengthOfPathT_TestPath += unpackedUntilDistance;
|
||||||
//Run actual T-Test query and compare if distances equal.
|
//Run actual T-Test query and compare if distances equal.
|
||||||
engine_working_data.InitializeOrClearThirdThreadLocalStorage(
|
engine_working_data.InitializeOrClearThirdThreadLocalStorage(
|
||||||
super::facade->GetNumberOfNodes()
|
super::facade->GetNumberOfNodes()
|
||||||
@ -608,7 +608,7 @@ private:
|
|||||||
super::RoutingStep(backward_heap3, forward_heap3, &middle, &_upperBound, offset, false);
|
super::RoutingStep(backward_heap3, forward_heap3, &middle, &_upperBound, offset, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (_upperBound <= lengthOfPathT_Test_Path);
|
return (_upperBound <= lengthOfPathT_TestPath);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ public:
|
|||||||
|
|
||||||
inline void UnpackPath(
|
inline void UnpackPath(
|
||||||
const std::vector<NodeID> & packed_path,
|
const std::vector<NodeID> & packed_path,
|
||||||
std::vector<_PathData> & unpacked_path
|
std::vector<PathData> & unpacked_path
|
||||||
) const {
|
) const {
|
||||||
const unsigned packed_path_size = packed_path.size();
|
const unsigned packed_path_size = packed_path.size();
|
||||||
std::stack<std::pair<NodeID, NodeID> > recursion_stack;
|
std::stack<std::pair<NodeID, NodeID> > recursion_stack;
|
||||||
@ -199,7 +199,7 @@ public:
|
|||||||
} else {
|
} else {
|
||||||
BOOST_ASSERT_MSG(!ed.shortcut, "edge must be a shortcut");
|
BOOST_ASSERT_MSG(!ed.shortcut, "edge must be a shortcut");
|
||||||
unpacked_path.push_back(
|
unpacked_path.push_back(
|
||||||
_PathData(
|
PathData(
|
||||||
ed.id,
|
ed.id,
|
||||||
facade->GetNameIndexFromEdgeID(ed.id),
|
facade->GetNameIndexFromEdgeID(ed.id),
|
||||||
facade->GetTurnInstructionForEdgeID(ed.id),
|
facade->GetTurnInstructionForEdgeID(ed.id),
|
||||||
|
Loading…
Reference in New Issue
Block a user