Merge branch 'upstream'
[routino] / src / optimiser.c
index cdb5986..d66ed44 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************
- $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"
 
 
@@ -60,13 +62,14 @@ extern int option_quickest;
 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 */
 
@@ -125,7 +128,7 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t star
        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;
@@ -144,7 +147,7 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t star
        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];
@@ -155,6 +158,14 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t star
        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
@@ -173,7 +184,10 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t star
           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)
             {
@@ -190,7 +204,10 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t star
          {
           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)
             {
@@ -258,20 +275,18 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,index_t star
 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 */
 
@@ -349,7 +364,7 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
        if(result1->prev==node2)
           goto endloop;
 
-       way=LookupWay(ways,segment->way);
+       way=LookupWay(ways,segment->way,1);
 
        if(!(way->allow&profile->allow))
           goto endloop;
@@ -368,7 +383,7 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
        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];
@@ -379,6 +394,11 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
        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
@@ -397,7 +417,7 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
           result2->prev=node1;
           result2->next=NO_NODE;
           result2->score=cumulative_score;
-          result2->segment=segment;
+          result2->segment=IndexSegment(segments,segment);
 
           if((result3=FindResult(end,node2)))
             {
@@ -427,7 +447,7 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
          {
           result2->prev=node1;
           result2->score=cumulative_score;
-          result2->segment=segment;
+          result2->segment=IndexSegment(segments,segment);
 
           if((result3=FindResult(end,node2)))
             {
@@ -457,20 +477,14 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
       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. */
 
@@ -520,11 +534,12 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
 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 */
 
@@ -567,7 +582,7 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t star
        if(result1->prev==node2)
           goto endloop;
 
-       way=LookupWay(ways,segment->way);
+       way=LookupWay(ways,segment->way,1);
 
        if(!(way->allow&profile->allow))
           goto endloop;
@@ -586,7 +601,7 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t star
        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];
@@ -597,6 +612,14 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t star
        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
@@ -612,7 +635,10 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t star
           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))
             {
@@ -624,7 +650,10 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t star
          {
           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))
             {
@@ -675,11 +704,12 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t star
 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 */
 
@@ -722,7 +752,7 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t fin
        if(result1->next==node2)
           goto endloop;
 
-       way=LookupWay(ways,segment->way);
+       way=LookupWay(ways,segment->way,1);
 
        if(!(way->allow&profile->allow))
           goto endloop;
@@ -741,7 +771,7 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t fin
        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];
@@ -752,6 +782,14 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t fin
        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
@@ -767,7 +805,10 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t fin
           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))
             {
@@ -779,7 +820,10 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t fin
          {
           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))
             {