]> granicus.if.org Git - graphviz/commitdiff
adding a builtin tred to langs bindings
authorJohn Ellson <ellson@research.att.com>
Sat, 17 Dec 2016 03:39:39 +0000 (22:39 -0500)
committerJohn Ellson <ellson@research.att.com>
Sat, 17 Dec 2016 03:39:39 +0000 (22:39 -0500)
.gitignore
cmd/tools/Makefile.am
cmd/tools/tred2.c [new file with mode: 0644]
lib/common/types.h
lib/gvc/Makefile.am
lib/gvc/gvc.h
lib/gvc/gvtool_tred.c [new file with mode: 0644]
tclpkg/gv/gv.cpp
tclpkg/gv/gv.i

index a93fdb273e37b4969fd4a5dec18ea12cc13e26c6..7a3e2698000ff58d411240e8c1d2cfc090d3edbd 100644 (file)
@@ -191,6 +191,7 @@ cmd/tools/mm2gv
 cmd/tools/nop
 cmd/tools/sccmap
 cmd/tools/tred
+cmd/tools/tred2
 cmd/tools/unflatten
 contrib/diffimg/diffimg
 contrib/prune/prune
index cf98872dfa81c73a9f0a00cdd30de538fedb378f..4c87ab05720b130e59d2fa2b1748a10f639c917a 100644 (file)
@@ -19,10 +19,10 @@ pdfdir = $(pkgdatadir)/doc/pdf
 noinst_HEADERS = colortbl.h convert.h mmio.h matrix_market.h \
         graph_generator.h gml2gv.h gmlparse.h
 if ENABLE_STATIC
-bin_PROGRAMS = gc gvcolor gxl2gv acyclic nop ccomps sccmap tred \
+bin_PROGRAMS = gc gvcolor gxl2gv acyclic nop ccomps sccmap tred tred2\
        unflatten gvpack gvpack_static dijkstra bcomps mm2gv gvgen gml2gv gv2gml graphml2gv
 else
-bin_PROGRAMS = gc gvcolor gxl2gv acyclic nop ccomps sccmap tred \
+bin_PROGRAMS = gc gvcolor gxl2gv acyclic nop ccomps sccmap tred tred2\
        unflatten gvpack dijkstra bcomps mm2gv gvgen gml2gv gv2gml graphml2gv
 endif
 
@@ -79,6 +79,13 @@ ccomps_LDADD = \
 ccomps.1.pdf: $(srcdir)/ccomps.1
        - @GROFF@ -Tps -man $(srcdir)/ccomps.1 | @PS2PDF@ - - >ccomps.1.pdf
 
+tred2_SOURCES = tred2.c
+
+tred2_LDADD = \
+       $(top_builddir)/lib/ingraphs/libingraphs_C.la \
+       $(top_builddir)/lib/cgraph/libcgraph.la \
+       $(top_builddir)/lib/gvc/libgvc.la
+
 tred_SOURCES = tred.c
 
 tred_LDADD = \
diff --git a/cmd/tools/tred2.c b/cmd/tools/tred2.c
new file mode 100644 (file)
index 0000000..4a9a16f
--- /dev/null
@@ -0,0 +1,102 @@
+/* $Id$ $Revision$ */
+/* vim:set shiftwidth=4 ts=8: */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: See CVS logs. Details at http://www.graphviz.org/
+ *************************************************************************/
+
+
+/*
+ * Written by Stephen North
+ * Updated by Emden Gansner
+ */
+
+/*
+ * reads a sequence of graphs on stdin, and writes their
+ * transitive reduction on stdout
+ */
+
+#include "config.h"
+
+#include "gvc.h"
+#include "cgraph.h"
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "ingraphs.h"
+
+#include <getopt.h>
+
+char **Files;
+char *CmdName;
+
+#ifdef WIN32 //*dependencies
+    #pragma comment( lib, "cgraph.lib" )
+    #pragma comment( lib, "ingraphs.lib" )
+    #pragma comment( lib, "gvc.lib" )
+#endif
+
+static char *useString = "Usage: %s [-?] <files>\n\
+  -? - print usage\n\
+If no files are specified, stdin is used\n";
+
+static void usage(int v)
+{
+    printf(useString, CmdName);
+    exit(v);
+}
+
+static void init(int argc, char *argv[])
+{
+    int c;
+
+    CmdName = argv[0];
+    opterr = 0;
+    while ((c = getopt(argc, argv, ":")) != -1) {
+       switch (c) {
+       case '?':
+           if (optopt == '?')
+               usage(0);
+           else
+               fprintf(stderr, "%s: option -%c unrecognized - ignored\n",
+                       CmdName, optopt);
+           break;
+       }
+    }
+    argv += optind;
+    argc -= optind;
+
+    if (argc)
+       Files = argv;
+}
+
+static Agraph_t *gread(FILE * fp)
+{
+    return agread(fp, (Agdisc_t *) 0);
+}
+
+int main(int argc, char **argv)
+{
+    Agraph_t *g;
+    ingraph_state ig;
+
+    init(argc, argv);
+    newIngraph(&ig, Files, gread);
+
+    while ((g = nextGraph(&ig)) != 0) {
+       if (agisdirected(g))
+           gvToolTred(g);
+       agclose(g);
+    }
+
+    return 0;
+}
+
index 933af78cda4754181ad15a876b06407b7e4f37ad..8c9e0a305b1fdabb1e6500c80780ee211a240f42 100644 (file)
@@ -406,6 +406,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
        char state;
        unsigned char gui_state; /* Node state for GUI ops */
        boolean clustnode;
+       int mark;           /* for tools like tred */
 
 #ifndef DOT_ONLY
        unsigned char pinned;
@@ -419,7 +420,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
        node_t *set;
 
        /* fast graph */
-       char node_type, mark, onstack;
+       char node_type, onstack;
        char ranktype, weight_class;
        node_t *next, *prev;
        elist in, out, flat_out, flat_in, other;
index 841c42d80ab0fa534febf4cf23272a8c80a05dbd..0e05f5ad13ac457844c825418931541d1d4f0ab7 100644 (file)
@@ -34,7 +34,7 @@ pdf_DATA = gvc.3.pdf
 
 libgvc_C_la_SOURCES = gvrender.c gvlayout.c gvdevice.c gvloadimage.c \
        gvcontext.c gvjobs.c gvevent.c gvplugin.c gvconfig.c \
-       gvtextlayout.c gvusershape.c gvc.c
+       gvtool_tred.c gvtextlayout.c gvusershape.c gvc.c
 #      gvbuffstderr.c
 
 libgvc_C_la_LIBADD = \
index c1a08a4881b27217dc98b5a8c245b2cf04dd52bc..24cdada15bafbd2caa85cae6a1f6159323781102 100644 (file)
@@ -111,9 +111,13 @@ extern char** gvPluginList (GVC_t *gvc, const char* kind, int* sz, char*);
  * @param gvc Graphviz context to add library to
  * @param lib library to add
  */
-
 extern void gvAddLibrary(GVC_t *gvc, gvplugin_library_t *lib);
 
+/** Perform a Transitive Reduction on a graph
+ * @param g  graph to be transformed.
+ */
+extern void gvToolTred(graph_t *g);
+
 #undef extern
 
 #ifdef __cplusplus
diff --git a/lib/gvc/gvtool_tred.c b/lib/gvc/gvtool_tred.c
new file mode 100644 (file)
index 0000000..d53e289
--- /dev/null
@@ -0,0 +1,79 @@
+/* $Id$ $Revision$ */
+/* vim:set shiftwidth=4 ts=8: */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: See CVS logs. Details at http://www.graphviz.org/
+ *************************************************************************/
+
+
+/*
+ * Written by Stephen North
+ * Updated by Emden Gansner
+ * Adapted to gvToolTred(g) by John Ellson
+ */
+
+/*
+ * performs an inplace transitive reduction on a graph
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include "cgraph.h"
+#include "gvc.h"
+
+#define agrootof(n) ((n)->root)
+
+static int dfs(Agnode_t * n, Agedge_t * link, int warn)
+{
+    Agedge_t *e;
+    Agedge_t *f;
+    Agraph_t *g = agrootof(n);
+
+    ND_mark(n) = 1;
+
+    for (e = agfstin(g, n); e; e = f) {
+       f = agnxtin(g, e);
+       if (e == link)
+           continue;
+       if (ND_mark(agtail(e)))
+           agdelete(g, e);
+    }
+
+    for (e = agfstout(g, n); e; e = agnxtout(g, e)) {
+       if (ND_mark(aghead(e))) {
+           if (!warn) {
+               warn++;
+               fprintf(stderr,
+                       "warning: %s has cycle(s), transitive reduction not unique\n",
+                       agnameof(g));
+               fprintf(stderr, "cycle involves edge %s -> %s\n",
+                       agnameof(agtail(e)), agnameof(aghead(e)));
+           }
+       } else
+           warn = dfs(aghead(e), AGOUT2IN(e), warn);
+    }
+
+    ND_mark(n) = 0;
+    return warn;
+}
+
+void gvToolTred(Agraph_t * g)
+{
+    Agnode_t *n;
+    int warn = 0;
+
+    if (agisdirected(g)) {
+        for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
+           warn = dfs(n, NULL, warn);
+        }
+    } else {
+       fprintf(stderr, "warning: %s is not a directed graph, not attempting tred\n",
+                       agnameof(g));
+    }
+}
index 9afa2f0c3f7be43dee167000c43d751fe30785ea..097fc5b6ba445d734d732cbac12d56eb658bc766 100644 (file)
@@ -947,3 +947,14 @@ bool write(Agraph_t *g, const char *filename)
     fclose(f);
     return (! err);
 }
+
+bool tred(Agraph_t *g)
+{
+    int err = 0;
+
+    if (!g)
+        return false;
+    gvToolTred(g);    // FIXME - gvToolTred should rteturn errors code
+    return (! err);
+}
+
index b364ef0a36f8e87d2adeabc51aadafb2bb133c40..acaf5b92bc7545e996dbaf35e3a8a47e606c1c37 100644 (file)
@@ -238,5 +238,8 @@ extern char* renderdata(Agraph_t *g, const char *format);
 extern bool write(Agraph_t *g, const char *filename);
 extern bool write(Agraph_t *g, FILE *f);
 
+/*** Graph transformation tools */
+extern bool tred(Agraph_t *g);
+
 %}