Imported Upstream version 1.5
[routino] / src / superx.c
index 45b8227..20dc065 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************
- $Header: /home/amb/routino/src/RCS/superx.c,v 1.38 2010/07/05 19:05:51 amb Exp $
+ $Header: /home/amb/routino/src/RCS/superx.c,v 1.44 2010/10/09 14:14:42 amb Exp $
 
  Super-Segment data type functions.
 
  ***************************************/
 
 
-#include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>
 
-#include "results.h"
-#include "functions.h"
+#include "ways.h"
+
 #include "nodesx.h"
 #include "segmentsx.h"
 #include "waysx.h"
 #include "superx.h"
-#include "ways.h"
 
+#include "files.h"
+#include "results.h"
 
-/* Variables */
-
-/*+ The command line '--slim' option. +*/
-extern int option_slim;
 
 /* Local Functions */
 
@@ -60,9 +56,8 @@ void ChooseSuperNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx)
  index_t i;
  int nnodes=0;
 
- /* Check the start conditions */
-
- assert(segmentsx->firstnode); /* Must have firstnode filled in => segments are updated */
+ if(nodesx->number==0 || segmentsx->number==0 || waysx->number==0)
+    return;
 
  /* Print the start message */
 
@@ -71,16 +66,17 @@ void ChooseSuperNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx)
 
  /* Map into memory */
 
- if(!option_slim)
-   {
-    segmentsx->xdata=MapFile(segmentsx->filename);
-    waysx->xdata=MapFile(waysx->filename);
-   }
+#if !SLIM
+ nodesx->xdata=MapFile(nodesx->filename);
+ segmentsx->xdata=MapFile(segmentsx->filename);
+ waysx->xdata=MapFile(waysx->filename);
+#endif
 
  /* Find super-nodes */
 
  for(i=0;i<nodesx->number;i++)
    {
+    NodeX *nodex=LookupNodeX(nodesx,i,1);
     int difference=0;
     index_t index1,index2;
 
@@ -94,12 +90,20 @@ void ChooseSuperNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx)
        index1=IndexNextSegmentX(segmentsx,index1,i);
        index2=index1;
 
+       /* If the node allows less traffic types than any connecting way ... */
+
+       if((wayx1->way.allow&nodex->allow)!=wayx1->way.allow)
+         {
+          difference=1;
+          break;
+         }
+
        while(index2!=NO_SEGMENT)
          {
           SegmentX *segmentx2=LookupSegmentX(segmentsx,index2,2);
           WayX *wayx2=LookupWayX(waysx,segmentx2->way,2);
 
-          /* If the ways are different in any way and there is a type of traffic that can use both ... */
+          /* If the ways are different in any attribute and there is a type of traffic that can use both ... */
 
           if(WaysCompare(&wayx1->way,&wayx2->way))
              if(wayx1->way.allow & wayx2->way.allow)
@@ -133,11 +137,11 @@ void ChooseSuperNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx)
 
  /* Unmap from memory */
 
- if(!option_slim)
-   {
-    segmentsx->xdata=UnmapFile(segmentsx->filename);
-    waysx->xdata=UnmapFile(waysx->filename);
-   }
+#if !SLIM
+ nodesx->xdata=UnmapFile(nodesx->filename);
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+ waysx->xdata=UnmapFile(waysx->filename);
+#endif
 
  /* Print the final message */
 
@@ -166,9 +170,10 @@ SegmentsX *CreateSuperSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,
  SegmentsX *supersegmentsx;
  int sn=0,ss=0;
 
- /* Check the start conditions */
+ supersegmentsx=NewSegmentList(0);
 
- assert(segmentsx->firstnode); /* Must have firstnode filled in => segments are updated */
+ if(segmentsx->number==0 || waysx->number==0)
+    return(supersegmentsx);
 
  /* Print the start message */
 
@@ -177,16 +182,13 @@ SegmentsX *CreateSuperSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,
 
  /* Map into memory */
 
- if(!option_slim)
-   {
-    segmentsx->xdata=MapFile(segmentsx->filename);
-    waysx->xdata=MapFile(waysx->filename);
-   }
+#if !SLIM
+ segmentsx->xdata=MapFile(segmentsx->filename);
+ waysx->xdata=MapFile(waysx->filename);
+#endif
 
  /* Create super-segments for each super-node. */
 
- supersegmentsx=NewSegmentList(0);
-
  for(i=0;i<nodesx->number;i++)
    {
     if(nodesx->super[i]>iteration)
@@ -264,11 +266,10 @@ SegmentsX *CreateSuperSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,
 
  /* Unmap from memory */
 
- if(!option_slim)
-   {
-    segmentsx->xdata=UnmapFile(segmentsx->filename);
-    waysx->xdata=UnmapFile(waysx->filename);
-   }
+#if !SLIM
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+ waysx->xdata=UnmapFile(waysx->filename);
+#endif
 
  /* Print the final message */
 
@@ -295,6 +296,11 @@ SegmentsX *MergeSuperSegments(SegmentsX* segmentsx,SegmentsX* supersegmentsx)
  int m=0,a=0;
  SegmentsX* mergedsegmentsx;
 
+ mergedsegmentsx=NewSegmentList(0);
+
+ if(segmentsx->number==0 || supersegmentsx->number==0)
+    return(mergedsegmentsx);
+
  /* Print the start message */
 
  printf("Merging: Segments=0 Super-Segments=0 Merged=0 Added=0");
@@ -302,16 +308,13 @@ SegmentsX *MergeSuperSegments(SegmentsX* segmentsx,SegmentsX* supersegmentsx)
 
  /* Map into memory */
 
- if(!option_slim)
-   {
-    segmentsx->xdata=MapFile(segmentsx->filename);
-    supersegmentsx->xdata=MapFile(supersegmentsx->filename);
-   }
+#if !SLIM
+ segmentsx->xdata=MapFile(segmentsx->filename);
+ supersegmentsx->xdata=MapFile(supersegmentsx->filename);
+#endif
 
  /* Loop through and create a new list of combined segments */
 
- mergedsegmentsx=NewSegmentList(0);
-
  for(i=0,j=0;i<segmentsx->number;i++)
    {
     int super=0;
@@ -363,11 +366,10 @@ SegmentsX *MergeSuperSegments(SegmentsX* segmentsx,SegmentsX* supersegmentsx)
 
  /* Unmap from memory */
 
- if(!option_slim)
-   {
-    segmentsx->xdata=UnmapFile(segmentsx->filename);
-    supersegmentsx->xdata=UnmapFile(supersegmentsx->filename);
-   }
+#if !SLIM
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+ supersegmentsx->xdata=UnmapFile(supersegmentsx->filename);
+#endif
 
  /* Print the final message */