Imported Upstream version 1.5
[routino] / src / optimiser.c
index cdb5986..55b4b32 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.93 2010/08/04 16:44:51 amb Exp $
 
  Routing optimiser.
 
 #include <stdio.h>
 
 #include "types.h"
-#include "functions.h"
 #include "nodes.h"
 #include "segments.h"
 #include "ways.h"
+
+#include "functions.h"
 #include "results.h"
 
 
@@ -60,13 +61,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 +127,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 +146,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 +157,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 +183,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 +203,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,14 +274,15 @@ 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)
    {
@@ -349,7 +366,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 +385,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 +396,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 +419,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 +449,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)))
             {
@@ -520,11 +542,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 +590,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 +609,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 +620,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 +643,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 +658,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 +712,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 +760,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 +779,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 +790,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 +813,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 +828,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))
             {