]> granicus.if.org Git - graphviz/commitdiff
Fix bug 2326
authorEmden R. Gansner <erg@research.att.com>
Tue, 13 Aug 2013 20:06:40 +0000 (16:06 -0400)
committerEmden R. Gansner <erg@research.att.com>
Tue, 13 Aug 2013 20:06:40 +0000 (16:06 -0400)
lib/dotgen/aspect.c
lib/dotgen/aspect.h
lib/dotgen/dotinit.c

index 4580cfe22193b89d3850162b1eef92dadf97737f..c55533ea66a1557cabf5f4c244f7b1353be07396 100644 (file)
@@ -24,6 +24,9 @@
  *   - Provide algorithms for aspect ratios < 1
  */
 
+#define MIN_AR 1.0
+#define MAX_AR 20.0
+#define DEF_PASSES 5
 #define DPI 72
 
 /*
@@ -1785,10 +1788,11 @@ void rank3(graph_t * g, aspect_t * asp)
     Agnode_t *n;
     int i;
     int iterations = asp->nextIter;
+    double lastAR = MAXDOUBLE;
 
     computeNodeGroups(g);      /* groups of UF DS nodes */
 
-    for (i = 0; i < iterations || iterations == -1; i++) {
+    for (i = 0; (i < iterations) || (iterations == -1); i++) {
        /* initialize all ranks to be 0 */
        for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
            ND_rank(n) = 0;
@@ -1814,12 +1818,14 @@ void rank3(graph_t * g, aspect_t * asp)
            break;
        } else
 #endif
-       if (iterations == -1 && asp->combiAR <= asp->targetAR) {
+        /* Success or if no improvement */
+       if ((asp->combiAR <= asp->targetAR) || ((iterations == -1) && (lastAR <= asp->combiAR))) {
            asp->prevIterations = asp->curIterations;
            asp->curIterations = i;
 
            break;
        }
+       lastAR = asp->combiAR;
        /* Apply the FFDH algorithm to reduce the aspect ratio; */
        applyPacking2(g);
     }
@@ -1967,3 +1973,31 @@ void init_UF_size(graph_t * g)
     for (n = agfstnode(g); n; n = agnxtnode(g, n))
        ND_UF_size(n) = 0;
 }
+
+aspect_t*
+setAspect (Agraph_t * g, aspect_t* adata)
+{
+    double rv;
+    char *p;
+    int r, passes = DEF_PASSES;
+
+    p = agget (g, "aspect");
+
+    if (!p || ((r = sscanf (p, "%lf,%d", &rv, &passes)) <= 0)) {
+       adata->nextIter = 0;
+       adata->badGraph = 0;
+       return NULL;
+    }
+    
+    if (rv < MIN_AR) rv = MIN_AR;
+    else if (rv > MAX_AR) rv = MAX_AR;
+    adata->targetAR = rv;
+    adata->nextIter = -1;
+    adata->nPasses = passes;
+    adata->badGraph = 0;
+
+    if (Verbose) 
+        fprintf(stderr, "Target AR = %g\n", adata->targetAR);
+
+    return adata;
+}
index 1d4c9f084dd5628e3de06c038e48cec8d16d17f0..f0b84365d7c69e4a9747685fd6222fe0532c3129 100644 (file)
@@ -25,6 +25,7 @@ typedef struct aspect_t {
                            * clusters. If so, turn off aspect */
 } aspect_t;
 
+extern aspect_t* setAspect (Agraph_t * g, aspect_t* adata);
 extern void rank3(graph_t * g, aspect_t * asp);
 extern void initEdgeTypes(graph_t * g);
 extern void init_UF_size(graph_t * g);
index 0bdd028406624af4dc2ebe4fea8ccac2d5d26390..2dc97e70190b50f3e87513128ce92567ff38e589 100644 (file)
@@ -249,37 +249,6 @@ dumpRanks (graph_t * g)
 }
 #endif
 
-#define MIN_AR 1.0
-#define MAX_AR 20.0
-#define DEF_PASSES 5
-
-static aspect_t*
-setAspect (Agraph_t * g, aspect_t* adata)
-{
-    double rv;
-    char *p;
-    int r, passes = DEF_PASSES;
-
-    p = agget (g, "aspect");
-
-    if (!p || ((r = sscanf (p, "%lf,%d", &rv, &passes)) <= 0)) {
-       adata->nextIter = 0;
-       adata->badGraph = 0;
-       return NULL;
-    }
-    
-    if (rv < MIN_AR) rv = MIN_AR;
-    else if (rv > MAX_AR) rv = MAX_AR;
-    adata->targetAR = rv;
-    adata->nextIter = -1;
-    adata->nPasses = passes;
-    adata->badGraph = 0;
-
-    if (Verbose) 
-        fprintf(stderr, "Target AR = %g\n", adata->targetAR);
-
-    return adata;
-}
 
 #ifdef WITH_CGRAPH
 static void