]> granicus.if.org Git - graphviz/commitdiff
first test
authorjxz12 <jxz12@ic.ac.uk>
Thu, 9 Jan 2020 12:40:44 +0000 (12:40 +0000)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Sun, 5 Apr 2020 20:18:29 +0000 (22:18 +0200)
lib/neatogen/neato.h
lib/neatogen/neatoinit.c

index a7a59c3e50630337542608ba43fe118eb9c7ac6f..0a9b528a573226c98c96ed8dcb9626474ac5ae05 100644 (file)
@@ -26,6 +26,7 @@
 #define MODE_MAJOR       1
 #define MODE_HIER        2
 #define MODE_IPSEP       3
+#define MODE_SGD         4
 
 #define INIT_ERROR       -1
 #define INIT_SELF        0
index cd995e650aaf4e74211ea3fb221d25fbc7257ace..4da2a477f8a79b22d2132dc2d44642676eb42f63 100644 (file)
@@ -670,6 +670,8 @@ static int neatoMode(graph_t * g)
             mode = MODE_IPSEP;
 #endif
 #endif
+       else if (streq(str, "sgd"))
+               mode = MODE_SGD;
        else
            agerr(AGWARN,
                  "Illegal value %s for attribute \"mode\" in graph %s - ignored\n",
@@ -1333,6 +1335,41 @@ static void kkNeato(Agraph_t * g, int nG, int model)
     }
     solve_model(g, nG);
 }
+/* sgdNeato:
+ * Solve using stochastic gradient descent a la Zheng, Pawar, Goodman.
+ */
+static void sgdNeato(Agraph_t * g, int nG, int model)
+{
+    fprintf("hello, love from sgd");
+
+    if (model == MODEL_SUBSET) {
+        subset_model(g, nG);
+    } else if (model == MODEL_CIRCUIT) {
+        if (!circuit_model(g, nG)) {
+            agerr(AGWARN,
+                 "graph %s is disconnected. Hence, the circuit model\n",
+                 agnameof(g));
+            agerr(AGPREV,
+                 "is undefined. Reverting to the shortest path model.\n");
+            agerr(AGPREV,
+                 "Alternatively, consider running neato using -Gpack=true or decomposing\n");
+            agerr(AGPREV, "the graph into connected components.\n");
+            shortest_path(g, nG);
+        }
+    } else if (model == MODEL_MDS) {
+        shortest_path(g, nG);
+        mds_model(g, nG);
+    } else
+        shortest_path(g, nG);
+    initial_positions(g, nG);
+    diffeq_model(g, nG);
+    if (Verbose) {
+        fprintf(stderr, "Solving model %d iterations %d tol %f\n",
+               model, MaxIter, Epsilon);
+        start_timer();
+    }
+    solve_model(g, nG);
+}
 
 /* neatoLayout:
  * Use stress optimization to layout a single component
@@ -1354,10 +1391,12 @@ neatoLayout(Agraph_t * mg, Agraph_t * g, int layoutMode, int layoutModel,
     nG = scan_graph_mode(g, layoutMode);
     if ((nG < 2) || (MaxIter < 0))
        return;
-    if (layoutMode)
-       majorization(mg, g, nG, layoutMode, layoutModel, Ndim, MaxIter, am);
-    else
+       if (layoutMode == MODE_KK)
        kkNeato(g, nG, layoutModel);
+       else if (layoutMode == MODE_SGD)
+       sgdNeato(g, nG, layoutModel)
+       else
+       majorization(mg, g, nG, layoutMode, layoutModel, Ndim, MaxIter, am);
 }
 
 /* addZ;