/***************************************
- $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"
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)
{
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)))
{
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))
{