last segment gets it proper name now

This commit is contained in:
Dennis Luxen 2014-03-10 15:36:58 +01:00
parent bc0665cd9f
commit b60cfd9294
3 changed files with 65 additions and 65 deletions

View File

@ -38,9 +38,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <vector>
const double VIAPATH_ALPHA = 0.15;
const double VIAPATH_EPSILON = 0.10; //alternative at most 15% longer
const double VIAPATH_GAMMA = 0.75; //alternative shares at most 75% with the shortest.
const double VIAPATH_ALPHA = 0.10;
const double VIAPATH_EPSILON = 0.15; // alternative at most 15% longer
const double VIAPATH_GAMMA = 0.75; // alternative shares at most 75% with the shortest.
template<class DataFacadeT>
class AlternativeRouting : private BasicRoutingInterface<DataFacadeT> {
@ -50,10 +50,14 @@ class AlternativeRouting : private BasicRoutingInterface<DataFacadeT> {
typedef std::pair<NodeID, NodeID> SearchSpaceEdge;
struct RankedCandidateNode {
RankedCandidateNode(const NodeID n, const int l, const int s) :
node(n),
length(l),
sharing(s)
RankedCandidateNode(
const NodeID node,
const int length,
const int sharing
) :
node(node),
length(length),
sharing(sharing)
{ }
NodeID node;
@ -255,7 +259,7 @@ public:
const int approximated_length = forward_heap1.GetKey(node) + reverse_heap1.GetKey(node);
const bool length_passes = (approximated_length < upper_bound_to_shortest_path_distance*(1+VIAPATH_EPSILON));
const bool sharing_passes = (approximated_sharing <= upper_bound_to_shortest_path_distance*VIAPATH_GAMMA);
const bool stretch_passes = (approximated_length - approximated_sharing) < ((1.+VIAPATH_EPSILON)*(upper_bound_to_shortest_path_distance-approximated_sharing));
const bool stretch_passes = (approximated_length - approximated_sharing) < ((1.+VIAPATH_ALPHA)*(upper_bound_to_shortest_path_distance-approximated_sharing));
if( length_passes && sharing_passes && stretch_passes ) {
preselected_node_list.push_back(node);
@ -279,7 +283,7 @@ public:
int length_of_via_path = 0, sharing_of_via_path = 0;
ComputeLengthAndSharingOfViaPath(node, &length_of_via_path, &sharing_of_via_path, forward_offset+reverse_offset, packed_shortest_path);
const int maximum_allowed_sharing = upper_bound_to_shortest_path_distance*VIAPATH_GAMMA;
if( sharing_of_via_path <= maximum_allowed_sharing ) {
if( sharing_of_via_path <= maximum_allowed_sharing && length_of_via_path <= upper_bound_to_shortest_path_distance*(1+VIAPATH_EPSILON)) {
ranked_candidates_list.push_back(
RankedCandidateNode(
node,
@ -317,22 +321,16 @@ public:
// int start_offset = ( packed_shortest_path.front() == phantom_node_pair.startPhantom.forward_node_id ? 1 : -1 )*phantom_node_pair.startPhantom.fwd_segment_position;
// SimpleLogger().Write(logDEBUG) << "unpacking from index " << phantom_node_pair.startPhantom.fwd_segment_position;
SimpleLogger().Write(logDEBUG) << "phantom_node_pair.startPhantom.forward_node_id: " << phantom_node_pair.startPhantom.forward_node_id;
SimpleLogger().Write(logDEBUG) << "phantom_node_pair.startPhantom.reverse_node_id: " << phantom_node_pair.startPhantom.reverse_node_id;
SimpleLogger().Write(logDEBUG) << "phantom_node_pair.targetPhantom.packed_geometry_id: " << phantom_node_pair.targetPhantom.packed_geometry_id;
// SimpleLogger().Write(logDEBUG) << "phantom_node_pair.startPhantom.forward_node_id: " << phantom_node_pair.startPhantom.forward_node_id;
// SimpleLogger().Write(logDEBUG) << "phantom_node_pair.startPhantom.reverse_node_id: " << phantom_node_pair.startPhantom.reverse_node_id;
// SimpleLogger().Write(logDEBUG) << "phantom_node_pair.targetPhantom.packed_geometry_id: " << phantom_node_pair.targetPhantom.packed_geometry_id;
// SimpleLogger().Write(logDEBUG) << "packed_shortest_path.back(): " << packed_shortest_path.back();
super::UnpackPath(
// -- packed input
packed_shortest_path,
// -- start of route
phantom_node_pair.startPhantom.packed_geometry_id,
phantom_node_pair.startPhantom.fwd_segment_position,
(packed_shortest_path.front() != phantom_node_pair.startPhantom.forward_node_id),
// -- end of route
phantom_node_pair.targetPhantom.packed_geometry_id,
phantom_node_pair.targetPhantom.fwd_segment_position,
(packed_shortest_path.back() != phantom_node_pair.targetPhantom.forward_node_id),
phantom_node_pair,
// -- unpacked output
raw_route_data.unpacked_path_segments.front()
);
@ -356,12 +354,7 @@ public:
// unpack the alternate path
super::UnpackPath(
packed_alternate_path,
phantom_node_pair.startPhantom.packed_geometry_id,
phantom_node_pair.startPhantom.fwd_segment_position,
(packed_alternate_path.front() != phantom_node_pair.startPhantom.forward_node_id),
phantom_node_pair.targetPhantom.packed_geometry_id,
phantom_node_pair.targetPhantom.fwd_segment_position,
(packed_alternate_path.back() != phantom_node_pair.targetPhantom.forward_node_id),
phantom_node_pair,
raw_route_data.unpacked_alternative
);
@ -406,10 +399,17 @@ private:
);
}
inline void ComputeLengthAndSharingOfViaPath(const NodeID via_node, int *real_length_of_via_path, int *sharing_of_via_path,
const int offset, const std::vector<NodeID> & packed_shortest_path) {
//compute and unpack <s,..,v> and <v,..,t> by exploring search spaces from v and intersecting against queues
//only half-searches have to be done at this stage
//TODO: reorder parameters
// compute and unpack <s,..,v> and <v,..,t> by exploring search spaces
// from v and intersecting against queues. only half-searches have to be
// done at this stage
inline void ComputeLengthAndSharingOfViaPath(
const NodeID via_node,
int *real_length_of_via_path,
int *sharing_of_via_path,
const int offset,
const std::vector<NodeID> & packed_shortest_path
) {
engine_working_data.InitializeOrClearSecondThreadLocalStorage(
super::facade->GetNumberOfNodes()
);
@ -609,6 +609,7 @@ private:
// return sharing;
// }
//todo: reorder parameters
template<bool is_forward_directed>
inline void AlternativeRoutingStep(
QueryHeap & forward_heap,
@ -622,7 +623,12 @@ private:
const NodeID node = forward_heap.DeleteMin();
const int distance = forward_heap.GetKey(node);
const int scaled_distance = (distance-edge_expansion_offset)/(1.+VIAPATH_EPSILON);
if( scaled_distance > *upper_bound_to_shortest_path_distance ){
// SimpleLogger().Write(logDEBUG) << "ub: " << *upper_bound_to_shortest_path_distance << ", distance: " << distance << ", scaled_distance: " << scaled_distance;
if(
(INVALID_EDGE_WEIGHT != *upper_bound_to_shortest_path_distance) &&
(scaled_distance > *upper_bound_to_shortest_path_distance)
) {
// SimpleLogger().Write(logDEBUG) << "removing nodes from heap";
forward_heap.DeleteAll();
return;
}

View File

@ -38,8 +38,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <boost/foreach.hpp>
#include <boost/noncopyable.hpp>
#include <climits>
#include <stack>
SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap;
@ -140,14 +138,12 @@ public:
//TODO: refactor parameters to only edge ids for start and end
inline void UnpackPath(
const std::vector<NodeID> & packed_path,
const unsigned packed_geometry_id_of_first_edge,
const int fwd_index_offset,
const bool start_traversed_in_reverse,
const unsigned packed_geometry_id_of_last_edge,
const int rev_index_offset,
const bool target_traversed_in_reverse,
const PhantomNodes & phantom_node_pair,
std::vector<PathData> & unpacked_path
) const {
const bool start_traversed_in_reverse = (packed_path.front() != phantom_node_pair.startPhantom.forward_node_id);
const bool target_traversed_in_reverse = (packed_path.back() != phantom_node_pair.targetPhantom.forward_node_id);
const unsigned packed_path_size = packed_path.size();
std::stack<std::pair<NodeID, NodeID> > recursion_stack;
@ -230,7 +226,7 @@ public:
std::vector<unsigned> id_vector;
facade->GetUncompressedGeometry(facade->GetGeometryIndexForEdgeID(ed.id), id_vector);
const int start_index = ( unpacked_path.empty() ? ( ( start_traversed_in_reverse ) ? id_vector.size() - fwd_index_offset - 1 : fwd_index_offset ) : 0 );
const int start_index = ( unpacked_path.empty() ? ( ( start_traversed_in_reverse ) ? id_vector.size() - phantom_node_pair.startPhantom.fwd_segment_position - 1 : phantom_node_pair.startPhantom.fwd_segment_position ) : 0 );
const int end_index = id_vector.size();
BOOST_ASSERT( start_index >= 0 );
@ -254,21 +250,22 @@ public:
}
}
}
if(SPECIAL_EDGEID != packed_geometry_id_of_last_edge) {
SimpleLogger().Write(logDEBUG) << "unpacking last segment " << packed_geometry_id_of_last_edge;
if(SPECIAL_EDGEID != phantom_node_pair.targetPhantom.packed_geometry_id ) {
SimpleLogger().Write(logDEBUG) << "unpacking last segment " << phantom_node_pair.targetPhantom.packed_geometry_id;
SimpleLogger().Write(logDEBUG) << "start_traversed_in_reverse: " << (start_traversed_in_reverse ? "y" : "n");
SimpleLogger().Write(logDEBUG) << "target_traversed_in_reverse: " << (target_traversed_in_reverse ? "y" : "n");
SimpleLogger().Write(logDEBUG) << "fwd_index_offset: " << fwd_index_offset << ", rev_index_offset: " << rev_index_offset;
SimpleLogger().Write(logDEBUG) << "phantom_node_pair.startPhantom.fwd_segment_position: " << phantom_node_pair.startPhantom.fwd_segment_position << ", " <<
"phantom_node_pair.targetPhantom.fwd_segment_position: " << phantom_node_pair.targetPhantom.fwd_segment_position;
std::vector<unsigned> id_vector;
facade->GetUncompressedGeometry(packed_geometry_id_of_last_edge, id_vector);
facade->GetUncompressedGeometry(phantom_node_pair.targetPhantom.packed_geometry_id, id_vector);
if( target_traversed_in_reverse ) {
std::reverse(id_vector.begin(), id_vector.end() );
}
SimpleLogger().Write(logDEBUG) << "id_vector.size() " << id_vector.size();
const bool start_and_end_on_same_edge = (packed_geometry_id_of_first_edge == packed_geometry_id_of_last_edge) && unpacked_path.empty();
const bool start_and_end_on_same_edge = (phantom_node_pair.startPhantom.packed_geometry_id == phantom_node_pair.targetPhantom.packed_geometry_id) && unpacked_path.empty();
const int start_index = ( start_and_end_on_same_edge ? id_vector.size() - fwd_index_offset : 0 );
const int end_index = (target_traversed_in_reverse ? id_vector.size() - rev_index_offset : rev_index_offset);
const int start_index = ( start_and_end_on_same_edge ? phantom_node_pair.startPhantom.fwd_segment_position : 0 );
const int end_index = (target_traversed_in_reverse ? id_vector.size() - phantom_node_pair.targetPhantom.fwd_segment_position : phantom_node_pair.targetPhantom.fwd_segment_position);
SimpleLogger().Write(logDEBUG) << "fetching from [" << start_index << "," << end_index << "]";
@ -283,7 +280,7 @@ public:
unpacked_path.push_back(
PathData(
id_vector[i],
0,
phantom_node_pair.targetPhantom.name_id,
TurnInstructionsClass::NoTurn,
0
)

View File

@ -359,7 +359,7 @@ public:
std::swap( packed_legs1, packed_legs2 );
}
raw_route_data.unpacked_path_segments.resize( packed_legs1.size() );
const int start_offset = ( packed_legs1[0].front() == phantom_nodes_vector.front().startPhantom.forward_node_id ? 1 : -1 )*phantom_nodes_vector.front().startPhantom.fwd_segment_position;
// const int start_offset = ( packed_legs1[0].front() == phantom_nodes_vector.front().startPhantom.forward_node_id ? 1 : -1 )*phantom_nodes_vector.front().startPhantom.fwd_segment_position;
for(unsigned i = 0; i < packed_legs1.size(); ++i){
BOOST_ASSERT( !phantom_nodes_vector.empty() );
@ -367,30 +367,27 @@ public:
const bool at_end = (packed_legs1.size() == i+1);
BOOST_ASSERT(packed_legs1.size() == raw_route_data.unpacked_path_segments.size() );
PhantomNodes unpack_phantom_node_pair = phantom_nodes_vector[i];
if (!at_beginning)
{
unpack_phantom_node_pair.startPhantom.packed_geometry_id = SPECIAL_EDGEID;
unpack_phantom_node_pair.startPhantom.fwd_segment_position = 0;
}
if (!at_end)
{
unpack_phantom_node_pair.targetPhantom.packed_geometry_id = SPECIAL_EDGEID;
unpack_phantom_node_pair.targetPhantom.fwd_segment_position = 0;
}
super::UnpackPath(
// -- packed input
packed_legs1[i],
// -- start of route
( !at_beginning ? SPECIAL_EDGEID : phantom_nodes_vector.front().startPhantom.packed_geometry_id ),
( !at_beginning ? 0 : phantom_nodes_vector.front().startPhantom.fwd_segment_position ),
( !at_beginning ? false : (packed_legs1.front().front() != phantom_nodes_vector.front().startPhantom.forward_node_id) ),
// -- end of route
( !at_end ? SPECIAL_EDGEID : phantom_nodes_vector.back().targetPhantom.packed_geometry_id ),
( !at_end ? 0 : phantom_nodes_vector.back().targetPhantom.fwd_segment_position ),
( !at_end ? false : (packed_legs1.back().back() != phantom_nodes_vector.back().targetPhantom.forward_node_id) ),
// -- start and end of (sub-)route
unpack_phantom_node_pair,
// -- unpacked output
raw_route_data.unpacked_path_segments[i]
);
// // TODO: properly unpack first and last segments
// super::UnpackPath(
// packed_legs1[i],
// SPECIAL_EDGEID, ( at_beginning ? start_offset : 0), false,
// SPECIAL_EDGEID, 0, false,
// raw_route_data.unpacked_path_segments[i]
// );
}
raw_route_data.lengthOfShortestPath = std::min(distance1, distance2);
}