projects
/
routino
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Imported Upstream version 1.5
[routino]
/
src
/
optimiser.c
diff --git
a/src/optimiser.c
b/src/optimiser.c
index
cdb5986
..
55b4b32
100644
(file)
--- a/
src/optimiser.c
+++ b/
src/optimiser.c
@@
-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.
Routing optimiser.
@@
-25,10
+25,11
@@
#include <stdio.h>
#include "types.h"
#include <stdio.h>
#include "types.h"
-#include "functions.h"
#include "nodes.h"
#include "segments.h"
#include "ways.h"
#include "nodes.h"
#include "segments.h"
#include "ways.h"
+
+#include "functions.h"
#include "results.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;
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;
index_t node1,node2;
score_t finish_score;
double finish_lat,finish_lon;
- Result *result1,*result2;
+ Result *result1,*result2;
+ Node *node;
Segment *segment;
Segment *segment;
- Way *way;
+ Way *way;
/* Set up the finish conditions */
/* 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;
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;
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++)
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(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(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
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->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)
{
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->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)
{
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;
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;
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;
Segment *segment;
- Way *way;
+ Way *way;
if(!option_quiet)
{
if(!option_quiet)
{
@@
-349,7
+366,7
@@
Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Results *beg
if(result1->prev==node2)
goto endloop;
if(result1->prev==node2)
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
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++)
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(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;
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
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->prev=node1;
result2->next=NO_NODE;
result2->score=cumulative_score;
- result2->segment=segment;
+ result2->segment=IndexSegment(segments,segment);
if((result3=FindResult(end,node2)))
{
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->prev=node1;
result2->score=cumulative_score;
- result2->segment=segment;
+ result2->segment=IndexSegment(segments,segment);
if((result3=FindResult(end,node2)))
{
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;
Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t start,Profile *profile)
{
Results *results;
- Queue *queue;
+ Queue *queue;
index_t node1,node2;
index_t node1,node2;
- Result *result1,*result2;
+ Result *result1,*result2;
+ Node *node;
Segment *segment;
Segment *segment;
- Way *way;
+ Way *way;
/* Insert the first node into the queue */
/* 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;
if(result1->prev==node2)
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
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++)
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(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(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
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->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))
{
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->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))
{
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;
Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,index_t finish,Profile *profile)
{
Results *results;
- Queue *queue;
+ Queue *queue;
index_t node1,node2;
index_t node1,node2;
- Result *result1,*result2;
+ Result *result1,*result2;
+ Node *node;
Segment *segment;
Segment *segment;
- Way *way;
+ Way *way;
/* Insert the first node into the queue */
/* 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;
if(result1->next==node2)
goto endloop;
- way=LookupWay(ways,segment->way);
+ way=LookupWay(ways,segment->way,1);
if(!(way->allow&profile->allow))
goto endloop;
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++)
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(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(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
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->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))
{
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->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))
{
if(!IsFakeNode(node2) && !IsSuperNode(nodes,node2))
{