From e0ba1d07a6e61a36965a22c5d5e25c63424ff5fb Mon Sep 17 00:00:00 2001 From: Alex Vondrak Date: Sun, 22 May 2011 12:06:48 -0700 Subject: [PATCH 1/3] add graphviz vocab --- .../attributes/attributes-docs.factor | 51 + extra/graphviz/attributes/attributes.factor | 211 ++++ extra/graphviz/builder/builder-docs.factor | 45 + extra/graphviz/builder/builder.factor | 123 +++ extra/graphviz/ffi/ffi-docs.factor | 44 + extra/graphviz/ffi/ffi.factor | 158 +++ extra/graphviz/gallery/c5.png | Bin 0 -> 6080 bytes extra/graphviz/gallery/c6.png | Bin 0 -> 6890 bytes extra/graphviz/gallery/c7.png | Bin 0 -> 8614 bytes extra/graphviz/gallery/circles.png | Bin 0 -> 11867 bytes extra/graphviz/gallery/cluster.png | Bin 0 -> 41319 bytes extra/graphviz/gallery/fsm.png | Bin 0 -> 54046 bytes extra/graphviz/gallery/k33.png | Bin 0 -> 4917 bytes extra/graphviz/gallery/k34.png | Bin 0 -> 7150 bytes extra/graphviz/gallery/k5.png | Bin 0 -> 9568 bytes extra/graphviz/gallery/k54.png | Bin 0 -> 10611 bytes extra/graphviz/gallery/k6.png | Bin 0 -> 11877 bytes extra/graphviz/gallery/k7.png | Bin 0 -> 20397 bytes extra/graphviz/gallery/record.png | Bin 0 -> 45394 bytes extra/graphviz/gallery/w6.png | Bin 0 -> 11526 bytes extra/graphviz/gallery/w7.png | Bin 0 -> 9196 bytes extra/graphviz/gallery/w8.png | Bin 0 -> 13343 bytes extra/graphviz/graphviz-docs.factor | 938 ++++++++++++++++++ extra/graphviz/graphviz.factor | 87 ++ extra/graphviz/libcgraph/libcgraph.factor | 76 ++ extra/graphviz/notation/notation-docs.factor | 467 +++++++++ extra/graphviz/notation/notation.factor | 89 ++ extra/graphviz/render/render-docs.factor | 333 +++++++ extra/graphviz/render/render.factor | 136 +++ 29 files changed, 2758 insertions(+) create mode 100644 extra/graphviz/attributes/attributes-docs.factor create mode 100644 extra/graphviz/attributes/attributes.factor create mode 100644 extra/graphviz/builder/builder-docs.factor create mode 100644 extra/graphviz/builder/builder.factor create mode 100644 extra/graphviz/ffi/ffi-docs.factor create mode 100644 extra/graphviz/ffi/ffi.factor create mode 100644 extra/graphviz/gallery/c5.png create mode 100644 extra/graphviz/gallery/c6.png create mode 100644 extra/graphviz/gallery/c7.png create mode 100644 extra/graphviz/gallery/circles.png create mode 100644 extra/graphviz/gallery/cluster.png create mode 100644 extra/graphviz/gallery/fsm.png create mode 100644 extra/graphviz/gallery/k33.png create mode 100644 extra/graphviz/gallery/k34.png create mode 100644 extra/graphviz/gallery/k5.png create mode 100644 extra/graphviz/gallery/k54.png create mode 100644 extra/graphviz/gallery/k6.png create mode 100644 extra/graphviz/gallery/k7.png create mode 100644 extra/graphviz/gallery/record.png create mode 100644 extra/graphviz/gallery/w6.png create mode 100644 extra/graphviz/gallery/w7.png create mode 100644 extra/graphviz/gallery/w8.png create mode 100644 extra/graphviz/graphviz-docs.factor create mode 100644 extra/graphviz/graphviz.factor create mode 100644 extra/graphviz/libcgraph/libcgraph.factor create mode 100644 extra/graphviz/notation/notation-docs.factor create mode 100644 extra/graphviz/notation/notation.factor create mode 100644 extra/graphviz/render/render-docs.factor create mode 100644 extra/graphviz/render/render.factor diff --git a/extra/graphviz/attributes/attributes-docs.factor b/extra/graphviz/attributes/attributes-docs.factor new file mode 100644 index 0000000000..3a8c847975 --- /dev/null +++ b/extra/graphviz/attributes/attributes-docs.factor @@ -0,0 +1,51 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: graphviz help.markup help.syntax kernel strings ; +IN: graphviz.attributes + +{ + node-attributes + edge-attributes + graph-attributes + + + +} related-words + +HELP: +{ $values + { "attrs" edge-attributes } +} +{ $description "Constructs " { $instance edge-attributes } " tuple with no attributes set." } ; + +HELP: +{ $values + { "attrs" graph-attributes } +} +{ $description "Constructs " { $instance graph-attributes } " tuple with no attributes set." } ; + +HELP: +{ $values + { "attrs" node-attributes } +} +{ $description "Constructs " { $instance node-attributes } " tuple with no attributes set." } ; + +HELP: edge-attributes +{ $class-description "Represents Graphviz attributes that are valid for edges. See attributes marked " { $emphasis "E" } " in " { $url "http://graphviz.org/content/attrs" } ". Each slot must be " { $maybe string } "." } ; + +HELP: graph-attributes +{ $class-description "Represents Graphviz attributes that are valid for graphs and subgraphs (including clusters). See attributes marked " { $emphasis "G" } ", " { $emphasis "S" } ", and " { $emphasis "C" } " in " { $url "http://graphviz.org/content/attrs" } ". Each slot must be " { $maybe string } "." } ; + +HELP: node-attributes +{ $class-description "Represents Graphviz attributes that are valid for nodes. See attributes marked " { $emphasis "N" } " in " { $url "http://graphviz.org/content/attrs" } ". Each slot must be " { $maybe string } "." } ; + +ARTICLE: "graphviz.attributes" "Graphviz attributes" +"In Graphviz, " { $emphasis "attributes" } " control different layout characteristics of graphs, subgraphs, nodes, and edges. For example, you can specify the color of an edge or the shape of a node. Graphviz provides documentation for all valid attributes at " { $url "http://graphviz.org/content/attrs" } "." +$nl +"The " { $vocab-link "graphviz.attributes" } " vocabulary simply provides three different tuples to encapsulate Graphviz attributes:" +{ $subsections node-attributes edge-attributes graph-attributes } +"Empty instances are created with the following constructors:" +{ $subsections } +; + +ABOUT: "graphviz.attributes" diff --git a/extra/graphviz/attributes/attributes.factor b/extra/graphviz/attributes/attributes.factor new file mode 100644 index 0000000000..5a455d3c4c --- /dev/null +++ b/extra/graphviz/attributes/attributes.factor @@ -0,0 +1,211 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel ; +IN: graphviz.attributes + +TUPLE: graph-attributes +Damping +K +URL +aspect +bb +bgcolor +center +charset +clusterrank +color +colorscheme +comment +compound +concentrate +defaultdist +dim +dimen +diredgeconstraints +dpi +epsilon +esep +fillcolor +fontcolor +fontname +fontnames +fontpath +fontsize +id +label +labeljust +labelloc +landscape +layers +layersep +layout +levels +levelsgap +lheight +lp +lwidth +margin +maxiter +mclimit +mindist +mode +model +mosek +nodesep +nojustify +normalize +nslimit +nslimit1 +ordering +orientation +outputorder +overlap +overlap_scaling +pack +packmode +pad +page +pagedir +pencolor +penwidth +peripheries +quadtree +quantum +rank +rankdir +ranksep +ratio +remincross +repulsiveforce +resolution +root +rotate +searchsize +sep +showboxes +size +smoothing +sortv +splines +start +style +stylesheet +target +tooltip +truecolor +viewport +voro_margin ; + +TUPLE: node-attributes +URL +color +colorscheme +comment +distortion +fillcolor +fixedsize +fontcolor +fontname +fontsize +group +height +id +image +imagescale +label +labelloc +layer +margin +nojustify +orientation +penwidth +peripheries +pin +pos +rects +regular +root +samplepoints +shape +shapefile +showboxes +sides +skew +sortv +style +target +tooltip +vertices +width +z ; + +TUPLE: edge-attributes +URL +arrowhead +arrowsize +arrowtail +color +colorscheme +comment +constraint +decorate +dir +edgeURL +edgehref +edgetarget +edgetooltip +fontcolor +fontname +fontsize +headURL +headclip +headhref +headlabel +headport +headtarget +headtooltip +href +id +label +labelURL +labelangle +labeldistance +labelfloat +labelfontcolor +labelfontname +labelfontsize +labelhref +labeltarget +labeltooltip +layer +len +lhead +lp +ltail +minlen +nojustify +penwidth +pos +samehead +sametail +showboxes +style +tailURL +tailclip +tailhref +taillabel +tailport +tailtarget +tailtooltip +target +tooltip +weight ; + +: ( -- attrs ) + graph-attributes new ; + +: ( -- attrs ) + edge-attributes new ; + +: ( -- attrs ) + node-attributes new ; diff --git a/extra/graphviz/builder/builder-docs.factor b/extra/graphviz/builder/builder-docs.factor new file mode 100644 index 0000000000..df071fef61 --- /dev/null +++ b/extra/graphviz/builder/builder-docs.factor @@ -0,0 +1,45 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: alien graphviz graphviz.attributes graphviz.ffi +help.markup help.syntax kernel ; +IN: graphviz.builder + +HELP: build-alien +{ $values + { "Agraph_t*" c-ptr } + { "graph" graph } +} +{ $description "Constructs a C representation of the given " { $link graph } " in memory by using the " { $vocab-link "graphviz.ffi" } " vocabulary to destructively modify " { $snippet "Agraph_t*" } " (a " { $link c-ptr } " created by " { $link agopen } ")." } +{ $notes "User code should not call this word directly. Use the " { $vocab-link "graphviz.render" } " vocabulary instead." } +{ $errors "Throws " { $link non-graph-error } " if applied to anything other than an instance of " { $link graph } "." +$nl +"Throws " { $link improper-statement-error } " if any of the " { $link graph } "'s " { $slot "statements" } " is not an instance of:" +{ $list { $link subgraph } { $link node } { $link edge } { $link graph-attributes } { $link node-attributes } { $link edge-attributes } } +} +; + +HELP: improper-statement-error +{ $values + { "obj" object } +} +{ $error-description "Thrown if, in a call to " { $link build-alien } ", any of a " { $link graph } "'s " { $slot "statements" } " is not an instance of:" { $list { $link subgraph } { $link node } { $link edge } { $link graph-attributes } { $link node-attributes } { $link edge-attributes } } } +; + +HELP: non-graph-error +{ $values + { "obj" object } +} +{ $error-description "Thrown if " { $link build-alien } " is applied to an object that is not an instance of " { $link graph } "." } ; + +ARTICLE: "graphviz.builder" "Constructing C versions of Graphviz graphs" +"The " { $vocab-link "graphviz.builder" } " vocabulary implements words to convert a " { $link graph } " object into its equivalent C representation in " { $emphasis "libgvc" } " and " { $emphasis "libgraph" } " (see the " { $vocab-link "graphviz.ffi" } " vocabulary)." +$nl +"These are low-level words used to implement the " { $vocab-link "graphviz.render" } " vocabulary. As such, user code should not use " { $vocab-link "graphviz.builder" } " directly." +$nl +"The main word:" +{ $subsections build-alien } +"Errors that might be thrown:" +{ $subsections non-graph-error improper-statement-error } +; + +ABOUT: "graphviz.builder" diff --git a/extra/graphviz/builder/builder.factor b/extra/graphviz/builder/builder.factor new file mode 100644 index 0000000000..7d3ec797b2 --- /dev/null +++ b/extra/graphviz/builder/builder.factor @@ -0,0 +1,123 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors classes classes.tuple combinators kernel +sequences strings summary words +graphviz +graphviz.attributes +graphviz.ffi +; +IN: graphviz.builder + +! Errors + +ERROR: non-graph-error obj ; + +M: non-graph-error summary + drop "build-alien must be applied to the root graph" ; + + +ERROR: improper-statement-error obj ; + +M: improper-statement-error summary + drop "Not a proper Graphviz statement" ; + +! Use FFI to construct Agraph_t equivalent of a graph object + +array rest ] bi + [ [ name>> ] dip build-alien-attr ] 2each drop ; + +M: graph-attributes (build-alien) + build-alien-attrs ; +M: node-attributes (build-alien) + [ agprotonode ] dip build-alien-attrs ; +M: edge-attributes (build-alien) + [ agprotoedge ] dip build-alien-attrs ; + +! Subgraphs + +: build-alien-subgraph ( alien-graph subgraph -- alien-subgraph ) + [ id>> agsubg dup ] [ statements>> ] bi + [ (build-alien) ] with each ; + +M: subgraph (build-alien) build-alien-subgraph drop ; + +! Nodes + +M: node (build-alien) + [ id>> agnode ] + [ attributes>> build-alien-attrs ] bi ; + +! Edges + +GENERIC: build-alien-endpoint ( Agraph_t* obj -- alien ) + +M: string build-alien-endpoint agnode ; +M: subgraph build-alien-endpoint build-alien-subgraph ; + +: build-alien-endpoints ( Agraph_t* edge -- Agraph_t* tail head ) + [ dup ] dip + [ tail>> build-alien-endpoint ] + [ head>> build-alien-endpoint ] 2bi ; + + +: node->node? ( tail head -- ? ) + [ string? ] [ string? ] bi* and ; inline + +: node->subg? ( tail head -- ? ) + [ string? ] [ subgraph? ] bi* and ; inline + +: subg->node? ( tail head -- ? ) + [ subgraph? ] [ string? ] bi* and ; inline + +: subg->subg? ( tail head -- ? ) + [ subgraph? ] [ subgraph? ] bi* and ; inline + + +: node->node ( Agraph_t* tail head attrs -- Agraph_t* ) + [ dup ] 3dip + [ agedge ] dip build-alien-attrs ; + +: node->subg ( Agraph_t* tail head attrs -- Agraph_t* ) + [ node->node ] curry with each-node ; + +: subg->node ( Agraph_t* tail head attrs -- Agraph_t* ) + [ node->node ] 2curry each-node ; + +: subg->subg ( Agraph_t* tail head attrs -- Agraph_t* ) + [ node->subg ] 2curry each-node ; + + +M: edge (build-alien) + [ build-alien-endpoints ] 2keep nip + [ attributes>> ] [ tail>> ] [ head>> ] tri + { + { [ 2dup node->node? ] [ 2drop node->node ] } + { [ 2dup node->subg? ] [ 2drop node->subg ] } + { [ 2dup subg->node? ] [ 2drop subg->node ] } + { [ 2dup subg->subg? ] [ 2drop subg->subg ] } + } cond drop ; + +PRIVATE> + +! Main word + +GENERIC: build-alien ( Agraph_t* graph -- ) + +M: graph build-alien statements>> [ (build-alien) ] with each ; + +M: object build-alien non-graph-error ; diff --git a/extra/graphviz/ffi/ffi-docs.factor b/extra/graphviz/ffi/ffi-docs.factor new file mode 100644 index 0000000000..0398e17223 --- /dev/null +++ b/extra/graphviz/ffi/ffi-docs.factor @@ -0,0 +1,44 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays help.markup help.syntax kernel math quotations strings ; +IN: graphviz.ffi + +HELP: ffi-errors +{ $values + { "n" number } +} +{ $error-description "Thrown by " { $link gvFreeContext } " if the low-level Graphviz libraries (" { $emphasis "libgraph" } " and " { $emphasis "libgvc" } ") encountered one or more errors (specifically " { $slot "n" } " of them) while rendering. The C libraries themselves may print specific error messages to the standard error stream (see " { $url "http://graphviz.org/pdf/libguide.pdf" } "), but these messages will not be captured by " { $vocab-link "graphviz.ffi" } "." } ; + +{ supported-engines supported-formats } related-words + +HELP: supported-engines +{ $values + { "value" array } +} +{ $description "An " { $link array } " of " { $link string } "s representing all valid " { $emphasis "layout engines" } ". For example, the " { $emphasis "dot" } " engine is typically included in a Graphviz installation, so " { $snippet "\"dot\"" } " will be an element of " { $link supported-engines } ". See " { $url "http://graphviz.org/Documentation.php" } " for more details." } +{ $notes "This constant's definition is determined at parse-time by asking the system's Graphviz installation what engines are supported." } +; + +HELP: supported-formats +{ $values + { "value" array } +} +{ $description "An " { $link array } " of " { $link string } "s representing all valid " { $emphasis "layout formats" } ". For example, Graphviz can typically render using the Postscript format, in which case " { $snippet "\"ps\"" } " will be an element of " { $link supported-formats } ". See " { $url "http://graphviz.org/Documentation.php" } " for more details." } +{ $notes "This constant's definition is determined at parse-time by asking the system's Graphviz installation what formats are supported." +$nl +"The Graphviz " { $emphasis "plugin" } " mechanism is not supported, so formats with colons like " { $snippet "\"png:cairo:gd\"" } " are not recognized." +} +; + +ARTICLE: "graphviz.ffi" "Graphviz C library interface" +"The " { $vocab-link "graphviz.ffi" } " vocabulary defines words that interface with the low-level Graphviz libraries " { $emphasis "libgraph" } " and " { $emphasis "libgvc" } ", which should come installed with Graphviz." +$nl +"User code shouldn't call these words directly. Instead, use the " { $vocab-link "graphviz.render" } " vocabulary." +$nl +"User code may, however, encounter the following words exported from the " { $vocab-link "graphviz.ffi" } " vocabulary:" +{ $subsections ffi-errors supported-engines supported-formats } + +{ $curious "Graphviz has documentation for " { $emphasis "libgraph" } " and " { $emphasis "libgvc" } " at " { $url "http://graphviz.org/pdf/libguide.pdf" } "." } +; + +ABOUT: "graphviz.ffi" diff --git a/extra/graphviz/ffi/ffi.factor b/extra/graphviz/ffi/ffi.factor new file mode 100644 index 0000000000..2ec65cf7ca --- /dev/null +++ b/extra/graphviz/ffi/ffi.factor @@ -0,0 +1,158 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors alien alien.c-types alien.destructors +alien.libraries alien.syntax combinators debugger destructors +fry io kernel literals math prettyprint sequences splitting +system words.constant +graphviz +; +IN: graphviz.ffi + +<< +"libgraph" { + { [ os macosx? ] [ "libgraph.dylib" ] } + { [ os unix? ] [ "libgraph.so" ] } + { [ os winnt? ] [ "graph.dll" ] } +} cond cdecl add-library + +"libgvc" +{ + { [ os macosx? ] [ "libgvc.dylib" ] } + { [ os unix? ] [ "libgvc.so" ] } + { [ os winnt? ] [ "gvc.dll" ] } +} cond cdecl add-library +>> + +LIBRARY: libgraph + +! Types + +C-TYPE: Agraph_t +C-TYPE: Agnode_t +C-TYPE: Agedge_t + +! Graphs & subgraphs + +FUNCTION: Agraph_t* agopen ( c-string name, int kind ) ; +FUNCTION: Agraph_t* agsubg ( Agraph_t* g, c-string name ) ; +FUNCTION: void agclose ( Agraph_t* g ) ; + +DESTRUCTOR: agclose + +: kind ( graph -- magic-constant ) + [ directed?>> ] [ strict?>> ] bi + [ 3 2 ? ] [ 1 0 ? ] if ; + +! Nodes + +FUNCTION: Agnode_t* agnode ( Agraph_t* g, c-string name ) ; +FUNCTION: Agnode_t* agfstnode ( Agraph_t* g ) ; +FUNCTION: Agnode_t* agnxtnode ( Agraph_t* g, Agnode_t* n ) ; + + + +: each-node ( Agraph_t* quot -- ) + [ dup agfstnode ] dip + over [ (each-node) ] [ 3drop ] if ; inline + +! Edges + +FUNCTION: Agedge_t* agedge ( Agraph_t* g, + Agnode_t* t, + Agnode_t* h ) ; + +! Attributes + +FUNCTION: Agnode_t* agprotonode ( Agraph_t* g ) ; +FUNCTION: Agedge_t* agprotoedge ( Agraph_t* g ) ; + +FUNCTION: c-string agget ( void* obj, c-string name ) ; + +FUNCTION: int agsafeset ( void* obj, + c-string name, + c-string value, + c-string default ) ; + + +LIBRARY: libgvc + +! Graphviz contexts +! This must be wrapped in << >> so that GVC_t*, gvContext, and +! &gvFreeContext can be used to compute the supported-engines +! and supported-formats constants below. + +<< +C-TYPE: GVC_t + +FUNCTION: GVC_t* gvContext ( ) ; + + + +ERROR: ffi-errors n ; +M: ffi-errors error. + "Graphviz FFI indicates that " write + n>> pprint + " error(s) occurred while rendering." print + "(The messages were probably printed to STDERR.)" print ; + +: gvFreeContext ( gvc -- ) + int-gvFreeContext dup zero? [ drop ] [ ffi-errors ] if ; + +DESTRUCTOR: gvFreeContext +>> + +! Layout + +FUNCTION: int gvLayout ( GVC_t* gvc, + Agraph_t* g, + c-string engine ) ; +FUNCTION: int gvFreeLayout ( GVC_t* gvc, Agraph_t* g ) ; + +! Rendering + +FUNCTION: int gvRenderFilename ( GVC_t* gvc, + Agraph_t* g, + c-string format, + c-string filename ) ; + +! Supported layout engines (dot, neato, etc.) and output +! formats (png, jpg, etc.) + +<< + +>> + +CONSTANT: supported-engines $[ API_layout plugin-list ] +CONSTANT: supported-formats $[ API_device plugin-list ] diff --git a/extra/graphviz/gallery/c5.png b/extra/graphviz/gallery/c5.png new file mode 100644 index 0000000000000000000000000000000000000000..965b1daa5bd89212341e2eac8d84da8ccd1d33b9 GIT binary patch literal 6080 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 literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/c7.png b/extra/graphviz/gallery/c7.png new file mode 100644 index 0000000000000000000000000000000000000000..bdac6a774535ee2275b6c995e106841ab112716b GIT binary patch literal 8614 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 literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/circles.png b/extra/graphviz/gallery/circles.png new file mode 100644 index 0000000000000000000000000000000000000000..558419a7d8030badf55760661df624ae7180b40a GIT binary patch literal 11867 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 DXx6bL literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/cluster.png b/extra/graphviz/gallery/cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..49a8d338a8329e38807ed0ee895775877c63b108 GIT binary patch literal 41319 zcmZ_0cU+Et|37?6(jaZ2q0$~&NTt1phRUf#XM+|(NoXo*OG8T9X=*4U+B=k{LK>0^ zDWX!jpU3C-``-5-_wRRIuE#~4ogL@#e!pL@=XxDsriXR6((j}vkw{zh^|Z`Mqzw`z z5|tq>4ZdRQSV(+>#@AX z7Gkj%v+r5)yC0tIE>H1lvp+g}O@+Ztkj^dD$}NOxjXdRGFWJsvkmF@=IE2w6IXSs^ z@o(1LOI-`0+^16>hj?Rns!u(9TH^ic(A?ASvo(wo8nhd<&Ejdg9TZ97nIhV6g7L4G zbh?O4ktlUmjvU$P>1jO^lhcY@46fsQ{ZDmcc=&ejCY>3sP*2%^hKY$O0AG>e=Ewa86tw6uU-kt zoqoONxYQj5MaA1UZ_@I!gnjCY(BfxdW>)9o=BB&T`QHnkK7G1H$H;}AgU^$TBZn&_ zB!v9rEVtj^ZwHc+lkMMRYSV7n5*!$)o-i4r!Pn5($jrhLG(K+sGD&9R#i`eLc}Tdx z1NlwHLRiDBTOEkl@Akk8N0 zl$Br8(lRpn6K$f#nyeg)?HwH*Oguc%{e?$0cQe`j{yLO&=<5ELFJG!mUq1J-ruoL! zU8R&pnje>yB~Co&3=9k$z3|i^`d*KPJjJZi>iF@FPE%G*Gb$8Pzp}Fi>1w3*sk^Bu5BI7*Ndf*>DTV&o9f|SM`6`^NgE| ztMtmEYb4h}mMd3&eSZ8flP+RKM1wY(Tj_>VXX4n%i>p6={@j@I%Ia9egQ_Y{`!Y@} zkah%zWa))TgDu>OY!V!Xf{RC7gJZA8#kVMUf9IP2^=pp=N5r+i-=2K>{-HXu`NE&? zwhP~$d}QH>&{jTlsQu~1Db9!xdzv#gM=Zl5BCbDqa$sd~Hk4-T&fNzO?s)U&jq{t# zO%5`Z&Tpvj552>Ob*|HF?JhZ~dim;A0V%2IvLumyTxP+i&#zLxe5_S{<~_&A7<%1p z@Zs2}_BiLkhupmx?UinWjKU`OoACd2V;gRx1W^ewyvyM8fQ5E{4#S{SsCuI)`P>T(s-?6y>-N!;G79Z z*0>Mv-~aeArpcx1$2C}TQg?3T#a%{Y%8RRiS{7#q&#x|>$9prKJ$u$Os4_8=&QRBK zpUgpgI(!m)#R`-C&fUBB2n+Yp4Gc$4pYS)R#5?*ZpGaVht8A`jE%H(3Nwq5${GuSi zZT2p#eK_cF>420x#pR$%TFk4I0}kJYE7Rm@3!GpH!Z}R6eVU3d2%JvM1+N@6L;ACt#pNJKfQ~K%i9-M58S(VFNx83LgC;+ z%AfBa^b8F(3$2QY*AOcvBO_xJs`G;QwR=*M-ak2avhprI_(+=F2mBrD6xAJ^qb^Ue zFMpiQTGY>KOx~%+DlFv2fN#CPw^}Ox=UW?%$*v;e;tU^s|8OTCI2T=2rBHc4>7{*{ z#bb*yvDt#xSdWSE@$Tn77q9*K;EnYR$It65EG$U74MP zTvm_zGCf`Y@gpzs6)k>scXx^7wze{O@u$g28SeX5S!q=JOmR|k4DV#>#|hnxj@EH@ z78xixxs4=mmM=4O^^xD&mEapU_!Sj*8Yj!w_v9Fwk;!cyp2J~&J2{)Cexf8%oj!fq z{bLQcy1IH>TU%X)OK;t&M?0d7B{&?`Ru+H!`W2j?FRH-BxO1Ot@K|H00IrcFW_!O~ zYH+01Jt88aF-gY3?%cU;jG-IF#l@FaR;&)z=>N9H{z~&(p|i5GTByCw?XgH9 zg$sU#nyD$%<8vPw@q2@Vg9EyzcFLRsmMIFe2Qip&#Jyx{_x{7?`TQo z{{PkuVz#rh$Kp*`j~qE-@8F=h|Ll7`YN`#IX0F?Z8_fC2$dRh+OB)|Pd`PZvW^Re* zj(GXfsEAyq@y*Ii!DAG?ZqFX-k`ph2wD{|12TRT`eA36Kqsn_*VtT{E=;!T!ZA2Y7 z-F07^Lg8z&mpM^$Ev(q)Nf1-e=;)}}Y>n^V{Zc2M-&|O@uw2HLZ)lrz_b#P5oW1Sk z%ci$w4rR`7__5^UF{NN$4~N}2Ad*Z1_-SAUu; z{1|K8)-fhfeDCdBvMkPgPrCX>90Kvm$g1OK6IvB7el|*IT_M{RSlKen`eJV_G z39Y?-!GZ!Qc9MS&eW9Km&bkw9k#Obr*D%z;(S^xQa`h$2nzi3HNhv84@1I^wQaGQf z(Mo=LL6DX&NyS(3`^VaCfodcT+F%VzR7r1TziGa;oub1GmGSdEMFyu%32jh|jEwvg z({62QX*=$rz(qBBopCBDDQTw-xj#Q&N~qgVqd!Yhg1x)9xADuHtn(=O?jz542p_%| z5D~%fxhpMZb@f_qW8rNS``_Q*g`#uo?O|bKV;jZRAc=Vg*x1-?B%$lj#Ohg0bCyqO zXlVTS{Aw31HPt<39~RV-wd^F<0z>Y}sVN7PJdg9|>%&-uOMQNxdjI0;_AK3)+=*Eg z_TC*ww!1Wx()4xD$)6wB@_9N}`>$rWCLgWLa{2vDW&xG_5X&RBM(K?^EnAebEogW%ER4?OZ7JUnK*i9b(=o$~6tjeOmVx_+ zuD0bGr|31_*cyhH94mLE6BQA$Q&cW)`ntM}o@7U%1X>naQCcE*kY8Nc$00!`IXF0w z0#ITV6blr~|6o5J6cH6wx3k;LvG;_;oLklmsdq=*O83vHu6Ep&n>95m=Pz9n+PsY? z+dHA}rWQXR{<`P&>(^Q*Po_n3$^o&Zv_2)ft;socx z3wz#w_&^-AT+Ln|?6=_RY9*a$F1o#Y_Y$w!%*Yk+;>DrfjA`oR(!L~Y2Yvy8*yQB! zQ?HUKZMXQo3|ETd$hCPoD^86!M-czKv1LaPzRS07AA4+UEY_N$D4(jqnn>gP;n_Y$ zUX{qECM`0VoNkh)^5sMIf$@n6G~e0g*48ZVxsflu54K52NZd+Fy4e`IEz4_mz$i2~ z4!v>r{rmS7uKt#Ic;W?ptX}Zh56>vw>FRp=`gr%^xZAgb)UVTI*gQGQ6sA>mWl`+) z{X+~UCMNh$E@-{G@oA1fy|8JjE3LKgXvygJ?~MNb{_m^3W2U?1fs+1=&dqJ}_V#{$ zWs#nEO@jE*(aFhXPiHp#X6Krk8o<`3lm2TV|JMI*Ls4x0^U*&BH%pp3xy5JU6J5=} z^{W+U-f{d}`@_4wGP@Uew_|WUvk&cQXLPfDeOK2uQBl#im2TS~+E(8H@*%M1<>dvz z-m&}_clMsN$3LA%o*yK>Yg>JZPf&1^pP!#=*{bX!Pj0KFX@?+7nBL{f3gok~prCN;#}5x6=Oo666bJPYYDi~&eb&>h?7rRnu&&n#wgV4LGb?>nQ!XNFiQ(+pEWaB zym0Yi`^&p>bTO?0(b3U+`1v)&|DM(2XAZl0b2q*a+&U3^SMK!f_wSGAHfE{-9w^QL zzdMdMg#|Z`-NNm4dqwRw)I>l`R>n|Gp~Ls|fF76?i_~?8-n|o0R_4M^(*|g%un$_S zW{p$wnhCDeJbTIgR zsEh(lWDlVH!KRllBa5sn4c3$RmB@oFt(S~yE>1C09t~kV#vl1@H@FBKF6y}Osl91r zh!-Ahf?S5s3fK56K(AJ^cjpJU#We?)kEcJ}YF*7mlx-3~30d?Z?u?5UTWw_{`H zkF`cdM+*VzystVx@hDo;g+s9@u)xaGQy!%;?9(U5s;5tVf6w>y_HIxUy|_lp_hVs! zD&c7>WL#=8@+<*NHwcP;|^S zwdg;jG&D5y_L-M>Z-%Lu8dxdOMgkkh?9gG2LKn=Ub{%N>I`nA1b8qb^XpK>*X1@$R zyn(EoT-lj-`z21+9C!FFeZ0zpuj;szRS~(~Q^bNh%NILYKqs>9+q);{r(ScH4!P$x zn!QDDm-bn3%+ATlz+oodiaEJdPAlm3+|<&{k3Yl158CMtR&d3 zA5K$=0+0tL&CJWo8@_lJl<`KlS} z*K;oaeN1j|%~ehNDR<%1RN7vY3&S95=Ip`6vPaW>U(+?;$HLSf>ZIKtbc$1 zbmO*d+m;=koc$0~U46AOC0xaCl~c+4dsCiS*68QYH^3CANa*;?yu2}}imq#y=FrzU z4_%Q5?g;>H&uyd_`S=`UVP&0sv?CyV$5ynF!iCkRK=$Y}c=K(*t##eqOvWkuo55y( ztS(=)ym5jKjduKXsuB}@$U?9n6YUSIgr$Mq+%DzI(%>LB`}!=F1!FD5nsL+L6dv8{ z`K4Q3uuM)81rw!?(1Ch0q(8Sr?Go9$_l|JU?b|GS1O+p${`qd12w0#?CUf4tecROB zoGQcgCL|QfyT@k;slxoo5z8GlT=?buqM~$MjGMvjH=53G6-oJF!@Yg`cHm4pygWhm z(s&b{@|9n-k50WR_?grn0@nWdb!x=usNH{koKb*)H5)f>Buwz!Q1$6!+FK(S3I zYE686yxMN2-9kb%uafs^s;h4RAk6RhG5MvBYu`Yn+tDA(*FriU8I69l#io2ATcQ0iv$xIyb}y*+QAoa0?xTYH0|d-=*0dz96xYs(jM zE}#cDpv3<7_FuX;Y^2#z2klHua2t-vp{u{^K*Z6-bpHPSMy%S)`-gS`ft55kSrlhy zQv<5oXPJ(rf3$J*nBEfY79jvhU_y8d@AVPKhsK7@Ab zR&Bf)#nF*kKtQ14+(#Y?g#yT!5G}|NG5_vdZGCSqtB{ZobU=-+`-gyw+YKfO$^#US z@}V*EN6vqJ)u3JT|4!Ad#$*dVkB?K4Mm-cF`?~ZP41b@Qo0zy>`)|Fv=i=kXkC$dk zYVFRRJ>f7^Q6WzoqG5DTff)y;p#1*fR7F036ZieQpwu17HB!HJ?OK9UZ%>aJZ9TNW z^PgYd73-8gGt7pK83HbmC~0FgZC+R~A!@F}d~W2qIxe~F^1S_WQa;XZCU_UQ(ltS& z_0}5q1LKq%pj=|Vk_+-Q84MEx2<~1#eDwG4-@wr7FCZgI7}Bca=w0*mEwnw{+SGFGw6v&&jFJNO)~=Qh*J^voKMoO$i;WE=%9o%Z z<=^^R>7z%Q_>qKjJ;3EZrqcXzwDi~2KVk;~^ly@rlOq5r9UYyXo}L<{7b9ciSg-}W zn2H3|B4%mnGUu*c4xs%655Tc4J@--N*GxYH$>UQS^Sy%?X@Eu=z{ot-R=gnN2>=d# z|Nfm2V$kJCYWMqazQQ{1>=ghCKY#u_p#&3xVo0Y5KiYCIlg~d*DBCBVUk-eoR(e?X zKU|UZ5Lh7g)-9rht^S>>^|*9N2Rcl`MOuLDD4dw_)#ab005CQOs4YY%l#rApco^IE z?O9M}A?ucwme!$aMWJm|k@lY%4o*tqBt-4jXzsSIE?uk)>gHqwH;ODPUhZ+>LIZ## z+8ixvQp$mInIJz<=UZp`3pbEJ+eoHmVJ#p#yJPi!tSq__L>xqh{*GA_q$@Sr*ljL^ zEYkbHWOC|7=J$~o5eF}R4rsRby>O>t%Dy6mormYd^z~iaw}(RI%E12={8lgLlw%hw zJ%9dOjQceD*5x0g8*nP1?$#P~rQ*&qa7d^@UH16W%}3ONKXV^jllQqvdyLkJO+d_I zL%n2XXBR9vDswpk{kMNy)8fkdWT}a}*(WNxSxm5VfGaz1{g^%^`Dhb7Id#-rlr+ zU&{7bTdh0@g2nXHuV3BYzI&H-?9nOWgD1zb8;LX1}a#r^8COJS!;5nP!Sfc)X!C@*<11ehNCl*K+`$8-9%CAxK7Y0no1L5tLBHuMJZh35%lmhiXhTyI zHTr(Z?`4$rQRtMU3ULakoz<0(hK7a|clRw)cNhZIO!M9K^}|+u{qdRcAvdOHZj0}l zYJB^)%AEU}3U6+1?!s#)6jO*j*vyShP1zk)kx@}**4FgCYvCaqou*z^Pi;dTF%@aT zN0zzr%h~bt>7$A|wSH@*r@MIGzI`iV@!7#&KpXPb;L^bwzct00l^Jo!-88JihnrA+ zRb5u^x13}dX!+Y-AoX0yYWhQ(_r+&L0=1}ckX?w${Bwxf36jEIPv8_CqW z`z$d&evgUOv#%failPe`-B(_|o+6uOcH48&&VOoWJzjHd2e?!7 zlaGE37cXACr{sNjq%{w3a%rYd^w)InW}?2@*^LSdi#t)|DK9=AlX9~J02lpr1z?xN z?qD?Xr%Ux8i3F}8zV>HLDQNEYzRDP$L*W$_6|Vk{zZMrKy>|{4+X$zv&!2VEjg_^G z?Pura-kLssTLJqKG9ci7lZooup1nstl+p6R*s?8N>6CB(J6B!w^Z4%*gL_0o^hRz! zoDu5GKk|S?f|pS8>tpi%DneHY`1heM|GVyuSErz+@gyBM$CH_r1-)?#2{>D$xWhu* z>dsd=FPw$tC>p6d5zy4yJ1qvE4MVG6U0pRrJ4e5qfUa@++9~QRI&mN)NckY7dd9}u z9v;#G;paHC+g39DmM6D2H8lZ|;Lj-3$c5_DXxk)`5ASOf^&l)sMqVB*e=Kc&e*Qwj zekboyA(Q)&SjjdeMVNB;ReZyt>^OiHk;FbPrYd^T1A*N#0Hpq1{9I5#Nt9jmrwpu~ z;QRM^hM%0%{wSS%o z5dyeMF;F&_q9?7OpdcZhd3si?o*i!cXCrhGW*|xIbrc}a7;YgD;}Smg*wmD;KVzQ4 zUhL#~V9J}#_VIV_OhBlGa2&eY+4%0=E&vCj@`K_)^82**xcs7KtSs-v$qsgS2JN#i z&QH()@QWG0$u|IC#Npcvy?eU%fy3-Taip+#z?e!AV1!@yc>YeHLEHKbNoJn6>?_9vOUe+T@<9KMyz+ zU=Iwq+SQiUzmBbG(2@6_8#(T<8hmS~>ME8?>+4< zFKlRDse^@LiW3}@824sLrRdfzCP1$GmoK*{^K1kDdIaU3X(Q;AMBKb6LjCLf5?;Ck}`3^wTrMZ!<91$S^1VNpXL9G+@uU>71 zwy@y1$-*-+?a);YAViOg7dPJN41tmiRsPtt?0K{(!gB=5rJO#!nK4wr|0Co;iGK~x zQN4g~NYI`^odHA|0Vp9o$Hz1s%{DToyHX*TE7K)#eccI=qK8=L*6oh}Iemdh;?>>CUvNd}3@YbI|qcWf!Loqo{;JIS|8(HsP=lm+%W8$|^25 ze_PZJIT}b4tq?ZuGKLgT8I!F?Aw684AK&CK>+Z&S=+L2}leIkCrH}+h*`4-{m&d;wcvj8Ao z4-MUX7Qpe{lXGzD4%_=br_Es`Y@T%cZa^3ztR*#yI8a&pQMUB>&Ym6?EN2rDJAhz| z?zS9YnR`iPz^fu8hmS|)n#e!@A;An378E6BHnv~&&*uB4VhwU`-n>abXy~nGD4H&5 z8p)+e>JSD%rgYTR>o>YVBdHq+J0sU@h@h_(v z!H|O#*{tUI4AR}!A7^I^#L8{vAZ08R-^(+BKu^WX%bWe+fq!XW(_d$C!$oXO653K)c(9HqEY+>pNWO7Ak)9VcpA@MLmhX=j5cN)eH>6=>@V#SS1Y|otDj4 z1v|dX&NiZ`0P3c1)J@0+Cn6XDJo-V19AarcDVt)}7QeH1?An3H>L;%sVLd_CbKv4y#M^yzZua zEMY%J>o?xu?=}AAe)J+f@$G-A5zSN)%?)t&CR1*hdzqX(iCa0p8Ljn>fj(~e8$Sv5 zEP)TRNpN<^5*)vN{SrH4B3SKoqMtL(`^CGlhX|~o;y1RoK6pKmt5V_E&I0k@t|6EX zeH4{Z*V=j~*tXj>TNf8m*stN?;cB$%VDd&rMko}>l+YhJ(z|m`&-|a}KLZ0qEC4X; zCofE&zQqmNeZ6y1gFki@_5h^j zrPWc@I7RpD0!9c%1SBS@p`XB>qQ|uY#KP@u7#ZQ&zkh#eWo1ZZ1XXV~v6`vgTsZUHMNN_S@`1A5t){=)4*ANwvnI_mWNqr8`RTU{OL z^XJdf2M%n$)48_$>GOa8(#F>Y9}T%9hx9xCRCW4Dt=}(NMRLmuLhwDf61Ok~m()g!;O)GFu{p z_ym4~oBP6wMMa3^MvjP0D5(JS+kkr0J_Hp=LNx)JFmSVNw;%nve0gnU-_o_3o+r-> z!lWLTf;e8st)?Izg4PekS_4hLJ4<(4DOm#df^2O);KOBdUzx}}z`KvVe?J;kp3;-8 zzXbin(){0)dCOm8Rx5UFNmz7t4h|a`L$emNa%hhk0q)@rB5Y%!Ki-oQoB$@Ap1vE} z@&+j>sin^;=Lqsu`PNKHPL37Ks|f&hH%EjF@Y_o$_AZjopQT6sNnv!m9P{+)K?E+) zRfT!Siq5vvFP$`ku7*3{JW#a5*2_X4sie@7niYE6XP!hxfEh6?KwkU4JTuqWB2qeP zA`y_n2axey@%%dSVi$~1@-xqTtCF|stONgKq@@Gm;#j%3xC&BLb6;aabXT2sKu+b& zrZtsVwcT|%m2V!}Dxu8UV=n>7Y$Moz>N4nj?;4c_v=9Jlg~8KOhrfA%&q8I_snaS$enO0c#xoLIw(qnoPT;e zl2?@n$mhR+4ESv1t^t!)%jOL6WIYal5pDJ_d!Fc$uM=wy_RUho?Q zB_+47p(PKQHA+!ERskX45!FFKeS?rgZlgIp98&^5;{<*gDBiWcJjI)ru{5!=kp&8^T%G8_&!JN~zC ze0;oa>SsN&O53+@#_e){Usd*c_H-H9_0NHPH*u??fY8v;;a@h|Iy&~yB=rmoG|*_E zO2o#;2SZG-Ly7S^@h@9H&SP=L5=lJ#w7F2R2^mtM>%L(Wfg|g$9=rC75gZ@9y1u}& zkVJxbR5#HYGpo!95Le72|My{LCO_ffd5St%B5`@!Uk0N8*1?CijaXUfGsE&E_LI)& zD_%Q^hH~Z4_b5r5$9*n`I&xLgJ}KI}xa3<&!ZM~sHILl6kKQm*A}}XM5GFP_a2%^FZZXP)zTdHfhv#{y&lO&EnzrDrOs?O~x{Az{c6_|ERsDMCiI$5&88 z6`*CLw#r=oVMoY{XqH|l?vy)wH9!kIGQ?d54=WOI6%7(nFg&Rs>}7jq5}cy1(i zx(VO%*0b-c%%;v?f@J{37-DV7&u8)4g}&@p%Jutu8^K!UeFY=_E2xa4ev-H-K$np`w3`f10gs3 z8?8iiizH^Xz1WR7z85cQLZMC_%#pB8Ek(r0;_)>Y)NAL#k&pn;kl>gAQY0KoT0UAv z#>6{usTG#C(cmK+0y?bD3kEy;Hgvpv3Dms-j(2{!qMWQO6FYlIcJ`jHA8UD0^V{0n zV^7Y&NZFW|bZ=dSfg!@cX~r6tY0;B>groQ{xqz!f`t)lq_jixCN?KQt?sRIyOPx$f zE%5K`voN=T?h&+J;(^WL$k-pOi(HspeGq!jP!64`#`Fl?7z_yX#V1V#cT;5gs5CTsff
u-*uV1mcjG*Xm|!YCBLs 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

hK8pFxn`a5Z!kK zi@2vk%?P$2v(x{&>|YUNAp&}2$!{v`I`I@b@)R8H6C=@%oStb`gTjgBWY66vR>jAU zr&CX?N*LL(ti+XbO&3XRHRTyXp2WI=uReldiaHf8Gw%Dvu7wH5B8~f^I+J^c9H0CL z1139j8_~iVcAIeVJGJvWNjGBhxFa5)D~8ENmbCC4mt*hi%Sw9=^DR zla06tKrx)BtK+DO*erd*wnNiBFD?ZTE+PiKRBbwcwfD zzK!O8>R*yu5m-3+pR!6SEc>zjSRnyXTQYXA*x1@S%!$u zA3rwJ)6>{Yth+=0R7akD?ODj>?d_N8zTk0PUO4f@@#7Ns3^TfMxA`7T6{k!NOc^-L zO)^01GG#&au_!+La?cK4MIqf`eYR|UZuPvh#I*oe1l5=hYO1_xUM*ur)@4Z*0D{(d z{vvnUn<%CMK4P}mKX+cSs0Smwlz4398d0|CD=+&?&Sm}(I%(^XBO7wP0)DmZIAj%b ziza$@eD1Y4AfZIYIJ0(^)P?eT_T=W4%TOcuFd?#Q?`y z%y}4Xn~rJPYs-{}$#%<@St4apQUH`l)ZE+$$G@E02P4$}`!J{NWhH6;$QM?EFo=W^ zrS#lw&UYZ`(Je5v!;BEF`7~D#{#xr*UXo^X$-mzyqYZW!E;KdpzytTAvV*dRcT3DPZy8TCZ?g>9v2p5?hp12aGAxMyxH#ezhKIO zb|2rfN7rPH`)i{zM+A5K{m1yI%)Y_K^2b31`R>*U@^cNsqB6CEd-m9!?6@~G>$LsR z#Y?o3)-9PZXpqw^)QQkhC5Wi3?F?GgC_7beJ;F)mOXvP2+V^= zezqF+{gD^>BaY1Dn0jCVVC3Xq3qO5azceV)=CX_uft3|fSEkz28k_a+Z$O!Kb;$b` z94N3%+5Y>!A-j}ma#Ce8jUw;PU)L)uC%q5{D(M*5hz5cJkVx_dA#w5S{!3#On2s}3IfYeY@5DJ#(#{+7j;G!^} zun7ER+q$hA6QXP`4|F;|_weDO1ZwI-m;T-|wQF#%j-_e-AQOsv9Rdc~jWe~p+nE#P z^!?h&pBUit+H+W%S@kd~Rp%#KIhLtu6keF# zw|IJA%a9XIJ6sKXc2wY5<`~Wi?PL(v*~B0brK#HaCMxl(rbk5CSnp?N8Qk&q$%=H{ zyt=N@SqUdc{GGj+dl zfI^{og51c8?;H|Vw^%F`T4nmgPtCbIVAN5CGl6U z%S&9l585byI?FkmH_6MSM_@A*rzb_e0R=gG%-L$LndSS_n)>*th2^>MPeU~|G>)z^ zF->k~*_>CYpT^JouxH?`1jp(A{)Ym7uptEg0C&b8;CW>J&WXXmxxeqny?aY_<{e)N zi+8B|tci!?A3Jvrn%l+Z;<~n)e)&Ki+Ygc4M935Xi T!C)lcRpDSW+B$E9cliGSL|*{k literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/fsm.png b/extra/graphviz/gallery/fsm.png new file mode 100644 index 0000000000000000000000000000000000000000..00aa830028c51826b7ad14066d06930c9d2e84c5 GIT binary patch literal 54046 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

D3S=S3U3UCcXeFz?0Df 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�lrepkkkq+r|Kbc>fm`X(rOZFm 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 literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/k34.png b/extra/graphviz/gallery/k34.png new file mode 100644 index 0000000000000000000000000000000000000000..7b81782f8295e7d35ffe9e2a00acdc7e44c8cbce GIT binary patch literal 7150 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 literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/k5.png b/extra/graphviz/gallery/k5.png new file mode 100644 index 0000000000000000000000000000000000000000..7eecaeeb614f2eccc6cefa79bcd9a99cd12175f6 GIT binary patch literal 9568 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 literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/k54.png b/extra/graphviz/gallery/k54.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3b382aebdbbe6e38e52f936118f821189858d6 GIT binary patch literal 10611 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 aG1JKKU&Wa>mBB4agwjKGxkA}ze*X`}=B_IM literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/k6.png b/extra/graphviz/gallery/k6.png new file mode 100644 index 0000000000000000000000000000000000000000..74eaaa516b876fd52beb2179e8f9630fdc5dbb85 GIT binary patch literal 11877 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

OSIWlatm#xh5hy0b=0R|3~sAcUq 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 BKjZ)a literal 0 HcmV?d00001 diff --git a/extra/graphviz/gallery/w6.png b/extra/graphviz/gallery/w6.png new file mode 100644 index 0000000000000000000000000000000000000000..415cc47b72f286656bcef2b31071e968cf311ced GIT binary patch literal 11526 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 literal 0 HcmV?d00001 diff --git a/extra/graphviz/graphviz-docs.factor b/extra/graphviz/graphviz-docs.factor new file mode 100644 index 0000000000..76a27b2eb5 --- /dev/null +++ b/extra/graphviz/graphviz-docs.factor @@ -0,0 +1,938 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays graphviz.attributes help.markup +help.syntax kernel present sequences strings ; +IN: graphviz + +{ subgraph } related-words +{ graph } related-words +{ node add-node add-nodes } related-words +{ edge add-edge add-path } related-words +{ add add-node add-edge add-nodes add-path } related-words + +HELP: +{ $values + { "subgraph" subgraph } +} +{ $description +"Constructs an empty, anonymous " { $link subgraph } " by automatically generating a (somewhat) unique " { $slot "id" } "." +} +{ $notes +"Each " { $slot "id" } " has the form " { $snippet "\"_anonymous_n\"" } ", where " { $snippet "n" } " is a counter incremented by 1 each time an anonymous " { $slot "id" } " is generated (e.g., each time you call " { $link } " or " { $link } "). This is also how the Graphviz DOT parser internally handles anonymous graphs and subgraphs." +$nl +"Thus, while it's possible to manually create a " { $link subgraph } " whose " { $slot "id" } " conflicts with an " { $link } "'s , in practice it's unlikely to happen by accident." +} +{ $examples + "Each " { $link } " will generate a " { $link subgraph } " with a new " { $slot "id" } ", such as:" + { $unchecked-example + "USING: graphviz prettyprint ;" + " . ." + "T{ subgraph { id \"_anonymous_5\" } { statements V{ } } }\nT{ subgraph { id \"_anonymous_6\" } { statements V{ } } }" + } + $nl + "More generally, the following should always be the case:" + { $example + "USING: accessors graphviz kernel prettyprint ;" + " [ id>> ] bi@ = ." + "f" + } +} +; + +HELP: +{ $values + { "id" object } + { "subgraph" subgraph } +} +{ $description +"Constructs a cluster, which is a " { $link subgraph } " whose " { $slot "id" } " begins with the word " { $emphasis "\"cluster\"" } "." +$nl +{ $snippet "id" } " must be an object supported by the " { $link present } " word. The string " { $snippet "\"cluster_\"" } " is automatically prefixed to the " { $slot "id" } " of the resulting " { $link subgraph } "." +} +{ $notes +"Clusters are just a syntactic convention. Not all Graphviz layout engines treat clusters any differently from regular subgraphs. See the Graphviz documentation (" { $url "http://graphviz.org/Documentation.php" } ") for more information." +} +{ $examples + { $example + "USING: graphviz prettyprint ;" + "\"foo\" ." + "T{ subgraph { id \"cluster_foo\" } { statements V{ } } }" + } + $nl + { $example + "USING: accessors graphviz prettyprint ;" + "0 id>> ." + "\"cluster_0\"" + } +} +; + +HELP: +{ $values + { "graph" graph } +} +{ $description +"Constructs an empty, non-strict, directed " { $link graph } "." +} +{ $notes +"Because it's rare for " { $link graph } " " { $slot "id" } "s to be meaningful or useful, " { $link } " automatically generates one, just as in " { $link } "." + +$nl + +"If you want, you can still give the resulting " { $link graph } " a specific " { $slot "id" } " using standard words like " { $link >>id } ". For example," +{ $code " \"G\" >>id" } +} +{ $examples + { $example "USING: graphviz prettyprint ;" " graph? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint sequences ;" " statements>> empty? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " strict?>> ." "f" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " directed?>> ." "t" } +} +; + +HELP: +{ $values + { "tail" object } + { "head" object } + { "edge" edge } +} +{ $description +"Constructs an " { $link edge } " with the given " { $slot "tail" } " and " { $slot "head" } ", each of which must be either:" +{ $list + { "an " { $link array } " of objects supported by the " { $link present } " word, which is treated as an anonymous " { $link subgraph } " of " { $link node } "s with corresponding " { $slot "id" } "s;" } + { "a " { $link subgraph } "; or" } + { "any object supported by the " { $link present } " word, which is taken to be the " { $slot "id" } " of a " { $link node } "." } +} +} +{ $notes +"There is more detailed information about how different " { $slot "tail" } " and " { $slot "head" } " types interact in the documentation for " { $link edge } "." +} +{ $examples + { $example + "USING: accessors graphviz kernel prettyprint ;" + "1 \"one\" " + "[ tail>> . ] [ head>> . ] bi" + "\"1\"\n\"one\"" + } + $nl + { $example + "USING: accessors classes graphviz kernel prettyprint strings ;" + "1 { 2 3 4 } " + "[ tail>> class . ] [ head>> class . ] bi" + "string\nsubgraph" + } + $nl + { $example + "USING: accessors graphviz kernel prettyprint ;" + " " + "[ tail>> id>> ] [ head>> id>> ] bi = ." + "f" + } +} +; + +HELP: +{ $values + { "graph" graph } +} +{ $description +"Constructs an empty, non-strict, undirected " { $link graph } "." +} +{ $notes +"Because it's rare for " { $link graph } " " { $slot "id" } "s to be meaningful or useful, " { $link } " automatically generates one, just as in " { $link } "." + +$nl + +"If you want, you can still give the resulting " { $link graph } " a specific " { $slot "id" } " using standard words like " { $link >>id } ". For example," +{ $code " \"G\" >>id" } +} +{ $examples + { $example "USING: graphviz prettyprint ;" " graph? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint sequences ;" " statements>> empty? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " strict?>> ." "f" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " directed?>> ." "f" } +} +; + +HELP: +{ $values + { "id" object } + { "node" node } +} +{ $description +"Constructs a " { $link node } " with the given " { $slot "id" } ", which must be an object supported by the " { $link present } " word." +} +{ $examples + { $example + "USING: graphviz prettyprint ;" + "\"foo\" ." + "T{ node { id \"foo\" } }" + } + $nl + { $example + "USING: accessors graphviz prettyprint ;" + "0 id>> ." + "\"0\"" + } +} +; + +HELP: +{ $values + { "graph" graph } +} +{ $description +"Constructs an empty, strict, directed " { $link graph } "." +} +{ $notes +"Because it's rare for " { $link graph } " " { $slot "id" } "s to be meaningful or useful, " { $link } " automatically generates one, just as in " { $link } "." + +$nl + +"If you want, you can still give the resulting " { $link graph } " a specific " { $slot "id" } " using standard words like " { $link >>id } ". For example," +{ $code " \"G\" >>id" } + +$nl + +"In " { $emphasis "strict" } " " { $link graph } "s, there is at most one " { $link edge } " between any two " { $link node } "s, so duplicates are ignored while rendering. See " { $vocab-link "graphviz.render" } " for more information." +} +{ $examples + { $example "USING: graphviz prettyprint ;" " graph? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint sequences ;" " statements>> empty? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " strict?>> ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " directed?>> ." "t" } +} +; + +HELP: +{ $values + { "graph" graph } +} +{ $description +"Constructs an empty, strict, undirected " { $link graph } "." +} +{ $notes +"Because it's rare for " { $link graph } " " { $slot "id" } "s to be meaningful or useful, " { $link } " automatically generates one, just as in " { $link } "." + +$nl + +"If you want, you can still give the resulting " { $link graph } " a specific " { $slot "id" } " using standard words like " { $link >>id } ". For example," +{ $code " \"G\" >>id" } + +$nl + +"In " { $emphasis "strict" } " " { $link graph } "s, there is at most one " { $link edge } " between any two " { $link node } "s, so duplicates are ignored while rendering. See " { $vocab-link "graphviz.render" } " for more information." +} +{ $examples + { $example "USING: graphviz prettyprint ;" " graph? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint sequences ;" " statements>> empty? ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " strict?>> ." "t" } + $nl + { $example "USING: accessors graphviz prettyprint ;" " directed?>> ." "f" } +} +; + +HELP: +{ $values + { "id" object } + { "subgraph" subgraph } +} +{ $description +"Constructs an empty " { $link subgraph } " with the given " { $slot "id" } ", which must be an object supported by the " { $link present } " word." +} +{ $notes +"The empty string, " { $snippet "\"\"" } ", counts as a distinct " { $slot "id" } ". To create an anonymous " { $link subgraph } ", use " { $link } "." +} +{ $examples + { $example + "USING: graphviz prettyprint ;" + "\"subg\" subgraph? ." + "t" + } + $nl + { $example + "USING: accessors graphviz prettyprint ;" + "3.14 id>> ." + "\"3.14\"" + } + $nl + { $example + "USING: accessors graphviz prettyprint sequences ;" + "\"foo\" statements>> empty? ." + "t" + } +} +; + +HELP: add +{ $values + { "graph" { $or graph subgraph } } + { "statement" object } + { "graph'" { $or graph subgraph } } +} +{ $description +"Adds an arbitrary object to the " { $slot "statements" } " slot of a " { $link graph } " or " { $link subgraph } ", leaving the updated tuple on the stack. This is the most basic way to construct a " { $link graph } "." +} +{ $notes ! $warning + { $link add } " does not check the type of " { $snippet "statement" } ". You should ensure that " { $link graph } "s and " { $link subgraph } "s only contain instances of:" + { $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { $link edge-attributes } + } +} +{ $examples + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " 1 add" + "statements>> [ id>> . ] each" + "\"1\"" + } + $nl + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " 1 add" + " 2 add" + "statements>> [ id>> . ] each" + "\"1\"\n\"2\"" + } + $nl + { $example + "USING: accessors classes graphviz prettyprint sequences ;" + "" + " 1 add" + " 2 add" + " 1 2 add" + "statements>> [ class . ] each" + "node\nnode\nedge" + } +} +; + +HELP: add-edge +{ $values + { "graph" { $or graph subgraph } } + { "tail" object } + { "head" object } + { "graph'" { $or graph subgraph } } +} +{ $description +"Adds an " { $link edge } " in " { $snippet "graph" } " from " { $slot "tail" } " to " { $slot "head" } ". That is," +{ $code "X Y add-edge" } +"is shorthand for" +{ $code "X Y add" } +} +{ $examples + { $example + "USING: accessors graphviz io kernel sequences ;" + "" + " 1 2 add-edge" + " 3 4 add-edge" + " 1 2 add-edge ! duplicate" + " 5 6 add-edge" + "statements>> [ dup tail>> write \"--\" write head>> print ] each" + "1--2\n3--4\n1--2\n5--6" + } + $nl + { $example + "USING: accessors graphviz io kernel math.combinatorics" + "sequences ;" + "" + " { \"a\" 2 \"c\" }" + " 2 [ first2 add-edge ] each-combination" + "statements>> [ dup tail>> write \"--\" write head>> print ] each" + "a--2\na--c\n2--c" + } +} +; + +HELP: add-node +{ $values + { "graph" { $or graph subgraph } } + { "id" object } + { "graph'" { $or graph subgraph } } +} +{ $description +"Adds a " { $link node } " with the given " { $slot "id" } " to " { $snippet "graph" } ". That is," +{ $code "X add-node" } +"is shorthand for" +{ $code "X add" } +} +{ $examples + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " \"foo\" add-node" + " \"bar\" add-node" + " \"baz\" add-node" + "statements>> [ id>> . ] each" + "\"foo\"\n\"bar\"\n\"baz\"" + } + $nl + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " 5 iota [ add-node ] each" + "statements>> [ id>> . ] each" + "\"0\"\n\"1\"\n\"2\"\n\"3\"\n\"4\"" + } +} +; + +HELP: add-nodes +{ $values + { "graph" { $or graph subgraph } } + { "nodes" sequence } + { "graph'" { $or graph subgraph } } +} +{ $description +"Adds a " { $link node } " to " { $snippet "graph" } " for each element in " { $snippet "nodes" } ", which must be a " { $link sequence } " of objects that are supported by the " { $link present } " word. Thus, the following two lines are equivalent:" +{ $code + "{ X Y Z } add-nodes" + "X add-node Y add-node Z add-node" +} +} +{ $examples + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " { 8 6 7 5 3 0 9 \"Jenny\" \"Jenny\" } add-nodes" + "statements>> length ." + "9" + } + $nl + { $example + "USING: accessors graphviz kernel math prettyprint sequences ;" + "" + " 100 [ \"spam\" ] replicate add-nodes" + "statements>> [ id>> \"spam\" = ] all? ." + "t" + } +} +; + +HELP: add-path +{ $values + { "graph" { $or graph subgraph } } + { "nodes" sequence } + { "graph'" { $or graph subgraph } } +} +{ $description +"Adds " { $link edge } "s to " { $snippet "graph" } " corresponding to a path through " { $snippet "nodes" } "." + +$nl + +"That is, an " { $link edge } " is added between each object and the one immediately following it in " { $snippet "nodes" } ". Thus, the following two lines are equivalent:" +{ $code + "{ A B C D E } add-path" + "A B add-edge B C add-edge C D add-edge D E add-edge" +} +} +{ $examples + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " f add-path" + "statements>> empty? ." + "t" + } + $nl + { $example + "USING: accessors graphviz prettyprint sequences ;" + "" + " { \"the cheese stands alone\" } add-path" + "statements>> empty? ." + "t" + } + $nl + { $example + "USING: accessors graphviz io kernel sequences ;" + "" + " { 1 2 3 4 5 } add-path" + "statements>> [ dup tail>> write \" -> \" write head>> print ] each" + "1 -> 2\n2 -> 3\n3 -> 4\n4 -> 5" + } + $nl + { $example + "USING: accessors graphviz io kernel sequences ;" + "" + " { \"cycle\" \"cycle\" } add-path" + "statements>> [ dup tail>> write \" -> \" write head>> print ] each" + "cycle -> cycle" + } +} +; + +HELP: edge +{ $class-description +"Represents a Graphviz edge. Each " { $link edge } " is defined by its " { $slot "tail" } " slot and its " { $slot "head" } " slot. Each slot must be either" +{ $list + { { $instance string } " representing the " { $slot "id" } " of a " { $link node } " or" } + { { $instance subgraph } ", which is a convenient way to represent multiple Graphviz edges." } +} + +"In particular, using " { $link subgraph } "s gives us shorthand forms for the following cases:" + +{ + $table + { + "" + { { $slot "head" } " is a " { $link string } "..." } + { { $slot "head" } " is a " { $link subgraph } "..." } + } + { + { { $slot "tail" } " is a " { $link string } "..." } + { "edge from " { $slot "tail" } " node\nto " { $slot "head" } " node" } + { "edge from " { $slot "tail" } " node\nto each node in " { $slot "head" } } + } + { + { { $slot "tail" } " is a " { $link subgraph } "..." } + { "edge from each node in " { $slot "tail" } "\nto " { $slot "head" } " node" } + { "edge from each node in " { $slot "tail" } "\nto each node in " { $slot "head" } } + } +} +"For more details, see " { $vocab-link "graphviz.render" } "." +$nl +"In addition, an " { $link edge } " may store local attributes in its " { $slot "attributes" } " slot (" { $instance edge-attributes } " tuple)." +} +{ $notes +"By convention, an " { $link edge } " orders its endpoints \"from\" " { $slot "tail" } " \"to\" " { $slot "head" } ", even if it belongs to an undirected " { $link graph } ", where such a distinction is generally meaningless. See the Graphviz documentation (" { $url "http://graphviz.org/Documentation.php" } "), and specifically the notes about ambiguous attributes (in " { $url "http://graphviz.org/content/attrs" } ") for more information." +} ; + +HELP: graph +{ $class-description +"Represents the top-level (or " { $emphasis "root" } ") graph used in Graphviz. Its structure is modeled after the DOT language (see " { $url "http://graphviz.org/Documentation.php" } "):" +$nl +{ $table + { + { $strong "Slot name" } + { $strong "Value" } + { $strong "Meaning in DOT" } + } + { + { $slot "id" } + { $instance string } + { "the reference name of a graph, as in " { $strong "graph" } " " { $slot "id" } " " { $strong "{" } " ... " { $strong "}" } } + } + { + { $slot "strict?" } + { $instance boolean } + { "indicates strictness, as in " { $strong "strict graph {" } " ... " { $strong "}" } } + } + { + { $slot "directed?" } + { $instance boolean } + { "corresponds to " { $strong "digraph {" } " ... " { $strong "}" } " vs. " { $strong "graph {" } " ... " { $strong "}" } } + } + { + { $slot "statements" } + { $instance sequence } + { "the defining \"body\", as in " { $strong "graph {" } " ... " { $slot "statements" } " ... " { $strong "}" } } + } +} +$nl +"In particular, " { $slot "statements" } " should be a " { $link sequence } " containing only instances of:" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { $link edge-attributes } +} +} ; + +HELP: node +{ $class-description +"Represents a single Graphviz node. Each " { $link node } " is uniquely determined by an " { $slot "id" } " (" { $instance string } ") and may have per-node attributes stored in its " { $slot "attributes" } " slot (" { $instance node-attributes } " tuple)." ! TODO see graphviz.attributes +} ; + +HELP: subgraph +{ $class-description +"Represents a logical grouping of nodes and edges within a Graphviz graph. See " { $url "http://graphviz.org/Documentation.php" } " for more information." +$nl +"Its structure is largely similar to " { $link graph } ", except " { $link subgraph } " only has two slots: " { $slot "id" } " (" { $instance string } ") and " { $slot "statements" } " (" { $instance sequence } "). The " { $slot "strict?" } " and " { $slot "directed?" } " slots of the parent " { $link graph } " are implicitly inherited by a " { $link subgraph } "." +$nl +{ $slot "id" } " and " { $slot "statements" } " correspond to the name and defining \"body\" of a subgraph in the DOT language, as in " { $strong "subgraph" } " " { $slot "id" } " " { $strong "{" } " ... " { $slot "statements" } " ... " { $strong "}" } "." +$nl +"In particular, " { $slot "statements" } " should be a " { $link sequence } " containing only instances of:" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { $link edge-attributes } +} +} ; + +ARTICLE: { "graphviz" "data" } "Graphviz data structures" +"To use the " { $vocab-link "graphviz" } " vocabulary, we construct Factor objects that can be converted to data understood by Graphviz (specifically, that " { $emphasis "libgraph" } " and " { $emphasis "libgvc" } " can understand; see " { $vocab-link "graphviz.ffi" } ")." +$nl +"The following classes are used to represent their equivalent Graphviz structures:" +{ $subsections node edge subgraph graph } +"Several constructor variations exist to make building graphs convenient." +$nl +"To construct different sorts of graphs:" +{ $subsections } +"To construct different sorts of subgraphs:" +{ $subsections } +"To construct nodes and edges:" +{ $subsections } +"Finally, use the following words to combine these objects into a single " { $link graph } ":" +{ $subsections add add-node add-edge add-nodes add-path } +; + +ARTICLE: { "graphviz" "gallery" "complete" } "Complete graphs" +"In graph theory, a " { $emphasis "complete graph" } " is one in which there is an edge between each pair of distinct nodes." +$nl +{ $code +"USING: kernel math.combinatorics math.parser sequences" +"graphviz graphviz.notation graphviz.render ;" +"" +": K_n ( n -- )" +" " +" node[ \"point\" =shape ]; " +" graph[ \"t\" =labelloc \"circo\" =layout ];" +"" +" over number>string \"K \" prepend =label" +"" +" swap iota 2 [ first2 add-edge ] each-combination" +" preview ;" +} +$nl +{ $code "5 K_n" } +{ $image "resource:extra/graphviz/gallery/k5.png" } +$nl +{ $code "6 K_n" } +{ $image "resource:extra/graphviz/gallery/k6.png" } +$nl +{ $code "7 K_n" } +{ $image "resource:extra/graphviz/gallery/k7.png" } +; + +ARTICLE: { "graphviz" "gallery" "bipartite" } "Complete bipartite graphs" +"In graph theory, a " { $emphasis "bipartite graph" } " is one in which the nodes can be divided into exactly two independent sets (i.e., there are no edges between nodes in the same set)." +$nl +{ $code +"USING: formatting locals math.parser sequences" +"graphviz graphviz.notation graphviz.render ;" +"" +":: partite-set ( n color -- cluster )" +" color " +" color =color" +" node[ color =color ];" +" n iota [" +" number>string color prepend add-node" +" ] each ;" +"" +":: K_n,m ( n m -- )" +" " +" node[ \"point\" =shape ];" +" graph[ \"t\" =labelloc \"dot\" =layout \"LR\" =rankdir ];" +"" +" n \"#FF0000\" partite-set" +" m \"#0000FF\" partite-set" +"" +" add-edge ! between clusters" +"" +" ! set label last so that clusters don't inherit it" +" n m \"K %d,%d\" sprintf =label" +" preview ;" +} +$nl +{ $code "3 3 K_n,m" } +{ $image "resource:extra/graphviz/gallery/k33.png" } +$nl +{ $code "3 4 K_n,m" } +{ $image "resource:extra/graphviz/gallery/k34.png" } +$nl +{ $code "5 4 K_n,m" } +{ $image "resource:extra/graphviz/gallery/k54.png" } +; + +ARTICLE: { "graphviz" "gallery" "cycle" } "Cycle graphs" +"In graph theory, a " { $emphasis "cycle graph" } " is one in which all the nodes are connected in a single circle." +$nl +{ $code +"USING: kernel math math.parser sequences" +"graphviz graphviz.notation graphviz.render ;" +"" +": add-cycle ( graph n -- graph' )" +" [ iota add-path ] [ 1 - 0 add-edge ] bi ;" +"" +": C_n ( n -- )" +" " +" graph[ \"t\" =labelloc \"circo\" =layout ];" +" node[ \"point\" =shape ];" +" over number>string \"C \" prepend =label" +" swap add-cycle" +" preview ;" +} +$nl +{ $code "5 C_n" } +{ $image "resource:extra/graphviz/gallery/c5.png" } +$nl +{ $code "6 C_n" } +{ $image "resource:extra/graphviz/gallery/c6.png" } +$nl +{ $code "7 C_n" } +{ $image "resource:extra/graphviz/gallery/c7.png" } +; + +ARTICLE: { "graphviz" "gallery" "wheel" } "Wheel graphs" +"In graph theory, a " { $emphasis "wheel graph" } " on " { $emphasis "n" } " nodes is composed of a single node connected to each node of a cycle of " { $emphasis "n-1" } " nodes." +$nl +{ $code +"USING: arrays kernel math math.parser sequences" +"graphviz graphviz.notation graphviz.render ;" +"" +": add-cycle ( graph n -- graph' )" +" [ iota add-path ] [ 1 - 0 add-edge ] bi ;" +"" +": W_n ( n -- )" +" " +" graph[ \"t\" =labelloc \"twopi\" =layout ];" +" node[ \"point\" =shape ];" +" over number>string \"W \" prepend =label" +" over add-node" +" over 1 - add-cycle" +" swap [ ] [ 1 - iota >array ] bi add-edge" +" preview ;" +} +$nl +{ $code "6 W_n" } +{ $image "resource:extra/graphviz/gallery/w6.png" } +{ $code "7 W_n" } +{ $image "resource:extra/graphviz/gallery/w7.png" } +{ $code "8 W_n" } +{ $image "resource:extra/graphviz/gallery/w8.png" } +; + +ARTICLE: { "graphviz" "gallery" "cluster" } "Cluster example" +"This example is adapted from " { $url "http://graphviz.org/content/cluster" } "." +$nl +{ $code +"USING: graphviz graphviz.notation graphviz.render ;" +"" +"" +" \"dot\" =layout" +"" +" 0 " +" \"filled\" =style" +" \"lightgrey\" =color" +" node[ \"filled\" =style \"white\" =color ];" +" { \"a0\" \"a1\" \"a2\" \"a3\" } ~->" +" \"process #1\" =label" +" add" +"" +" 1 " +" node[ \"filled\" =style ];" +" { \"b0\" \"b1\" \"b2\" \"b3\" } ~->" +" \"process #2\" =label" +" \"blue\" =color" +" add" +"" +" \"start\" \"a0\" ->" +" \"start\" \"b0\" ->" +" \"a1\" \"b3\" ->" +" \"b2\" \"a3\" ->" +" \"a3\" \"a0\" ->" +" \"a3\" \"end\" ->" +" \"b3\" \"end\" ->" +"" +" \"start\" add-node[ \"Mdiamond\" =shape ];" +" \"end\" add-node[ \"Msquare\" =shape ];" +"preview" +} +{ $image "resource:extra/graphviz/gallery/cluster.png" } +; + +ARTICLE: { "graphviz" "gallery" "circles" } "Colored circles example" +"This example was adapted from the \"star\" example in PyGraphviz (" { $url "http://networkx.lanl.gov/pygraphviz/" } ") and modified slightly." +$nl +{ $code +"USING: formatting kernel math sequences" +"graphviz graphviz.notation graphviz.render ;" +"" +": colored-circle ( i -- node )" +" [ ] keep" +" [ 16.0 / 0.5 + =width ]" +" [ 16.0 / 0.5 + =height ]" +" [ 16 * \"#%2x0000\" sprintf =fillcolor ] tri ;" +"" +"" +" graph[ \"3,3\" =size \"circo\" =layout ];" +"" +" node[ \"filled\" =style" +" \"circle\" =shape" +" \"true\" =fixedsize" +" \"\" =label ];" +"" +" edge[ \"invis\" =style ];" +"" +" 0 add-node[ \"invis\" =style \"none\" =shape ];" +"" +" 16 iota [" +" [ 0 -- ] [ colored-circle add ] bi" +" ] each" +"preview" +} +{ $image "resource:extra/graphviz/gallery/circles.png" } +; + +ARTICLE: { "graphviz" "gallery" "fsm" } "Finite state machine example" +"This example is adapted from " { $url "http://graphviz.org/content/fsm" } "." +$nl +{ $code +"USING: graphviz graphviz.notation graphviz.render ;" +"" +"" +" \"LR\" =rankdir" +" \"8,5\" =size" +" node[ \"doublecircle\" =shape ];" +" { \"LR_0\" \"LR_3\" \"LR_4\" \"LR_8\" } add-nodes" +" node[ \"circle\" =shape ];" +" \"LR_0\" \"LR_2\" ->[ \"SS(B)\" =label ];" +" \"LR_0\" \"LR_1\" ->[ \"SS(S)\" =label ];" +" \"LR_1\" \"LR_3\" ->[ \"S($end)\" =label ];" +" \"LR_2\" \"LR_6\" ->[ \"SS(b)\" =label ];" +" \"LR_2\" \"LR_5\" ->[ \"SS(a)\" =label ];" +" \"LR_2\" \"LR_4\" ->[ \"S(A)\" =label ];" +" \"LR_5\" \"LR_7\" ->[ \"S(b)\" =label ];" +" \"LR_5\" \"LR_5\" ->[ \"S(a)\" =label ];" +" \"LR_6\" \"LR_6\" ->[ \"S(b)\" =label ];" +" \"LR_6\" \"LR_5\" ->[ \"S(a)\" =label ];" +" \"LR_7\" \"LR_8\" ->[ \"S(b)\" =label ];" +" \"LR_7\" \"LR_5\" ->[ \"S(a)\" =label ];" +" \"LR_8\" \"LR_6\" ->[ \"S(b)\" =label ];" +" \"LR_8\" \"LR_5\" ->[ \"S(a)\" =label ];" +"preview" +} +{ $image "resource:extra/graphviz/gallery/fsm.png" } +; + +ARTICLE: { "graphviz" "gallery" "record" } "Record example" +"This example is adapted (and slightly altered) from " { $url "http://graphviz.org/content/datastruct" } "." +$nl +"As it shows, special label syntax is still parsed, like escape sequences (see " { $url "http://graphviz.org/content/attrs#kescString" } ") or, in this case, record syntax (see " { $url "http://graphviz.org/content/node-shapes#record" } "). However, there is no equivalent to Graphviz's headport/tailport syntax, so we set the " { $link edge } " attributes explicitly." +$nl +{ $code +"USING: graphviz graphviz.notation graphviz.render ;" +"" +"" +" graph[ \"LR\" =rankdir \"8,8\" =size ];" +" node[ 8 =fontsize \"record\" =shape ];" +"" +" \"node0\" add-node[" +" \" 0x10ba8| \" =label" +" ];" +" \"node1\" add-node[" +" \" 0xf7fc4380| | |-1\" =label" +" ];" +" \"node2\" add-node[" +" \" 0xf7fc44b8| | |2\" =label" +" ];" +" \"node3\" add-node[" +" \" 3.43322790286038071e-06|44.79998779296875|0\" =label" +" ];" +" \"node4\" add-node[" +" \" 0xf7fc4380| | |2\" =label" +" ];" +" \"node5\" add-node[" +" \" (nil)| | |-1\" =label" +" ];" +" \"node6\" add-node[" +" \" 0xf7fc4380| | |1\" =label" +" ];" +" \"node7\" add-node[" +" \" 0xf7fc4380| | |2\" =label" +" ];" +" \"node8\" add-node[" +" \" (nil)| | |-1\" =label" +" ];" +" \"node9\" add-node[" +" \" (nil)| | |-1\" =label" +" ];" +" \"node10\" add-node[" +" \" (nil)| | |-1\" =label" +" ];" +" \"node11\" add-node[" +" \" (nil)| | |-1\" =label" +" ];" +" \"node12\" add-node[" +" \" 0xf7fc43e0| | |1\" =label" +" ];" +"" +" \"node0\" \"node1\" ->[ \"f0\" =tailport \"f0\" =headport ];" +" \"node0\" \"node2\" ->[ \"f1\" =tailport \"f0\" =headport ];" +" \"node1\" \"node3\" ->[ \"f0\" =tailport \"f0\" =headport ];" +" \"node1\" \"node4\" ->[ \"f1\" =tailport \"f0\" =headport ];" +" \"node1\" \"node5\" ->[ \"f2\" =tailport \"f0\" =headport ];" +" \"node4\" \"node3\" ->[ \"f0\" =tailport \"f0\" =headport ];" +" \"node4\" \"node6\" ->[ \"f1\" =tailport \"f0\" =headport ];" +" \"node4\" \"node10\" ->[ \"f2\" =tailport \"f0\" =headport ];" +" \"node6\" \"node3\" ->[ \"f0\" =tailport \"f0\" =headport ];" +" \"node6\" \"node7\" ->[ \"f1\" =tailport \"f0\" =headport ];" +" \"node6\" \"node9\" ->[ \"f2\" =tailport \"f0\" =headport ];" +" \"node7\" \"node3\" ->[ \"f0\" =tailport \"f0\" =headport ];" +" \"node7\" \"node1\" ->[ \"f1\" =tailport \"f0\" =headport ];" +" \"node7\" \"node8\" ->[ \"f2\" =tailport \"f0\" =headport ];" +" \"node10\" \"node11\" ->[ \"f1\" =tailport \"f0\" =headport ];" +" \"node10\" \"node12\" ->[ \"f2\" =tailport \"f0\" =headport ];" +" \"node11\" \"node1\" ->[ \"f2\" =tailport \"f0\" =headport ];" +"preview" +} +{ $image "resource:extra/graphviz/gallery/record.png" } +; + +ARTICLE: { "graphviz" "gallery" } "Graphviz gallery" +"Below are some examples of the typical usage of the " { $vocab-link "graphviz" } " vocabulary." +$nl +"The images in the gallery were pre-compiled using Graphviz version 2.26.3. Depending on your particular Graphviz installation, these examples may not actually work for you, especially if you have a non-standard installation." +$nl +"Also, while most of the images have a reasonable size, some of these examples may be slow to load in the UI listener." +$nl +{ $subsections + { "graphviz" "gallery" "complete" } + { "graphviz" "gallery" "bipartite" } + { "graphviz" "gallery" "cycle" } + { "graphviz" "gallery" "wheel" } + { "graphviz" "gallery" "cluster" } + { "graphviz" "gallery" "circles" } + { "graphviz" "gallery" "fsm" } + { "graphviz" "gallery" "record" } +} +; + +ARTICLE: "graphviz" "Graphviz" +"The " { $vocab-link "graphviz" } " vocabulary provides an interface to your existing Graphviz installation, thus allowing you to create, edit, and render Graphviz graphs using Factor. For more information about Graphviz, see " { $url "http://graphviz.org" } "." +$nl +"This vocabulary provides the basic tools to construct Factor representations of graphs. For more details, see:" +{ $subsections { "graphviz" "data" } } +"Other vocabularies let you change a graph's look & feel, write cleaner code to represent it, and (of course) generate its Graphviz output:" +{ $vocab-subsection "Graphviz attributes" "graphviz.attributes" } +{ $vocab-subsection "Graphviz notation" "graphviz.notation" } +{ $vocab-subsection "Rendering Graphviz output" "graphviz.render" } +$nl +"After reading the above, you can see several examples in action:" +{ $subsections { "graphviz" "gallery" } } +; + +ABOUT: "graphviz" diff --git a/extra/graphviz/graphviz.factor b/extra/graphviz/graphviz.factor new file mode 100644 index 0000000000..9842cd0b14 --- /dev/null +++ b/extra/graphviz/graphviz.factor @@ -0,0 +1,87 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays grouping kernel namespaces present +sequences strings +graphviz.attributes +; +IN: graphviz + +TUPLE: graph +{ id string } +{ strict? boolean } +{ directed? boolean } +statements ; + +TUPLE: subgraph +{ id string } +statements ; + +TUPLE: node +{ id string } +{ attributes node-attributes } ; + +TUPLE: edge +tail +head +{ attributes edge-attributes } ; + +! Constructors + + + +: ( -- graph ) + anon-id f f V{ } clone graph boa ; + +: ( -- graph ) + t >>strict? ; + +: ( -- graph ) + t >>directed? ; + +: ( -- graph ) + t >>strict? ; + +: ( -- subgraph ) + anon-id V{ } clone subgraph boa ; + +: ( id -- subgraph ) + present V{ } clone subgraph boa ; + +: ( id -- subgraph ) + present "cluster_" prepend V{ } clone subgraph boa ; + +: ( id -- node ) + present node boa ; + +DEFER: add-nodes + +: ( tail head -- edge ) + [ + dup array? + [ swap add-nodes ] + [ dup subgraph? [ present ] unless ] + if + ] bi@ + edge boa ; + +! Building graphs + +: add ( graph statement -- graph' ) + over statements>> push ; + +: add-node ( graph id -- graph' ) + add ; inline + +: add-edge ( graph tail head -- graph' ) + add ; inline + +: add-nodes ( graph nodes -- graph' ) + [ add-node ] each ; + +: add-path ( graph nodes -- graph' ) + 2 [ first2 add-edge ] each ; diff --git a/extra/graphviz/libcgraph/libcgraph.factor b/extra/graphviz/libcgraph/libcgraph.factor new file mode 100644 index 0000000000..58859172ad --- /dev/null +++ b/extra/graphviz/libcgraph/libcgraph.factor @@ -0,0 +1,76 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: alien alien.c-types alien.libraries alien.syntax +classes.struct combinators system ; +IN: graphviz.libcgraph + +<< +"libcgraph" +{ + { [ os macosx? ] [ "libcgraph.dylib" ] } + { [ os unix? ] [ "libcgraph.so" ] } + { [ os winnt? ] [ "libcgraph.dll" ] } +} cond cdecl add-library +>> + +LIBRARY: libcgraph + +! Types + +STRUCT: Agdesc_s +{ directed uint bits: 1 } +{ strict uint bits: 1 } +{ no_loop uint bits: 1 } +{ maingraph uint bits: 1 } +{ flatlock uint bits: 1 } +{ no_write uint bits: 1 } +{ has_attrs uint bits: 1 } +{ has_cmpnd uint bits: 1 } ; + +CONSTANT: Agdirected + S{ Agdesc_s { directed 1 } { maingraph 1 } } +CONSTANT: Agstrictdirected + S{ Agdesc_s { directed 1 } { strict 1 } { maingraph 1 } } +CONSTANT: Agundirected + S{ Agdesc_s { maingraph 1 } } +CONSTANT: Agstrictundirected + S{ Agdesc_s { strict 1 } { maingraph 1 } } + +C-TYPE: Agraph_t +C-TYPE: Agnode_t +C-TYPE: Agedge_t +TYPEDEF: Agdesc_s Agdesc_t +C-TYPE: Agdisc_t + +! Graphs + +FUNCTION: Agraph_t* agopen ( c-string name, Agdesc_t kind, Agdisc_t* disc ) ; +FUNCTION: int agclose ( Agraph_t* g ) ; +FUNCTION: int agwrite ( Agraph_t* g, void* channel ) ; + +! Subgraphs + +FUNCTION: Agraph_t* agsubg ( Agraph_t* g, c-string name, int createflag ) ; + +! Nodes + +FUNCTION: Agnode_t* agnode ( Agraph_t* g, c-string name, int createflag ) ; +FUNCTION: Agnode_t* agfstnode ( Agraph_t* g ) ; +FUNCTION: Agnode_t* agnxtnode ( Agraph_t* g, Agnode_t* n ) ; + +! Edges + +FUNCTION: Agedge_t* agedge ( Agraph_t* g, + Agnode_t* t, + Agnode_t* h, + c-string name, + int createflag ) ; +FUNCTION: Agedge_t* agfstedge ( Agraph_t* g, Agnode_t* n ) ; +FUNCTION: Agedge_t* agnxtedge ( Agraph_t* g, Agedge_t* e, Agnode_t* n ) ; + +! String attributes + +FUNCTION: int agsafeset ( void* obj, + c-string name, + c-string value, + c-string default ) ; diff --git a/extra/graphviz/notation/notation-docs.factor b/extra/graphviz/notation/notation-docs.factor new file mode 100644 index 0000000000..a1191d6d54 --- /dev/null +++ b/extra/graphviz/notation/notation-docs.factor @@ -0,0 +1,467 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: graphviz graphviz.attributes help.markup help.syntax +kernel present sequences ; +IN: graphviz.notation + +{ add-edge add-edge[ -- ~-- --[ } related-words +{ add-edge add-edge[ -> ~-> ->[ } related-words +{ + add-node[ add-edge[ --[ ->[ node[ edge[ graph[ ]; +} related-words + +HELP: -- +{ $values + { "graph" { $or graph subgraph } } + { "tail" object } + { "head" object } + { "graph'" { $or graph subgraph } } +} +{ $description "Shorthand for " { $link add-edge } ". Makes undirected " { $link graph } "s read more like graphs in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 add-edge" + " 3 4 add-edge" + " 5 6 add-edge" + } + "it looks better to write" + { $code + "" + " 1 2 --" + " 3 4 --" + " 5 6 --" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " 1 -- 2" + " 3 -- 4" + " 5 -- 6" + "}" + } +} +; + +HELP: -> +{ $values + { "graph" { $or graph subgraph } } + { "tail" object } + { "head" object } + { "graph'" { $or graph subgraph } } +} +{ $description "Shorthand for " { $link add-edge } ". Makes directed " { $link graph } "s read more like digraphs in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 add-edge" + " 3 4 add-edge" + " 5 6 add-edge" + } + "it looks better to write" + { $code + "" + " 1 2 ->" + " 3 4 ->" + " 5 6 ->" + } + "Compare this with the DOT language, where you'd write" + { $code + "digraph {" + " 1 -> 2" + " 3 -> 4" + " 5 -> 6" + "}" + } +} +; + +HELP: --[ +{ $values + { "tail" object } + { "head" object } + { "edge" edge } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that undirected " { $link graph } "s read more like graphs in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 \"red\" =color add" + } + "it looks better to write" + { $code + "" + " 1 2 --[ \"red\" =color ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " 1 -- 2 [ color=\"red\" ];" + "}" + } +} +; + +HELP: ->[ +{ $values + { "tail" object } + { "head" object } + { "edge" edge } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that directed " { $link graph } "s read more like digraphs in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 \"red\" =color add" + } + "it looks better to write" + { $code + "" + " 1 2 ->[ \"red\" =color ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "digraph {" + " 1 -> 2 [ color=\"red\" ];" + "}" + } +} +; + +HELP: ]; +{ $values + { "graph" { $or graph subgraph } } + { "statement" object } + { "graph'" { $or graph subgraph } } +} +{ $description "Synonym for " { $link add } " meant to be the \"other half\" of various " { $vocab-link "graphviz.notation" } " words like " { $links add-edge[ add-node[ graph[ } ", etc." } +{ $examples "Refer to the documentation for the complementary words listed below." } +; + +HELP: add-edge[ +{ $values + { "tail" object } + { "head" object } + { "edge" edge } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that setting an " { $link edge } "'s " { $slot "attributes" } " reads more like the equivalent in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 \"red\" =color add" + } + "it looks better to write" + { $code + "" + " 1 2 add-edge[ \"red\" =color ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " 1 -- 2 [ color=\"red\" ];" + "}" + } + $nl + "This has the advantage over " { $link --[ } " and " { $link ->[ } " of reading nicely for both directed " { $emphasis "and" } " undirected " { $link graph } "s." +} +; + +HELP: add-node[ +{ $values + { "id" object } + { "node" node } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that setting a " { $link node } "'s " { $slot "attributes" } " reads more like the equivalent in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " \"foo\" \"red\" =color add" + } + "it looks better to write" + { $code + "" + " \"foo\" add-node[ \"red\" =color ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " foo [ color=\"red\" ];" + "}" + } +} +; + +HELP: edge[ +{ $values + { "attrs" edge-attributes } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that adding " { $link edge-attributes } " to a " { $link graph } " or " { $link subgraph } " reads more like the equivalent in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " \"red\" =color add" + } + "it looks better to write" + { $code + "" + " edge[ \"red\" =color ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " edge[ color=\"red\" ];" + "}" + } +} +; + +HELP: graph[ +{ $values + { "attrs" graph-attributes } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that adding " { $link graph-attributes } " to a " { $link graph } " or " { $link subgraph } " reads more like the equivalent in the DOT language." } +{ $notes "This word is rendered redundant by the " { $link graph } " and " { $link subgraph } " methods defined by " { $vocab-link "graphviz.notation" } " for setting attributes. Sometimes it still might look better to delineate certain attribute-setting code." } +{ $examples + "Instead of writing" + { $code + "" + " \"LR\" =rankdir \"blah\" =label add" + } + "it looks better to write" + { $code + "" + " graph[ \"LR\" =rankdir \"blah\" =label ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " graph[ rankdir=\"LR\" label=\"blah\" ];" + "}" + } + $nl + "Of course, you could just write" + { $code + "" + " \"LR\" =rankdir" + " \"blah\" =label" + } + "Similarly, in the DOT language you could just write" + { $code + "graph {" + " rankdir=\"LR\"" + " label=\"blah\"" + "}" + } +} +; + +HELP: node[ +{ $values + { "attrs" node-attributes } +} +{ $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that adding " { $link node-attributes } " to a " { $link graph } " or " { $link subgraph } " reads more like the equivalent in the DOT language." } +{ $examples + "Instead of writing" + { $code + "" + " \"red\" =color add" + } + "it looks better to write" + { $code + "" + " node[ \"red\" =color ];" + } + "Compare this with the DOT language, where you'd write" + { $code + "graph {" + " node[ color=\"red\" ];" + "}" + } +} +; + +HELP: ~-- +{ $values + { "graph" { $or graph subgraph } } + { "nodes" sequence } + { "graph'" { $or graph subgraph } } +} +{ $description "Shorthand for " { $link add-path } ". Meant to be a Factor replacement for the DOT language's more verbose path notation." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 --" + " 2 3 --" + " 3 4 --" + } + "you can write" + { $code + "" + " { 1 2 3 4 } ~--" + } + "whereas in the DOT language you'd write" + { $code + "graph {" + " 1 -- 2 -- 3 -- 4" + "}" + } +} +; + +HELP: ~-> +{ $values + { "graph" { $or graph subgraph } } + { "nodes" sequence } + { "graph'" { $or graph subgraph } } +} +{ $description "Shorthand for " { $link add-path } ". Meant to be a Factor replacement for the DOT language's more verbose path notation." } +{ $examples + "Instead of writing" + { $code + "" + " 1 2 ->" + " 2 3 ->" + " 3 4 ->" + } + "you can write" + { $code + "" + " { 1 2 3 4 } ~->" + } + "whereas in the DOT language you'd write" + { $code + "digraph {" + " 1 -> 2 -> 3 -> 4" + "}" + } +} +; + +ARTICLE: { "graphviz.notation" "=attrs" } "Notation for setting Graphviz attributes" +"The " { $vocab-link "graphviz.notation" } " vocabulary provides words for setting Graphviz attributes in a way that looks similar to the DOT language (see " { $url "http://graphviz.org/content/dot-language" } ")." +$nl +"For every slot named, say, " { $snippet "attr" } " in the " { $link node-attributes } ", " { $link edge-attributes } ", and " { $link graph-attributes } " tuples, a generic word named " { $snippet "=attr" } " is defined with the stack effect " { $snippet "( graphviz-obj val -- graphviz-obj' )" } "." +$nl +"In each such " { $snippet "=attr" } " word, " { $snippet "val" } " must be an object supported by the " { $link present } " word, which is always called on " { $snippet "val" } " before it's stored in a slot." +$nl +"These generics will \"do the right thing\" in setting the corresponding attribute of " { $snippet "graphviz-obj" } "." +$nl +"For example, since " { $link graph-attributes } " has a " { $slot "label" } " slot, the generic " { $link =label } " is defined, along with methods so that if " { $snippet "graphviz-obj" } " is a..." +{ $list + { "..." { $link graph } " or " { $link subgraph } ", a new " { $link graph-attributes } " instance is created, has its " { $slot "label" } " slot is set to " { $snippet "val" } ", and is " { $link add } "ed to " { $snippet "graphviz-obj" } "." } + { "..." { $link graph-attributes } " instance, its " { $slot "label" } " slot is set to " { $snippet "val" } "." } +} +$nl +"Since " { $link edge-attributes } " has a " { $slot "label" } " slot, further methods are defined so that if " { $snippet "graphviz-obj" } " is an..." +{ $list + { "..." { $link edge } ", its " { $slot "attributes" } " slot has its " { $slot "label" } " slot set to " { $snippet "val" } "." } + { "..." { $link edge-attributes } " instance, its " { $slot "label" } " slot is set to " { $snippet "val" } "." } +} +$nl +"Finally, since " { $link node-attributes } " has a " { $slot "label" } " slot, still more methods are defined so that if " { $snippet "graphviz-obj" } " is a..." +{ $list + { "..." { $link node } ", its " { $slot "attributes" } " slot has its " { $slot "label" } " slot set to " { $snippet "val" } "." } + { "..." { $link node-attributes } " instance, its " { $slot "label" } " slot is set to " { $snippet "val" } "." } +} +$nl +"Thus, instead of" +{ $code + "" + " " + " \"Bad-ass graph\" >>label" + " add" + " 1 2 dup attributes>>" + " \"This edge is dumb\" swap label<<" + " add" + " 3 dup attributes>>" + " \"This node is cool\" swap label<<" + " add" +} +"you can simply write" +{ $code + "" + " \"Bad-ass graph\" =label" + " 1 2 " + " \"This edge is dumb\" =label" + " add" + " 3 " + " \"This node is cool\" =label" + " add" +} +$nl +"However, since the slot " { $slot "labelloc" } " only exists in " { $link graph-attributes } " and " { $link node-attributes } ", there won't be a method for " { $link edge } " or " { $link edge-attributes } " objects:" +{ $example + "USING: continuations graphviz graphviz.notation io kernel ;" + "" + " ! This is OK:" + " \"t\" =labelloc" + "" + " ! This is not OK:" + " [ 1 2 \"b\" =labelloc add ]" + " [ 2drop \"not for edges!\" write ] recover" + "not for edges!" +} +$nl +"For the full list of attribute-setting words, consult the list of generic words for the " { $vocab-link "graphviz.notation" } " vocabulary." +; + +ARTICLE: { "graphviz.notation" "synonyms" } "Aliases that resemble DOT code" +"The " { $vocab-link "graphviz.notation" } " vocabulary provides aliases for words defined in the " { $vocab-link "graphviz" } " and " { $vocab-link "graphviz.attributes" } " vocabularies. These will make Factor code read more like DOT code (see " { $url "http://graphviz.org/content/dot-language" } ")." +$nl +"Notation for edges without attributes:" +{ $subsections + -- + -> + ~-- + ~-> +} +"Notation for nodes/edges with local attributes:" +{ $subsections + add-node[ + add-edge[ + --[ + ->[ +} +"Notation for global attributes:" +{ $subsections + node[ + edge[ + graph[ +} +"Word to \"close off\" notation for attributes:" +{ $subsections + ]; +} +; + +ARTICLE: "graphviz.notation" "Graphviz notation" +"The " { $vocab-link "graphviz.notation" } " vocabulary provides words for building " { $link graph } "s in a way that looks similar to the DOT language (see " { $url "http://graphviz.org/content/dot-language" } ")." +$nl +"The " { $vocab-link "graphviz" } " vocabulary alone already follows the general structure of the DOT language: " { $link graph } "s and " { $link subgraph } "s consist of an ordered sequence of " { $slot "statements" } "; each statement will " { $link add } " either a " { $link node } ", an " { $link edge } ", or some attribute declaration (" { $links graph-attributes node-attributes edge-attributes } "); and " { $slot "attributes" } " may be set on individual " { $link node } "s and " { $link edge } "s. Even some DOT niceties are already supported, like being able to have an " { $link edge } " between anonymous " { $link subgraph } "s. For instance, compare" +{ $code + "" + " { 1 2 3 } { 4 5 6 } add-edge" +} +"with the DOT code" +{ $code + "digraph {" + " { 1 2 3 } -> { 4 5 6 }" + "}" +} +$nl +"However, there are some rough points that this vocabulary addresses:" +{ $subsections + { "graphviz.notation" "=attrs" } + { "graphviz.notation" "synonyms" } +} +; + +ABOUT: "graphviz.notation" diff --git a/extra/graphviz/notation/notation.factor b/extra/graphviz/notation/notation.factor new file mode 100644 index 0000000000..b801cf8b82 --- /dev/null +++ b/extra/graphviz/notation/notation.factor @@ -0,0 +1,89 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors fry generic generic.parser generic.standard +kernel present quotations sequences slots words +graphviz +graphviz.attributes +; +IN: graphviz.notation + +<< + +> attr<< ; +! M: sub/graph =attr +! swap present >>attr add ; +! M: edge/node/graph-attributes =attr +! present >>attr ; + +: =attr-generic ( name -- generic ) + "=" prepend "graphviz.notation" 2dup lookup + [ 2nip ] [ + create dup + 1 + (( graphviz-obj val -- graphviz-obj' )) + define-generic + ] if* ; + +: =attr-method ( class name -- method name ) + [ =attr-generic create-method-in ] keep ; + +: sub/graph-=attr ( attr -- ) + [ graph subgraph ] dip [ + =attr-method + setter-word 1quotation + '[ swap present @ add ] + define + ] curry bi@ ; + +: edge/node-=attr ( class attr -- ) + =attr-method + writer-word 1quotation '[ present over attributes>> @ ] + define ; + +: graph-obj-=attr ( class attr -- ) + over graph = + [ nip sub/graph-=attr ] + [ edge/node-=attr ] if ; + +: attrs-obj-=attr ( class attr -- ) + =attr-method + setter-word 1quotation '[ present @ ] + define ; + +: define-=attrs ( base-class attrs-class -- ) + dup "slots" word-prop [ + name>> + [ attrs-obj-=attr ] keep + graph-obj-=attr + ] with with each ; + +PRIVATE> + +graph graph-attributes define-=attrs +edge edge-attributes define-=attrs +node node-attributes define-=attrs + +>> + +ALIAS: -> add-edge +ALIAS: -- add-edge +ALIAS: ~-> add-path +ALIAS: ~-- add-path + +ALIAS: graph[ +ALIAS: node[ +ALIAS: edge[ + +ALIAS: add-node[ +ALIAS: add-edge[ +ALIAS: ->[ +ALIAS: --[ + +ALIAS: ]; add + +! Can't really do add-path[ & add-nodes[ this way, since they +! involve multiple objects. diff --git a/extra/graphviz/render/render-docs.factor b/extra/graphviz/render/render-docs.factor new file mode 100644 index 0000000000..b6c51f7567 --- /dev/null +++ b/extra/graphviz/render/render-docs.factor @@ -0,0 +1,333 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: graphviz graphviz.attributes graphviz.builder +graphviz.ffi help.markup help.syntax images.viewer kernel +strings ; +IN: graphviz.render + +HELP: default-format +{ $var-description "Holds a " { $link string } " representing the implicit output format for certain words in the " { $vocab-link "graphviz.render" } " vocabulary." } +{ $see-also graphviz graphviz* preview preview-window default-layout } +; + +HELP: default-layout +{ $var-description "Holds a " { $link string } " representing the implicit layout engine for certain words in the " { $vocab-link "graphviz.render" } " vocabulary." } +{ $see-also graphviz graphviz* preview preview-window default-format } +; + +{ graphviz graphviz* } related-words + +HELP: graphviz +{ $values + { "graph" graph } + { "-O" string } + { "-T" string } + { "-K" { $maybe string } } +} +{ $description "Renders " { $snippet "graph" } " to a specified output file." +$nl +{ $snippet "-O" } " is similar to the command-line argument of the standard Graphviz commands (see " { $url "http://graphviz.org/content/command-line-invocation" } "). It specifies the base name of the " { $strong "o" } "utput file. Like Graphviz tools, the proper extension (if one is known) is automatically added to the file name based on " { $snippet "-T" } "." +$nl +{ $snippet "-T" } " specifies the output format " { $strong "t" } "ype (which must be a member of " { $link supported-formats } "). This is, again, akin to the command-line flag in standard Graphviz commands." +$nl +{ $snippet "-K" } " specifies the layout engine. If " { $snippet "-K" } " is " { $link f } ", then " { $snippet "graph" } " is checked for a " { $slot "layout" } " attribute (see " { $link graph-attributes } ") and that engine is used; if no such attribute is set, then " { $link default-layout } " is used. Regardless, the resulting engine must be a member of " { $link supported-engines } "." +} +{ $errors +"If " { $snippet "graph" } " is not an instance of " { $link graph } ", a " { $link non-graph-error } " is thrown." +$nl +"An " { $link improper-statement-error } " is thrown if any element of " { $snippet "graph" } "'s " { $snippet "statements" } " slot is not an instance of:" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { "or " { $link edge-attributes } } +} +$nl +"If " { $snippet "-K" } " (or the inferred layout engine) is not a member of " { $link supported-engines } ", an " { $link unsupported-engine } " error is thrown." +$nl +"If " { $snippet "-T" } " is not a member of " { $link supported-formats } ", an " { $link unsupported-format } " error is thrown." +} +{ $examples "To render a " { $link graph } " " { $snippet "G" } " using " { $emphasis "circo" } " and save the output to a PNG file, we could write" { $code "G \"foo\" \"png\" \"circo\" graphviz" } "(assuming " { $emphasis "circo" } " and PNG are supported by your Graphviz installation). This will save the output to the file " { $snippet "foo.png" } "." } +; + +HELP: graphviz* +{ $values + { "graph" graph } + { "-O" string } + { "-T" string } +} +{ $description "Renders " { $snippet "graph" } " to a specified output file (" { $snippet "-O" } ") with the specified format type (" { $snippet "-T" } ") using the " { $link default-layout } " (or " { $snippet "graph" } "'s " { $snippet "layout" } " attribute, if set). That is, the following two lines are equivalent:" +{ $code "-O -T f graphviz" "-O -T graphviz*" } +} +{ $errors +"If " { $snippet "graph" } " is not an instance of " { $link graph } ", a " { $link non-graph-error } " is thrown." +$nl +"An " { $link improper-statement-error } " is thrown if any element of " { $snippet "graph" } "'s " { $snippet "statements" } " slot is not an instance of:" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { "or " { $link edge-attributes } } +} +$nl +"If the inferred layout engine is not a member of " { $link supported-engines } ", an " { $link unsupported-engine } " error is thrown." +$nl +"If " { $snippet "-T" } " is not a member of " { $link supported-formats } ", an " { $link unsupported-format } " error is thrown." +} +{ $examples "To render a " { $link graph } " " { $snippet "G" } " when we don't particularly care about the engine but want to save the output to a PNG file, we could write" { $code "G \"foo\" \"png\" graphviz*" } "(assuming the inferred layout and PNG are supported by your Graphviz installation). This will save the output to the file " { $snippet "foo.png" } "." } +; + +HELP: preview +{ $values + { "graph" graph } +} +{ $description "Renders " { $snippet "graph" } " to a temporary file of the " { $link default-format } " (assumed to be an image format) using the " { $link default-layout } " (or, if specified, the engine set as the graph's " { $slot "layout" } " attribute). Then, using the " { $vocab-link "images.viewer" } " vocabulary, displays the image in the UI listener." } +{ $errors +"If " { $snippet "graph" } " is not an instance of " { $link graph } ", a " { $link non-graph-error } " is thrown." +$nl +"An " { $link improper-statement-error } " is thrown if any element of " { $snippet "graph" } "'s " { $snippet "statements" } " slot is not an instance of:" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { "or " { $link edge-attributes } } +} +$nl +"If the inferred layout engine is not a member of " { $link supported-engines } ", an " { $link unsupported-engine } " error is thrown." +$nl +"If the inferred output format (i.e., " { $link default-format } ") is not a member of " { $link supported-formats } ", an " { $link unsupported-format } " error is thrown." +} +{ $see-also image. preview-window } +; + +HELP: preview-window +{ $values + { "graph" graph } +} +{ $description "Renders " { $snippet "graph" } " to a temporary file of the " { $link default-format } " (assumed to be an image format) using the " { $link default-layout } " (or, if specified, the engine set as the graph's " { $slot "layout" } " attribute). Then, using the " { $vocab-link "images.viewer" } " vocabulary, opens a new window displaying the image." } +{ $errors +"If " { $snippet "graph" } " is not an instance of " { $link graph } ", a " { $link non-graph-error } " is thrown." +$nl +"An " { $link improper-statement-error } " is thrown if any element of " { $snippet "graph" } "'s " { $snippet "statements" } " slot is not an instance of:" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { "or " { $link edge-attributes } } +} +$nl +"If the inferred layout engine is not a member of " { $link supported-engines } ", an " { $link unsupported-engine } " error is thrown." +$nl +"If the inferred output format (i.e., " { $link default-format } ") is not a member of " { $link supported-formats } ", an " { $link unsupported-format } " error is thrown." +} +{ $see-also image-window preview } +; + +HELP: unsupported-engine +{ $values + { "engine" object } +} +{ $error-description "Thrown if a rendering word tries to use a layout engine that is not a member of " { $link supported-engines } "." } +{ $see-also unsupported-format } +; + +HELP: unsupported-format +{ $values + { "format" object } +} +{ $error-description "Thrown if a rendering word tries to use an output format that is not a member of " { $link supported-formats } "." } +{ $see-also unsupported-engine } +; + +ARTICLE: { "graphviz.render" "algorithm" "node" } "Rendering nodes" +"To render a " { $link node } ", a Graphviz equivalent is constructed in memory that is identified by the " { $link node } "'s " { $slot "id" } " slot. Then, any local attributes (as specified in the " { $slot "attributes" } " slot) are set." +$nl +"If two " { $link node } " instances have the same " { $slot "id" } ", they will correspond to the same object in the Graphviz representation. Thus, the effect of any local attributes are cumulative. For example," +{ $code +"" +" 1 add-node[ \"blue\" =color ];" +" 1 add-node[ \"red\" =color ];" +} +"will render the same way as just" +{ $code +"" +" 1 add-node[ \"red\" =color ];" +} +"because statements are rendered in the order they appear. Even " { $link node } " instances in a " { $link subgraph } " are treated this way, so" +{ $code +"" +" 1 add-node" +" " +" 1 add-node" +" add" +} +"will only create a single Graphviz node." +; + +ARTICLE: { "graphviz.render" "algorithm" "subgraph" } "Rendering subgraphs" +"To render a " { $link subgraph } ", a Graphviz equivalent is constructed in memory that is identified by the " { $link subgraph } "'s " { $slot "id" } " slot. This equivalent will inherit any attributes set in its parent graph (see " { $link { "graphviz.render" "algorithm" "attributes" } } ")." +$nl +"Each element of the " { $link subgraph } "'s " { $slot "statements" } " slot is recursively rendered in order. Thus, subgraph attributes are set by rendering a " { $link graph-attributes } " object contained in a " { $link subgraph } "'s " { $slot "statements" } "." +$nl +"If two " { $link subgraph } " instances have the same " { $slot "id" } ", they will correspond to the same object in the Graphviz representation. (Indeed, the " { $slot "id" } "s even share the same namespace as the root " { $link graph } "; see " { $url "http://graphviz.org/content/dot-language" } " for details.) Thus, the effect of rendering " { $emphasis "any" } " statement is cumulative. For example," +{ $code +"" +" { 1 2 3 } add-nodes" +"" +" 0 " +" 4 add-node" +" add" +"" +" 0 " +" 5 add-node" +" add" +} +"will render the same way as just" +{ $code +"" +" { 1 2 3 } add-nodes" +"" +" 0 " +" 4 add-node" +" 5 add-node" +" add" +} +; + +ARTICLE: { "graphviz.render" "algorithm" "attributes" } "Rendering attributes" +"The way " { $link node-attributes } ", " { $link edge-attributes } ", and " { $link graph-attributes } " are rendered varies by context." +$nl +"If an instance of " { $link node-attributes } " or " { $link edge-attributes } " appears in the " { $slot "statements" } " of a " { $link graph } " or " { $link subgraph } ", it corresponds to global Graphviz attributes that will be set automatically for any " { $emphasis "future" } " " { $link node } " or " { $link edge } " instances (respectively), just like global attribute statements in the DOT language. Rendering " { $link graph-attributes } " behaves similarly, except that the Graphviz attributes of the containing graph/subgraph will also be altered, in addition to future " { $link subgraph } "s inheriting said attributes." +$nl +{ $link node-attributes } " and " { $link edge-attributes } " may also be rendered in the context of a single " { $link node } " or " { $link edge } ", as specified by these objects' " { $slot "attributes" } " slots. They correspond to Graphviz attributes set specifically for the corresponding node/edge, after the defaults are inherited from rendering global statements as in the above." +$nl +"For example, setting " { $emphasis "local" } " attributes like" +{ $code +"" +" 1 add-node[ \"red\" =color ];" +" 2 add-node[ \"red\" =color ];" +" 3 add-node[ \"blue\" =color ];" +" 4 add-node[ \"blue\" =color ];" +} +"will render the same way as setting " { $emphasis "global" } " attributes that get inherited, like" +{ $code +"" +" node[ \"red\" =color ];" +" 1 add-node" +" 2 add-node" +" node[ \"blue\" =color ];" +" 3 add-node" +" 4 add-node" +} +; + +ARTICLE: { "graphviz.render" "algorithm" "edge" } "Rendering edges" +"Instances of " { $link edge } " are not quite in one-to-one correspondence with Graphviz edges. The latter exist solely between two nodes, whereas an " { $link edge } " instance may have a " { $link subgraph } " as an endpoint." +$nl +"To render an " { $link edge } ", first the " { $slot "tail" } " is recursively rendered:" +{ $list + { "If it is a " { $link string } ", then it's taken to identify a node (if one doesn't already exist in the Graphviz representation, it is created)." } + { "If it is a " { $link subgraph } ", then it's rendered recursively as per " { $link { "graphviz.render" "algorithm" "subgraph" } } " (thus also creating the Graphviz subgraph if one doesn't already exist)." } +} +$nl +"The " { $slot "head" } " is then rendered in the same way." +$nl +"More than one corresponding Graphviz edge may be created at this point. In general, a Graphviz edge is created from each node in the tail (or just the one, if " { $slot "tail" } " was a " { $link string } ") to each node in the head (or just the one, if " { $slot "head" } " was a " { $link string } "). However, a Grapvhiz edge may or may not be solely identified by its endpoints. Either way, whatever Graphviz-equivalent edges wind up being rendered, their attributes will be set according to the " { $link edge } "'s " { $slot "attributes" } " slot." +$nl +"In particular, if the root graph is strict, then edges are uniquely identified, so attributes are cumulative (like in " { $link { "graphviz.render" "algorithm" "node" } } " and " { $link { "graphviz.render" "algorithm" "subgraph" } } "). For example," +{ $code + "" + " 1 2 add-edge[ \"blue\" =color ];" + " 1 2 add-edge[ \"red\" =color ];" +} +"will render the same way as just" +{ $code + "" + " 1 2 add-edge[ \"red\" =color ];" +} +$nl +"But in a non-strict graph, a new Graphviz edge is created with its own local attributes which are not affected by past edges between the same endpoints. So," +{ $code + "" + " 1 2 add-edge[ \"blue\" =color ];" + " 1 2 add-edge[ \"red\" =color ];" +} +"will render " { $emphasis "two" } " separate edges with different colors (one red, one blue)." +{ $notes +"Because of the above semantics for edges between subgraphs, the " { $vocab-link "graphviz" } " vocabulary does not support edges betwteen clusters as single entities like certain Graphviz layout engines, specifically " { $emphasis "fdp" } "." +} +; + +ARTICLE: { "graphviz.render" "algorithm" "error" } "Rendering unexpected objects" +"If an object in the " { $slot "statements" } " of a " { $link graph } " or " { $link subgraph } " is not an instance of either" +{ $list + { $link subgraph } + { $link node } + { $link edge } + { $link graph-attributes } + { $link node-attributes } + { "or " { $link edge-attributes } } +} +"then it will trigger an " { $link improper-statement-error } "." +; + +ARTICLE: { "graphviz.render" "algorithm" } "Graphviz rendering algorithm" +"The " { $vocab-link "graphviz.render" } " vocabulary provides words to " { $emphasis "render" } " graphs. That is, it generates Graphviz output from a " { $link graph } " by using the " { $vocab-link "graphviz.ffi" } " and " { $vocab-link "graphviz.builder" } " vocabularies. Intuitively, " { $link graph } "s follow the same rules as in the DOT language (see " { $url "http://graphviz.org/content/dot-language" } " for more information). To render a " { $link graph } ", each element of its " { $slot "statements" } " slot is added to the Graphviz representation in order. The following gives a general overview of how different objects are rendered, with a few points to keep in mind." +{ $subsections + { "graphviz.render" "algorithm" "node" } + { "graphviz.render" "algorithm" "edge" } + { "graphviz.render" "algorithm" "attributes" } + { "graphviz.render" "algorithm" "subgraph" } + { "graphviz.render" "algorithm" "error" } +} +{ $notes +"Each call to a rendering word (like " { $links graphviz graphviz* preview preview-window } ", etc.) will go through the process of reconstructing the equivalent Graphviz representation in memory, even if the underlying " { $link graph } " hasn't changed." +} +; + +ARTICLE: { "graphviz.render" "engines" } "Rendering graphs by layout engine" +"For each layout engine in " { $link supported-engines } ", the " { $vocab-link "graphviz.render" } " vocabulary defines a corresponding word that calls " { $link graphviz } " with that engine already supplied as an argument. For instance, instead of writing" { $code "graph -O -T \"dot\" graphviz" } "you can simply write" { $code "graph -O -T dot" } "as long as " { $snippet "\"dot\"" } " is a member of " { $link supported-engines } "." +; + +ARTICLE: { "graphviz.render" "formats" } "Rendering graphs by output format" +"For each output format in " { $link supported-formats } ", the " { $vocab-link "graphviz.render" } " vocabulary defines a corresponding word that calls " { $link graphviz* } " with that format already supplied as an argument. For instance, instead of writing" { $code "graph -O \"png\" graphviz*" } "you can simply write" { $code "graph -O png" } "as long as " { $snippet "\"png\"" } " is a member of " { $link supported-formats } "." +$nl +"If any of the formats is also a member of " { $link supported-engines } ", the word is named with a " { $snippet "-file" } " suffix. For instance, the " { $vocab-link "graphviz.render" } " vocabulary may define a word for the " { $snippet "\"dot\"" } " layout engine, so that instead of" { $code "graph -O -T \"dot\" graphviz" } "you can write" { $code "graph -O -T dot" } "But to infer the layout engine and " { $emphasis "output" } " in the " { $snippet "\"dot\"" } " format, instead of" { $code "graph -O \"dot\" graphviz*" } "you can write" { $code "graph -O dot-file" } "as long as " { $snippet "\"dot\"" } " is a member of both " { $link supported-engines } " and " { $link supported-formats } "." + +{ $warning "Graphviz may support " { $emphasis "canvas" } " formats, such as " { $snippet "\"xlib\"" } " or " { $snippet "\"gtk\"" } ", that will open windows displaying the graph. However, the listener will not be aware of these windows: when they are closed, the listener will exit as well. You should probably use the " { $link preview-window } " word, instead." } +; + +ARTICLE: "graphviz.render" "Rendering Graphviz output" +"The " { $vocab-link "graphviz.render" } " vocabulary provides words for converting " { $link graph } " objects into equivalent Graphviz output. The following provides a general overview of how this process works:" +{ $subsections { "graphviz.render" "algorithm" } } + +"Graphviz provides a variety of different layout engines (which give algorithms for placing nodes and edges in a graph) and output formats (e.g., different image filetypes to show the graph structure)." +$nl +"The most general words in this vocabulary will have you manually specify the desired engine and/or format, along with a file to which Graphviz should save its output:" +{ $subsections + graphviz + graphviz* +} + +"If the graph is small enough, it may be convenient to see an image of it using Factor's UI listener:" +{ $subsections + preview + preview-window +} + +"Specialized words are also defined to save on extraneous typing:" +{ $subsections + { "graphviz.render" "engines" } + { "graphviz.render" "formats" } +} +; + +ABOUT: "graphviz.render" diff --git a/extra/graphviz/render/render.factor b/extra/graphviz/render/render.factor new file mode 100644 index 0000000000..12259712f3 --- /dev/null +++ b/extra/graphviz/render/render.factor @@ -0,0 +1,136 @@ +! Copyright (C) 2011 Alex Vondrak. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors combinators continuations destructors +images.viewer io.files.unique kernel locals namespaces parser +sequences summary unicode.case words +graphviz.ffi +graphviz.builder +; +IN: graphviz.render + +SYMBOL: default-layout +"dot" default-layout set-global + +SYMBOL: default-format +"png" default-format set-global + +ERROR: unsupported-format format ; +ERROR: unsupported-engine engine ; + +M: unsupported-format summary + drop "Unsupported layout format; check supported-formats" ; + +M: unsupported-engine summary + drop "Unsupported layout engine; check supported-engines" ; + +lower { + { "bmp" [ ".bmp" ] } + { "canon" [ ".dot" ] } + { "dot" [ ".dot" ] } + { "xdot" [ ".dot" ] } + { "eps" [ ".eps" ] } + { "fig" [ ".fig" ] } + { "gd" [ ".gd" ] } + { "gd2" [ ".gd2" ] } + { "gif" [ ".gif" ] } + { "ico" [ ".ico" ] } + { "imap" [ ".map" ] } + { "cmapx" [ ".map" ] } + { "imap_np" [ ".map" ] } + { "cmapx_np" [ ".map" ] } + { "ismap" [ ".map" ] } + { "jpg" [ ".jpg" ] } + { "jpeg" [ ".jpg" ] } + { "jpe" [ ".jpg" ] } + { "pdf" [ ".pdf" ] } + { "plain" [ ".txt" ] } + { "plain-ext" [ ".txt" ] } + { "png" [ ".png" ] } + { "ps" [ ".ps" ] } + { "ps2" [ ".ps" ] } + { "svg" [ ".svg" ] } + { "svgz" [ ".svgz" ] } + { "tif" [ ".tif" ] } + { "tiff" [ ".tif" ] } + { "vml" [ ".vml" ] } + { "vmlz" [ ".vmlz" ] } + { "vrml" [ ".vrml" ] } + { "wbmp" [ ".wbmp" ] } + [ drop "" ] + } case ; + +: check-format ( -T -- ) + dup supported-formats member? + [ drop ] [ unsupported-format ] if ; inline + +: check-engine ( -K -- ) + dup supported-engines member? + [ drop ] [ unsupported-engine ] if ; inline + +: compute-engine ( Agraph_t* -K -- engine ) + [ nip ] + [ + "layout" agget + [ default-layout get-global ] when-empty + ] if* dup check-engine ; + +:: (graphviz) ( graph -O -T -K -- -o ) + -T check-format + -O -T default-extension append :> -o + [ + gvContext &gvFreeContext :> gvc + graph id>> graph kind agopen &agclose :> g + g graph build-alien + g -K compute-engine :> engine + gvc g engine gvLayout drop + [ gvc g -T -o gvRenderFilename drop -o ] + [ gvc g gvFreeLayout drop ] [ ] cleanup + ] with-destructors ; + +: (preview) ( graph -- -o ) + "preview" unique-file + default-format get-global + f (graphviz) ; inline + +PRIVATE> + +: graphviz ( graph -O -T -K -- ) + (graphviz) drop ; inline + +: graphviz* ( graph -O -T -- ) + f graphviz ; inline + +: preview ( graph -- ) + (preview) image. ; inline + +: preview-window ( graph -- ) + (preview) image-window ; inline + +<< + + + +supported-engines [ define-graphviz-by-engine ] each +supported-formats [ define-graphviz-by-format ] each + +>> From d4d280427063de84bedb658604d170047f11215a Mon Sep 17 00:00:00 2001 From: Alex Vondrak Date: Mon, 23 May 2011 07:16:18 -0700 Subject: [PATCH 2/3] graphviz: oops; remove graphviz.libcgraph, which is never used --- extra/graphviz/libcgraph/libcgraph.factor | 76 ----------------------- 1 file changed, 76 deletions(-) delete mode 100644 extra/graphviz/libcgraph/libcgraph.factor diff --git a/extra/graphviz/libcgraph/libcgraph.factor b/extra/graphviz/libcgraph/libcgraph.factor deleted file mode 100644 index 58859172ad..0000000000 --- a/extra/graphviz/libcgraph/libcgraph.factor +++ /dev/null @@ -1,76 +0,0 @@ -! Copyright (C) 2011 Alex Vondrak. -! See http://factorcode.org/license.txt for BSD license. -USING: alien alien.c-types alien.libraries alien.syntax -classes.struct combinators system ; -IN: graphviz.libcgraph - -<< -"libcgraph" -{ - { [ os macosx? ] [ "libcgraph.dylib" ] } - { [ os unix? ] [ "libcgraph.so" ] } - { [ os winnt? ] [ "libcgraph.dll" ] } -} cond cdecl add-library ->> - -LIBRARY: libcgraph - -! Types - -STRUCT: Agdesc_s -{ directed uint bits: 1 } -{ strict uint bits: 1 } -{ no_loop uint bits: 1 } -{ maingraph uint bits: 1 } -{ flatlock uint bits: 1 } -{ no_write uint bits: 1 } -{ has_attrs uint bits: 1 } -{ has_cmpnd uint bits: 1 } ; - -CONSTANT: Agdirected - S{ Agdesc_s { directed 1 } { maingraph 1 } } -CONSTANT: Agstrictdirected - S{ Agdesc_s { directed 1 } { strict 1 } { maingraph 1 } } -CONSTANT: Agundirected - S{ Agdesc_s { maingraph 1 } } -CONSTANT: Agstrictundirected - S{ Agdesc_s { strict 1 } { maingraph 1 } } - -C-TYPE: Agraph_t -C-TYPE: Agnode_t -C-TYPE: Agedge_t -TYPEDEF: Agdesc_s Agdesc_t -C-TYPE: Agdisc_t - -! Graphs - -FUNCTION: Agraph_t* agopen ( c-string name, Agdesc_t kind, Agdisc_t* disc ) ; -FUNCTION: int agclose ( Agraph_t* g ) ; -FUNCTION: int agwrite ( Agraph_t* g, void* channel ) ; - -! Subgraphs - -FUNCTION: Agraph_t* agsubg ( Agraph_t* g, c-string name, int createflag ) ; - -! Nodes - -FUNCTION: Agnode_t* agnode ( Agraph_t* g, c-string name, int createflag ) ; -FUNCTION: Agnode_t* agfstnode ( Agraph_t* g ) ; -FUNCTION: Agnode_t* agnxtnode ( Agraph_t* g, Agnode_t* n ) ; - -! Edges - -FUNCTION: Agedge_t* agedge ( Agraph_t* g, - Agnode_t* t, - Agnode_t* h, - c-string name, - int createflag ) ; -FUNCTION: Agedge_t* agfstedge ( Agraph_t* g, Agnode_t* n ) ; -FUNCTION: Agedge_t* agnxtedge ( Agraph_t* g, Agedge_t* e, Agnode_t* n ) ; - -! String attributes - -FUNCTION: int agsafeset ( void* obj, - c-string name, - c-string value, - c-string default ) ; From d6f039cd2f80e85174e09f719bf313734a0ed293 Mon Sep 17 00:00:00 2001 From: Alex Vondrak Date: Fri, 3 Jun 2011 15:46:52 -0700 Subject: [PATCH 3/3] graphviz.render: make sure to normalize paths --- extra/graphviz/render/render.factor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extra/graphviz/render/render.factor b/extra/graphviz/render/render.factor index 12259712f3..0fd17a68b3 100644 --- a/extra/graphviz/render/render.factor +++ b/extra/graphviz/render/render.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2011 Alex Vondrak. ! See http://factorcode.org/license.txt for BSD license. USING: accessors combinators continuations destructors -images.viewer io.files.unique kernel locals namespaces parser -sequences summary unicode.case words +images.viewer io.backend io.files.unique kernel locals +namespaces parser sequences summary unicode.case words graphviz.ffi graphviz.builder ; @@ -79,7 +79,7 @@ M: unsupported-engine summary :: (graphviz) ( graph -O -T -K -- -o ) -T check-format - -O -T default-extension append :> -o + -O -T default-extension append normalize-path :> -o [ gvContext &gvFreeContext :> gvc graph id>> graph kind agopen &agclose :> g