/***************************************
- $Header: /home/amb/routino/src/RCS/optimiser.c,v 1.87 2010/07/08 17:33:09 amb Exp $
+ $Header: /home/amb/routino/src/RCS/optimiser.c,v 1.94 2010/11/13 14:22:28 amb Exp $
Routing optimiser.
#include <stdio.h>
#include "types.h"
-#include "functions.h"
#include "nodes.h"
#include "segments.h"
#include "ways.h"
+
+#include "logging.h"
+#include "functions.h"
#include "results.h"
Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t start,index_t finish,Profile *profile)
{
Results *results;
- Queue *queue;
+ Queue *queue;
index_t node1,node2;
score_t finish_score;
double finish_lat,finish_lon;
- Result *result1,*result2;
+ Result *result1,*result2;
+ Node *node;
Segment *segment;
- Way *way;
+ Way *way;
/* Set up the finish conditions */
if(node2!=finish && !IsFakeNode(node2) && IsSuperNode(nodes,node2))
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
segment_pref=profile->highway[HIGHWAY(way->type)];
for(i=1;i<Property_Count;i++)
- if(ways->props & PROPERTIES(i))
+ if(ways->file.props & PROPERTIES(i))
{
if(way->props & PROPERTIES(i))
segment_pref*=profile->props_yes[i];
if(segment_pref==0)
goto endloop;
+ if(!IsFakeNode(node2))
+ {
+ node=LookupNode(nodes,node2,1);
+
+ if(!(node->allow&profile->allow))
+ goto endloop;
+ }
+
if(option_quickest==0)
segment_score=(score_t)DISTANCE(segment->distance)/segment_pref;
else
result2->prev=node1;
result2->next=NO_NODE;
result2->score=cumulative_score;
- result2->segment=segment;
+ if(IsFakeNode(node1) || IsFakeNode(node2))
+ result2->segment=IndexFakeSegment(segment);
+ else
+ result2->segment=IndexSegment(segments,segment);
if(node2==finish)
{
{
result2->prev=node1;
result2->score=cumulative_score;
- result2->segment=segment;
+ if(IsFakeNode(node1) || IsFakeNode(node2))
+ result2->segment=IndexFakeSegment(segment);
+ else
+ result2->segment=IndexSegment(segments,segment);
if(node2==finish)
{
Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *begin,Results *end,Profile *profile)
{
Results *results;
- Queue *queue;
+ Queue *queue;
index_t node1,node2;
index_t end_prev;
score_t finish_score;
double finish_lat,finish_lon;
- Result *result1,*result2,*result3;
+ Result *result1,*result2,*result3;
+ Node *node;
Segment *segment;
- Way *way;
+ Way *way;
if(!option_quiet)
- {
- printf("Routing: Super-Nodes checked = 0");
- fflush(stdout);
- }
+ printf_first("Routing: Super-Nodes checked = 0");
/* Set up the finish conditions */
if(result1->prev==node2)
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
segment_pref=profile->highway[HIGHWAY(way->type)];
for(i=1;i<Property_Count;i++)
- if(ways->props & PROPERTIES(i))
+ if(ways->file.props & PROPERTIES(i))
{
if(way->props & PROPERTIES(i))
segment_pref*=profile->props_yes[i];
if(segment_pref==0)
goto endloop;
+ node=LookupNode(nodes,node2,1);
+
+ if(!(node->allow&profile->allow))
+ goto endloop;
+
if(option_quickest==0)
segment_score=(score_t)DISTANCE(segment->distance)/segment_pref;
else
result2->prev=node1;
result2->next=NO_NODE;
result2->score=cumulative_score;
- result2->segment=segment;
+ result2->segment=IndexSegment(segments,segment);
if((result3=FindResult(end,node2)))
{
{
result2->prev=node1;
result2->score=cumulative_score;
- result2->segment=segment;
+ result2->segment=IndexSegment(segments,segment);
if((result3=FindResult(end,node2)))
{
endloop:
if(!option_quiet && !(results->number%10000))
- {
- printf("\rRouting: Super-Nodes checked = %d",results->number);
- fflush(stdout);
- }
+ printf_middle("Routing: Super-Nodes checked = %d",results->number);
segment=NextSegment(segments,segment,node1);
}
}
if(!option_quiet)
- {
- printf("\rRouting: Super-Nodes checked = %d\n",results->number);
- fflush(stdout);
- }
+ printf_last("Routing: Super-Nodes checked = %d",results->number);
/* Finish off the end part of the route. */
Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t start,Profile *profile)
{
Results *results;
- Queue *queue;
+ Queue *queue;
index_t node1,node2;
- Result *result1,*result2;
+ Result *result1,*result2;
+ Node *node;
Segment *segment;
- Way *way;
+ Way *way;
/* Insert the first node into the queue */
if(result1->prev==node2)
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
segment_pref=profile->highway[HIGHWAY(way->type)];
for(i=1;i<Property_Count;i++)
- if(ways->props & PROPERTIES(i))
+ if(ways->file.props & PROPERTIES(i))
{
if(way->props & PROPERTIES(i))
segment_pref*=profile->props_yes[i];
if(segment_pref==0)
goto endloop;
+ if(!IsFakeNode(node2))
+ {
+ node=LookupNode(nodes,node2,1);
+
+ if(!(node->allow&profile->allow))
+ goto endloop;
+ }
+
if(option_quickest==0)
segment_score=(score_t)DISTANCE(segment->distance)/segment_pref;
else
result2->prev=node1;
result2->next=NO_NODE;
result2->score=cumulative_score;
- result2->segment=segment;
+ if(IsFakeNode(node1) || IsFakeNode(node2))
+ result2->segment=IndexFakeSegment(segment);
+ else
+ result2->segment=IndexSegment(segments,segment);
if(!IsFakeNode(node2) && !IsSuperNode(nodes,node2))
{
{
result2->prev=node1;
result2->score=cumulative_score;
- result2->segment=segment;
+ if(IsFakeNode(node1) || IsFakeNode(node2))
+ result2->segment=IndexFakeSegment(segment);
+ else
+ result2->segment=IndexSegment(segments,segment);
if(!IsFakeNode(node2) && !IsSuperNode(nodes,node2))
{
Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t finish,Profile *profile)
{
Results *results;
- Queue *queue;
+ Queue *queue;
index_t node1,node2;
- Result *result1,*result2;
+ Result *result1,*result2;
+ Node *node;
Segment *segment;
- Way *way;
+ Way *way;
/* Insert the first node into the queue */
if(result1->next==node2)
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
segment_pref=profile->highway[HIGHWAY(way->type)];
for(i=1;i<Property_Count;i++)
- if(ways->props & PROPERTIES(i))
+ if(ways->file.props & PROPERTIES(i))
{
if(way->props & PROPERTIES(i))
segment_pref*=profile->props_yes[i];
if(segment_pref==0)
goto endloop;
+ if(!IsFakeNode(node2))
+ {
+ node=LookupNode(nodes,node2,1);
+
+ if(!(node->allow&profile->allow))
+ goto endloop;
+ }
+
if(option_quickest==0)
segment_score=(score_t)DISTANCE(segment->distance)/segment_pref;
else
result2->prev=NO_NODE;
result2->next=node1;
result2->score=cumulative_score;
- result2->segment=segment;
+ if(IsFakeNode(node1) || IsFakeNode(node2))
+ result2->segment=IndexFakeSegment(segment);
+ else
+ result2->segment=IndexSegment(segments,segment);
if(!IsFakeNode(node2) && !IsSuperNode(nodes,node2))
{
{
result2->next=node1;
result2->score=cumulative_score;
- result2->segment=segment;
+ if(IsFakeNode(node1) || IsFakeNode(node2))
+ result2->segment=IndexFakeSegment(segment);
+ else
+ result2->segment=IndexSegment(segments,segment);
if(!IsFakeNode(node2) && !IsSuperNode(nodes,node2))
{