Codebase list python-graphviz / 7f98a2a
New upstream version 0.17 Diane Trout 2 years ago
78 changed file(s) with 4040 addition(s) and 2227 deletion(s). Raw diff Collapse all Expand all
11 =========
22
33
4 Version 0.17
5 ------------
6
7 Drop Python 2 support. Tag Python 3.10 support.
8
9 Migrate CI to GitHub actions. Add ``pypy3`` to matrix.
10
11 Tests: implement ``--skip-exe`` via custom ``pytest`` marker.
12
13 Documentation: point Anaconda users to ``conda-forge/python-graphviz``.
14
15 Move type hints from docstrings to type annotations. Improve doctests.
16
17 Examples: standardize import convention and modernize.
18
19 Re-render example notebooks with Graphviz 2.46.1.
20
21
22 Version 0.16
23 ------------
24
25 Add ``.unflatten()`` method to ``Graph``, ``Digraph``, and ``Source``. Add
26 standalone ``unflatten()``.
27
28 Make ``Source.__str__()`` return the ``.source`` instead of the ``repr()``
29 (like ``Graph`` and ``Digraph``).
30
31 Render with ``dot -K<engine> ...`` instead of ``<engine> ...`` internally
32 (work around `upstream issue
33 <https://gitlab.com/graphviz/graphviz/-/issues/1753>`_).
34
35 Add documentation hint to archived upstream version for Windows.
36
37 Re-render most documentation graphs with Graphviz 2.44.1.
38
39
40 Version 0.15
41 ------------
42
43 ``Graph`` and ``Digraph`` instances created via the context-manager returned
44 by ``subgraph()`` now (re)use ``directory``, ``format``, ``engine``, and
45 ``encoding`` from the parent instead of using defaults (behavioral change).
46 Note that these attributes are only relevant when rendering the
47 subgraph independently (i.e. as a stand-alone graph) from within the
48 ``with``-block, which was previously underdocumented (PR BMaxV). To reflect that
49 the DOT language does not allow subgraph statements to specify ``strict``
50 (i.e. no way to override the setting of the containing graph), instances
51 created via the context-manager are now ``strict=None`` instead of ``False``
52 (so they continue to render stand-alone as non-strict by default).
53
54 Drop Python 3.5 support and tag Python 3.9 support.
55
56 Add documentation link to new upstream installation procedure for Windows.
57
58
459 Version 0.14.2
560 --------------
661
7 Adapt `graphviz.version()` to support the Graphviz Release version entry format
8 introduced with `2.44.2` (`version()` is needed to run the tests).
62 Adapt ``graphviz.version()`` to support the Graphviz Release version entry
63 format introduced with ``2.44.2`` (``version()`` is needed to run the tests).
964
1065
1166 Version 0.14.1
00 The MIT License (MIT)
11
2 Copyright (c) 2013-2020 Sebastian Bank
2 Copyright (c) 2013-2021 Sebastian Bank
33
44 Permission is hereby granted, free of charge, to any person obtaining a copy
55 of this software and associated documentation files (the "Software"), to deal
+191
-164
PKG-INFO less more
00 Metadata-Version: 2.1
11 Name: graphviz
2 Version: 0.14.2
2 Version: 0.17
33 Summary: Simple Python interface for Graphviz
44 Home-page: https://github.com/xflr6/graphviz
55 Author: Sebastian Bank
88 Project-URL: Documentation, https://graphviz.readthedocs.io
99 Project-URL: Changelog, https://graphviz.readthedocs.io/en/latest/changelog.html
1010 Project-URL: Issue Tracker, https://github.com/xflr6/graphviz/issues
11 Description: Graphviz
12 ========
13
14 |PyPI version| |License| |Supported Python| |Format|
15
16 |Travis| |Codecov| |Readthedocs-stable| |Readthedocs-latest|
17
18 This package facilitates the creation and rendering of graph descriptions in
19 the DOT_ language of the Graphviz_ graph drawing software (`master repo`_) from
20 Python.
21
22 Create a graph object, assemble the graph by adding nodes and edges, and
23 retrieve its DOT source code string. Save the source code to a file and render
24 it with the Graphviz installation of your system.
25
26 Use the ``view`` option/method to directly inspect the resulting (PDF, PNG,
27 SVG, etc.) file with its default application. Graphs can also be rendered
28 and displayed within `Jupyter notebooks`_ (formerly known as
29 `IPython notebooks`_, example_) as well as the `Jupyter Qt Console`_.
30
31
32 Links
33 -----
34
35 - GitHub: https://github.com/xflr6/graphviz
36 - PyPI: https://pypi.org/project/graphviz/
37 - Documentation: https://graphviz.readthedocs.io
38 - Changelog: https://graphviz.readthedocs.io/en/latest/changelog.html
39 - Issue Tracker: https://github.com/xflr6/graphviz/issues
40 - Download: https://pypi.org/project/graphviz/#files
41
42
43 Installation
44 ------------
45
46 This package runs under Python 2.7, and 3.5+, use pip_ to install:
47
48 .. code:: bash
49
50 $ pip install graphviz
51
52 To render the generated DOT source code, you also need to install Graphviz
53 (`download page`_).
54
55 Make sure that the directory containing the ``dot`` executable is on your
56 systems' path.
57
58
59 Quickstart
60 ----------
61
62 Create a graph object:
63
64 .. code:: python
65
66 >>> from graphviz import Digraph
67
68 >>> dot = Digraph(comment='The Round Table')
69
70 >>> dot #doctest: +ELLIPSIS
71 <graphviz.dot.Digraph object at 0x...>
72
73 Add nodes and edges:
74
75 .. code:: python
76
77 >>> dot.node('A', 'King Arthur')
78 >>> dot.node('B', 'Sir Bedevere the Wise')
79 >>> dot.node('L', 'Sir Lancelot the Brave')
80
81 >>> dot.edges(['AB', 'AL'])
82 >>> dot.edge('B', 'L', constraint='false')
83
84 Check the generated source code:
85
86 .. code:: python
87
88 >>> print(dot.source) # doctest: +NORMALIZE_WHITESPACE
89 // The Round Table
90 digraph {
91 A [label="King Arthur"]
92 B [label="Sir Bedevere the Wise"]
93 L [label="Sir Lancelot the Brave"]
94 A -> B
95 A -> L
96 B -> L [constraint=false]
97 }
98
99 Save and render the source code, optionally view the result:
100
101 .. code:: python
102
103 >>> dot.render('test-output/round-table.gv', view=True) # doctest: +SKIP
104 'test-output/round-table.gv.pdf'
105
106 .. image:: https://raw.github.com/xflr6/graphviz/master/docs/round-table.png
107 :align: center
108
109
110 See also
111 --------
112
113 - pygraphviz_ |--| full-blown interface wrapping the Graphviz C library with SWIG
114 - graphviz-python_ |--| official Python bindings (documentation_)
115 - pydot_ |--| stable pure-Python approach, requires pyparsing
116
117
118 License
119 -------
120
121 This package is distributed under the `MIT license`_.
122
123
124 .. _pip: https://pip.readthedocs.io
125 .. _Graphviz: https://www.graphviz.org
126 .. _master repo: https://gitlab.com/graphviz/graphviz/
127 .. _download page: https://www.graphviz.org/download/
128 .. _DOT: https://www.graphviz.org/doc/info/lang.html
129 .. _Jupyter notebooks: https://jupyter.org
130 .. _IPython notebooks: https://ipython.org/notebook.html
131 .. _example: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/notebook.ipynb
132 .. _Jupyter Qt Console: https://qtconsole.readthedocs.io
133
134 .. _pygraphviz: https://pypi.org/project/pygraphviz/
135 .. _graphviz-python: https://pypi.org/project/graphviz-python/
136 .. _documentation: https://www.graphviz.org/pdf/gv.3python.pdf
137 .. _pydot: https://pypi.org/project/pydot/
138
139 .. _MIT license: https://opensource.org/licenses/MIT
140
141
142 .. |--| unicode:: U+2013
143
144
145 .. |PyPI version| image:: https://img.shields.io/pypi/v/graphviz.svg
146 :target: https://pypi.org/project/graphviz/
147 :alt: Latest PyPI Version
148 .. |License| image:: https://img.shields.io/pypi/l/graphviz.svg
149 :target: https://pypi.org/project/graphviz/
150 :alt: License
151 .. |Supported Python| image:: https://img.shields.io/pypi/pyversions/graphviz.svg
152 :target: https://pypi.org/project/graphviz/
153 :alt: Supported Python Versions
154 .. |Format| image:: https://img.shields.io/pypi/format/graphviz.svg
155 :target: https://pypi.org/project/graphviz/
156 :alt: Format
157
158 .. |Travis| image:: https://travis-ci.org/xflr6/graphviz.svg?branch=master
159 :target: https://travis-ci.org/xflr6/graphviz
160 :alt: Travis
161 .. |Codecov| image:: https://codecov.io/gh/xflr6/graphviz/branch/master/graph/badge.svg
162 :target: https://codecov.io/gh/xflr6/graphviz
163 :alt: Codecov
164 .. |Readthedocs-stable| image:: https://readthedocs.org/projects/graphviz/badge/?version=stable
165 :target: https://graphviz.readthedocs.io/en/stable/?badge=stable
166 :alt: Readthedocs stable
167 .. |Readthedocs-latest| image:: https://readthedocs.org/projects/graphviz/badge/?version=latest
168 :target: https://graphviz.readthedocs.io/en/latest/?badge=latest
169 :alt: Readthedocs latest
11 Project-URL: CI, https://github.com/xflr6/graphviz/actions
12 Project-URL: Coverage, https://codecov.io/gh/xflr6/graphviz
17013 Keywords: graph visualization dot render
17114 Platform: any
17215 Classifier: Development Status :: 4 - Beta
17417 Classifier: Intended Audience :: Science/Research
17518 Classifier: License :: OSI Approved :: MIT License
17619 Classifier: Operating System :: OS Independent
177 Classifier: Programming Language :: Python :: 2
178 Classifier: Programming Language :: Python :: 2.7
17920 Classifier: Programming Language :: Python :: 3
180 Classifier: Programming Language :: Python :: 3.5
18121 Classifier: Programming Language :: Python :: 3.6
18222 Classifier: Programming Language :: Python :: 3.7
18323 Classifier: Programming Language :: Python :: 3.8
24 Classifier: Programming Language :: Python :: 3.9
25 Classifier: Programming Language :: Python :: 3.10
18426 Classifier: Topic :: Scientific/Engineering :: Visualization
185 Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*
27 Requires-Python: >=3.6
18628 Provides-Extra: dev
18729 Provides-Extra: test
18830 Provides-Extra: docs
31 License-File: LICENSE.txt
32
33 Graphviz
34 ========
35
36 |PyPI version| |License| |Supported Python| |Format|
37
38 |Build| |Codecov| |Readthedocs-stable| |Readthedocs-latest|
39
40 This package facilitates the creation and rendering of graph descriptions in
41 the DOT_ language of the Graphviz_ graph drawing software (`upstream repo`_)
42 from Python.
43
44 Create a graph object, assemble the graph by adding nodes and edges, and
45 retrieve its DOT source code string. Save the source code to a file and render
46 it with the Graphviz installation of your system.
47
48 Use the ``view`` option/method to directly inspect the resulting (PDF, PNG,
49 SVG, etc.) file with its default application. Graphs can also be rendered
50 and displayed within `Jupyter notebooks`_ (formerly known as
51 `IPython notebooks`_,
52 `example <notebook_>`_, `nbviewer <notebook-nbviewer_>`_)
53 as well as the `Jupyter QtConsole`_.
54
55
56 Links
57 -----
58
59 - GitHub: https://github.com/xflr6/graphviz
60 - PyPI: https://pypi.org/project/graphviz/
61 - Documentation: https://graphviz.readthedocs.io
62 - Changelog: https://graphviz.readthedocs.io/en/latest/changelog.html
63 - Issue Tracker: https://github.com/xflr6/graphviz/issues
64 - Download: https://pypi.org/project/graphviz/#files
65
66
67 Installation
68 ------------
69
70 This package runs under Python 3.6+, use pip_ to install:
71
72 .. code:: bash
73
74 $ pip install graphviz
75
76 To render the generated DOT source code, you also need to install Graphviz_
77 (`download page <upstream-download_>`_,
78 `archived versions <upstream-archived_>`_,
79 `installation procedure for Windows <upstream-windows_>`_).
80
81 Make sure that the directory containing the ``dot`` executable is on your
82 systems' path.
83
84 Anaconda_: see the conda-forge_ package
85 `conda-forge/python-graphviz <conda-forge-python-graphviz_>`_
86 (`feedstock <conda-forge-python-graphviz-feedstock_>`_),
87 which should automatically ``conda install``
88 `conda-forge/graphviz <conda-forge-graphviz_>`_
89 (`feedstock <conda-forge-graphviz-feedstock_>`_) as dependency.
90
91
92 Quickstart
93 ----------
94
95 Create a graph object:
96
97 .. code:: python
98
99 >>> import graphviz
100 >>> dot = graphviz.Digraph(comment='The Round Table')
101 >>> dot #doctest: +ELLIPSIS
102 <graphviz.dot.Digraph object at 0x...>
103
104 Add nodes and edges:
105
106 .. code:: python
107
108 >>> dot.node('A', 'King Arthur')
109 >>> dot.node('B', 'Sir Bedevere the Wise')
110 >>> dot.node('L', 'Sir Lancelot the Brave')
111
112 >>> dot.edges(['AB', 'AL'])
113 >>> dot.edge('B', 'L', constraint='false')
114
115 Check the generated source code:
116
117 .. code:: python
118
119 >>> print(dot.source) # doctest: +NORMALIZE_WHITESPACE
120 // The Round Table
121 digraph {
122 A [label="King Arthur"]
123 B [label="Sir Bedevere the Wise"]
124 L [label="Sir Lancelot the Brave"]
125 A -> B
126 A -> L
127 B -> L [constraint=false]
128 }
129
130 Save and render the source code, optionally view the result:
131
132 .. code:: python
133
134 >>> dot.render('test-output/round-table.gv', view=True) # doctest: +SKIP
135 'test-output/round-table.gv.pdf'
136
137 .. image:: https://raw.github.com/xflr6/graphviz/master/docs/round-table.png
138 :align: center
139
140
141 See also
142 --------
143
144 - pygraphviz_ |--| full-blown interface wrapping the Graphviz C library with SWIG
145 - graphviz-python_ |--| official Python bindings
146 (`documentation <graphviz-python-docs_>`_)
147 - pydot_ |--| stable pure-Python approach, requires pyparsing
148
149
150 License
151 -------
152
153 This package is distributed under the `MIT license`_.
154
155
156 .. _Graphviz: https://www.graphviz.org
157 .. _DOT: https://www.graphviz.org/doc/info/lang.html
158 .. _upstream repo: https://gitlab.com/graphviz/graphviz/
159 .. _upstream-download: https://www.graphviz.org/download/
160 .. _upstream-archived: https://www2.graphviz.org/Archive/stable/
161 .. _upstream-windows: https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224
162
163 .. _pip: https://pip.readthedocs.io
164
165 .. _Jupyter notebooks: https://jupyter.org
166 .. _IPython notebooks: https://ipython.org/notebook.html
167 .. _Jupyter QtConsole: https://qtconsole.readthedocs.io
168
169 .. _notebook: https://github.com/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
170 .. _notebook-nbviewer: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
171
172 .. _Anaconda: https://docs.anaconda.com/anaconda/install/
173 .. _conda-forge: https://conda-forge.org
174 .. _conda-forge-python-graphviz: https://anaconda.org/conda-forge/python-graphviz
175 .. _conda-forge-python-graphviz-feedstock: https://github.com/conda-forge/python-graphviz-feedstock
176 .. _conda-forge-graphviz: https://anaconda.org/conda-forge/graphviz
177 .. _conda-forge-graphviz-feedstock: https://github.com/conda-forge/graphviz-feedstock
178
179 .. _pygraphviz: https://pypi.org/project/pygraphviz/
180 .. _graphviz-python: https://pypi.org/project/graphviz-python/
181 .. _graphviz-python-docs: https://www.graphviz.org/pdf/gv.3python.pdf
182 .. _pydot: https://pypi.org/project/pydot/
183
184 .. _MIT license: https://opensource.org/licenses/MIT
185
186
187 .. |--| unicode:: U+2013
188
189
190 .. |PyPI version| image:: https://img.shields.io/pypi/v/graphviz.svg
191 :target: https://pypi.org/project/graphviz/
192 :alt: Latest PyPI Version
193 .. |License| image:: https://img.shields.io/pypi/l/graphviz.svg
194 :target: https://pypi.org/project/graphviz/
195 :alt: License
196 .. |Supported Python| image:: https://img.shields.io/pypi/pyversions/graphviz.svg
197 :target: https://pypi.org/project/graphviz/
198 :alt: Supported Python Versions
199 .. |Format| image:: https://img.shields.io/pypi/format/graphviz.svg
200 :target: https://pypi.org/project/graphviz/
201 :alt: Format
202
203 .. |Build| image:: https://github.com/xflr6/graphviz/actions/workflows/build.yaml/badge.svg?branch=master
204 :target: https://github.com/xflr6/graphviz/actions/workflows/build.yaml?query=branch%3Amaster
205 :alt: Build
206 .. |Codecov| image:: https://codecov.io/gh/xflr6/graphviz/branch/master/graph/badge.svg
207 :target: https://codecov.io/gh/xflr6/graphviz
208 :alt: Codecov
209 .. |Readthedocs-stable| image:: https://readthedocs.org/projects/graphviz/badge/?version=stable
210 :target: https://graphviz.readthedocs.io/en/stable/?badge=stable
211 :alt: Readthedocs stable
212 .. |Readthedocs-latest| image:: https://readthedocs.org/projects/graphviz/badge/?version=latest
213 :target: https://graphviz.readthedocs.io/en/latest/?badge=latest
214 :alt: Readthedocs latest
215
22
33 |PyPI version| |License| |Supported Python| |Format|
44
5 |Travis| |Codecov| |Readthedocs-stable| |Readthedocs-latest|
5 |Build| |Codecov| |Readthedocs-stable| |Readthedocs-latest|
66
77 This package facilitates the creation and rendering of graph descriptions in
8 the DOT_ language of the Graphviz_ graph drawing software (`master repo`_) from
9 Python.
8 the DOT_ language of the Graphviz_ graph drawing software (`upstream repo`_)
9 from Python.
1010
1111 Create a graph object, assemble the graph by adding nodes and edges, and
1212 retrieve its DOT source code string. Save the source code to a file and render
1515 Use the ``view`` option/method to directly inspect the resulting (PDF, PNG,
1616 SVG, etc.) file with its default application. Graphs can also be rendered
1717 and displayed within `Jupyter notebooks`_ (formerly known as
18 `IPython notebooks`_, example_) as well as the `Jupyter Qt Console`_.
18 `IPython notebooks`_,
19 `example <notebook_>`_, `nbviewer <notebook-nbviewer_>`_)
20 as well as the `Jupyter QtConsole`_.
1921
2022
2123 Links
3234 Installation
3335 ------------
3436
35 This package runs under Python 2.7, and 3.5+, use pip_ to install:
37 This package runs under Python 3.6+, use pip_ to install:
3638
3739 .. code:: bash
3840
3941 $ pip install graphviz
4042
41 To render the generated DOT source code, you also need to install Graphviz
42 (`download page`_).
43 To render the generated DOT source code, you also need to install Graphviz_
44 (`download page <upstream-download_>`_,
45 `archived versions <upstream-archived_>`_,
46 `installation procedure for Windows <upstream-windows_>`_).
4347
4448 Make sure that the directory containing the ``dot`` executable is on your
4549 systems' path.
50
51 Anaconda_: see the conda-forge_ package
52 `conda-forge/python-graphviz <conda-forge-python-graphviz_>`_
53 (`feedstock <conda-forge-python-graphviz-feedstock_>`_),
54 which should automatically ``conda install``
55 `conda-forge/graphviz <conda-forge-graphviz_>`_
56 (`feedstock <conda-forge-graphviz-feedstock_>`_) as dependency.
4657
4758
4859 Quickstart
5263
5364 .. code:: python
5465
55 >>> from graphviz import Digraph
56
57 >>> dot = Digraph(comment='The Round Table')
58
66 >>> import graphviz
67 >>> dot = graphviz.Digraph(comment='The Round Table')
5968 >>> dot #doctest: +ELLIPSIS
6069 <graphviz.dot.Digraph object at 0x...>
6170
100109 --------
101110
102111 - pygraphviz_ |--| full-blown interface wrapping the Graphviz C library with SWIG
103 - graphviz-python_ |--| official Python bindings (documentation_)
112 - graphviz-python_ |--| official Python bindings
113 (`documentation <graphviz-python-docs_>`_)
104114 - pydot_ |--| stable pure-Python approach, requires pyparsing
105115
106116
110120 This package is distributed under the `MIT license`_.
111121
112122
123 .. _Graphviz: https://www.graphviz.org
124 .. _DOT: https://www.graphviz.org/doc/info/lang.html
125 .. _upstream repo: https://gitlab.com/graphviz/graphviz/
126 .. _upstream-download: https://www.graphviz.org/download/
127 .. _upstream-archived: https://www2.graphviz.org/Archive/stable/
128 .. _upstream-windows: https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224
129
113130 .. _pip: https://pip.readthedocs.io
114 .. _Graphviz: https://www.graphviz.org
115 .. _master repo: https://gitlab.com/graphviz/graphviz/
116 .. _download page: https://www.graphviz.org/download/
117 .. _DOT: https://www.graphviz.org/doc/info/lang.html
131
118132 .. _Jupyter notebooks: https://jupyter.org
119133 .. _IPython notebooks: https://ipython.org/notebook.html
120 .. _example: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/notebook.ipynb
121 .. _Jupyter Qt Console: https://qtconsole.readthedocs.io
134 .. _Jupyter QtConsole: https://qtconsole.readthedocs.io
135
136 .. _notebook: https://github.com/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
137 .. _notebook-nbviewer: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
138
139 .. _Anaconda: https://docs.anaconda.com/anaconda/install/
140 .. _conda-forge: https://conda-forge.org
141 .. _conda-forge-python-graphviz: https://anaconda.org/conda-forge/python-graphviz
142 .. _conda-forge-python-graphviz-feedstock: https://github.com/conda-forge/python-graphviz-feedstock
143 .. _conda-forge-graphviz: https://anaconda.org/conda-forge/graphviz
144 .. _conda-forge-graphviz-feedstock: https://github.com/conda-forge/graphviz-feedstock
122145
123146 .. _pygraphviz: https://pypi.org/project/pygraphviz/
124147 .. _graphviz-python: https://pypi.org/project/graphviz-python/
125 .. _documentation: https://www.graphviz.org/pdf/gv.3python.pdf
148 .. _graphviz-python-docs: https://www.graphviz.org/pdf/gv.3python.pdf
126149 .. _pydot: https://pypi.org/project/pydot/
127150
128151 .. _MIT license: https://opensource.org/licenses/MIT
144167 :target: https://pypi.org/project/graphviz/
145168 :alt: Format
146169
147 .. |Travis| image:: https://travis-ci.org/xflr6/graphviz.svg?branch=master
148 :target: https://travis-ci.org/xflr6/graphviz
149 :alt: Travis
170 .. |Build| image:: https://github.com/xflr6/graphviz/actions/workflows/build.yaml/badge.svg?branch=master
171 :target: https://github.com/xflr6/graphviz/actions/workflows/build.yaml?query=branch%3Amaster
172 :alt: Build
150173 .. |Codecov| image:: https://codecov.io/gh/xflr6/graphviz/branch/master/graph/badge.svg
151174 :target: https://codecov.io/gh/xflr6/graphviz
152175 :alt: Codecov
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: G Pages: 1 -->
66 <svg width="851pt" height="257pt"
77 viewBox="0.00 0.00 851.00 256.89" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 252.887)">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 252.89)">
99 <title>G</title>
10 <polygon fill="blue" stroke="none" points="-4,4 -4,-252.887 847,-252.887 847,4 -4,4"/>
11 <g id="clust1" class="cluster"><title>cluster_1</title>
12 <polygon fill="blue" stroke="black" points="46,-132.993 46,-240.887 794,-240.887 794,-132.993 46,-132.993"/>
13 <text text-anchor="middle" x="420" y="-225.687" font-family="Times New Roman,serif" font-size="14.00" fill="white">Linear Angle Variations (white to black gradient)</text>
14 </g>
15 <g id="clust2" class="cluster"><title>cluster_2</title>
16 <polygon fill="blue" stroke="black" points="8,-8 8,-124.993 835,-124.993 835,-8 8,-8"/>
17 <text text-anchor="middle" x="421.5" y="-109.793" font-family="Times New Roman,serif" font-size="14.00" fill="white">Radial Angle Variations (white to black gradient)</text>
10 <polygon fill="blue" stroke="transparent" points="-4,4 -4,-252.89 847,-252.89 847,4 -4,4"/>
11 <g id="clust1" class="cluster">
12 <title>cluster_1</title>
13 <polygon fill="blue" stroke="black" points="46,-132.99 46,-240.89 794,-240.89 794,-132.99 46,-132.99"/>
14 <text text-anchor="middle" x="420" y="-225.69" font-family="Times New Roman,serif" font-size="14.00" fill="white">Linear Angle Variations (white to black gradient)</text>
15 </g>
16 <g id="clust2" class="cluster">
17 <title>cluster_2</title>
18 <polygon fill="blue" stroke="black" points="8,-8 8,-124.99 835,-124.99 835,-8 8,-8"/>
19 <text text-anchor="middle" x="421.5" y="-109.79" font-family="Times New Roman,serif" font-size="14.00" fill="white">Radial Angle Variations (white to black gradient)</text>
1820 </g>
1921 <!-- n9 -->
20 <g id="node1" class="node"><title>n9</title>
21 <defs>
22 <linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="717.606" y1="-175.44" x2="786.394" y2="-175.44" >
23 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
24 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
25 </linearGradient>
26 </defs>
27 <ellipse fill="url(#l_0)" stroke="black" cx="752" cy="-175.44" rx="34.394" ry="34.394"/>
22 <g id="node1" class="node">
23 <title>n9</title>
24 <defs>
25 <linearGradient id="l_0" gradientUnits="userSpaceOnUse" x1="717.61" y1="-175.44" x2="786.39" y2="-175.44" >
26 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
27 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
28 </linearGradient>
29 </defs>
30 <ellipse fill="url(#l_0)" stroke="black" cx="752" cy="-175.44" rx="34.39" ry="34.39"/>
2831 <text text-anchor="middle" x="752" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n9:360</text>
2932 </g>
3033 <!-- n8 -->
31 <g id="node2" class="node"><title>n8</title>
34 <g id="node2" class="node">
35 <title>n8</title>
3236 <defs>
3337 <linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="640.68" y1="-199.76" x2="689.32" y2="-151.12" >
3438 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
3539 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
3640 </linearGradient>
3741 </defs>
38 <ellipse fill="url(#l_1)" stroke="black" cx="665" cy="-175.44" rx="34.394" ry="34.394"/>
42 <ellipse fill="url(#l_1)" stroke="black" cx="665" cy="-175.44" rx="34.39" ry="34.39"/>
3943 <text text-anchor="middle" x="665" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n8:315</text>
4044 </g>
4145 <!-- n7 -->
42 <g id="node3" class="node"><title>n7</title>
43 <defs>
44 <linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="578" y1="-209.834" x2="578" y2="-141.046" >
45 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
46 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
47 </linearGradient>
48 </defs>
49 <ellipse fill="url(#l_2)" stroke="black" cx="578" cy="-175.44" rx="34.394" ry="34.394"/>
46 <g id="node3" class="node">
47 <title>n7</title>
48 <defs>
49 <linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="578" y1="-209.83" x2="578" y2="-141.05" >
50 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
51 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
52 </linearGradient>
53 </defs>
54 <ellipse fill="url(#l_2)" stroke="black" cx="578" cy="-175.44" rx="34.39" ry="34.39"/>
5055 <text text-anchor="middle" x="578" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n7:270</text>
5156 </g>
5257 <!-- n6 -->
53 <g id="node4" class="node"><title>n6</title>
58 <g id="node4" class="node">
59 <title>n6</title>
5460 <defs>
5561 <linearGradient id="l_3" gradientUnits="userSpaceOnUse" x1="515.32" y1="-199.76" x2="466.68" y2="-151.12" >
5662 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
5763 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
5864 </linearGradient>
5965 </defs>
60 <ellipse fill="url(#l_3)" stroke="black" cx="491" cy="-175.44" rx="34.394" ry="34.394"/>
66 <ellipse fill="url(#l_3)" stroke="black" cx="491" cy="-175.44" rx="34.39" ry="34.39"/>
6167 <text text-anchor="middle" x="491" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n6:225</text>
6268 </g>
6369 <!-- n5 -->
64 <g id="node5" class="node"><title>n5</title>
65 <defs>
66 <linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="438.394" y1="-175.44" x2="369.606" y2="-175.44" >
67 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
68 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
69 </linearGradient>
70 </defs>
71 <ellipse fill="url(#l_4)" stroke="black" cx="404" cy="-175.44" rx="34.394" ry="34.394"/>
70 <g id="node5" class="node">
71 <title>n5</title>
72 <defs>
73 <linearGradient id="l_4" gradientUnits="userSpaceOnUse" x1="438.39" y1="-175.44" x2="369.61" y2="-175.44" >
74 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
75 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
76 </linearGradient>
77 </defs>
78 <ellipse fill="url(#l_4)" stroke="black" cx="404" cy="-175.44" rx="34.39" ry="34.39"/>
7279 <text text-anchor="middle" x="404" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n5:180</text>
7380 </g>
7481 <!-- n14 -->
75 <g id="node14" class="node"><title>n14</title>
82 <g id="node14" class="node">
83 <title>n14</title>
7684 <defs>
7785 <radialGradient id="r_0" cx="50%" cy="50%" r="75%" fx="0%" fy="50%">
7886 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
7987 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
8088 </radialGradient>
8189 </defs>
82 <ellipse fill="url(#r_0)" stroke="black" cx="404" cy="-54.9965" rx="38.9931" ry="38.9931"/>
83 <text text-anchor="middle" x="404" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n14:180</text>
90 <ellipse fill="url(#r_0)" stroke="black" cx="404" cy="-55" rx="38.99" ry="38.99"/>
91 <text text-anchor="middle" x="404" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n14:180</text>
8492 </g>
8593 <!-- n5&#45;&gt;n14 -->
86 <g id="edge1" class="edge"><title>n5&#45;&gt;n14</title>
87 <path fill="none" stroke="black" d="M404,-140.816C404,-129.488 404,-116.613 404,-104.378"/>
88 <polygon fill="black" stroke="black" points="407.5,-104.298 404,-94.2984 400.5,-104.298 407.5,-104.298"/>
94 <g id="edge1" class="edge">
95 <title>n5&#45;&gt;n14</title>
96 <path fill="none" stroke="black" d="M404,-140.82C404,-129.49 404,-116.61 404,-104.38"/>
97 <polygon fill="black" stroke="black" points="407.5,-104.3 404,-94.3 400.5,-104.3 407.5,-104.3"/>
8998 </g>
9099 <!-- n4 -->
91 <g id="node6" class="node"><title>n4</title>
100 <g id="node6" class="node">
101 <title>n4</title>
92102 <defs>
93103 <linearGradient id="l_5" gradientUnits="userSpaceOnUse" x1="341.32" y1="-151.12" x2="292.68" y2="-199.76" >
94104 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
95105 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
96106 </linearGradient>
97107 </defs>
98 <ellipse fill="url(#l_5)" stroke="black" cx="317" cy="-175.44" rx="34.394" ry="34.394"/>
108 <ellipse fill="url(#l_5)" stroke="black" cx="317" cy="-175.44" rx="34.39" ry="34.39"/>
99109 <text text-anchor="middle" x="317" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n4:135</text>
100110 </g>
101111 <!-- n3 -->
102 <g id="node7" class="node"><title>n3</title>
103 <defs>
104 <linearGradient id="l_6" gradientUnits="userSpaceOnUse" x1="234" y1="-144.845" x2="234" y2="-206.035" >
105 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
106 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
107 </linearGradient>
108 </defs>
109 <ellipse fill="url(#l_6)" stroke="black" cx="234" cy="-175.44" rx="30.5947" ry="30.5947"/>
112 <g id="node7" class="node">
113 <title>n3</title>
114 <defs>
115 <linearGradient id="l_6" gradientUnits="userSpaceOnUse" x1="234" y1="-144.85" x2="234" y2="-206.03" >
116 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
117 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
118 </linearGradient>
119 </defs>
120 <ellipse fill="url(#l_6)" stroke="black" cx="234" cy="-175.44" rx="30.59" ry="30.59"/>
110121 <text text-anchor="middle" x="234" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n3:90</text>
111122 </g>
112123 <!-- n2 -->
113 <g id="node8" class="node"><title>n2</title>
114 <defs>
115 <linearGradient id="l_7" gradientUnits="userSpaceOnUse" x1="133.366" y1="-153.806" x2="176.634" y2="-197.074" >
116 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
117 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
118 </linearGradient>
119 </defs>
120 <ellipse fill="url(#l_7)" stroke="black" cx="155" cy="-175.44" rx="30.5947" ry="30.5947"/>
124 <g id="node8" class="node">
125 <title>n2</title>
126 <defs>
127 <linearGradient id="l_7" gradientUnits="userSpaceOnUse" x1="133.37" y1="-153.81" x2="176.63" y2="-197.07" >
128 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
129 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
130 </linearGradient>
131 </defs>
132 <ellipse fill="url(#l_7)" stroke="black" cx="155" cy="-175.44" rx="30.59" ry="30.59"/>
121133 <text text-anchor="middle" x="155" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n2:45</text>
122134 </g>
123135 <!-- n1 -->
124 <g id="node9" class="node"><title>n1</title>
125 <defs>
126 <linearGradient id="l_8" gradientUnits="userSpaceOnUse" x1="54.0046" y1="-175.44" x2="105.995" y2="-175.44" >
127 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
128 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
129 </linearGradient>
130 </defs>
131 <ellipse fill="url(#l_8)" stroke="black" cx="80" cy="-175.44" rx="25.9954" ry="25.9954"/>
136 <g id="node9" class="node">
137 <title>n1</title>
138 <defs>
139 <linearGradient id="l_8" gradientUnits="userSpaceOnUse" x1="54" y1="-175.44" x2="106" y2="-175.44" >
140 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
141 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
142 </linearGradient>
143 </defs>
144 <ellipse fill="url(#l_8)" stroke="black" cx="80" cy="-175.44" rx="26" ry="26"/>
132145 <text text-anchor="middle" x="80" y="-171.74" font-family="Times New Roman,serif" font-size="14.00">n1:0</text>
133146 </g>
134147 <!-- n18 -->
135 <g id="node10" class="node"><title>n18</title>
148 <g id="node10" class="node">
149 <title>n18</title>
136150 <defs>
137151 <radialGradient id="r_1" cx="50%" cy="50%" r="75%" fx="99%" fy="49%">
138152 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
139153 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
140154 </radialGradient>
141155 </defs>
142 <ellipse fill="url(#r_1)" stroke="black" cx="788" cy="-54.9965" rx="38.9931" ry="38.9931"/>
143 <text text-anchor="middle" x="788" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n18:360</text>
156 <ellipse fill="url(#r_1)" stroke="black" cx="788" cy="-55" rx="38.99" ry="38.99"/>
157 <text text-anchor="middle" x="788" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n18:360</text>
144158 </g>
145159 <!-- n17 -->
146 <g id="node11" class="node"><title>n17</title>
160 <g id="node11" class="node">
161 <title>n17</title>
147162 <defs>
148163 <radialGradient id="r_2" cx="50%" cy="50%" r="75%" fx="85%" fy="85%">
149164 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
150165 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
151166 </radialGradient>
152167 </defs>
153 <ellipse fill="url(#r_2)" stroke="black" cx="692" cy="-54.9965" rx="38.9931" ry="38.9931"/>
154 <text text-anchor="middle" x="692" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n17:315</text>
168 <ellipse fill="url(#r_2)" stroke="black" cx="692" cy="-55" rx="38.99" ry="38.99"/>
169 <text text-anchor="middle" x="692" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n17:315</text>
155170 </g>
156171 <!-- n16 -->
157 <g id="node12" class="node"><title>n16</title>
172 <g id="node12" class="node">
173 <title>n16</title>
158174 <defs>
159175 <radialGradient id="r_3" cx="50%" cy="50%" r="75%" fx="50%" fy="100%">
160176 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
161177 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
162178 </radialGradient>
163179 </defs>
164 <ellipse fill="url(#r_3)" stroke="black" cx="596" cy="-54.9965" rx="38.9931" ry="38.9931"/>
165 <text text-anchor="middle" x="596" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n16:270</text>
180 <ellipse fill="url(#r_3)" stroke="black" cx="596" cy="-55" rx="38.99" ry="38.99"/>
181 <text text-anchor="middle" x="596" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n16:270</text>
166182 </g>
167183 <!-- n15 -->
168 <g id="node13" class="node"><title>n15</title>
184 <g id="node13" class="node">
185 <title>n15</title>
169186 <defs>
170187 <radialGradient id="r_4" cx="50%" cy="50%" r="75%" fx="14%" fy="85%">
171188 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
172189 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
173190 </radialGradient>
174191 </defs>
175 <ellipse fill="url(#r_4)" stroke="black" cx="500" cy="-54.9965" rx="38.9931" ry="38.9931"/>
176 <text text-anchor="middle" x="500" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n15:225</text>
192 <ellipse fill="url(#r_4)" stroke="black" cx="500" cy="-55" rx="38.99" ry="38.99"/>
193 <text text-anchor="middle" x="500" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n15:225</text>
177194 </g>
178195 <!-- n13 -->
179 <g id="node15" class="node"><title>n13</title>
196 <g id="node15" class="node">
197 <title>n13</title>
180198 <defs>
181199 <radialGradient id="r_5" cx="50%" cy="50%" r="75%" fx="14%" fy="14%">
182200 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
183201 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
184202 </radialGradient>
185203 </defs>
186 <ellipse fill="url(#r_5)" stroke="black" cx="308" cy="-54.9965" rx="38.9931" ry="38.9931"/>
187 <text text-anchor="middle" x="308" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n13:135</text>
204 <ellipse fill="url(#r_5)" stroke="black" cx="308" cy="-55" rx="38.99" ry="38.99"/>
205 <text text-anchor="middle" x="308" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n13:135</text>
188206 </g>
189207 <!-- n12 -->
190 <g id="node16" class="node"><title>n12</title>
208 <g id="node16" class="node">
209 <title>n12</title>
191210 <defs>
192211 <radialGradient id="r_6" cx="50%" cy="50%" r="75%" fx="49%" fy="0%">
193212 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
194213 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
195214 </radialGradient>
196215 </defs>
197 <ellipse fill="url(#r_6)" stroke="black" cx="217" cy="-54.9965" rx="34.394" ry="34.394"/>
198 <text text-anchor="middle" x="217" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n12:90</text>
216 <ellipse fill="url(#r_6)" stroke="black" cx="217" cy="-55" rx="34.39" ry="34.39"/>
217 <text text-anchor="middle" x="217" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n12:90</text>
199218 </g>
200219 <!-- n11 -->
201 <g id="node17" class="node"><title>n11</title>
220 <g id="node17" class="node">
221 <title>n11</title>
202222 <defs>
203223 <radialGradient id="r_7" cx="50%" cy="50%" r="75%" fx="85%" fy="14%">
204224 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
205225 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
206226 </radialGradient>
207227 </defs>
208 <ellipse fill="url(#r_7)" stroke="black" cx="130" cy="-54.9965" rx="34.394" ry="34.394"/>
209 <text text-anchor="middle" x="130" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n11:45</text>
228 <ellipse fill="url(#r_7)" stroke="black" cx="130" cy="-55" rx="34.39" ry="34.39"/>
229 <text text-anchor="middle" x="130" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n11:45</text>
210230 </g>
211231 <!-- n10 -->
212 <g id="node18" class="node"><title>n10</title>
232 <g id="node18" class="node">
233 <title>n10</title>
213234 <defs>
214235 <radialGradient id="r_8" cx="50%" cy="50%" r="75%" fx="50%" fy="50%">
215236 <stop offset="0" style="stop-color:white;stop-opacity:1.;"/>
216237 <stop offset="1" style="stop-color:black;stop-opacity:1.;"/>
217238 </radialGradient>
218239 </defs>
219 <ellipse fill="url(#r_8)" stroke="black" cx="47" cy="-54.9965" rx="30.5947" ry="30.5947"/>
220 <text text-anchor="middle" x="47" y="-51.2965" font-family="Times New Roman,serif" font-size="14.00">n10:0</text>
240 <ellipse fill="url(#r_8)" stroke="black" cx="47" cy="-55" rx="30.59" ry="30.59"/>
241 <text text-anchor="middle" x="47" y="-51.3" font-family="Times New Roman,serif" font-size="14.00">n10:0</text>
221242 </g>
222243 </g>
223244 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: g Pages: 1 -->
66 <svg width="368pt" height="212pt"
77 viewBox="0.00 0.00 368.00 212.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 208)">
99 <title>g</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-208 364,-208 364,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-208 364,-208 364,4 -4,4"/>
1111 <!-- node0 -->
12 <g id="node1" class="node"><title>node0</title>
12 <g id="node1" class="node">
13 <title>node0</title>
1314 <polygon fill="none" stroke="black" points="167.5,-180.5 167.5,-203.5 234.5,-203.5 234.5,-180.5 167.5,-180.5"/>
1415 <text text-anchor="middle" x="177.5" y="-188.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
1516 <polyline fill="none" stroke="black" points="187.5,-180.5 187.5,-203.5 "/>
1819 <text text-anchor="middle" x="224.5" y="-188.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
1920 </g>
2021 <!-- node1 -->
21 <g id="node2" class="node"><title>node1</title>
22 <g id="node2" class="node">
23 <title>node1</title>
2224 <polygon fill="none" stroke="black" points="103.5,-120.5 103.5,-143.5 168.5,-143.5 168.5,-120.5 103.5,-120.5"/>
2325 <text text-anchor="middle" x="113.5" y="-128.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
2426 <polyline fill="none" stroke="black" points="123.5,-120.5 123.5,-143.5 "/>
2729 <text text-anchor="middle" x="158.5" y="-128.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
2830 </g>
2931 <!-- node0&#45;&gt;node1 -->
30 <g id="edge2" class="edge"><title>node0:f0&#45;&gt;node1:f1</title>
31 <path fill="none" stroke="black" d="M177,-180C177,-159.918 148.883,-165.039 139.217,-153.62"/>
32 <polygon fill="black" stroke="black" points="142.491,-152.374 136,-144 135.852,-154.594 142.491,-152.374"/>
32 <g id="edge2" class="edge">
33 <title>node0:f0&#45;&gt;node1:f1</title>
34 <path fill="none" stroke="black" d="M177,-180C177,-159.92 148.88,-165.04 139.22,-153.62"/>
35 <polygon fill="black" stroke="black" points="142.49,-152.37 136,-144 135.85,-154.59 142.49,-152.37"/>
3336 </g>
3437 <!-- node4 -->
35 <g id="node5" class="node"><title>node4</title>
38 <g id="node5" class="node">
39 <title>node4</title>
3640 <polygon fill="none" stroke="black" points="233,-120.5 233,-143.5 299,-143.5 299,-120.5 233,-120.5"/>
3741 <text text-anchor="middle" x="243" y="-128.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
3842 <polyline fill="none" stroke="black" points="253,-120.5 253,-143.5 "/>
4145 <text text-anchor="middle" x="289" y="-128.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
4246 </g>
4347 <!-- node0&#45;&gt;node4 -->
44 <g id="edge1" class="edge"><title>node0:f2&#45;&gt;node4:f1</title>
45 <path fill="none" stroke="black" d="M225,-180C225,-159.918 253.117,-165.039 262.783,-153.62"/>
46 <polygon fill="black" stroke="black" points="266.148,-154.594 266,-144 259.509,-152.374 266.148,-154.594"/>
48 <g id="edge1" class="edge">
49 <title>node0:f2&#45;&gt;node4:f1</title>
50 <path fill="none" stroke="black" d="M225,-180C225,-159.92 253.12,-165.04 262.78,-153.62"/>
51 <polygon fill="black" stroke="black" points="266.15,-154.59 266,-144 259.51,-152.37 266.15,-154.59"/>
4752 </g>
4853 <!-- node2 -->
49 <g id="node3" class="node"><title>node2</title>
54 <g id="node3" class="node">
55 <title>node2</title>
5056 <polygon fill="none" stroke="black" points="42,-60.5 42,-83.5 108,-83.5 108,-60.5 42,-60.5"/>
5157 <text text-anchor="middle" x="52" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
5258 <polyline fill="none" stroke="black" points="62,-60.5 62,-83.5 "/>
5561 <text text-anchor="middle" x="98" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
5662 </g>
5763 <!-- node1&#45;&gt;node2 -->
58 <g id="edge3" class="edge"><title>node1:f0&#45;&gt;node2:f1</title>
59 <path fill="none" stroke="black" d="M113,-120C113,-100.916 87.4293,-104.572 78.2399,-93.6598"/>
60 <polygon fill="black" stroke="black" points="81.4983,-92.368 75,-84 74.8616,-94.5939 81.4983,-92.368"/>
64 <g id="edge3" class="edge">
65 <title>node1:f0&#45;&gt;node2:f1</title>
66 <path fill="none" stroke="black" d="M113,-120C113,-100.92 87.43,-104.57 78.24,-93.66"/>
67 <polygon fill="black" stroke="black" points="81.5,-92.37 75,-84 74.86,-94.59 81.5,-92.37"/>
6168 </g>
6269 <!-- node3 -->
63 <g id="node4" class="node"><title>node3</title>
70 <g id="node4" class="node">
71 <title>node3</title>
6472 <polygon fill="none" stroke="black" points="126.5,-60.5 126.5,-83.5 191.5,-83.5 191.5,-60.5 126.5,-60.5"/>
6573 <text text-anchor="middle" x="136.5" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
6674 <polyline fill="none" stroke="black" points="146.5,-60.5 146.5,-83.5 "/>
6977 <text text-anchor="middle" x="181.5" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
7078 </g>
7179 <!-- node1&#45;&gt;node3 -->
72 <g id="edge4" class="edge"><title>node1:f2&#45;&gt;node3:f1</title>
73 <path fill="none" stroke="black" d="M159,-120C159,-108 159,-102.75 159,-94.125"/>
80 <g id="edge4" class="edge">
81 <title>node1:f2&#45;&gt;node3:f1</title>
82 <path fill="none" stroke="black" d="M159,-120C159,-108 159,-102.75 159,-94.13"/>
7483 <polygon fill="black" stroke="black" points="162.5,-94 159,-84 155.5,-94 162.5,-94"/>
7584 </g>
7685 <!-- node7 -->
77 <g id="node8" class="node"><title>node7</title>
86 <g id="node8" class="node">
87 <title>node7</title>
7888 <polygon fill="none" stroke="black" points="0,-0.5 0,-23.5 66,-23.5 66,-0.5 0,-0.5"/>
7989 <text text-anchor="middle" x="10" y="-8.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
8090 <polyline fill="none" stroke="black" points="20,-0.5 20,-23.5 "/>
8393 <text text-anchor="middle" x="56" y="-8.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
8494 </g>
8595 <!-- node2&#45;&gt;node7 -->
86 <g id="edge6" class="edge"><title>node2:f0&#45;&gt;node7:f1</title>
87 <path fill="none" stroke="black" d="M52,-60C52,-46.0072 40.6341,-42.9467 35.4839,-33.9075"/>
88 <polygon fill="black" stroke="black" points="38.8268,-32.8486 33,-24 32.037,-34.551 38.8268,-32.8486"/>
96 <g id="edge6" class="edge">
97 <title>node2:f0&#45;&gt;node7:f1</title>
98 <path fill="none" stroke="black" d="M52,-60C52,-46.01 40.63,-42.95 35.48,-33.91"/>
99 <polygon fill="black" stroke="black" points="38.83,-32.85 33,-24 32.04,-34.55 38.83,-32.85"/>
89100 </g>
90101 <!-- node8 -->
91 <g id="node9" class="node"><title>node8</title>
102 <g id="node9" class="node">
103 <title>node8</title>
92104 <polygon fill="none" stroke="black" points="84,-0.5 84,-23.5 150,-23.5 150,-0.5 84,-0.5"/>
93105 <text text-anchor="middle" x="94" y="-8.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
94106 <polyline fill="none" stroke="black" points="104,-0.5 104,-23.5 "/>
97109 <text text-anchor="middle" x="140" y="-8.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
98110 </g>
99111 <!-- node2&#45;&gt;node8 -->
100 <g id="edge5" class="edge"><title>node2:f2&#45;&gt;node8:f1</title>
101 <path fill="none" stroke="black" d="M98,-60C98,-46.0072 109.366,-42.9467 114.516,-33.9075"/>
102 <polygon fill="black" stroke="black" points="117.963,-34.551 117,-24 111.173,-32.8486 117.963,-34.551"/>
112 <g id="edge5" class="edge">
113 <title>node2:f2&#45;&gt;node8:f1</title>
114 <path fill="none" stroke="black" d="M98,-60C98,-46.01 109.37,-42.95 114.52,-33.91"/>
115 <polygon fill="black" stroke="black" points="117.96,-34.55 117,-24 111.17,-32.85 117.96,-34.55"/>
103116 </g>
104117 <!-- node5 -->
105 <g id="node6" class="node"><title>node5</title>
118 <g id="node6" class="node">
119 <title>node5</title>
106120 <polygon fill="none" stroke="black" points="210,-60.5 210,-83.5 276,-83.5 276,-60.5 210,-60.5"/>
107121 <text text-anchor="middle" x="220" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
108122 <polyline fill="none" stroke="black" points="230,-60.5 230,-83.5 "/>
111125 <text text-anchor="middle" x="266" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
112126 </g>
113127 <!-- node4&#45;&gt;node5 -->
114 <g id="edge8" class="edge"><title>node4:f0&#45;&gt;node5:f1</title>
115 <path fill="none" stroke="black" d="M243,-120C243,-108 243,-102.75 243,-94.125"/>
128 <g id="edge8" class="edge">
129 <title>node4:f0&#45;&gt;node5:f1</title>
130 <path fill="none" stroke="black" d="M243,-120C243,-108 243,-102.75 243,-94.13"/>
116131 <polygon fill="black" stroke="black" points="246.5,-94 243,-84 239.5,-94 246.5,-94"/>
117132 </g>
118133 <!-- node6 -->
119 <g id="node7" class="node"><title>node6</title>
134 <g id="node7" class="node">
135 <title>node6</title>
120136 <polygon fill="none" stroke="black" points="294,-60.5 294,-83.5 360,-83.5 360,-60.5 294,-60.5"/>
121137 <text text-anchor="middle" x="304" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
122138 <polyline fill="none" stroke="black" points="314,-60.5 314,-83.5 "/>
125141 <text text-anchor="middle" x="350" y="-68.3" font-family="Times New Roman,serif" font-size="14.00"> </text>
126142 </g>
127143 <!-- node4&#45;&gt;node6 -->
128 <g id="edge7" class="edge"><title>node4:f2&#45;&gt;node6:f1</title>
129 <path fill="none" stroke="black" d="M289,-120C289,-100.916 314.571,-104.572 323.76,-93.6598"/>
130 <polygon fill="black" stroke="black" points="327.138,-94.5939 327,-84 320.502,-92.368 327.138,-94.5939"/>
144 <g id="edge7" class="edge">
145 <title>node4:f2&#45;&gt;node6:f1</title>
146 <path fill="none" stroke="black" d="M289,-120C289,-100.92 314.57,-104.57 323.76,-93.66"/>
147 <polygon fill="black" stroke="black" points="327.14,-94.59 327,-84 320.5,-92.37 327.14,-94.59"/>
131148 </g>
132149 </g>
133150 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: G Pages: 1 -->
66 <svg width="224pt" height="408pt"
77 viewBox="0.00 0.00 224.00 408.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 404)">
99 <title>G</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-404 220,-404 220,4 -4,4"/>
11 <g id="clust1" class="cluster"><title>cluster_0</title>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-404 220,-404 220,4 -4,4"/>
11 <g id="clust1" class="cluster">
12 <title>cluster_0</title>
1213 <polygon fill="lightgrey" stroke="lightgrey" points="8,-65 8,-356 98,-356 98,-65 8,-65"/>
1314 <text text-anchor="middle" x="53" y="-340.8" font-family="Times New Roman,serif" font-size="14.00">process #1</text>
1415 </g>
15 <g id="clust2" class="cluster"><title>cluster_1</title>
16 <g id="clust2" class="cluster">
17 <title>cluster_1</title>
1618 <polygon fill="none" stroke="blue" points="129,-65 129,-356 208,-356 208,-65 129,-65"/>
1719 <text text-anchor="middle" x="168.5" y="-340.8" font-family="Times New Roman,serif" font-size="14.00">process #2</text>
1820 </g>
1921 <!-- a0 -->
20 <g id="node1" class="node"><title>a0</title>
22 <g id="node1" class="node">
23 <title>a0</title>
2124 <ellipse fill="white" stroke="white" cx="63" cy="-307" rx="27" ry="18"/>
2225 <text text-anchor="middle" x="63" y="-303.3" font-family="Times New Roman,serif" font-size="14.00">a0</text>
2326 </g>
2427 <!-- a1 -->
25 <g id="node2" class="node"><title>a1</title>
28 <g id="node2" class="node">
29 <title>a1</title>
2630 <ellipse fill="white" stroke="white" cx="63" cy="-235" rx="27" ry="18"/>
2731 <text text-anchor="middle" x="63" y="-231.3" font-family="Times New Roman,serif" font-size="14.00">a1</text>
2832 </g>
2933 <!-- a0&#45;&gt;a1 -->
30 <g id="edge1" class="edge"><title>a0&#45;&gt;a1</title>
31 <path fill="none" stroke="black" d="M63,-288.697C63,-280.983 63,-271.712 63,-263.112"/>
32 <polygon fill="black" stroke="black" points="66.5001,-263.104 63,-253.104 59.5001,-263.104 66.5001,-263.104"/>
34 <g id="edge1" class="edge">
35 <title>a0&#45;&gt;a1</title>
36 <path fill="none" stroke="black" d="M63,-288.7C63,-280.98 63,-271.71 63,-263.11"/>
37 <polygon fill="black" stroke="black" points="66.5,-263.1 63,-253.1 59.5,-263.1 66.5,-263.1"/>
3338 </g>
3439 <!-- a2 -->
35 <g id="node3" class="node"><title>a2</title>
40 <g id="node3" class="node">
41 <title>a2</title>
3642 <ellipse fill="white" stroke="white" cx="63" cy="-163" rx="27" ry="18"/>
3743 <text text-anchor="middle" x="63" y="-159.3" font-family="Times New Roman,serif" font-size="14.00">a2</text>
3844 </g>
3945 <!-- a1&#45;&gt;a2 -->
40 <g id="edge2" class="edge"><title>a1&#45;&gt;a2</title>
41 <path fill="none" stroke="black" d="M63,-216.697C63,-208.983 63,-199.712 63,-191.112"/>
42 <polygon fill="black" stroke="black" points="66.5001,-191.104 63,-181.104 59.5001,-191.104 66.5001,-191.104"/>
46 <g id="edge2" class="edge">
47 <title>a1&#45;&gt;a2</title>
48 <path fill="none" stroke="black" d="M63,-216.7C63,-208.98 63,-199.71 63,-191.11"/>
49 <polygon fill="black" stroke="black" points="66.5,-191.1 63,-181.1 59.5,-191.1 66.5,-191.1"/>
4350 </g>
4451 <!-- b3 -->
45 <g id="node8" class="node"><title>b3</title>
52 <g id="node8" class="node">
53 <title>b3</title>
4654 <ellipse fill="lightgrey" stroke="black" cx="164" cy="-91" rx="27" ry="18"/>
4755 <text text-anchor="middle" x="164" y="-87.3" font-family="Times New Roman,serif" font-size="14.00">b3</text>
4856 </g>
4957 <!-- a1&#45;&gt;b3 -->
50 <g id="edge9" class="edge"><title>a1&#45;&gt;b3</title>
51 <path fill="none" stroke="black" d="M74.001,-218.533C91.6079,-193.779 126.245,-145.081 147.038,-115.847"/>
52 <polygon fill="black" stroke="black" points="150.069,-117.625 153.013,-107.448 144.364,-113.568 150.069,-117.625"/>
58 <g id="edge9" class="edge">
59 <title>a1&#45;&gt;b3</title>
60 <path fill="none" stroke="black" d="M74,-218.53C91.61,-193.78 126.25,-145.08 147.04,-115.85"/>
61 <polygon fill="black" stroke="black" points="150.07,-117.63 153.01,-107.45 144.36,-113.57 150.07,-117.63"/>
5362 </g>
5463 <!-- a3 -->
55 <g id="node4" class="node"><title>a3</title>
64 <g id="node4" class="node">
65 <title>a3</title>
5666 <ellipse fill="white" stroke="white" cx="63" cy="-91" rx="27" ry="18"/>
5767 <text text-anchor="middle" x="63" y="-87.3" font-family="Times New Roman,serif" font-size="14.00">a3</text>
5868 </g>
5969 <!-- a2&#45;&gt;a3 -->
60 <g id="edge3" class="edge"><title>a2&#45;&gt;a3</title>
61 <path fill="none" stroke="black" d="M63,-144.697C63,-136.983 63,-127.712 63,-119.112"/>
62 <polygon fill="black" stroke="black" points="66.5001,-119.104 63,-109.104 59.5001,-119.104 66.5001,-119.104"/>
70 <g id="edge3" class="edge">
71 <title>a2&#45;&gt;a3</title>
72 <path fill="none" stroke="black" d="M63,-144.7C63,-136.98 63,-127.71 63,-119.11"/>
73 <polygon fill="black" stroke="black" points="66.5,-119.1 63,-109.1 59.5,-119.1 66.5,-119.1"/>
6374 </g>
6475 <!-- a3&#45;&gt;a0 -->
65 <g id="edge11" class="edge"><title>a3&#45;&gt;a0</title>
66 <path fill="none" stroke="black" d="M49.2496,-106.931C41.0392,-116.9 31.381,-130.753 27,-145 12.8916,-190.88 12.8916,-207.12 27,-253 30.2858,-263.685 36.5399,-274.149 42.9254,-282.919"/>
67 <polygon fill="black" stroke="black" points="40.354,-285.314 49.2496,-291.069 45.8844,-281.023 40.354,-285.314"/>
76 <g id="edge11" class="edge">
77 <title>a3&#45;&gt;a0</title>
78 <path fill="none" stroke="black" d="M49.25,-106.93C41.04,-116.9 31.38,-130.75 27,-145 12.89,-190.88 12.89,-207.12 27,-253 30.29,-263.69 36.54,-274.15 42.93,-282.92"/>
79 <polygon fill="black" stroke="black" points="40.35,-285.31 49.25,-291.07 45.88,-281.02 40.35,-285.31"/>
6880 </g>
6981 <!-- end -->
70 <g id="node10" class="node"><title>end</title>
71 <polygon fill="none" stroke="black" points="131.5,-37 94.5,-37 94.5,-0 131.5,-0 131.5,-37"/>
82 <g id="node10" class="node">
83 <title>end</title>
84 <polygon fill="none" stroke="black" points="131.5,-37 94.5,-37 94.5,0 131.5,0 131.5,-37"/>
7285 <polyline fill="none" stroke="black" points="106.5,-37 94.5,-25 "/>
73 <polyline fill="none" stroke="black" points="94.5,-12 106.5,-0 "/>
74 <polyline fill="none" stroke="black" points="119.5,-0 131.5,-12 "/>
86 <polyline fill="none" stroke="black" points="94.5,-12 106.5,0 "/>
87 <polyline fill="none" stroke="black" points="119.5,0 131.5,-12 "/>
7588 <polyline fill="none" stroke="black" points="131.5,-25 119.5,-37 "/>
7689 <text text-anchor="middle" x="113" y="-14.8" font-family="Times New Roman,serif" font-size="14.00">end</text>
7790 </g>
7891 <!-- a3&#45;&gt;end -->
79 <g id="edge12" class="edge"><title>a3&#45;&gt;end</title>
80 <path fill="none" stroke="black" d="M74.0966,-74.3538C80.1492,-65.8197 87.7959,-55.0378 94.7049,-45.2961"/>
81 <polygon fill="black" stroke="black" points="97.5978,-47.2672 100.528,-37.0856 91.888,-43.2177 97.5978,-47.2672"/>
92 <g id="edge12" class="edge">
93 <title>a3&#45;&gt;end</title>
94 <path fill="none" stroke="black" d="M74.1,-74.35C80.15,-65.82 87.8,-55.04 94.7,-45.3"/>
95 <polygon fill="black" stroke="black" points="97.6,-47.27 100.53,-37.09 91.89,-43.22 97.6,-47.27"/>
8296 </g>
8397 <!-- b0 -->
84 <g id="node5" class="node"><title>b0</title>
85 <ellipse fill="lightgrey" stroke="black" cx="168" cy="-307" rx="27" ry="18"/>
86 <text text-anchor="middle" x="168" y="-303.3" font-family="Times New Roman,serif" font-size="14.00">b0</text>
98 <g id="node5" class="node">
99 <title>b0</title>
100 <ellipse fill="lightgrey" stroke="black" cx="164" cy="-307" rx="27" ry="18"/>
101 <text text-anchor="middle" x="164" y="-303.3" font-family="Times New Roman,serif" font-size="14.00">b0</text>
87102 </g>
88103 <!-- b1 -->
89 <g id="node6" class="node"><title>b1</title>
90 <ellipse fill="lightgrey" stroke="black" cx="170" cy="-235" rx="27" ry="18"/>
91 <text text-anchor="middle" x="170" y="-231.3" font-family="Times New Roman,serif" font-size="14.00">b1</text>
104 <g id="node6" class="node">
105 <title>b1</title>
106 <ellipse fill="lightgrey" stroke="black" cx="168" cy="-235" rx="27" ry="18"/>
107 <text text-anchor="middle" x="168" y="-231.3" font-family="Times New Roman,serif" font-size="14.00">b1</text>
92108 </g>
93109 <!-- b0&#45;&gt;b1 -->
94 <g id="edge4" class="edge"><title>b0&#45;&gt;b1</title>
95 <path fill="none" stroke="black" d="M168.494,-288.697C168.715,-280.983 168.98,-271.712 169.225,-263.112"/>
96 <polygon fill="black" stroke="black" points="172.724,-263.2 169.511,-253.104 165.727,-263 172.724,-263.2"/>
110 <g id="edge4" class="edge">
111 <title>b0&#45;&gt;b1</title>
112 <path fill="none" stroke="black" d="M164.99,-288.7C165.43,-280.98 165.96,-271.71 166.45,-263.11"/>
113 <polygon fill="black" stroke="black" points="169.95,-263.29 167.02,-253.1 162.96,-262.89 169.95,-263.29"/>
97114 </g>
98115 <!-- b2 -->
99 <g id="node7" class="node"><title>b2</title>
116 <g id="node7" class="node">
117 <title>b2</title>
100118 <ellipse fill="lightgrey" stroke="black" cx="173" cy="-163" rx="27" ry="18"/>
101119 <text text-anchor="middle" x="173" y="-159.3" font-family="Times New Roman,serif" font-size="14.00">b2</text>
102120 </g>
103121 <!-- b1&#45;&gt;b2 -->
104 <g id="edge5" class="edge"><title>b1&#45;&gt;b2</title>
105 <path fill="none" stroke="black" d="M170.742,-216.697C171.072,-208.983 171.469,-199.712 171.838,-191.112"/>
106 <polygon fill="black" stroke="black" points="175.335,-191.245 172.267,-181.104 168.342,-190.945 175.335,-191.245"/>
122 <g id="edge5" class="edge">
123 <title>b1&#45;&gt;b2</title>
124 <path fill="none" stroke="black" d="M169.24,-216.7C169.79,-208.98 170.45,-199.71 171.06,-191.11"/>
125 <polygon fill="black" stroke="black" points="174.56,-191.33 171.78,-181.1 167.57,-190.83 174.56,-191.33"/>
107126 </g>
108127 <!-- b2&#45;&gt;a3 -->
109 <g id="edge10" class="edge"><title>b2&#45;&gt;a3</title>
110 <path fill="none" stroke="black" d="M153.839,-149.807C136.331,-138.665 110.241,-122.062 90.5068,-109.504"/>
111 <polygon fill="black" stroke="black" points="92.2567,-106.469 81.941,-104.053 88.4985,-112.375 92.2567,-106.469"/>
128 <g id="edge10" class="edge">
129 <title>b2&#45;&gt;a3</title>
130 <path fill="none" stroke="black" d="M153.84,-149.81C136.33,-138.67 110.24,-122.06 90.51,-109.5"/>
131 <polygon fill="black" stroke="black" points="92.26,-106.47 81.94,-104.05 88.5,-112.37 92.26,-106.47"/>
112132 </g>
113133 <!-- b2&#45;&gt;b3 -->
114 <g id="edge6" class="edge"><title>b2&#45;&gt;b3</title>
115 <path fill="none" stroke="black" d="M170.821,-145.055C169.83,-137.346 168.632,-128.027 167.518,-119.364"/>
116 <polygon fill="black" stroke="black" points="170.968,-118.747 166.221,-109.275 164.025,-119.64 170.968,-118.747"/>
134 <g id="edge6" class="edge">
135 <title>b2&#45;&gt;b3</title>
136 <path fill="none" stroke="black" d="M170.82,-145.05C169.83,-137.35 168.63,-128.03 167.52,-119.36"/>
137 <polygon fill="black" stroke="black" points="170.97,-118.75 166.22,-109.28 164.02,-119.64 170.97,-118.75"/>
117138 </g>
118139 <!-- b3&#45;&gt;end -->
119 <g id="edge13" class="edge"><title>b3&#45;&gt;end</title>
120 <path fill="none" stroke="black" d="M152.681,-74.3538C146.508,-65.8197 138.708,-55.0378 131.661,-45.2961"/>
121 <polygon fill="black" stroke="black" points="134.419,-43.1364 125.721,-37.0856 128.747,-47.2393 134.419,-43.1364"/>
140 <g id="edge13" class="edge">
141 <title>b3&#45;&gt;end</title>
142 <path fill="none" stroke="black" d="M152.68,-74.35C146.51,-65.82 138.71,-55.04 131.66,-45.3"/>
143 <polygon fill="black" stroke="black" points="134.42,-43.14 125.72,-37.09 128.75,-47.24 134.42,-43.14"/>
122144 </g>
123145 <!-- start -->
124 <g id="node9" class="node"><title>start</title>
125 <polygon fill="none" stroke="black" points="115,-400 77.1282,-382 115,-364 152.872,-382 115,-400"/>
126 <polyline fill="none" stroke="black" points="87.9663,-387.151 87.9663,-376.849 "/>
127 <polyline fill="none" stroke="black" points="104.162,-369.151 125.838,-369.151 "/>
128 <polyline fill="none" stroke="black" points="142.034,-376.849 142.034,-387.151 "/>
129 <polyline fill="none" stroke="black" points="125.838,-394.849 104.162,-394.849 "/>
130 <text text-anchor="middle" x="115" y="-378.3" font-family="Times New Roman,serif" font-size="14.00">start</text>
146 <g id="node9" class="node">
147 <title>start</title>
148 <polygon fill="none" stroke="black" points="113,-400 75.13,-382 113,-364 150.87,-382 113,-400"/>
149 <polyline fill="none" stroke="black" points="85.97,-387.15 85.97,-376.85 "/>
150 <polyline fill="none" stroke="black" points="102.16,-369.15 123.84,-369.15 "/>
151 <polyline fill="none" stroke="black" points="140.03,-376.85 140.03,-387.15 "/>
152 <polyline fill="none" stroke="black" points="123.84,-394.85 102.16,-394.85 "/>
153 <text text-anchor="middle" x="113" y="-378.3" font-family="Times New Roman,serif" font-size="14.00">start</text>
131154 </g>
132155 <!-- start&#45;&gt;a0 -->
133 <g id="edge7" class="edge"><title>start&#45;&gt;a0</title>
134 <path fill="none" stroke="black" d="M105.942,-368.284C98.8241,-358.292 88.7051,-344.086 80.0777,-331.974"/>
135 <polygon fill="black" stroke="black" points="82.776,-329.73 74.1234,-323.616 77.0746,-333.791 82.776,-329.73"/>
156 <g id="edge7" class="edge">
157 <title>start&#45;&gt;a0</title>
158 <path fill="none" stroke="black" d="M104.06,-367.95C97.23,-357.98 87.64,-343.97 79.44,-332"/>
159 <polygon fill="black" stroke="black" points="82.31,-330 73.78,-323.73 76.54,-333.96 82.31,-330"/>
136160 </g>
137161 <!-- start&#45;&gt;b0 -->
138 <g id="edge8" class="edge"><title>start&#45;&gt;b0</title>
139 <path fill="none" stroke="black" d="M124.232,-368.284C131.487,-358.292 141.801,-344.086 150.594,-331.974"/>
140 <polygon fill="black" stroke="black" points="153.62,-333.764 156.663,-323.616 147.955,-329.651 153.62,-333.764"/>
162 <g id="edge8" class="edge">
163 <title>start&#45;&gt;b0</title>
164 <path fill="none" stroke="black" d="M122.12,-367.95C129.08,-357.98 138.87,-343.97 147.23,-332"/>
165 <polygon fill="black" stroke="black" points="150.15,-333.93 153.01,-323.73 144.41,-329.92 150.15,-333.93"/>
141166 </g>
142167 </g>
143168 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: G Pages: 1 -->
66 <svg width="222pt" height="364pt"
77 viewBox="0.00 0.00 222.00 364.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 360)">
99 <title>G</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-360 218,-360 218,4 -4,4"/>
11 <g id="clust1" class="cluster"><title>cluster0</title>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-360 218,-360 218,4 -4,4"/>
11 <g id="clust1" class="cluster">
12 <title>cluster0</title>
1213 <polygon fill="none" stroke="black" points="64,-152 64,-348 206,-348 206,-152 64,-152"/>
1314 </g>
14 <g id="clust2" class="cluster"><title>cluster1</title>
15 <g id="clust2" class="cluster">
16 <title>cluster1</title>
1517 <polygon fill="none" stroke="black" points="64,-8 64,-132 206,-132 206,-8 64,-8"/>
1618 </g>
1719 <!-- a -->
18 <g id="node1" class="node"><title>a</title>
20 <g id="node1" class="node">
21 <title>a</title>
1922 <ellipse fill="none" stroke="black" cx="135" cy="-322" rx="27" ry="18"/>
2023 <text text-anchor="middle" x="135" y="-318.3" font-family="Times New Roman,serif" font-size="14.00">a</text>
2124 </g>
2225 <!-- b -->
23 <g id="node2" class="node"><title>b</title>
26 <g id="node2" class="node">
27 <title>b</title>
2428 <ellipse fill="none" stroke="black" cx="99" cy="-250" rx="27" ry="18"/>
2529 <text text-anchor="middle" x="99" y="-246.3" font-family="Times New Roman,serif" font-size="14.00">b</text>
2630 </g>
2731 <!-- a&#45;&gt;b -->
28 <g id="edge1" class="edge"><title>a&#45;&gt;b</title>
29 <path fill="none" stroke="black" d="M126.65,-304.765C122.288,-296.283 116.853,-285.714 111.959,-276.197"/>
30 <polygon fill="black" stroke="black" points="114.99,-274.439 107.304,-267.147 108.765,-277.641 114.99,-274.439"/>
32 <g id="edge1" class="edge">
33 <title>a&#45;&gt;b</title>
34 <path fill="none" stroke="black" d="M126.65,-304.76C122.29,-296.28 116.85,-285.71 111.96,-276.2"/>
35 <polygon fill="black" stroke="black" points="114.99,-274.44 107.3,-267.15 108.77,-277.64 114.99,-274.44"/>
3136 </g>
3237 <!-- c -->
33 <g id="node3" class="node"><title>c</title>
38 <g id="node3" class="node">
39 <title>c</title>
3440 <ellipse fill="none" stroke="black" cx="171" cy="-250" rx="27" ry="18"/>
3541 <text text-anchor="middle" x="171" y="-246.3" font-family="Times New Roman,serif" font-size="14.00">c</text>
3642 </g>
3743 <!-- a&#45;&gt;c -->
38 <g id="edge2" class="edge"><title>a&#45;&gt;c</title>
39 <path fill="none" stroke="black" d="M143.35,-304.765C147.712,-296.283 153.147,-285.714 158.041,-276.197"/>
40 <polygon fill="black" stroke="black" points="161.235,-277.641 162.696,-267.147 155.01,-274.439 161.235,-277.641"/>
44 <g id="edge2" class="edge">
45 <title>a&#45;&gt;c</title>
46 <path fill="none" stroke="black" d="M143.35,-304.76C147.71,-296.28 153.15,-285.71 158.04,-276.2"/>
47 <polygon fill="black" stroke="black" points="161.23,-277.64 162.7,-267.15 155.01,-274.44 161.23,-277.64"/>
4148 </g>
4249 <!-- d -->
43 <g id="node4" class="node"><title>d</title>
50 <g id="node4" class="node">
51 <title>d</title>
4452 <ellipse fill="none" stroke="black" cx="99" cy="-178" rx="27" ry="18"/>
4553 <text text-anchor="middle" x="99" y="-174.3" font-family="Times New Roman,serif" font-size="14.00">d</text>
4654 </g>
4755 <!-- b&#45;&gt;d -->
48 <g id="edge3" class="edge"><title>b&#45;&gt;d</title>
49 <path fill="none" stroke="black" d="M99,-231.697C99,-223.983 99,-214.712 99,-206.112"/>
50 <polygon fill="black" stroke="black" points="102.5,-206.104 99,-196.104 95.5001,-206.104 102.5,-206.104"/>
56 <g id="edge3" class="edge">
57 <title>b&#45;&gt;d</title>
58 <path fill="none" stroke="black" d="M99,-231.7C99,-223.98 99,-214.71 99,-206.11"/>
59 <polygon fill="black" stroke="black" points="102.5,-206.1 99,-196.1 95.5,-206.1 102.5,-206.1"/>
5160 </g>
5261 <!-- f -->
53 <g id="node7" class="node"><title>f</title>
62 <g id="node7" class="node">
63 <title>f</title>
5464 <ellipse fill="none" stroke="black" cx="99" cy="-34" rx="27" ry="18"/>
5565 <text text-anchor="middle" x="99" y="-30.3" font-family="Times New Roman,serif" font-size="14.00">f</text>
5666 </g>
5767 <!-- b&#45;&gt;f -->
58 <g id="edge7" class="edge"><title>b&#45;&gt;f</title>
59 <path fill="none" stroke="black" d="M112.75,-234.069C120.961,-224.1 130.619,-210.247 135,-196 142.052,-173.066 145.58,-157.538 145.581,-142.011"/>
60 <polygon fill="black" stroke="black" points="149.063,-141.547 145.075,-131.731 142.071,-141.891 149.063,-141.547"/>
68 <g id="edge7" class="edge">
69 <title>b&#45;&gt;f</title>
70 <path fill="none" stroke="black" d="M112.75,-234.07C120.96,-224.1 130.62,-210.25 135,-196 142.02,-173.17 145.55,-157.68 145.58,-142.23"/>
71 <polygon fill="black" stroke="black" points="149.07,-141.82 145.1,-132 142.07,-142.15 149.07,-141.82"/>
6172 </g>
6273 <!-- c&#45;&gt;d -->
63 <g id="edge4" class="edge"><title>c&#45;&gt;d</title>
64 <path fill="none" stroke="black" d="M156.43,-234.834C146.25,-224.938 132.476,-211.546 120.969,-200.359"/>
65 <polygon fill="black" stroke="black" points="123.405,-197.846 113.796,-193.385 118.526,-202.865 123.405,-197.846"/>
74 <g id="edge4" class="edge">
75 <title>c&#45;&gt;d</title>
76 <path fill="none" stroke="black" d="M156.43,-234.83C146.25,-224.94 132.48,-211.55 120.97,-200.36"/>
77 <polygon fill="black" stroke="black" points="123.41,-197.85 113.8,-193.38 118.53,-202.87 123.41,-197.85"/>
6678 </g>
6779 <!-- e -->
68 <g id="node5" class="node"><title>e</title>
80 <g id="node5" class="node">
81 <title>e</title>
6982 <ellipse fill="none" stroke="black" cx="99" cy="-106" rx="27" ry="18"/>
7083 <text text-anchor="middle" x="99" y="-102.3" font-family="Times New Roman,serif" font-size="14.00">e</text>
7184 </g>
7285 <!-- c&#45;&gt;e -->
73 <g id="edge10" class="edge"><title>c&#45;&gt;e</title>
74 <path fill="none" stroke="black" d="M135,-152C130.703,-144.409 125.157,-136.769 119.712,-129.993"/>
75 <polygon fill="black" stroke="black" points="122.073,-127.362 112.969,-121.943 116.707,-131.857 122.073,-127.362"/>
86 <g id="edge10" class="edge">
87 <title>c&#45;&gt;e</title>
88 <path fill="none" stroke="black" d="M135,-152C130.7,-144.41 125.16,-136.77 119.71,-129.99"/>
89 <polygon fill="black" stroke="black" points="122.07,-127.36 112.97,-121.94 116.71,-131.86 122.07,-127.36"/>
7690 </g>
7791 <!-- g -->
78 <g id="node6" class="node"><title>g</title>
92 <g id="node6" class="node">
93 <title>g</title>
7994 <ellipse fill="none" stroke="black" cx="171" cy="-34" rx="27" ry="18"/>
8095 <text text-anchor="middle" x="171" y="-30.3" font-family="Times New Roman,serif" font-size="14.00">g</text>
8196 </g>
8297 <!-- c&#45;&gt;g -->
83 <g id="edge9" class="edge"><title>c&#45;&gt;g</title>
84 <path fill="none" stroke="black" d="M171,-152.011C171,-148.759 171,-145.494 171,-142.23"/>
85 <polygon fill="black" stroke="black" points="174.5,-141.93 171,-131.93 167.5,-141.93 174.5,-141.93"/>
98 <g id="edge9" class="edge">
99 <title>c&#45;&gt;g</title>
100 <path fill="none" stroke="black" d="M171,-152C171,-148.77 171,-145.53 171,-142.29"/>
101 <polygon fill="black" stroke="black" points="174.5,-141.99 171,-132 167.5,-142 174.5,-141.99"/>
86102 </g>
87103 <!-- d&#45;&gt;e -->
88 <g id="edge8" class="edge"><title>d&#45;&gt;e</title>
89 <path fill="none" stroke="black" d="M99,-159.697C99,-151.983 99,-142.712 99,-134.112"/>
90 <polygon fill="black" stroke="black" points="102.5,-134.104 99,-124.104 95.5001,-134.104 102.5,-134.104"/>
104 <g id="edge8" class="edge">
105 <title>d&#45;&gt;e</title>
106 <path fill="none" stroke="black" d="M99,-159.7C99,-151.98 99,-142.71 99,-134.11"/>
107 <polygon fill="black" stroke="black" points="102.5,-134.1 99,-124.1 95.5,-134.1 102.5,-134.1"/>
91108 </g>
92109 <!-- h -->
93 <g id="node8" class="node"><title>h</title>
110 <g id="node8" class="node">
111 <title>h</title>
94112 <ellipse fill="none" stroke="black" cx="27" cy="-106" rx="27" ry="18"/>
95113 <text text-anchor="middle" x="27" y="-102.3" font-family="Times New Roman,serif" font-size="14.00">h</text>
96114 </g>
97115 <!-- d&#45;&gt;h -->
98 <g id="edge11" class="edge"><title>d&#45;&gt;h</title>
99 <path fill="none" stroke="black" d="M84.4297,-162.834C74.2501,-152.938 60.4761,-139.546 48.9694,-128.359"/>
100 <polygon fill="black" stroke="black" points="51.4055,-125.846 41.7957,-121.385 46.5259,-130.865 51.4055,-125.846"/>
116 <g id="edge11" class="edge">
117 <title>d&#45;&gt;h</title>
118 <path fill="none" stroke="black" d="M84.43,-162.83C74.25,-152.94 60.48,-139.55 48.97,-128.36"/>
119 <polygon fill="black" stroke="black" points="51.41,-125.85 41.8,-121.38 46.53,-130.87 51.41,-125.85"/>
101120 </g>
102121 <!-- e&#45;&gt;g -->
103 <g id="edge5" class="edge"><title>e&#45;&gt;g</title>
104 <path fill="none" stroke="black" d="M113.57,-90.8345C123.75,-80.9376 137.524,-67.5462 149.031,-56.3591"/>
105 <polygon fill="black" stroke="black" points="151.474,-58.865 156.204,-49.3847 146.595,-53.8461 151.474,-58.865"/>
122 <g id="edge5" class="edge">
123 <title>e&#45;&gt;g</title>
124 <path fill="none" stroke="black" d="M113.57,-90.83C123.75,-80.94 137.52,-67.55 149.03,-56.36"/>
125 <polygon fill="black" stroke="black" points="151.47,-58.87 156.2,-49.38 146.59,-53.85 151.47,-58.87"/>
106126 </g>
107127 <!-- e&#45;&gt;f -->
108 <g id="edge6" class="edge"><title>e&#45;&gt;f</title>
109 <path fill="none" stroke="black" d="M99,-87.6966C99,-79.9827 99,-70.7125 99,-62.1124"/>
110 <polygon fill="black" stroke="black" points="102.5,-62.1043 99,-52.1043 95.5001,-62.1044 102.5,-62.1043"/>
128 <g id="edge6" class="edge">
129 <title>e&#45;&gt;f</title>
130 <path fill="none" stroke="black" d="M99,-87.7C99,-79.98 99,-70.71 99,-62.11"/>
131 <polygon fill="black" stroke="black" points="102.5,-62.1 99,-52.1 95.5,-62.1 102.5,-62.1"/>
111132 </g>
112133 </g>
113134 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
5 <!-- Title: %3 Pages: 1 -->
5 <!-- Pages: 1 -->
66 <svg width="62pt" height="44pt"
77 viewBox="0.00 0.00 62.00 44.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 40)">
9 <title>%3</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-40 58,-40 58,4 -4,4"/>
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-40 58,-40 58,4 -4,4"/>
1110 <!-- diamond -->
12 <g id="node1" class="node"><title>diamond</title>
11 <g id="node1" class="node">
12 <title>diamond</title>
1313 <ellipse fill="none" stroke="black" cx="27" cy="-18" rx="27" ry="18"/>
1414 <text text-anchor="middle" x="27" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">&lt;&gt;</text>
1515 </g>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: ER Pages: 1 -->
66 <svg width="352pt" height="436pt"
77 viewBox="0.00 0.00 351.54 436.37" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(158.439 174.559)">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 432.37)">
99 <title>ER</title>
10 <polygon fill="white" stroke="none" points="-158.439,261.813 -158.439,-174.559 193.1,-174.559 193.1,261.813 -158.439,261.813"/>
11 <text text-anchor="middle" x="17.3304" y="225.813" font-family="Times New Roman,serif" font-size="20.00">Entity Relation Diagram</text>
12 <text text-anchor="middle" x="17.3304" y="247.813" font-family="Times New Roman,serif" font-size="20.00">drawn by NEATO</text>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-432.37 347.54,-432.37 347.54,4 -4,4"/>
11 <text text-anchor="middle" x="171.77" y="-32" font-family="Times New Roman,serif" font-size="20.00">Entity Relation Diagram</text>
12 <text text-anchor="middle" x="171.77" y="-10" font-family="Times New Roman,serif" font-size="20.00">drawn by NEATO</text>
1313 <!-- course -->
14 <g id="node1" class="node"><title>course</title>
15 <polygon fill="none" stroke="black" points="113.543,-48.4456 59.5425,-48.4456 59.5425,-12.4456 113.543,-12.4456 113.543,-48.4456"/>
16 <text text-anchor="middle" x="86.5425" y="-26.7456" font-family="Times New Roman,serif" font-size="14.00">course</text>
14 <g id="node1" class="node">
15 <title>course</title>
16 <polygon fill="none" stroke="black" points="267.98,-306.26 213.98,-306.26 213.98,-270.26 267.98,-270.26 267.98,-306.26"/>
17 <text text-anchor="middle" x="240.98" y="-284.56" font-family="Times New Roman,serif" font-size="14.00">course</text>
1718 </g>
1819 <!-- C&#45;I -->
19 <g id="node10" class="node"><title>C&#45;I</title>
20 <polygon fill="lightgrey" stroke="lightgrey" points="33.7217,-114.449 1.37974,-96.4492 33.7217,-78.4492 66.0636,-96.4492 33.7217,-114.449"/>
21 <text text-anchor="middle" x="33.7217" y="-92.7492" font-family="Times New Roman,serif" font-size="14.00">C&#45;I</text>
20 <g id="node10" class="node">
21 <title>C&#45;I</title>
22 <polygon fill="lightgrey" stroke="lightgrey" points="188.16,-372.26 155.82,-354.26 188.16,-336.26 220.5,-354.26 188.16,-372.26"/>
23 <text text-anchor="middle" x="188.16" y="-350.56" font-family="Times New Roman,serif" font-size="14.00">C&#45;I</text>
2224 </g>
2325 <!-- course&#45;&#45;C&#45;I -->
24 <g id="edge3" class="edge"><title>course&#45;&#45;C&#45;I</title>
25 <path fill="none" stroke="black" d="M72.109,-48.4814C63.1897,-59.6267 51.9583,-73.6612 43.953,-83.6643"/>
26 <text text-anchor="middle" x="54.531" y="-54.8729" font-family="Times New Roman,serif" font-size="14.00">n</text>
26 <g id="edge3" class="edge">
27 <title>course&#45;&#45;C&#45;I</title>
28 <path fill="none" stroke="black" d="M226.55,-306.29C217.63,-317.44 206.4,-331.47 198.39,-341.48"/>
29 <text text-anchor="middle" x="208.97" y="-312.69" font-family="Times New Roman,serif" font-size="14.00">n</text>
2730 </g>
2831 <!-- institute -->
29 <g id="node2" class="node"><title>institute</title>
30 <polygon fill="none" stroke="black" points="-18.75,-105.706 -77.75,-105.706 -77.75,-69.7063 -18.75,-69.7063 -18.75,-105.706"/>
31 <text text-anchor="middle" x="-48.25" y="-84.0063" font-family="Times New Roman,serif" font-size="14.00">institute</text>
32 <g id="node2" class="node">
33 <title>institute</title>
34 <polygon fill="none" stroke="black" points="135.69,-363.52 76.69,-363.52 76.69,-327.52 135.69,-327.52 135.69,-363.52"/>
35 <text text-anchor="middle" x="106.19" y="-341.82" font-family="Times New Roman,serif" font-size="14.00">institute</text>
3236 </g>
3337 <!-- name1 -->
34 <g id="node5" class="node"><title>name1</title>
35 <ellipse fill="none" stroke="black" cx="-92.878" cy="-152.559" rx="29.795" ry="18"/>
36 <text text-anchor="middle" x="-92.878" y="-148.859" font-family="Times New Roman,serif" font-size="14.00">name</text>
38 <g id="node5" class="node">
39 <title>name1</title>
40 <ellipse fill="none" stroke="black" cx="61.56" cy="-410.37" rx="29.8" ry="18"/>
41 <text text-anchor="middle" x="61.56" y="-406.67" font-family="Times New Roman,serif" font-size="14.00">name</text>
3742 </g>
3843 <!-- institute&#45;&#45;name1 -->
39 <g id="edge5" class="edge"><title>institute&#45;&#45;name1</title>
40 <path fill="none" stroke="black" d="M-60.6814,-105.771C-67.1807,-115.216 -75.0819,-126.698 -81.4304,-135.924"/>
44 <g id="edge5" class="edge">
45 <title>institute&#45;&#45;name1</title>
46 <path fill="none" stroke="black" d="M93.76,-363.58C87.26,-373.03 79.36,-384.51 73.01,-393.74"/>
4147 </g>
4248 <!-- S&#45;I -->
43 <g id="node12" class="node"><title>S&#45;I</title>
44 <polygon fill="lightgrey" stroke="lightgrey" points="-77.1806,-28.8586 -108.185,-10.8586 -77.1806,7.14139 -46.176,-10.8586 -77.1806,-28.8586"/>
45 <text text-anchor="middle" x="-77.1806" y="-7.15861" font-family="Times New Roman,serif" font-size="14.00">S&#45;I</text>
49 <g id="node12" class="node">
50 <title>S&#45;I</title>
51 <polygon fill="lightgrey" stroke="lightgrey" points="77.26,-286.67 46.25,-268.67 77.26,-250.67 108.26,-268.67 77.26,-286.67"/>
52 <text text-anchor="middle" x="77.26" y="-264.97" font-family="Times New Roman,serif" font-size="14.00">S&#45;I</text>
4653 </g>
4754 <!-- institute&#45;&#45;S&#45;I -->
48 <g id="edge6" class="edge"><title>institute&#45;&#45;S&#45;I</title>
49 <path fill="none" stroke="black" d="M-55.1061,-69.4945C-60.119,-56.1791 -66.8361,-38.3367 -71.5392,-25.8438"/>
50 <text text-anchor="middle" x="-66.8227" y="-51.4691" font-family="Times New Roman,serif" font-size="14.00">1</text>
55 <g id="edge6" class="edge">
56 <title>institute&#45;&#45;S&#45;I</title>
57 <path fill="none" stroke="black" d="M99.33,-327.31C94.32,-313.99 87.6,-296.15 82.9,-283.66"/>
58 <text text-anchor="middle" x="87.62" y="-309.28" font-family="Times New Roman,serif" font-size="14.00">1</text>
5159 </g>
5260 <!-- student -->
53 <g id="node3" class="node"><title>student</title>
54 <polygon fill="none" stroke="black" points="-13.1816,48.1705 -70.1816,48.1705 -70.1816,84.1705 -13.1816,84.1705 -13.1816,48.1705"/>
55 <text text-anchor="middle" x="-41.6816" y="69.8705" font-family="Times New Roman,serif" font-size="14.00">student</text>
61 <g id="node3" class="node">
62 <title>student</title>
63 <polygon fill="none" stroke="black" points="141.26,-209.64 84.26,-209.64 84.26,-173.64 141.26,-173.64 141.26,-209.64"/>
64 <text text-anchor="middle" x="112.76" y="-187.94" font-family="Times New Roman,serif" font-size="14.00">student</text>
5665 </g>
5766 <!-- name2 -->
58 <g id="node6" class="node"><title>name2</title>
59 <ellipse fill="none" stroke="black" cx="-124.542" cy="77.2328" rx="29.795" ry="18"/>
60 <text text-anchor="middle" x="-124.542" y="80.9328" font-family="Times New Roman,serif" font-size="14.00">name</text>
67 <g id="node6" class="node">
68 <title>name2</title>
69 <ellipse fill="none" stroke="black" cx="29.9" cy="-180.58" rx="29.8" ry="18"/>
70 <text text-anchor="middle" x="29.9" y="-176.88" font-family="Times New Roman,serif" font-size="14.00">name</text>
6171 </g>
6272 <!-- student&#45;&#45;name2 -->
63 <g id="edge9" class="edge"><title>student&#45;&#45;name2</title>
64 <path fill="none" stroke="black" d="M-70.1973,69.9775C-78.2492,71.0525 -87.0242,72.224 -95.1278,73.3059"/>
73 <g id="edge9" class="edge">
74 <title>student&#45;&#45;name2</title>
75 <path fill="none" stroke="black" d="M84.24,-187.84C76.19,-186.76 67.41,-185.59 59.31,-184.51"/>
6576 </g>
6677 <!-- grade -->
67 <g id="node8" class="node"><title>grade</title>
68 <ellipse fill="none" stroke="black" cx="-1.75067" cy="139.813" rx="30.5947" ry="18"/>
69 <text text-anchor="middle" x="-1.75067" y="143.513" font-family="Times New Roman,serif" font-size="14.00">grade</text>
78 <g id="node8" class="node">
79 <title>grade</title>
80 <ellipse fill="none" stroke="black" cx="152.69" cy="-118" rx="30.59" ry="18"/>
81 <text text-anchor="middle" x="152.69" y="-114.3" font-family="Times New Roman,serif" font-size="14.00">grade</text>
7082 </g>
7183 <!-- student&#45;&#45;grade -->
72 <g id="edge8" class="edge"><title>student&#45;&#45;grade</title>
73 <path fill="none" stroke="black" d="M-31.811,84.3743C-25.5291,95.9597 -17.4379,110.882 -11.2327,122.326"/>
84 <g id="edge8" class="edge">
85 <title>student&#45;&#45;grade</title>
86 <path fill="none" stroke="black" d="M122.63,-173.44C128.91,-161.85 137,-146.93 143.21,-135.49"/>
7487 </g>
7588 <!-- number -->
76 <g id="node9" class="node"><title>number</title>
77 <ellipse fill="none" stroke="black" cx="-77.7046" cy="138.365" rx="38.1938" ry="18"/>
78 <text text-anchor="middle" x="-77.7046" y="142.065" font-family="Times New Roman,serif" font-size="14.00">number</text>
89 <g id="node9" class="node">
90 <title>number</title>
91 <ellipse fill="none" stroke="black" cx="76.73" cy="-119.45" rx="38.19" ry="18"/>
92 <text text-anchor="middle" x="76.73" y="-115.75" font-family="Times New Roman,serif" font-size="14.00">number</text>
7993 </g>
8094 <!-- student&#45;&#45;number -->
81 <g id="edge10" class="edge"><title>student&#45;&#45;number</title>
82 <path fill="none" stroke="black" d="M-50.7717,84.3881C-56.2742,95.4158 -63.2629,109.422 -68.7422,120.403"/>
95 <g id="edge10" class="edge">
96 <title>student&#45;&#45;number</title>
97 <path fill="none" stroke="black" d="M103.67,-173.43C98.16,-162.4 91.18,-148.39 85.7,-137.41"/>
8398 </g>
8499 <!-- S&#45;C -->
85 <g id="node11" class="node"><title>S&#45;C</title>
86 <polygon fill="lightgrey" stroke="lightgrey" points="38.268,20.0101 2.57309,38.0101 38.268,56.0101 73.9629,38.0101 38.268,20.0101"/>
87 <text text-anchor="middle" x="38.268" y="41.7101" font-family="Times New Roman,serif" font-size="14.00">S&#45;C</text>
100 <g id="node11" class="node">
101 <title>S&#45;C</title>
102 <polygon fill="lightgrey" stroke="lightgrey" points="192.71,-237.8 157.01,-219.8 192.71,-201.8 228.4,-219.8 192.71,-237.8"/>
103 <text text-anchor="middle" x="192.71" y="-216.1" font-family="Times New Roman,serif" font-size="14.00">S&#45;C</text>
88104 </g>
89105 <!-- student&#45;&#45;S&#45;C -->
90 <g id="edge11" class="edge"><title>student&#45;&#45;S&#45;C</title>
91 <path fill="none" stroke="black" d="M-12.8179,56.0039C-2.97784,52.538 7.83799,48.7284 16.9742,45.5103"/>
92 <text text-anchor="middle" x="-3.42185" y="46.9571" font-family="Times New Roman,serif" font-size="14.00">m</text>
106 <g id="edge11" class="edge">
107 <title>student&#45;&#45;S&#45;C</title>
108 <path fill="none" stroke="black" d="M141.62,-201.81C151.46,-205.28 162.28,-209.08 171.41,-212.3"/>
109 <text text-anchor="middle" x="151.02" y="-210.86" font-family="Times New Roman,serif" font-size="14.00">m</text>
93110 </g>
94111 <!-- name0 -->
95 <g id="node4" class="node"><title>name0</title>
96 <ellipse fill="none" stroke="black" cx="144.953" cy="-86.1968" rx="29.795" ry="18"/>
97 <text text-anchor="middle" x="144.953" y="-82.4968" font-family="Times New Roman,serif" font-size="14.00">name</text>
112 <g id="node4" class="node">
113 <title>name0</title>
114 <ellipse fill="none" stroke="black" cx="299.39" cy="-344.01" rx="29.8" ry="18"/>
115 <text text-anchor="middle" x="299.39" y="-340.31" font-family="Times New Roman,serif" font-size="14.00">name</text>
98116 </g>
99117 <!-- name0&#45;&#45;course -->
100 <g id="edge1" class="edge"><title>name0&#45;&#45;course</title>
101 <path fill="none" stroke="black" d="M128.992,-70.9625C121.831,-64.1276 113.322,-56.0064 105.81,-48.8358"/>
118 <g id="edge1" class="edge">
119 <title>name0&#45;&#45;course</title>
120 <path fill="none" stroke="black" d="M283.43,-328.78C276.27,-321.94 267.76,-313.82 260.25,-306.65"/>
102121 </g>
103122 <!-- code -->
104 <g id="node7" class="node"><title>code</title>
105 <ellipse fill="none" stroke="black" cx="160.502" cy="4.62428" rx="28.6953" ry="18"/>
106 <text text-anchor="middle" x="160.502" y="8.32428" font-family="Times New Roman,serif" font-size="14.00">code</text>
123 <g id="node7" class="node">
124 <title>code</title>
125 <ellipse fill="none" stroke="black" cx="314.94" cy="-253.19" rx="28.7" ry="18"/>
126 <text text-anchor="middle" x="314.94" y="-249.49" font-family="Times New Roman,serif" font-size="14.00">code</text>
107127 </g>
108128 <!-- code&#45;&#45;course -->
109 <g id="edge2" class="edge"><title>code&#45;&#45;course</title>
110 <path fill="none" stroke="black" d="M137.506,-6.27983C129.958,-9.8589 121.499,-13.8702 113.674,-17.5806"/>
129 <g id="edge2" class="edge">
130 <title>code&#45;&#45;course</title>
131 <path fill="none" stroke="black" d="M291.95,-264.09C284.4,-267.67 275.94,-271.68 268.11,-275.39"/>
111132 </g>
112133 <!-- C&#45;I&#45;&#45;institute -->
113 <g id="edge4" class="edge"><title>C&#45;I&#45;&#45;institute</title>
114 <path fill="none" stroke="black" d="M6.42628,-93.5379C-1.58435,-92.6835 -10.3833,-91.7451 -18.5368,-90.8754"/>
115 <text text-anchor="middle" x="-9.55527" y="-96.0067" font-family="Times New Roman,serif" font-size="14.00">1</text>
134 <g id="edge4" class="edge">
135 <title>C&#45;I&#45;&#45;institute</title>
136 <path fill="none" stroke="black" d="M160.87,-351.35C152.85,-350.5 144.06,-349.56 135.9,-348.69"/>
137 <text text-anchor="middle" x="144.88" y="-353.82" font-family="Times New Roman,serif" font-size="14.00">1</text>
116138 </g>
117139 <!-- S&#45;C&#45;&#45;course -->
118 <g id="edge12" class="edge"><title>S&#45;C&#45;&#45;course</title>
119 <path fill="none" stroke="black" d="M47.8055,24.4854C55.2245,13.9649 65.5912,-0.735636 73.7336,-12.2819"/>
120 <text text-anchor="middle" x="57.2695" y="2.30178" font-family="Times New Roman,serif" font-size="14.00">n</text>
140 <g id="edge12" class="edge">
141 <title>S&#45;C&#45;&#45;course</title>
142 <path fill="none" stroke="black" d="M202.24,-233.33C209.66,-243.85 220.03,-258.55 228.17,-270.1"/>
143 <text text-anchor="middle" x="211.71" y="-255.51" font-family="Times New Roman,serif" font-size="14.00">n</text>
121144 </g>
122145 <!-- S&#45;I&#45;&#45;student -->
123 <g id="edge7" class="edge"><title>S&#45;I&#45;&#45;student</title>
124 <path fill="none" stroke="black" d="M-70.5035,3.62997C-64.7192,16.1813 -56.3228,34.4006 -50.0831,47.9401"/>
125 <text text-anchor="middle" x="-63.7933" y="21.985" font-family="Times New Roman,serif" font-size="14.00">n</text>
146 <g id="edge7" class="edge">
147 <title>S&#45;I&#45;&#45;student</title>
148 <path fill="none" stroke="black" d="M83.94,-254.18C89.72,-241.63 98.12,-223.41 104.36,-209.87"/>
149 <text text-anchor="middle" x="90.65" y="-235.83" font-family="Times New Roman,serif" font-size="14.00">n</text>
126150 </g>
127151 </g>
128152 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
5 <!-- Title: %3 Pages: 1 -->
5 <!-- Pages: 1 -->
66 <svg width="170pt" height="83pt"
77 viewBox="0.00 0.00 170.25 82.95" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 78.9533)">
9 <title>%3</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-78.9533 166.255,-78.9533 166.255,4 -4,4"/>
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 78.95)">
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-78.95 166.25,-78.95 166.25,4 -4,4"/>
1110 <!-- backslash -->
12 <g id="node1" class="node"><title>backslash</title>
13 <ellipse fill="none" stroke="black" cx="27" cy="-37.4767" rx="27" ry="18"/>
14 <text text-anchor="middle" x="27" y="-33.7767" font-family="Times New Roman,serif" font-size="14.00">\</text>
11 <g id="node1" class="node">
12 <title>backslash</title>
13 <ellipse fill="none" stroke="black" cx="27" cy="-37.48" rx="27" ry="18"/>
14 <text text-anchor="middle" x="27" y="-33.78" font-family="Times New Roman,serif" font-size="14.00">\</text>
1515 </g>
1616 <!-- multi_line -->
17 <g id="node2" class="node"><title>multi_line</title>
18 <ellipse fill="none" stroke="black" cx="117" cy="-37.4767" rx="45.011" ry="37.4533"/>
19 <text text-anchor="middle" x="117" y="-48.7767" font-family="Times New Roman,serif" font-size="14.00">centered</text>
20 <text text-anchor="start" x="93" y="-33.7767" font-family="Times New Roman,serif" font-size="14.00">left</text>
21 <text text-anchor="end" x="141" y="-18.7767" font-family="Times New Roman,serif" font-size="14.00">right</text>
17 <g id="node2" class="node">
18 <title>multi_line</title>
19 <ellipse fill="none" stroke="black" cx="117" cy="-37.48" rx="45.01" ry="37.45"/>
20 <text text-anchor="middle" x="117" y="-48.78" font-family="Times New Roman,serif" font-size="14.00">centered</text>
21 <text text-anchor="start" x="93" y="-33.78" font-family="Times New Roman,serif" font-size="14.00">left</text>
22 <text text-anchor="end" x="141" y="-18.78" font-family="Times New Roman,serif" font-size="14.00">right</text>
2223 </g>
2324 </g>
2425 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: G Pages: 1 -->
6 <svg width="358pt" height="228pt"
7 viewBox="0.00 0.00 358.00 228.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 224)">
6 <svg width="376pt" height="298pt"
7 viewBox="0.00 0.00 376.00 298.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 294)">
99 <title>G</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-224 354,-224 354,4 -4,4"/>
11 <g id="clust1" class="cluster"><title>clusterA</title>
12 <polygon fill="none" stroke="black" points="-0.286448,0.321491 -0.286448,-114.679 205.714,-114.679 205.714,0.321491 -0.286448,0.321491"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-294 372,-294 372,4 -4,4"/>
11 <g id="clust1" class="cluster">
12 <title>clusterA</title>
13 <polygon fill="none" stroke="black" points="0.02,0.36 0.02,-214.64 187.02,-214.64 187.02,0.36 0.02,0.36"/>
1314 </g>
14 <g id="clust2" class="cluster"><title>clusterC</title>
15 <polygon fill="none" stroke="black" points="20.8944,-7.98378 20.8944,-106.984 91.8944,-106.984 91.8944,-7.98378 20.8944,-7.98378"/>
15 <g id="clust2" class="cluster">
16 <title>clusterC</title>
17 <polygon fill="none" stroke="black" points="108.23,-107.64 108.23,-206.64 179.23,-206.64 179.23,-107.64 108.23,-107.64"/>
1618 </g>
17 <g id="clust3" class="cluster"><title>clusterB</title>
18 <polygon fill="none" stroke="black" points="173.23,-122.813 173.23,-219.813 284.23,-219.813 284.23,-122.813 173.23,-122.813"/>
19 <g id="clust3" class="cluster">
20 <title>clusterB</title>
21 <polygon fill="none" stroke="black" points="200.19,-193.25 200.19,-290.25 311.19,-290.25 311.19,-193.25 200.19,-193.25"/>
1922 </g>
2023 <!-- e -->
21 <g id="node1" class="node"><title>e</title>
22 <ellipse fill="none" stroke="black" cx="322.521" cy="-65.7223" rx="27" ry="18"/>
23 <text text-anchor="middle" x="322.521" y="-62.0223" font-family="Times New Roman,serif" font-size="14.00">e</text>
24 <g id="node1" class="node">
25 <title>e</title>
26 <ellipse fill="none" stroke="black" cx="340.72" cy="-129.63" rx="27" ry="18"/>
27 <text text-anchor="middle" x="340.72" y="-125.93" font-family="Times New Roman,serif" font-size="14.00">e</text>
2428 </g>
2529 <!-- __0:clusterB -->
2630 <!-- e&#45;&#45;__0:clusterB -->
27 <g id="edge7" class="edge"><title>e&#45;&#45;__0:clusterB</title>
28 <path fill="none" stroke="black" d="M308.682,-81.3026C298.898,-92.3171 285.209,-107.728 271.92,-122.69"/>
31 <g id="edge7" class="edge">
32 <title>e&#45;&#45;__0:clusterB</title>
33 <path fill="none" stroke="black" d="M328.53,-145.69C319.07,-158.17 305.43,-176.15 292.51,-193.19"/>
2934 </g>
3035 <!-- a -->
31 <g id="node2" class="node"><title>a</title>
32 <ellipse fill="none" stroke="black" cx="134.278" cy="-26.0511" rx="27" ry="18"/>
33 <text text-anchor="middle" x="134.278" y="-22.3511" font-family="Times New Roman,serif" font-size="14.00">a</text>
36 <g id="node2" class="node">
37 <title>a</title>
38 <ellipse fill="none" stroke="black" cx="34.58" cy="-26.01" rx="27" ry="18"/>
39 <text text-anchor="middle" x="34.58" y="-22.31" font-family="Times New Roman,serif" font-size="14.00">a</text>
3440 </g>
3541 <!-- b -->
36 <g id="node3" class="node"><title>b</title>
37 <ellipse fill="none" stroke="black" cx="170.748" cy="-72.6047" rx="27" ry="18"/>
38 <text text-anchor="middle" x="170.748" y="-68.9047" font-family="Times New Roman,serif" font-size="14.00">b</text>
42 <g id="node3" class="node">
43 <title>b</title>
44 <ellipse fill="none" stroke="black" cx="71.05" cy="-72.56" rx="27" ry="18"/>
45 <text text-anchor="middle" x="71.05" y="-68.86" font-family="Times New Roman,serif" font-size="14.00">b</text>
3946 </g>
4047 <!-- a&#45;&#45;b -->
41 <g id="edge1" class="edge"><title>a&#45;&#45;b</title>
42 <path fill="none" stroke="black" d="M146.829,-42.0722C150.455,-46.7013 154.415,-51.7557 158.05,-56.396"/>
48 <g id="edge1" class="edge">
49 <title>a&#45;&#45;b</title>
50 <path fill="none" stroke="black" d="M47.13,-42.03C50.76,-46.66 54.72,-51.71 58.36,-56.36"/>
4351 </g>
4452 <!-- C -->
45 <g id="node4" class="node"><title>C</title>
46 <ellipse fill="none" stroke="black" cx="55.9968" cy="-80.5593" rx="27" ry="18"/>
47 <text text-anchor="middle" x="55.9968" y="-76.8593" font-family="Times New Roman,serif" font-size="14.00">C</text>
53 <g id="node4" class="node">
54 <title>C</title>
55 <ellipse fill="none" stroke="black" cx="143.34" cy="-180.22" rx="27" ry="18"/>
56 <text text-anchor="middle" x="143.34" y="-176.52" font-family="Times New Roman,serif" font-size="14.00">C</text>
4857 </g>
4958 <!-- D -->
50 <g id="node5" class="node"><title>D</title>
51 <ellipse fill="none" stroke="black" cx="56.7927" cy="-34.0413" rx="27" ry="18"/>
52 <text text-anchor="middle" x="56.7927" y="-30.3413" font-family="Times New Roman,serif" font-size="14.00">D</text>
59 <g id="node5" class="node">
60 <title>D</title>
61 <ellipse fill="none" stroke="black" cx="144.13" cy="-133.7" rx="27" ry="18"/>
62 <text text-anchor="middle" x="144.13" y="-130" font-family="Times New Roman,serif" font-size="14.00">D</text>
5363 </g>
5464 <!-- C&#45;&#45;D -->
55 <g id="edge2" class="edge"><title>C&#45;&#45;D</title>
56 <path fill="none" stroke="black" d="M56.3068,-62.441C56.3644,-59.0736 56.4246,-55.5549 56.4823,-52.1866"/>
65 <g id="edge2" class="edge">
66 <title>C&#45;&#45;D</title>
67 <path fill="none" stroke="black" d="M143.65,-162.1C143.7,-158.73 143.76,-155.21 143.82,-151.85"/>
5768 </g>
5869 <!-- d -->
59 <g id="node6" class="node"><title>d</title>
60 <ellipse fill="none" stroke="black" cx="207.825" cy="-148.66" rx="27" ry="18"/>
61 <text text-anchor="middle" x="207.825" y="-144.96" font-family="Times New Roman,serif" font-size="14.00">d</text>
70 <g id="node6" class="node">
71 <title>d</title>
72 <ellipse fill="none" stroke="black" cx="234.78" cy="-219.09" rx="27" ry="18"/>
73 <text text-anchor="middle" x="234.78" y="-215.39" font-family="Times New Roman,serif" font-size="14.00">d</text>
6274 </g>
6375 <!-- d&#45;&#45;D -->
64 <g id="edge4" class="edge"><title>d&#45;&#45;D</title>
65 <path fill="none" stroke="black" d="M189.906,-135.062C160.839,-113.002 103.74,-69.67 74.6878,-47.622"/>
76 <g id="edge4" class="edge">
77 <title>d&#45;&#45;D</title>
78 <path fill="none" stroke="black" d="M218.99,-204.22C202.35,-188.55 176.31,-164.01 159.74,-148.4"/>
6679 </g>
6780 <!-- f -->
68 <g id="node7" class="node"><title>f</title>
69 <ellipse fill="none" stroke="black" cx="249.356" cy="-193.971" rx="27" ry="18"/>
70 <text text-anchor="middle" x="249.356" y="-190.271" font-family="Times New Roman,serif" font-size="14.00">f</text>
81 <g id="node7" class="node">
82 <title>f</title>
83 <ellipse fill="none" stroke="black" cx="276.31" cy="-264.41" rx="27" ry="18"/>
84 <text text-anchor="middle" x="276.31" y="-260.71" font-family="Times New Roman,serif" font-size="14.00">f</text>
7185 </g>
7286 <!-- d&#45;&#45;f -->
73 <g id="edge3" class="edge"><title>d&#45;&#45;f</title>
74 <path fill="none" stroke="black" d="M222.117,-164.254C226.341,-168.861 230.961,-173.902 235.177,-178.502"/>
87 <g id="edge3" class="edge">
88 <title>d&#45;&#45;f</title>
89 <path fill="none" stroke="black" d="M249.08,-234.69C253.3,-239.3 257.92,-244.34 262.14,-248.94"/>
7590 </g>
7691 <!-- __1:clusterC -->
7792 <!-- __2:clusterB -->
7893 <!-- __1:clusterC&#45;&#45;__2:clusterB -->
79 <g id="edge8" class="edge"><title>__1:clusterC&#45;&#45;__2:clusterB</title>
80 <path fill="none" stroke="black" d="M92.1025,-81.0693C115.468,-96.5027 146.478,-116.984 173.047,-134.534"/>
94 <g id="edge8" class="edge">
95 <title>__1:clusterC&#45;&#45;__2:clusterB</title>
96 <path fill="none" stroke="black" d="M179.47,-184.14C185.99,-189.08 192.94,-194.33 199.89,-199.58"/>
8197 </g>
8298 </g>
8399 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: finite_state_machine Pages: 1 -->
66 <svg width="576pt" height="258pt"
77 viewBox="0.00 0.00 576.00 258.45" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(0.769883 0.769883) rotate(0) translate(4 331.694)">
8 <g id="graph0" class="graph" transform="scale(0.77 0.77) rotate(0) translate(4 331.69)">
99 <title>finite_state_machine</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-331.694 744.166,-331.694 744.166,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-331.69 744.17,-331.69 744.17,4 -4,4"/>
1111 <!-- LR_0 -->
12 <g id="node1" class="node"><title>LR_0</title>
13 <ellipse fill="none" stroke="black" cx="35.8472" cy="-106.847" rx="31.712" ry="31.712"/>
14 <ellipse fill="none" stroke="black" cx="35.8472" cy="-106.847" rx="35.695" ry="35.695"/>
15 <text text-anchor="middle" x="35.8472" y="-103.147" font-family="Times New Roman,serif" font-size="14.00">LR_0</text>
12 <g id="node1" class="node">
13 <title>LR_0</title>
14 <ellipse fill="none" stroke="black" cx="35.85" cy="-83.85" rx="31.71" ry="31.71"/>
15 <ellipse fill="none" stroke="black" cx="35.85" cy="-83.85" rx="35.69" ry="35.69"/>
16 <text text-anchor="middle" x="35.85" y="-80.15" font-family="Times New Roman,serif" font-size="14.00">LR_0</text>
1617 </g>
1718 <!-- LR_2 -->
18 <g id="node5" class="node"><title>LR_2</title>
19 <ellipse fill="none" stroke="black" cx="174.542" cy="-146.847" rx="31.6951" ry="31.6951"/>
20 <text text-anchor="middle" x="174.542" y="-143.147" font-family="Times New Roman,serif" font-size="14.00">LR_2</text>
19 <g id="node5" class="node">
20 <title>LR_2</title>
21 <ellipse fill="none" stroke="black" cx="174.54" cy="-151.85" rx="31.7" ry="31.7"/>
22 <text text-anchor="middle" x="174.54" y="-148.15" font-family="Times New Roman,serif" font-size="14.00">LR_2</text>
2123 </g>
2224 <!-- LR_0&#45;&gt;LR_2 -->
23 <g id="edge1" class="edge"><title>LR_0&#45;&gt;LR_2</title>
24 <path fill="none" stroke="black" d="M70.6368,-116.735C89.8449,-122.356 113.995,-129.422 134.071,-135.297"/>
25 <polygon fill="black" stroke="black" points="133.274,-138.711 143.855,-138.16 135.24,-131.992 133.274,-138.711"/>
26 <text text-anchor="middle" x="107.194" y="-135.647" font-family="Times New Roman,serif" font-size="14.00">SS(B)</text>
25 <g id="edge1" class="edge">
26 <title>LR_0&#45;&gt;LR_2</title>
27 <path fill="none" stroke="black" d="M68.21,-99.45C88.53,-109.56 115.1,-122.77 136.47,-133.4"/>
28 <polygon fill="black" stroke="black" points="135.06,-136.61 145.58,-137.94 138.18,-130.35 135.06,-136.61"/>
29 <text text-anchor="middle" x="107.19" y="-129.65" font-family="Times New Roman,serif" font-size="14.00">SS(B)</text>
2730 </g>
2831 <!-- LR_1 -->
29 <g id="node6" class="node"><title>LR_1</title>
30 <ellipse fill="none" stroke="black" cx="174.542" cy="-54.8472" rx="31.6951" ry="31.6951"/>
31 <text text-anchor="middle" x="174.542" y="-51.1472" font-family="Times New Roman,serif" font-size="14.00">LR_1</text>
32 <g id="node6" class="node">
33 <title>LR_1</title>
34 <ellipse fill="none" stroke="black" cx="174.54" cy="-42.85" rx="31.7" ry="31.7"/>
35 <text text-anchor="middle" x="174.54" y="-39.15" font-family="Times New Roman,serif" font-size="14.00">LR_1</text>
3236 </g>
3337 <!-- LR_0&#45;&gt;LR_1 -->
34 <g id="edge2" class="edge"><title>LR_0&#45;&gt;LR_1</title>
35 <path fill="none" stroke="black" d="M69.5889,-94.3919C89.2263,-86.9216 114.304,-77.3816 134.909,-69.5435"/>
36 <polygon fill="black" stroke="black" points="136.22,-72.7895 144.322,-65.9626 133.731,-66.2469 136.22,-72.7895"/>
37 <text text-anchor="middle" x="107.194" y="-89.6472" font-family="Times New Roman,serif" font-size="14.00">SS(S)</text>
38 <g id="edge2" class="edge">
39 <title>LR_0&#45;&gt;LR_1</title>
40 <path fill="none" stroke="black" d="M70.29,-73.82C89.49,-68.06 113.72,-60.79 133.88,-54.74"/>
41 <polygon fill="black" stroke="black" points="135.13,-58.02 143.7,-51.8 133.12,-51.32 135.13,-58.02"/>
42 <text text-anchor="middle" x="107.19" y="-71.65" font-family="Times New Roman,serif" font-size="14.00">SS(S)</text>
3843 </g>
3944 <!-- LR_3 -->
40 <g id="node2" class="node"><title>LR_3</title>
41 <ellipse fill="none" stroke="black" cx="323.236" cy="-35.8472" rx="31.712" ry="31.712"/>
42 <ellipse fill="none" stroke="black" cx="323.236" cy="-35.8472" rx="35.695" ry="35.695"/>
43 <text text-anchor="middle" x="323.236" y="-32.1472" font-family="Times New Roman,serif" font-size="14.00">LR_3</text>
45 <g id="node2" class="node">
46 <title>LR_3</title>
47 <ellipse fill="none" stroke="black" cx="323.24" cy="-35.85" rx="31.71" ry="31.71"/>
48 <ellipse fill="none" stroke="black" cx="323.24" cy="-35.85" rx="35.69" ry="35.69"/>
49 <text text-anchor="middle" x="323.24" y="-32.15" font-family="Times New Roman,serif" font-size="14.00">LR_3</text>
4450 </g>
4551 <!-- LR_4 -->
46 <g id="node3" class="node"><title>LR_4</title>
47 <ellipse fill="none" stroke="black" cx="323.236" cy="-291.847" rx="31.712" ry="31.712"/>
48 <ellipse fill="none" stroke="black" cx="323.236" cy="-291.847" rx="35.695" ry="35.695"/>
49 <text text-anchor="middle" x="323.236" y="-288.147" font-family="Times New Roman,serif" font-size="14.00">LR_4</text>
52 <g id="node3" class="node">
53 <title>LR_4</title>
54 <ellipse fill="none" stroke="black" cx="323.24" cy="-291.85" rx="31.71" ry="31.71"/>
55 <ellipse fill="none" stroke="black" cx="323.24" cy="-291.85" rx="35.69" ry="35.69"/>
56 <text text-anchor="middle" x="323.24" y="-288.15" font-family="Times New Roman,serif" font-size="14.00">LR_4</text>
5057 </g>
5158 <!-- LR_8 -->
52 <g id="node4" class="node"><title>LR_8</title>
53 <ellipse fill="none" stroke="black" cx="704.319" cy="-147.847" rx="31.712" ry="31.712"/>
54 <ellipse fill="none" stroke="black" cx="704.319" cy="-147.847" rx="35.695" ry="35.695"/>
55 <text text-anchor="middle" x="704.319" y="-144.147" font-family="Times New Roman,serif" font-size="14.00">LR_8</text>
59 <g id="node4" class="node">
60 <title>LR_8</title>
61 <ellipse fill="none" stroke="black" cx="704.32" cy="-152.85" rx="31.71" ry="31.71"/>
62 <ellipse fill="none" stroke="black" cx="704.32" cy="-152.85" rx="35.69" ry="35.69"/>
63 <text text-anchor="middle" x="704.32" y="-149.15" font-family="Times New Roman,serif" font-size="14.00">LR_8</text>
5664 </g>
5765 <!-- LR_6 -->
58 <g id="node7" class="node"><title>LR_6</title>
59 <ellipse fill="none" stroke="black" cx="323.236" cy="-172.847" rx="31.6951" ry="31.6951"/>
60 <text text-anchor="middle" x="323.236" y="-169.147" font-family="Times New Roman,serif" font-size="14.00">LR_6</text>
66 <g id="node7" class="node">
67 <title>LR_6</title>
68 <ellipse fill="none" stroke="black" cx="323.24" cy="-172.85" rx="31.7" ry="31.7"/>
69 <text text-anchor="middle" x="323.24" y="-169.15" font-family="Times New Roman,serif" font-size="14.00">LR_6</text>
6170 </g>
6271 <!-- LR_8&#45;&gt;LR_6 -->
63 <g id="edge13" class="edge"><title>LR_8&#45;&gt;LR_6</title>
64 <path fill="none" stroke="black" d="M669.127,-154.782C625.934,-163.158 549.217,-176.756 482.777,-181.847 454.552,-184.01 447.36,-183.186 419.083,-181.847 401.296,-181.005 381.696,-179.28 364.953,-177.563"/>
65 <polygon fill="black" stroke="black" points="365.251,-174.075 354.939,-176.503 364.515,-181.036 365.251,-174.075"/>
66 <text text-anchor="middle" x="513.277" y="-184.647" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
72 <g id="edge13" class="edge">
73 <title>LR_8&#45;&gt;LR_6</title>
74 <path fill="none" stroke="black" d="M668.7,-158.83C625.38,-165.98 548.87,-177.52 482.78,-181.85 454.53,-183.7 447.36,-183.19 419.08,-181.85 401.3,-181.01 381.7,-179.28 364.95,-177.56"/>
75 <polygon fill="black" stroke="black" points="365.25,-174.07 354.94,-176.5 364.51,-181.04 365.25,-174.07"/>
76 <text text-anchor="middle" x="513.28" y="-183.65" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
6777 </g>
6878 <!-- LR_5 -->
69 <g id="node8" class="node"><title>LR_5</title>
70 <ellipse fill="none" stroke="black" cx="450.93" cy="-107.847" rx="31.6951" ry="31.6951"/>
71 <text text-anchor="middle" x="450.93" y="-104.147" font-family="Times New Roman,serif" font-size="14.00">LR_5</text>
79 <g id="node8" class="node">
80 <title>LR_5</title>
81 <ellipse fill="none" stroke="black" cx="450.93" cy="-107.85" rx="31.7" ry="31.7"/>
82 <text text-anchor="middle" x="450.93" y="-104.15" font-family="Times New Roman,serif" font-size="14.00">LR_5</text>
7283 </g>
7384 <!-- LR_8&#45;&gt;LR_5 -->
74 <g id="edge14" class="edge"><title>LR_8&#45;&gt;LR_5</title>
75 <path fill="none" stroke="black" d="M668.545,-142.414C628.191,-136.095 559.65,-125.319 500.777,-115.847 498.086,-115.414 495.312,-114.966 492.517,-114.512"/>
76 <polygon fill="black" stroke="black" points="492.845,-111.02 482.413,-112.867 491.72,-117.929 492.845,-111.02"/>
77 <text text-anchor="middle" x="575.625" y="-137.647" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
85 <g id="edge14" class="edge">
86 <title>LR_8&#45;&gt;LR_5</title>
87 <path fill="none" stroke="black" d="M668.83,-147.36C628.46,-140.82 559.62,-129.34 500.78,-117.85 497.99,-117.3 495.11,-116.73 492.22,-116.15"/>
88 <polygon fill="black" stroke="black" points="492.89,-112.72 482.4,-114.17 491.51,-119.58 492.89,-112.72"/>
89 <text text-anchor="middle" x="575.62" y="-139.65" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
7890 </g>
7991 <!-- LR_2&#45;&gt;LR_4 -->
80 <g id="edge6" class="edge"><title>LR_2&#45;&gt;LR_4</title>
81 <path fill="none" stroke="black" d="M197.821,-168.87C222.322,-193.087 261.915,-232.223 289.846,-259.831"/>
82 <polygon fill="black" stroke="black" points="287.463,-262.397 297.035,-266.938 292.384,-257.418 287.463,-262.397"/>
83 <text text-anchor="middle" x="246.889" y="-239.647" font-family="Times New Roman,serif" font-size="14.00">S(A)</text>
92 <g id="edge6" class="edge">
93 <title>LR_2&#45;&gt;LR_4</title>
94 <path fill="none" stroke="black" d="M198.14,-173.42C222.46,-196.62 261.37,-233.76 289.13,-260.26"/>
95 <polygon fill="black" stroke="black" points="287,-263.06 296.65,-267.43 291.83,-257.99 287,-263.06"/>
96 <text text-anchor="middle" x="246.89" y="-241.65" font-family="Times New Roman,serif" font-size="14.00">S(A)</text>
8497 </g>
8598 <!-- LR_2&#45;&gt;LR_6 -->
86 <g id="edge4" class="edge"><title>LR_2&#45;&gt;LR_6</title>
87 <path fill="none" stroke="black" d="M205.937,-152.234C227.893,-156.126 257.777,-161.422 281.754,-165.672"/>
88 <polygon fill="black" stroke="black" points="281.17,-169.123 291.628,-167.422 282.392,-162.231 281.17,-169.123"/>
89 <text text-anchor="middle" x="246.889" y="-167.647" font-family="Times New Roman,serif" font-size="14.00">SS(b)</text>
99 <g id="edge4" class="edge">
100 <title>LR_2&#45;&gt;LR_6</title>
101 <path fill="none" stroke="black" d="M206.29,-156.25C228.1,-159.37 257.6,-163.59 281.38,-167"/>
102 <polygon fill="black" stroke="black" points="281.13,-170.5 291.52,-168.45 282.12,-163.57 281.13,-170.5"/>
103 <text text-anchor="middle" x="246.89" y="-167.65" font-family="Times New Roman,serif" font-size="14.00">SS(b)</text>
90104 </g>
91105 <!-- LR_2&#45;&gt;LR_5 -->
92 <g id="edge5" class="edge"><title>LR_2&#45;&gt;LR_5</title>
93 <path fill="none" stroke="black" d="M205.087,-137.127C227.428,-130.219 259.001,-121.39 287.389,-116.847 328.309,-110.299 375.679,-108.299 408.684,-107.786"/>
94 <polygon fill="black" stroke="black" points="408.911,-111.284 418.87,-107.668 408.829,-104.284 408.911,-111.284"/>
95 <text text-anchor="middle" x="323.236" y="-120.647" font-family="Times New Roman,serif" font-size="14.00">SS(a)</text>
106 <g id="edge5" class="edge">
107 <title>LR_2&#45;&gt;LR_5</title>
108 <path fill="none" stroke="black" d="M204.48,-140.61C226.77,-132.49 258.56,-122.07 287.39,-116.85 328.17,-109.46 375.56,-107.58 408.61,-107.32"/>
109 <polygon fill="black" stroke="black" points="408.82,-110.82 418.81,-107.29 408.8,-103.82 408.82,-110.82"/>
110 <text text-anchor="middle" x="323.24" y="-120.65" font-family="Times New Roman,serif" font-size="14.00">SS(a)</text>
96111 </g>
97112 <!-- LR_1&#45;&gt;LR_3 -->
98 <g id="edge3" class="edge"><title>LR_1&#45;&gt;LR_3</title>
99 <path fill="none" stroke="black" d="M206.293,-50.8642C226.839,-48.2031 254.208,-44.6582 277.196,-41.6808"/>
100 <polygon fill="black" stroke="black" points="277.941,-45.1136 287.409,-40.358 277.042,-38.1716 277.941,-45.1136"/>
101 <text text-anchor="middle" x="246.889" y="-52.6472" font-family="Times New Roman,serif" font-size="14.00">S($end)</text>
113 <g id="edge3" class="edge">
114 <title>LR_1&#45;&gt;LR_3</title>
115 <path fill="none" stroke="black" d="M206.65,-41.36C227.15,-40.38 254.31,-39.09 277.16,-38"/>
116 <polygon fill="black" stroke="black" points="277.49,-41.49 287.31,-37.51 277.16,-34.49 277.49,-41.49"/>
117 <text text-anchor="middle" x="246.89" y="-44.65" font-family="Times New Roman,serif" font-size="14.00">S($end)</text>
102118 </g>
103119 <!-- LR_6&#45;&gt;LR_6 -->
104 <g id="edge9" class="edge"><title>LR_6&#45;&gt;LR_6</title>
105 <path fill="none" stroke="black" d="M311.262,-202.528C310.87,-213.589 314.861,-222.694 323.236,-222.694 328.863,-222.694 332.511,-218.584 334.18,-212.532"/>
106 <polygon fill="black" stroke="black" points="337.667,-212.834 335.21,-202.528 330.704,-212.117 337.667,-212.834"/>
107 <text text-anchor="middle" x="323.236" y="-226.494" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
120 <g id="edge9" class="edge">
121 <title>LR_6&#45;&gt;LR_6</title>
122 <path fill="none" stroke="black" d="M311.26,-202.53C310.87,-213.59 314.86,-222.69 323.24,-222.69 328.86,-222.69 332.51,-218.58 334.18,-212.53"/>
123 <polygon fill="black" stroke="black" points="337.67,-212.83 335.21,-202.53 330.7,-212.12 337.67,-212.83"/>
124 <text text-anchor="middle" x="323.24" y="-226.49" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
108125 </g>
109126 <!-- LR_6&#45;&gt;LR_5 -->
110 <g id="edge10" class="edge"><title>LR_6&#45;&gt;LR_5</title>
111 <path fill="none" stroke="black" d="M351.82,-158.583C369.912,-149.227 393.768,-136.89 413.426,-126.724"/>
112 <polygon fill="black" stroke="black" points="415.136,-129.781 422.41,-122.078 411.92,-123.563 415.136,-129.781"/>
113 <text text-anchor="middle" x="389.083" y="-148.647" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
127 <g id="edge10" class="edge">
128 <title>LR_6&#45;&gt;LR_5</title>
129 <path fill="none" stroke="black" d="M351.82,-158.58C369.91,-149.23 393.77,-136.89 413.43,-126.72"/>
130 <polygon fill="black" stroke="black" points="415.14,-129.78 422.41,-122.08 411.92,-123.56 415.14,-129.78"/>
131 <text text-anchor="middle" x="389.08" y="-147.65" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
114132 </g>
115133 <!-- LR_5&#45;&gt;LR_5 -->
116 <g id="edge8" class="edge"><title>LR_5&#45;&gt;LR_5</title>
117 <path fill="none" stroke="black" d="M439.691,-138.022C439.45,-148.859 443.196,-157.694 450.93,-157.694 456.006,-157.694 459.364,-153.889 461.005,-148.211"/>
118 <polygon fill="black" stroke="black" points="464.511,-148.355 462.169,-138.022 457.556,-147.56 464.511,-148.355"/>
119 <text text-anchor="middle" x="450.93" y="-161.494" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
134 <g id="edge8" class="edge">
135 <title>LR_5&#45;&gt;LR_5</title>
136 <path fill="none" stroke="black" d="M439.69,-138.02C439.45,-148.86 443.2,-157.69 450.93,-157.69 456.01,-157.69 459.36,-153.89 461,-148.21"/>
137 <polygon fill="black" stroke="black" points="464.51,-148.35 462.17,-138.02 457.56,-147.56 464.51,-148.35"/>
138 <text text-anchor="middle" x="450.93" y="-161.49" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
120139 </g>
121140 <!-- LR_7 -->
122 <g id="node9" class="node"><title>LR_7</title>
123 <ellipse fill="none" stroke="black" cx="575.625" cy="-79.8472" rx="31.6951" ry="31.6951"/>
124 <text text-anchor="middle" x="575.625" y="-76.1472" font-family="Times New Roman,serif" font-size="14.00">LR_7</text>
141 <g id="node9" class="node">
142 <title>LR_7</title>
143 <ellipse fill="none" stroke="black" cx="575.62" cy="-84.85" rx="31.7" ry="31.7"/>
144 <text text-anchor="middle" x="575.62" y="-81.15" font-family="Times New Roman,serif" font-size="14.00">LR_7</text>
125145 </g>
126146 <!-- LR_5&#45;&gt;LR_7 -->
127 <g id="edge7" class="edge"><title>LR_5&#45;&gt;LR_7</title>
128 <path fill="none" stroke="black" d="M482.259,-100.926C497.891,-97.3585 517.169,-92.959 534.063,-89.1037"/>
129 <polygon fill="black" stroke="black" points="535.249,-92.4232 544.219,-86.7859 533.691,-85.5986 535.249,-92.4232"/>
130 <text text-anchor="middle" x="513.277" y="-100.647" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
147 <g id="edge7" class="edge">
148 <title>LR_5&#45;&gt;LR_7</title>
149 <path fill="none" stroke="black" d="M482.57,-102.1C498.09,-99.19 517.14,-95.62 533.88,-92.49"/>
150 <polygon fill="black" stroke="black" points="534.76,-95.88 543.95,-90.6 533.47,-89 534.76,-95.88"/>
151 <text text-anchor="middle" x="513.28" y="-102.65" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
131152 </g>
132153 <!-- LR_7&#45;&gt;LR_8 -->
133 <g id="edge11" class="edge"><title>LR_7&#45;&gt;LR_8</title>
134 <path fill="none" stroke="black" d="M604.384,-94.3732C618.255,-101.666 635.28,-110.668 650.472,-118.847 654.739,-121.145 659.192,-123.56 663.624,-125.976"/>
135 <polygon fill="black" stroke="black" points="662.172,-129.17 672.625,-130.896 665.529,-123.028 662.172,-129.17"/>
136 <text text-anchor="middle" x="637.972" y="-122.647" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
154 <g id="edge11" class="edge">
155 <title>LR_7&#45;&gt;LR_8</title>
156 <path fill="none" stroke="black" d="M604.38,-99.37C618.26,-106.67 635.28,-115.67 650.47,-123.85 654.74,-126.14 659.19,-128.56 663.62,-130.98"/>
157 <polygon fill="black" stroke="black" points="662.17,-134.17 672.62,-135.9 665.53,-128.03 662.17,-134.17"/>
158 <text text-anchor="middle" x="637.97" y="-127.65" font-family="Times New Roman,serif" font-size="14.00">S(b)</text>
137159 </g>
138160 <!-- LR_7&#45;&gt;LR_5 -->
139 <g id="edge12" class="edge"><title>LR_7&#45;&gt;LR_5</title>
140 <path fill="none" stroke="black" d="M544.569,-71.6302C530.928,-69.2535 514.755,-68.3565 500.777,-72.8472 494.781,-74.7738 488.895,-77.7384 483.403,-81.1443"/>
141 <polygon fill="black" stroke="black" points="481.431,-78.2524 475.135,-86.7737 485.371,-84.0385 481.431,-78.2524"/>
142 <text text-anchor="middle" x="513.277" y="-76.6472" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
161 <g id="edge12" class="edge">
162 <title>LR_7&#45;&gt;LR_5</title>
163 <path fill="none" stroke="black" d="M545.05,-75.8C531.36,-72.99 515.01,-71.6 500.78,-75.85 495.43,-77.44 490.13,-79.83 485.1,-82.59"/>
164 <polygon fill="black" stroke="black" points="483.11,-79.7 476.38,-87.89 486.75,-85.69 483.11,-79.7"/>
165 <text text-anchor="middle" x="513.28" y="-79.65" font-family="Times New Roman,serif" font-size="14.00">S(a)</text>
143166 </g>
144167 </g>
145168 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: G Pages: 1 -->
66 <svg width="94pt" height="122pt"
1313 <stop offset="1" style="stop-color:pink;stop-opacity:1.;"/>
1414 </linearGradient>
1515 </defs>
16 <polygon fill="url(#l_0)" stroke="none" points="-4,4 -4,-118 90,-118 90,4 -4,4"/>
16 <polygon fill="url(#l_0)" stroke="transparent" points="-4,4 -4,-118 90,-118 90,4 -4,4"/>
1717 <text text-anchor="middle" x="43" y="-7.8" font-family="Times New Roman,serif" font-size="14.00" fill="white">agraph</text>
18 <g id="clust1" class="cluster"><title>cluster1</title>
18 <g id="clust1" class="cluster">
19 <title>cluster1</title>
1920 <defs>
2021 <linearGradient id="l_1" gradientUnits="userSpaceOnUse" x1="43" y1="-106" x2="43" y2="-31" >
2122 <stop offset="0" style="stop-color:blue;stop-opacity:1.;"/>
2627 <text text-anchor="middle" x="43" y="-90.8" font-family="Times New Roman,serif" font-size="14.00" fill="white">acluster</text>
2728 </g>
2829 <!-- anode -->
29 <g id="node1" class="node"><title>anode</title>
30 <g id="node1" class="node">
31 <title>anode</title>
3032 <defs>
3133 <linearGradient id="l_2" gradientUnits="userSpaceOnUse" x1="43" y1="-39" x2="43" y2="-75" >
3234 <stop offset="0" style="stop-color:red;stop-opacity:1.;"/>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: G Pages: 1 -->
66 <svg width="77pt" height="116pt"
77 viewBox="0.00 0.00 76.89 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
99 <title>G</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-112 72.8939,-112 72.8939,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-112 72.89,-112 72.89,4 -4,4"/>
1111 <!-- Hello -->
12 <g id="node1" class="node"><title>Hello</title>
13 <ellipse fill="none" stroke="black" cx="34.4469" cy="-90" rx="29.795" ry="18"/>
14 <text text-anchor="middle" x="34.4469" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">Hello</text>
12 <g id="node1" class="node">
13 <title>Hello</title>
14 <ellipse fill="none" stroke="black" cx="34.45" cy="-90" rx="29.8" ry="18"/>
15 <text text-anchor="middle" x="34.45" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">Hello</text>
1516 </g>
1617 <!-- World -->
17 <g id="node2" class="node"><title>World</title>
18 <ellipse fill="none" stroke="black" cx="34.4469" cy="-18" rx="34.394" ry="18"/>
19 <text text-anchor="middle" x="34.4469" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">World</text>
18 <g id="node2" class="node">
19 <title>World</title>
20 <ellipse fill="none" stroke="black" cx="34.45" cy="-18" rx="34.39" ry="18"/>
21 <text text-anchor="middle" x="34.45" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">World</text>
2022 </g>
2123 <!-- Hello&#45;&gt;World -->
22 <g id="edge1" class="edge"><title>Hello&#45;&gt;World</title>
23 <path fill="none" stroke="black" d="M34.4469,-71.6966C34.4469,-63.9827 34.4469,-54.7125 34.4469,-46.1124"/>
24 <polygon fill="black" stroke="black" points="37.947,-46.1043 34.4469,-36.1043 30.947,-46.1044 37.947,-46.1043"/>
24 <g id="edge1" class="edge">
25 <title>Hello&#45;&gt;World</title>
26 <path fill="none" stroke="black" d="M34.45,-71.7C34.45,-63.98 34.45,-54.71 34.45,-46.11"/>
27 <polygon fill="black" stroke="black" points="37.95,-46.1 34.45,-36.1 30.95,-46.1 37.95,-46.1"/>
2528 </g>
2629 </g>
2730 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: the holy hand grenade Pages: 1 -->
66 <svg width="332pt" height="44pt"
77 viewBox="0.00 0.00 332.00 44.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 40)">
99 <title>the holy hand grenade</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-40 328,-40 328,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-40 328,-40 328,4 -4,4"/>
1111 <!-- 1 -->
12 <g id="node1" class="node"><title>1</title>
12 <g id="node1" class="node">
13 <title>1</title>
1314 <ellipse fill="none" stroke="black" cx="27" cy="-18" rx="27" ry="18"/>
1415 <text text-anchor="middle" x="27" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">1</text>
1516 </g>
1617 <!-- 2 -->
17 <g id="node2" class="node"><title>2</title>
18 <g id="node2" class="node">
19 <title>2</title>
1820 <ellipse fill="none" stroke="black" cx="117" cy="-18" rx="27" ry="18"/>
1921 <text text-anchor="middle" x="117" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">2</text>
2022 </g>
2123 <!-- 1&#45;&gt;2 -->
22 <g id="edge1" class="edge"><title>1&#45;&gt;2</title>
23 <path fill="none" stroke="black" d="M54.4029,-18C62.3932,-18 71.3106,-18 79.8241,-18"/>
24 <polygon fill="black" stroke="black" points="79.919,-21.5001 89.919,-18 79.919,-14.5001 79.919,-21.5001"/>
24 <g id="edge1" class="edge">
25 <title>1&#45;&gt;2</title>
26 <path fill="none" stroke="black" d="M54.4,-18C62.39,-18 71.31,-18 79.82,-18"/>
27 <polygon fill="black" stroke="black" points="79.92,-21.5 89.92,-18 79.92,-14.5 79.92,-21.5"/>
2528 </g>
2629 <!-- 3 -->
27 <g id="node3" class="node"><title>3</title>
30 <g id="node3" class="node">
31 <title>3</title>
2832 <ellipse fill="none" stroke="black" cx="207" cy="-18" rx="27" ry="18"/>
2933 <text text-anchor="middle" x="207" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">3</text>
3034 </g>
3135 <!-- 2&#45;&gt;3 -->
32 <g id="edge2" class="edge"><title>2&#45;&gt;3</title>
33 <path fill="none" stroke="black" d="M144.403,-18C152.393,-18 161.311,-18 169.824,-18"/>
34 <polygon fill="black" stroke="black" points="169.919,-21.5001 179.919,-18 169.919,-14.5001 169.919,-21.5001"/>
36 <g id="edge2" class="edge">
37 <title>2&#45;&gt;3</title>
38 <path fill="none" stroke="black" d="M144.4,-18C152.39,-18 161.31,-18 169.82,-18"/>
39 <polygon fill="black" stroke="black" points="169.92,-21.5 179.92,-18 169.92,-14.5 169.92,-21.5"/>
3540 </g>
3641 <!-- lob -->
37 <g id="node4" class="node"><title>lob</title>
42 <g id="node4" class="node">
43 <title>lob</title>
3844 <ellipse fill="none" stroke="black" cx="297" cy="-18" rx="27" ry="18"/>
3945 <text text-anchor="middle" x="297" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">lob</text>
4046 </g>
4147 <!-- 3&#45;&gt;lob -->
42 <g id="edge3" class="edge"><title>3&#45;&gt;lob</title>
43 <path fill="none" stroke="black" d="M234.403,-18C242.393,-18 251.311,-18 259.824,-18"/>
44 <polygon fill="black" stroke="black" points="259.919,-21.5001 269.919,-18 259.919,-14.5001 259.919,-21.5001"/>
48 <g id="edge3" class="edge">
49 <title>3&#45;&gt;lob</title>
50 <path fill="none" stroke="black" d="M234.4,-18C242.39,-18 251.31,-18 259.82,-18"/>
51 <polygon fill="black" stroke="black" points="259.92,-21.5 269.92,-18 259.92,-14.5 259.92,-21.5"/>
4552 </g>
4653 </g>
4754 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: html_table Pages: 1 -->
66 <svg width="120pt" height="57pt"
77 viewBox="0.00 0.00 119.72 57.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 53.4975)">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 53.5)">
99 <title>html_table</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-53.4975 115.723,-53.4975 115.723,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-53.5 115.72,-53.5 115.72,4 -4,4"/>
1111 <!-- tab -->
12 <g id="node1" class="node"><title>tab</title>
13 <ellipse fill="none" stroke="black" cx="55.8614" cy="-24.7487" rx="55.7232" ry="25"/>
14 <polygon fill="none" stroke="black" points="27.8614,-13.7487 27.8614,-34.7487 51.8614,-34.7487 51.8614,-13.7487 27.8614,-13.7487"/>
15 <text text-anchor="start" x="30.8614" y="-20.5487" font-family="Times New Roman,serif" font-size="14.00">left</text>
16 <polygon fill="none" stroke="black" points="53.8614,-13.7487 53.8614,-34.7487 84.8614,-34.7487 84.8614,-13.7487 53.8614,-13.7487"/>
17 <text text-anchor="start" x="56.8614" y="-20.5487" font-family="Times New Roman,serif" font-size="14.00">right</text>
18 <polygon fill="none" stroke="black" points="24.3614,-11.2487 24.3614,-38.2487 87.3614,-38.2487 87.3614,-11.2487 24.3614,-11.2487"/>
12 <g id="node1" class="node">
13 <title>tab</title>
14 <ellipse fill="none" stroke="black" cx="55.86" cy="-24.75" rx="55.72" ry="25"/>
15 <polygon fill="none" stroke="black" points="27.86,-13.75 27.86,-34.75 51.86,-34.75 51.86,-13.75 27.86,-13.75"/>
16 <text text-anchor="start" x="30.86" y="-20.55" font-family="Times New Roman,serif" font-size="14.00">left</text>
17 <polygon fill="none" stroke="black" points="53.86,-13.75 53.86,-34.75 84.86,-34.75 84.86,-13.75 53.86,-13.75"/>
18 <text text-anchor="start" x="56.86" y="-20.55" font-family="Times New Roman,serif" font-size="14.00">right</text>
19 <polygon fill="none" stroke="black" points="24.36,-11.25 24.36,-38.25 87.36,-38.25 87.36,-11.25 24.36,-11.25"/>
1920 </g>
2021 </g>
2122 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: ni Pages: 1 -->
66 <svg width="522pt" height="105pt"
77 viewBox="0.00 0.00 522.37 105.43" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 101.43)">
99 <title>ni</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-101.43 518.374,-101.43 518.374,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-101.43 518.37,-101.43 518.37,4 -4,4"/>
1111 <!-- 1 -->
12 <g id="node1" class="node"><title>1</title>
13 <polygon fill="none" stroke="black" points="36,-60.7148 0,-60.7148 0,-36.7148 36,-36.7148 36,-30.7148 54,-48.7148 36,-66.7148 36,-60.7148"/>
14 <text text-anchor="middle" x="27" y="-45.0148" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
12 <g id="node1" class="node">
13 <title>1</title>
14 <polygon fill="none" stroke="black" points="36,-60.71 0,-60.71 0,-36.71 36,-36.71 36,-30.71 54,-48.71 36,-66.71 36,-60.71"/>
15 <text text-anchor="middle" x="27" y="-45.01" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
1516 </g>
1617 <!-- 2 -->
17 <g id="node2" class="node"><title>2</title>
18 <polygon fill="none" stroke="black" points="126,-60.7148 90,-60.7148 90,-36.7148 126,-36.7148 126,-30.7148 144,-48.7148 126,-66.7148 126,-60.7148"/>
19 <text text-anchor="middle" x="117" y="-45.0148" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
18 <g id="node2" class="node">
19 <title>2</title>
20 <polygon fill="none" stroke="black" points="126,-60.71 90,-60.71 90,-36.71 126,-36.71 126,-30.71 144,-48.71 126,-66.71 126,-60.71"/>
21 <text text-anchor="middle" x="117" y="-45.01" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
2022 </g>
2123 <!-- 1&#45;&#45;2 -->
22 <g id="edge1" class="edge"><title>1&#45;&#45;2</title>
23 <path fill="none" stroke="black" d="M54.4029,-48.7148C65.6421,-48.7148 78.7152,-48.7148 89.919,-48.7148"/>
24 <g id="edge1" class="edge">
25 <title>1&#45;&#45;2</title>
26 <path fill="none" stroke="black" d="M54.4,-48.71C65.64,-48.71 78.72,-48.71 89.92,-48.71"/>
2427 </g>
2528 <!-- 3 -->
26 <g id="node3" class="node"><title>3</title>
27 <polygon fill="none" stroke="black" points="211.426,-30.7641 213.202,-30.8627 214.96,-31.0101 216.692,-31.2061 218.391,-31.4501 220.052,-31.7414 221.666,-32.0792 223.228,-32.4627 224.732,-32.8907 226.172,-33.362 227.543,-33.8754 228.841,-34.4295 230.061,-35.0228 231.198,-35.6536 232.251,-36.3202 233.215,-37.0207 234.089,-37.7533 234.87,-38.516 235.558,-39.3066 236.151,-40.123 236.649,-40.9629 237.052,-41.8241 237.361,-42.7042 237.576,-43.6008 237.699,-44.5113 237.732,-45.4334 237.678,-46.3645 237.537,-47.302 237.315,-48.2434 237.012,-49.1861 236.633,-50.1275 236.182,-51.0651 235.662,-51.9961 235.076,-52.9182 234.429,-53.8288 233.724,-54.7254 232.966,-55.6054 232.158,-56.4666 231.305,-57.3066 230.409,-58.123 229.476,-58.9136 228.507,-59.6762 227.508,-60.4089 226.48,-61.1094 225.428,-61.776 224.353,-62.4068 223.26,-63 222.149,-63.5541 221.024,-64.0676 219.886,-64.5389 218.737,-64.9669 217.58,-65.3503 216.415,-65.6881 215.244,-65.9795 214.069,-66.2234 212.889,-66.4194 211.706,-66.5669 210.522,-66.6654 209.336,-66.7148 208.15,-66.7148 206.965,-66.6654 205.78,-66.5669 204.598,-66.4194 203.418,-66.2234 202.243,-65.9795 201.072,-65.6881 199.907,-65.3503 198.75,-64.9669 197.601,-64.5389 196.463,-64.0676 195.338,-63.5541 194.227,-63 193.134,-62.4068 192.059,-61.776 191.007,-61.1094 189.979,-60.4089 188.98,-59.6762 188.011,-58.9136 187.078,-58.123 186.182,-57.3066 185.329,-56.4666 184.521,-55.6054 183.763,-54.7254 183.058,-53.8288 182.411,-52.9182 181.825,-51.9961 181.305,-51.0651 180.853,-50.1275 180.475,-49.1861 180.172,-48.2434 179.949,-47.302 179.809,-46.3645 179.754,-45.4334 179.788,-44.5113 179.911,-43.6008 180.126,-42.7042 180.435,-41.8241 180.838,-40.9629 181.336,-40.123 181.929,-39.3066 182.617,-38.516 183.398,-37.7533 184.272,-37.0207 185.236,-36.3202 186.289,-35.6536 187.426,-35.0228 188.646,-34.4295 189.943,-33.8754 191.315,-33.362 192.755,-32.8907 194.259,-32.4627 195.821,-32.0792 197.435,-31.7414 199.095,-31.4501 200.795,-31.2061 202.527,-31.0101 204.285,-30.8627 206.061,-30.7641 207.848,-30.7148 209.639,-30.7148 211.426,-30.7641"/>
28 <text text-anchor="middle" x="208.743" y="-45.0148" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
29 <g id="node3" class="node">
30 <title>3</title>
31 <polygon fill="none" stroke="black" points="211.43,-30.76 213.2,-30.86 214.96,-31.01 216.69,-31.21 218.39,-31.45 220.05,-31.74 221.67,-32.08 223.23,-32.46 224.73,-32.89 226.17,-33.36 227.54,-33.88 228.84,-34.43 230.06,-35.02 231.2,-35.65 232.25,-36.32 233.22,-37.02 234.09,-37.75 234.87,-38.52 235.56,-39.31 236.15,-40.12 236.65,-40.96 237.05,-41.82 237.36,-42.7 237.58,-43.6 237.7,-44.51 237.73,-45.43 237.68,-46.36 237.54,-47.3 237.31,-48.24 237.01,-49.19 236.63,-50.13 236.18,-51.07 235.66,-52 235.08,-52.92 234.43,-53.83 233.72,-54.73 232.97,-55.61 232.16,-56.47 231.3,-57.31 230.41,-58.12 229.48,-58.91 228.51,-59.68 227.51,-60.41 226.48,-61.11 225.43,-61.78 224.35,-62.41 223.26,-63 222.15,-63.55 221.02,-64.07 219.89,-64.54 218.74,-64.97 217.58,-65.35 216.42,-65.69 215.24,-65.98 214.07,-66.22 212.89,-66.42 211.71,-66.57 210.52,-66.67 209.34,-66.71 208.15,-66.71 206.96,-66.67 205.78,-66.57 204.6,-66.42 203.42,-66.22 202.24,-65.98 201.07,-65.69 199.91,-65.35 198.75,-64.97 197.6,-64.54 196.46,-64.07 195.34,-63.55 194.23,-63 193.13,-62.41 192.06,-61.78 191.01,-61.11 189.98,-60.41 188.98,-59.68 188.01,-58.91 187.08,-58.12 186.18,-57.31 185.33,-56.47 184.52,-55.61 183.76,-54.73 183.06,-53.83 182.41,-52.92 181.83,-52 181.3,-51.07 180.85,-50.13 180.47,-49.19 180.17,-48.24 179.95,-47.3 179.81,-46.36 179.75,-45.43 179.79,-44.51 179.91,-43.6 180.13,-42.7 180.43,-41.82 180.84,-40.96 181.34,-40.12 181.93,-39.31 182.62,-38.52 183.4,-37.75 184.27,-37.02 185.24,-36.32 186.29,-35.65 187.43,-35.02 188.65,-34.43 189.94,-33.88 191.31,-33.36 192.75,-32.89 194.26,-32.46 195.82,-32.08 197.44,-31.74 199.1,-31.45 200.79,-31.21 202.53,-31.01 204.28,-30.86 206.06,-30.76 207.85,-30.71 209.64,-30.71 211.43,-30.76"/>
32 <text text-anchor="middle" x="208.74" y="-45.01" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
2933 </g>
3034 <!-- 2&#45;&#45;3 -->
31 <g id="edge2" class="edge"><title>2&#45;&#45;3</title>
32 <path fill="none" stroke="black" d="M144.441,-48.7148C155.712,-48.7148 168.861,-48.7148 180.246,-48.7148"/>
35 <g id="edge2" class="edge">
36 <title>2&#45;&#45;3</title>
37 <path fill="none" stroke="black" d="M144.44,-48.71C155.71,-48.71 168.86,-48.71 180.25,-48.71"/>
3338 </g>
3439 <!-- 4 -->
35 <g id="node4" class="node"><title>4</title>
36 <polygon fill="none" stroke="black" points="376.153,-60.2657 336.853,-60.2657 324.709,-97.6453 312.564,-60.2657 273.264,-60.2657 305.059,-37.1639 292.914,0.215733 324.709,-22.8861 356.503,0.215733 344.359,-37.1639 376.153,-60.2657"/>
37 <text text-anchor="middle" x="324.709" y="-45.0148" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
40 <g id="node4" class="node">
41 <title>4</title>
42 <polygon fill="none" stroke="black" points="376.15,-60.27 336.85,-60.27 324.71,-97.65 312.56,-60.27 273.26,-60.27 305.06,-37.16 292.91,0.22 324.71,-22.89 356.5,0.22 344.36,-37.16 376.15,-60.27"/>
43 <text text-anchor="middle" x="324.71" y="-45.01" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
3844 </g>
3945 <!-- 3&#45;&#45;4 -->
40 <g id="edge3" class="edge"><title>3&#45;&#45;4</title>
41 <path fill="none" stroke="black" d="M237.331,-48.7148C252.878,-48.7148 272.445,-48.7148 289.022,-48.7148"/>
46 <g id="edge3" class="edge">
47 <title>3&#45;&#45;4</title>
48 <path fill="none" stroke="black" d="M237.33,-48.71C252.88,-48.71 272.44,-48.71 289.02,-48.71"/>
4249 </g>
4350 <!-- 5 -->
44 <g id="node5" class="node"><title>5</title>
45 <polygon fill="none" stroke="black" points="514.597,-60.2657 475.297,-60.2657 463.152,-97.6453 451.008,-60.2657 411.708,-60.2657 443.502,-37.1639 431.358,0.215733 463.152,-22.8861 494.947,0.215733 482.802,-37.1639 514.597,-60.2657"/>
46 <text text-anchor="middle" x="463.152" y="-45.0148" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
51 <g id="node5" class="node">
52 <title>5</title>
53 <polygon fill="none" stroke="black" points="514.6,-60.27 475.3,-60.27 463.15,-97.65 451.01,-60.27 411.71,-60.27 443.5,-37.16 431.36,0.22 463.15,-22.89 494.95,0.22 482.8,-37.16 514.6,-60.27"/>
54 <text text-anchor="middle" x="463.15" y="-45.01" font-family="Times New Roman,serif" font-size="14.00">Ni!</text>
4755 </g>
4856 <!-- 4&#45;&#45;5 -->
49 <g id="edge4" class="edge"><title>4&#45;&#45;5</title>
50 <path fill="none" stroke="black" d="M360.139,-48.7148C380.823,-48.7148 407.051,-48.7148 427.733,-48.7148"/>
57 <g id="edge4" class="edge">
58 <title>4&#45;&#45;5</title>
59 <path fill="none" stroke="black" d="M360.14,-48.71C380.82,-48.71 407.05,-48.71 427.73,-48.71"/>
5160 </g>
5261 </g>
5362 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: pet&#45;shop Pages: 1 -->
66 <svg width="152pt" height="44pt"
77 viewBox="0.00 0.00 152.00 44.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 40)">
99 <title>pet&#45;shop</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-40 148,-40 148,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-40 148,-40 148,4 -4,4"/>
1111 <!-- parrot -->
12 <g id="node1" class="node"><title>parrot</title>
12 <g id="node1" class="node">
13 <title>parrot</title>
1314 <text text-anchor="middle" x="27" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">parrot</text>
1415 </g>
1516 <!-- dead -->
16 <g id="node2" class="node"><title>dead</title>
17 <g id="node2" class="node">
18 <title>dead</title>
1719 <text text-anchor="middle" x="117" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">dead</text>
1820 </g>
1921 <!-- parrot&#45;&gt;dead -->
20 <g id="edge1" class="edge"><title>parrot&#45;&gt;dead</title>
21 <path fill="none" stroke="black" d="M54.4029,-18C59.32,-18 64.5882,-18 69.8973,-18"/>
22 <polygon fill="black" stroke="black" points="89.919,-18 69.919,-27.0001 79.919,-18 69.919,-18.0001 69.919,-18.0001 69.919,-18.0001 79.919,-18 69.9189,-9.0001 89.919,-18 89.919,-18"/>
22 <g id="edge1" class="edge">
23 <title>parrot&#45;&gt;dead</title>
24 <path fill="none" stroke="black" d="M54.4,-18C59.32,-18 64.59,-18 69.9,-18"/>
25 <polygon fill="black" stroke="black" points="89.92,-18 69.92,-27 79.92,-18 69.92,-18 69.92,-18 69.92,-18 79.92,-18 69.92,-9 89.92,-18 89.92,-18"/>
2326 </g>
2427 </g>
2528 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
5 <!-- Title: %3 Pages: 1 -->
5 <!-- Pages: 1 -->
66 <svg width="206pt" height="188pt"
77 viewBox="0.00 0.00 206.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
9 <title>%3</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-184 202,-184 202,4 -4,4"/>
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-184 202,-184 202,4 -4,4"/>
1110 <!-- A -->
12 <g id="node1" class="node"><title>A</title>
11 <g id="node1" class="node">
12 <title>A</title>
1313 <ellipse fill="none" stroke="black" cx="72" cy="-162" rx="27" ry="18"/>
1414 <text text-anchor="middle" x="72" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">A</text>
1515 </g>
1616 <!-- C -->
17 <g id="node3" class="node"><title>C</title>
17 <g id="node3" class="node">
18 <title>C</title>
1819 <ellipse fill="none" stroke="black" cx="36" cy="-90" rx="27" ry="18"/>
1920 <text text-anchor="middle" x="36" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">C</text>
2021 </g>
2122 <!-- A&#45;&gt;C -->
22 <g id="edge2" class="edge"><title>A&#45;&gt;C</title>
23 <path fill="none" stroke="black" d="M63.6504,-144.765C59.2885,-136.283 53.8531,-125.714 48.9587,-116.197"/>
24 <polygon fill="black" stroke="black" points="51.9904,-114.439 44.3043,-107.147 45.7654,-117.641 51.9904,-114.439"/>
23 <g id="edge2" class="edge">
24 <title>A&#45;&gt;C</title>
25 <path fill="none" stroke="black" d="M63.65,-144.76C59.29,-136.28 53.85,-125.71 48.96,-116.2"/>
26 <polygon fill="black" stroke="black" points="51.99,-114.44 44.3,-107.15 45.77,-117.64 51.99,-114.44"/>
2527 </g>
2628 <!-- B -->
27 <g id="node4" class="node"><title>B</title>
29 <g id="node4" class="node">
30 <title>B</title>
2831 <ellipse fill="none" stroke="black" cx="99" cy="-18" rx="27" ry="18"/>
2932 <text text-anchor="middle" x="99" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">B</text>
3033 </g>
3134 <!-- A&#45;&gt;B -->
32 <g id="edge1" class="edge"><title>A&#45;&gt;B</title>
33 <path fill="none" stroke="black" d="M75.2568,-143.871C79.8585,-119.67 88.312,-75.2108 93.7914,-46.3932"/>
34 <polygon fill="black" stroke="black" points="97.302,-46.6671 95.7316,-36.1893 90.4252,-45.3594 97.302,-46.6671"/>
35 <g id="edge1" class="edge">
36 <title>A&#45;&gt;B</title>
37 <path fill="none" stroke="black" d="M75.26,-143.87C79.86,-119.67 88.31,-75.21 93.79,-46.39"/>
38 <polygon fill="black" stroke="black" points="97.3,-46.67 95.73,-36.19 90.43,-45.36 97.3,-46.67"/>
3539 </g>
3640 <!-- X -->
37 <g id="node2" class="node"><title>X</title>
41 <g id="node2" class="node">
42 <title>X</title>
3843 <ellipse fill="none" stroke="black" cx="171" cy="-162" rx="27" ry="18"/>
3944 <text text-anchor="middle" x="171" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">X</text>
4045 </g>
4146 <!-- Y -->
42 <g id="node6" class="node"><title>Y</title>
47 <g id="node6" class="node">
48 <title>Y</title>
4349 <ellipse fill="none" stroke="black" cx="171" cy="-18" rx="27" ry="18"/>
4450 <text text-anchor="middle" x="171" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">Y</text>
4551 </g>
4652 <!-- X&#45;&gt;Y -->
47 <g id="edge4" class="edge"><title>X&#45;&gt;Y</title>
48 <path fill="none" stroke="black" d="M171,-143.871C171,-119.67 171,-75.2108 171,-46.3932"/>
49 <polygon fill="black" stroke="black" points="174.5,-46.1892 171,-36.1893 167.5,-46.1893 174.5,-46.1892"/>
53 <g id="edge4" class="edge">
54 <title>X&#45;&gt;Y</title>
55 <path fill="none" stroke="black" d="M171,-143.87C171,-119.67 171,-75.21 171,-46.39"/>
56 <polygon fill="black" stroke="black" points="174.5,-46.19 171,-36.19 167.5,-46.19 174.5,-46.19"/>
5057 </g>
5158 <!-- D -->
52 <g id="node5" class="node"><title>D</title>
59 <g id="node5" class="node">
60 <title>D</title>
5361 <ellipse fill="none" stroke="black" cx="27" cy="-18" rx="27" ry="18"/>
5462 <text text-anchor="middle" x="27" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">D</text>
5563 </g>
5664 <!-- C&#45;&gt;D -->
57 <g id="edge3" class="edge"><title>C&#45;&gt;D</title>
58 <path fill="none" stroke="black" d="M33.8214,-72.055C32.8302,-64.3456 31.632,-55.0269 30.5183,-46.3642"/>
59 <polygon fill="black" stroke="black" points="33.9678,-45.7473 29.2211,-36.2753 27.025,-46.64 33.9678,-45.7473"/>
65 <g id="edge3" class="edge">
66 <title>C&#45;&gt;D</title>
67 <path fill="none" stroke="black" d="M33.82,-72.05C32.83,-64.35 31.63,-55.03 30.52,-46.36"/>
68 <polygon fill="black" stroke="black" points="33.97,-45.75 29.22,-36.28 27.02,-46.64 33.97,-45.75"/>
6069 </g>
6170 </g>
6271 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
5 <!-- Title: %3 Pages: 1 -->
5 <!-- Pages: 1 -->
66 <svg width="390pt" height="116pt"
77 viewBox="0.00 0.00 389.98 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
9 <title>%3</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-112 385.984,-112 385.984,4 -4,4"/>
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-112 385.98,-112 385.98,4 -4,4"/>
1110 <!-- A -->
12 <g id="node1" class="node"><title>A</title>
13 <ellipse fill="none" stroke="black" cx="190.992" cy="-90" rx="53.8905" ry="18"/>
14 <text text-anchor="middle" x="190.992" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">King Arthur</text>
11 <g id="node1" class="node">
12 <title>A</title>
13 <ellipse fill="none" stroke="black" cx="190.99" cy="-90" rx="53.89" ry="18"/>
14 <text text-anchor="middle" x="190.99" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">King Arthur</text>
1515 </g>
1616 <!-- B -->
17 <g id="node2" class="node"><title>B</title>
18 <ellipse fill="none" stroke="black" cx="90.9919" cy="-18" rx="90.9839" ry="18"/>
19 <text text-anchor="middle" x="90.9919" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">Sir Bedevere the Wise</text>
17 <g id="node2" class="node">
18 <title>B</title>
19 <ellipse fill="none" stroke="black" cx="90.99" cy="-18" rx="90.98" ry="18"/>
20 <text text-anchor="middle" x="90.99" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">Sir Bedevere the Wise</text>
2021 </g>
2122 <!-- A&#45;&gt;B -->
22 <g id="edge1" class="edge"><title>A&#45;&gt;B</title>
23 <path fill="none" stroke="black" d="M168.799,-73.4647C155.331,-64.0371 137.916,-51.8466 122.977,-41.3897"/>
24 <polygon fill="black" stroke="black" points="124.716,-38.3345 114.516,-35.4672 120.702,-44.0692 124.716,-38.3345"/>
23 <g id="edge1" class="edge">
24 <title>A&#45;&gt;B</title>
25 <path fill="none" stroke="black" d="M168.8,-73.46C155.33,-64.04 137.92,-51.85 122.98,-41.39"/>
26 <polygon fill="black" stroke="black" points="124.72,-38.33 114.52,-35.47 120.7,-44.07 124.72,-38.33"/>
2527 </g>
2628 <!-- L -->
27 <g id="node3" class="node"><title>L</title>
28 <ellipse fill="none" stroke="black" cx="290.992" cy="-18" rx="90.9839" ry="18"/>
29 <text text-anchor="middle" x="290.992" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">Sir Lancelot the Brave</text>
29 <g id="node3" class="node">
30 <title>L</title>
31 <ellipse fill="none" stroke="black" cx="290.99" cy="-18" rx="90.98" ry="18"/>
32 <text text-anchor="middle" x="290.99" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">Sir Lancelot the Brave</text>
3033 </g>
3134 <!-- A&#45;&gt;L -->
32 <g id="edge2" class="edge"><title>A&#45;&gt;L</title>
33 <path fill="none" stroke="black" d="M213.185,-73.4647C226.653,-64.0371 244.068,-51.8466 259.007,-41.3897"/>
34 <polygon fill="black" stroke="black" points="261.282,-44.0692 267.467,-35.4672 257.268,-38.3345 261.282,-44.0692"/>
35 <g id="edge2" class="edge">
36 <title>A&#45;&gt;L</title>
37 <path fill="none" stroke="black" d="M213.19,-73.46C226.65,-64.04 244.07,-51.85 259.01,-41.39"/>
38 <polygon fill="black" stroke="black" points="261.28,-44.07 267.47,-35.47 257.27,-38.33 261.28,-44.07"/>
3539 </g>
3640 <!-- B&#45;&gt;L -->
37 <g id="edge3" class="edge"><title>B&#45;&gt;L</title>
38 <path fill="none" stroke="black" d="M182.008,-18C184.615,-18 187.223,-18 189.83,-18"/>
39 <polygon fill="black" stroke="black" points="189.888,-21.5001 199.888,-18 189.888,-14.5001 189.888,-21.5001"/>
41 <g id="edge3" class="edge">
42 <title>B&#45;&gt;L</title>
43 <path fill="none" stroke="black" d="M182.01,-18C184.62,-18 187.22,-18 189.83,-18"/>
44 <polygon fill="black" stroke="black" points="189.89,-21.5 199.89,-18 189.89,-14.5 189.89,-21.5"/>
4045 </g>
4146 </g>
4247 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: structs Pages: 1 -->
66 <svg width="242pt" height="163pt"
77 viewBox="0.00 0.00 242.00 163.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 159)">
99 <title>structs</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-159 238,-159 238,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-159 238,-159 238,4 -4,4"/>
1111 <!-- struct1 -->
12 <g id="node1" class="node"><title>struct1</title>
12 <g id="node1" class="node">
13 <title>struct1</title>
1314 <polygon fill="none" stroke="black" points="28.5,-126 28.5,-147 52.5,-147 52.5,-126 28.5,-126"/>
1415 <text text-anchor="start" x="31.5" y="-132.8" font-family="Times New Roman,serif" font-size="14.00">left</text>
1516 <polygon fill="none" stroke="black" points="52.5,-126 52.5,-147 96.5,-147 96.5,-126 52.5,-126"/>
1819 <text text-anchor="start" x="99.5" y="-132.8" font-family="Times New Roman,serif" font-size="14.00">right</text>
1920 </g>
2021 <!-- struct2 -->
21 <g id="node2" class="node"><title>struct2</title>
22 <g id="node2" class="node">
23 <title>struct2</title>
2224 <polygon fill="none" stroke="black" points="8.5,-30.5 8.5,-51.5 35.5,-51.5 35.5,-30.5 8.5,-30.5"/>
2325 <text text-anchor="start" x="11.5" y="-37.3" font-family="Times New Roman,serif" font-size="14.00">one</text>
2426 <polygon fill="none" stroke="black" points="35.5,-30.5 35.5,-51.5 63.5,-51.5 63.5,-30.5 35.5,-30.5"/>
2527 <text text-anchor="start" x="38.5" y="-37.3" font-family="Times New Roman,serif" font-size="14.00">two</text>
2628 </g>
2729 <!-- struct1&#45;&gt;struct2 -->
28 <g id="edge1" class="edge"><title>struct1:f1&#45;&gt;struct2:f0</title>
29 <path fill="none" stroke="black" d="M74.5,-125C74.5,-88.8278 30.9717,-91.4553 22.8101,-62.558"/>
30 <polygon fill="black" stroke="black" points="26.2624,-61.9641 21.5,-52.5 19.3211,-62.8683 26.2624,-61.9641"/>
30 <g id="edge1" class="edge">
31 <title>struct1:f1&#45;&gt;struct2:f0</title>
32 <path fill="none" stroke="black" d="M74.5,-125C74.5,-88.83 30.97,-91.46 22.81,-62.56"/>
33 <polygon fill="black" stroke="black" points="26.26,-61.96 21.5,-52.5 19.32,-62.87 26.26,-61.96"/>
3134 </g>
3235 <!-- struct3 -->
33 <g id="node3" class="node"><title>struct3</title>
36 <g id="node3" class="node">
37 <title>struct3</title>
3438 <polygon fill="none" stroke="black" points="97.5,-3.5 97.5,-78.5 140.5,-78.5 140.5,-3.5 97.5,-3.5"/>
3539 <text text-anchor="start" x="105.5" y="-44.8" font-family="Times New Roman,serif" font-size="14.00">hello</text>
3640 <text text-anchor="start" x="102.5" y="-29.8" font-family="Times New Roman,serif" font-size="14.00">world</text>
5054 <text text-anchor="start" x="164" y="-12.3" font-family="Times New Roman,serif" font-size="14.00">f</text>
5155 </g>
5256 <!-- struct1&#45;&gt;struct3 -->
53 <g id="edge2" class="edge"><title>struct1:f2&#45;&gt;struct3:here</title>
54 <path fill="none" stroke="black" d="M112.5,-125C112.5,-97.3617 133.618,-71.6361 149.442,-56.2398"/>
55 <polygon fill="black" stroke="black" points="152.121,-58.5299 157.094,-49.1746 147.372,-53.3868 152.121,-58.5299"/>
57 <g id="edge2" class="edge">
58 <title>struct1:f2&#45;&gt;struct3:here</title>
59 <path fill="none" stroke="black" d="M112.5,-125C112.5,-97.36 133.62,-71.64 149.44,-56.24"/>
60 <polygon fill="black" stroke="black" points="152.12,-58.53 157.09,-49.17 147.37,-53.39 152.12,-58.53"/>
5661 </g>
5762 </g>
5863 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: structs Pages: 1 -->
66 <svg width="266pt" height="151pt"
77 viewBox="0.00 0.00 266.00 151.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
88 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 147)">
99 <title>structs</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-147 262,-147 262,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-147 262,-147 262,4 -4,4"/>
1111 <!-- struct1 -->
12 <g id="node1" class="node"><title>struct1</title>
12 <g id="node1" class="node">
13 <title>struct1</title>
1314 <polygon fill="none" stroke="black" points="13,-106.5 13,-142.5 142,-142.5 142,-106.5 13,-106.5"/>
1415 <text text-anchor="middle" x="30" y="-120.8" font-family="Times New Roman,serif" font-size="14.00">left</text>
1516 <polyline fill="none" stroke="black" points="47,-106.5 47,-142.5 "/>
1819 <text text-anchor="middle" x="121.5" y="-120.8" font-family="Times New Roman,serif" font-size="14.00">right</text>
1920 </g>
2021 <!-- struct2 -->
21 <g id="node2" class="node"><title>struct2</title>
22 <g id="node2" class="node">
23 <title>struct2</title>
2224 <polygon fill="none" stroke="black" points="0,-17 0,-53 75,-53 75,-17 0,-17"/>
2325 <text text-anchor="middle" x="18.5" y="-31.3" font-family="Times New Roman,serif" font-size="14.00">one</text>
2426 <polyline fill="none" stroke="black" points="37,-17 37,-53 "/>
2527 <text text-anchor="middle" x="56" y="-31.3" font-family="Times New Roman,serif" font-size="14.00">two</text>
2628 </g>
2729 <!-- struct1&#45;&gt;struct2 -->
28 <g id="edge1" class="edge"><title>struct1:f1&#45;&gt;struct2:f0</title>
29 <path fill="none" stroke="black" d="M73.5,-106C73.5,-76.3021 30.6353,-84.7306 20.5889,-63.9686"/>
30 <polygon fill="black" stroke="black" points="23.9766,-63.0696 18.5,-54 17.1254,-64.5053 23.9766,-63.0696"/>
30 <g id="edge1" class="edge">
31 <title>struct1:f1&#45;&gt;struct2:f0</title>
32 <path fill="none" stroke="black" d="M73.5,-106C73.5,-76.3 30.64,-84.73 20.59,-63.97"/>
33 <polygon fill="black" stroke="black" points="23.98,-63.07 18.5,-54 17.13,-64.51 23.98,-63.07"/>
3134 </g>
3235 <!-- struct3 -->
33 <g id="node3" class="node"><title>struct3</title>
36 <g id="node3" class="node">
37 <title>struct3</title>
3438 <polygon fill="none" stroke="black" points="93,-0.5 93,-69.5 258,-69.5 258,-0.5 93,-0.5"/>
3539 <text text-anchor="middle" x="117.5" y="-38.8" font-family="Times New Roman,serif" font-size="14.00">hello</text>
3640 <text text-anchor="middle" x="117.5" y="-23.8" font-family="Times New Roman,serif" font-size="14.00">world</text>
5054 <text text-anchor="middle" x="246.5" y="-31.3" font-family="Times New Roman,serif" font-size="14.00">h</text>
5155 </g>
5256 <!-- struct1&#45;&gt;struct3 -->
53 <g id="edge2" class="edge"><title>struct1:f2&#45;&gt;struct3:here</title>
54 <path fill="none" stroke="black" d="M121.5,-106C121.5,-93.9252 141.72,-70.7257 157.86,-54.1308"/>
55 <polygon fill="black" stroke="black" points="160.784,-56.1535 165.349,-46.5925 155.818,-51.22 160.784,-56.1535"/>
57 <g id="edge2" class="edge">
58 <title>struct1:f2&#45;&gt;struct3:here</title>
59 <path fill="none" stroke="black" d="M121.5,-106C121.5,-93.93 141.72,-70.73 157.86,-54.13"/>
60 <polygon fill="black" stroke="black" points="160.78,-56.15 165.35,-46.59 155.82,-51.22 160.78,-56.15"/>
5661 </g>
5762 </g>
5863 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: TrafficLights Pages: 1 -->
6 <svg width="383pt" height="484pt"
7 viewBox="0.00 0.00 382.57 483.82" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(190.909 224.889)">
6 <svg width="368pt" height="466pt"
7 viewBox="0.00 0.00 367.63 465.64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 461.64)">
99 <title>TrafficLights</title>
10 <polygon fill="white" stroke="none" points="-190.909,258.936 -190.909,-224.889 191.659,-224.889 191.659,258.936 -190.909,258.936"/>
11 <text text-anchor="middle" x="0.3752" y="234.536" font-family="Times New Roman,serif" font-size="12.00">PetriNet Model TrafficLights</text>
12 <text text-anchor="middle" x="0.3752" y="247.536" font-family="Times New Roman,serif" font-size="12.00">Extracted from ConceptBase and layed out by Graphviz</text>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-461.64 363.63,-461.64 363.63,4 -4,4"/>
11 <text text-anchor="middle" x="179.81" y="-20.4" font-family="Times New Roman,serif" font-size="12.00">PetriNet Model TrafficLights</text>
12 <text text-anchor="middle" x="179.81" y="-7.4" font-family="Times New Roman,serif" font-size="12.00">Extracted from ConceptBase and layed out by Graphviz</text>
1313 <!-- gy2 -->
14 <g id="node1" class="node"><title>gy2</title>
15 <polygon fill="none" stroke="black" points="-74.6078,164.183 -128.608,164.183 -128.608,200.183 -74.6078,200.183 -74.6078,164.183"/>
16 <text text-anchor="middle" x="-101.608" y="185.883" font-family="Times New Roman,serif" font-size="14.00">gy2</text>
14 <g id="node1" class="node">
15 <title>gy2</title>
16 <polygon fill="none" stroke="black" points="109.75,-90.45 55.75,-90.45 55.75,-54.45 109.75,-54.45 109.75,-90.45"/>
17 <text text-anchor="middle" x="82.75" y="-68.75" font-family="Times New Roman,serif" font-size="14.00">gy2</text>
1718 </g>
1819 <!-- yellow2 -->
19 <g id="node8" class="node"><title>yellow2</title>
20 <ellipse fill="none" stroke="black" cx="-154.409" cy="108.683" rx="32.5" ry="32.5"/>
21 <text text-anchor="middle" x="-154.409" y="112.383" font-family="Times New Roman,serif" font-size="14.00">yellow2</text>
20 <g id="node8" class="node">
21 <title>yellow2</title>
22 <ellipse fill="none" stroke="black" cx="32.5" cy="-142.4" rx="32.5" ry="32.5"/>
23 <text text-anchor="middle" x="32.5" y="-138.7" font-family="Times New Roman,serif" font-size="14.00">yellow2</text>
2224 </g>
2325 <!-- gy2&#45;&gt;yellow2 -->
24 <g id="edge1" class="edge"><title>gy2&#45;&gt;yellow2</title>
25 <path fill="none" stroke="black" d="M-114.66,164.014C-119.137,157.781 -124.31,150.581 -129.413,143.477"/>
26 <polygon fill="black" stroke="black" points="-132.334,145.411 -135.325,135.248 -126.648,141.327 -132.334,145.411"/>
26 <g id="edge1" class="edge">
27 <title>gy2&#45;&gt;yellow2</title>
28 <path fill="none" stroke="black" d="M69.81,-90.47C65.97,-95.81 61.63,-101.85 57.31,-107.87"/>
29 <polygon fill="black" stroke="black" points="54.45,-105.84 51.46,-116.01 60.14,-109.93 54.45,-105.84"/>
2730 </g>
2831 <!-- yr2 -->
29 <g id="node2" class="node"><title>yr2</title>
30 <polygon fill="none" stroke="black" points="-88.9729,12.4915 -142.973,12.4915 -142.973,48.4915 -88.9729,48.4915 -88.9729,12.4915"/>
31 <text text-anchor="middle" x="-115.973" y="34.1915" font-family="Times New Roman,serif" font-size="14.00">yr2</text>
32 <g id="node2" class="node">
33 <title>yr2</title>
34 <polygon fill="none" stroke="black" points="96.08,-234.82 42.08,-234.82 42.08,-198.82 96.08,-198.82 96.08,-234.82"/>
35 <text text-anchor="middle" x="69.08" y="-213.12" font-family="Times New Roman,serif" font-size="14.00">yr2</text>
3236 </g>
3337 <!-- red2 -->
34 <g id="node9" class="node"><title>red2</title>
35 <ellipse fill="none" stroke="black" cx="-42.9405" cy="75.0428" rx="32.5" ry="32.5"/>
36 <text text-anchor="middle" x="-42.9405" y="78.7428" font-family="Times New Roman,serif" font-size="14.00">red2</text>
38 <g id="node9" class="node">
39 <title>red2</title>
40 <ellipse fill="none" stroke="black" cx="138.59" cy="-174.42" rx="32.5" ry="32.5"/>
41 <text text-anchor="middle" x="138.59" y="-170.72" font-family="Times New Roman,serif" font-size="14.00">red2</text>
3742 </g>
3843 <!-- yr2&#45;&gt;red2 -->
39 <g id="edge4" class="edge"><title>yr2&#45;&gt;red2</title>
40 <path fill="none" stroke="black" d="M-88.7783,47.0808C-85.7671,48.9177 -82.6653,50.8099 -79.5624,52.7027"/>
41 <polygon fill="black" stroke="black" points="-77.6039,49.7975 -70.8896,57.9933 -81.2493,55.7734 -77.6039,49.7975"/>
44 <g id="edge4" class="edge">
45 <title>yr2&#45;&gt;red2</title>
46 <path fill="none" stroke="black" d="M96.15,-200.31C98.07,-199.13 100.03,-197.94 101.99,-196.75"/>
47 <polygon fill="black" stroke="black" points="103.84,-199.71 110.56,-191.52 100.2,-193.74 103.84,-199.71"/>
4248 </g>
4349 <!-- safe1 -->
44 <g id="node14" class="node"><title>safe1</title>
45 <ellipse fill="none" stroke="black" cx="-101.65" cy="-57.2197" rx="32.5" ry="32.5"/>
46 <text text-anchor="middle" x="-101.65" y="-53.5197" font-family="Times New Roman,serif" font-size="14.00">safe1</text>
50 <g id="node14" class="node">
51 <title>safe1</title>
52 <ellipse fill="none" stroke="black" cx="82.71" cy="-300.3" rx="32.5" ry="32.5"/>
53 <text text-anchor="middle" x="82.71" y="-296.6" font-family="Times New Roman,serif" font-size="14.00">safe1</text>
4754 </g>
4855 <!-- yr2&#45;&gt;safe1 -->
49 <g id="edge3" class="edge"><title>yr2&#45;&gt;safe1</title>
50 <path fill="none" stroke="black" d="M-113.005,12.3177C-111.704,4.34801 -110.117,-5.36876 -108.548,-14.9818"/>
51 <polygon fill="black" stroke="black" points="-111.996,-15.5791 -106.931,-24.8844 -105.088,-14.451 -111.996,-15.5791"/>
56 <g id="edge3" class="edge">
57 <title>yr2&#45;&gt;safe1</title>
58 <path fill="none" stroke="black" d="M72.04,-234.93C73.16,-241.82 74.5,-249.99 75.83,-258.17"/>
59 <polygon fill="black" stroke="black" points="72.39,-258.78 77.45,-268.08 79.29,-257.65 72.39,-258.78"/>
5260 </g>
5361 <!-- rg2 -->
54 <g id="node3" class="node"><title>rg2</title>
55 <polygon fill="none" stroke="black" points="60.3716,96.0559 6.37158,96.0559 6.37158,132.056 60.3716,132.056 60.3716,96.0559"/>
56 <text text-anchor="middle" x="33.3716" y="117.756" font-family="Times New Roman,serif" font-size="14.00">rg2</text>
62 <g id="node3" class="node">
63 <title>rg2</title>
64 <polygon fill="none" stroke="black" points="238.22,-155.29 184.22,-155.29 184.22,-119.29 238.22,-119.29 238.22,-155.29"/>
65 <text text-anchor="middle" x="211.22" y="-133.59" font-family="Times New Roman,serif" font-size="14.00">rg2</text>
5766 </g>
5867 <!-- green2 -->
59 <g id="node7" class="node"><title>green2</title>
60 <ellipse fill="none" stroke="black" cx="-11.442" cy="188.436" rx="32.5" ry="32.5"/>
61 <text text-anchor="middle" x="-11.442" y="192.136" font-family="Times New Roman,serif" font-size="14.00">green2</text>
68 <g id="node7" class="node">
69 <title>green2</title>
70 <ellipse fill="none" stroke="black" cx="168.57" cy="-66.5" rx="32.5" ry="32.5"/>
71 <text text-anchor="middle" x="168.57" y="-62.8" font-family="Times New Roman,serif" font-size="14.00">green2</text>
6272 </g>
6373 <!-- rg2&#45;&gt;green2 -->
64 <g id="edge2" class="edge"><title>rg2&#45;&gt;green2</title>
65 <path fill="none" stroke="black" d="M22.5235,132.061C18.9172,138.047 14.7608,144.945 10.6202,151.818"/>
66 <polygon fill="black" stroke="black" points="13.5849,153.679 5.42628,160.438 7.58907,150.067 13.5849,153.679"/>
74 <g id="edge2" class="edge">
75 <title>rg2&#45;&gt;green2</title>
76 <path fill="none" stroke="black" d="M200.23,-119.06C197.29,-114.17 193.99,-108.7 190.67,-103.18"/>
77 <polygon fill="black" stroke="black" points="193.63,-101.32 185.48,-94.57 187.64,-104.94 193.63,-101.32"/>
6778 </g>
6879 <!-- gy1 -->
69 <g id="node4" class="node"><title>gy1</title>
70 <polygon fill="none" stroke="black" points="130.086,-199.367 76.0863,-199.367 76.0863,-163.367 130.086,-163.367 130.086,-199.367"/>
71 <text text-anchor="middle" x="103.086" y="-177.667" font-family="Times New Roman,serif" font-size="14.00">gy1</text>
80 <g id="node4" class="node">
81 <title>gy1</title>
82 <polygon fill="none" stroke="black" points="304.57,-436.45 250.57,-436.45 250.57,-400.45 304.57,-400.45 304.57,-436.45"/>
83 <text text-anchor="middle" x="277.57" y="-414.75" font-family="Times New Roman,serif" font-size="14.00">gy1</text>
7284 </g>
7385 <!-- yellow1 -->
74 <g id="node12" class="node"><title>yellow1</title>
75 <ellipse fill="none" stroke="black" cx="155.159" cy="-107.511" rx="32.5" ry="32.5"/>
76 <text text-anchor="middle" x="155.159" y="-103.811" font-family="Times New Roman,serif" font-size="14.00">yellow1</text>
86 <g id="node12" class="node">
87 <title>yellow1</title>
88 <ellipse fill="none" stroke="black" cx="327.13" cy="-348.16" rx="32.5" ry="32.5"/>
89 <text text-anchor="middle" x="327.13" y="-344.46" font-family="Times New Roman,serif" font-size="14.00">yellow1</text>
7790 </g>
7891 <!-- gy1&#45;&gt;yellow1 -->
79 <g id="edge9" class="edge"><title>gy1&#45;&gt;yellow1</title>
80 <path fill="none" stroke="black" d="M115.958,-163.11C120.374,-156.847 125.476,-149.611 130.508,-142.474"/>
81 <polygon fill="black" stroke="black" points="133.437,-144.394 136.339,-134.204 127.716,-140.36 133.437,-144.394"/>
92 <g id="edge9" class="edge">
93 <title>gy1&#45;&gt;yellow1</title>
94 <path fill="none" stroke="black" d="M290.33,-400.35C293.99,-395.16 298.11,-389.31 302.24,-383.46"/>
95 <polygon fill="black" stroke="black" points="305.33,-385.14 308.24,-374.95 299.61,-381.11 305.33,-385.14"/>
8296 </g>
8397 <!-- yr1 -->
84 <g id="node5" class="node"><title>yr1</title>
85 <polygon fill="none" stroke="black" points="141.759,-48.6674 87.7594,-48.6674 87.7594,-12.6674 141.759,-12.6674 141.759,-48.6674"/>
86 <text text-anchor="middle" x="114.759" y="-26.9674" font-family="Times New Roman,serif" font-size="14.00">yr1</text>
98 <g id="node5" class="node">
99 <title>yr1</title>
100 <polygon fill="none" stroke="black" points="315.68,-293.03 261.68,-293.03 261.68,-257.03 315.68,-257.03 315.68,-293.03"/>
101 <text text-anchor="middle" x="288.68" y="-271.33" font-family="Times New Roman,serif" font-size="14.00">yr1</text>
87102 </g>
88103 <!-- safe2 -->
89 <g id="node10" class="node"><title>safe2</title>
90 <ellipse fill="none" stroke="black" cx="101.139" cy="56.9206" rx="32.5" ry="32.5"/>
91 <text text-anchor="middle" x="101.139" y="60.6206" font-family="Times New Roman,serif" font-size="14.00">safe2</text>
104 <g id="node10" class="node">
105 <title>safe2</title>
106 <ellipse fill="none" stroke="black" cx="275.71" cy="-191.67" rx="32.5" ry="32.5"/>
107 <text text-anchor="middle" x="275.71" y="-187.97" font-family="Times New Roman,serif" font-size="14.00">safe2</text>
92108 </g>
93109 <!-- yr1&#45;&gt;safe2 -->
94 <g id="edge11" class="edge"><title>yr1&#45;&gt;safe2</title>
95 <path fill="none" stroke="black" d="M111.937,-12.5191C110.7,-4.56061 109.191,5.14249 107.698,14.742"/>
96 <polygon fill="black" stroke="black" points="111.155,15.2873 106.16,24.6306 104.238,14.2116 111.155,15.2873"/>
110 <g id="edge11" class="edge">
111 <title>yr1&#45;&gt;safe2</title>
112 <path fill="none" stroke="black" d="M285.86,-256.94C284.79,-250.06 283.53,-241.91 282.25,-233.73"/>
113 <polygon fill="black" stroke="black" points="285.71,-233.18 280.72,-223.84 278.79,-234.26 285.71,-233.18"/>
97114 </g>
98115 <!-- red1 -->
99 <g id="node13" class="node"><title>red1</title>
100 <ellipse fill="none" stroke="black" cx="41.7812" cy="-75.623" rx="32.5" ry="32.5"/>
101 <text text-anchor="middle" x="41.7812" y="-71.923" font-family="Times New Roman,serif" font-size="14.00">red1</text>
116 <g id="node13" class="node">
117 <title>red1</title>
118 <ellipse fill="none" stroke="black" cx="219.22" cy="-317.81" rx="32.5" ry="32.5"/>
119 <text text-anchor="middle" x="219.22" y="-314.11" font-family="Times New Roman,serif" font-size="14.00">red1</text>
102120 </g>
103121 <!-- yr1&#45;&gt;red1 -->
104 <g id="edge12" class="edge"><title>yr1&#45;&gt;red1</title>
105 <path fill="none" stroke="black" d="M87.585,-47.4072C84.5761,-49.2608 81.4765,-51.1701 78.376,-53.0801"/>
106 <polygon fill="black" stroke="black" points="76.3881,-50.1939 69.7096,-58.4187 80.0595,-56.1538 76.3881,-50.1939"/>
122 <g id="edge12" class="edge">
123 <title>yr1&#45;&gt;red1</title>
124 <path fill="none" stroke="black" d="M261.62,-291.69C259.71,-292.87 257.75,-294.08 255.79,-295.28"/>
125 <polygon fill="black" stroke="black" points="253.91,-292.33 247.23,-300.56 257.58,-298.29 253.91,-292.33"/>
107126 </g>
108127 <!-- rg1 -->
109 <g id="node6" class="node"><title>rg1</title>
110 <polygon fill="none" stroke="black" points="-7.14375,-133.035 -61.1437,-133.035 -61.1437,-97.0355 -7.14375,-97.0355 -7.14375,-133.035"/>
111 <text text-anchor="middle" x="-34.1437" y="-111.335" font-family="Times New Roman,serif" font-size="14.00">rg1</text>
128 <g id="node6" class="node">
129 <title>rg1</title>
130 <polygon fill="none" stroke="black" points="173.96,-373.32 119.96,-373.32 119.96,-337.32 173.96,-337.32 173.96,-373.32"/>
131 <text text-anchor="middle" x="146.96" y="-351.62" font-family="Times New Roman,serif" font-size="14.00">rg1</text>
112132 </g>
113133 <!-- green1 -->
114 <g id="node11" class="node"><title>green1</title>
115 <ellipse fill="none" stroke="black" cx="12.8698" cy="-188.389" rx="32.5" ry="32.5"/>
116 <text text-anchor="middle" x="12.8698" y="-184.689" font-family="Times New Roman,serif" font-size="14.00">green1</text>
134 <g id="node11" class="node">
135 <title>green1</title>
136 <ellipse fill="none" stroke="black" cx="191.7" cy="-425.14" rx="32.5" ry="32.5"/>
137 <text text-anchor="middle" x="191.7" y="-421.44" font-family="Times New Roman,serif" font-size="14.00">green1</text>
117138 </g>
118139 <!-- rg1&#45;&gt;green1 -->
119 <g id="edge10" class="edge"><title>rg1&#45;&gt;green1</title>
120 <path fill="none" stroke="black" d="M-22.5224,-133.168C-18.8584,-138.885 -14.6715,-145.417 -10.4908,-151.94"/>
121 <polygon fill="black" stroke="black" points="-13.1861,-154.221 -4.84329,-160.752 -7.29262,-150.444 -13.1861,-154.221"/>
140 <g id="edge10" class="edge">
141 <title>rg1&#45;&gt;green1</title>
142 <path fill="none" stroke="black" d="M158.72,-373.67C161.81,-378.49 165.25,-383.87 168.72,-389.27"/>
143 <polygon fill="black" stroke="black" points="165.79,-391.19 174.13,-397.72 171.68,-387.41 165.79,-391.19"/>
122144 </g>
123145 <!-- green2&#45;&gt;gy2 -->
124 <g id="edge6" class="edge"><title>green2&#45;&gt;gy2</title>
125 <path fill="none" stroke="black" d="M-43.9939,186.178C-50.5484,185.724 -57.4867,185.243 -64.1919,184.778"/>
126 <polygon fill="black" stroke="black" points="-64.7142,188.25 -74.4481,184.066 -64.2299,181.267 -64.7142,188.25"/>
146 <g id="edge6" class="edge">
147 <title>green2&#45;&gt;gy2</title>
148 <path fill="none" stroke="black" d="M136.12,-68.75C130.86,-69.11 125.37,-69.5 120,-69.87"/>
149 <polygon fill="black" stroke="black" points="119.65,-66.38 109.92,-70.57 120.14,-73.37 119.65,-66.38"/>
127150 </g>
128151 <!-- yellow2&#45;&gt;yr2 -->
129 <g id="edge7" class="edge"><title>yellow2&#45;&gt;yr2</title>
130 <path fill="none" stroke="black" d="M-139.878,79.1223C-136.429,72.1055 -132.765,64.6522 -129.369,57.7438"/>
131 <polygon fill="black" stroke="black" points="-132.502,56.1834 -124.949,48.7531 -126.22,59.2715 -132.502,56.1834"/>
152 <g id="edge7" class="edge">
153 <title>yellow2&#45;&gt;yr2</title>
154 <path fill="none" stroke="black" d="M46.96,-171.81C49.82,-177.64 52.82,-183.74 55.65,-189.5"/>
155 <polygon fill="black" stroke="black" points="52.65,-191.33 60.2,-198.76 58.93,-188.24 52.65,-191.33"/>
132156 </g>
133157 <!-- red2&#45;&gt;rg2 -->
134 <g id="edge8" class="edge"><title>red2&#45;&gt;rg2</title>
135 <path fill="none" stroke="black" d="M-13.6545,90.0147C-10.0687,91.8479 -6.37215,93.7377 -2.70142,95.6143"/>
136 <polygon fill="black" stroke="black" points="-1.01848,92.5437 6.29223,100.212 -4.20489,98.7765 -1.01848,92.5437"/>
158 <g id="edge8" class="edge">
159 <title>red2&#45;&gt;rg2</title>
160 <path fill="none" stroke="black" d="M167.71,-159.53C170.06,-158.33 172.45,-157.11 174.84,-155.89"/>
161 <polygon fill="black" stroke="black" points="176.66,-158.89 183.97,-151.22 173.48,-152.65 176.66,-158.89"/>
137162 </g>
138163 <!-- safe2&#45;&gt;rg2 -->
139 <g id="edge5" class="edge"><title>safe2&#45;&gt;rg2</title>
140 <path fill="none" stroke="black" d="M76.2895,77.8712C71.9454,81.5338 67.3876,85.3766 62.9312,89.1338"/>
141 <polygon fill="black" stroke="black" points="64.9887,91.9771 55.0873,95.7471 60.4766,86.6253 64.9887,91.9771"/>
164 <g id="edge5" class="edge">
165 <title>safe2&#45;&gt;rg2</title>
166 <path fill="none" stroke="black" d="M250.59,-170.49C247.25,-167.67 243.8,-164.76 240.4,-161.89"/>
167 <polygon fill="black" stroke="black" points="242.51,-159.1 232.61,-155.33 238,-164.45 242.51,-159.1"/>
142168 </g>
143169 <!-- green1&#45;&gt;gy1 -->
144 <g id="edge14" class="edge"><title>green1&#45;&gt;gy1</title>
145 <path fill="none" stroke="black" d="M45.44,-185.854C51.9982,-185.343 58.9404,-184.803 65.6494,-184.281"/>
146 <polygon fill="black" stroke="black" points="66.2131,-187.747 75.9113,-183.482 65.6698,-180.769 66.2131,-187.747"/>
170 <g id="edge14" class="edge">
171 <title>green1&#45;&gt;gy1</title>
172 <path fill="none" stroke="black" d="M224.17,-422.61C229.43,-422.2 234.92,-421.77 240.29,-421.35"/>
173 <polygon fill="black" stroke="black" points="240.68,-424.83 250.38,-420.57 240.14,-417.86 240.68,-424.83"/>
147174 </g>
148175 <!-- yellow1&#45;&gt;yr1 -->
149 <g id="edge15" class="edge"><title>yellow1&#45;&gt;yr1</title>
150 <path fill="none" stroke="black" d="M139.886,-78.46C136.403,-71.8351 132.712,-64.8142 129.262,-58.2527"/>
151 <polygon fill="black" stroke="black" points="132.184,-56.2899 124.433,-49.0673 125.988,-59.5474 132.184,-56.2899"/>
176 <g id="edge15" class="edge">
177 <title>yellow1&#45;&gt;yr1</title>
178 <path fill="none" stroke="black" d="M311.93,-319.26C308.97,-313.63 305.88,-307.75 302.95,-302.18"/>
179 <polygon fill="black" stroke="black" points="305.98,-300.43 298.23,-293.21 299.79,-303.69 305.98,-300.43"/>
152180 </g>
153181 <!-- red1&#45;&gt;rg1 -->
154 <g id="edge16" class="edge"><title>red1&#45;&gt;rg1</title>
155 <path fill="none" stroke="black" d="M12.6438,-90.7482C9.2669,-92.5011 5.7914,-94.3053 2.33239,-96.1008"/>
156 <polygon fill="black" stroke="black" points="0.556638,-93.0791 -6.70627,-100.793 3.78173,-99.2919 0.556638,-93.0791"/>
182 <g id="edge16" class="edge">
183 <title>red1&#45;&gt;rg1</title>
184 <path fill="none" stroke="black" d="M190.25,-332.85C187.91,-334.07 185.53,-335.3 183.15,-336.54"/>
185 <polygon fill="black" stroke="black" points="181.33,-333.54 174.07,-341.25 184.55,-339.75 181.33,-333.54"/>
157186 </g>
158187 <!-- safe1&#45;&gt;rg1 -->
159 <g id="edge13" class="edge"><title>safe1&#45;&gt;rg1</title>
160 <path fill="none" stroke="black" d="M-76.8968,-78.4199C-72.3648,-82.3013 -67.5992,-86.3827 -62.9608,-90.3553"/>
161 <polygon fill="black" stroke="black" points="-65.2102,-93.037 -55.3383,-96.8835 -60.6568,-87.7203 -65.2102,-93.037"/>
188 <g id="edge13" class="edge">
189 <title>safe1&#45;&gt;rg1</title>
190 <path fill="none" stroke="black" d="M107.74,-321.73C111.07,-324.58 114.5,-327.53 117.89,-330.43"/>
191 <polygon fill="black" stroke="black" points="115.78,-333.23 125.65,-337.07 120.33,-327.91 115.78,-333.23"/>
162192 </g>
163193 </g>
164194 </svg>
00 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
11 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
22 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.38.0 (20140413.2041)
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
44 -->
55 <!-- Title: unix Pages: 1 -->
6 <svg width="432pt" height="345pt"
7 viewBox="0.00 0.00 432.00 344.66" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(0.451132 0.451132) rotate(0) translate(4 760)">
6 <svg width="432pt" height="339pt"
7 viewBox="0.00 0.00 432.00 339.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(0.44 0.44) rotate(0) translate(4 760)">
99 <title>unix</title>
10 <polygon fill="white" stroke="none" points="-4,4 -4,-760 953.592,-760 953.592,4 -4,4"/>
10 <polygon fill="white" stroke="transparent" points="-4,4 -4,-760 969.59,-760 969.59,4 -4,4"/>
1111 <!-- 5th Edition -->
12 <g id="node1" class="node"><title>5th Edition</title>
13 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="581.247" cy="-738" rx="50.0912" ry="18"/>
14 <text text-anchor="middle" x="581.247" y="-734.3" font-family="Times New Roman,serif" font-size="14.00">5th Edition</text>
12 <g id="node1" class="node">
13 <title>5th Edition</title>
14 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="511.25" cy="-738" rx="50.09" ry="18"/>
15 <text text-anchor="middle" x="511.25" y="-734.3" font-family="Times New Roman,serif" font-size="14.00">5th Edition</text>
1516 </g>
1617 <!-- 6th Edition -->
17 <g id="node2" class="node"><title>6th Edition</title>
18 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="425.247" cy="-666" rx="50.0912" ry="18"/>
19 <text text-anchor="middle" x="425.247" y="-662.3" font-family="Times New Roman,serif" font-size="14.00">6th Edition</text>
18 <g id="node2" class="node">
19 <title>6th Edition</title>
20 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="415.25" cy="-666" rx="50.09" ry="18"/>
21 <text text-anchor="middle" x="415.25" y="-662.3" font-family="Times New Roman,serif" font-size="14.00">6th Edition</text>
2022 </g>
2123 <!-- 5th Edition&#45;&gt;6th Edition -->
22 <g id="edge1" class="edge"><title>5th Edition&#45;&gt;6th Edition</title>
23 <path fill="none" stroke="black" d="M551.169,-723.503C526.458,-712.415 491.271,-696.626 464.372,-684.556"/>
24 <polygon fill="black" stroke="black" points="465.79,-681.356 455.233,-680.455 462.924,-687.743 465.79,-681.356"/>
24 <g id="edge1" class="edge">
25 <title>5th Edition&#45;&gt;6th Edition</title>
26 <path fill="none" stroke="black" d="M489.94,-721.46C476.64,-711.77 459.34,-699.15 444.73,-688.5"/>
27 <polygon fill="black" stroke="black" points="446.64,-685.56 436.49,-682.49 442.51,-691.21 446.64,-685.56"/>
2528 </g>
2629 <!-- PWB 1.0 -->
27 <g id="node3" class="node"><title>PWB 1.0</title>
28 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="677.247" cy="-666" rx="44.393" ry="18"/>
29 <text text-anchor="middle" x="677.247" y="-662.3" font-family="Times New Roman,serif" font-size="14.00">PWB 1.0</text>
30 <g id="node3" class="node">
31 <title>PWB 1.0</title>
32 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="667.25" cy="-666" rx="44.39" ry="18"/>
33 <text text-anchor="middle" x="667.25" y="-662.3" font-family="Times New Roman,serif" font-size="14.00">PWB 1.0</text>
3034 </g>
3135 <!-- 5th Edition&#45;&gt;PWB 1.0 -->
32 <g id="edge2" class="edge"><title>5th Edition&#45;&gt;PWB 1.0</title>
33 <path fill="none" stroke="black" d="M602.553,-721.465C616.036,-711.633 633.641,-698.797 648.372,-688.055"/>
34 <polygon fill="black" stroke="black" points="650.642,-690.731 656.66,-682.011 646.518,-685.075 650.642,-690.731"/>
36 <g id="edge2" class="edge">
37 <title>5th Edition&#45;&gt;PWB 1.0</title>
38 <path fill="none" stroke="black" d="M541.33,-723.5C566.43,-712.24 602.35,-696.12 629.41,-683.98"/>
39 <polygon fill="black" stroke="black" points="630.89,-687.15 638.58,-679.86 628.02,-680.77 630.89,-687.15"/>
3540 </g>
3641 <!-- LSX -->
37 <g id="node4" class="node"><title>LSX</title>
38 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="587.247" cy="-594" rx="27.8951" ry="18"/>
39 <text text-anchor="middle" x="587.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">LSX</text>
42 <g id="node4" class="node">
43 <title>LSX</title>
44 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="577.25" cy="-594" rx="27.9" ry="18"/>
45 <text text-anchor="middle" x="577.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">LSX</text>
4046 </g>
4147 <!-- 6th Edition&#45;&gt;LSX -->
42 <g id="edge3" class="edge"><title>6th Edition&#45;&gt;LSX</title>
43 <path fill="none" stroke="black" d="M456.695,-651.97C482.04,-641.396 518.551,-625.998 550.247,-612 552.042,-611.208 553.882,-610.387 555.737,-609.554"/>
44 <polygon fill="black" stroke="black" points="557.331,-612.675 564.991,-605.355 554.438,-606.3 557.331,-612.675"/>
48 <g id="edge3" class="edge">
49 <title>6th Edition&#45;&gt;LSX</title>
50 <path fill="none" stroke="black" d="M446.69,-651.97C472.04,-641.4 508.55,-626 540.25,-612 542.04,-611.21 543.88,-610.39 545.74,-609.55"/>
51 <polygon fill="black" stroke="black" points="547.33,-612.67 554.99,-605.36 544.44,-606.3 547.33,-612.67"/>
4552 </g>
4653 <!-- 1 BSD -->
47 <g id="node5" class="node"><title>1 BSD</title>
48 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="127.247" cy="-594" rx="35.194" ry="18"/>
49 <text text-anchor="middle" x="127.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">1 BSD</text>
54 <g id="node5" class="node">
55 <title>1 BSD</title>
56 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="120.25" cy="-594" rx="35.19" ry="18"/>
57 <text text-anchor="middle" x="120.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">1 BSD</text>
5058 </g>
5159 <!-- 6th Edition&#45;&gt;1 BSD -->
52 <g id="edge4" class="edge"><title>6th Edition&#45;&gt;1 BSD</title>
53 <path fill="none" stroke="black" d="M384.437,-655.414C327.595,-642.061 225.177,-618.004 168.239,-604.629"/>
54 <polygon fill="black" stroke="black" points="169.03,-601.219 158.494,-602.34 167.429,-608.034 169.03,-601.219"/>
60 <g id="edge4" class="edge">
61 <title>6th Edition&#45;&gt;1 BSD</title>
62 <path fill="none" stroke="black" d="M374.54,-655.34C318.44,-642.03 217.93,-618.18 161.53,-604.8"/>
63 <polygon fill="black" stroke="black" points="162.07,-601.33 151.53,-602.42 160.46,-608.14 162.07,-601.33"/>
5564 </g>
5665 <!-- Mini Unix -->
57 <g id="node6" class="node"><title>Mini Unix</title>
58 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="365.247" cy="-594" rx="46.2923" ry="18"/>
59 <text text-anchor="middle" x="365.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">Mini Unix</text>
66 <g id="node6" class="node">
67 <title>Mini Unix</title>
68 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="355.25" cy="-594" rx="46.29" ry="18"/>
69 <text text-anchor="middle" x="355.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">Mini Unix</text>
6070 </g>
6171 <!-- 6th Edition&#45;&gt;Mini Unix -->
62 <g id="edge5" class="edge"><title>6th Edition&#45;&gt;Mini Unix</title>
63 <path fill="none" stroke="black" d="M411.028,-648.411C403.556,-639.693 394.258,-628.845 385.997,-619.208"/>
64 <polygon fill="black" stroke="black" points="388.53,-616.785 379.365,-611.47 383.215,-621.34 388.53,-616.785"/>
72 <g id="edge5" class="edge">
73 <title>6th Edition&#45;&gt;Mini Unix</title>
74 <path fill="none" stroke="black" d="M401.03,-648.41C393.56,-639.69 384.26,-628.85 376,-619.21"/>
75 <polygon fill="black" stroke="black" points="378.53,-616.78 369.36,-611.47 373.22,-621.34 378.53,-616.78"/>
6576 </g>
6677 <!-- Wollongong -->
67 <g id="node7" class="node"><title>Wollongong</title>
68 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="485.247" cy="-594" rx="55.7903" ry="18"/>
69 <text text-anchor="middle" x="485.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">Wollongong</text>
78 <g id="node7" class="node">
79 <title>Wollongong</title>
80 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="475.25" cy="-594" rx="55.79" ry="18"/>
81 <text text-anchor="middle" x="475.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">Wollongong</text>
7082 </g>
7183 <!-- 6th Edition&#45;&gt;Wollongong -->
72 <g id="edge6" class="edge"><title>6th Edition&#45;&gt;Wollongong</title>
73 <path fill="none" stroke="black" d="M439.467,-648.411C446.939,-639.693 456.237,-628.845 464.498,-619.208"/>
74 <polygon fill="black" stroke="black" points="467.28,-621.34 471.13,-611.47 461.965,-616.785 467.28,-621.34"/>
84 <g id="edge6" class="edge">
85 <title>6th Edition&#45;&gt;Wollongong</title>
86 <path fill="none" stroke="black" d="M429.47,-648.41C436.94,-639.69 446.24,-628.85 454.5,-619.21"/>
87 <polygon fill="black" stroke="black" points="457.28,-621.34 461.13,-611.47 451.96,-616.78 457.28,-621.34"/>
7588 </g>
7689 <!-- Interdata -->
77 <g id="node8" class="node"><title>Interdata</title>
78 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="259.247" cy="-594" rx="42.4939" ry="18"/>
79 <text text-anchor="middle" x="259.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">Interdata</text>
90 <g id="node8" class="node">
91 <title>Interdata</title>
92 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="249.25" cy="-594" rx="42.49" ry="18"/>
93 <text text-anchor="middle" x="249.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">Interdata</text>
8094 </g>
8195 <!-- 6th Edition&#45;&gt;Interdata -->
82 <g id="edge7" class="edge"><title>6th Edition&#45;&gt;Interdata</title>
83 <path fill="none" stroke="black" d="M394.024,-651.834C366.685,-640.305 326.868,-623.515 297.598,-611.172"/>
84 <polygon fill="black" stroke="black" points="298.683,-607.831 288.109,-607.171 295.963,-614.281 298.683,-607.831"/>
96 <g id="edge7" class="edge">
97 <title>6th Edition&#45;&gt;Interdata</title>
98 <path fill="none" stroke="black" d="M384.02,-651.83C356.69,-640.31 316.87,-623.51 287.6,-611.17"/>
99 <polygon fill="black" stroke="black" points="288.68,-607.83 278.11,-607.17 285.96,-614.28 288.68,-607.83"/>
85100 </g>
86101 <!-- PWB 1.2 -->
87 <g id="node28" class="node"><title>PWB 1.2</title>
88 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="677.247" cy="-594" rx="44.393" ry="18"/>
89 <text text-anchor="middle" x="677.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">PWB 1.2</text>
102 <g id="node28" class="node">
103 <title>PWB 1.2</title>
104 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="667.25" cy="-594" rx="44.39" ry="18"/>
105 <text text-anchor="middle" x="667.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">PWB 1.2</text>
90106 </g>
91107 <!-- PWB 1.0&#45;&gt;PWB 1.2 -->
92 <g id="edge31" class="edge"><title>PWB 1.0&#45;&gt;PWB 1.2</title>
93 <path fill="none" stroke="black" d="M677.247,-647.697C677.247,-639.983 677.247,-630.712 677.247,-622.112"/>
94 <polygon fill="black" stroke="black" points="680.748,-622.104 677.247,-612.104 673.748,-622.104 680.748,-622.104"/>
108 <g id="edge31" class="edge">
109 <title>PWB 1.0&#45;&gt;PWB 1.2</title>
110 <path fill="none" stroke="black" d="M667.25,-647.7C667.25,-639.98 667.25,-630.71 667.25,-622.11"/>
111 <polygon fill="black" stroke="black" points="670.75,-622.1 667.25,-612.1 663.75,-622.1 670.75,-622.1"/>
95112 </g>
96113 <!-- USG 1.0 -->
97 <g id="node29" class="node"><title>USG 1.0</title>
98 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="782.247" cy="-594" rx="42.7926" ry="18"/>
99 <text text-anchor="middle" x="782.247" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">USG 1.0</text>
114 <g id="node29" class="node">
115 <title>USG 1.0</title>
116 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="772.25" cy="-594" rx="42.79" ry="18"/>
117 <text text-anchor="middle" x="772.25" y="-590.3" font-family="Times New Roman,serif" font-size="14.00">USG 1.0</text>
100118 </g>
101119 <!-- PWB 1.0&#45;&gt;USG 1.0 -->
102 <g id="edge32" class="edge"><title>PWB 1.0&#45;&gt;USG 1.0</title>
103 <path fill="none" stroke="black" d="M699.259,-650.326C714.519,-640.152 735.039,-626.472 751.856,-615.261"/>
104 <polygon fill="black" stroke="black" points="753.886,-618.114 760.265,-609.655 750.003,-612.29 753.886,-618.114"/>
120 <g id="edge32" class="edge">
121 <title>PWB 1.0&#45;&gt;USG 1.0</title>
122 <path fill="none" stroke="black" d="M689.26,-650.33C704.52,-640.15 725.04,-626.47 741.86,-615.26"/>
123 <polygon fill="black" stroke="black" points="743.89,-618.11 750.26,-609.65 740,-612.29 743.89,-618.11"/>
105124 </g>
106125 <!-- 2 BSD -->
107 <g id="node19" class="node"><title>2 BSD</title>
108 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="89.2474" cy="-234" rx="35.194" ry="18"/>
109 <text text-anchor="middle" x="89.2474" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">2 BSD</text>
126 <g id="node19" class="node">
127 <title>2 BSD</title>
128 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="77.25" cy="-234" rx="35.19" ry="18"/>
129 <text text-anchor="middle" x="77.25" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">2 BSD</text>
110130 </g>
111131 <!-- 1 BSD&#45;&gt;2 BSD -->
112 <g id="edge19" class="edge"><title>1 BSD&#45;&gt;2 BSD</title>
113 <path fill="none" stroke="black" d="M122.111,-576.134C114.533,-549.719 101.247,-496.865 101.247,-451 101.247,-451 101.247,-451 101.247,-377 101.247,-336.853 96.426,-290.548 92.8954,-262.022"/>
114 <polygon fill="black" stroke="black" points="96.3555,-261.487 91.6182,-252.01 89.4118,-262.373 96.3555,-261.487"/>
132 <g id="edge19" class="edge">
133 <title>1 BSD&#45;&gt;2 BSD</title>
134 <path fill="none" stroke="black" d="M114.12,-576.21C105.09,-549.9 89.25,-497.18 89.25,-451 89.25,-451 89.25,-451 89.25,-377 89.25,-336.85 84.43,-290.55 80.9,-262.02"/>
135 <polygon fill="black" stroke="black" points="84.36,-261.49 79.62,-252.01 77.41,-262.37 84.36,-261.49"/>
115136 </g>
116137 <!-- Unix/TS 3.0 -->
117 <g id="node9" class="node"><title>Unix/TS 3.0</title>
118 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="617.247" cy="-378" rx="55.4913" ry="18"/>
119 <text text-anchor="middle" x="617.247" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">Unix/TS 3.0</text>
138 <g id="node9" class="node">
139 <title>Unix/TS 3.0</title>
140 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="602.25" cy="-378" rx="55.49" ry="18"/>
141 <text text-anchor="middle" x="602.25" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">Unix/TS 3.0</text>
120142 </g>
121143 <!-- Interdata&#45;&gt;Unix/TS 3.0 -->
122 <g id="edge8" class="edge"><title>Interdata&#45;&gt;Unix/TS 3.0</title>
123 <path fill="none" stroke="black" d="M282.737,-578.959C344.347,-542.13 510.807,-442.627 583.035,-399.451"/>
124 <polygon fill="black" stroke="black" points="584.982,-402.365 591.77,-394.229 581.391,-396.356 584.982,-402.365"/>
144 <g id="edge8" class="edge">
145 <title>Interdata&#45;&gt;Unix/TS 3.0</title>
146 <path fill="none" stroke="black" d="M272.68,-578.79C333.67,-541.82 497.51,-442.49 568.59,-399.41"/>
147 <polygon fill="black" stroke="black" points="570.44,-402.37 577.18,-394.2 566.81,-396.39 570.44,-402.37"/>
125148 </g>
126149 <!-- PWB 2.0 -->
127 <g id="node10" class="node"><title>PWB 2.0</title>
128 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="560.247" cy="-522" rx="44.393" ry="18"/>
129 <text text-anchor="middle" x="560.247" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">PWB 2.0</text>
150 <g id="node10" class="node">
151 <title>PWB 2.0</title>
152 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="548.25" cy="-522" rx="44.39" ry="18"/>
153 <text text-anchor="middle" x="548.25" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">PWB 2.0</text>
130154 </g>
131155 <!-- Interdata&#45;&gt;PWB 2.0 -->
132 <g id="edge9" class="edge"><title>Interdata&#45;&gt;PWB 2.0</title>
133 <path fill="none" stroke="black" d="M290.605,-581.802C297.053,-579.71 303.833,-577.662 310.247,-576 394.292,-554.222 417.818,-560.235 502.247,-540 506.852,-538.896 511.635,-537.654 516.392,-536.355"/>
134 <polygon fill="black" stroke="black" points="517.371,-539.715 526.05,-533.638 515.476,-532.977 517.371,-539.715"/>
156 <g id="edge9" class="edge">
157 <title>Interdata&#45;&gt;PWB 2.0</title>
158 <path fill="none" stroke="black" d="M280.61,-581.81C287.06,-579.72 293.83,-577.67 300.25,-576 383.43,-554.36 406.69,-560.11 490.25,-540 494.85,-538.89 499.63,-537.65 504.39,-536.35"/>
159 <polygon fill="black" stroke="black" points="505.37,-539.71 514.05,-533.63 503.47,-532.97 505.37,-539.71"/>
135160 </g>
136161 <!-- 7th Edition -->
137 <g id="node11" class="node"><title>7th Edition</title>
138 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="259.247" cy="-522" rx="50.0912" ry="18"/>
139 <text text-anchor="middle" x="259.247" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">7th Edition</text>
162 <g id="node11" class="node">
163 <title>7th Edition</title>
164 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="249.25" cy="-522" rx="50.09" ry="18"/>
165 <text text-anchor="middle" x="249.25" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">7th Edition</text>
140166 </g>
141167 <!-- Interdata&#45;&gt;7th Edition -->
142 <g id="edge10" class="edge"><title>Interdata&#45;&gt;7th Edition</title>
143 <path fill="none" stroke="black" d="M259.247,-575.697C259.247,-567.983 259.247,-558.712 259.247,-550.112"/>
144 <polygon fill="black" stroke="black" points="262.748,-550.104 259.247,-540.104 255.748,-550.104 262.748,-550.104"/>
168 <g id="edge10" class="edge">
169 <title>Interdata&#45;&gt;7th Edition</title>
170 <path fill="none" stroke="black" d="M249.25,-575.7C249.25,-567.98 249.25,-558.71 249.25,-550.11"/>
171 <polygon fill="black" stroke="black" points="252.75,-550.1 249.25,-540.1 245.75,-550.1 252.75,-550.1"/>
145172 </g>
146173 <!-- TS 4.0 -->
147 <g id="node38" class="node"><title>TS 4.0</title>
148 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="671.247" cy="-234" rx="35.9954" ry="18"/>
149 <text text-anchor="middle" x="671.247" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">TS 4.0</text>
174 <g id="node38" class="node">
175 <title>TS 4.0</title>
176 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="687.25" cy="-234" rx="36" ry="18"/>
177 <text text-anchor="middle" x="687.25" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">TS 4.0</text>
150178 </g>
151179 <!-- Unix/TS 3.0&#45;&gt;TS 4.0 -->
152 <g id="edge44" class="edge"><title>Unix/TS 3.0&#45;&gt;TS 4.0</title>
153 <path fill="none" stroke="black" d="M623.761,-359.871C633.096,-335.325 650.355,-289.938 661.296,-261.17"/>
154 <polygon fill="black" stroke="black" points="664.595,-262.339 664.878,-251.748 658.052,-259.851 664.595,-262.339"/>
180 <g id="edge44" class="edge">
181 <title>Unix/TS 3.0&#45;&gt;TS 4.0</title>
182 <path fill="none" stroke="black" d="M612.33,-360.15C627.17,-335.36 655,-288.88 672.24,-260.07"/>
183 <polygon fill="black" stroke="black" points="675.31,-261.76 677.44,-251.39 669.3,-258.17 675.31,-261.76"/>
155184 </g>
156185 <!-- PWB 2.0&#45;&gt;Unix/TS 3.0 -->
157 <g id="edge42" class="edge"><title>PWB 2.0&#45;&gt;Unix/TS 3.0</title>
158 <path fill="none" stroke="black" d="M557.747,-503.773C555.824,-485.212 554.991,-455.216 565.247,-432 570.375,-420.393 579.248,-409.876 588.228,-401.327"/>
159 <polygon fill="black" stroke="black" points="590.597,-403.904 595.716,-394.627 585.929,-398.687 590.597,-403.904"/>
186 <g id="edge42" class="edge">
187 <title>PWB 2.0&#45;&gt;Unix/TS 3.0</title>
188 <path fill="none" stroke="black" d="M545.02,-503.83C542.35,-485.31 540.4,-455.35 550.25,-432 555.14,-420.4 563.87,-409.94 572.79,-401.43"/>
189 <polygon fill="black" stroke="black" points="575.13,-404.04 580.25,-394.77 570.46,-398.82 575.13,-404.04"/>
160190 </g>
161191 <!-- 8th Edition -->
162 <g id="node12" class="node"><title>8th Edition</title>
163 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="460.247" cy="-162" rx="50.0912" ry="18"/>
164 <text text-anchor="middle" x="460.247" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">8th Edition</text>
192 <g id="node12" class="node">
193 <title>8th Edition</title>
194 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="448.25" cy="-162" rx="50.09" ry="18"/>
195 <text text-anchor="middle" x="448.25" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">8th Edition</text>
165196 </g>
166197 <!-- 7th Edition&#45;&gt;8th Edition -->
167 <g id="edge11" class="edge"><title>7th Edition&#45;&gt;8th Edition</title>
168 <path fill="none" stroke="black" d="M302.4,-512.879C347.423,-503.537 413.844,-487.017 431.247,-468 458.553,-438.161 450.247,-419.447 450.247,-379 450.247,-379 450.247,-379 450.247,-305 450.247,-264.897 454.265,-218.58 457.207,-190.04"/>
169 <polygon fill="black" stroke="black" points="460.696,-190.336 458.272,-180.022 453.735,-189.596 460.696,-190.336"/>
198 <g id="edge11" class="edge">
199 <title>7th Edition&#45;&gt;8th Edition</title>
200 <path fill="none" stroke="black" d="M292.31,-512.73C336.8,-503.31 402.11,-486.79 419.25,-468 446.5,-438.12 438.25,-419.45 438.25,-379 438.25,-379 438.25,-379 438.25,-305 438.25,-264.9 442.27,-218.58 445.21,-190.04"/>
201 <polygon fill="black" stroke="black" points="448.7,-190.34 446.27,-180.02 441.73,-189.6 448.7,-190.34"/>
170202 </g>
171203 <!-- 32V -->
172 <g id="node13" class="node"><title>32V</title>
173 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="395.247" cy="-450" rx="27" ry="18"/>
174 <text text-anchor="middle" x="395.247" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">32V</text>
204 <g id="node13" class="node">
205 <title>32V</title>
206 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="383.25" cy="-450" rx="27" ry="18"/>
207 <text text-anchor="middle" x="383.25" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">32V</text>
175208 </g>
176209 <!-- 7th Edition&#45;&gt;32V -->
177 <g id="edge12" class="edge"><title>7th Edition&#45;&gt;32V</title>
178 <path fill="none" stroke="black" d="M286.769,-506.834C309.554,-495.107 341.871,-478.473 365.3,-466.414"/>
179 <polygon fill="black" stroke="black" points="367.14,-469.403 374.43,-461.715 363.937,-463.179 367.14,-469.403"/>
210 <g id="edge12" class="edge">
211 <title>7th Edition&#45;&gt;32V</title>
212 <path fill="none" stroke="black" d="M276.36,-506.83C298.81,-495.11 330.66,-478.47 353.74,-466.41"/>
213 <polygon fill="black" stroke="black" points="355.49,-469.45 362.74,-461.71 352.25,-463.24 355.49,-469.45"/>
180214 </g>
181215 <!-- V7M -->
182 <g id="node14" class="node"><title>V7M</title>
183 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="29.2474" cy="-378" rx="29.4969" ry="18"/>
184 <text text-anchor="middle" x="29.2474" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">V7M</text>
216 <g id="node14" class="node">
217 <title>V7M</title>
218 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="29.25" cy="-378" rx="29.5" ry="18"/>
219 <text text-anchor="middle" x="29.25" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">V7M</text>
185220 </g>
186221 <!-- 7th Edition&#45;&gt;V7M -->
187 <g id="edge13" class="edge"><title>7th Edition&#45;&gt;V7M</title>
188 <path fill="none" stroke="black" d="M224.899,-508.836C199.981,-499.335 165.933,-484.928 138.247,-468 106.089,-448.337 73.1008,-420.047 51.9643,-400.672"/>
189 <polygon fill="black" stroke="black" points="54.1816,-397.955 44.4703,-393.719 49.4206,-403.086 54.1816,-397.955"/>
222 <g id="edge13" class="edge">
223 <title>7th Edition&#45;&gt;V7M</title>
224 <path fill="none" stroke="black" d="M213.74,-509.31C188.29,-500.09 153.77,-485.82 126.25,-468 97.08,-449.11 68.34,-421.26 49.81,-401.76"/>
225 <polygon fill="black" stroke="black" points="52.15,-399.14 42.76,-394.22 47.03,-403.92 52.15,-399.14"/>
190226 </g>
191227 <!-- Ultrix&#45;11 -->
192 <g id="node15" class="node"><title>Ultrix&#45;11</title>
193 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="120.247" cy="-90" rx="42.4939" ry="18"/>
194 <text text-anchor="middle" x="120.247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">Ultrix&#45;11</text>
228 <g id="node15" class="node">
229 <title>Ultrix&#45;11</title>
230 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="108.25" cy="-90" rx="42.49" ry="18"/>
231 <text text-anchor="middle" x="108.25" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">Ultrix&#45;11</text>
195232 </g>
196233 <!-- 7th Edition&#45;&gt;Ultrix&#45;11 -->
197 <g id="edge14" class="edge"><title>7th Edition&#45;&gt;Ultrix&#45;11</title>
198 <path fill="none" stroke="black" d="M225.626,-508.64C206.847,-500.043 184.606,-486.731 171.247,-468 147.762,-435.07 152.247,-419.447 152.247,-379 152.247,-379 152.247,-379 152.247,-233 152.247,-192.037 139.418,-146.018 130.006,-117.768"/>
199 <polygon fill="black" stroke="black" points="133.281,-116.528 126.723,-108.207 126.66,-118.801 133.281,-116.528"/>
234 <g id="edge14" class="edge">
235 <title>7th Edition&#45;&gt;Ultrix&#45;11</title>
236 <path fill="none" stroke="black" d="M214.87,-508.82C195.67,-500.29 172.92,-486.98 159.25,-468 135.6,-435.19 140.25,-419.45 140.25,-379 140.25,-379 140.25,-379 140.25,-233 140.25,-192.04 127.42,-146.02 118.01,-117.77"/>
237 <polygon fill="black" stroke="black" points="121.28,-116.53 114.72,-108.21 114.66,-118.8 121.28,-116.53"/>
200238 </g>
201239 <!-- Xenix -->
202 <g id="node16" class="node"><title>Xenix</title>
203 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="212.247" cy="-450" rx="31.6951" ry="18"/>
204 <text text-anchor="middle" x="212.247" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">Xenix</text>
240 <g id="node16" class="node">
241 <title>Xenix</title>
242 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="200.25" cy="-450" rx="31.7" ry="18"/>
243 <text text-anchor="middle" x="200.25" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">Xenix</text>
205244 </g>
206245 <!-- 7th Edition&#45;&gt;Xenix -->
207 <g id="edge15" class="edge"><title>7th Edition&#45;&gt;Xenix</title>
208 <path fill="none" stroke="black" d="M248.109,-504.411C242.29,-495.744 235.057,-484.971 228.614,-475.375"/>
209 <polygon fill="black" stroke="black" points="231.462,-473.339 222.982,-466.988 225.651,-477.241 231.462,-473.339"/>
246 <g id="edge15" class="edge">
247 <title>7th Edition&#45;&gt;Xenix</title>
248 <path fill="none" stroke="black" d="M237.64,-504.41C231.57,-495.74 224.03,-484.97 217.31,-475.38"/>
249 <polygon fill="black" stroke="black" points="220.04,-473.17 211.44,-466.99 214.31,-477.19 220.04,-473.17"/>
210250 </g>
211251 <!-- UniPlus+ -->
212 <g id="node17" class="node"><title>UniPlus+</title>
213 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="306.247" cy="-450" rx="44.393" ry="18"/>
214 <text text-anchor="middle" x="306.247" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">UniPlus+</text>
252 <g id="node17" class="node">
253 <title>UniPlus+</title>
254 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="294.25" cy="-450" rx="44.39" ry="18"/>
255 <text text-anchor="middle" x="294.25" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">UniPlus+</text>
215256 </g>
216257 <!-- 7th Edition&#45;&gt;UniPlus+ -->
217 <g id="edge16" class="edge"><title>7th Edition&#45;&gt;UniPlus+</title>
218 <path fill="none" stroke="black" d="M270.386,-504.411C276.122,-495.868 283.232,-485.278 289.604,-475.787"/>
219 <polygon fill="black" stroke="black" points="292.52,-477.723 295.189,-467.47 286.709,-473.821 292.52,-477.723"/>
258 <g id="edge16" class="edge">
259 <title>7th Edition&#45;&gt;UniPlus+</title>
260 <path fill="none" stroke="black" d="M259.91,-504.41C265.27,-496.08 271.88,-485.8 277.86,-476.49"/>
261 <polygon fill="black" stroke="black" points="280.88,-478.26 283.35,-467.96 275,-474.48 280.88,-478.26"/>
220262 </g>
221263 <!-- 9th Edition -->
222 <g id="node18" class="node"><title>9th Edition</title>
223 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="536.247" cy="-90" rx="50.0912" ry="18"/>
224 <text text-anchor="middle" x="536.247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">9th Edition</text>
264 <g id="node18" class="node">
265 <title>9th Edition</title>
266 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="524.25" cy="-90" rx="50.09" ry="18"/>
267 <text text-anchor="middle" x="524.25" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">9th Edition</text>
225268 </g>
226269 <!-- 8th Edition&#45;&gt;9th Edition -->
227 <g id="edge18" class="edge"><title>8th Edition&#45;&gt;9th Edition</title>
228 <path fill="none" stroke="black" d="M477.874,-144.765C487.825,-135.6 500.421,-123.998 511.364,-113.919"/>
229 <polygon fill="black" stroke="black" points="513.994,-116.255 518.978,-106.906 509.251,-111.106 513.994,-116.255"/>
270 <g id="edge18" class="edge">
271 <title>8th Edition&#45;&gt;9th Edition</title>
272 <path fill="none" stroke="black" d="M465.87,-144.76C475.82,-135.6 488.42,-124 499.36,-113.92"/>
273 <polygon fill="black" stroke="black" points="501.99,-116.26 506.98,-106.91 497.25,-111.11 501.99,-116.26"/>
230274 </g>
231275 <!-- 3 BSD -->
232 <g id="node22" class="node"><title>3 BSD</title>
233 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="375.247" cy="-378" rx="35.194" ry="18"/>
234 <text text-anchor="middle" x="375.247" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">3 BSD</text>
276 <g id="node22" class="node">
277 <title>3 BSD</title>
278 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="372.25" cy="-378" rx="35.19" ry="18"/>
279 <text text-anchor="middle" x="372.25" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">3 BSD</text>
235280 </g>
236281 <!-- 32V&#45;&gt;3 BSD -->
237 <g id="edge23" class="edge"><title>32V&#45;&gt;3 BSD</title>
238 <path fill="none" stroke="black" d="M390.406,-432.055C388.179,-424.261 385.482,-414.822 382.984,-406.079"/>
239 <polygon fill="black" stroke="black" points="386.296,-404.929 380.183,-396.275 379.565,-406.852 386.296,-404.929"/>
282 <g id="edge23" class="edge">
283 <title>32V&#45;&gt;3 BSD</title>
284 <path fill="none" stroke="black" d="M380.58,-432.05C379.37,-424.35 377.91,-415.03 376.55,-406.36"/>
285 <polygon fill="black" stroke="black" points="379.97,-405.61 374.96,-396.28 373.06,-406.7 379.97,-405.61"/>
240286 </g>
241287 <!-- V7M&#45;&gt;Ultrix&#45;11 -->
242 <g id="edge17" class="edge"><title>V7M&#45;&gt;Ultrix&#45;11</title>
243 <path fill="none" stroke="black" d="M28.521,-359.567C27.8007,-329.461 28.6491,-266.131 45.2474,-216 57.7873,-178.126 83.3227,-139.498 101.094,-115.406"/>
244 <polygon fill="black" stroke="black" points="104.039,-117.312 107.251,-107.216 98.4443,-113.105 104.039,-117.312"/>
288 <g id="edge17" class="edge">
289 <title>V7M&#45;&gt;Ultrix&#45;11</title>
290 <path fill="none" stroke="black" d="M26.84,-359.64C23.3,-329.65 18.59,-266.48 33.25,-216 44.37,-177.69 70.24,-139.16 88.47,-115.21"/>
291 <polygon fill="black" stroke="black" points="91.42,-117.12 94.8,-107.07 85.89,-112.82 91.42,-117.12"/>
245292 </g>
246293 <!-- 2.8 BSD -->
247 <g id="node20" class="node"><title>2.8 BSD</title>
248 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="222.247" cy="-162" rx="42.4939" ry="18"/>
249 <text text-anchor="middle" x="222.247" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">2.8 BSD</text>
294 <g id="node20" class="node">
295 <title>2.8 BSD</title>
296 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="210.25" cy="-162" rx="42.49" ry="18"/>
297 <text text-anchor="middle" x="210.25" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">2.8 BSD</text>
250298 </g>
251299 <!-- 2 BSD&#45;&gt;2.8 BSD -->
252 <g id="edge20" class="edge"><title>2 BSD&#45;&gt;2.8 BSD</title>
253 <path fill="none" stroke="black" d="M113.025,-220.485C133.737,-209.584 164.038,-193.637 187.473,-181.302"/>
254 <polygon fill="black" stroke="black" points="189.185,-184.357 196.404,-176.602 185.925,-178.162 189.185,-184.357"/>
300 <g id="edge20" class="edge">
301 <title>2 BSD&#45;&gt;2.8 BSD</title>
302 <path fill="none" stroke="black" d="M101.03,-220.49C121.74,-209.58 152.04,-193.64 175.47,-181.3"/>
303 <polygon fill="black" stroke="black" points="177.18,-184.36 184.4,-176.6 173.92,-178.16 177.18,-184.36"/>
255304 </g>
256305 <!-- 2.8 BSD&#45;&gt;Ultrix&#45;11 -->
257 <g id="edge21" class="edge"><title>2.8 BSD&#45;&gt;Ultrix&#45;11</title>
258 <path fill="none" stroke="black" d="M200.616,-146.155C185.912,-136.064 166.268,-122.583 150.081,-111.474"/>
259 <polygon fill="black" stroke="black" points="151.724,-108.356 141.498,-105.584 147.763,-114.128 151.724,-108.356"/>
306 <g id="edge21" class="edge">
307 <title>2.8 BSD&#45;&gt;Ultrix&#45;11</title>
308 <path fill="none" stroke="black" d="M188.62,-146.15C173.91,-136.06 154.27,-122.58 138.08,-111.47"/>
309 <polygon fill="black" stroke="black" points="139.72,-108.36 129.5,-105.58 135.76,-114.13 139.72,-108.36"/>
260310 </g>
261311 <!-- 2.9 BSD -->
262 <g id="node21" class="node"><title>2.9 BSD</title>
263 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="222.247" cy="-90" rx="42.4939" ry="18"/>
264 <text text-anchor="middle" x="222.247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">2.9 BSD</text>
312 <g id="node21" class="node">
313 <title>2.9 BSD</title>
314 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="210.25" cy="-90" rx="42.49" ry="18"/>
315 <text text-anchor="middle" x="210.25" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">2.9 BSD</text>
265316 </g>
266317 <!-- 2.8 BSD&#45;&gt;2.9 BSD -->
267 <g id="edge22" class="edge"><title>2.8 BSD&#45;&gt;2.9 BSD</title>
268 <path fill="none" stroke="black" d="M222.247,-143.697C222.247,-135.983 222.247,-126.712 222.247,-118.112"/>
269 <polygon fill="black" stroke="black" points="225.748,-118.104 222.247,-108.104 218.748,-118.104 225.748,-118.104"/>
318 <g id="edge22" class="edge">
319 <title>2.8 BSD&#45;&gt;2.9 BSD</title>
320 <path fill="none" stroke="black" d="M210.25,-143.7C210.25,-135.98 210.25,-126.71 210.25,-118.11"/>
321 <polygon fill="black" stroke="black" points="213.75,-118.1 210.25,-108.1 206.75,-118.1 213.75,-118.1"/>
270322 </g>
271323 <!-- 4 BSD -->
272 <g id="node23" class="node"><title>4 BSD</title>
273 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="372.247" cy="-306" rx="35.194" ry="18"/>
274 <text text-anchor="middle" x="372.247" y="-302.3" font-family="Times New Roman,serif" font-size="14.00">4 BSD</text>
324 <g id="node23" class="node">
325 <title>4 BSD</title>
326 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="360.25" cy="-306" rx="35.19" ry="18"/>
327 <text text-anchor="middle" x="360.25" y="-302.3" font-family="Times New Roman,serif" font-size="14.00">4 BSD</text>
275328 </g>
276329 <!-- 3 BSD&#45;&gt;4 BSD -->
277 <g id="edge24" class="edge"><title>3 BSD&#45;&gt;4 BSD</title>
278 <path fill="none" stroke="black" d="M374.506,-359.697C374.175,-351.983 373.778,-342.712 373.409,-334.112"/>
279 <polygon fill="black" stroke="black" points="376.906,-333.945 372.98,-324.104 369.912,-334.245 376.906,-333.945"/>
330 <g id="edge24" class="edge">
331 <title>3 BSD&#45;&gt;4 BSD</title>
332 <path fill="none" stroke="black" d="M369.34,-360.05C368.02,-352.35 366.42,-343.03 364.94,-334.36"/>
333 <polygon fill="black" stroke="black" points="368.35,-333.54 363.21,-324.28 361.45,-334.72 368.35,-333.54"/>
280334 </g>
281335 <!-- 4.1 BSD -->
282 <g id="node24" class="node"><title>4.1 BSD</title>
283 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="370.247" cy="-234" rx="42.4939" ry="18"/>
284 <text text-anchor="middle" x="370.247" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">4.1 BSD</text>
336 <g id="node24" class="node">
337 <title>4.1 BSD</title>
338 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="358.25" cy="-234" rx="42.49" ry="18"/>
339 <text text-anchor="middle" x="358.25" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">4.1 BSD</text>
285340 </g>
286341 <!-- 4 BSD&#45;&gt;4.1 BSD -->
287 <g id="edge25" class="edge"><title>4 BSD&#45;&gt;4.1 BSD</title>
288 <path fill="none" stroke="black" d="M371.753,-287.697C371.533,-279.983 371.268,-270.712 371.022,-262.112"/>
289 <polygon fill="black" stroke="black" points="374.52,-262 370.736,-252.104 367.523,-262.2 374.52,-262"/>
342 <g id="edge25" class="edge">
343 <title>4 BSD&#45;&gt;4.1 BSD</title>
344 <path fill="none" stroke="black" d="M359.75,-287.7C359.53,-279.98 359.27,-270.71 359.02,-262.11"/>
345 <polygon fill="black" stroke="black" points="362.52,-262 358.74,-252.1 355.52,-262.2 362.52,-262"/>
290346 </g>
291347 <!-- 4.1 BSD&#45;&gt;8th Edition -->
292 <g id="edge28" class="edge"><title>4.1 BSD&#45;&gt;8th Edition</title>
293 <path fill="none" stroke="black" d="M389.776,-217.811C402.106,-208.221 418.241,-195.672 431.959,-185.002"/>
294 <polygon fill="black" stroke="black" points="434.389,-187.546 440.134,-178.644 430.091,-182.021 434.389,-187.546"/>
348 <g id="edge28" class="edge">
349 <title>4.1 BSD&#45;&gt;8th Edition</title>
350 <path fill="none" stroke="black" d="M377.78,-217.81C390.11,-208.22 406.24,-195.67 419.96,-185"/>
351 <polygon fill="black" stroke="black" points="422.39,-187.55 428.13,-178.64 418.09,-182.02 422.39,-187.55"/>
295352 </g>
296353 <!-- 4.1 BSD&#45;&gt;2.8 BSD -->
297 <g id="edge27" class="edge"><title>4.1 BSD&#45;&gt;2.8 BSD</title>
298 <path fill="none" stroke="black" d="M343.102,-220.161C319.393,-208.947 284.783,-192.578 258.671,-180.227"/>
299 <polygon fill="black" stroke="black" points="260.007,-176.988 249.471,-175.876 257.014,-183.316 260.007,-176.988"/>
354 <g id="edge27" class="edge">
355 <title>4.1 BSD&#45;&gt;2.8 BSD</title>
356 <path fill="none" stroke="black" d="M331.1,-220.16C307.39,-208.95 272.78,-192.58 246.67,-180.23"/>
357 <polygon fill="black" stroke="black" points="248.01,-176.99 237.47,-175.88 245.01,-183.32 248.01,-176.99"/>
300358 </g>
301359 <!-- 4.2 BSD -->
302 <g id="node25" class="node"><title>4.2 BSD</title>
303 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="350.247" cy="-162" rx="42.4939" ry="18"/>
304 <text text-anchor="middle" x="350.247" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">4.2 BSD</text>
360 <g id="node25" class="node">
361 <title>4.2 BSD</title>
362 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="338.25" cy="-162" rx="42.49" ry="18"/>
363 <text text-anchor="middle" x="338.25" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">4.2 BSD</text>
305364 </g>
306365 <!-- 4.1 BSD&#45;&gt;4.2 BSD -->
307 <g id="edge26" class="edge"><title>4.1 BSD&#45;&gt;4.2 BSD</title>
308 <path fill="none" stroke="black" d="M365.406,-216.055C363.179,-208.261 360.482,-198.822 357.984,-190.079"/>
309 <polygon fill="black" stroke="black" points="361.296,-188.929 355.183,-180.275 354.565,-190.852 361.296,-188.929"/>
366 <g id="edge26" class="edge">
367 <title>4.1 BSD&#45;&gt;4.2 BSD</title>
368 <path fill="none" stroke="black" d="M353.41,-216.05C351.18,-208.26 348.48,-198.82 345.98,-190.08"/>
369 <polygon fill="black" stroke="black" points="349.3,-188.93 343.18,-180.28 342.57,-190.85 349.3,-188.93"/>
310370 </g>
311371 <!-- 4.3 BSD -->
312 <g id="node26" class="node"><title>4.3 BSD</title>
313 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="426.247" cy="-90" rx="42.4939" ry="18"/>
314 <text text-anchor="middle" x="426.247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">4.3 BSD</text>
372 <g id="node26" class="node">
373 <title>4.3 BSD</title>
374 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="414.25" cy="-90" rx="42.49" ry="18"/>
375 <text text-anchor="middle" x="414.25" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">4.3 BSD</text>
315376 </g>
316377 <!-- 4.2 BSD&#45;&gt;4.3 BSD -->
317 <g id="edge29" class="edge"><title>4.2 BSD&#45;&gt;4.3 BSD</title>
318 <path fill="none" stroke="black" d="M367.114,-145.465C377.276,-136.105 390.395,-124.022 401.693,-113.616"/>
319 <polygon fill="black" stroke="black" points="404.181,-116.083 409.165,-106.734 399.438,-110.934 404.181,-116.083"/>
378 <g id="edge29" class="edge">
379 <title>4.2 BSD&#45;&gt;4.3 BSD</title>
380 <path fill="none" stroke="black" d="M355.11,-145.46C365.28,-136.11 378.39,-124.02 389.69,-113.62"/>
381 <polygon fill="black" stroke="black" points="392.18,-116.08 397.16,-106.73 387.44,-110.93 392.18,-116.08"/>
320382 </g>
321383 <!-- Ultrix&#45;32 -->
322 <g id="node27" class="node"><title>Ultrix&#45;32</title>
323 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="324.247" cy="-90" rx="42.4939" ry="18"/>
324 <text text-anchor="middle" x="324.247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">Ultrix&#45;32</text>
384 <g id="node27" class="node">
385 <title>Ultrix&#45;32</title>
386 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="312.25" cy="-90" rx="42.49" ry="18"/>
387 <text text-anchor="middle" x="312.25" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">Ultrix&#45;32</text>
325388 </g>
326389 <!-- 4.2 BSD&#45;&gt;Ultrix&#45;32 -->
327 <g id="edge30" class="edge"><title>4.2 BSD&#45;&gt;Ultrix&#45;32</title>
328 <path fill="none" stroke="black" d="M343.954,-144.055C341.027,-136.176 337.476,-126.617 334.199,-117.794"/>
329 <polygon fill="black" stroke="black" points="337.427,-116.431 330.664,-108.275 330.865,-118.868 337.427,-116.431"/>
390 <g id="edge30" class="edge">
391 <title>4.2 BSD&#45;&gt;Ultrix&#45;32</title>
392 <path fill="none" stroke="black" d="M331.95,-144.05C329.03,-136.18 325.48,-126.62 322.2,-117.79"/>
393 <polygon fill="black" stroke="black" points="325.43,-116.43 318.66,-108.28 318.86,-118.87 325.43,-116.43"/>
330394 </g>
331395 <!-- PWB 1.2&#45;&gt;PWB 2.0 -->
332 <g id="edge33" class="edge"><title>PWB 1.2&#45;&gt;PWB 2.0</title>
333 <path fill="none" stroke="black" d="M653.288,-578.666C635.858,-568.237 612.055,-553.996 592.888,-542.529"/>
334 <polygon fill="black" stroke="black" points="594.553,-539.446 584.174,-537.315 590.959,-545.453 594.553,-539.446"/>
396 <g id="edge33" class="edge">
397 <title>PWB 1.2&#45;&gt;PWB 2.0</title>
398 <path fill="none" stroke="black" d="M643.17,-578.83C625.26,-568.3 600.63,-553.81 580.95,-542.24"/>
399 <polygon fill="black" stroke="black" points="582.69,-539.2 572.29,-537.14 579.14,-545.23 582.69,-539.2"/>
335400 </g>
336401 <!-- CB Unix 1 -->
337 <g id="node30" class="node"><title>CB Unix 1</title>
338 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="834.247" cy="-522" rx="49.2915" ry="18"/>
339 <text text-anchor="middle" x="834.247" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">CB Unix 1</text>
402 <g id="node30" class="node">
403 <title>CB Unix 1</title>
404 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="803.25" cy="-522" rx="49.29" ry="18"/>
405 <text text-anchor="middle" x="803.25" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">CB Unix 1</text>
340406 </g>
341407 <!-- USG 1.0&#45;&gt;CB Unix 1 -->
342 <g id="edge34" class="edge"><title>USG 1.0&#45;&gt;CB Unix 1</title>
343 <path fill="none" stroke="black" d="M794.571,-576.411C800.917,-567.868 808.783,-557.278 815.834,-547.787"/>
344 <polygon fill="black" stroke="black" points="818.859,-549.585 822.013,-539.47 813.24,-545.41 818.859,-549.585"/>
408 <g id="edge34" class="edge">
409 <title>USG 1.0&#45;&gt;CB Unix 1</title>
410 <path fill="none" stroke="black" d="M779.75,-576.05C783.28,-568.09 787.57,-558.41 791.51,-549.51"/>
411 <polygon fill="black" stroke="black" points="794.75,-550.84 795.6,-540.28 788.35,-548 794.75,-550.84"/>
345412 </g>
346413 <!-- USG 2.0 -->
347 <g id="node31" class="node"><title>USG 2.0</title>
348 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="700.247" cy="-522" rx="42.7926" ry="18"/>
349 <text text-anchor="middle" x="700.247" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">USG 2.0</text>
414 <g id="node31" class="node">
415 <title>USG 2.0</title>
416 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="680.25" cy="-522" rx="42.79" ry="18"/>
417 <text text-anchor="middle" x="680.25" y="-518.3" font-family="Times New Roman,serif" font-size="14.00">USG 2.0</text>
350418 </g>
351419 <!-- USG 1.0&#45;&gt;USG 2.0 -->
352 <g id="edge35" class="edge"><title>USG 1.0&#45;&gt;USG 2.0</title>
353 <path fill="none" stroke="black" d="M764.049,-577.465C752.902,-567.949 738.458,-555.619 726.132,-545.097"/>
354 <polygon fill="black" stroke="black" points="728.273,-542.323 718.395,-538.492 723.728,-547.646 728.273,-542.323"/>
420 <g id="edge35" class="edge">
421 <title>USG 1.0&#45;&gt;USG 2.0</title>
422 <path fill="none" stroke="black" d="M752.28,-577.81C739.39,-568 722.41,-555.08 708.18,-544.25"/>
423 <polygon fill="black" stroke="black" points="710.25,-541.43 700.17,-538.16 706.01,-547 710.25,-541.43"/>
355424 </g>
356425 <!-- CB Unix 2 -->
357 <g id="node32" class="node"><title>CB Unix 2</title>
358 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="856.247" cy="-450" rx="49.2915" ry="18"/>
359 <text text-anchor="middle" x="856.247" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">CB Unix 2</text>
426 <g id="node32" class="node">
427 <title>CB Unix 2</title>
428 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="841.25" cy="-450" rx="49.29" ry="18"/>
429 <text text-anchor="middle" x="841.25" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">CB Unix 2</text>
360430 </g>
361431 <!-- CB Unix 1&#45;&gt;CB Unix 2 -->
362 <g id="edge36" class="edge"><title>CB Unix 1&#45;&gt;CB Unix 2</title>
363 <path fill="none" stroke="black" d="M839.573,-504.055C842.023,-496.261 844.989,-486.822 847.737,-478.079"/>
364 <polygon fill="black" stroke="black" points="851.159,-478.865 850.818,-468.275 844.481,-476.766 851.159,-478.865"/>
432 <g id="edge36" class="edge">
433 <title>CB Unix 1&#45;&gt;CB Unix 2</title>
434 <path fill="none" stroke="black" d="M812.45,-504.05C816.88,-495.89 822.3,-485.91 827.23,-476.82"/>
435 <polygon fill="black" stroke="black" points="830.44,-478.25 832.13,-467.79 824.29,-474.91 830.44,-478.25"/>
365436 </g>
366437 <!-- USG 3.0 -->
367 <g id="node36" class="node"><title>USG 3.0</title>
368 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="617.247" cy="-450" rx="42.7926" ry="18"/>
369 <text text-anchor="middle" x="617.247" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">USG 3.0</text>
438 <g id="node36" class="node">
439 <title>USG 3.0</title>
440 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="602.25" cy="-450" rx="42.79" ry="18"/>
441 <text text-anchor="middle" x="602.25" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">USG 3.0</text>
370442 </g>
371443 <!-- USG 2.0&#45;&gt;USG 3.0 -->
372 <g id="edge40" class="edge"><title>USG 2.0&#45;&gt;USG 3.0</title>
373 <path fill="none" stroke="black" d="M681.827,-505.465C670.544,-495.949 655.924,-483.619 643.448,-473.097"/>
374 <polygon fill="black" stroke="black" points="645.517,-470.263 635.616,-466.492 641.004,-475.614 645.517,-470.263"/>
444 <g id="edge40" class="edge">
445 <title>USG 2.0&#45;&gt;USG 3.0</title>
446 <path fill="none" stroke="black" d="M662.94,-505.46C652.43,-496.04 638.86,-483.85 627.21,-473.4"/>
447 <polygon fill="black" stroke="black" points="629.29,-470.57 619.51,-466.49 624.61,-475.78 629.29,-470.57"/>
375448 </g>
376449 <!-- CB Unix 3 -->
377 <g id="node33" class="node"><title>CB Unix 3</title>
378 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="798.247" cy="-378" rx="49.2915" ry="18"/>
379 <text text-anchor="middle" x="798.247" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">CB Unix 3</text>
450 <g id="node33" class="node">
451 <title>CB Unix 3</title>
452 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="783.25" cy="-378" rx="49.29" ry="18"/>
453 <text text-anchor="middle" x="783.25" y="-374.3" font-family="Times New Roman,serif" font-size="14.00">CB Unix 3</text>
380454 </g>
381455 <!-- CB Unix 2&#45;&gt;CB Unix 3 -->
382 <g id="edge37" class="edge"><title>CB Unix 2&#45;&gt;CB Unix 3</title>
383 <path fill="none" stroke="black" d="M842.502,-432.411C835.279,-423.693 826.291,-412.845 818.305,-403.208"/>
384 <polygon fill="black" stroke="black" points="820.969,-400.937 811.894,-395.47 815.579,-405.403 820.969,-400.937"/>
456 <g id="edge37" class="edge">
457 <title>CB Unix 2&#45;&gt;CB Unix 3</title>
458 <path fill="none" stroke="black" d="M827.5,-432.41C820.28,-423.69 811.29,-412.85 803.31,-403.21"/>
459 <polygon fill="black" stroke="black" points="805.97,-400.94 796.89,-395.47 800.58,-405.4 805.97,-400.94"/>
385460 </g>
386461 <!-- Unix/TS++ -->
387 <g id="node34" class="node"><title>Unix/TS++</title>
388 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="751.247" cy="-306" rx="51.9908" ry="18"/>
389 <text text-anchor="middle" x="751.247" y="-302.3" font-family="Times New Roman,serif" font-size="14.00">Unix/TS++</text>
462 <g id="node34" class="node">
463 <title>Unix/TS++</title>
464 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="767.25" cy="-306" rx="51.99" ry="18"/>
465 <text text-anchor="middle" x="767.25" y="-302.3" font-family="Times New Roman,serif" font-size="14.00">Unix/TS++</text>
390466 </g>
391467 <!-- CB Unix 3&#45;&gt;Unix/TS++ -->
392 <g id="edge38" class="edge"><title>CB Unix 3&#45;&gt;Unix/TS++</title>
393 <path fill="none" stroke="black" d="M787.109,-360.411C781.514,-352.077 774.611,-341.797 768.361,-332.488"/>
394 <polygon fill="black" stroke="black" points="771.112,-330.307 762.632,-323.956 765.301,-334.209 771.112,-330.307"/>
468 <g id="edge38" class="edge">
469 <title>CB Unix 3&#45;&gt;Unix/TS++</title>
470 <path fill="none" stroke="black" d="M779.37,-360.05C777.59,-352.26 775.44,-342.82 773.44,-334.08"/>
471 <polygon fill="black" stroke="black" points="776.84,-333.24 771.2,-324.28 770.01,-334.8 776.84,-333.24"/>
395472 </g>
396473 <!-- PDP&#45;11 Sys V -->
397 <g id="node35" class="node"><title>PDP&#45;11 Sys V</title>
398 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="885.247" cy="-306" rx="64.189" ry="18"/>
399 <text text-anchor="middle" x="885.247" y="-302.3" font-family="Times New Roman,serif" font-size="14.00">PDP&#45;11 Sys V</text>
474 <g id="node35" class="node">
475 <title>PDP&#45;11 Sys V</title>
476 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="901.25" cy="-306" rx="64.19" ry="18"/>
477 <text text-anchor="middle" x="901.25" y="-302.3" font-family="Times New Roman,serif" font-size="14.00">PDP&#45;11 Sys V</text>
400478 </g>
401479 <!-- CB Unix 3&#45;&gt;PDP&#45;11 Sys V -->
402 <g id="edge39" class="edge"><title>CB Unix 3&#45;&gt;PDP&#45;11 Sys V</title>
403 <path fill="none" stroke="black" d="M817.989,-361.116C829.504,-351.851 844.223,-340.008 856.955,-329.764"/>
404 <polygon fill="black" stroke="black" points="859.383,-332.303 864.98,-323.307 854.995,-326.849 859.383,-332.303"/>
480 <g id="edge39" class="edge">
481 <title>CB Unix 3&#45;&gt;PDP&#45;11 Sys V</title>
482 <path fill="none" stroke="black" d="M807.98,-362.33C824.83,-352.33 847.37,-338.96 866.07,-327.87"/>
483 <polygon fill="black" stroke="black" points="868.09,-330.74 874.9,-322.63 864.52,-324.72 868.09,-330.74"/>
405484 </g>
406485 <!-- CB Unix 3&#45;&gt;TS 4.0 -->
407 <g id="edge46" class="edge"><title>CB Unix 3&#45;&gt;TS 4.0</title>
408 <path fill="none" stroke="black" d="M758.713,-367.042C735.388,-359.15 707.204,-345.738 690.247,-324 676.618,-306.528 672.22,-281.486 671.029,-262.414"/>
409 <polygon fill="black" stroke="black" points="674.52,-262.113 670.656,-252.248 667.525,-262.37 674.52,-262.113"/>
486 <g id="edge46" class="edge">
487 <title>CB Unix 3&#45;&gt;TS 4.0</title>
488 <path fill="none" stroke="black" d="M753.4,-363.45C737.04,-354.52 717.79,-341.27 706.25,-324 694.01,-305.69 689.46,-280.92 687.86,-262.17"/>
489 <polygon fill="black" stroke="black" points="691.36,-261.94 687.24,-252.18 684.37,-262.38 691.36,-261.94"/>
410490 </g>
411491 <!-- Unix/TS++&#45;&gt;TS 4.0 -->
412 <g id="edge45" class="edge"><title>Unix/TS++&#45;&gt;TS 4.0</title>
413 <path fill="none" stroke="black" d="M733.094,-289.116C722.052,-279.454 707.805,-266.988 695.769,-256.456"/>
414 <polygon fill="black" stroke="black" points="698.065,-253.815 688.235,-249.864 693.456,-259.083 698.065,-253.815"/>
492 <g id="edge45" class="edge">
493 <title>Unix/TS++&#45;&gt;TS 4.0</title>
494 <path fill="none" stroke="black" d="M749.09,-289.12C738.05,-279.45 723.8,-266.99 711.77,-256.46"/>
495 <polygon fill="black" stroke="black" points="714.07,-253.81 704.23,-249.86 709.46,-259.08 714.07,-253.81"/>
415496 </g>
416497 <!-- USG 3.0&#45;&gt;Unix/TS 3.0 -->
417 <g id="edge41" class="edge"><title>USG 3.0&#45;&gt;Unix/TS 3.0</title>
418 <path fill="none" stroke="black" d="M617.247,-431.697C617.247,-423.983 617.247,-414.712 617.247,-406.112"/>
419 <polygon fill="black" stroke="black" points="620.748,-406.104 617.247,-396.104 613.748,-406.104 620.748,-406.104"/>
498 <g id="edge41" class="edge">
499 <title>USG 3.0&#45;&gt;Unix/TS 3.0</title>
500 <path fill="none" stroke="black" d="M602.25,-431.7C602.25,-423.98 602.25,-414.71 602.25,-406.11"/>
501 <polygon fill="black" stroke="black" points="605.75,-406.1 602.25,-396.1 598.75,-406.1 605.75,-406.1"/>
420502 </g>
421503 <!-- Unix/TS 1.0 -->
422 <g id="node37" class="node"><title>Unix/TS 1.0</title>
423 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="733.247" cy="-450" rx="55.4913" ry="18"/>
424 <text text-anchor="middle" x="733.247" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">Unix/TS 1.0</text>
504 <g id="node37" class="node">
505 <title>Unix/TS 1.0</title>
506 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="718.25" cy="-450" rx="55.49" ry="18"/>
507 <text text-anchor="middle" x="718.25" y="-446.3" font-family="Times New Roman,serif" font-size="14.00">Unix/TS 1.0</text>
425508 </g>
426509 <!-- Unix/TS 1.0&#45;&gt;Unix/TS 3.0 -->
427 <g id="edge43" class="edge"><title>Unix/TS 1.0&#45;&gt;Unix/TS 3.0</title>
428 <path fill="none" stroke="black" d="M708.077,-433.811C691.356,-423.721 669.207,-410.355 650.968,-399.348"/>
429 <polygon fill="black" stroke="black" points="652.739,-396.329 642.369,-394.159 649.122,-402.323 652.739,-396.329"/>
510 <g id="edge43" class="edge">
511 <title>Unix/TS 1.0&#45;&gt;Unix/TS 3.0</title>
512 <path fill="none" stroke="black" d="M693.08,-433.81C676.36,-423.72 654.21,-410.36 635.97,-399.35"/>
513 <polygon fill="black" stroke="black" points="637.74,-396.33 627.37,-394.16 634.12,-402.32 637.74,-396.33"/>
430514 </g>
431515 <!-- System V.0 -->
432 <g id="node39" class="node"><title>System V.0</title>
433 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="671.247" cy="-162" rx="53.0913" ry="18"/>
434 <text text-anchor="middle" x="671.247" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">System V.0</text>
516 <g id="node39" class="node">
517 <title>System V.0</title>
518 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="687.25" cy="-162" rx="53.09" ry="18"/>
519 <text text-anchor="middle" x="687.25" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">System V.0</text>
435520 </g>
436521 <!-- TS 4.0&#45;&gt;System V.0 -->
437 <g id="edge47" class="edge"><title>TS 4.0&#45;&gt;System V.0</title>
438 <path fill="none" stroke="black" d="M671.247,-215.697C671.247,-207.983 671.247,-198.712 671.247,-190.112"/>
439 <polygon fill="black" stroke="black" points="674.748,-190.104 671.247,-180.104 667.748,-190.104 674.748,-190.104"/>
522 <g id="edge47" class="edge">
523 <title>TS 4.0&#45;&gt;System V.0</title>
524 <path fill="none" stroke="black" d="M687.25,-215.7C687.25,-207.98 687.25,-198.71 687.25,-190.11"/>
525 <polygon fill="black" stroke="black" points="690.75,-190.1 687.25,-180.1 683.75,-190.1 690.75,-190.1"/>
440526 </g>
441527 <!-- System V.2 -->
442 <g id="node40" class="node"><title>System V.2</title>
443 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="671.247" cy="-90" rx="53.0913" ry="18"/>
444 <text text-anchor="middle" x="671.247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">System V.2</text>
528 <g id="node40" class="node">
529 <title>System V.2</title>
530 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="687.25" cy="-90" rx="53.09" ry="18"/>
531 <text text-anchor="middle" x="687.25" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">System V.2</text>
445532 </g>
446533 <!-- System V.0&#45;&gt;System V.2 -->
447 <g id="edge48" class="edge"><title>System V.0&#45;&gt;System V.2</title>
448 <path fill="none" stroke="black" d="M671.247,-143.697C671.247,-135.983 671.247,-126.712 671.247,-118.112"/>
449 <polygon fill="black" stroke="black" points="674.748,-118.104 671.247,-108.104 667.748,-118.104 674.748,-118.104"/>
534 <g id="edge48" class="edge">
535 <title>System V.0&#45;&gt;System V.2</title>
536 <path fill="none" stroke="black" d="M687.25,-143.7C687.25,-135.98 687.25,-126.71 687.25,-118.11"/>
537 <polygon fill="black" stroke="black" points="690.75,-118.1 687.25,-108.1 683.75,-118.1 690.75,-118.1"/>
450538 </g>
451539 <!-- System V.3 -->
452 <g id="node41" class="node"><title>System V.3</title>
453 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="671.247" cy="-18" rx="53.0913" ry="18"/>
454 <text text-anchor="middle" x="671.247" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">System V.3</text>
540 <g id="node41" class="node">
541 <title>System V.3</title>
542 <ellipse fill="#b2dfee" stroke="#b2dfee" cx="687.25" cy="-18" rx="53.09" ry="18"/>
543 <text text-anchor="middle" x="687.25" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">System V.3</text>
455544 </g>
456545 <!-- System V.2&#45;&gt;System V.3 -->
457 <g id="edge49" class="edge"><title>System V.2&#45;&gt;System V.3</title>
458 <path fill="none" stroke="black" d="M671.247,-71.6966C671.247,-63.9827 671.247,-54.7125 671.247,-46.1124"/>
459 <polygon fill="black" stroke="black" points="674.748,-46.1043 671.247,-36.1043 667.748,-46.1044 674.748,-46.1043"/>
546 <g id="edge49" class="edge">
547 <title>System V.2&#45;&gt;System V.3</title>
548 <path fill="none" stroke="black" d="M687.25,-71.7C687.25,-63.98 687.25,-54.71 687.25,-46.11"/>
549 <polygon fill="black" stroke="black" points="690.75,-46.1 687.25,-36.1 683.75,-46.1 690.75,-46.1"/>
460550 </g>
461551 </g>
462552 </svg>
0 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
1 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
2 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
4 -->
5 <!-- Pages: 1 -->
6 <svg width="502pt" height="188pt"
7 viewBox="0.00 0.00 502.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-184 498,-184 498,4 -4,4"/>
10 <!-- 0 -->
11 <g id="node1" class="node">
12 <title>0</title>
13 <ellipse fill="none" stroke="black" cx="247" cy="-162" rx="27" ry="18"/>
14 <text text-anchor="middle" x="247" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">0</text>
15 </g>
16 <!-- 1 -->
17 <g id="node2" class="node">
18 <title>1</title>
19 <ellipse fill="none" stroke="black" cx="27" cy="-90" rx="27" ry="18"/>
20 <text text-anchor="middle" x="27" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">1</text>
21 </g>
22 <!-- 0&#45;&gt;1 -->
23 <g id="edge1" class="edge">
24 <title>0&#45;&gt;1</title>
25 <path fill="none" stroke="black" d="M222.13,-154.52C187.31,-145.26 122.23,-127.21 68,-108 64.88,-106.89 61.65,-105.68 58.43,-104.42"/>
26 <polygon fill="black" stroke="black" points="59.55,-101.1 48.96,-100.61 56.93,-107.59 59.55,-101.1"/>
27 </g>
28 <!-- 2 -->
29 <g id="node3" class="node">
30 <title>2</title>
31 <ellipse fill="none" stroke="black" cx="82" cy="-18" rx="27" ry="18"/>
32 <text text-anchor="middle" x="82" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">2</text>
33 </g>
34 <!-- 0&#45;&gt;2 -->
35 <g id="edge2" class="edge">
36 <title>0&#45;&gt;2</title>
37 <path fill="none" stroke="black" d="M220.28,-158.96C187.22,-154.95 131.55,-143.08 101,-108 86.29,-91.11 82.05,-65.64 81.19,-46.27"/>
38 <polygon fill="black" stroke="black" points="84.69,-46.16 81.01,-36.22 77.69,-46.28 84.69,-46.16"/>
39 </g>
40 <!-- 3 -->
41 <g id="node4" class="node">
42 <title>3</title>
43 <ellipse fill="none" stroke="black" cx="137" cy="-90" rx="27" ry="18"/>
44 <text text-anchor="middle" x="137" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">3</text>
45 </g>
46 <!-- 0&#45;&gt;3 -->
47 <g id="edge3" class="edge">
48 <title>0&#45;&gt;3</title>
49 <path fill="none" stroke="black" d="M227.84,-148.81C210.33,-137.67 184.24,-121.06 164.51,-108.5"/>
50 <polygon fill="black" stroke="black" points="166.26,-105.47 155.94,-103.05 162.5,-111.37 166.26,-105.47"/>
51 </g>
52 <!-- 4 -->
53 <g id="node5" class="node">
54 <title>4</title>
55 <ellipse fill="none" stroke="black" cx="192" cy="-18" rx="27" ry="18"/>
56 <text text-anchor="middle" x="192" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">4</text>
57 </g>
58 <!-- 0&#45;&gt;4 -->
59 <g id="edge4" class="edge">
60 <title>0&#45;&gt;4</title>
61 <path fill="none" stroke="black" d="M234.25,-145.7C226.44,-135.59 216.85,-121.71 211,-108 202.54,-88.17 197.7,-64.2 195.02,-46.13"/>
62 <polygon fill="black" stroke="black" points="198.46,-45.43 193.66,-35.99 191.52,-46.37 198.46,-45.43"/>
63 </g>
64 <!-- 5 -->
65 <g id="node6" class="node">
66 <title>5</title>
67 <ellipse fill="none" stroke="black" cx="247" cy="-90" rx="27" ry="18"/>
68 <text text-anchor="middle" x="247" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">5</text>
69 </g>
70 <!-- 0&#45;&gt;5 -->
71 <g id="edge5" class="edge">
72 <title>0&#45;&gt;5</title>
73 <path fill="none" stroke="black" d="M247,-143.7C247,-135.98 247,-126.71 247,-118.11"/>
74 <polygon fill="black" stroke="black" points="250.5,-118.1 247,-108.1 243.5,-118.1 250.5,-118.1"/>
75 </g>
76 <!-- 6 -->
77 <g id="node7" class="node">
78 <title>6</title>
79 <ellipse fill="none" stroke="black" cx="302" cy="-18" rx="27" ry="18"/>
80 <text text-anchor="middle" x="302" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">6</text>
81 </g>
82 <!-- 0&#45;&gt;6 -->
83 <g id="edge6" class="edge">
84 <title>0&#45;&gt;6</title>
85 <path fill="none" stroke="black" d="M259.75,-145.7C267.56,-135.59 277.15,-121.71 283,-108 291.46,-88.17 296.3,-64.2 298.98,-46.13"/>
86 <polygon fill="black" stroke="black" points="302.48,-46.37 300.34,-35.99 295.54,-45.43 302.48,-46.37"/>
87 </g>
88 <!-- 7 -->
89 <g id="node8" class="node">
90 <title>7</title>
91 <ellipse fill="none" stroke="black" cx="357" cy="-90" rx="27" ry="18"/>
92 <text text-anchor="middle" x="357" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">7</text>
93 </g>
94 <!-- 0&#45;&gt;7 -->
95 <g id="edge7" class="edge">
96 <title>0&#45;&gt;7</title>
97 <path fill="none" stroke="black" d="M266.16,-148.81C283.67,-137.67 309.76,-121.06 329.49,-108.5"/>
98 <polygon fill="black" stroke="black" points="331.5,-111.37 338.06,-103.05 327.74,-105.47 331.5,-111.37"/>
99 </g>
100 <!-- 8 -->
101 <g id="node9" class="node">
102 <title>8</title>
103 <ellipse fill="none" stroke="black" cx="412" cy="-18" rx="27" ry="18"/>
104 <text text-anchor="middle" x="412" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">8</text>
105 </g>
106 <!-- 0&#45;&gt;8 -->
107 <g id="edge8" class="edge">
108 <title>0&#45;&gt;8</title>
109 <path fill="none" stroke="black" d="M273.72,-158.96C306.78,-154.95 362.45,-143.08 393,-108 407.71,-91.11 411.95,-65.64 412.81,-46.27"/>
110 <polygon fill="black" stroke="black" points="416.31,-46.28 412.99,-36.22 409.31,-46.16 416.31,-46.28"/>
111 </g>
112 <!-- 9 -->
113 <g id="node10" class="node">
114 <title>9</title>
115 <ellipse fill="none" stroke="black" cx="467" cy="-90" rx="27" ry="18"/>
116 <text text-anchor="middle" x="467" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">9</text>
117 </g>
118 <!-- 0&#45;&gt;9 -->
119 <g id="edge9" class="edge">
120 <title>0&#45;&gt;9</title>
121 <path fill="none" stroke="black" d="M271.87,-154.52C306.69,-145.26 371.77,-127.21 426,-108 429.12,-106.89 432.35,-105.68 435.57,-104.42"/>
122 <polygon fill="black" stroke="black" points="437.07,-107.59 445.04,-100.61 434.45,-101.1 437.07,-107.59"/>
123 </g>
124 </g>
125 </svg>
0 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
1 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
2 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
4 -->
5 <!-- Pages: 1 -->
6 <svg width="476pt" height="260pt"
7 viewBox="0.00 0.00 476.00 260.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 256)">
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-256 472,-256 472,4 -4,4"/>
10 <!-- 0 -->
11 <g id="node1" class="node">
12 <title>0</title>
13 <ellipse fill="none" stroke="black" cx="238" cy="-234" rx="27" ry="18"/>
14 <text text-anchor="middle" x="238" y="-230.3" font-family="Times New Roman,serif" font-size="14.00">0</text>
15 </g>
16 <!-- 1 -->
17 <g id="node2" class="node">
18 <title>1</title>
19 <ellipse fill="none" stroke="black" cx="27" cy="-162" rx="27" ry="18"/>
20 <text text-anchor="middle" x="27" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">1</text>
21 </g>
22 <!-- 0&#45;&gt;1 -->
23 <g id="edge1" class="edge">
24 <title>0&#45;&gt;1</title>
25 <path fill="none" stroke="black" d="M213.56,-226.14C180.32,-216.64 119.16,-198.54 68,-180 64.88,-178.87 61.66,-177.64 58.45,-176.38"/>
26 <polygon fill="black" stroke="black" points="59.57,-173.06 48.99,-172.55 56.94,-179.54 59.57,-173.06"/>
27 </g>
28 <!-- 2 -->
29 <g id="node3" class="node">
30 <title>2</title>
31 <ellipse fill="none" stroke="black" cx="73" cy="-90" rx="27" ry="18"/>
32 <text text-anchor="middle" x="73" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">2</text>
33 </g>
34 <!-- 0&#45;&gt;2 -->
35 <g id="edge2" class="edge">
36 <title>0&#45;&gt;2</title>
37 <path fill="none" stroke="black" d="M212.13,-227.76C184.67,-220.99 141.52,-206.77 114,-180 96.53,-163.01 85.77,-137.16 79.69,-117.7"/>
38 <polygon fill="black" stroke="black" points="82.99,-116.53 76.85,-107.91 76.27,-118.48 82.99,-116.53"/>
39 </g>
40 <!-- 3 -->
41 <g id="node4" class="node">
42 <title>3</title>
43 <ellipse fill="none" stroke="black" cx="128" cy="-18" rx="27" ry="18"/>
44 <text text-anchor="middle" x="128" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">3</text>
45 </g>
46 <!-- 0&#45;&gt;3 -->
47 <g id="edge3" class="edge">
48 <title>0&#45;&gt;3</title>
49 <path fill="none" stroke="black" d="M213.94,-225.83C192.62,-218.13 162.54,-203.7 147,-180 120.4,-139.44 121,-80.52 124.24,-46.34"/>
50 <polygon fill="black" stroke="black" points="127.74,-46.49 125.35,-36.17 120.79,-45.73 127.74,-46.49"/>
51 </g>
52 <!-- 4 -->
53 <g id="node5" class="node">
54 <title>4</title>
55 <ellipse fill="none" stroke="black" cx="183" cy="-162" rx="27" ry="18"/>
56 <text text-anchor="middle" x="183" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">4</text>
57 </g>
58 <!-- 0&#45;&gt;4 -->
59 <g id="edge4" class="edge">
60 <title>0&#45;&gt;4</title>
61 <path fill="none" stroke="black" d="M226.07,-217.81C218.79,-208.55 209.34,-196.52 201.15,-186.09"/>
62 <polygon fill="black" stroke="black" points="203.84,-183.86 194.91,-178.16 198.34,-188.18 203.84,-183.86"/>
63 </g>
64 <!-- 5 -->
65 <g id="node6" class="node">
66 <title>5</title>
67 <ellipse fill="none" stroke="black" cx="221" cy="-90" rx="27" ry="18"/>
68 <text text-anchor="middle" x="221" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">5</text>
69 </g>
70 <!-- 0&#45;&gt;5 -->
71 <g id="edge5" class="edge">
72 <title>0&#45;&gt;5</title>
73 <path fill="none" stroke="black" d="M235.95,-215.87C233.05,-191.67 227.73,-147.21 224.28,-118.39"/>
74 <polygon fill="black" stroke="black" points="227.72,-117.7 223.06,-108.19 220.77,-118.53 227.72,-117.7"/>
75 </g>
76 <!-- 6 -->
77 <g id="node7" class="node">
78 <title>6</title>
79 <ellipse fill="none" stroke="black" cx="276" cy="-18" rx="27" ry="18"/>
80 <text text-anchor="middle" x="276" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">6</text>
81 </g>
82 <!-- 0&#45;&gt;6 -->
83 <g id="edge6" class="edge">
84 <title>0&#45;&gt;6</title>
85 <path fill="none" stroke="black" d="M241.05,-215.85C247.63,-178.74 263.26,-90.75 271.2,-46.05"/>
86 <polygon fill="black" stroke="black" points="274.69,-46.39 272.99,-35.94 267.8,-45.17 274.69,-46.39"/>
87 </g>
88 <!-- 7 -->
89 <g id="node8" class="node">
90 <title>7</title>
91 <ellipse fill="none" stroke="black" cx="331" cy="-162" rx="27" ry="18"/>
92 <text text-anchor="middle" x="331" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">7</text>
93 </g>
94 <!-- 0&#45;&gt;7 -->
95 <g id="edge7" class="edge">
96 <title>0&#45;&gt;7</title>
97 <path fill="none" stroke="black" d="M255.49,-219.83C269.52,-209.27 289.42,-194.3 305.26,-182.37"/>
98 <polygon fill="black" stroke="black" points="307.7,-184.92 313.59,-176.11 303.49,-179.32 307.7,-184.92"/>
99 </g>
100 <!-- 8 -->
101 <g id="node9" class="node">
102 <title>8</title>
103 <ellipse fill="none" stroke="black" cx="386" cy="-90" rx="27" ry="18"/>
104 <text text-anchor="middle" x="386" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">8</text>
105 </g>
106 <!-- 0&#45;&gt;8 -->
107 <g id="edge8" class="edge">
108 <title>0&#45;&gt;8</title>
109 <path fill="none" stroke="black" d="M264.27,-229.54C293.8,-224.21 341.01,-211.13 367,-180 381.29,-162.89 385.6,-137.6 386.59,-118.35"/>
110 <polygon fill="black" stroke="black" points="390.09,-118.18 386.84,-108.1 383.09,-118.01 390.09,-118.18"/>
111 </g>
112 <!-- 9 -->
113 <g id="node10" class="node">
114 <title>9</title>
115 <ellipse fill="none" stroke="black" cx="441" cy="-18" rx="27" ry="18"/>
116 <text text-anchor="middle" x="441" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">9</text>
117 </g>
118 <!-- 0&#45;&gt;9 -->
119 <g id="edge9" class="edge">
120 <title>0&#45;&gt;9</title>
121 <path fill="none" stroke="black" d="M264.41,-230.07C297.34,-225.13 353.59,-212.29 389,-180 427.16,-145.21 437.43,-82.27 440.12,-46.25"/>
122 <polygon fill="black" stroke="black" points="443.63,-46.19 440.74,-36 436.64,-45.77 443.63,-46.19"/>
123 </g>
124 </g>
125 </svg>
0 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
1 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
2 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Generated by graphviz version 2.44.1 (20200629.0846)
4 -->
5 <!-- Pages: 1 -->
6 <svg width="638pt" height="116pt"
7 viewBox="0.00 0.00 638.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
8 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
9 <polygon fill="white" stroke="transparent" points="-4,4 -4,-112 634,-112 634,4 -4,4"/>
10 <!-- 0 -->
11 <g id="node1" class="node">
12 <title>0</title>
13 <ellipse fill="none" stroke="black" cx="315" cy="-90" rx="27" ry="18"/>
14 <text text-anchor="middle" x="315" y="-86.3" font-family="Times New Roman,serif" font-size="14.00">0</text>
15 </g>
16 <!-- 1 -->
17 <g id="node2" class="node">
18 <title>1</title>
19 <ellipse fill="none" stroke="black" cx="27" cy="-18" rx="27" ry="18"/>
20 <text text-anchor="middle" x="27" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">1</text>
21 </g>
22 <!-- 0&#45;&gt;1 -->
23 <g id="edge1" class="edge">
24 <title>0&#45;&gt;1</title>
25 <path fill="none" stroke="black" d="M288.71,-85.54C242.28,-78.98 143.09,-62.92 63,-36 61.08,-35.36 59.14,-34.64 57.19,-33.87"/>
26 <polygon fill="black" stroke="black" points="58.17,-30.48 47.6,-29.74 55.4,-36.91 58.17,-30.48"/>
27 </g>
28 <!-- 2 -->
29 <g id="node3" class="node">
30 <title>2</title>
31 <ellipse fill="none" stroke="black" cx="99" cy="-18" rx="27" ry="18"/>
32 <text text-anchor="middle" x="99" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">2</text>
33 </g>
34 <!-- 0&#45;&gt;2 -->
35 <g id="edge2" class="edge">
36 <title>0&#45;&gt;2</title>
37 <path fill="none" stroke="black" d="M289.85,-82.91C254.68,-74.1 189.04,-56.57 135,-36 133.16,-35.3 131.28,-34.54 129.4,-33.75"/>
38 <polygon fill="black" stroke="black" points="130.64,-30.48 120.08,-29.62 127.81,-36.88 130.64,-30.48"/>
39 </g>
40 <!-- 3 -->
41 <g id="node4" class="node">
42 <title>3</title>
43 <ellipse fill="none" stroke="black" cx="171" cy="-18" rx="27" ry="18"/>
44 <text text-anchor="middle" x="171" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">3</text>
45 </g>
46 <!-- 0&#45;&gt;3 -->
47 <g id="edge3" class="edge">
48 <title>0&#45;&gt;3</title>
49 <path fill="none" stroke="black" d="M293.75,-78.67C269.4,-66.83 229.28,-47.33 201.57,-33.86"/>
50 <polygon fill="black" stroke="black" points="202.86,-30.6 192.33,-29.37 199.8,-36.89 202.86,-30.6"/>
51 </g>
52 <!-- 4 -->
53 <g id="node5" class="node">
54 <title>4</title>
55 <ellipse fill="none" stroke="black" cx="243" cy="-18" rx="27" ry="18"/>
56 <text text-anchor="middle" x="243" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">4</text>
57 </g>
58 <!-- 0&#45;&gt;4 -->
59 <g id="edge4" class="edge">
60 <title>0&#45;&gt;4</title>
61 <path fill="none" stroke="black" d="M300.43,-74.83C290.25,-64.94 276.48,-51.55 264.97,-40.36"/>
62 <polygon fill="black" stroke="black" points="267.41,-37.85 257.8,-33.38 262.53,-42.87 267.41,-37.85"/>
63 </g>
64 <!-- 5 -->
65 <g id="node6" class="node">
66 <title>5</title>
67 <ellipse fill="none" stroke="black" cx="315" cy="-18" rx="27" ry="18"/>
68 <text text-anchor="middle" x="315" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">5</text>
69 </g>
70 <!-- 0&#45;&gt;5 -->
71 <g id="edge5" class="edge">
72 <title>0&#45;&gt;5</title>
73 <path fill="none" stroke="black" d="M315,-71.7C315,-63.98 315,-54.71 315,-46.11"/>
74 <polygon fill="black" stroke="black" points="318.5,-46.1 315,-36.1 311.5,-46.1 318.5,-46.1"/>
75 </g>
76 <!-- 6 -->
77 <g id="node7" class="node">
78 <title>6</title>
79 <ellipse fill="none" stroke="black" cx="387" cy="-18" rx="27" ry="18"/>
80 <text text-anchor="middle" x="387" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">6</text>
81 </g>
82 <!-- 0&#45;&gt;6 -->
83 <g id="edge6" class="edge">
84 <title>0&#45;&gt;6</title>
85 <path fill="none" stroke="black" d="M329.57,-74.83C339.75,-64.94 353.52,-51.55 365.03,-40.36"/>
86 <polygon fill="black" stroke="black" points="367.47,-42.87 372.2,-33.38 362.59,-37.85 367.47,-42.87"/>
87 </g>
88 <!-- 7 -->
89 <g id="node8" class="node">
90 <title>7</title>
91 <ellipse fill="none" stroke="black" cx="459" cy="-18" rx="27" ry="18"/>
92 <text text-anchor="middle" x="459" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">7</text>
93 </g>
94 <!-- 0&#45;&gt;7 -->
95 <g id="edge7" class="edge">
96 <title>0&#45;&gt;7</title>
97 <path fill="none" stroke="black" d="M336.25,-78.67C360.6,-66.83 400.72,-47.33 428.43,-33.86"/>
98 <polygon fill="black" stroke="black" points="430.2,-36.89 437.67,-29.37 427.14,-30.6 430.2,-36.89"/>
99 </g>
100 <!-- 8 -->
101 <g id="node9" class="node">
102 <title>8</title>
103 <ellipse fill="none" stroke="black" cx="531" cy="-18" rx="27" ry="18"/>
104 <text text-anchor="middle" x="531" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">8</text>
105 </g>
106 <!-- 0&#45;&gt;8 -->
107 <g id="edge8" class="edge">
108 <title>0&#45;&gt;8</title>
109 <path fill="none" stroke="black" d="M340.15,-82.91C375.32,-74.1 440.96,-56.57 495,-36 496.84,-35.3 498.72,-34.54 500.6,-33.75"/>
110 <polygon fill="black" stroke="black" points="502.19,-36.88 509.92,-29.62 499.36,-30.48 502.19,-36.88"/>
111 </g>
112 <!-- 9 -->
113 <g id="node10" class="node">
114 <title>9</title>
115 <ellipse fill="none" stroke="black" cx="603" cy="-18" rx="27" ry="18"/>
116 <text text-anchor="middle" x="603" y="-14.3" font-family="Times New Roman,serif" font-size="14.00">9</text>
117 </g>
118 <!-- 0&#45;&gt;9 -->
119 <g id="edge9" class="edge">
120 <title>0&#45;&gt;9</title>
121 <path fill="none" stroke="black" d="M341.29,-85.54C387.72,-78.98 486.91,-62.92 567,-36 568.92,-35.36 570.86,-34.64 572.81,-33.87"/>
122 <polygon fill="black" stroke="black" points="574.6,-36.91 582.4,-29.74 571.83,-30.48 574.6,-36.91"/>
123 </g>
124 </g>
125 </svg>
1010 ~graphviz.Source
1111 graphviz.render
1212 graphviz.pipe
13 graphviz.unflatten
1314 graphviz.view
1415
1516 .. note::
2728 source,
2829 node, edge, edges, attr, subgraph,
2930 format, engine, encoding,
30 clear, copy, pipe, save, render, view,
31 clear, copy, unflatten, pipe, save, render, view,
3132 directed
3233
3334
3940 source,
4041 node, edge, edges, attr, subgraph,
4142 format, engine, encoding,
42 clear, copy, pipe, save, render, view,
43 clear, copy, unflatten, pipe, save, render, view,
4344 directed
4445
4546
4849
4950 .. autoclass:: graphviz.Source
5051 :members:
52 source,
5153 format, engine, encoding,
52 copy, pipe, save, render, view,
53 from_file, source
54 copy, unflatten, pipe, save, render, view,
55 from_file
5456
5557
5658 Low-level functions
6264
6365 .. autofunction:: graphviz.render
6466 .. autofunction:: graphviz.pipe
67 .. autofunction:: graphviz.unflatten
6568 .. autofunction:: graphviz.view
6669
6770
2020 # -- Project information -----------------------------------------------------
2121
2222 project = 'graphviz'
23 copyright = '2013-2020, Sebastian Bank'
23 copyright = '2013-2021, Sebastian Bank'
2424 author = 'Sebastian Bank'
2525
2626 # The short X.Y version
27 version = '0.14.2'
27 version = '0.17'
2828 # The full version, including alpha/beta/rc tags
2929 release = version
3030
4343 'sphinx.ext.autosummary',
4444 'sphinx.ext.intersphinx',
4545 'sphinx.ext.napoleon',
46 'sphinx_autodoc_typehints', # https://github.com/agronholm/sphinx-autodoc-typehints/issues/15
4647 'sphinx.ext.viewcode',
4748 ]
4849
1515 --------
1616
1717 .. literalinclude:: ../examples/hello.py
18 :lines: 2-
18 :lines: 3-
1919
2020 .. image:: _static/hello.svg
2121 :align: center
2525 ----------
2626
2727 .. literalinclude:: ../examples/process.py
28 :lines: 2-
28 :lines: 3-
2929
3030 .. image:: _static/process.svg
3131 :align: center
3535 ------
3636
3737 .. literalinclude:: ../examples/fsm.py
38 :lines: 2-
38 :lines: 3-
3939
4040 .. image:: _static/fsm.svg
4141 :align: center
4747 ----------
4848
4949 .. literalinclude:: ../examples/cluster.py
50 :lines: 2-
50 :lines: 3-
5151
5252 .. image:: _static/cluster.svg
5353 :align: center
5757 -----
5858
5959 .. literalinclude:: ../examples/er.py
60 :lines: 2-
60 :lines: 3-
6161
6262 .. image:: _static/er.svg
6363 :align: center
6767 -------
6868
6969 .. literalinclude:: ../examples/unix.py
70 :lines: 2-
70 :lines: 3-
7171
7272 .. image:: _static/unix.svg
7373 :align: center
7777 ----------
7878
7979 .. literalinclude:: ../examples/structs.py
80 :lines: 2-
80 :lines: 3-
8181
8282 .. image:: _static/structs.svg
8383 :align: center
8787 --------------------
8888
8989 .. literalinclude:: ../examples/structs_revisited.py
90 :lines: 2-
90 :lines: 3-
9191
9292 .. image:: _static/structs_revisited.svg
9393 :align: center
9999 --------
100100
101101 .. literalinclude:: ../examples/btree.py
102 :lines: 2-
102 :lines: 3-
103103
104104 .. image:: _static/btree.svg
105105 :align: center
108108 traffic_lights.py
109109 -----------------
110110 .. literalinclude:: ../examples/traffic_lights.py
111 :lines: 2-
111 :lines: 3-
112112
113113 .. image:: _static/traffic_lights.svg
114114 :align: center
117117 fdpclust.py
118118 -----------
119119 .. literalinclude:: ../examples/fdpclust.py
120 :lines: 2-
120 :lines: 3-
121121
122122 .. image:: _static/fdpclust.svg
123123 :align: center
126126 cluster_edge.py
127127 ---------------
128128 .. literalinclude:: ../examples/cluster_edge.py
129 :lines: 2-
129 :lines: 3-
130130
131131 .. image:: _static/cluster_edge.svg
132132 :align: center
135135 g_c_n.py
136136 --------
137137 .. literalinclude:: ../examples/g_c_n.py
138 :lines: 2-
138 :lines: 3-
139139
140140 .. image:: _static/g_c_n.svg
141141 :align: center
144144 angles.py
145145 ---------
146146 .. literalinclude:: ../examples/angles.py
147 :lines: 2-
147 :lines: 3-
148148
149149 .. image:: _static/angles.svg
150150 :align: center
155155 rank_same.py
156156 ------------
157157 .. literalinclude:: ../examples/rank_same.py
158 :lines: 2-
158 :lines: 3-
159159
160160 .. image:: _static/rank_same.svg
161161 :align: center
77 ------------
88
99 :mod:`graphviz` provides a simple pure-Python interface for the Graphviz_
10 graph-drawing software. It runs under Python 2.7 and 3.5+. To install it
11 with pip_ run the following:
10 graph-drawing software. It runs under Python 3.6+. To install it with pip_, run
11 the following:
1212
1313 .. code:: bash
1414
1515 $ pip install graphviz
1616
1717 For a system-wide install, this typically requires administrator access. For an
18 isolated install, you can run the same inside a virtualenv_ or a
19 :mod:`py3:venv` (Python 3 only).
20
21 The only dependency is a working installation of Graphviz (`download page`_).
18 isolated install, you can run the same inside a :mod:`py3:venv` or a
19 virtualenv_.
20
21 The only dependency is a working installation of Graphviz_
22 (`download page <upstream-download_>`_,
23 `archived versions <upstream-archived_>`_,
24 `installation procedure for Windows <upstream-windows_>`_).
2225
2326 After installing Graphviz, make sure that its ``bin/`` subdirectory containing
2427 the layout commands for rendering graph descriptions (``dot``, ``circo``,
2528 ``neato``, etc.) is on your systems' path: On the command-line, ``dot -V``
2629 should print the version of your Graphiz installation.
2730
31 .. hint::
32
33 Windows users might want to check the status of known issues
34 (gvedit.exe__, sfdp__, commands__) and consider trying an older archived
35 version as a workaround (e.g. graphviz-2.38.msi__).
36
37 __ https://gitlab.com/graphviz/graphviz/-/issues/1816
38 __ https://gitlab.com/graphviz/graphviz/-/issues/1269
39 __ https://gitlab.com/graphviz/graphviz/-/issues/1753
40 __ https://www2.graphviz.org/Archive/stable/windows/graphviz-2.38.msi
41
42 Anaconda_: see the conda-forge_ package
43 `conda-forge/python-graphviz <conda-forge-python-graphviz_>`_
44 (`feedstock <conda-forge-python-graphviz-feedstock_>`_),
45 which should automatically ``conda install``
46 `conda-forge/graphviz <conda-forge-graphviz_>`_
47 (`feedstock <conda-forge-graphviz-feedstock_>`_) as dependency.
48
2849
2950 Basic usage
3051 -----------
3960
4061 .. code:: python
4162
42 >>> from graphviz import Digraph
43
44 >>> dot = Digraph(comment='The Round Table')
63 >>> import graphviz
64
65 >>> dot = graphviz.Digraph(comment='The Round Table')
4566
4667 >>> dot #doctest: +ELLIPSIS
4768 <graphviz.dot.Digraph object at 0x...>
108129
109130 .. code:: python
110131
111 >>> from graphviz import Graph
112
113 >>> g = Graph(format='png')
132 >>> g = graphviz.Graph(format='png')
114133
115134 You can also change the :attr:`~.Graph.format` attribute on an existing graph
116135 object:
133152
134153 .. code:: python
135154
136 >>> h = Graph('hello', format='svg')
155 >>> h = graphviz.Graph('hello', format='svg')
137156
138157 >>> h.edge('Hello', 'World')
139158
160179 :class:`.Graph` and :class:`.Digraph` objects have a
161180 :meth:`~.Graph._repr_svg_`-method so they can be rendered and displayed
162181 directly inside a `Jupyter notebook`_. For an example, check the
163 ``examples/notebook.ipynb`` file in the
164 `source repository/distribution <notebook.ipynb_>`_ (or the same rendered
165 within nbviewer_).
182 ``examples/graphviz-notebook.ipynb`` file in the
183 `source repository/distribution <graphviz-notebook.ipynb_>`_ (or the same
184 rendered within nbviewer_).
166185
167186 This also allows direct displaying within the `Jupyter Qt Console`_ (e.g.
168187 `the one <spyderconsole_>`_ inside `Spyder IDE`_):
180199
181200 .. code:: python
182201
183 >>> ps = Digraph(name='pet-shop', node_attr={'shape': 'plaintext'})
202 >>> ps = graphviz.Digraph(name='pet-shop', node_attr={'shape': 'plaintext'})
184203
185204 >>> ps.node('parrot')
186205 >>> ps.node('dead')
218237
219238 .. code:: python
220239
221 >>> ni = Graph('ni')
240 >>> ni = graphviz.Graph('ni')
222241
223242 >>> ni.attr('node', shape='rarrow')
224243 >>> ni.node('1', 'Ni!')
240259 >>> ni.attr(rankdir='LR')
241260
242261 >>> ni.edges(['12', '23', '34', '45'])
262
243263 >>> print(ni.source) # doctest: +NORMALIZE_WHITESPACE
244264 graph ni {
245265 node [shape=rarrow]
278298
279299 .. code:: python
280300
281 >>> cpp = Digraph('C++')
301 >>> cpp = graphviz.Digraph('C++')
282302
283303 >>> cpp.node('A', 'std::string')
284304 >>> cpp.node('B', '"spam"')
309329
310330 .. code:: python
311331
312 >>> e = Digraph()
332 >>> e = graphviz.Digraph()
333
313334 >>> e.node('backslash', label=r'\\')
314335 >>> e.node('multi_line', label=r'centered\nleft\lright\r')
336
315337 >>> print(e.source) # doctest: +NORMALIZE_WHITESPACE
316338 digraph {
317339 backslash [label="\\"]
327349
328350 .. code:: python
329351
330 >>> from graphviz import escape
331 >>> bs = Digraph()
332 >>> bs.node(escape('\\'))
352 >>> bs = graphviz.Digraph()
353
354 >>> bs.node(graphviz.escape('\\'))
355
333356 >>> print(bs.source) # doctest: +NORMALIZE_WHITESPACE
334357 digraph {
335358 "\\"
352375
353376 .. code:: python
354377
355 >>> q = Digraph()
378 >>> q = graphviz.Digraph()
379
356380 >>> q.edge('spam', 'eggs eggs')
357381 >>> q.edge('node', '"here\'s a quote"')
382
358383 >>> print(q.source) # doctest: +NORMALIZE_WHITESPACE
359384 digraph {
360385 spam -> "eggs eggs"
367392
368393 .. code:: python
369394
370 >>> h = Graph('html_table')
395 >>> h = graphviz.Graph('html_table')
396
371397 >>> h.node('tab', label='''<<TABLE>
372398 ... <TR>
373399 ... <TD>left</TD>
385411
386412 .. code:: python
387413
388 >>> from graphviz import nohtml
389 >>> d = Digraph(format='svg')
390 >>> d.node('diamond', label=nohtml('<>'))
414 >>> d = graphviz.Digraph(format='svg')
415
416 >>> d.node('diamond', label=graphviz.nohtml('<>'))
417
391418 >>> print(d.source) # doctest: +NORMALIZE_WHITESPACE
392419 digraph {
393420 diamond [label="<>"]
414441
415442 .. code:: python
416443
417 >>> p = Graph(name='parent')
444 >>> p = graphviz.Graph(name='parent')
418445 >>> p.edge('spam', 'eggs')
419446
420 >>> c = Graph(name='child', node_attr={'shape': 'box'})
447 >>> c = graphviz.Graph(name='child', node_attr={'shape': 'box'})
421448 >>> c.edge('foo', 'bar')
422449
423450 >>> p.subgraph(c)
426453
427454 .. code:: python
428455
429 >>> p = Graph(name='parent')
456 >>> p = graphviz.Graph(name='parent')
430457 >>> p.edge('spam', 'eggs')
431458
432459 >>> with p.subgraph(name='child', node_attr={'shape': 'box'}) as c:
452479 (:ref:`example <cluster.py>`). Also see the `Subgraphs and Clusters`
453480 section of `the DOT language documentation <DOT_>`_.
454481
482 When :meth:`~.Graph.subgraph` is used as a context manager, the new graph
483 instance is created with ``strict=None`` and the parent graph's values for
484 ``directory``, ``format``, ``engine``, and ``encoding``. Note that these
485 attributes are only relevant when rendering the subgraph independently
486 (i.e. as a stand-alone graph) from within the ``with``-block:
487
488 .. code:: python
489
490 >>> p = graphviz.Graph(name='parent')
491
492 >>> with p.subgraph(name='child') as c:
493 ... c.edge('bacon', 'eggs')
494 ... c.render() # doctest: +SKIP
495 'child.gv.pdf'
496
455497
456498 Engines
457499 -------
461503
462504 .. code:: python
463505
464 >>> g = Graph(engine='neato')
506 >>> g = graphviz.Graph(engine='neato')
465507
466508 You can also change the :attr:`~.Graph.engine` attribute of an existing
467509 instance:
469511 .. code:: python
470512
471513 >>> dot.engine = 'circo'
514
515
516 Unflatten
517 ---------
518
519 To prepocess the DOT_ source of a :class:`.Graph` or :class:`.Digraph` with
520 the unflatten_ preprocessor (`PDF <unflatten_pdf_>`_), use the
521 :meth:`~.Graph.unflatten`-method.
522
523 .. code:: python
524
525 >>> w = graphviz.Digraph()
526
527 >>> w.edges(('0', str(i)) for i in range(1, 10))
528
529 >>> w.view() # doctest: +SKIP
530
531 .. image:: _static/wide.svg
532 :align: center
533
534 unflatten_ is used to improve the aspect ratio of graphs having many leaves or
535 disconnected nodes.
536
537 .. code:: python
538
539 >>> u = w.unflatten(stagger=3)
540
541 >>> u.view() # doctest: +SKIP
542
543 .. image:: _static/wide-unflatten-stagger-3.svg
544 :align: center
545
546 The method returns a :class:`.Source` object that you can
547 :meth:`~.Source.render`, :meth:`~.Source.view`, etc. with the same API
548 (minus modification, see details `below <Using raw DOT_>`_).
549
550 .. code:: python
551
552 >>> u = w.unflatten(stagger=2)
553
554 >>> u.view() # doctest: +SKIP
555
556 .. image:: _static/wide-unflatten-stagger-2.svg
557 :align: center
472558
473559
474560 Custom DOT statements
481567
482568 .. code:: python
483569
484 >>> rt = Digraph(comment='The Round Table')
570 >>> rt = graphviz.Digraph(comment='The Round Table')
485571
486572 >>> rt.body.append('\t"King Arthur" -> {\n\t\t"Sir Bedevere", "Sir Lancelot"\n\t}')
487573 >>> rt.edge('Sir Bedevere', 'Sir Lancelot', constraint='false')
508594
509595 .. code:: python
510596
511 >>> from graphviz import Source
512
513 >>> src = Source('digraph "the holy hand grenade" { rankdir=LR; 1 -> 2 -> 3 -> lob }')
597 >>> src = graphviz.Source('digraph "the holy hand grenade" { rankdir=LR; 1 -> 2 -> 3 -> lob }')
514598
515599 >>> src #doctest: +ELLIPSIS
516600 <graphviz.files.Source object at 0x...>
539623
540624 .. code:: python
541625
542 >>> from graphviz import render
543
544 >>> render('dot', 'png', 'test-output/holy-grenade.gv') # doctest: +SKIP
626 >>> graphviz.render('dot', 'png', 'test-output/holy-grenade.gv') # doctest: +SKIP
545627 'test-output/holy-grenade.gv.png'
546628
547629 To directly display the graph of an existing DOT source file inside a
573655
574656 >>> import tempfile
575657
576 >>> g = Graph()
658 >>> g = graphviz.Graph()
659
577660 >>> g.node('spam')
578661
579662 >>> g.view(tempfile.mktemp('.gv')) # doctest: +SKIP
588671 cycles.
589672
590673
674 .. _Graphviz: https://www.graphviz.org
675 .. _DOT: https://www.graphviz.org/doc/info/lang.html
676 .. _DOT: https://www.graphviz.org/doc/info/lang.html
677 .. _upstream repo: https://gitlab.com/graphviz/graphviz/
678 .. _upstream-download: https://www.graphviz.org/download/
679 .. _upstream-archived: https://www2.graphviz.org/Archive/stable/
680 .. _upstream-windows: https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224
681
591682 .. _pip: https://pip.readthedocs.io
592683 .. _virtualenv: https://virtualenv.pypa.io
593684
594 .. _Graphviz: https://www.graphviz.org
595 .. _download page: https://www.graphviz.org/download/
596 .. _DOT: https://www.graphviz.org/doc/info/lang.html
685 .. _Anaconda: https://docs.anaconda.com/anaconda/install/
686 .. _conda-forge: https://conda-forge.org
687 .. _conda-forge-python-graphviz: https://anaconda.org/conda-forge/python-graphviz
688 .. _conda-forge-python-graphviz-feedstock: https://github.com/conda-forge/python-graphviz-feedstock
689 .. _conda-forge-graphviz: https://anaconda.org/conda-forge/graphviz
690 .. _conda-forge-graphviz-feedstock: https://github.com/conda-forge/graphviz-feedstock
691
597692 .. _output file format: https://www.graphviz.org/doc/info/output.html
598693 .. _appearance: https://www.graphviz.org/doc/info/attrs.html
599694 .. _escString: https://www.graphviz.org/doc/info/attrs.html#k:escString
600695 .. _raw string literals: https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
601696 .. _HTML-like labels: https://graphviz.gitlab.io/_pages/doc/info/shapes.html#html
602
697 .. _unflatten: https://linux.die.net/man/1/unflatten
698 .. _unflatten_pdf: https://www.graphviz.org/pdf/unflatten.1.pdf
603699 .. _Jupyter notebook: https://jupyter.org
604 .. _notebook.ipynb: https://github.com/xflr6/graphviz/blob/master/examples/notebook.ipynb
605 .. _nbviewer: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/notebook.ipynb
700 .. _graphviz-notebook.ipynb: https://github.com/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
701 .. _nbviewer: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
606702 .. _Jupyter Qt Console: https://qtconsole.readthedocs.io
607703 .. _spyderconsole: https://docs.spyder-ide.org/ipythonconsole.html
608704 .. _Spyder IDE: https://github.com/spyder-ide/spyder
22 Notebooks
33 =========
44
5 - Render gallery examples with logging: notebook.ipynb_
5 - Render gallery examples with logging: graphviz-notebook.ipynb_
66 - Engine comparison: graphviz-engines.ipynb_
77 - Verify escaping and quoting: graphviz-escapes.ipynb_
88
99
10 .. _notebook.ipynb: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/notebook.ipynb
10 .. _graphviz-notebook.ipynb: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
1111 .. _graphviz-engines.ipynb: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-engines.ipynb
1212 .. _graphviz-escapes.ipynb: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-escapes.ipynb
docs/pet-shop.png less more
Binary diff not shown
Binary diff not shown
0 #!/usr/bin/env python
1 # angles.py - http://www.graphviz.org/Gallery/gradient/angles.html
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/Gallery/gradient/angles.html"""
43
5 g = Digraph('G', filename='angles.gv')
4 import graphviz
5
6 g = graphviz.Digraph('G', filename='angles.gv')
67 g.attr(bgcolor='blue')
78
89 with g.subgraph(name='cluster_1') as c:
1112 gradientangle='360', label='n9:360', fontcolor='black')
1213 c.node('n9')
1314 for i, a in zip(range(8, 0, -1), range(360 - 45, -1, -45)):
14 c.attr('node', gradientangle='%d' % a, label='n%d:%d' % (i, a))
15 c.node('n%d' % i)
15 c.attr('node', gradientangle=f'{a:d}', label=f'n{i:d}:{a:d}')
16 c.node(f'n{i:d}')
1617 c.attr(label='Linear Angle Variations (white to black gradient)')
1718
1819 with g.subgraph(name='cluster_2') as c:
2122 gradientangle='360', label='n18:360', fontcolor='black')
2223 c.node('n18')
2324 for i, a in zip(range(17, 9, -1), range(360 - 45, -1, -45)):
24 c.attr('node', gradientangle='%d' % a, label='n%d:%d' % (i, a))
25 c.node('n%d' % i)
25 c.attr('node', gradientangle=f'{a:d}', label=f'n{i:d}:{a:d}')
26 c.node(f'n{i:d}')
2627 c.attr(label='Radial Angle Variations (white to black gradient)')
2728
2829 g.edge('n5', 'n14')
0 #!/usr/bin/env python
1 # btree.py - http://www.graphviz.org/pdf/dotguide.pdf Figure 13
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph, nohtml
2 """http://www.graphviz.org/pdf/dotguide.pdf, Figure 13"""
43
5 g = Digraph('g', filename='btree.gv',
6 node_attr={'shape': 'record', 'height': '.1'})
4 import graphviz
5 from graphviz import nohtml
6
7 g = graphviz.Digraph('g', filename='btree.gv',
8 node_attr={'shape': 'record', 'height': '.1'})
79
810 g.node('node0', nohtml('<f0> |<f1> G|<f2>'))
911 g.node('node1', nohtml('<f0> |<f1> E|<f2>'))
0 #!/usr/bin/env python
1 # cluster.py - http://www.graphviz.org/content/cluster
0 #!/usr/bin/env python3
1
2 """http://www.graphviz.org/content/cluster"""
23
34 from graphviz import Digraph
45
0 #!/usr/bin/env python
1 # cluster_edge.py - http://www.graphviz.org/pdf/dotguide.pdf Figure 20
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/pdf/dotguide.pdf, Figure 20"""
43
5 g = Digraph('G', filename='cluster_edge.gv')
4 import graphviz
5
6 g = graphviz.Digraph('G', filename='cluster_edge.gv')
67 g.attr(compound='true')
78
89 with g.subgraph(name='cluster0') as c:
0 #!/usr/bin/env python
1 # er.py - http://www.graphviz.org/content/ER
0 #!/usr/bin/env python3
21
3 from graphviz import Graph
2 """http://www.graphviz.org/content/ER"""
43
5 e = Graph('ER', filename='er.gv', engine='neato')
4 import graphviz
5
6 e = graphviz.Graph('ER', filename='er.gv', engine='neato')
67
78 e.attr('node', shape='box')
89 e.node('course')
0 #!/usr/bin/env python
1 # fdpclust.py - http://www.graphviz.org/content/fdpclust
0 #!/usr/bin/env python3
21
3 from graphviz import Graph
2 """http://www.graphviz.org/content/fdpclust"""
43
5 g = Graph('G', filename='fdpclust.gv', engine='fdp')
4 import graphviz
5
6 g = graphviz.Graph('G', filename='fdpclust.gv', engine='fdp')
67
78 g.node('e')
89
0 #!/usr/bin/env python
1 # fsm.py - http://www.graphviz.org/content/fsm
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/content/fsm"""
43
5 f = Digraph('finite_state_machine', filename='fsm.gv')
4 import graphviz
5
6 f = graphviz.Digraph('finite_state_machine', filename='fsm.gv')
67 f.attr(rankdir='LR', size='8,5')
78
89 f.attr('node', shape='doublecircle')
0 #!/usr/bin/env python
1 # http://www.graphviz.org/Gallery/gradient/g_c_n.html
0 #!/usr/bin/env python3
21
3 from graphviz import Graph
2 """http://www.graphviz.org/Gallery/gradient/g_c_n.html"""
43
5 g = Graph('G', filename='g_c_n.gv')
4 import graphviz
5
6 g = graphviz.Graph('G', filename='g_c_n.gv')
67 g.attr(bgcolor='purple:pink', label='agraph', fontcolor='white')
78
89 with g.subgraph(name='cluster1') as c:
6161 "</svg>\r\n"
6262 ],
6363 "text/plain": [
64 "<graphviz.dot.Digraph at 0x525b188>"
64 "<graphviz.dot.Digraph at 0x4f7ebb0>"
6565 ]
6666 },
6767 "metadata": {},
123123 "</svg>\r\n"
124124 ],
125125 "text/plain": [
126 "<graphviz.dot.Digraph at 0x525b188>"
126 "<graphviz.dot.Digraph at 0x4f7ebb0>"
127127 ]
128128 },
129129 "metadata": {},
185185 "</svg>\r\n"
186186 ],
187187 "text/plain": [
188 "<graphviz.dot.Digraph at 0x525b188>"
188 "<graphviz.dot.Digraph at 0x4f7ebb0>"
189189 ]
190190 },
191191 "metadata": {},
247247 "</svg>\r\n"
248248 ],
249249 "text/plain": [
250 "<graphviz.dot.Digraph at 0x525b188>"
250 "<graphviz.dot.Digraph at 0x4f7ebb0>"
251251 ]
252252 },
253253 "metadata": {},
309309 "</svg>\r\n"
310310 ],
311311 "text/plain": [
312 "<graphviz.dot.Digraph at 0x525b188>"
312 "<graphviz.dot.Digraph at 0x4f7ebb0>"
313313 ]
314314 },
315315 "metadata": {},
356356 "</svg>\r\n"
357357 ],
358358 "text/plain": [
359 "<graphviz.dot.Digraph at 0x525b188>"
359 "<graphviz.dot.Digraph at 0x4f7ebb0>"
360360 ]
361361 },
362362 "metadata": {},
418418 "</svg>\r\n"
419419 ],
420420 "text/plain": [
421 "<graphviz.dot.Digraph at 0x525b188>"
421 "<graphviz.dot.Digraph at 0x4f7ebb0>"
422422 ]
423423 },
424424 "metadata": {},
480480 "</svg>\r\n"
481481 ],
482482 "text/plain": [
483 "<graphviz.dot.Digraph at 0x525b188>"
483 "<graphviz.dot.Digraph at 0x4f7ebb0>"
484484 ]
485485 },
486486 "metadata": {},
495495 }
496496 ],
497497 "source": [
498 "%cd -q ..\n",
499 "\n",
498500 "from IPython.display import display\n",
499501 "\n",
500502 "import graphviz\n",
526528 "name": "python",
527529 "nbconvert_exporter": "python",
528530 "pygments_lexer": "ipython3",
529 "version": "3.7.4"
531 "version": "3.8.7"
530532 }
531533 },
532534 "nbformat": 4,
3636 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
3737 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
3838 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
39 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
40 " -->\r\n",
41 "<!-- Title: %3 Pages: 1 -->\r\n",
39 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
40 " -->\r\n",
41 "<!-- Pages: 1 -->\r\n",
4242 "<svg width=\"62pt\" height=\"44pt\"\r\n",
4343 " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
4444 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
45 "<title>%3</title>\r\n",
46 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\r\n",
47 "<!-- A -->\r\n",
48 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
45 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\r\n",
46 "<!-- A -->\r\n",
47 "<g id=\"node1\" class=\"node\">\r\n",
48 "<title>A</title>\r\n",
4949 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
5050 "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">&quot;</text>\r\n",
5151 "</g>\r\n",
5353 "</svg>\r\n"
5454 ],
5555 "text/plain": [
56 "<graphviz.dot.Digraph at 0x4f041f0>"
56 "<graphviz.dot.Digraph at 0x50015b0>"
5757 ]
5858 },
5959 "execution_count": 2,
8585 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
8686 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
8787 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
88 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
89 " -->\r\n",
90 "<!-- Title: %3 Pages: 1 -->\r\n",
88 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
89 " -->\r\n",
90 "<!-- Pages: 1 -->\r\n",
9191 "<svg width=\"62pt\" height=\"44pt\"\r\n",
9292 " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
9393 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
94 "<title>%3</title>\r\n",
95 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\r\n",
96 "<!-- A -->\r\n",
97 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
94 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\r\n",
95 "<!-- A -->\r\n",
96 "<g id=\"node1\" class=\"node\">\r\n",
97 "<title>A</title>\r\n",
9898 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
9999 "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">\\</text>\r\n",
100100 "</g>\r\n",
102102 "</svg>\r\n"
103103 ],
104104 "text/plain": [
105 "<graphviz.dot.Digraph at 0x4efdac0>"
105 "<graphviz.dot.Digraph at 0x4fdbbb0>"
106106 ]
107107 },
108108 "execution_count": 3,
134134 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
135135 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
136136 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
137 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
138 " -->\r\n",
139 "<!-- Title: %3 Pages: 1 -->\r\n",
137 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
138 " -->\r\n",
139 "<!-- Pages: 1 -->\r\n",
140140 "<svg width=\"62pt\" height=\"44pt\"\r\n",
141141 " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
142142 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
143 "<title>%3</title>\r\n",
144 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\r\n",
145 "<!-- A -->\r\n",
146 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
143 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\r\n",
144 "<!-- A -->\r\n",
145 "<g id=\"node1\" class=\"node\">\r\n",
146 "<title>A</title>\r\n",
147147 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
148148 "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">\\&quot;</text>\r\n",
149149 "</g>\r\n",
151151 "</svg>\r\n"
152152 ],
153153 "text/plain": [
154 "<graphviz.dot.Digraph at 0x4ee4c70>"
154 "<graphviz.dot.Digraph at 0x4fd8af0>"
155155 ]
156156 },
157157 "execution_count": 4,
190190 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
191191 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
192192 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
193 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
194 " -->\r\n",
195 "<!-- Title: %3 Pages: 1 -->\r\n",
193 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
194 " -->\r\n",
195 "<!-- Pages: 1 -->\r\n",
196196 "<svg width=\"87pt\" height=\"44pt\"\r\n",
197197 " viewBox=\"0.00 0.00 87.29 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
198198 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
199 "<title>%3</title>\r\n",
200 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 83.293,-40 83.293,4 -4,4\"/>\r\n",
201 "<!-- A -->\r\n",
202 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
203 "<ellipse fill=\"none\" stroke=\"black\" cx=\"39.6465\" cy=\"-18\" rx=\"39.7935\" ry=\"18\"/>\r\n",
204 "<text text-anchor=\"middle\" x=\"39.6465\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">node: A</text>\r\n",
205 "</g>\r\n",
206 "</g>\r\n",
207 "</svg>\r\n"
208 ],
209 "text/plain": [
210 "<graphviz.dot.Digraph at 0x514f400>"
199 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 83.29,-40 83.29,4 -4,4\"/>\r\n",
200 "<!-- A -->\r\n",
201 "<g id=\"node1\" class=\"node\">\r\n",
202 "<title>A</title>\r\n",
203 "<ellipse fill=\"none\" stroke=\"black\" cx=\"39.65\" cy=\"-18\" rx=\"39.79\" ry=\"18\"/>\r\n",
204 "<text text-anchor=\"middle\" x=\"39.65\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">node: A</text>\r\n",
205 "</g>\r\n",
206 "</g>\r\n",
207 "</svg>\r\n"
208 ],
209 "text/plain": [
210 "<graphviz.dot.Digraph at 0x5016b50>"
211211 ]
212212 },
213213 "execution_count": 5,
239239 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
240240 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
241241 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
242 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
242 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
243243 " -->\r\n",
244244 "<!-- Title: spam Pages: 1 -->\r\n",
245245 "<svg width=\"118pt\" height=\"44pt\"\r\n",
246246 " viewBox=\"0.00 0.00 118.49 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
247247 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
248248 "<title>spam</title>\r\n",
249 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 114.49,-40 114.49,4 -4,4\"/>\r\n",
250 "<!-- A -->\r\n",
251 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
252 "<ellipse fill=\"none\" stroke=\"black\" cx=\"55.2451\" cy=\"-18\" rx=\"55.4913\" ry=\"18\"/>\r\n",
253 "<text text-anchor=\"middle\" x=\"55.2451\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">graph: spam</text>\r\n",
254 "</g>\r\n",
255 "</g>\r\n",
256 "</svg>\r\n"
257 ],
258 "text/plain": [
259 "<graphviz.dot.Digraph at 0x514f3d0>"
249 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 114.49,-40 114.49,4 -4,4\"/>\r\n",
250 "<!-- A -->\r\n",
251 "<g id=\"node1\" class=\"node\">\r\n",
252 "<title>A</title>\r\n",
253 "<ellipse fill=\"none\" stroke=\"black\" cx=\"55.25\" cy=\"-18\" rx=\"55.49\" ry=\"18\"/>\r\n",
254 "<text text-anchor=\"middle\" x=\"55.25\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">graph: spam</text>\r\n",
255 "</g>\r\n",
256 "</g>\r\n",
257 "</svg>\r\n"
258 ],
259 "text/plain": [
260 "<graphviz.dot.Digraph at 0x4fb0e80>"
260261 ]
261262 },
262263 "execution_count": 6,
288289 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
289290 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
290291 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
291 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
292 " -->\r\n",
293 "<!-- Title: %3 Pages: 1 -->\r\n",
292 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
293 " -->\r\n",
294 "<!-- Pages: 1 -->\r\n",
294295 "<svg width=\"69pt\" height=\"44pt\"\r\n",
295296 " viewBox=\"0.00 0.00 69.09 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
296297 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
297 "<title>%3</title>\r\n",
298 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 65.0946,-40 65.0946,4 -4,4\"/>\r\n",
299 "<!-- A -->\r\n",
300 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
298 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 65.09,-40 65.09,4 -4,4\"/>\r\n",
299 "<!-- A -->\r\n",
300 "<g id=\"node1\" class=\"node\">\r\n",
301 "<title>A</title>\r\n",
301302 "<g id=\"a_node1\"><a xlink:href=\"https://example.org/spam\" xlink:title=\"spam\">\r\n",
302 "<ellipse fill=\"none\" stroke=\"black\" cx=\"30.5473\" cy=\"-18\" rx=\"30.5947\" ry=\"18\"/>\r\n",
303 "<text text-anchor=\"middle\" x=\"30.5473\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">spam</text>\r\n",
303 "<ellipse fill=\"none\" stroke=\"black\" cx=\"30.55\" cy=\"-18\" rx=\"30.59\" ry=\"18\"/>\r\n",
304 "<text text-anchor=\"middle\" x=\"30.55\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">spam</text>\r\n",
304305 "</a>\r\n",
305306 "</g>\r\n",
306307 "</g>\r\n",
308309 "</svg>\r\n"
309310 ],
310311 "text/plain": [
311 "<graphviz.dot.Digraph at 0x514fd30>"
312 "<graphviz.dot.Digraph at 0x5001a00>"
312313 ]
313314 },
314315 "execution_count": 7,
340341 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
341342 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
342343 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
343 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
344 " -->\r\n",
345 "<!-- Title: %3 Pages: 1 -->\r\n",
344 "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\r\n",
345 " -->\r\n",
346 "<!-- Pages: 1 -->\r\n",
346347 "<svg width=\"99pt\" height=\"83pt\"\r\n",
347348 " viewBox=\"0.00 0.00 98.51 82.95\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
348 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 78.9533)\">\r\n",
349 "<title>%3</title>\r\n",
350 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-78.9533 94.5097,-78.9533 94.5097,4 -4,4\"/>\r\n",
351 "<!-- A -->\r\n",
352 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
353 "<ellipse fill=\"none\" stroke=\"black\" cx=\"45.2548\" cy=\"-37.4767\" rx=\"45.011\" ry=\"37.4533\"/>\r\n",
354 "<text text-anchor=\"middle\" x=\"45.2548\" y=\"-48.7767\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">centered</text>\r\n",
355 "<text text-anchor=\"start\" x=\"21.2548\" y=\"-33.7767\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">left</text>\r\n",
356 "<text text-anchor=\"end\" x=\"69.2548\" y=\"-18.7767\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">right</text>\r\n",
357 "</g>\r\n",
358 "</g>\r\n",
359 "</svg>\r\n"
360 ],
361 "text/plain": [
362 "<graphviz.dot.Digraph at 0x4f04a90>"
349 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 78.95)\">\r\n",
350 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-78.95 94.51,-78.95 94.51,4 -4,4\"/>\r\n",
351 "<!-- A -->\r\n",
352 "<g id=\"node1\" class=\"node\">\r\n",
353 "<title>A</title>\r\n",
354 "<ellipse fill=\"none\" stroke=\"black\" cx=\"45.25\" cy=\"-37.48\" rx=\"45.01\" ry=\"37.45\"/>\r\n",
355 "<text text-anchor=\"middle\" x=\"45.25\" y=\"-48.78\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">centered</text>\r\n",
356 "<text text-anchor=\"start\" x=\"21.25\" y=\"-33.78\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">left</text>\r\n",
357 "<text text-anchor=\"end\" x=\"69.25\" y=\"-18.78\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">right</text>\r\n",
358 "</g>\r\n",
359 "</g>\r\n",
360 "</svg>\r\n"
361 ],
362 "text/plain": [
363 "<graphviz.dot.Digraph at 0x4fd8550>"
363364 ]
364365 },
365366 "execution_count": 8,
388389 "name": "python",
389390 "nbconvert_exporter": "python",
390391 "pygments_lexer": "ipython3",
391 "version": "3.8.2"
392 "version": "3.8.7"
392393 }
393394 },
394395 "nbformat": 4,
0 {
1 "cells": [
2 {
3 "cell_type": "code",
4 "execution_count": 1,
5 "metadata": {},
6 "outputs": [
7 {
8 "data": {
9 "text/plain": [
10 "'0.16'"
11 ]
12 },
13 "execution_count": 1,
14 "metadata": {},
15 "output_type": "execute_result"
16 }
17 ],
18 "source": [
19 "import logging\n",
20 "\n",
21 "import graphviz\n",
22 "\n",
23 "logging.basicConfig(format='[%(levelname)s@%(name)s] %(message)s', level=logging.DEBUG)\n",
24 "\n",
25 "graphviz.__version__"
26 ]
27 },
28 {
29 "cell_type": "code",
30 "execution_count": 2,
31 "metadata": {},
32 "outputs": [
33 {
34 "name": "stderr",
35 "output_type": "stream",
36 "text": [
37 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
38 ]
39 },
40 {
41 "data": {
42 "image/svg+xml": [
43 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
44 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
45 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
46 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
47 " -->\r\n",
48 "<!-- Pages: 1 -->\r\n",
49 "<svg width=\"390pt\" height=\"116pt\"\r\n",
50 " viewBox=\"0.00 0.00 389.98 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
51 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\r\n",
52 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-112 385.98,-112 385.98,4 -4,4\"/>\r\n",
53 "<!-- A -->\r\n",
54 "<g id=\"node1\" class=\"node\">\r\n",
55 "<title>A</title>\r\n",
56 "<ellipse fill=\"none\" stroke=\"black\" cx=\"190.99\" cy=\"-90\" rx=\"53.89\" ry=\"18\"/>\r\n",
57 "<text text-anchor=\"middle\" x=\"190.99\" y=\"-86.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">King Arthur</text>\r\n",
58 "</g>\r\n",
59 "<!-- B -->\r\n",
60 "<g id=\"node2\" class=\"node\">\r\n",
61 "<title>B</title>\r\n",
62 "<ellipse fill=\"none\" stroke=\"black\" cx=\"90.99\" cy=\"-18\" rx=\"90.98\" ry=\"18\"/>\r\n",
63 "<text text-anchor=\"middle\" x=\"90.99\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Sir Bedevere the Wise</text>\r\n",
64 "</g>\r\n",
65 "<!-- A&#45;&gt;B -->\r\n",
66 "<g id=\"edge1\" class=\"edge\">\r\n",
67 "<title>A&#45;&gt;B</title>\r\n",
68 "<path fill=\"none\" stroke=\"black\" d=\"M168.8,-73.46C155.33,-64.04 137.92,-51.85 122.98,-41.39\"/>\r\n",
69 "<polygon fill=\"black\" stroke=\"black\" points=\"124.72,-38.33 114.52,-35.47 120.7,-44.07 124.72,-38.33\"/>\r\n",
70 "</g>\r\n",
71 "<!-- L -->\r\n",
72 "<g id=\"node3\" class=\"node\">\r\n",
73 "<title>L</title>\r\n",
74 "<ellipse fill=\"none\" stroke=\"black\" cx=\"290.99\" cy=\"-18\" rx=\"90.98\" ry=\"18\"/>\r\n",
75 "<text text-anchor=\"middle\" x=\"290.99\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Sir Lancelot the Brave</text>\r\n",
76 "</g>\r\n",
77 "<!-- A&#45;&gt;L -->\r\n",
78 "<g id=\"edge2\" class=\"edge\">\r\n",
79 "<title>A&#45;&gt;L</title>\r\n",
80 "<path fill=\"none\" stroke=\"black\" d=\"M213.19,-73.46C226.65,-64.04 244.07,-51.85 259.01,-41.39\"/>\r\n",
81 "<polygon fill=\"black\" stroke=\"black\" points=\"261.28,-44.07 267.47,-35.47 257.27,-38.33 261.28,-44.07\"/>\r\n",
82 "</g>\r\n",
83 "<!-- B&#45;&gt;L -->\r\n",
84 "<g id=\"edge3\" class=\"edge\">\r\n",
85 "<title>B&#45;&gt;L</title>\r\n",
86 "<path fill=\"none\" stroke=\"black\" d=\"M182.01,-18C184.62,-18 187.22,-18 189.83,-18\"/>\r\n",
87 "<polygon fill=\"black\" stroke=\"black\" points=\"189.89,-21.5 199.89,-18 189.89,-14.5 189.89,-21.5\"/>\r\n",
88 "</g>\r\n",
89 "</g>\r\n",
90 "</svg>\r\n"
91 ],
92 "text/plain": [
93 "<graphviz.dot.Digraph at 0x1c71cc84970>"
94 ]
95 },
96 "execution_count": 2,
97 "metadata": {},
98 "output_type": "execute_result"
99 }
100 ],
101 "source": [
102 "dot = graphviz.Digraph(comment='The Round Table')\n",
103 "\n",
104 "dot.node('A', 'King Arthur')\n",
105 "dot.node('B', 'Sir Bedevere the Wise')\n",
106 "dot.node('L', 'Sir Lancelot the Brave')\n",
107 "\n",
108 "dot.edges(['AB', 'AL'])\n",
109 "dot.edge('B', 'L', constraint='false')\n",
110 "\n",
111 "dot"
112 ]
113 },
114 {
115 "cell_type": "code",
116 "execution_count": 3,
117 "metadata": {},
118 "outputs": [
119 {
120 "name": "stderr",
121 "output_type": "stream",
122 "text": [
123 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
124 ]
125 },
126 {
127 "data": {
128 "image/svg+xml": [
129 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
130 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
131 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
132 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
133 " -->\r\n",
134 "<!-- Title: the holy hand grenade Pages: 1 -->\r\n",
135 "<svg width=\"332pt\" height=\"44pt\"\r\n",
136 " viewBox=\"0.00 0.00 332.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
137 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
138 "<title>the holy hand grenade</title>\r\n",
139 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 328,-40 328,4 -4,4\"/>\r\n",
140 "<!-- 1 -->\r\n",
141 "<g id=\"node1\" class=\"node\">\r\n",
142 "<title>1</title>\r\n",
143 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
144 "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">1</text>\r\n",
145 "</g>\r\n",
146 "<!-- 2 -->\r\n",
147 "<g id=\"node2\" class=\"node\">\r\n",
148 "<title>2</title>\r\n",
149 "<ellipse fill=\"none\" stroke=\"black\" cx=\"117\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
150 "<text text-anchor=\"middle\" x=\"117\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">2</text>\r\n",
151 "</g>\r\n",
152 "<!-- 1&#45;&gt;2 -->\r\n",
153 "<g id=\"edge1\" class=\"edge\">\r\n",
154 "<title>1&#45;&gt;2</title>\r\n",
155 "<path fill=\"none\" stroke=\"black\" d=\"M54.4,-18C62.39,-18 71.31,-18 79.82,-18\"/>\r\n",
156 "<polygon fill=\"black\" stroke=\"black\" points=\"79.92,-21.5 89.92,-18 79.92,-14.5 79.92,-21.5\"/>\r\n",
157 "</g>\r\n",
158 "<!-- 3 -->\r\n",
159 "<g id=\"node3\" class=\"node\">\r\n",
160 "<title>3</title>\r\n",
161 "<ellipse fill=\"none\" stroke=\"black\" cx=\"207\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
162 "<text text-anchor=\"middle\" x=\"207\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">3</text>\r\n",
163 "</g>\r\n",
164 "<!-- 2&#45;&gt;3 -->\r\n",
165 "<g id=\"edge2\" class=\"edge\">\r\n",
166 "<title>2&#45;&gt;3</title>\r\n",
167 "<path fill=\"none\" stroke=\"black\" d=\"M144.4,-18C152.39,-18 161.31,-18 169.82,-18\"/>\r\n",
168 "<polygon fill=\"black\" stroke=\"black\" points=\"169.92,-21.5 179.92,-18 169.92,-14.5 169.92,-21.5\"/>\r\n",
169 "</g>\r\n",
170 "<!-- lob -->\r\n",
171 "<g id=\"node4\" class=\"node\">\r\n",
172 "<title>lob</title>\r\n",
173 "<ellipse fill=\"none\" stroke=\"black\" cx=\"297\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
174 "<text text-anchor=\"middle\" x=\"297\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">lob</text>\r\n",
175 "</g>\r\n",
176 "<!-- 3&#45;&gt;lob -->\r\n",
177 "<g id=\"edge3\" class=\"edge\">\r\n",
178 "<title>3&#45;&gt;lob</title>\r\n",
179 "<path fill=\"none\" stroke=\"black\" d=\"M234.4,-18C242.39,-18 251.31,-18 259.82,-18\"/>\r\n",
180 "<polygon fill=\"black\" stroke=\"black\" points=\"259.92,-21.5 269.92,-18 259.92,-14.5 259.92,-21.5\"/>\r\n",
181 "</g>\r\n",
182 "</g>\r\n",
183 "</svg>\r\n"
184 ],
185 "text/plain": [
186 "<graphviz.files.Source at 0x1c71cde6d60>"
187 ]
188 },
189 "execution_count": 3,
190 "metadata": {},
191 "output_type": "execute_result"
192 }
193 ],
194 "source": [
195 "src = graphviz.Source('digraph \"the holy hand grenade\" { rankdir=LR; 1 -> 2 -> 3 -> lob }')\n",
196 "src"
197 ]
198 },
199 {
200 "cell_type": "code",
201 "execution_count": 4,
202 "metadata": {},
203 "outputs": [
204 {
205 "name": "stderr",
206 "output_type": "stream",
207 "text": [
208 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
209 ]
210 },
211 {
212 "data": {
213 "image/svg+xml": [
214 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
215 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
216 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
217 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
218 " -->\r\n",
219 "<!-- Title: finite_state_machine Pages: 1 -->\r\n",
220 "<svg width=\"576pt\" height=\"258pt\"\r\n",
221 " viewBox=\"0.00 0.00 576.00 258.45\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
222 "<g id=\"graph0\" class=\"graph\" transform=\"scale(0.77 0.77) rotate(0) translate(4 331.69)\">\r\n",
223 "<title>finite_state_machine</title>\r\n",
224 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-331.69 744.17,-331.69 744.17,4 -4,4\"/>\r\n",
225 "<!-- LR_0 -->\r\n",
226 "<g id=\"node1\" class=\"node\">\r\n",
227 "<title>LR_0</title>\r\n",
228 "<ellipse fill=\"none\" stroke=\"black\" cx=\"35.85\" cy=\"-83.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
229 "<ellipse fill=\"none\" stroke=\"black\" cx=\"35.85\" cy=\"-83.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
230 "<text text-anchor=\"middle\" x=\"35.85\" y=\"-80.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_0</text>\r\n",
231 "</g>\r\n",
232 "<!-- LR_2 -->\r\n",
233 "<g id=\"node5\" class=\"node\">\r\n",
234 "<title>LR_2</title>\r\n",
235 "<ellipse fill=\"none\" stroke=\"black\" cx=\"174.54\" cy=\"-151.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
236 "<text text-anchor=\"middle\" x=\"174.54\" y=\"-148.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_2</text>\r\n",
237 "</g>\r\n",
238 "<!-- LR_0&#45;&gt;LR_2 -->\r\n",
239 "<g id=\"edge1\" class=\"edge\">\r\n",
240 "<title>LR_0&#45;&gt;LR_2</title>\r\n",
241 "<path fill=\"none\" stroke=\"black\" d=\"M68.21,-99.45C88.53,-109.56 115.1,-122.77 136.47,-133.4\"/>\r\n",
242 "<polygon fill=\"black\" stroke=\"black\" points=\"135.06,-136.61 145.58,-137.94 138.18,-130.35 135.06,-136.61\"/>\r\n",
243 "<text text-anchor=\"middle\" x=\"107.19\" y=\"-129.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(B)</text>\r\n",
244 "</g>\r\n",
245 "<!-- LR_1 -->\r\n",
246 "<g id=\"node6\" class=\"node\">\r\n",
247 "<title>LR_1</title>\r\n",
248 "<ellipse fill=\"none\" stroke=\"black\" cx=\"174.54\" cy=\"-42.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
249 "<text text-anchor=\"middle\" x=\"174.54\" y=\"-39.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_1</text>\r\n",
250 "</g>\r\n",
251 "<!-- LR_0&#45;&gt;LR_1 -->\r\n",
252 "<g id=\"edge2\" class=\"edge\">\r\n",
253 "<title>LR_0&#45;&gt;LR_1</title>\r\n",
254 "<path fill=\"none\" stroke=\"black\" d=\"M70.29,-73.82C89.49,-68.06 113.72,-60.79 133.88,-54.74\"/>\r\n",
255 "<polygon fill=\"black\" stroke=\"black\" points=\"135.13,-58.02 143.7,-51.8 133.12,-51.32 135.13,-58.02\"/>\r\n",
256 "<text text-anchor=\"middle\" x=\"107.19\" y=\"-71.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(S)</text>\r\n",
257 "</g>\r\n",
258 "<!-- LR_3 -->\r\n",
259 "<g id=\"node2\" class=\"node\">\r\n",
260 "<title>LR_3</title>\r\n",
261 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-35.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
262 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-35.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
263 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-32.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_3</text>\r\n",
264 "</g>\r\n",
265 "<!-- LR_4 -->\r\n",
266 "<g id=\"node3\" class=\"node\">\r\n",
267 "<title>LR_4</title>\r\n",
268 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-291.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
269 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-291.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
270 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-288.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_4</text>\r\n",
271 "</g>\r\n",
272 "<!-- LR_8 -->\r\n",
273 "<g id=\"node4\" class=\"node\">\r\n",
274 "<title>LR_8</title>\r\n",
275 "<ellipse fill=\"none\" stroke=\"black\" cx=\"704.32\" cy=\"-152.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
276 "<ellipse fill=\"none\" stroke=\"black\" cx=\"704.32\" cy=\"-152.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
277 "<text text-anchor=\"middle\" x=\"704.32\" y=\"-149.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_8</text>\r\n",
278 "</g>\r\n",
279 "<!-- LR_6 -->\r\n",
280 "<g id=\"node7\" class=\"node\">\r\n",
281 "<title>LR_6</title>\r\n",
282 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-172.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
283 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-169.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_6</text>\r\n",
284 "</g>\r\n",
285 "<!-- LR_8&#45;&gt;LR_6 -->\r\n",
286 "<g id=\"edge13\" class=\"edge\">\r\n",
287 "<title>LR_8&#45;&gt;LR_6</title>\r\n",
288 "<path fill=\"none\" stroke=\"black\" d=\"M668.7,-158.83C625.38,-165.98 548.87,-177.52 482.78,-181.85 454.53,-183.7 447.36,-183.19 419.08,-181.85 401.3,-181.01 381.7,-179.28 364.95,-177.56\"/>\r\n",
289 "<polygon fill=\"black\" stroke=\"black\" points=\"365.25,-174.07 354.94,-176.5 364.51,-181.04 365.25,-174.07\"/>\r\n",
290 "<text text-anchor=\"middle\" x=\"513.28\" y=\"-183.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
291 "</g>\r\n",
292 "<!-- LR_5 -->\r\n",
293 "<g id=\"node8\" class=\"node\">\r\n",
294 "<title>LR_5</title>\r\n",
295 "<ellipse fill=\"none\" stroke=\"black\" cx=\"450.93\" cy=\"-107.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
296 "<text text-anchor=\"middle\" x=\"450.93\" y=\"-104.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_5</text>\r\n",
297 "</g>\r\n",
298 "<!-- LR_8&#45;&gt;LR_5 -->\r\n",
299 "<g id=\"edge14\" class=\"edge\">\r\n",
300 "<title>LR_8&#45;&gt;LR_5</title>\r\n",
301 "<path fill=\"none\" stroke=\"black\" d=\"M668.83,-147.36C628.46,-140.82 559.62,-129.34 500.78,-117.85 497.99,-117.3 495.11,-116.73 492.22,-116.15\"/>\r\n",
302 "<polygon fill=\"black\" stroke=\"black\" points=\"492.89,-112.72 482.4,-114.17 491.51,-119.58 492.89,-112.72\"/>\r\n",
303 "<text text-anchor=\"middle\" x=\"575.62\" y=\"-139.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
304 "</g>\r\n",
305 "<!-- LR_2&#45;&gt;LR_4 -->\r\n",
306 "<g id=\"edge6\" class=\"edge\">\r\n",
307 "<title>LR_2&#45;&gt;LR_4</title>\r\n",
308 "<path fill=\"none\" stroke=\"black\" d=\"M198.14,-173.42C222.46,-196.62 261.37,-233.76 289.13,-260.26\"/>\r\n",
309 "<polygon fill=\"black\" stroke=\"black\" points=\"287,-263.06 296.65,-267.43 291.83,-257.99 287,-263.06\"/>\r\n",
310 "<text text-anchor=\"middle\" x=\"246.89\" y=\"-241.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(A)</text>\r\n",
311 "</g>\r\n",
312 "<!-- LR_2&#45;&gt;LR_6 -->\r\n",
313 "<g id=\"edge4\" class=\"edge\">\r\n",
314 "<title>LR_2&#45;&gt;LR_6</title>\r\n",
315 "<path fill=\"none\" stroke=\"black\" d=\"M206.29,-156.25C228.1,-159.37 257.6,-163.59 281.38,-167\"/>\r\n",
316 "<polygon fill=\"black\" stroke=\"black\" points=\"281.13,-170.5 291.52,-168.45 282.12,-163.57 281.13,-170.5\"/>\r\n",
317 "<text text-anchor=\"middle\" x=\"246.89\" y=\"-167.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(b)</text>\r\n",
318 "</g>\r\n",
319 "<!-- LR_2&#45;&gt;LR_5 -->\r\n",
320 "<g id=\"edge5\" class=\"edge\">\r\n",
321 "<title>LR_2&#45;&gt;LR_5</title>\r\n",
322 "<path fill=\"none\" stroke=\"black\" d=\"M204.48,-140.61C226.77,-132.49 258.56,-122.07 287.39,-116.85 328.17,-109.46 375.56,-107.58 408.61,-107.32\"/>\r\n",
323 "<polygon fill=\"black\" stroke=\"black\" points=\"408.82,-110.82 418.81,-107.29 408.8,-103.82 408.82,-110.82\"/>\r\n",
324 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-120.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(a)</text>\r\n",
325 "</g>\r\n",
326 "<!-- LR_1&#45;&gt;LR_3 -->\r\n",
327 "<g id=\"edge3\" class=\"edge\">\r\n",
328 "<title>LR_1&#45;&gt;LR_3</title>\r\n",
329 "<path fill=\"none\" stroke=\"black\" d=\"M206.65,-41.36C227.15,-40.38 254.31,-39.09 277.16,-38\"/>\r\n",
330 "<polygon fill=\"black\" stroke=\"black\" points=\"277.49,-41.49 287.31,-37.51 277.16,-34.49 277.49,-41.49\"/>\r\n",
331 "<text text-anchor=\"middle\" x=\"246.89\" y=\"-44.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S($end)</text>\r\n",
332 "</g>\r\n",
333 "<!-- LR_6&#45;&gt;LR_6 -->\r\n",
334 "<g id=\"edge9\" class=\"edge\">\r\n",
335 "<title>LR_6&#45;&gt;LR_6</title>\r\n",
336 "<path fill=\"none\" stroke=\"black\" d=\"M311.26,-202.53C310.87,-213.59 314.86,-222.69 323.24,-222.69 328.86,-222.69 332.51,-218.58 334.18,-212.53\"/>\r\n",
337 "<polygon fill=\"black\" stroke=\"black\" points=\"337.67,-212.83 335.21,-202.53 330.7,-212.12 337.67,-212.83\"/>\r\n",
338 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-226.49\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
339 "</g>\r\n",
340 "<!-- LR_6&#45;&gt;LR_5 -->\r\n",
341 "<g id=\"edge10\" class=\"edge\">\r\n",
342 "<title>LR_6&#45;&gt;LR_5</title>\r\n",
343 "<path fill=\"none\" stroke=\"black\" d=\"M351.82,-158.58C369.91,-149.23 393.77,-136.89 413.43,-126.72\"/>\r\n",
344 "<polygon fill=\"black\" stroke=\"black\" points=\"415.14,-129.78 422.41,-122.08 411.92,-123.56 415.14,-129.78\"/>\r\n",
345 "<text text-anchor=\"middle\" x=\"389.08\" y=\"-147.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
346 "</g>\r\n",
347 "<!-- LR_5&#45;&gt;LR_5 -->\r\n",
348 "<g id=\"edge8\" class=\"edge\">\r\n",
349 "<title>LR_5&#45;&gt;LR_5</title>\r\n",
350 "<path fill=\"none\" stroke=\"black\" d=\"M439.69,-138.02C439.45,-148.86 443.2,-157.69 450.93,-157.69 456.01,-157.69 459.36,-153.89 461,-148.21\"/>\r\n",
351 "<polygon fill=\"black\" stroke=\"black\" points=\"464.51,-148.35 462.17,-138.02 457.56,-147.56 464.51,-148.35\"/>\r\n",
352 "<text text-anchor=\"middle\" x=\"450.93\" y=\"-161.49\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
353 "</g>\r\n",
354 "<!-- LR_7 -->\r\n",
355 "<g id=\"node9\" class=\"node\">\r\n",
356 "<title>LR_7</title>\r\n",
357 "<ellipse fill=\"none\" stroke=\"black\" cx=\"575.62\" cy=\"-84.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
358 "<text text-anchor=\"middle\" x=\"575.62\" y=\"-81.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_7</text>\r\n",
359 "</g>\r\n",
360 "<!-- LR_5&#45;&gt;LR_7 -->\r\n",
361 "<g id=\"edge7\" class=\"edge\">\r\n",
362 "<title>LR_5&#45;&gt;LR_7</title>\r\n",
363 "<path fill=\"none\" stroke=\"black\" d=\"M482.57,-102.1C498.09,-99.19 517.14,-95.62 533.88,-92.49\"/>\r\n",
364 "<polygon fill=\"black\" stroke=\"black\" points=\"534.76,-95.88 543.95,-90.6 533.47,-89 534.76,-95.88\"/>\r\n",
365 "<text text-anchor=\"middle\" x=\"513.28\" y=\"-102.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
366 "</g>\r\n",
367 "<!-- LR_7&#45;&gt;LR_8 -->\r\n",
368 "<g id=\"edge11\" class=\"edge\">\r\n",
369 "<title>LR_7&#45;&gt;LR_8</title>\r\n",
370 "<path fill=\"none\" stroke=\"black\" d=\"M604.38,-99.37C618.26,-106.67 635.28,-115.67 650.47,-123.85 654.74,-126.14 659.19,-128.56 663.62,-130.98\"/>\r\n",
371 "<polygon fill=\"black\" stroke=\"black\" points=\"662.17,-134.17 672.62,-135.9 665.53,-128.03 662.17,-134.17\"/>\r\n",
372 "<text text-anchor=\"middle\" x=\"637.97\" y=\"-127.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
373 "</g>\r\n",
374 "<!-- LR_7&#45;&gt;LR_5 -->\r\n",
375 "<g id=\"edge12\" class=\"edge\">\r\n",
376 "<title>LR_7&#45;&gt;LR_5</title>\r\n",
377 "<path fill=\"none\" stroke=\"black\" d=\"M545.05,-75.8C531.36,-72.99 515.01,-71.6 500.78,-75.85 495.43,-77.44 490.13,-79.83 485.1,-82.59\"/>\r\n",
378 "<polygon fill=\"black\" stroke=\"black\" points=\"483.11,-79.7 476.38,-87.89 486.75,-85.69 483.11,-79.7\"/>\r\n",
379 "<text text-anchor=\"middle\" x=\"513.28\" y=\"-79.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
380 "</g>\r\n",
381 "</g>\r\n",
382 "</svg>\r\n"
383 ],
384 "text/plain": [
385 "<graphviz.dot.Digraph at 0x1c71cdf0220>"
386 ]
387 },
388 "execution_count": 4,
389 "metadata": {},
390 "output_type": "execute_result"
391 }
392 ],
393 "source": [
394 "# http://www.graphviz.org/content/fsm\n",
395 "\n",
396 "f = graphviz.Digraph('finite_state_machine', filename='fsm.gv')\n",
397 "f.attr(rankdir='LR', size='8,5')\n",
398 "\n",
399 "f.attr('node', shape='doublecircle')\n",
400 "f.node('LR_0')\n",
401 "f.node('LR_3')\n",
402 "f.node('LR_4')\n",
403 "f.node('LR_8')\n",
404 "\n",
405 "f.attr('node', shape='circle')\n",
406 "f.edge('LR_0', 'LR_2', label='SS(B)')\n",
407 "f.edge('LR_0', 'LR_1', label='SS(S)')\n",
408 "f.edge('LR_1', 'LR_3', label='S($end)')\n",
409 "f.edge('LR_2', 'LR_6', label='SS(b)')\n",
410 "f.edge('LR_2', 'LR_5', label='SS(a)')\n",
411 "f.edge('LR_2', 'LR_4', label='S(A)')\n",
412 "f.edge('LR_5', 'LR_7', label='S(b)')\n",
413 "f.edge('LR_5', 'LR_5', label='S(a)')\n",
414 "f.edge('LR_6', 'LR_6', label='S(b)')\n",
415 "f.edge('LR_6', 'LR_5', label='S(a)')\n",
416 "f.edge('LR_7', 'LR_8', label='S(b)')\n",
417 "f.edge('LR_7', 'LR_5', label='S(a)')\n",
418 "f.edge('LR_8', 'LR_6', label='S(b)')\n",
419 "f.edge('LR_8', 'LR_5', label='S(a)')\n",
420 "\n",
421 "f"
422 ]
423 },
424 {
425 "cell_type": "code",
426 "execution_count": 5,
427 "metadata": {},
428 "outputs": [
429 {
430 "name": "stderr",
431 "output_type": "stream",
432 "text": [
433 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
434 ]
435 },
436 {
437 "data": {
438 "image/svg+xml": [
439 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
440 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
441 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
442 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
443 " -->\r\n",
444 "<!-- Title: G Pages: 1 -->\r\n",
445 "<svg width=\"222pt\" height=\"364pt\"\r\n",
446 " viewBox=\"0.00 0.00 222.00 364.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
447 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 360)\">\r\n",
448 "<title>G</title>\r\n",
449 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-360 218,-360 218,4 -4,4\"/>\r\n",
450 "<g id=\"clust1\" class=\"cluster\">\r\n",
451 "<title>cluster0</title>\r\n",
452 "<polygon fill=\"none\" stroke=\"black\" points=\"64,-152 64,-348 206,-348 206,-152 64,-152\"/>\r\n",
453 "</g>\r\n",
454 "<g id=\"clust2\" class=\"cluster\">\r\n",
455 "<title>cluster1</title>\r\n",
456 "<polygon fill=\"none\" stroke=\"black\" points=\"64,-8 64,-132 206,-132 206,-8 64,-8\"/>\r\n",
457 "</g>\r\n",
458 "<!-- a -->\r\n",
459 "<g id=\"node1\" class=\"node\">\r\n",
460 "<title>a</title>\r\n",
461 "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-322\" rx=\"27\" ry=\"18\"/>\r\n",
462 "<text text-anchor=\"middle\" x=\"135\" y=\"-318.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">a</text>\r\n",
463 "</g>\r\n",
464 "<!-- b -->\r\n",
465 "<g id=\"node2\" class=\"node\">\r\n",
466 "<title>b</title>\r\n",
467 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-250\" rx=\"27\" ry=\"18\"/>\r\n",
468 "<text text-anchor=\"middle\" x=\"99\" y=\"-246.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">b</text>\r\n",
469 "</g>\r\n",
470 "<!-- a&#45;&gt;b -->\r\n",
471 "<g id=\"edge1\" class=\"edge\">\r\n",
472 "<title>a&#45;&gt;b</title>\r\n",
473 "<path fill=\"none\" stroke=\"black\" d=\"M126.65,-304.76C122.29,-296.28 116.85,-285.71 111.96,-276.2\"/>\r\n",
474 "<polygon fill=\"black\" stroke=\"black\" points=\"114.99,-274.44 107.3,-267.15 108.77,-277.64 114.99,-274.44\"/>\r\n",
475 "</g>\r\n",
476 "<!-- c -->\r\n",
477 "<g id=\"node3\" class=\"node\">\r\n",
478 "<title>c</title>\r\n",
479 "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-250\" rx=\"27\" ry=\"18\"/>\r\n",
480 "<text text-anchor=\"middle\" x=\"171\" y=\"-246.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">c</text>\r\n",
481 "</g>\r\n",
482 "<!-- a&#45;&gt;c -->\r\n",
483 "<g id=\"edge2\" class=\"edge\">\r\n",
484 "<title>a&#45;&gt;c</title>\r\n",
485 "<path fill=\"none\" stroke=\"black\" d=\"M143.35,-304.76C147.71,-296.28 153.15,-285.71 158.04,-276.2\"/>\r\n",
486 "<polygon fill=\"black\" stroke=\"black\" points=\"161.23,-277.64 162.7,-267.15 155.01,-274.44 161.23,-277.64\"/>\r\n",
487 "</g>\r\n",
488 "<!-- d -->\r\n",
489 "<g id=\"node4\" class=\"node\">\r\n",
490 "<title>d</title>\r\n",
491 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-178\" rx=\"27\" ry=\"18\"/>\r\n",
492 "<text text-anchor=\"middle\" x=\"99\" y=\"-174.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">d</text>\r\n",
493 "</g>\r\n",
494 "<!-- b&#45;&gt;d -->\r\n",
495 "<g id=\"edge3\" class=\"edge\">\r\n",
496 "<title>b&#45;&gt;d</title>\r\n",
497 "<path fill=\"none\" stroke=\"black\" d=\"M99,-231.7C99,-223.98 99,-214.71 99,-206.11\"/>\r\n",
498 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-206.1 99,-196.1 95.5,-206.1 102.5,-206.1\"/>\r\n",
499 "</g>\r\n",
500 "<!-- f -->\r\n",
501 "<g id=\"node7\" class=\"node\">\r\n",
502 "<title>f</title>\r\n",
503 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-34\" rx=\"27\" ry=\"18\"/>\r\n",
504 "<text text-anchor=\"middle\" x=\"99\" y=\"-30.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">f</text>\r\n",
505 "</g>\r\n",
506 "<!-- b&#45;&gt;f -->\r\n",
507 "<g id=\"edge7\" class=\"edge\">\r\n",
508 "<title>b&#45;&gt;f</title>\r\n",
509 "<path fill=\"none\" stroke=\"black\" d=\"M112.75,-234.07C120.96,-224.1 130.62,-210.25 135,-196 142.02,-173.17 145.55,-157.68 145.58,-142.23\"/>\r\n",
510 "<polygon fill=\"black\" stroke=\"black\" points=\"149.07,-141.82 145.1,-132 142.07,-142.15 149.07,-141.82\"/>\r\n",
511 "</g>\r\n",
512 "<!-- c&#45;&gt;d -->\r\n",
513 "<g id=\"edge4\" class=\"edge\">\r\n",
514 "<title>c&#45;&gt;d</title>\r\n",
515 "<path fill=\"none\" stroke=\"black\" d=\"M156.43,-234.83C146.25,-224.94 132.48,-211.55 120.97,-200.36\"/>\r\n",
516 "<polygon fill=\"black\" stroke=\"black\" points=\"123.41,-197.85 113.8,-193.38 118.53,-202.87 123.41,-197.85\"/>\r\n",
517 "</g>\r\n",
518 "<!-- e -->\r\n",
519 "<g id=\"node5\" class=\"node\">\r\n",
520 "<title>e</title>\r\n",
521 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-106\" rx=\"27\" ry=\"18\"/>\r\n",
522 "<text text-anchor=\"middle\" x=\"99\" y=\"-102.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">e</text>\r\n",
523 "</g>\r\n",
524 "<!-- c&#45;&gt;e -->\r\n",
525 "<g id=\"edge10\" class=\"edge\">\r\n",
526 "<title>c&#45;&gt;e</title>\r\n",
527 "<path fill=\"none\" stroke=\"black\" d=\"M135,-152C130.7,-144.41 125.16,-136.77 119.71,-129.99\"/>\r\n",
528 "<polygon fill=\"black\" stroke=\"black\" points=\"122.07,-127.36 112.97,-121.94 116.71,-131.86 122.07,-127.36\"/>\r\n",
529 "</g>\r\n",
530 "<!-- g -->\r\n",
531 "<g id=\"node6\" class=\"node\">\r\n",
532 "<title>g</title>\r\n",
533 "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-34\" rx=\"27\" ry=\"18\"/>\r\n",
534 "<text text-anchor=\"middle\" x=\"171\" y=\"-30.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">g</text>\r\n",
535 "</g>\r\n",
536 "<!-- c&#45;&gt;g -->\r\n",
537 "<g id=\"edge9\" class=\"edge\">\r\n",
538 "<title>c&#45;&gt;g</title>\r\n",
539 "<path fill=\"none\" stroke=\"black\" d=\"M171,-152C171,-148.77 171,-145.53 171,-142.29\"/>\r\n",
540 "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-141.99 171,-132 167.5,-142 174.5,-141.99\"/>\r\n",
541 "</g>\r\n",
542 "<!-- d&#45;&gt;e -->\r\n",
543 "<g id=\"edge8\" class=\"edge\">\r\n",
544 "<title>d&#45;&gt;e</title>\r\n",
545 "<path fill=\"none\" stroke=\"black\" d=\"M99,-159.7C99,-151.98 99,-142.71 99,-134.11\"/>\r\n",
546 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-134.1 99,-124.1 95.5,-134.1 102.5,-134.1\"/>\r\n",
547 "</g>\r\n",
548 "<!-- h -->\r\n",
549 "<g id=\"node8\" class=\"node\">\r\n",
550 "<title>h</title>\r\n",
551 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-106\" rx=\"27\" ry=\"18\"/>\r\n",
552 "<text text-anchor=\"middle\" x=\"27\" y=\"-102.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">h</text>\r\n",
553 "</g>\r\n",
554 "<!-- d&#45;&gt;h -->\r\n",
555 "<g id=\"edge11\" class=\"edge\">\r\n",
556 "<title>d&#45;&gt;h</title>\r\n",
557 "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-162.83C74.25,-152.94 60.48,-139.55 48.97,-128.36\"/>\r\n",
558 "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-125.85 41.8,-121.38 46.53,-130.87 51.41,-125.85\"/>\r\n",
559 "</g>\r\n",
560 "<!-- e&#45;&gt;g -->\r\n",
561 "<g id=\"edge5\" class=\"edge\">\r\n",
562 "<title>e&#45;&gt;g</title>\r\n",
563 "<path fill=\"none\" stroke=\"black\" d=\"M113.57,-90.83C123.75,-80.94 137.52,-67.55 149.03,-56.36\"/>\r\n",
564 "<polygon fill=\"black\" stroke=\"black\" points=\"151.47,-58.87 156.2,-49.38 146.59,-53.85 151.47,-58.87\"/>\r\n",
565 "</g>\r\n",
566 "<!-- e&#45;&gt;f -->\r\n",
567 "<g id=\"edge6\" class=\"edge\">\r\n",
568 "<title>e&#45;&gt;f</title>\r\n",
569 "<path fill=\"none\" stroke=\"black\" d=\"M99,-87.7C99,-79.98 99,-70.71 99,-62.11\"/>\r\n",
570 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-62.1 99,-52.1 95.5,-62.1 102.5,-62.1\"/>\r\n",
571 "</g>\r\n",
572 "</g>\r\n",
573 "</svg>\r\n"
574 ],
575 "text/plain": [
576 "<graphviz.dot.Digraph at 0x1c71cdf19d0>"
577 ]
578 },
579 "execution_count": 5,
580 "metadata": {},
581 "output_type": "execute_result"
582 }
583 ],
584 "source": [
585 "# http://www.graphviz.org/pdf/dotguide.pdf, Figure 20\n",
586 "\n",
587 "g = graphviz.Digraph('G', filename='cluster_edge.gv')\n",
588 "g.attr(compound='true')\n",
589 "\n",
590 "with g.subgraph(name='cluster0') as c:\n",
591 " c.edges(['ab', 'ac', 'bd', 'cd'])\n",
592 "\n",
593 "with g.subgraph(name='cluster1') as c:\n",
594 " c.edges(['eg', 'ef'])\n",
595 "\n",
596 "g.edge('b', 'f', lhead='cluster1')\n",
597 "g.edge('d', 'e')\n",
598 "g.edge('c', 'g', ltail='cluster0', lhead='cluster1')\n",
599 "g.edge('c', 'e', ltail='cluster0')\n",
600 "g.edge('d', 'h')\n",
601 "\n",
602 "g"
603 ]
604 }
605 ],
606 "metadata": {
607 "kernelspec": {
608 "display_name": "Python 3",
609 "language": "python",
610 "name": "python3"
611 },
612 "language_info": {
613 "codemirror_mode": {
614 "name": "ipython",
615 "version": 3
616 },
617 "file_extension": ".py",
618 "mimetype": "text/x-python",
619 "name": "python",
620 "nbconvert_exporter": "python",
621 "pygments_lexer": "ipython3",
622 "version": "3.9.4"
623 }
624 },
625 "nbformat": 4,
626 "nbformat_minor": 1
627 }
0 #!/usr/bin/env python
1 # hello.py - http://www.graphviz.org/content/hello
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/content/hello"""
43
5 g = Digraph('G', filename='hello.gv')
4 import graphviz
5
6 g = graphviz.Digraph('G', filename='hello.gv')
67
78 g.edge('Hello', 'World')
89
33 "cell_type": "code",
44 "execution_count": 1,
55 "metadata": {},
6 "outputs": [],
6 "outputs": [
7 {
8 "data": {
9 "text/plain": [
10 "'0.16'"
11 ]
12 },
13 "execution_count": 1,
14 "metadata": {},
15 "output_type": "execute_result"
16 }
17 ],
718 "source": [
819 "import logging\n",
920 "\n",
10 "logging.basicConfig(format='[%(levelname)s@%(name)s] %(message)s', level=logging.DEBUG)"
21 "import graphviz\n",
22 "\n",
23 "logging.basicConfig(format='[%(levelname)s@%(name)s] %(message)s', level=logging.DEBUG)\n",
24 "\n",
25 "graphviz.__version__"
1126 ]
1227 },
1328 {
1934 "name": "stderr",
2035 "output_type": "stream",
2136 "text": [
22 "[DEBUG@graphviz.backend] run ['dot', '-Tsvg']\n"
37 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
2338 ]
2439 },
2540 {
2843 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
2944 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
3045 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
31 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
46 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
3247 " -->\r\n",
33 "<!-- Title: %3 Pages: 1 -->\r\n",
48 "<!-- Pages: 1 -->\r\n",
3449 "<svg width=\"390pt\" height=\"116pt\"\r\n",
3550 " viewBox=\"0.00 0.00 389.98 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
3651 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\r\n",
37 "<title>%3</title>\r\n",
38 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-112 385.984,-112 385.984,4 -4,4\"/>\r\n",
52 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-112 385.98,-112 385.98,4 -4,4\"/>\r\n",
3953 "<!-- A -->\r\n",
40 "<g id=\"node1\" class=\"node\"><title>A</title>\r\n",
41 "<ellipse fill=\"none\" stroke=\"black\" cx=\"190.992\" cy=\"-90\" rx=\"53.8905\" ry=\"18\"/>\r\n",
42 "<text text-anchor=\"middle\" x=\"190.992\" y=\"-86.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">King Arthur</text>\r\n",
54 "<g id=\"node1\" class=\"node\">\r\n",
55 "<title>A</title>\r\n",
56 "<ellipse fill=\"none\" stroke=\"black\" cx=\"190.99\" cy=\"-90\" rx=\"53.89\" ry=\"18\"/>\r\n",
57 "<text text-anchor=\"middle\" x=\"190.99\" y=\"-86.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">King Arthur</text>\r\n",
4358 "</g>\r\n",
4459 "<!-- B -->\r\n",
45 "<g id=\"node2\" class=\"node\"><title>B</title>\r\n",
46 "<ellipse fill=\"none\" stroke=\"black\" cx=\"90.9919\" cy=\"-18\" rx=\"90.9839\" ry=\"18\"/>\r\n",
47 "<text text-anchor=\"middle\" x=\"90.9919\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Sir Bedevere the Wise</text>\r\n",
60 "<g id=\"node2\" class=\"node\">\r\n",
61 "<title>B</title>\r\n",
62 "<ellipse fill=\"none\" stroke=\"black\" cx=\"90.99\" cy=\"-18\" rx=\"90.98\" ry=\"18\"/>\r\n",
63 "<text text-anchor=\"middle\" x=\"90.99\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Sir Bedevere the Wise</text>\r\n",
4864 "</g>\r\n",
4965 "<!-- A&#45;&gt;B -->\r\n",
50 "<g id=\"edge1\" class=\"edge\"><title>A&#45;&gt;B</title>\r\n",
51 "<path fill=\"none\" stroke=\"black\" d=\"M168.799,-73.4647C155.331,-64.0371 137.916,-51.8466 122.977,-41.3897\"/>\r\n",
52 "<polygon fill=\"black\" stroke=\"black\" points=\"124.716,-38.3345 114.516,-35.4672 120.702,-44.0692 124.716,-38.3345\"/>\r\n",
66 "<g id=\"edge1\" class=\"edge\">\r\n",
67 "<title>A&#45;&gt;B</title>\r\n",
68 "<path fill=\"none\" stroke=\"black\" d=\"M168.8,-73.46C155.33,-64.04 137.92,-51.85 122.98,-41.39\"/>\r\n",
69 "<polygon fill=\"black\" stroke=\"black\" points=\"124.72,-38.33 114.52,-35.47 120.7,-44.07 124.72,-38.33\"/>\r\n",
5370 "</g>\r\n",
5471 "<!-- L -->\r\n",
55 "<g id=\"node3\" class=\"node\"><title>L</title>\r\n",
56 "<ellipse fill=\"none\" stroke=\"black\" cx=\"290.992\" cy=\"-18\" rx=\"90.9839\" ry=\"18\"/>\r\n",
57 "<text text-anchor=\"middle\" x=\"290.992\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Sir Lancelot the Brave</text>\r\n",
72 "<g id=\"node3\" class=\"node\">\r\n",
73 "<title>L</title>\r\n",
74 "<ellipse fill=\"none\" stroke=\"black\" cx=\"290.99\" cy=\"-18\" rx=\"90.98\" ry=\"18\"/>\r\n",
75 "<text text-anchor=\"middle\" x=\"290.99\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Sir Lancelot the Brave</text>\r\n",
5876 "</g>\r\n",
5977 "<!-- A&#45;&gt;L -->\r\n",
60 "<g id=\"edge2\" class=\"edge\"><title>A&#45;&gt;L</title>\r\n",
61 "<path fill=\"none\" stroke=\"black\" d=\"M213.185,-73.4647C226.653,-64.0371 244.068,-51.8466 259.007,-41.3897\"/>\r\n",
62 "<polygon fill=\"black\" stroke=\"black\" points=\"261.282,-44.0692 267.467,-35.4672 257.268,-38.3345 261.282,-44.0692\"/>\r\n",
78 "<g id=\"edge2\" class=\"edge\">\r\n",
79 "<title>A&#45;&gt;L</title>\r\n",
80 "<path fill=\"none\" stroke=\"black\" d=\"M213.19,-73.46C226.65,-64.04 244.07,-51.85 259.01,-41.39\"/>\r\n",
81 "<polygon fill=\"black\" stroke=\"black\" points=\"261.28,-44.07 267.47,-35.47 257.27,-38.33 261.28,-44.07\"/>\r\n",
6382 "</g>\r\n",
6483 "<!-- B&#45;&gt;L -->\r\n",
65 "<g id=\"edge3\" class=\"edge\"><title>B&#45;&gt;L</title>\r\n",
66 "<path fill=\"none\" stroke=\"black\" d=\"M182.008,-18C184.615,-18 187.223,-18 189.83,-18\"/>\r\n",
67 "<polygon fill=\"black\" stroke=\"black\" points=\"189.888,-21.5001 199.888,-18 189.888,-14.5001 189.888,-21.5001\"/>\r\n",
84 "<g id=\"edge3\" class=\"edge\">\r\n",
85 "<title>B&#45;&gt;L</title>\r\n",
86 "<path fill=\"none\" stroke=\"black\" d=\"M182.01,-18C184.62,-18 187.22,-18 189.83,-18\"/>\r\n",
87 "<polygon fill=\"black\" stroke=\"black\" points=\"189.89,-21.5 199.89,-18 189.89,-14.5 189.89,-21.5\"/>\r\n",
6888 "</g>\r\n",
6989 "</g>\r\n",
7090 "</svg>\r\n"
7191 ],
7292 "text/plain": [
73 "<graphviz.dot.Digraph at 0x505fcc8>"
93 "<graphviz.dot.Digraph at 0x1c71cc84970>"
7494 ]
7595 },
7696 "execution_count": 2,
7999 }
80100 ],
81101 "source": [
82 "from graphviz import Digraph\n",
83 "\n",
84 "dot = Digraph(comment='The Round Table')\n",
102 "dot = graphviz.Digraph(comment='The Round Table')\n",
85103 "\n",
86104 "dot.node('A', 'King Arthur')\n",
87105 "dot.node('B', 'Sir Bedevere the Wise')\n",
102120 "name": "stderr",
103121 "output_type": "stream",
104122 "text": [
105 "[DEBUG@graphviz.backend] run ['dot', '-Tsvg']\n"
123 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
106124 ]
107125 },
108126 {
111129 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
112130 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
113131 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
114 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
132 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
115133 " -->\r\n",
116134 "<!-- Title: the holy hand grenade Pages: 1 -->\r\n",
117135 "<svg width=\"332pt\" height=\"44pt\"\r\n",
118136 " viewBox=\"0.00 0.00 332.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
119137 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\r\n",
120138 "<title>the holy hand grenade</title>\r\n",
121 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-40 328,-40 328,4 -4,4\"/>\r\n",
139 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 328,-40 328,4 -4,4\"/>\r\n",
122140 "<!-- 1 -->\r\n",
123 "<g id=\"node1\" class=\"node\"><title>1</title>\r\n",
141 "<g id=\"node1\" class=\"node\">\r\n",
142 "<title>1</title>\r\n",
124143 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
125144 "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">1</text>\r\n",
126145 "</g>\r\n",
127146 "<!-- 2 -->\r\n",
128 "<g id=\"node2\" class=\"node\"><title>2</title>\r\n",
147 "<g id=\"node2\" class=\"node\">\r\n",
148 "<title>2</title>\r\n",
129149 "<ellipse fill=\"none\" stroke=\"black\" cx=\"117\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
130150 "<text text-anchor=\"middle\" x=\"117\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">2</text>\r\n",
131151 "</g>\r\n",
132152 "<!-- 1&#45;&gt;2 -->\r\n",
133 "<g id=\"edge1\" class=\"edge\"><title>1&#45;&gt;2</title>\r\n",
134 "<path fill=\"none\" stroke=\"black\" d=\"M54.4029,-18C62.3932,-18 71.3106,-18 79.8241,-18\"/>\r\n",
135 "<polygon fill=\"black\" stroke=\"black\" points=\"79.919,-21.5001 89.919,-18 79.919,-14.5001 79.919,-21.5001\"/>\r\n",
153 "<g id=\"edge1\" class=\"edge\">\r\n",
154 "<title>1&#45;&gt;2</title>\r\n",
155 "<path fill=\"none\" stroke=\"black\" d=\"M54.4,-18C62.39,-18 71.31,-18 79.82,-18\"/>\r\n",
156 "<polygon fill=\"black\" stroke=\"black\" points=\"79.92,-21.5 89.92,-18 79.92,-14.5 79.92,-21.5\"/>\r\n",
136157 "</g>\r\n",
137158 "<!-- 3 -->\r\n",
138 "<g id=\"node3\" class=\"node\"><title>3</title>\r\n",
159 "<g id=\"node3\" class=\"node\">\r\n",
160 "<title>3</title>\r\n",
139161 "<ellipse fill=\"none\" stroke=\"black\" cx=\"207\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
140162 "<text text-anchor=\"middle\" x=\"207\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">3</text>\r\n",
141163 "</g>\r\n",
142164 "<!-- 2&#45;&gt;3 -->\r\n",
143 "<g id=\"edge2\" class=\"edge\"><title>2&#45;&gt;3</title>\r\n",
144 "<path fill=\"none\" stroke=\"black\" d=\"M144.403,-18C152.393,-18 161.311,-18 169.824,-18\"/>\r\n",
145 "<polygon fill=\"black\" stroke=\"black\" points=\"169.919,-21.5001 179.919,-18 169.919,-14.5001 169.919,-21.5001\"/>\r\n",
165 "<g id=\"edge2\" class=\"edge\">\r\n",
166 "<title>2&#45;&gt;3</title>\r\n",
167 "<path fill=\"none\" stroke=\"black\" d=\"M144.4,-18C152.39,-18 161.31,-18 169.82,-18\"/>\r\n",
168 "<polygon fill=\"black\" stroke=\"black\" points=\"169.92,-21.5 179.92,-18 169.92,-14.5 169.92,-21.5\"/>\r\n",
146169 "</g>\r\n",
147170 "<!-- lob -->\r\n",
148 "<g id=\"node4\" class=\"node\"><title>lob</title>\r\n",
171 "<g id=\"node4\" class=\"node\">\r\n",
172 "<title>lob</title>\r\n",
149173 "<ellipse fill=\"none\" stroke=\"black\" cx=\"297\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
150174 "<text text-anchor=\"middle\" x=\"297\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">lob</text>\r\n",
151175 "</g>\r\n",
152176 "<!-- 3&#45;&gt;lob -->\r\n",
153 "<g id=\"edge3\" class=\"edge\"><title>3&#45;&gt;lob</title>\r\n",
154 "<path fill=\"none\" stroke=\"black\" d=\"M234.403,-18C242.393,-18 251.311,-18 259.824,-18\"/>\r\n",
155 "<polygon fill=\"black\" stroke=\"black\" points=\"259.919,-21.5001 269.919,-18 259.919,-14.5001 259.919,-21.5001\"/>\r\n",
177 "<g id=\"edge3\" class=\"edge\">\r\n",
178 "<title>3&#45;&gt;lob</title>\r\n",
179 "<path fill=\"none\" stroke=\"black\" d=\"M234.4,-18C242.39,-18 251.31,-18 259.82,-18\"/>\r\n",
180 "<polygon fill=\"black\" stroke=\"black\" points=\"259.92,-21.5 269.92,-18 259.92,-14.5 259.92,-21.5\"/>\r\n",
156181 "</g>\r\n",
157182 "</g>\r\n",
158183 "</svg>\r\n"
159184 ],
160185 "text/plain": [
161 "<graphviz.files.Source at 0x505f808>"
186 "<graphviz.files.Source at 0x1c71cde6d60>"
162187 ]
163188 },
164189 "execution_count": 3,
167192 }
168193 ],
169194 "source": [
170 "from graphviz import Source\n",
171 "\n",
172 "src = Source('digraph \"the holy hand grenade\" { rankdir=LR; 1 -> 2 -> 3 -> lob }')\n",
195 "src = graphviz.Source('digraph \"the holy hand grenade\" { rankdir=LR; 1 -> 2 -> 3 -> lob }')\n",
173196 "src"
174197 ]
175198 },
182205 "name": "stderr",
183206 "output_type": "stream",
184207 "text": [
185 "[DEBUG@graphviz.backend] run ['dot', '-Tsvg']\n"
208 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
186209 ]
187210 },
188211 {
191214 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
192215 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
193216 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
194 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
217 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
195218 " -->\r\n",
196219 "<!-- Title: finite_state_machine Pages: 1 -->\r\n",
197220 "<svg width=\"576pt\" height=\"258pt\"\r\n",
198221 " viewBox=\"0.00 0.00 576.00 258.45\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
199 "<g id=\"graph0\" class=\"graph\" transform=\"scale(0.769883 0.769883) rotate(0) translate(4 331.694)\">\r\n",
222 "<g id=\"graph0\" class=\"graph\" transform=\"scale(0.77 0.77) rotate(0) translate(4 331.69)\">\r\n",
200223 "<title>finite_state_machine</title>\r\n",
201 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-331.694 744.166,-331.694 744.166,4 -4,4\"/>\r\n",
224 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-331.69 744.17,-331.69 744.17,4 -4,4\"/>\r\n",
202225 "<!-- LR_0 -->\r\n",
203 "<g id=\"node1\" class=\"node\"><title>LR_0</title>\r\n",
204 "<ellipse fill=\"none\" stroke=\"black\" cx=\"35.8472\" cy=\"-106.847\" rx=\"31.712\" ry=\"31.712\"/>\r\n",
205 "<ellipse fill=\"none\" stroke=\"black\" cx=\"35.8472\" cy=\"-106.847\" rx=\"35.695\" ry=\"35.695\"/>\r\n",
206 "<text text-anchor=\"middle\" x=\"35.8472\" y=\"-103.147\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_0</text>\r\n",
226 "<g id=\"node1\" class=\"node\">\r\n",
227 "<title>LR_0</title>\r\n",
228 "<ellipse fill=\"none\" stroke=\"black\" cx=\"35.85\" cy=\"-83.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
229 "<ellipse fill=\"none\" stroke=\"black\" cx=\"35.85\" cy=\"-83.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
230 "<text text-anchor=\"middle\" x=\"35.85\" y=\"-80.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_0</text>\r\n",
207231 "</g>\r\n",
208232 "<!-- LR_2 -->\r\n",
209 "<g id=\"node5\" class=\"node\"><title>LR_2</title>\r\n",
210 "<ellipse fill=\"none\" stroke=\"black\" cx=\"174.542\" cy=\"-146.847\" rx=\"31.6951\" ry=\"31.6951\"/>\r\n",
211 "<text text-anchor=\"middle\" x=\"174.542\" y=\"-143.147\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_2</text>\r\n",
233 "<g id=\"node5\" class=\"node\">\r\n",
234 "<title>LR_2</title>\r\n",
235 "<ellipse fill=\"none\" stroke=\"black\" cx=\"174.54\" cy=\"-151.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
236 "<text text-anchor=\"middle\" x=\"174.54\" y=\"-148.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_2</text>\r\n",
212237 "</g>\r\n",
213238 "<!-- LR_0&#45;&gt;LR_2 -->\r\n",
214 "<g id=\"edge1\" class=\"edge\"><title>LR_0&#45;&gt;LR_2</title>\r\n",
215 "<path fill=\"none\" stroke=\"black\" d=\"M70.6368,-116.735C89.8449,-122.356 113.995,-129.422 134.071,-135.297\"/>\r\n",
216 "<polygon fill=\"black\" stroke=\"black\" points=\"133.274,-138.711 143.855,-138.16 135.24,-131.992 133.274,-138.711\"/>\r\n",
217 "<text text-anchor=\"middle\" x=\"107.194\" y=\"-135.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(B)</text>\r\n",
239 "<g id=\"edge1\" class=\"edge\">\r\n",
240 "<title>LR_0&#45;&gt;LR_2</title>\r\n",
241 "<path fill=\"none\" stroke=\"black\" d=\"M68.21,-99.45C88.53,-109.56 115.1,-122.77 136.47,-133.4\"/>\r\n",
242 "<polygon fill=\"black\" stroke=\"black\" points=\"135.06,-136.61 145.58,-137.94 138.18,-130.35 135.06,-136.61\"/>\r\n",
243 "<text text-anchor=\"middle\" x=\"107.19\" y=\"-129.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(B)</text>\r\n",
218244 "</g>\r\n",
219245 "<!-- LR_1 -->\r\n",
220 "<g id=\"node6\" class=\"node\"><title>LR_1</title>\r\n",
221 "<ellipse fill=\"none\" stroke=\"black\" cx=\"174.542\" cy=\"-54.8472\" rx=\"31.6951\" ry=\"31.6951\"/>\r\n",
222 "<text text-anchor=\"middle\" x=\"174.542\" y=\"-51.1472\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_1</text>\r\n",
246 "<g id=\"node6\" class=\"node\">\r\n",
247 "<title>LR_1</title>\r\n",
248 "<ellipse fill=\"none\" stroke=\"black\" cx=\"174.54\" cy=\"-42.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
249 "<text text-anchor=\"middle\" x=\"174.54\" y=\"-39.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_1</text>\r\n",
223250 "</g>\r\n",
224251 "<!-- LR_0&#45;&gt;LR_1 -->\r\n",
225 "<g id=\"edge2\" class=\"edge\"><title>LR_0&#45;&gt;LR_1</title>\r\n",
226 "<path fill=\"none\" stroke=\"black\" d=\"M69.5889,-94.3919C89.2263,-86.9216 114.304,-77.3816 134.909,-69.5435\"/>\r\n",
227 "<polygon fill=\"black\" stroke=\"black\" points=\"136.22,-72.7895 144.322,-65.9626 133.731,-66.2469 136.22,-72.7895\"/>\r\n",
228 "<text text-anchor=\"middle\" x=\"107.194\" y=\"-89.6472\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(S)</text>\r\n",
252 "<g id=\"edge2\" class=\"edge\">\r\n",
253 "<title>LR_0&#45;&gt;LR_1</title>\r\n",
254 "<path fill=\"none\" stroke=\"black\" d=\"M70.29,-73.82C89.49,-68.06 113.72,-60.79 133.88,-54.74\"/>\r\n",
255 "<polygon fill=\"black\" stroke=\"black\" points=\"135.13,-58.02 143.7,-51.8 133.12,-51.32 135.13,-58.02\"/>\r\n",
256 "<text text-anchor=\"middle\" x=\"107.19\" y=\"-71.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(S)</text>\r\n",
229257 "</g>\r\n",
230258 "<!-- LR_3 -->\r\n",
231 "<g id=\"node2\" class=\"node\"><title>LR_3</title>\r\n",
232 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.236\" cy=\"-35.8472\" rx=\"31.712\" ry=\"31.712\"/>\r\n",
233 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.236\" cy=\"-35.8472\" rx=\"35.695\" ry=\"35.695\"/>\r\n",
234 "<text text-anchor=\"middle\" x=\"323.236\" y=\"-32.1472\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_3</text>\r\n",
259 "<g id=\"node2\" class=\"node\">\r\n",
260 "<title>LR_3</title>\r\n",
261 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-35.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
262 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-35.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
263 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-32.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_3</text>\r\n",
235264 "</g>\r\n",
236265 "<!-- LR_4 -->\r\n",
237 "<g id=\"node3\" class=\"node\"><title>LR_4</title>\r\n",
238 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.236\" cy=\"-291.847\" rx=\"31.712\" ry=\"31.712\"/>\r\n",
239 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.236\" cy=\"-291.847\" rx=\"35.695\" ry=\"35.695\"/>\r\n",
240 "<text text-anchor=\"middle\" x=\"323.236\" y=\"-288.147\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_4</text>\r\n",
266 "<g id=\"node3\" class=\"node\">\r\n",
267 "<title>LR_4</title>\r\n",
268 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-291.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
269 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-291.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
270 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-288.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_4</text>\r\n",
241271 "</g>\r\n",
242272 "<!-- LR_8 -->\r\n",
243 "<g id=\"node4\" class=\"node\"><title>LR_8</title>\r\n",
244 "<ellipse fill=\"none\" stroke=\"black\" cx=\"704.319\" cy=\"-147.847\" rx=\"31.712\" ry=\"31.712\"/>\r\n",
245 "<ellipse fill=\"none\" stroke=\"black\" cx=\"704.319\" cy=\"-147.847\" rx=\"35.695\" ry=\"35.695\"/>\r\n",
246 "<text text-anchor=\"middle\" x=\"704.319\" y=\"-144.147\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_8</text>\r\n",
273 "<g id=\"node4\" class=\"node\">\r\n",
274 "<title>LR_8</title>\r\n",
275 "<ellipse fill=\"none\" stroke=\"black\" cx=\"704.32\" cy=\"-152.85\" rx=\"31.71\" ry=\"31.71\"/>\r\n",
276 "<ellipse fill=\"none\" stroke=\"black\" cx=\"704.32\" cy=\"-152.85\" rx=\"35.69\" ry=\"35.69\"/>\r\n",
277 "<text text-anchor=\"middle\" x=\"704.32\" y=\"-149.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_8</text>\r\n",
247278 "</g>\r\n",
248279 "<!-- LR_6 -->\r\n",
249 "<g id=\"node7\" class=\"node\"><title>LR_6</title>\r\n",
250 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.236\" cy=\"-172.847\" rx=\"31.6951\" ry=\"31.6951\"/>\r\n",
251 "<text text-anchor=\"middle\" x=\"323.236\" y=\"-169.147\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_6</text>\r\n",
280 "<g id=\"node7\" class=\"node\">\r\n",
281 "<title>LR_6</title>\r\n",
282 "<ellipse fill=\"none\" stroke=\"black\" cx=\"323.24\" cy=\"-172.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
283 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-169.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_6</text>\r\n",
252284 "</g>\r\n",
253285 "<!-- LR_8&#45;&gt;LR_6 -->\r\n",
254 "<g id=\"edge13\" class=\"edge\"><title>LR_8&#45;&gt;LR_6</title>\r\n",
255 "<path fill=\"none\" stroke=\"black\" d=\"M669.127,-154.782C625.934,-163.158 549.217,-176.756 482.777,-181.847 454.552,-184.01 447.36,-183.186 419.083,-181.847 401.296,-181.005 381.696,-179.28 364.953,-177.563\"/>\r\n",
256 "<polygon fill=\"black\" stroke=\"black\" points=\"365.251,-174.075 354.939,-176.503 364.515,-181.036 365.251,-174.075\"/>\r\n",
257 "<text text-anchor=\"middle\" x=\"513.277\" y=\"-184.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
286 "<g id=\"edge13\" class=\"edge\">\r\n",
287 "<title>LR_8&#45;&gt;LR_6</title>\r\n",
288 "<path fill=\"none\" stroke=\"black\" d=\"M668.7,-158.83C625.38,-165.98 548.87,-177.52 482.78,-181.85 454.53,-183.7 447.36,-183.19 419.08,-181.85 401.3,-181.01 381.7,-179.28 364.95,-177.56\"/>\r\n",
289 "<polygon fill=\"black\" stroke=\"black\" points=\"365.25,-174.07 354.94,-176.5 364.51,-181.04 365.25,-174.07\"/>\r\n",
290 "<text text-anchor=\"middle\" x=\"513.28\" y=\"-183.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
258291 "</g>\r\n",
259292 "<!-- LR_5 -->\r\n",
260 "<g id=\"node8\" class=\"node\"><title>LR_5</title>\r\n",
261 "<ellipse fill=\"none\" stroke=\"black\" cx=\"450.93\" cy=\"-107.847\" rx=\"31.6951\" ry=\"31.6951\"/>\r\n",
262 "<text text-anchor=\"middle\" x=\"450.93\" y=\"-104.147\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_5</text>\r\n",
293 "<g id=\"node8\" class=\"node\">\r\n",
294 "<title>LR_5</title>\r\n",
295 "<ellipse fill=\"none\" stroke=\"black\" cx=\"450.93\" cy=\"-107.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
296 "<text text-anchor=\"middle\" x=\"450.93\" y=\"-104.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_5</text>\r\n",
263297 "</g>\r\n",
264298 "<!-- LR_8&#45;&gt;LR_5 -->\r\n",
265 "<g id=\"edge14\" class=\"edge\"><title>LR_8&#45;&gt;LR_5</title>\r\n",
266 "<path fill=\"none\" stroke=\"black\" d=\"M668.545,-142.414C628.191,-136.095 559.65,-125.319 500.777,-115.847 498.086,-115.414 495.312,-114.966 492.517,-114.512\"/>\r\n",
267 "<polygon fill=\"black\" stroke=\"black\" points=\"492.845,-111.02 482.413,-112.867 491.72,-117.929 492.845,-111.02\"/>\r\n",
268 "<text text-anchor=\"middle\" x=\"575.625\" y=\"-137.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
299 "<g id=\"edge14\" class=\"edge\">\r\n",
300 "<title>LR_8&#45;&gt;LR_5</title>\r\n",
301 "<path fill=\"none\" stroke=\"black\" d=\"M668.83,-147.36C628.46,-140.82 559.62,-129.34 500.78,-117.85 497.99,-117.3 495.11,-116.73 492.22,-116.15\"/>\r\n",
302 "<polygon fill=\"black\" stroke=\"black\" points=\"492.89,-112.72 482.4,-114.17 491.51,-119.58 492.89,-112.72\"/>\r\n",
303 "<text text-anchor=\"middle\" x=\"575.62\" y=\"-139.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
269304 "</g>\r\n",
270305 "<!-- LR_2&#45;&gt;LR_4 -->\r\n",
271 "<g id=\"edge6\" class=\"edge\"><title>LR_2&#45;&gt;LR_4</title>\r\n",
272 "<path fill=\"none\" stroke=\"black\" d=\"M197.821,-168.87C222.322,-193.087 261.915,-232.223 289.846,-259.831\"/>\r\n",
273 "<polygon fill=\"black\" stroke=\"black\" points=\"287.463,-262.397 297.035,-266.938 292.384,-257.418 287.463,-262.397\"/>\r\n",
274 "<text text-anchor=\"middle\" x=\"246.889\" y=\"-239.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(A)</text>\r\n",
306 "<g id=\"edge6\" class=\"edge\">\r\n",
307 "<title>LR_2&#45;&gt;LR_4</title>\r\n",
308 "<path fill=\"none\" stroke=\"black\" d=\"M198.14,-173.42C222.46,-196.62 261.37,-233.76 289.13,-260.26\"/>\r\n",
309 "<polygon fill=\"black\" stroke=\"black\" points=\"287,-263.06 296.65,-267.43 291.83,-257.99 287,-263.06\"/>\r\n",
310 "<text text-anchor=\"middle\" x=\"246.89\" y=\"-241.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(A)</text>\r\n",
275311 "</g>\r\n",
276312 "<!-- LR_2&#45;&gt;LR_6 -->\r\n",
277 "<g id=\"edge4\" class=\"edge\"><title>LR_2&#45;&gt;LR_6</title>\r\n",
278 "<path fill=\"none\" stroke=\"black\" d=\"M205.937,-152.234C227.893,-156.126 257.777,-161.422 281.754,-165.672\"/>\r\n",
279 "<polygon fill=\"black\" stroke=\"black\" points=\"281.17,-169.123 291.628,-167.422 282.392,-162.231 281.17,-169.123\"/>\r\n",
280 "<text text-anchor=\"middle\" x=\"246.889\" y=\"-167.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(b)</text>\r\n",
313 "<g id=\"edge4\" class=\"edge\">\r\n",
314 "<title>LR_2&#45;&gt;LR_6</title>\r\n",
315 "<path fill=\"none\" stroke=\"black\" d=\"M206.29,-156.25C228.1,-159.37 257.6,-163.59 281.38,-167\"/>\r\n",
316 "<polygon fill=\"black\" stroke=\"black\" points=\"281.13,-170.5 291.52,-168.45 282.12,-163.57 281.13,-170.5\"/>\r\n",
317 "<text text-anchor=\"middle\" x=\"246.89\" y=\"-167.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(b)</text>\r\n",
281318 "</g>\r\n",
282319 "<!-- LR_2&#45;&gt;LR_5 -->\r\n",
283 "<g id=\"edge5\" class=\"edge\"><title>LR_2&#45;&gt;LR_5</title>\r\n",
284 "<path fill=\"none\" stroke=\"black\" d=\"M205.087,-137.127C227.428,-130.219 259.001,-121.39 287.389,-116.847 328.309,-110.299 375.679,-108.299 408.684,-107.786\"/>\r\n",
285 "<polygon fill=\"black\" stroke=\"black\" points=\"408.911,-111.284 418.87,-107.668 408.829,-104.284 408.911,-111.284\"/>\r\n",
286 "<text text-anchor=\"middle\" x=\"323.236\" y=\"-120.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(a)</text>\r\n",
320 "<g id=\"edge5\" class=\"edge\">\r\n",
321 "<title>LR_2&#45;&gt;LR_5</title>\r\n",
322 "<path fill=\"none\" stroke=\"black\" d=\"M204.48,-140.61C226.77,-132.49 258.56,-122.07 287.39,-116.85 328.17,-109.46 375.56,-107.58 408.61,-107.32\"/>\r\n",
323 "<polygon fill=\"black\" stroke=\"black\" points=\"408.82,-110.82 418.81,-107.29 408.8,-103.82 408.82,-110.82\"/>\r\n",
324 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-120.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">SS(a)</text>\r\n",
287325 "</g>\r\n",
288326 "<!-- LR_1&#45;&gt;LR_3 -->\r\n",
289 "<g id=\"edge3\" class=\"edge\"><title>LR_1&#45;&gt;LR_3</title>\r\n",
290 "<path fill=\"none\" stroke=\"black\" d=\"M206.293,-50.8642C226.839,-48.2031 254.208,-44.6582 277.196,-41.6808\"/>\r\n",
291 "<polygon fill=\"black\" stroke=\"black\" points=\"277.941,-45.1136 287.409,-40.358 277.042,-38.1716 277.941,-45.1136\"/>\r\n",
292 "<text text-anchor=\"middle\" x=\"246.889\" y=\"-52.6472\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S($end)</text>\r\n",
327 "<g id=\"edge3\" class=\"edge\">\r\n",
328 "<title>LR_1&#45;&gt;LR_3</title>\r\n",
329 "<path fill=\"none\" stroke=\"black\" d=\"M206.65,-41.36C227.15,-40.38 254.31,-39.09 277.16,-38\"/>\r\n",
330 "<polygon fill=\"black\" stroke=\"black\" points=\"277.49,-41.49 287.31,-37.51 277.16,-34.49 277.49,-41.49\"/>\r\n",
331 "<text text-anchor=\"middle\" x=\"246.89\" y=\"-44.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S($end)</text>\r\n",
293332 "</g>\r\n",
294333 "<!-- LR_6&#45;&gt;LR_6 -->\r\n",
295 "<g id=\"edge9\" class=\"edge\"><title>LR_6&#45;&gt;LR_6</title>\r\n",
296 "<path fill=\"none\" stroke=\"black\" d=\"M311.262,-202.528C310.87,-213.589 314.861,-222.694 323.236,-222.694 328.863,-222.694 332.511,-218.584 334.18,-212.532\"/>\r\n",
297 "<polygon fill=\"black\" stroke=\"black\" points=\"337.667,-212.834 335.21,-202.528 330.704,-212.117 337.667,-212.834\"/>\r\n",
298 "<text text-anchor=\"middle\" x=\"323.236\" y=\"-226.494\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
334 "<g id=\"edge9\" class=\"edge\">\r\n",
335 "<title>LR_6&#45;&gt;LR_6</title>\r\n",
336 "<path fill=\"none\" stroke=\"black\" d=\"M311.26,-202.53C310.87,-213.59 314.86,-222.69 323.24,-222.69 328.86,-222.69 332.51,-218.58 334.18,-212.53\"/>\r\n",
337 "<polygon fill=\"black\" stroke=\"black\" points=\"337.67,-212.83 335.21,-202.53 330.7,-212.12 337.67,-212.83\"/>\r\n",
338 "<text text-anchor=\"middle\" x=\"323.24\" y=\"-226.49\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
299339 "</g>\r\n",
300340 "<!-- LR_6&#45;&gt;LR_5 -->\r\n",
301 "<g id=\"edge10\" class=\"edge\"><title>LR_6&#45;&gt;LR_5</title>\r\n",
302 "<path fill=\"none\" stroke=\"black\" d=\"M351.82,-158.583C369.912,-149.227 393.768,-136.89 413.426,-126.724\"/>\r\n",
303 "<polygon fill=\"black\" stroke=\"black\" points=\"415.136,-129.781 422.41,-122.078 411.92,-123.563 415.136,-129.781\"/>\r\n",
304 "<text text-anchor=\"middle\" x=\"389.083\" y=\"-148.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
341 "<g id=\"edge10\" class=\"edge\">\r\n",
342 "<title>LR_6&#45;&gt;LR_5</title>\r\n",
343 "<path fill=\"none\" stroke=\"black\" d=\"M351.82,-158.58C369.91,-149.23 393.77,-136.89 413.43,-126.72\"/>\r\n",
344 "<polygon fill=\"black\" stroke=\"black\" points=\"415.14,-129.78 422.41,-122.08 411.92,-123.56 415.14,-129.78\"/>\r\n",
345 "<text text-anchor=\"middle\" x=\"389.08\" y=\"-147.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
305346 "</g>\r\n",
306347 "<!-- LR_5&#45;&gt;LR_5 -->\r\n",
307 "<g id=\"edge8\" class=\"edge\"><title>LR_5&#45;&gt;LR_5</title>\r\n",
308 "<path fill=\"none\" stroke=\"black\" d=\"M439.691,-138.022C439.45,-148.859 443.196,-157.694 450.93,-157.694 456.006,-157.694 459.364,-153.889 461.005,-148.211\"/>\r\n",
309 "<polygon fill=\"black\" stroke=\"black\" points=\"464.511,-148.355 462.169,-138.022 457.556,-147.56 464.511,-148.355\"/>\r\n",
310 "<text text-anchor=\"middle\" x=\"450.93\" y=\"-161.494\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
348 "<g id=\"edge8\" class=\"edge\">\r\n",
349 "<title>LR_5&#45;&gt;LR_5</title>\r\n",
350 "<path fill=\"none\" stroke=\"black\" d=\"M439.69,-138.02C439.45,-148.86 443.2,-157.69 450.93,-157.69 456.01,-157.69 459.36,-153.89 461,-148.21\"/>\r\n",
351 "<polygon fill=\"black\" stroke=\"black\" points=\"464.51,-148.35 462.17,-138.02 457.56,-147.56 464.51,-148.35\"/>\r\n",
352 "<text text-anchor=\"middle\" x=\"450.93\" y=\"-161.49\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
311353 "</g>\r\n",
312354 "<!-- LR_7 -->\r\n",
313 "<g id=\"node9\" class=\"node\"><title>LR_7</title>\r\n",
314 "<ellipse fill=\"none\" stroke=\"black\" cx=\"575.625\" cy=\"-79.8472\" rx=\"31.6951\" ry=\"31.6951\"/>\r\n",
315 "<text text-anchor=\"middle\" x=\"575.625\" y=\"-76.1472\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_7</text>\r\n",
355 "<g id=\"node9\" class=\"node\">\r\n",
356 "<title>LR_7</title>\r\n",
357 "<ellipse fill=\"none\" stroke=\"black\" cx=\"575.62\" cy=\"-84.85\" rx=\"31.7\" ry=\"31.7\"/>\r\n",
358 "<text text-anchor=\"middle\" x=\"575.62\" y=\"-81.15\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">LR_7</text>\r\n",
316359 "</g>\r\n",
317360 "<!-- LR_5&#45;&gt;LR_7 -->\r\n",
318 "<g id=\"edge7\" class=\"edge\"><title>LR_5&#45;&gt;LR_7</title>\r\n",
319 "<path fill=\"none\" stroke=\"black\" d=\"M482.259,-100.926C497.891,-97.3585 517.169,-92.959 534.063,-89.1037\"/>\r\n",
320 "<polygon fill=\"black\" stroke=\"black\" points=\"535.249,-92.4232 544.219,-86.7859 533.691,-85.5986 535.249,-92.4232\"/>\r\n",
321 "<text text-anchor=\"middle\" x=\"513.277\" y=\"-100.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
361 "<g id=\"edge7\" class=\"edge\">\r\n",
362 "<title>LR_5&#45;&gt;LR_7</title>\r\n",
363 "<path fill=\"none\" stroke=\"black\" d=\"M482.57,-102.1C498.09,-99.19 517.14,-95.62 533.88,-92.49\"/>\r\n",
364 "<polygon fill=\"black\" stroke=\"black\" points=\"534.76,-95.88 543.95,-90.6 533.47,-89 534.76,-95.88\"/>\r\n",
365 "<text text-anchor=\"middle\" x=\"513.28\" y=\"-102.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
322366 "</g>\r\n",
323367 "<!-- LR_7&#45;&gt;LR_8 -->\r\n",
324 "<g id=\"edge11\" class=\"edge\"><title>LR_7&#45;&gt;LR_8</title>\r\n",
325 "<path fill=\"none\" stroke=\"black\" d=\"M604.384,-94.3732C618.255,-101.666 635.28,-110.668 650.472,-118.847 654.739,-121.145 659.192,-123.56 663.624,-125.976\"/>\r\n",
326 "<polygon fill=\"black\" stroke=\"black\" points=\"662.172,-129.17 672.625,-130.896 665.529,-123.028 662.172,-129.17\"/>\r\n",
327 "<text text-anchor=\"middle\" x=\"637.972\" y=\"-122.647\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
368 "<g id=\"edge11\" class=\"edge\">\r\n",
369 "<title>LR_7&#45;&gt;LR_8</title>\r\n",
370 "<path fill=\"none\" stroke=\"black\" d=\"M604.38,-99.37C618.26,-106.67 635.28,-115.67 650.47,-123.85 654.74,-126.14 659.19,-128.56 663.62,-130.98\"/>\r\n",
371 "<polygon fill=\"black\" stroke=\"black\" points=\"662.17,-134.17 672.62,-135.9 665.53,-128.03 662.17,-134.17\"/>\r\n",
372 "<text text-anchor=\"middle\" x=\"637.97\" y=\"-127.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(b)</text>\r\n",
328373 "</g>\r\n",
329374 "<!-- LR_7&#45;&gt;LR_5 -->\r\n",
330 "<g id=\"edge12\" class=\"edge\"><title>LR_7&#45;&gt;LR_5</title>\r\n",
331 "<path fill=\"none\" stroke=\"black\" d=\"M544.569,-71.6302C530.928,-69.2535 514.755,-68.3565 500.777,-72.8472 494.781,-74.7738 488.895,-77.7384 483.403,-81.1443\"/>\r\n",
332 "<polygon fill=\"black\" stroke=\"black\" points=\"481.431,-78.2524 475.135,-86.7737 485.371,-84.0385 481.431,-78.2524\"/>\r\n",
333 "<text text-anchor=\"middle\" x=\"513.277\" y=\"-76.6472\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
375 "<g id=\"edge12\" class=\"edge\">\r\n",
376 "<title>LR_7&#45;&gt;LR_5</title>\r\n",
377 "<path fill=\"none\" stroke=\"black\" d=\"M545.05,-75.8C531.36,-72.99 515.01,-71.6 500.78,-75.85 495.43,-77.44 490.13,-79.83 485.1,-82.59\"/>\r\n",
378 "<polygon fill=\"black\" stroke=\"black\" points=\"483.11,-79.7 476.38,-87.89 486.75,-85.69 483.11,-79.7\"/>\r\n",
379 "<text text-anchor=\"middle\" x=\"513.28\" y=\"-79.65\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">S(a)</text>\r\n",
334380 "</g>\r\n",
335381 "</g>\r\n",
336382 "</svg>\r\n"
337383 ],
338384 "text/plain": [
339 "<graphviz.dot.Digraph at 0x5090888>"
385 "<graphviz.dot.Digraph at 0x1c71cdf0220>"
340386 ]
341387 },
342388 "execution_count": 4,
347393 "source": [
348394 "# http://www.graphviz.org/content/fsm\n",
349395 "\n",
350 "from graphviz import Digraph\n",
351 "\n",
352 "f = Digraph('finite_state_machine', filename='fsm.gv')\n",
396 "f = graphviz.Digraph('finite_state_machine', filename='fsm.gv')\n",
353397 "f.attr(rankdir='LR', size='8,5')\n",
354398 "\n",
355399 "f.attr('node', shape='doublecircle')\n",
386430 "name": "stderr",
387431 "output_type": "stream",
388432 "text": [
389 "[DEBUG@graphviz.backend] run ['dot', '-Tsvg']\n"
433 "[DEBUG@graphviz.backend] run ['dot', '-Kdot', '-Tsvg']\n"
390434 ]
391435 },
392436 {
395439 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
396440 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
397441 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
398 "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
442 "<!-- Generated by graphviz version 2.46.1 (20210213.1702)\r\n",
399443 " -->\r\n",
400444 "<!-- Title: G Pages: 1 -->\r\n",
401445 "<svg width=\"222pt\" height=\"364pt\"\r\n",
402446 " viewBox=\"0.00 0.00 222.00 364.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
403447 "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 360)\">\r\n",
404448 "<title>G</title>\r\n",
405 "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-360 218,-360 218,4 -4,4\"/>\r\n",
406 "<g id=\"clust1\" class=\"cluster\"><title>cluster0</title>\r\n",
449 "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-360 218,-360 218,4 -4,4\"/>\r\n",
450 "<g id=\"clust1\" class=\"cluster\">\r\n",
451 "<title>cluster0</title>\r\n",
407452 "<polygon fill=\"none\" stroke=\"black\" points=\"64,-152 64,-348 206,-348 206,-152 64,-152\"/>\r\n",
408453 "</g>\r\n",
409 "<g id=\"clust2\" class=\"cluster\"><title>cluster1</title>\r\n",
454 "<g id=\"clust2\" class=\"cluster\">\r\n",
455 "<title>cluster1</title>\r\n",
410456 "<polygon fill=\"none\" stroke=\"black\" points=\"64,-8 64,-132 206,-132 206,-8 64,-8\"/>\r\n",
411457 "</g>\r\n",
412458 "<!-- a -->\r\n",
413 "<g id=\"node1\" class=\"node\"><title>a</title>\r\n",
459 "<g id=\"node1\" class=\"node\">\r\n",
460 "<title>a</title>\r\n",
414461 "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-322\" rx=\"27\" ry=\"18\"/>\r\n",
415462 "<text text-anchor=\"middle\" x=\"135\" y=\"-318.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">a</text>\r\n",
416463 "</g>\r\n",
417464 "<!-- b -->\r\n",
418 "<g id=\"node2\" class=\"node\"><title>b</title>\r\n",
465 "<g id=\"node2\" class=\"node\">\r\n",
466 "<title>b</title>\r\n",
419467 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-250\" rx=\"27\" ry=\"18\"/>\r\n",
420468 "<text text-anchor=\"middle\" x=\"99\" y=\"-246.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">b</text>\r\n",
421469 "</g>\r\n",
422470 "<!-- a&#45;&gt;b -->\r\n",
423 "<g id=\"edge1\" class=\"edge\"><title>a&#45;&gt;b</title>\r\n",
424 "<path fill=\"none\" stroke=\"black\" d=\"M126.65,-304.765C122.288,-296.283 116.853,-285.714 111.959,-276.197\"/>\r\n",
425 "<polygon fill=\"black\" stroke=\"black\" points=\"114.99,-274.439 107.304,-267.147 108.765,-277.641 114.99,-274.439\"/>\r\n",
471 "<g id=\"edge1\" class=\"edge\">\r\n",
472 "<title>a&#45;&gt;b</title>\r\n",
473 "<path fill=\"none\" stroke=\"black\" d=\"M126.65,-304.76C122.29,-296.28 116.85,-285.71 111.96,-276.2\"/>\r\n",
474 "<polygon fill=\"black\" stroke=\"black\" points=\"114.99,-274.44 107.3,-267.15 108.77,-277.64 114.99,-274.44\"/>\r\n",
426475 "</g>\r\n",
427476 "<!-- c -->\r\n",
428 "<g id=\"node3\" class=\"node\"><title>c</title>\r\n",
477 "<g id=\"node3\" class=\"node\">\r\n",
478 "<title>c</title>\r\n",
429479 "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-250\" rx=\"27\" ry=\"18\"/>\r\n",
430480 "<text text-anchor=\"middle\" x=\"171\" y=\"-246.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">c</text>\r\n",
431481 "</g>\r\n",
432482 "<!-- a&#45;&gt;c -->\r\n",
433 "<g id=\"edge2\" class=\"edge\"><title>a&#45;&gt;c</title>\r\n",
434 "<path fill=\"none\" stroke=\"black\" d=\"M143.35,-304.765C147.712,-296.283 153.147,-285.714 158.041,-276.197\"/>\r\n",
435 "<polygon fill=\"black\" stroke=\"black\" points=\"161.235,-277.641 162.696,-267.147 155.01,-274.439 161.235,-277.641\"/>\r\n",
483 "<g id=\"edge2\" class=\"edge\">\r\n",
484 "<title>a&#45;&gt;c</title>\r\n",
485 "<path fill=\"none\" stroke=\"black\" d=\"M143.35,-304.76C147.71,-296.28 153.15,-285.71 158.04,-276.2\"/>\r\n",
486 "<polygon fill=\"black\" stroke=\"black\" points=\"161.23,-277.64 162.7,-267.15 155.01,-274.44 161.23,-277.64\"/>\r\n",
436487 "</g>\r\n",
437488 "<!-- d -->\r\n",
438 "<g id=\"node4\" class=\"node\"><title>d</title>\r\n",
489 "<g id=\"node4\" class=\"node\">\r\n",
490 "<title>d</title>\r\n",
439491 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-178\" rx=\"27\" ry=\"18\"/>\r\n",
440492 "<text text-anchor=\"middle\" x=\"99\" y=\"-174.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">d</text>\r\n",
441493 "</g>\r\n",
442494 "<!-- b&#45;&gt;d -->\r\n",
443 "<g id=\"edge3\" class=\"edge\"><title>b&#45;&gt;d</title>\r\n",
444 "<path fill=\"none\" stroke=\"black\" d=\"M99,-231.697C99,-223.983 99,-214.712 99,-206.112\"/>\r\n",
445 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-206.104 99,-196.104 95.5001,-206.104 102.5,-206.104\"/>\r\n",
495 "<g id=\"edge3\" class=\"edge\">\r\n",
496 "<title>b&#45;&gt;d</title>\r\n",
497 "<path fill=\"none\" stroke=\"black\" d=\"M99,-231.7C99,-223.98 99,-214.71 99,-206.11\"/>\r\n",
498 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-206.1 99,-196.1 95.5,-206.1 102.5,-206.1\"/>\r\n",
446499 "</g>\r\n",
447500 "<!-- f -->\r\n",
448 "<g id=\"node7\" class=\"node\"><title>f</title>\r\n",
501 "<g id=\"node7\" class=\"node\">\r\n",
502 "<title>f</title>\r\n",
449503 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-34\" rx=\"27\" ry=\"18\"/>\r\n",
450504 "<text text-anchor=\"middle\" x=\"99\" y=\"-30.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">f</text>\r\n",
451505 "</g>\r\n",
452506 "<!-- b&#45;&gt;f -->\r\n",
453 "<g id=\"edge7\" class=\"edge\"><title>b&#45;&gt;f</title>\r\n",
454 "<path fill=\"none\" stroke=\"black\" d=\"M112.75,-234.069C120.961,-224.1 130.619,-210.247 135,-196 142.052,-173.066 145.58,-157.538 145.581,-142.011\"/>\r\n",
455 "<polygon fill=\"black\" stroke=\"black\" points=\"149.063,-141.547 145.075,-131.731 142.071,-141.891 149.063,-141.547\"/>\r\n",
507 "<g id=\"edge7\" class=\"edge\">\r\n",
508 "<title>b&#45;&gt;f</title>\r\n",
509 "<path fill=\"none\" stroke=\"black\" d=\"M112.75,-234.07C120.96,-224.1 130.62,-210.25 135,-196 142.02,-173.17 145.55,-157.68 145.58,-142.23\"/>\r\n",
510 "<polygon fill=\"black\" stroke=\"black\" points=\"149.07,-141.82 145.1,-132 142.07,-142.15 149.07,-141.82\"/>\r\n",
456511 "</g>\r\n",
457512 "<!-- c&#45;&gt;d -->\r\n",
458 "<g id=\"edge4\" class=\"edge\"><title>c&#45;&gt;d</title>\r\n",
459 "<path fill=\"none\" stroke=\"black\" d=\"M156.43,-234.834C146.25,-224.938 132.476,-211.546 120.969,-200.359\"/>\r\n",
460 "<polygon fill=\"black\" stroke=\"black\" points=\"123.405,-197.846 113.796,-193.385 118.526,-202.865 123.405,-197.846\"/>\r\n",
513 "<g id=\"edge4\" class=\"edge\">\r\n",
514 "<title>c&#45;&gt;d</title>\r\n",
515 "<path fill=\"none\" stroke=\"black\" d=\"M156.43,-234.83C146.25,-224.94 132.48,-211.55 120.97,-200.36\"/>\r\n",
516 "<polygon fill=\"black\" stroke=\"black\" points=\"123.41,-197.85 113.8,-193.38 118.53,-202.87 123.41,-197.85\"/>\r\n",
461517 "</g>\r\n",
462518 "<!-- e -->\r\n",
463 "<g id=\"node5\" class=\"node\"><title>e</title>\r\n",
519 "<g id=\"node5\" class=\"node\">\r\n",
520 "<title>e</title>\r\n",
464521 "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-106\" rx=\"27\" ry=\"18\"/>\r\n",
465522 "<text text-anchor=\"middle\" x=\"99\" y=\"-102.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">e</text>\r\n",
466523 "</g>\r\n",
467524 "<!-- c&#45;&gt;e -->\r\n",
468 "<g id=\"edge10\" class=\"edge\"><title>c&#45;&gt;e</title>\r\n",
469 "<path fill=\"none\" stroke=\"black\" d=\"M135,-152C130.703,-144.409 125.157,-136.769 119.712,-129.993\"/>\r\n",
470 "<polygon fill=\"black\" stroke=\"black\" points=\"122.073,-127.362 112.969,-121.943 116.707,-131.857 122.073,-127.362\"/>\r\n",
525 "<g id=\"edge10\" class=\"edge\">\r\n",
526 "<title>c&#45;&gt;e</title>\r\n",
527 "<path fill=\"none\" stroke=\"black\" d=\"M135,-152C130.7,-144.41 125.16,-136.77 119.71,-129.99\"/>\r\n",
528 "<polygon fill=\"black\" stroke=\"black\" points=\"122.07,-127.36 112.97,-121.94 116.71,-131.86 122.07,-127.36\"/>\r\n",
471529 "</g>\r\n",
472530 "<!-- g -->\r\n",
473 "<g id=\"node6\" class=\"node\"><title>g</title>\r\n",
531 "<g id=\"node6\" class=\"node\">\r\n",
532 "<title>g</title>\r\n",
474533 "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-34\" rx=\"27\" ry=\"18\"/>\r\n",
475534 "<text text-anchor=\"middle\" x=\"171\" y=\"-30.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">g</text>\r\n",
476535 "</g>\r\n",
477536 "<!-- c&#45;&gt;g -->\r\n",
478 "<g id=\"edge9\" class=\"edge\"><title>c&#45;&gt;g</title>\r\n",
479 "<path fill=\"none\" stroke=\"black\" d=\"M171,-152.011C171,-148.759 171,-145.494 171,-142.23\"/>\r\n",
480 "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-141.93 171,-131.93 167.5,-141.93 174.5,-141.93\"/>\r\n",
537 "<g id=\"edge9\" class=\"edge\">\r\n",
538 "<title>c&#45;&gt;g</title>\r\n",
539 "<path fill=\"none\" stroke=\"black\" d=\"M171,-152C171,-148.77 171,-145.53 171,-142.29\"/>\r\n",
540 "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-141.99 171,-132 167.5,-142 174.5,-141.99\"/>\r\n",
481541 "</g>\r\n",
482542 "<!-- d&#45;&gt;e -->\r\n",
483 "<g id=\"edge8\" class=\"edge\"><title>d&#45;&gt;e</title>\r\n",
484 "<path fill=\"none\" stroke=\"black\" d=\"M99,-159.697C99,-151.983 99,-142.712 99,-134.112\"/>\r\n",
485 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-134.104 99,-124.104 95.5001,-134.104 102.5,-134.104\"/>\r\n",
543 "<g id=\"edge8\" class=\"edge\">\r\n",
544 "<title>d&#45;&gt;e</title>\r\n",
545 "<path fill=\"none\" stroke=\"black\" d=\"M99,-159.7C99,-151.98 99,-142.71 99,-134.11\"/>\r\n",
546 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-134.1 99,-124.1 95.5,-134.1 102.5,-134.1\"/>\r\n",
486547 "</g>\r\n",
487548 "<!-- h -->\r\n",
488 "<g id=\"node8\" class=\"node\"><title>h</title>\r\n",
549 "<g id=\"node8\" class=\"node\">\r\n",
550 "<title>h</title>\r\n",
489551 "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-106\" rx=\"27\" ry=\"18\"/>\r\n",
490552 "<text text-anchor=\"middle\" x=\"27\" y=\"-102.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">h</text>\r\n",
491553 "</g>\r\n",
492554 "<!-- d&#45;&gt;h -->\r\n",
493 "<g id=\"edge11\" class=\"edge\"><title>d&#45;&gt;h</title>\r\n",
494 "<path fill=\"none\" stroke=\"black\" d=\"M84.4297,-162.834C74.2501,-152.938 60.4761,-139.546 48.9694,-128.359\"/>\r\n",
495 "<polygon fill=\"black\" stroke=\"black\" points=\"51.4055,-125.846 41.7957,-121.385 46.5259,-130.865 51.4055,-125.846\"/>\r\n",
555 "<g id=\"edge11\" class=\"edge\">\r\n",
556 "<title>d&#45;&gt;h</title>\r\n",
557 "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-162.83C74.25,-152.94 60.48,-139.55 48.97,-128.36\"/>\r\n",
558 "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-125.85 41.8,-121.38 46.53,-130.87 51.41,-125.85\"/>\r\n",
496559 "</g>\r\n",
497560 "<!-- e&#45;&gt;g -->\r\n",
498 "<g id=\"edge5\" class=\"edge\"><title>e&#45;&gt;g</title>\r\n",
499 "<path fill=\"none\" stroke=\"black\" d=\"M113.57,-90.8345C123.75,-80.9376 137.524,-67.5462 149.031,-56.3591\"/>\r\n",
500 "<polygon fill=\"black\" stroke=\"black\" points=\"151.474,-58.865 156.204,-49.3847 146.595,-53.8461 151.474,-58.865\"/>\r\n",
561 "<g id=\"edge5\" class=\"edge\">\r\n",
562 "<title>e&#45;&gt;g</title>\r\n",
563 "<path fill=\"none\" stroke=\"black\" d=\"M113.57,-90.83C123.75,-80.94 137.52,-67.55 149.03,-56.36\"/>\r\n",
564 "<polygon fill=\"black\" stroke=\"black\" points=\"151.47,-58.87 156.2,-49.38 146.59,-53.85 151.47,-58.87\"/>\r\n",
501565 "</g>\r\n",
502566 "<!-- e&#45;&gt;f -->\r\n",
503 "<g id=\"edge6\" class=\"edge\"><title>e&#45;&gt;f</title>\r\n",
504 "<path fill=\"none\" stroke=\"black\" d=\"M99,-87.6966C99,-79.9827 99,-70.7125 99,-62.1124\"/>\r\n",
505 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-62.1043 99,-52.1043 95.5001,-62.1044 102.5,-62.1043\"/>\r\n",
567 "<g id=\"edge6\" class=\"edge\">\r\n",
568 "<title>e&#45;&gt;f</title>\r\n",
569 "<path fill=\"none\" stroke=\"black\" d=\"M99,-87.7C99,-79.98 99,-70.71 99,-62.11\"/>\r\n",
570 "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-62.1 99,-52.1 95.5,-62.1 102.5,-62.1\"/>\r\n",
506571 "</g>\r\n",
507572 "</g>\r\n",
508573 "</svg>\r\n"
509574 ],
510575 "text/plain": [
511 "<graphviz.dot.Digraph at 0x5094308>"
576 "<graphviz.dot.Digraph at 0x1c71cdf19d0>"
512577 ]
513578 },
514579 "execution_count": 5,
517582 }
518583 ],
519584 "source": [
520 "# http://www.graphviz.org/pdf/dotguide.pdf Figure 20\n",
521 "\n",
522 "from graphviz import Digraph\n",
523 "\n",
524 "g = Digraph('G', filename='cluster_edge.gv')\n",
585 "# http://www.graphviz.org/pdf/dotguide.pdf, Figure 20\n",
586 "\n",
587 "g = graphviz.Digraph('G', filename='cluster_edge.gv')\n",
525588 "g.attr(compound='true')\n",
526589 "\n",
527590 "with g.subgraph(name='cluster0') as c:\n",
556619 "name": "python",
557620 "nbconvert_exporter": "python",
558621 "pygments_lexer": "ipython3",
559 "version": "3.7.4"
622 "version": "3.9.4"
560623 }
561624 },
562625 "nbformat": 4,
0 #!/usr/bin/env python
1 # process.py - http://www.graphviz.org/content/process
0 #!/usr/bin/env python3
21
3 from graphviz import Graph
2 """http://www.graphviz.org/content/process"""
43
5 g = Graph('G', filename='process.gv', engine='sfdp')
4 import graphviz
5
6 g = graphviz.Graph('G', filename='process.gv', engine='sfdp')
67
78 g.edge('run', 'intr')
89 g.edge('intr', 'runbl')
0 #!/usr/bin/env python
1 # https://stackoverflow.com/questions/25734244/how-do-i-place-nodes-on-the-same-level-in-dot
0 #!/usr/bin/env python3
1
2 """https://stackoverflow.com/questions/25734244/how-do-i-place-nodes-on-the-same-level-in-dot"""
23
34 import graphviz
45
0 #!/usr/bin/env python
1 # structs.py - http://www.graphviz.org/doc/info/shapes.html#html
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/doc/info/shapes.html#html"""
43
5 s = Digraph('structs', node_attr={'shape': 'plaintext'})
4 import graphviz
5
6 s = graphviz.Digraph('structs', node_attr={'shape': 'plaintext'})
67
78 s.node('struct1', '''<
89 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
0 #!/usr/bin/env python
1 # structs_revisited.py - http://www.graphviz.org/pdf/dotguide.pdf Figure 12
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/pdf/dotguide.pdf, Figure 12"""
43
5 s = Digraph('structs', filename='structs_revisited.gv',
6 node_attr={'shape': 'record'})
4 import graphviz
5
6 s = graphviz.Digraph('structs', filename='structs_revisited.gv',
7 node_attr={'shape': 'record'})
78
89 s.node('struct1', '<f0> left|<f1> middle|<f2> right')
910 s.node('struct2', '<f0> one|<f1> two')
0 #!/usr/bin/env python
1 # traffic_lights.py - http://www.graphviz.org/content/traffic_lights
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/content/traffic_lights"""
43
5 t = Digraph('TrafficLights', filename='traffic_lights.gv', engine='neato')
4 import graphviz
5
6 t = graphviz.Digraph('TrafficLights', filename='traffic_lights.gv',
7 engine='neato')
68
79 t.attr('node', shape='box')
810 for i in (2, 1):
9 t.node('gy%d' % i)
10 t.node('yr%d' % i)
11 t.node('rg%d' % i)
11 t.node(f'gy{i:d}')
12 t.node(f'yr{i:d}')
13 t.node(f'rg{i:d}')
1214
1315 t.attr('node', shape='circle', fixedsize='true', width='0.9')
1416 for i in (2, 1):
15 t.node('green%d' % i)
16 t.node('yellow%d' % i)
17 t.node('red%d' % i)
18 t.node('safe%d' % i)
17 t.node(f'green{i:d}')
18 t.node(f'yellow{i:d}')
19 t.node(f'red{i:d}')
20 t.node(f'safe{i:d}')
1921
2022 for i, j in [(2, 1), (1, 2)]:
21 t.edge('gy%d' % i, 'yellow%d' % i)
22 t.edge('rg%d' % i, 'green%d' % i)
23 t.edge('yr%d' % i, 'safe%d' % j)
24 t.edge('yr%d' % i, 'red%d' % i)
25 t.edge('safe%d' % i, 'rg%d' % i)
26 t.edge('green%d' % i, 'gy%d' % i)
27 t.edge('yellow%d' % i, 'yr%d' % i)
28 t.edge('red%d' % i, 'rg%d' % i)
23 t.edge(f'gy{i:d}', f'yellow{i:d}')
24 t.edge(f'rg{i:d}', f'green{i:d}')
25 t.edge(f'yr{i:d}', f'safe{j:d}')
26 t.edge(f'yr{i:d}', f'red{i:d}')
27 t.edge(f'safe{i:d}', f'rg{i:d}')
28 t.edge(f'green{i:d}', f'gy{i:d}')
29 t.edge(f'yellow{i:d}', f'yr{i:d}')
30 t.edge(f'red{i:d}', f'rg{i:d}')
2931
3032 t.attr(overlap='false')
3133 t.attr(label=r'PetriNet Model TrafficLights\n'
0 #!/usr/bin/env python
1 # unix.py - http://www.graphviz.org/content/unix
0 #!/usr/bin/env python3
21
3 from graphviz import Digraph
2 """http://www.graphviz.org/content/unix"""
43
5 u = Digraph('unix', filename='unix.gv',
6 node_attr={'color': 'lightblue2', 'style': 'filled'})
4 import graphviz
5
6 u = graphviz.Digraph('unix', filename='unix.gv',
7 node_attr={'color': 'lightblue2', 'style': 'filled'})
78 u.attr(size='6,6')
89
910 u.edge('5th Edition', '6th Edition')
11
22 """Assemble DOT source code and render it with Graphviz.
33
4 >>> dot = Digraph(comment='The Round Table')
4 >>> import graphviz
5 >>> dot = graphviz.Digraph(comment='The Round Table')
56
67 >>> dot.node('A', 'King Arthur')
78 >>> dot.node('B', 'Sir Bedevere the Wise')
2324 }
2425 """
2526
27 from .backend import (render, pipe, unflatten, version, view,
28 ENGINES, FORMATS, RENDERERS, FORMATTERS,
29 ExecutableNotFound, RequiredArgumentError)
2630 from .dot import Graph, Digraph
2731 from .files import Source
2832 from .lang import escape, nohtml
29 from .backend import (render, pipe, version, view,
30 ENGINES, FORMATS, RENDERERS, FORMATTERS,
31 ExecutableNotFound, RequiredArgumentError)
3233
33 __all__ = [
34 'Graph', 'Digraph',
35 'Source',
36 'escape', 'nohtml',
37 'render', 'pipe', 'version', 'view',
38 'ENGINES', 'FORMATS', 'RENDERERS', 'FORMATTERS',
39 'ExecutableNotFound', 'RequiredArgumentError',
40 ]
34 __all__ = ['Graph', 'Digraph',
35 'Source',
36 'escape', 'nohtml',
37 'render', 'pipe', 'unflatten', 'version', 'view',
38 'ENGINES', 'FORMATS', 'RENDERERS', 'FORMATTERS',
39 'ExecutableNotFound', 'RequiredArgumentError']
4140
4241 __title__ = 'graphviz'
43 __version__ = '0.14.2'
42 __version__ = '0.17'
4443 __author__ = 'Sebastian Bank <sebastian.bank@uni-leipzig.de>'
4544 __license__ = 'MIT, see LICENSE.txt'
46 __copyright__ = 'Copyright (c) 2013-2020 Sebastian Bank'
45 __copyright__ = 'Copyright (c) 2013-2021 Sebastian Bank'
4746
48 #: Set of known layout commands used for rendering (``'dot'``, ``'neato'``, ...)
47 #: :class:`set` of known layout commands used for rendering (``'dot'``, ``'neato'``, ...)
4948 ENGINES = ENGINES
5049
51 #: Set of known output formats for rendering (``'pdf'``, ``'png'``, ...)
50 #: :class:`set` of known output formats for rendering (``'pdf'``, ``'png'``, ...)
5251 FORMATS = FORMATS
5352
54 #: Set of known output formatters for rendering (``'cairo'``, ``'gd'``, ...)
53 #: :class:`set` of known output formatters for rendering (``'cairo'``, ``'gd'``, ...)
5554 FORMATTERS = FORMATTERS
5655
57 #: Set of known output renderers for rendering (``'cairo'``, ``'gd'``, ...)
56 #: :class:`set` of known output renderers for rendering (``'cairo'``, ``'gd'``, ...)
5857 RENDERERS = RENDERERS
5958
6059 ExecutableNotFound = ExecutableNotFound
+0
-69
graphviz/_compat.py less more
0 # _compat.py - Python 2/3 compatibility
1
2 import os
3 import sys
4 import operator
5 import subprocess
6
7 PY2 = (sys.version_info.major == 2)
8
9
10 if PY2:
11 string_classes = (str, unicode) # needed individually for sublassing
12 text_type = unicode
13
14 iteritems = operator.methodcaller('iteritems')
15
16 def makedirs(name, mode=0o777, exist_ok=False):
17 try:
18 os.makedirs(name, mode)
19 except OSError:
20 if not exist_ok or not os.path.isdir(name):
21 raise
22
23 def stderr_write_bytes(data, flush=False):
24 """Write data str to sys.stderr (flush if requested)."""
25 sys.stderr.write(data)
26 if flush:
27 sys.stderr.flush()
28
29 def Popen_stderr_devnull(*args, **kwargs): # noqa: N802
30 with open(os.devnull, 'w') as f:
31 return subprocess.Popen(*args, stderr=f, **kwargs)
32
33 class CalledProcessError(subprocess.CalledProcessError):
34
35 def __init__(self, returncode, cmd, output=None, stderr=None):
36 super(CalledProcessError, self).__init__(returncode, cmd, output)
37 self.stderr = stderr
38
39 @property # pragma: no cover
40 def stdout(self):
41 return self.output
42
43 @stdout.setter # pragma: no cover
44 def stdout(self, value):
45 self.output = value
46
47
48 else:
49 string_classes = (str,)
50 text_type = str
51
52 def iteritems(d):
53 return iter(d.items())
54
55 def makedirs(name, mode=0o777, exist_ok=False): # allow os.makedirs mocking
56 return os.makedirs(name, mode, exist_ok=exist_ok)
57
58 def stderr_write_bytes(data, flush=False):
59 """Encode data str and write to sys.stderr (flush if requested)."""
60 encoding = sys.stderr.encoding or sys.getdefaultencoding()
61 sys.stderr.write(data.decode(encoding))
62 if flush:
63 sys.stderr.flush()
64
65 def Popen_stderr_devnull(*args, **kwargs): # noqa: N802
66 return subprocess.Popen(*args, stderr=subprocess.DEVNULL, **kwargs)
67
68 CalledProcessError = subprocess.CalledProcessError
0 # backend.py - execute rendering, open files in viewer
1
2 import os
3 import re
0 """Execute rendering subprocesses and open files in viewer."""
1
42 import errno
53 import logging
4 import os
65 import platform
6 import re
77 import subprocess
8
9 from . import _compat
8 import sys
9 import typing
1010
1111 from . import tools
1212
13 __all__ = [
14 'render', 'pipe', 'version', 'view',
15 'ENGINES', 'FORMATS', 'RENDERERS', 'FORMATTERS',
16 'ExecutableNotFound', 'RequiredArgumentError',
17 ]
13 __all__ = ['render', 'pipe', 'unflatten', 'version', 'view',
14 'ENGINES', 'FORMATS', 'RENDERERS', 'FORMATTERS',
15 'ExecutableNotFound', 'RequiredArgumentError']
1816
1917 ENGINES = { # http://www.graphviz.org/pdf/dot.1.pdf
2018 'dot', 'neato', 'twopi', 'circo', 'fdp', 'sfdp', 'patchwork', 'osage',
7977
8078 FORMATTERS = {'cairo', 'core', 'gd', 'gdiplus', 'gdwbmp', 'xlib'}
8179
80 ENCODING = 'utf-8'
81
8282 PLATFORM = platform.system().lower()
8383
8484
8888 class ExecutableNotFound(RuntimeError):
8989 """Exception raised if the Graphviz executable is not found."""
9090
91 _msg = ('failed to execute %r, '
91 _msg = ('failed to execute {!r}, '
9292 'make sure the Graphviz executables are on your systems\' PATH')
9393
9494 def __init__(self, args):
95 super(ExecutableNotFound, self).__init__(self._msg % args)
95 super().__init__(self._msg.format(*args))
9696
9797
9898 class RequiredArgumentError(Exception):
99 """Exception raised if a required argument is missing."""
100
101
102 class CalledProcessError(_compat.CalledProcessError):
99 """Exception raised if a required argument is missing (i.e. ``None``)."""
100
101
102 class CalledProcessError(subprocess.CalledProcessError):
103103
104104 def __str__(self):
105 s = super(CalledProcessError, self).__str__()
106 return '%s [stderr: %r]' % (s, self.stderr)
107
108
109 def command(engine, format_, filepath=None, renderer=None, formatter=None):
105 s = super().__str__()
106 return f'{s} [stderr: {self.stderr!r}]'
107
108
109 def command(engine: str, format_: str, filepath=None,
110 renderer: typing.Optional[str] = None,
111 formatter: typing.Optional[str] = None):
110112 """Return args list for ``subprocess.Popen`` and name of the rendered file."""
111113 if formatter is not None and renderer is None:
112114 raise RequiredArgumentError('formatter given without renderer')
113115
114116 if engine not in ENGINES:
115 raise ValueError('unknown engine: %r' % engine)
117 raise ValueError(f'unknown engine: {engine!r}')
116118 if format_ not in FORMATS:
117 raise ValueError('unknown format: %r' % format_)
119 raise ValueError(f'unknown format: {format_!r}')
118120 if renderer is not None and renderer not in RENDERERS:
119 raise ValueError('unknown renderer: %r' % renderer)
121 raise ValueError(f'unknown renderer: {renderer!r}')
120122 if formatter is not None and formatter not in FORMATTERS:
121 raise ValueError('unknown formatter: %r' % formatter)
123 raise ValueError(f'unknown formatter: {formatter!r}')
122124
123125 output_format = [f for f in (format_, renderer, formatter) if f is not None]
124 cmd = [engine, '-T%s' % ':'.join(output_format)]
126 cmd = ['dot', '-K%s' % engine, '-T%s' % ':'.join(output_format)]
125127
126128 if filepath is None:
127129 rendered = None
128130 else:
129131 cmd.extend(['-O', filepath])
130132 suffix = '.'.join(reversed(output_format))
131 rendered = '%s.%s' % (filepath, suffix)
133 rendered = f'{filepath}.{suffix}'
132134
133135 return cmd, rendered
134136
146148 return None
147149
148150
149 def run(cmd, input=None, capture_output=False, check=False, encoding=None,
150 quiet=False, **kwargs):
151 """Run the command described by cmd and return its (stdout, stderr) tuple."""
151 def run(cmd, input=None,
152 capture_output: bool = False,
153 check: bool = False,
154 encoding: typing.Optional[str] = None,
155 quiet: bool = False,
156 **kwargs) -> typing.Tuple:
157 """Run the command described by cmd and return its ``(stdout, stderr)`` tuple."""
152158 log.debug('run %r', cmd)
153159
154160 if input is not None:
156162 if encoding is not None:
157163 input = input.encode(encoding)
158164
159 if capture_output:
165 if capture_output: # Python 3.6 compat
160166 kwargs['stdout'] = kwargs['stderr'] = subprocess.PIPE
161167
162168 try:
163169 proc = subprocess.Popen(cmd, startupinfo=get_startupinfo(), **kwargs)
164170 except OSError as e:
165171 if e.errno == errno.ENOENT:
166 raise ExecutableNotFound(cmd)
172 raise ExecutableNotFound(cmd) from e
167173 else:
168174 raise
169175
170176 out, err = proc.communicate(input)
171177
172178 if not quiet and err:
173 _compat.stderr_write_bytes(err, flush=True)
179 err_encoding = sys.stderr.encoding or sys.getdefaultencoding()
180 sys.stderr.write(err.decode(err_encoding))
181 sys.stderr.flush()
174182
175183 if encoding is not None:
176184 if out is not None:
185193 return out, err
186194
187195
188 def render(engine, format, filepath, renderer=None, formatter=None, quiet=False):
196 def render(engine: str, format: str, filepath,
197 renderer: typing.Optional[str] = None,
198 formatter: typing.Optional[str] = None,
199 quiet: bool = False) -> str:
189200 """Render file with Graphviz ``engine`` into ``format``, return result filename.
190201
191202 Args:
192 engine: The layout commmand used for rendering (``'dot'``, ``'neato'``, ...).
193 format: The output format used for rendering (``'pdf'``, ``'png'``, ...).
203 engine: Layout commmand for rendering (``'dot'``, ``'neato'``, ...).
204 format: Output format for rendering (``'pdf'``, ``'png'``, ...).
194205 filepath: Path to the DOT source file to render.
195 renderer: The output renderer used for rendering (``'cairo'``, ``'gd'``, ...).
196 formatter: The output formatter used for rendering (``'cairo'``, ``'gd'``, ...).
197 quiet (bool): Suppress ``stderr`` output from the layout subprocess.
206 renderer: Output renderer (``'cairo'``, ``'gd'``, ...).
207 formatter: Output formatter (``'cairo'``, ``'gd'``, ...).
208 quiet: Suppress ``stderr`` output from the layout subprocess.
209
198210 Returns:
199211 The (possibly relative) path of the rendered file.
212
200213 Raises:
201214 ValueError: If ``engine``, ``format``, ``renderer``, or ``formatter`` are not known.
202215 graphviz.RequiredArgumentError: If ``formatter`` is given but ``renderer`` is None.
203216 graphviz.ExecutableNotFound: If the Graphviz executable is not found.
204217 subprocess.CalledProcessError: If the exit status is non-zero.
205218
206 The layout command is started from the directory of ``filepath``, so that
207 references to external files (e.g. ``[image=...]``) can be given as paths
208 relative to the DOT source file.
219 Note:
220 The layout command is started from the directory of ``filepath``, so that
221 references to external files (e.g. ``[image=...]``) can be given as paths
222 relative to the DOT source file.
209223 """
210224 dirname, filename = os.path.split(filepath)
211225 del filepath
221235 return rendered
222236
223237
224 def pipe(engine, format, data, renderer=None, formatter=None, quiet=False):
238 def pipe(engine: str, format: str, data: bytes,
239 renderer: typing.Optional[str] = None,
240 formatter: typing.Optional[str] = None,
241 quiet: bool = False) -> bytes:
225242 """Return ``data`` piped through Graphviz ``engine`` into ``format``.
226243
227244 Args:
228 engine: The layout commmand used for rendering (``'dot'``, ``'neato'``, ...).
229 format: The output format used for rendering (``'pdf'``, ``'png'``, ...).
230 data: The binary (encoded) DOT source string to render.
231 renderer: The output renderer used for rendering (``'cairo'``, ``'gd'``, ...).
232 formatter: The output formatter used for rendering (``'cairo'``, ``'gd'``, ...).
233 quiet (bool): Suppress ``stderr`` output from the layout subprocess.
245 engine: Layout commmand for rendering (``'dot'``, ``'neato'``, ...).
246 format: Output format for rendering (``'pdf'``, ``'png'``, ...).
247 data: Binary (encoded) DOT source string to render.
248 renderer: Output renderer (``'cairo'``, ``'gd'``, ...).
249 formatter: Output formatter (``'cairo'``, ``'gd'``, ...).
250 quiet: Suppress ``stderr`` output from the layout subprocess.
251
234252 Returns:
235253 Binary (encoded) stdout of the layout command.
254
236255 Raises:
237256 ValueError: If ``engine``, ``format``, ``renderer``, or ``formatter`` are not known.
238 graphviz.RequiredArgumentError: If ``formatter`` is given but ``renderer`` is None.
257 graphviz.RequiredArgumentError: If ``formatter`` is given but no ``renderer``.
239258 graphviz.ExecutableNotFound: If the Graphviz executable is not found.
240259 subprocess.CalledProcessError: If the exit status is non-zero.
260
261 Example:
262 >>> import graphviz
263 >>> graphviz.pipe('dot', 'svg', b'graph { hello -- world }')
264 b'<?xml version=...'
241265 """
242266 cmd, _ = command(engine, format, None, renderer, formatter)
243267 out, _ = run(cmd, input=data, capture_output=True, check=True, quiet=quiet)
244268 return out
245269
246270
247 def version():
271 def unflatten(source: str,
272 stagger: typing.Optional[int] = None,
273 fanout: bool = False,
274 chain: typing.Optional[int] = None,
275 encoding: str = ENCODING) -> str:
276 """Return DOT ``source`` piped through Graphviz *unflatten* preprocessor.
277
278 Args:
279 source: DOT source to process (improve layout aspect ratio).
280 stagger: Stagger the minimum length of leaf edges between 1 and this small integer.
281 fanout: Fanout nodes with indegree = outdegree = 1 when staggering (requires ``stagger``).
282 chain: Form disconnected nodes into chains of up to this many nodes.
283 encoding: Encoding to encode unflatten stdin and decode its stdout.
284
285 Returns:
286 Decoded stdout of the Graphviz unflatten command.
287
288 Raises:
289 graphviz.RequiredArgumentError: If ``fanout`` is given but no ``stagger``.
290 graphviz.ExecutableNotFound: If the Graphviz unflatten executable is not found.
291 subprocess.CalledProcessError: If the exit status is non-zero.
292
293 See also:
294 https://www.graphviz.org/pdf/unflatten.1.pdf
295 """
296 if fanout and stagger is None:
297 raise RequiredArgumentError('fanout given without stagger')
298
299 cmd = ['unflatten']
300 if stagger is not None:
301 cmd += ['-l', str(stagger)]
302 if fanout:
303 cmd.append('-f')
304 if chain is not None:
305 cmd += ['-c', str(chain)]
306
307 out, _ = run(cmd, input=source, capture_output=True, encoding=encoding)
308 return out
309
310
311 def version() -> typing.Tuple[int, ...]:
248312 """Return the version number tuple from the ``stderr`` output of ``dot -V``.
249313
250314 Returns:
251315 Two, three, or four ``int`` version ``tuple``.
316
252317 Raises:
253318 graphviz.ExecutableNotFound: If the Graphviz executable is not found.
254319 subprocess.CalledProcessError: If the exit status is non-zero.
255 RuntimmeError: If the output cannot be parsed into a version number.
320 RuntimeError: If the output cannot be parsed into a version number.
321
322 Example:
323 >>> import graphviz
324 >>> graphviz.version()
325 (...)
256326
257327 Note:
258328 Ignores the ``~dev.<YYYYmmdd.HHMM>`` portion of development versions.
259329
260 See also Graphviz Release version entry format:
261 https://gitlab.com/graphviz/graphviz/-/blob/f94e91ba819cef51a4b9dcb2d76153684d06a913/gen_version.py#L17-20
330 See also:
331 Graphviz Release version entry format:
332 https://gitlab.com/graphviz/graphviz/-/blob/f94e91ba819cef51a4b9dcb2d76153684d06a913/gen_version.py#L17-20
262333 """
263334 cmd = ['dot', '-V']
264335 out, _ = run(cmd, check=True, encoding='ascii',
277348 r')?'
278349 r' ', out)
279350 if ma is None:
280 raise RuntimeError('cannot parse %r output: %r' % (cmd, out))
351 raise RuntimeError(f'cannot parse {cmd!r} output: {out!r}')
281352
282353 return tuple(int(d) for d in ma.groups() if d is not None)
283354
284355
285 def view(filepath, quiet=False):
356 def view(filepath, quiet: bool = False) -> None:
286357 """Open filepath with its default viewing application (platform-specific).
287358
288359 Args:
289360 filepath: Path to the file to open in viewer.
290 quiet (bool): Suppress ``stderr`` output from the viewer process
291 (ineffective on Windows).
361 quiet: Suppress ``stderr`` output from the viewer process
362 (ineffective on Windows).
363
364 Returns:
365 ``None``
366
292367 Raises:
293368 RuntimeError: If the current platform is not supported.
294369
299374 try:
300375 view_func = getattr(view, PLATFORM)
301376 except AttributeError:
302 raise RuntimeError('platform %r not supported' % PLATFORM)
303 view_func(filepath, quiet)
377 raise RuntimeError(f'platform {PLATFORM!r} not supported')
378 view_func(filepath, quiet=quiet)
304379
305380
306381 @tools.attach(view, 'darwin')
307 def view_darwin(filepath, quiet):
382 def view_darwin(filepath, *, quiet: bool) -> None:
308383 """Open filepath with its default application (mac)."""
309384 cmd = ['open', filepath]
310385 log.debug('view: %r', cmd)
311 popen_func = _compat.Popen_stderr_devnull if quiet else subprocess.Popen
312 popen_func(cmd)
386 kwargs = {'stderr': subprocess.DEVNULL} if quiet else {}
387 subprocess.Popen(cmd, **kwargs)
313388
314389
315390 @tools.attach(view, 'linux')
316391 @tools.attach(view, 'freebsd')
317 def view_unixoid(filepath, quiet):
392 def view_unixoid(filepath, *, quiet: bool) -> None:
318393 """Open filepath in the user's preferred application (linux, freebsd)."""
319394 cmd = ['xdg-open', filepath]
320395 log.debug('view: %r', cmd)
321 popen_func = _compat.Popen_stderr_devnull if quiet else subprocess.Popen
322 popen_func(cmd)
396 kwargs = {'stderr': subprocess.DEVNULL} if quiet else {}
397 subprocess.Popen(cmd, **kwargs)
323398
324399
325400 @tools.attach(view, 'windows')
326 def view_windows(filepath, quiet):
401 def view_windows(filepath, *, quiet: bool) -> None:
327402 """Start filepath with its associated application (windows)."""
328403 # TODO: implement quiet=True
329404 filepath = os.path.normpath(filepath)
11
22 r"""Assemble DOT source code objects.
33
4 >>> dot = Graph(comment=u'M\xf8nti Pyth\xf8n ik den H\xf8lie Grailen')
5
6 >>> dot.node(u'M\xf8\xf8se')
7 >>> dot.node('trained_by', u'trained by')
8 >>> dot.node('tutte', u'TUTTE HERMSGERVORDENBROTBORDA')
9
10 >>> dot.edge(u'M\xf8\xf8se', 'trained_by')
4 >>> import graphviz
5 >>> dot = graphviz.Graph(comment='M\xf8nti Pyth\xf8n ik den H\xf8lie Grailen')
6
7 >>> dot.node('M\xf8\xf8se')
8 >>> dot.node('trained_by', 'trained by')
9 >>> dot.node('tutte', 'TUTTE HERMSGERVORDENBROTBORDA')
10
11 >>> dot.edge('M\xf8\xf8se', 'trained_by')
1112 >>> dot.edge('trained_by', 'tutte')
1213
1314 >>> dot.node_attr['shape'] = 'rectangle'
1415
15 >>> print(dot.source.replace(u'\xf8', '0')) #doctest: +NORMALIZE_WHITESPACE
16 >>> print(dot.source.replace('\xf8', '0')) #doctest: +NORMALIZE_WHITESPACE
1617 // M0nti Pyth0n ik den H0lie Grailen
1718 graph {
1819 node [shape=rectangle]
2728 'test-output/m00se.gv.pdf'
2829 """
2930
31 from . import backend
32 from . import files
3033 from . import lang
31 from . import files
3234
3335 __all__ = ['Graph', 'Digraph']
3436
5153
5254 def __init__(self, name=None, comment=None,
5355 filename=None, directory=None,
54 format=None, engine=None, encoding=files.ENCODING,
56 format=None, engine=None, encoding=backend.ENCODING,
5557 graph_attr=None, node_attr=None, edge_attr=None, body=None,
5658 strict=False):
5759 self.name = name
5860 self.comment = comment
5961
60 super(Dot, self).__init__(filename, directory, format, engine, encoding)
62 super().__init__(filename, directory, format, engine, encoding)
6163
6264 self.graph_attr = dict(graph_attr) if graph_attr is not None else {}
6365 self.node_attr = dict(node_attr) if node_attr is not None else {}
6870 self.strict = strict
6971
7072 def _kwargs(self):
71 result = super(Dot, self)._kwargs()
73 result = super()._kwargs()
7274 result.update(name=self.name,
7375 comment=self.comment,
7476 graph_attr=dict(self.graph_attr),
103105 yield head % (self._quote(self.name) + ' ' if self.name else '')
104106
105107 for kw in ('graph', 'node', 'edge'):
106 attrs = getattr(self, '%s_attr' % kw)
108 attrs = getattr(self, f'{kw}_attr')
107109 if attrs:
108110 yield self._attr % (kw, self._attr_list(None, attrs))
109111
112114
113115 yield self._tail
114116
115 def __str__(self):
117 @property
118 def source(self):
116119 """The DOT source code as string."""
117120 return '\n'.join(self)
118
119 source = property(__str__, doc=__str__.__doc__)
120121
121122 def node(self, name, label=None, _attributes=None, **attrs):
122123 """Create a node.
132133 self.body.append(line)
133134
134135 def edge(self, tail_name, head_name, label=None, _attributes=None, **attrs):
135 """Create an edge between two nodes.
136 """Create an edge between two nodes.
136137
137138 Args:
138139 tail_name: Start node identifier (format: ``node[:port[:compass]]``).
156157 """Create a bunch of edges.
157158
158159 Args:
159 tail_head_iter: Iterable of ``(tail_name, head_name)`` pairs (format:``node[:port[:compass]]``).
160 tail_head_iter: Iterable of ``(tail_name, head_name)`` pairs
161 (format:``node[:port[:compass]]``).
160162
161163
162164 Note:
180182 See the :ref:`usage examples in the User Guide <attributes>`.
181183 """
182184 if kw is not None and kw.lower() not in ('graph', 'node', 'edge'):
183 raise ValueError('attr statement must target graph, node, or edge: '
184 '%r' % kw)
185 raise ValueError('attr statement must target graph, node, or edge:'
186 f' {kw!r}')
185187 if attrs or _attributes:
186188 if kw is None:
187189 a_list = self._a_list(None, attrs, _attributes)
210212
211213 See the :ref:`usage examples in the User Guide <subgraphs>`.
212214
215 When used as a context manager, the returned new graph instance uses
216 ``strict=None`` and the parent graph's values for ``directory``,
217 ``format``, ``engine``, and ``encoding`` by default.
218
213219 Note:
214220 If the ``name`` of the subgraph begins with ``'cluster'`` (all lowercase)
215221 the layout engine will treat it as a special cluster subgraph.
217223 if graph is None:
218224 return SubgraphContext(self, {'name': name,
219225 'comment': comment,
226 'directory': self.directory,
227 'format': self.format,
228 'engine': self.engine,
229 'encoding': self.encoding,
220230 'graph_attr': graph_attr,
221231 'node_attr': node_attr,
222232 'edge_attr': edge_attr,
223 'body': body})
233 'body': body,
234 'strict': None})
224235
225236 args = [name, comment, graph_attr, node_attr, edge_attr, body]
226237 if not all(a is None for a in args):
227238 raise ValueError('graph must be sole argument of subgraph()')
228239
229240 if graph.directed != self.directed:
230 raise ValueError('%r cannot add subgraph of different kind:'
231 ' %r' % (self, graph))
241 raise ValueError(f'{self!r} cannot add subgraph of different kind:'
242 f' {graph!r}')
232243
233244 lines = ['\t' + line for line in graph.__iter__(subgraph=True)]
234245 self.body.extend(lines)
11
22 """Save DOT code objects, render with Graphviz dot, and open in viewer."""
33
4 import os
5 import io
64 import codecs
75 import locale
86 import logging
9
10 from ._compat import text_type
7 import os
118
129 from . import backend
1310 from . import tools
1411
1512 __all__ = ['File', 'Source']
1613
17 ENCODING = 'utf-8'
18
1914
2015 log = logging.getLogger(__name__)
2116
2217
2318 class Base(object):
2419
20 _engine = 'dot'
21
2522 _format = 'pdf'
26 _engine = 'dot'
27 _encoding = ENCODING
23
24 _encoding = backend.ENCODING
25
26 @property
27 def engine(self):
28 """The layout commmand used for rendering (``'dot'``, ``'neato'``, ...)."""
29 return self._engine
30
31 @engine.setter
32 def engine(self, engine):
33 engine = engine.lower()
34 if engine not in backend.ENGINES:
35 raise ValueError(f'unknown engine: {engine!r}')
36 self._engine = engine
2837
2938 @property
3039 def format(self):
3544 def format(self, format):
3645 format = format.lower()
3746 if format not in backend.FORMATS:
38 raise ValueError('unknown format: %r' % format)
47 raise ValueError(f'unknown format: {format!r}')
3948 self._format = format
40
41 @property
42 def engine(self):
43 """The layout commmand used for rendering (``'dot'``, ``'neato'``, ...)."""
44 return self._engine
45
46 @engine.setter
47 def engine(self, engine):
48 engine = engine.lower()
49 if engine not in backend.ENGINES:
50 raise ValueError('unknown engine: %r' % engine)
51 self._engine = engine
5249
5350 @property
5451 def encoding(self):
8481 _default_extension = 'gv'
8582
8683 def __init__(self, filename=None, directory=None,
87 format=None, engine=None, encoding=ENCODING):
84 format=None, engine=None, encoding=backend.ENCODING):
8885 if filename is None:
8986 name = getattr(self, 'name', None) or self.__class__.__name__
90 filename = '%s.%s' % (name, self._default_extension)
87 filename = f'{name}.{self._default_extension}'
9188 self.filename = filename
9289
9390 if directory is not None:
10299 self.encoding = encoding
103100
104101 def _kwargs(self):
105 result = super(File, self)._kwargs()
102 result = super()._kwargs()
106103 result['filename'] = self.filename
107104 if 'directory' in self.__dict__:
108105 result['directory'] = self.directory
109106 return result
110107
108 def __str__(self):
109 """The DOT source code as string."""
110 return self.source
111
112 def unflatten(self, stagger=None, fanout=False, chain=None):
113 """Return a new :class:`.Source` instance with the source piped through the Graphviz *unflatten* preprocessor.
114
115 Args:
116 stagger (int): Stagger the minimum length of leaf edges between 1 and this small integer.
117 fanout (bool): Fanout nodes with indegree = outdegree = 1 when staggering (requires ``stagger``).
118 chain (int): Form disconnected nodes into chains of up to this many nodes.
119
120 Returns:
121 Source: Prepocessed DOT source code (improved layout aspect ratio).
122
123 Raises:
124 graphviz.RequiredArgumentError: If ``fanout`` is given but ``stagger`` is None.
125 graphviz.ExecutableNotFound: If the Graphviz unflatten executable is not found.
126 subprocess.CalledProcessError: If the exit status is non-zero.
127
128 See also:
129 https://www.graphviz.org/pdf/unflatten.1.pdf
130 """
131 out = backend.unflatten(self.source,
132 stagger=stagger, fanout=fanout, chain=chain,
133 encoding=self._encoding)
134 return Source(out,
135 filename=self.filename, directory=self.directory,
136 format=self._format, engine=self._engine,
137 encoding=self._encoding)
138
111139 def _repr_svg_(self):
112140 return self.pipe(format='svg').decode(self._encoding)
113141
119147 renderer: The output renderer used for rendering (``'cairo'``, ``'gd'``, ...).
120148 formatter: The output formatter used for rendering (``'cairo'``, ``'gd'``, ...).
121149 quiet (bool): Suppress ``stderr`` output from the layout subprocess.
150
122151 Returns:
123152 Binary (encoded) stdout of the layout command.
153
124154 Raises:
125155 ValueError: If ``format``, ``renderer``, or ``formatter`` are not known.
126156 graphviz.RequiredArgumentError: If ``formatter`` is given but ``renderer`` is None.
130160 if format is None:
131161 format = self._format
132162
133 data = text_type(self.source).encode(self._encoding)
163 data = self.source.encode(self._encoding)
134164
135165 out = backend.pipe(self._engine, format, data,
136166 renderer=renderer, formatter=formatter,
148178 Args:
149179 filename: Filename for saving the source (defaults to ``name`` + ``'.gv'``)
150180 directory: (Sub)directory for source saving and rendering.
181
151182 Returns:
152183 The (possibly relative) path of the saved source file.
153184 """
159190 filepath = self.filepath
160191 tools.mkdirs(filepath)
161192
162 data = text_type(self.source)
163
164 log.debug('write %d bytes to %r', len(data), filepath)
165 with io.open(filepath, 'w', encoding=self.encoding) as fd:
166 fd.write(data)
167 if not data.endswith(u'\n'):
168 fd.write(u'\n')
193 log.debug('write %d bytes to %r', len(self.source), filepath)
194 with open(filepath, 'w', encoding=self.encoding) as fd:
195 fd.write(self.source)
196 if not self.source.endswith('\n'):
197 fd.write('\n')
169198
170199 return filepath
171200
178207 filename: Filename for saving the source (defaults to ``name`` + ``'.gv'``)
179208 directory: (Sub)directory for source saving and rendering.
180209 view (bool): Open the rendered result with the default application.
181 cleanup (bool): Delete the source file after rendering.
210 cleanup (bool): Delete the source file after successful rendering.
182211 format: The output format used for rendering (``'pdf'``, ``'png'``, etc.).
183212 renderer: The output renderer used for rendering (``'cairo'``, ``'gd'``, ...).
184213 formatter: The output formatter used for rendering (``'cairo'``, ``'gd'``, ...).
185214 quiet (bool): Suppress ``stderr`` output from the layout subprocess.
186215 quiet_view (bool): Suppress ``stderr`` output from the viewer process
187216 (implies ``view=True``, ineffective on Windows).
217
188218 Returns:
189219 The (possibly relative) path of the rendered file.
220
190221 Raises:
191222 ValueError: If ``format``, ``renderer``, or ``formatter`` are not known.
192223 graphviz.RequiredArgumentError: If ``formatter`` is given but ``renderer`` is None.
223254 Args:
224255 filename: Filename for saving the source (defaults to ``name`` + ``'.gv'``)
225256 directory: (Sub)directory for source saving and rendering.
226 cleanup (bool): Delete the source file after rendering.
257 cleanup (bool): Delete the source file after successful rendering.
227258 quiet (bool): Suppress ``stderr`` output from the layout subprocess.
228259 quiet_view (bool): Suppress ``stderr`` output from the viewer process
229260 (ineffective on Windows).
261
230262 Returns:
231263 The (possibly relative) path of the rendered file.
264
232265 Raises:
233266 graphviz.ExecutableNotFound: If the Graphviz executable is not found.
234267 subprocess.CalledProcessError: If the exit status is non-zero.
247280 def _view(self, filepath, format, quiet):
248281 """Start the right viewer based on file format and platform."""
249282 methodnames = [
250 '_view_%s_%s' % (format, backend.PLATFORM),
251 '_view_%s' % backend.PLATFORM,
283 f'_view_{format}_{backend.PLATFORM}',
284 f'_view_{backend.PLATFORM}',
252285 ]
253286 for name in methodnames:
254287 view_method = getattr(self, name, None)
255288 if view_method is not None:
256289 break
257290 else:
258 raise RuntimeError('%r has no built-in viewer support for %r'
259 ' on %r platform' % (self.__class__, format,
260 backend.PLATFORM))
261 view_method(filepath, quiet)
291 raise RuntimeError(f'{self.__class__!r} has no built-in viewer'
292 f' support for {format!r}'
293 f' on {backend.PLATFORM!r} platform')
294 view_method(filepath, quiet=quiet)
262295
263296 _view_darwin = staticmethod(backend.view.darwin)
264297 _view_freebsd = staticmethod(backend.view.freebsd)
284317
285318 @classmethod
286319 def from_file(cls, filename, directory=None,
287 format=None, engine=None, encoding=ENCODING):
320 format=None, engine=None, encoding=backend.ENCODING):
288321 """Return an instance with the source string read from the given file.
289322
290323 Args:
298331 if encoding is None:
299332 encoding = locale.getpreferredencoding()
300333 log.debug('read %r with encoding %r', filepath, encoding)
301 with io.open(filepath, encoding=encoding) as fd:
334 with open(filepath, encoding=encoding) as fd:
302335 source = fd.read()
303336 return cls(source, filename, directory, format, engine, encoding)
304337
305338 def __init__(self, source, filename=None, directory=None,
306 format=None, engine=None, encoding=ENCODING):
307 super(Source, self).__init__(filename, directory,
308 format, engine, encoding)
339 format=None, engine=None, encoding=backend.ENCODING):
340 super().__init__(filename, directory, format, engine, encoding)
309341 self.source = source #: The verbatim DOT source code string.
310342
311343 def _kwargs(self):
312 result = super(Source, self)._kwargs()
344 result = super()._kwargs()
313345 result['source'] = self.source
314346 return result
11
22 """Quote strings to be valid DOT identifiers, assemble attribute lists."""
33
4 import functools
45 import re
5 import collections
6 import functools
7
8 from . import _compat
6 import typing
97
108 from . import tools
119
12 __all__ = ['quote', 'quote_edge', 'a_list', 'attr_list', 'escape', 'nohtml']
10 __all__ = ['quote', 'quote_edge',
11 'a_list', 'attr_list',
12 'escape', 'nohtml']
1313
1414 # https://www.graphviz.org/doc/info/lang.html
1515 # https://www.graphviz.org/doc/info/attrs.html#k:escString
2929 r'\g<bs>\\\g<quote>')
3030
3131
32 def quote(identifier,
32 def quote(identifier: str,
3333 is_html_string=HTML_STRING.match,
34 is_valid_id=ID.match, dot_keywords=KEYWORDS,
35 escape_unescaped_quotes=ESCAPE_UNESCAPED_QUOTES):
34 is_valid_id=ID.match,
35 dot_keywords=KEYWORDS,
36 escape_unescaped_quotes=ESCAPE_UNESCAPED_QUOTES) -> str:
3637 r"""Return DOT identifier from string, quote if needed.
3738
3839 >>> quote('')
7172 if is_html_string(identifier) and not isinstance(identifier, NoHtml):
7273 pass
7374 elif not is_valid_id(identifier) or identifier.lower() in dot_keywords:
74 return '"%s"' % escape_unescaped_quotes(identifier)
75 return f'"{escape_unescaped_quotes(identifier)}"'
7576 return identifier
7677
7778
78 def quote_edge(identifier):
79 def quote_edge(identifier: str) -> str:
7980 """Return DOT edge statement node_id from string, quote if needed.
8081
8182 >>> quote_edge('spam')
9798 return ':'.join(parts)
9899
99100
100 def a_list(label=None, kwargs=None, attributes=None):
101 def a_list(label: typing.Optional[str] = None,
102 kwargs=None, attributes=None) -> str:
101103 """Return assembled DOT a_list string.
102104
103105 >>> a_list('spam', {'spam': None, 'ham': 'ham ham', 'eggs': ''})
104106 'label=spam eggs="" ham="ham ham"'
105107 """
106 result = ['label=%s' % quote(label)] if label is not None else []
108 result = [f'label={quote(label)}'] if label is not None else []
107109 if kwargs:
108 items = ['%s=%s' % (quote(k), quote(v))
110 items = [f'{quote(k)}={quote(v)}'
109111 for k, v in tools.mapping_items(kwargs) if v is not None]
110112 result.extend(items)
111113 if attributes:
112114 if hasattr(attributes, 'items'):
113115 attributes = tools.mapping_items(attributes)
114 items = ['%s=%s' % (quote(k), quote(v))
116 items = [f'{quote(k)}={quote(v)}'
115117 for k, v in attributes if v is not None]
116118 result.extend(items)
117119 return ' '.join(result)
118120
119121
120 def attr_list(label=None, kwargs=None, attributes=None):
122 def attr_list(label: typing.Optional[str] = None,
123 kwargs=None, attributes=None) -> str:
121124 """Return assembled DOT attribute list string.
122125
123126 Sorts ``kwargs`` and ``attributes`` if they are plain dicts (to avoid
135138 content = a_list(label, kwargs, attributes)
136139 if not content:
137140 return ''
138 return ' [%s]' % content
141 return f' [{content}]'
139142
140143
141 def escape(s):
144 def escape(s: str) -> 'NoHtml':
142145 r"""Return ``s`` as literal disabling special meaning of backslashes and ``'<...>'``.
143146
144147 see also https://www.graphviz.org/doc/info/attrs.html#k:escString
145148
146149 Args:
147150 s: String in which backslashes and ``'<...>'`` should be treated as literal.
151
152 Returns:
153 Escaped string subclass instance.
154
148155 Raises:
149156 TypeError: If ``s`` is not a ``str`` on Python 3, or a ``str``/``unicode`` on Python 2.
150157
151 >>> print(escape(r'\l'))
152 \\l
158 Example:
159 >>> import graphviz
160 >>> print(graphviz.escape(r'\l'))
161 \\l
153162 """
154163 return nohtml(s.replace('\\', '\\\\'))
155164
156165
157 class NoHtml(object):
158 """Mixin for string subclasses disabling fall-through of ``'<...>'``."""
166 class NoHtml(str):
167 """String subclass that does not treat ``'<...>'`` as DOT HTML string."""
159168
160169 __slots__ = ()
161170
162 _doc = "%s subclass that does not treat ``'<...>'`` as DOT HTML string."
163171
164 @classmethod
165 def _subcls(cls, other):
166 name = '%s_%s' % (cls.__name__, other.__name__)
167 bases = (other, cls)
168 ns = {'__doc__': cls._doc % other.__name__}
169 return type(name, bases, ns)
170
171
172 NOHTML = collections.OrderedDict((c, NoHtml._subcls(c)) for c in _compat.string_classes)
173
174
175 def nohtml(s):
172 def nohtml(s: str) -> NoHtml:
176173 """Return copy of ``s`` that will not treat ``'<...>'`` as DOT HTML string in quoting.
177174
178175 Args:
179176 s: String in which leading ``'<'`` and trailing ``'>'`` should be treated as literal.
177
178 Returns:
179 String subclass instance.
180
180181 Raises:
181182 TypeError: If ``s`` is not a ``str`` on Python 3, or a ``str``/``unicode`` on Python 2.
182183
183 >>> quote('<>-*-<>')
184 '<>-*-<>'
185
186 >>> quote(nohtml('<>-*-<>'))
187 '"<>-*-<>"'
184 Example:
185 >>> import graphviz
186 >>> g = graphviz.Graph()
187 >>> g.node(graphviz.nohtml('<>-*-<>'))
188 >>> print(g.source) # doctest: +NORMALIZE_WHITESPACE
189 graph {
190 "<>-*-<>"
191 }
188192 """
189 try:
190 subcls = NOHTML[type(s)]
191 except KeyError:
192 raise TypeError('%r does not have one of the required types:'
193 ' %r' % (s, list(NOHTML)))
194 return subcls(s)
193 return NoHtml(s)
0 # tools.py - generic helpers
0 """Generic re-useable self-contained helper functions."""
11
22 import os
3 import typing
34
4 from . import _compat
5
6 __all__ = ['attach', 'mkdirs', 'mapping_items']
5 __all__ = ['attach',
6 'mkdirs',
7 'mapping_items']
78
89
9 def attach(object, name):
10 def attach(object: typing.Any, name: str) -> typing.Callable:
1011 """Return a decorator doing ``setattr(object, name)`` with its argument.
1112
1213 >>> spam = type('Spam', (object,), {})()
14
1315 >>> @attach(spam, 'eggs')
1416 ... def func():
1517 ... pass
18
1619 >>> spam.eggs # doctest: +ELLIPSIS
1720 <function func at 0x...>
1821 """
2225 return decorator
2326
2427
25 def mkdirs(filename, mode=0o777):
28 def mkdirs(filename, mode: int = 0o777) -> None:
2629 """Recursively create directories up to the path of ``filename`` as needed."""
2730 dirname = os.path.dirname(filename)
2831 if not dirname:
2932 return
30 _compat.makedirs(dirname, mode=mode, exist_ok=True)
33 os.makedirs(dirname, mode=mode, exist_ok=True)
3134
3235
3336 def mapping_items(mapping):
4043 >>> list(mapping_items(OrderedDict(enumerate(['spam', 'ham', 'eggs']))))
4144 [(0, 'spam'), (1, 'ham'), (2, 'eggs')]
4245 """
43 result = _compat.iteritems(mapping)
46 result = iter(mapping.items())
4447 if type(mapping) is dict:
4548 result = iter(sorted(result))
4649 return result
00 Metadata-Version: 2.1
11 Name: graphviz
2 Version: 0.14.2
2 Version: 0.17
33 Summary: Simple Python interface for Graphviz
44 Home-page: https://github.com/xflr6/graphviz
55 Author: Sebastian Bank
88 Project-URL: Documentation, https://graphviz.readthedocs.io
99 Project-URL: Changelog, https://graphviz.readthedocs.io/en/latest/changelog.html
1010 Project-URL: Issue Tracker, https://github.com/xflr6/graphviz/issues
11 Description: Graphviz
12 ========
13
14 |PyPI version| |License| |Supported Python| |Format|
15
16 |Travis| |Codecov| |Readthedocs-stable| |Readthedocs-latest|
17
18 This package facilitates the creation and rendering of graph descriptions in
19 the DOT_ language of the Graphviz_ graph drawing software (`master repo`_) from
20 Python.
21
22 Create a graph object, assemble the graph by adding nodes and edges, and
23 retrieve its DOT source code string. Save the source code to a file and render
24 it with the Graphviz installation of your system.
25
26 Use the ``view`` option/method to directly inspect the resulting (PDF, PNG,
27 SVG, etc.) file with its default application. Graphs can also be rendered
28 and displayed within `Jupyter notebooks`_ (formerly known as
29 `IPython notebooks`_, example_) as well as the `Jupyter Qt Console`_.
30
31
32 Links
33 -----
34
35 - GitHub: https://github.com/xflr6/graphviz
36 - PyPI: https://pypi.org/project/graphviz/
37 - Documentation: https://graphviz.readthedocs.io
38 - Changelog: https://graphviz.readthedocs.io/en/latest/changelog.html
39 - Issue Tracker: https://github.com/xflr6/graphviz/issues
40 - Download: https://pypi.org/project/graphviz/#files
41
42
43 Installation
44 ------------
45
46 This package runs under Python 2.7, and 3.5+, use pip_ to install:
47
48 .. code:: bash
49
50 $ pip install graphviz
51
52 To render the generated DOT source code, you also need to install Graphviz
53 (`download page`_).
54
55 Make sure that the directory containing the ``dot`` executable is on your
56 systems' path.
57
58
59 Quickstart
60 ----------
61
62 Create a graph object:
63
64 .. code:: python
65
66 >>> from graphviz import Digraph
67
68 >>> dot = Digraph(comment='The Round Table')
69
70 >>> dot #doctest: +ELLIPSIS
71 <graphviz.dot.Digraph object at 0x...>
72
73 Add nodes and edges:
74
75 .. code:: python
76
77 >>> dot.node('A', 'King Arthur')
78 >>> dot.node('B', 'Sir Bedevere the Wise')
79 >>> dot.node('L', 'Sir Lancelot the Brave')
80
81 >>> dot.edges(['AB', 'AL'])
82 >>> dot.edge('B', 'L', constraint='false')
83
84 Check the generated source code:
85
86 .. code:: python
87
88 >>> print(dot.source) # doctest: +NORMALIZE_WHITESPACE
89 // The Round Table
90 digraph {
91 A [label="King Arthur"]
92 B [label="Sir Bedevere the Wise"]
93 L [label="Sir Lancelot the Brave"]
94 A -> B
95 A -> L
96 B -> L [constraint=false]
97 }
98
99 Save and render the source code, optionally view the result:
100
101 .. code:: python
102
103 >>> dot.render('test-output/round-table.gv', view=True) # doctest: +SKIP
104 'test-output/round-table.gv.pdf'
105
106 .. image:: https://raw.github.com/xflr6/graphviz/master/docs/round-table.png
107 :align: center
108
109
110 See also
111 --------
112
113 - pygraphviz_ |--| full-blown interface wrapping the Graphviz C library with SWIG
114 - graphviz-python_ |--| official Python bindings (documentation_)
115 - pydot_ |--| stable pure-Python approach, requires pyparsing
116
117
118 License
119 -------
120
121 This package is distributed under the `MIT license`_.
122
123
124 .. _pip: https://pip.readthedocs.io
125 .. _Graphviz: https://www.graphviz.org
126 .. _master repo: https://gitlab.com/graphviz/graphviz/
127 .. _download page: https://www.graphviz.org/download/
128 .. _DOT: https://www.graphviz.org/doc/info/lang.html
129 .. _Jupyter notebooks: https://jupyter.org
130 .. _IPython notebooks: https://ipython.org/notebook.html
131 .. _example: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/notebook.ipynb
132 .. _Jupyter Qt Console: https://qtconsole.readthedocs.io
133
134 .. _pygraphviz: https://pypi.org/project/pygraphviz/
135 .. _graphviz-python: https://pypi.org/project/graphviz-python/
136 .. _documentation: https://www.graphviz.org/pdf/gv.3python.pdf
137 .. _pydot: https://pypi.org/project/pydot/
138
139 .. _MIT license: https://opensource.org/licenses/MIT
140
141
142 .. |--| unicode:: U+2013
143
144
145 .. |PyPI version| image:: https://img.shields.io/pypi/v/graphviz.svg
146 :target: https://pypi.org/project/graphviz/
147 :alt: Latest PyPI Version
148 .. |License| image:: https://img.shields.io/pypi/l/graphviz.svg
149 :target: https://pypi.org/project/graphviz/
150 :alt: License
151 .. |Supported Python| image:: https://img.shields.io/pypi/pyversions/graphviz.svg
152 :target: https://pypi.org/project/graphviz/
153 :alt: Supported Python Versions
154 .. |Format| image:: https://img.shields.io/pypi/format/graphviz.svg
155 :target: https://pypi.org/project/graphviz/
156 :alt: Format
157
158 .. |Travis| image:: https://travis-ci.org/xflr6/graphviz.svg?branch=master
159 :target: https://travis-ci.org/xflr6/graphviz
160 :alt: Travis
161 .. |Codecov| image:: https://codecov.io/gh/xflr6/graphviz/branch/master/graph/badge.svg
162 :target: https://codecov.io/gh/xflr6/graphviz
163 :alt: Codecov
164 .. |Readthedocs-stable| image:: https://readthedocs.org/projects/graphviz/badge/?version=stable
165 :target: https://graphviz.readthedocs.io/en/stable/?badge=stable
166 :alt: Readthedocs stable
167 .. |Readthedocs-latest| image:: https://readthedocs.org/projects/graphviz/badge/?version=latest
168 :target: https://graphviz.readthedocs.io/en/latest/?badge=latest
169 :alt: Readthedocs latest
11 Project-URL: CI, https://github.com/xflr6/graphviz/actions
12 Project-URL: Coverage, https://codecov.io/gh/xflr6/graphviz
17013 Keywords: graph visualization dot render
17114 Platform: any
17215 Classifier: Development Status :: 4 - Beta
17417 Classifier: Intended Audience :: Science/Research
17518 Classifier: License :: OSI Approved :: MIT License
17619 Classifier: Operating System :: OS Independent
177 Classifier: Programming Language :: Python :: 2
178 Classifier: Programming Language :: Python :: 2.7
17920 Classifier: Programming Language :: Python :: 3
180 Classifier: Programming Language :: Python :: 3.5
18121 Classifier: Programming Language :: Python :: 3.6
18222 Classifier: Programming Language :: Python :: 3.7
18323 Classifier: Programming Language :: Python :: 3.8
24 Classifier: Programming Language :: Python :: 3.9
25 Classifier: Programming Language :: Python :: 3.10
18426 Classifier: Topic :: Scientific/Engineering :: Visualization
185 Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*
27 Requires-Python: >=3.6
18628 Provides-Extra: dev
18729 Provides-Extra: test
18830 Provides-Extra: docs
31 License-File: LICENSE.txt
32
33 Graphviz
34 ========
35
36 |PyPI version| |License| |Supported Python| |Format|
37
38 |Build| |Codecov| |Readthedocs-stable| |Readthedocs-latest|
39
40 This package facilitates the creation and rendering of graph descriptions in
41 the DOT_ language of the Graphviz_ graph drawing software (`upstream repo`_)
42 from Python.
43
44 Create a graph object, assemble the graph by adding nodes and edges, and
45 retrieve its DOT source code string. Save the source code to a file and render
46 it with the Graphviz installation of your system.
47
48 Use the ``view`` option/method to directly inspect the resulting (PDF, PNG,
49 SVG, etc.) file with its default application. Graphs can also be rendered
50 and displayed within `Jupyter notebooks`_ (formerly known as
51 `IPython notebooks`_,
52 `example <notebook_>`_, `nbviewer <notebook-nbviewer_>`_)
53 as well as the `Jupyter QtConsole`_.
54
55
56 Links
57 -----
58
59 - GitHub: https://github.com/xflr6/graphviz
60 - PyPI: https://pypi.org/project/graphviz/
61 - Documentation: https://graphviz.readthedocs.io
62 - Changelog: https://graphviz.readthedocs.io/en/latest/changelog.html
63 - Issue Tracker: https://github.com/xflr6/graphviz/issues
64 - Download: https://pypi.org/project/graphviz/#files
65
66
67 Installation
68 ------------
69
70 This package runs under Python 3.6+, use pip_ to install:
71
72 .. code:: bash
73
74 $ pip install graphviz
75
76 To render the generated DOT source code, you also need to install Graphviz_
77 (`download page <upstream-download_>`_,
78 `archived versions <upstream-archived_>`_,
79 `installation procedure for Windows <upstream-windows_>`_).
80
81 Make sure that the directory containing the ``dot`` executable is on your
82 systems' path.
83
84 Anaconda_: see the conda-forge_ package
85 `conda-forge/python-graphviz <conda-forge-python-graphviz_>`_
86 (`feedstock <conda-forge-python-graphviz-feedstock_>`_),
87 which should automatically ``conda install``
88 `conda-forge/graphviz <conda-forge-graphviz_>`_
89 (`feedstock <conda-forge-graphviz-feedstock_>`_) as dependency.
90
91
92 Quickstart
93 ----------
94
95 Create a graph object:
96
97 .. code:: python
98
99 >>> import graphviz
100 >>> dot = graphviz.Digraph(comment='The Round Table')
101 >>> dot #doctest: +ELLIPSIS
102 <graphviz.dot.Digraph object at 0x...>
103
104 Add nodes and edges:
105
106 .. code:: python
107
108 >>> dot.node('A', 'King Arthur')
109 >>> dot.node('B', 'Sir Bedevere the Wise')
110 >>> dot.node('L', 'Sir Lancelot the Brave')
111
112 >>> dot.edges(['AB', 'AL'])
113 >>> dot.edge('B', 'L', constraint='false')
114
115 Check the generated source code:
116
117 .. code:: python
118
119 >>> print(dot.source) # doctest: +NORMALIZE_WHITESPACE
120 // The Round Table
121 digraph {
122 A [label="King Arthur"]
123 B [label="Sir Bedevere the Wise"]
124 L [label="Sir Lancelot the Brave"]
125 A -> B
126 A -> L
127 B -> L [constraint=false]
128 }
129
130 Save and render the source code, optionally view the result:
131
132 .. code:: python
133
134 >>> dot.render('test-output/round-table.gv', view=True) # doctest: +SKIP
135 'test-output/round-table.gv.pdf'
136
137 .. image:: https://raw.github.com/xflr6/graphviz/master/docs/round-table.png
138 :align: center
139
140
141 See also
142 --------
143
144 - pygraphviz_ |--| full-blown interface wrapping the Graphviz C library with SWIG
145 - graphviz-python_ |--| official Python bindings
146 (`documentation <graphviz-python-docs_>`_)
147 - pydot_ |--| stable pure-Python approach, requires pyparsing
148
149
150 License
151 -------
152
153 This package is distributed under the `MIT license`_.
154
155
156 .. _Graphviz: https://www.graphviz.org
157 .. _DOT: https://www.graphviz.org/doc/info/lang.html
158 .. _upstream repo: https://gitlab.com/graphviz/graphviz/
159 .. _upstream-download: https://www.graphviz.org/download/
160 .. _upstream-archived: https://www2.graphviz.org/Archive/stable/
161 .. _upstream-windows: https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224
162
163 .. _pip: https://pip.readthedocs.io
164
165 .. _Jupyter notebooks: https://jupyter.org
166 .. _IPython notebooks: https://ipython.org/notebook.html
167 .. _Jupyter QtConsole: https://qtconsole.readthedocs.io
168
169 .. _notebook: https://github.com/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
170 .. _notebook-nbviewer: https://nbviewer.jupyter.org/github/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb
171
172 .. _Anaconda: https://docs.anaconda.com/anaconda/install/
173 .. _conda-forge: https://conda-forge.org
174 .. _conda-forge-python-graphviz: https://anaconda.org/conda-forge/python-graphviz
175 .. _conda-forge-python-graphviz-feedstock: https://github.com/conda-forge/python-graphviz-feedstock
176 .. _conda-forge-graphviz: https://anaconda.org/conda-forge/graphviz
177 .. _conda-forge-graphviz-feedstock: https://github.com/conda-forge/graphviz-feedstock
178
179 .. _pygraphviz: https://pypi.org/project/pygraphviz/
180 .. _graphviz-python: https://pypi.org/project/graphviz-python/
181 .. _graphviz-python-docs: https://www.graphviz.org/pdf/gv.3python.pdf
182 .. _pydot: https://pypi.org/project/pydot/
183
184 .. _MIT license: https://opensource.org/licenses/MIT
185
186
187 .. |--| unicode:: U+2013
188
189
190 .. |PyPI version| image:: https://img.shields.io/pypi/v/graphviz.svg
191 :target: https://pypi.org/project/graphviz/
192 :alt: Latest PyPI Version
193 .. |License| image:: https://img.shields.io/pypi/l/graphviz.svg
194 :target: https://pypi.org/project/graphviz/
195 :alt: License
196 .. |Supported Python| image:: https://img.shields.io/pypi/pyversions/graphviz.svg
197 :target: https://pypi.org/project/graphviz/
198 :alt: Supported Python Versions
199 .. |Format| image:: https://img.shields.io/pypi/format/graphviz.svg
200 :target: https://pypi.org/project/graphviz/
201 :alt: Format
202
203 .. |Build| image:: https://github.com/xflr6/graphviz/actions/workflows/build.yaml/badge.svg?branch=master
204 :target: https://github.com/xflr6/graphviz/actions/workflows/build.yaml?query=branch%3Amaster
205 :alt: Build
206 .. |Codecov| image:: https://codecov.io/gh/xflr6/graphviz/branch/master/graph/badge.svg
207 :target: https://codecov.io/gh/xflr6/graphviz
208 :alt: Codecov
209 .. |Readthedocs-stable| image:: https://readthedocs.org/projects/graphviz/badge/?version=stable
210 :target: https://graphviz.readthedocs.io/en/stable/?badge=stable
211 :alt: Readthedocs stable
212 .. |Readthedocs-latest| image:: https://readthedocs.org/projects/graphviz/badge/?version=latest
213 :target: https://graphviz.readthedocs.io/en/latest/?badge=latest
214 :alt: Readthedocs latest
215
1515 docs/license.rst
1616 docs/manual.rst
1717 docs/notebooks.rst
18 docs/pet-shop.png
1918 docs/round-table.png
2019 docs/_static/angles.svg
2120 docs/_static/btree.svg
4140 docs/_static/structs_revisited.svg
4241 docs/_static/traffic_lights.svg
4342 docs/_static/unix.svg
43 docs/_static/wide-unflatten-stagger-2.svg
44 docs/_static/wide-unflatten-stagger-3.svg
45 docs/_static/wide.svg
4446 examples/angles.py
4547 examples/btree.py
4648 examples/cluster.py
5153 examples/g_c_n.py
5254 examples/graphviz-engines.ipynb
5355 examples/graphviz-escapes.ipynb
56 examples/graphviz-notebook.ipynb
5457 examples/hello.py
5558 examples/notebook.ipynb
5659 examples/process.py
6063 examples/traffic_lights.py
6164 examples/unix.py
6265 graphviz/__init__.py
63 graphviz/_compat.py
6466 graphviz/backend.py
6567 graphviz/dot.py
6668 graphviz/files.py
7274 graphviz.egg-info/requires.txt
7375 graphviz.egg-info/top_level.txt
7476 tests/conftest.py
75 tests/dot_red.png
7677 tests/test_backend.py
7778 tests/test_dot.py
7879 tests/test_files.py
7980 tests/test_lang.py
80 tests/test_tools.py
81 tests/test_tools.py
82 tests/utils.py
83 tests/files/dot_red.png
77
88 [docs]
99 sphinx>=1.8
10 sphinx-autodoc-typehints
1011 sphinx-rtd-theme
1112
1213 [test]
1314 mock>=3
14 pytest>=4
15 pytest>=5.2
1516 pytest-mock>=2
1617 pytest-cov
0 #!/usr/bin/env python
0 #!/usr/bin/env python3
11
22 import platform
33 import sys
44
55 import pytest
66
7 ARGS = [
8 #'--pdb',
9 #'--exitfirst',
10 ]
7 ARGS = [#'--skip-exe',
8 #'--collect-only',
9 #'--verbose',
10 #'--pdb',
11 #'--exitfirst', # a.k.a. -x
12 #'-W', 'error',
13 ]
1114
1215 if platform.system() == 'Windows':
1316 if 'idlelib' in sys.modules:
14 ARGS.extend(['--capture=sys', '--color=no'])
15 elif sys.version_info.major == 2 and 'win_unicode_console' in sys.modules:
16 ARGS.append('--capture=sys')
17 ARGS += ['--capture=sys', '--color=no']
1718
18 sys.exit(pytest.main(ARGS + sys.argv[1:]))
19 args = sys.argv[1:] + ARGS
20
21 print(f'pytest.main({args!r})')
22 sys.exit(pytest.main(args))
33 [sdist]
44 formats = zip
55
6 [bdist_wheel]
7 universal = 1
8
96 [tool:pytest]
10 minversion = 4
7 minversion = 5.2
118 testpaths = README.rst docs graphviz tests
129 addopts =
13 --doctest-modules --doctest-glob='*.rst' --ignore=docs/conf.py
10 --doctest-modules
11 --doctest-glob='*.rst' --ignore=docs/conf.py
1412 --cov --cov-report=term --cov-report=html
13 --strict-markers
1514 mock_use_standalone_module = true
1615 log_cli = false
1716 log_cli_level = DEBUG
0 # setup.py
1
2 import io
0 import pathlib
31 from setuptools import setup, find_packages
42
53 setup(
64 name='graphviz',
7 version='0.14.2',
5 version='0.17',
86 author='Sebastian Bank',
97 author_email='sebastian.bank@uni-leipzig.de',
108 description='Simple Python interface for Graphviz',
1513 'Documentation': 'https://graphviz.readthedocs.io',
1614 'Changelog': 'https://graphviz.readthedocs.io/en/latest/changelog.html',
1715 'Issue Tracker': 'https://github.com/xflr6/graphviz/issues',
16 'CI': 'https://github.com/xflr6/graphviz/actions',
17 'Coverage': 'https://codecov.io/gh/xflr6/graphviz',
1818 },
1919 packages=find_packages(),
2020 platforms='any',
21 python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*',
21 python_requires='>=3.6',
2222 extras_require={
2323 'dev': ['tox>=3', 'flake8', 'pep8-naming', 'wheel', 'twine'],
24 'test': ['mock>=3', 'pytest>=4', 'pytest-mock>=2', 'pytest-cov'],
25 'docs': ['sphinx>=1.8', 'sphinx-rtd-theme'],
24 'test': ['mock>=3', 'pytest>=5.2', 'pytest-mock>=2', 'pytest-cov'],
25 'docs': ['sphinx>=1.8', 'sphinx-autodoc-typehints', 'sphinx-rtd-theme'],
2626 },
27 long_description=io.open('README.rst', encoding='utf-8').read(),
27 long_description=pathlib.Path('README.rst').read_text(encoding='utf-8'),
2828 classifiers=[
2929 'Development Status :: 4 - Beta',
3030 'Intended Audience :: Developers',
3131 'Intended Audience :: Science/Research',
3232 'License :: OSI Approved :: MIT License',
3333 'Operating System :: OS Independent',
34 'Programming Language :: Python :: 2',
35 'Programming Language :: Python :: 2.7',
3634 'Programming Language :: Python :: 3',
37 'Programming Language :: Python :: 3.5',
3835 'Programming Language :: Python :: 3.6',
3936 'Programming Language :: Python :: 3.7',
4037 'Programming Language :: Python :: 3.8',
38 'Programming Language :: Python :: 3.9',
39 'Programming Language :: Python :: 3.10',
4140 'Topic :: Scientific/Engineering :: Visualization',
4241 ],
4342 )
0 # conftest.py
0 """pytest command line options and fixtures."""
11
2 import sys
2 import pathlib
33 import platform as platform_
44
55 import pytest
66
7 DIRECTORY = pathlib.Path(__file__).parent
8
9 SKIP_EXE = '--skip-exe'
10
711
812 def pytest_addoption(parser):
9 parser.addoption('--skipexe', action='store_true',
13 parser.addoption(SKIP_EXE, action='store_true',
1014 help='skip tests that run Graphviz executables'
11 'or subprocesses')
15 ' or subprocesses')
1216
1317
1418 def pytest_configure(config):
15 pytest.exe = pytest.mark.skipif(config.getoption('--skipexe'),
16 reason='skipped by --skipexe option')
19 config.addinivalue_line('markers',
20 f'exe: skip if {SKIP_EXE} is given')
21
22
23 def pytest_collection_modifyitems(config, items):
24 if config.getoption(SKIP_EXE):
25 for item in items:
26 if 'exe' in item.keywords:
27 marker = pytest.mark.skip(reason=f'skipped by {SKIP_EXE} flag')
28 item.add_marker(marker)
1729
1830
1931 @pytest.fixture(scope='session')
20 def py2():
21 return sys.version_info.major == 2
32 def files_path():
33 return DIRECTORY / 'files'
2234
2335
2436 @pytest.fixture(scope='session')
25 def filesdir(tmpdir_factory):
26 LocalPath = tmpdir_factory.getbasetemp().__class__ # noqa: N806
27 return LocalPath(__file__).new(basename='')
28
29
30 @pytest.fixture(scope='session')
31 def test_platform():
37 def platform():
3238 return platform_.system().lower()
3339
3440
3541 @pytest.fixture(params=['darwin', 'freebsd', 'linux', 'windows'],
36 ids=lambda p: 'platform=%r' % p)
37 def platform(monkeypatch, request):
42 ids=lambda p: f'platform={p!r}')
43 def mock_platform(monkeypatch, request):
3844 monkeypatch.setattr('graphviz.backend.PLATFORM', request.param)
3945 yield request.param
4046
5157
5258
5359 @pytest.fixture
54 def startfile(mocker, test_platform):
55 if test_platform == 'windows':
60 def startfile(mocker, platform):
61 if platform == 'windows':
5662 kwargs = {'autospec': True}
5763 else:
5864 kwargs = {'create': True, 'new_callable': mocker.Mock}
6470 monkeypatch.setenv('PATH', '')
6571
6672
67 @pytest.fixture(params=[False, True], ids=lambda q: 'quiet=%r' % q)
73 @pytest.fixture(params=[False, True], ids=lambda q: f'quiet={q!r}')
6874 def quiet(request):
6975 return request.param
7076
tests/dot_red.png less more
Binary diff not shown
Binary diff not shown
00 # test_backend.py
11
2 import os
3 import re
42 import errno
53 import platform
4 import re
5 import shutil
66 import subprocess
77
88 import pytest
99
10 from graphviz.backend import (run, render, pipe, version, view,
10 from graphviz.backend import (run, render, pipe, unflatten, version, view,
1111 ExecutableNotFound, RequiredArgumentError)
12
13 import utils
14
15 SVG_PATTERN = r'(?s)^<\?xml .+</svg>\s*$'
1216
1317
1418 if platform.system().lower() == 'windows':
2125 assert startupinfo is None
2226
2327
24 @pytest.exe
28 @pytest.mark.exe
2529 def test_run_oserror():
2630 with pytest.raises(OSError) as e:
2731 run([''])
2832 assert e.value.errno in (errno.EACCES, errno.EINVAL)
2933
3034
31 def test_run_encoding_mocked(mocker, Popen, input=u'sp\xe4m', encoding='utf-8'):
35 def test_run_encoding_mocked(mocker, Popen, input='sp\xe4m', encoding='utf-8'):
3236 proc = Popen.return_value
3337 proc.returncode = 0
3438 mocks = [mocker.create_autospec(bytes, instance=True, name=n) for n in ('out', 'err')]
4953 m.decode.assert_called_once_with(encoding)
5054
5155
52 @pytest.exe
56 @pytest.mark.exe
5357 @pytest.mark.usefixtures('empty_path')
5458 @pytest.mark.parametrize('func, args', [
5559 (render, ['dot', 'pdf', 'nonfilepath']),
5660 (pipe, ['dot', 'pdf', b'nongraph']),
61 (unflatten, ['graph {}']),
5762 (version, []),
5863 ])
5964 def test_missing_executable(func, args):
8691 render('dot', 'ps', 'nonfilepath', 'ps', '')
8792
8893
89 @pytest.exe
94 @pytest.mark.exe
9095 def test_render_missing_file(quiet, engine='dot', format_='pdf'):
9196 with pytest.raises(subprocess.CalledProcessError) as e:
9297 render(engine, format_, '', quiet=quiet)
9398 assert e.value.returncode == 2
9499
95100
96 @pytest.exe
101 @pytest.mark.exe
97102 @pytest.mark.parametrize('format_, renderer, formatter, expected_suffix', [
98103 ('pdf', None, None, 'pdf'),
99104 ('plain', 'dot', 'core', 'core.dot.plain'),
100105 ])
101106 @pytest.mark.parametrize('engine', ['dot'])
102 def test_render(capsys, tmpdir, engine, format_, renderer, formatter,
107 def test_render(capsys, tmp_path, engine, format_, renderer, formatter,
103108 expected_suffix, filename='hello.gv',
104109 data=b'digraph { hello -> world }'):
105 lpath = tmpdir / filename
106 lpath.write_binary(data)
107 rendered = lpath.new(ext='%s.%s' % (lpath.ext, expected_suffix))
110 lpath = tmp_path / filename
111 lpath.write_bytes(data)
112 rendered = lpath.with_suffix(f'{lpath.suffix}.{expected_suffix}')
108113
109114 assert render(engine, format_, str(lpath), renderer, formatter) == str(rendered)
110115
111 assert rendered.size()
112 assert capsys.readouterr() == ('', '')
113
114
115 @pytest.exe
116 def test_render_img(capsys, tmpdir, filesdir, engine='dot', format_='pdf'):
117 subdir = tmpdir / 'subdir'
118 subdir.ensure(dir=True)
116 assert rendered.stat().st_size
117 assert capsys.readouterr() == ('', '')
118
119
120 @pytest.mark.exe
121 def test_render_img(capsys, tmp_path, files_path, engine='dot', format_='pdf'):
122 subdir = tmp_path / 'subdir'
123 subdir.mkdir()
119124
120125 img_path = subdir / 'dot_red.png'
121 (filesdir / img_path.basename).copy(img_path)
122 assert img_path.size()
126 shutil.copy(files_path / img_path.name, img_path)
127 assert img_path.stat().st_size
123128
124129 gv_path = subdir / 'img.gv'
125 rendered = gv_path.new(ext='%s.%s' % (gv_path.ext, format_))
126 gv_rel, rendered_rel = map(tmpdir.bestrelpath, (gv_path, rendered))
127 assert all(s.startswith('subdir') for s in (gv_rel, rendered_rel))
128 gv_path.write_text(u'graph { red_dot [image="%s"] }' % img_path.basename,
130 rendered = gv_path.with_suffix(f'{gv_path.suffix}.{format_}')
131 gv_rel, rendered_rel = (p.relative_to(tmp_path) for p in (gv_path, rendered))
132 assert all(str(s).startswith('subdir') for s in (gv_rel, rendered_rel))
133 gv_path.write_text(f'graph {{ red_dot [image="{img_path.name}"] }}',
129134 encoding='ascii')
130135
131 with tmpdir.as_cwd():
132 assert render(engine, format_, gv_rel) == rendered_rel
133
134 assert rendered.size()
136 with utils.as_cwd(tmp_path):
137 assert render(engine, format_, gv_rel) == str(rendered_rel)
138
139 assert rendered.stat().st_size
135140 assert capsys.readouterr() == ('', '')
136141
137142
142147
143148 assert render('dot', 'pdf', 'nonfilepath', quiet=quiet) == 'nonfilepath.pdf'
144149
145 Popen.assert_called_once_with(['dot', '-Tpdf', '-O', 'nonfilepath'],
150 Popen.assert_called_once_with(['dot', '-Kdot', '-Tpdf', '-O', 'nonfilepath'],
146151 stdout=subprocess.PIPE,
147152 stderr=subprocess.PIPE,
148153 cwd=None, startupinfo=mocker.ANY)
151156 assert capsys.readouterr() == ('', '' if quiet else 'stderr')
152157
153158
154 @pytest.exe
159 @pytest.mark.exe
155160 @pytest.mark.xfail('version() == (2, 36, 0)',
156161 reason='https://bugs.launchpad.net/ubuntu/+source/graphviz/+bug/1694108')
157162 def test_pipe_invalid_data(capsys, quiet, engine='dot', format_='svg'):
168173 assert 'syntax error in line' in err
169174
170175
171 @pytest.exe
172 @pytest.mark.parametrize('format_, renderer, formatter, pattern', [
173 ('svg', None, None, r'(?s)^<\?xml .+</svg>\s*$'),
174 ('ps', 'ps', 'core', r'%!PS-'),
175 ])
176 @pytest.mark.parametrize('engine', ['dot'])
176 @pytest.mark.exe
177 @pytest.mark.parametrize('engine, format_, renderer, formatter, pattern', [
178 ('dot', 'svg', None, None, SVG_PATTERN),
179 ('dot', 'ps', 'ps', 'core', r'%!PS-'),
180 # Error: remove_overlap: Graphviz not built with triangulation library
181 pytest.param('sfdp', 'svg', None, None, SVG_PATTERN,
182 marks=pytest.mark.xfail('version() > (2, 38, 0)'
183 " and platform.system().lower() == 'windows'",
184 reason='https://gitlab.com/graphviz/graphviz/-/issues/1269')),
185 ])
177186 def test_pipe(capsys, engine, format_, renderer, formatter, pattern,
178187 data=b'graph { spam }'):
179188 out = pipe(engine, format_, data, renderer, formatter).decode('ascii')
183192 assert capsys.readouterr() == ('', '')
184193
185194
186 def test_pipe_pipe_invalid_data_mocked(mocker, py2, Popen, quiet): # noqa: N803
195 def test_pipe_pipe_invalid_data_mocked(mocker, Popen, quiet): # noqa: N803
187196 stderr = mocker.patch('sys.stderr', autospec=True,
188197 **{'flush': mocker.Mock(), 'encoding': 'nonencoding'})
189198 proc = Popen.return_value
190199 proc.returncode = mocker.sentinel.returncode
191200 err = mocker.create_autospec(bytes, instance=True, name='err',
192201 **{'__len__.return_value': 23})
193 proc.communicate.return_value = (mocker.sentinel.out, err)
202 out = mocker.create_autospec(bytes, instance=True, name='out')
203 proc.communicate.return_value = (out, err)
194204
195205 with pytest.raises(subprocess.CalledProcessError) as e:
196206 pipe('dot', 'png', b'nongraph', quiet=quiet)
197207
198208 assert e.value.returncode is mocker.sentinel.returncode
199209 assert e.value.stderr is err
200 assert e.value.stdout is mocker.sentinel.out
210 assert e.value.stdout is out
201211 e.value.stdout = mocker.sentinel.new_stdout
202212 assert e.value.stdout is mocker.sentinel.new_stdout
203 Popen.assert_called_once_with(['dot', '-Tpng'],
213 Popen.assert_called_once_with(['dot', '-Kdot', '-Tpng'],
204214 stdin=subprocess.PIPE,
205215 stdout=subprocess.PIPE,
206216 stderr=subprocess.PIPE,
208218 check_startupinfo(Popen.call_args.kwargs['startupinfo'])
209219 proc.communicate.assert_called_once_with(b'nongraph')
210220 if not quiet:
211 if py2:
212 stderr.write.assert_called_once_with(err)
213 else:
214 err.decode.assert_called_once_with(stderr.encoding)
215 stderr.write.assert_called_once_with(err.decode.return_value)
221 err.decode.assert_called_once_with(stderr.encoding)
222 stderr.write.assert_called_once_with(err.decode.return_value)
216223 stderr.flush.assert_called_once_with()
217224
218225
219226 def test_pipe_mocked(capsys, mocker, Popen, quiet): # noqa: N803
220227 proc = Popen.return_value
221228 proc.returncode = 0
222 proc.communicate.return_value = (mocker.sentinel.out, b'stderr')
223
224 assert pipe('dot', 'png', b'nongraph', quiet=quiet) is mocker.sentinel.out
225
226 Popen.assert_called_once_with(['dot', '-Tpng'],
229 proc.communicate.return_value = (b'stdout', b'stderr')
230
231 assert pipe('dot', 'png', b'nongraph', quiet=quiet) == b'stdout'
232
233 Popen.assert_called_once_with(['dot', '-Kdot', '-Tpng'],
227234 stdin=subprocess.PIPE,
228235 stdout=subprocess.PIPE,
229236 stderr=subprocess.PIPE,
233240 assert capsys.readouterr() == ('', '' if quiet else 'stderr')
234241
235242
236 @pytest.exe
243 @pytest.mark.exe
244 @pytest.mark.parametrize('source, kwargs, expected', [
245 ('digraph {1 -> 2; 1 -> 3; 1 -> 4}',
246 {'stagger': 3, 'fanout': True, 'chain': 42},
247 'digraph { 1 -> 2 [minlen=1]; 1 -> 3 [minlen=2]; 1 -> 4 [minlen=3]; }'),
248 ])
249 def test_unflatten(source, kwargs, expected):
250 result = unflatten(source, **kwargs)
251 normalized = re.sub(r'\s+', ' ', result.strip())
252 assert normalized == expected
253
254
255 def test_unflatten_mocked(capsys, mocker, Popen):
256 proc = Popen.return_value
257 proc.returncode = 0
258 proc.communicate.return_value = (b'nonresult', b'')
259
260 assert unflatten('nonsource') == 'nonresult'
261 Popen.assert_called_once_with(['unflatten'],
262 stdin=subprocess.PIPE,
263 stdout=subprocess.PIPE,
264 stderr=subprocess.PIPE,
265 startupinfo=mocker.ANY)
266 check_startupinfo(Popen.call_args.kwargs['startupinfo'])
267 proc.communicate.assert_called_once_with(b'nonsource')
268 assert capsys.readouterr() == ('', '')
269
270
271 def test_unflatten_stagger_missing():
272 with pytest.raises(RequiredArgumentError, match=r'without stagger'):
273 unflatten('graph {}', fanout=True)
274
275
276 @pytest.mark.exe
237277 def test_version(capsys):
238278 result = version()
239279 assert isinstance(result, tuple) and result
284324 view('nonfilepath')
285325
286326
287 def test_view(mocker, py2, platform, Popen, startfile, quiet): # noqa: N803
288 if quiet and py2:
289 open_ = mocker.patch('__builtin__.open', mocker.mock_open())
290
327 def test_view(mocker, mock_platform, Popen, startfile, quiet): # noqa: N803
291328 assert view('nonfilepath', quiet=quiet) is None
292329
293 if platform == 'windows':
330 if mock_platform == 'windows':
294331 startfile.assert_called_once_with('nonfilepath')
295332 return
296333
297 if quiet and py2:
298 open_.assert_called_once_with(os.devnull, 'w')
299 kwargs = {'stderr': open_.return_value}
300 elif quiet:
334 if quiet:
301335 kwargs = {'stderr': subprocess.DEVNULL}
302336 else:
303337 kwargs = {}
304338
305 if platform == 'darwin':
339 if mock_platform == 'darwin':
306340 Popen.assert_called_once_with(['open', 'nonfilepath'], **kwargs)
307 elif platform in ('linux', 'freebsd'):
341 elif mock_platform in ('linux', 'freebsd'):
308342 Popen.assert_called_once_with(['xdg-open', 'nonfilepath'], **kwargs)
309343 else:
310344 raise RuntimeError
00 # test_dot.py
11
22 import itertools
3 import re
34
45 import pytest
56
67 from graphviz.dot import Graph, Digraph
8 from graphviz.files import Source
79
810
911 @pytest.fixture(params=[Graph, Digraph])
1214
1315
1416 @pytest.fixture(params=list(itertools.permutations([Graph, Digraph], 2)),
15 ids=lambda c: '%s, %s' % (c[0].__name__, c[1].__name__))
17 ids=lambda c: f'{c[0].__name__}, {c[1].__name__}')
1618 def classes(request):
1719 return request.param
1820
2628 assert c.copy().__dict__ == c.__dict__ == c.copy().__dict__
2729
2830
31 def test_str(cls):
32 c = cls()
33 assert str(c) == c.source
34
35
36 @pytest.mark.exe
37 def test_unflatten(cls):
38 c = cls()
39 result = c.unflatten()
40 assert isinstance(result, Source)
41
42 normalized = re.sub(r'\s+', ' ', result.source.strip())
43 assert normalized.startswith('digraph {' if c.directed else 'graph {')
44
45
2946 def test__repr_svg_(mocker, cls):
3047 c = cls()
3148 kwargs = {'return_value.decode.return_value': mocker.sentinel.decoded}
3956
4057 @pytest.mark.parametrize('keep_attrs', [False, True])
4158 def test_clear(cls, keep_attrs):
42 kwargs = {'%s_attr' % a: {a: a} for a in ('graph', 'node', 'edge')}
59 kwargs = {f'{a}_attr': {a: a} for a in ('graph', 'node', 'edge')}
4360 c = cls(**kwargs)
4461 assert all(getattr(c, k) == v for k, v in kwargs.items())
4562 c.node('spam')
99116 (Digraph, 'digraph {\n\t// comment\n\tsubgraph name {\n\t}\n}'),
100117 ], ids=lambda p: getattr(p, '__name__', '...'))
101118 def test_subgraph_graph_none(cls, expected):
102 dot = cls()
103 with dot.subgraph(name='name', comment='comment'):
104 pass
119 dot = cls(directory='nondirectory', format='png',
120 encoding='ascii', engine='neato')
121 assert dot.strict is False
122
123 with dot.subgraph(name='name', comment='comment') as child:
124 assert child.directory == dot.directory
125 assert child.format == dot.format
126 assert child.engine == dot.engine
127 assert child.encoding == dot.encoding
128 assert child.strict is None
129
105130 assert dot.source == expected
106131
107132
171196 }'''
172197
173198
199 @pytest.mark.exe
200 @pytest.mark.parametrize('cls, expected', [
201 (Graph, 'graph {\n\tC\n}\n'),
202 (Digraph, 'digraph {\n\tC\n}\n'),
203 ], ids=lambda p: getattr(p, '__name__', '...'))
204 def test_subgraph_render(capsys, tmp_path, cls, expected):
205 lpath = tmp_path / 's1.gv'
206 rendered = lpath.with_suffix('.gv.pdf')
207
208 dot = cls()
209 dot.edge('A', 'B')
210
211 with dot.subgraph() as s1:
212 s1.node('C')
213 result = s1.render(str(lpath))
214
215 assert result == str(rendered)
216
217 assert lpath.read_text(encoding='ascii') == expected
218
219 assert rendered.stat().st_size
220 assert capsys.readouterr() == ('', '')
221
222
174223 def test_label_html():
175224 """http://www.graphviz.org/doc/info/shapes.html#html"""
176225 dot = Digraph('structs', node_attr={'shape': 'plaintext'})
00 # test_files.py
11
22 import locale
3 import re
34
45 import pytest
56
67 from graphviz.files import Source
78
8 SOURCE = {
9 'source': 'digraph { hello -> world }',
10 'filename': 'hello.gv', 'directory': 'test-output',
11 'format': 'PNG', 'engine': 'NEATO', 'encoding': 'utf-8',
12 }
9 SOURCE = {'source': 'digraph { hello -> world }',
10 'filename': 'hello.gv', 'directory': 'test-output',
11 'format': 'PNG', 'engine': 'NEATO', 'encoding': 'utf-8'}
1312
1413
1514 @pytest.fixture(scope='module')
1615 def source():
1716 return Source(**SOURCE)
17
18
19 def test_engine(source):
20 assert not SOURCE['engine'].islower()
21
22 assert source.engine == SOURCE['engine'].lower()
23 with pytest.raises(ValueError, match=r'engine'):
24 source.engine = ''
1825
1926
2027 def test_format(source):
2330 assert source.format == SOURCE['format'].lower()
2431 with pytest.raises(ValueError, match=r'format'):
2532 source.format = ''
26
27
28 def test_engine(source):
29 assert not SOURCE['engine'].islower()
30
31 assert source.engine == SOURCE['engine'].lower()
32 with pytest.raises(ValueError, match=r'engine'):
33 source.engine = ''
3433
3534
3635 def test_encoding(source):
5554 def test_init_filename():
5655 assert Source('').filename == 'Source.gv'
5756 assert type('Named', (Source,), {'name': 'name'})('').filename == 'name.gv'
57
58
59 def test_str(source):
60 assert str(source) == source.source
61
62
63 @pytest.mark.exe
64 def test_unflatten(source):
65 result = source.unflatten()
66 assert isinstance(result, Source)
67
68 normalized = re.sub(r'\s+', ' ', result.source.strip())
69 assert normalized == 'digraph { hello -> world; }'
5870
5971
6072 def test__repr_svg_(mocker, source):
88100 quiet=False)
89101
90102
91 def test_filepath(test_platform, source):
92 if test_platform == 'windows':
103 def test_filepath(platform, source):
104 if platform == 'windows':
93105 assert source.filepath == 'test-output\\hello.gv'
94106 else:
95107 assert source.filepath == 'test-output/hello.gv'
96108
97109
98 def test_save(mocker, py2, filename='nonfilename', directory='nondirectory'):
110 def test_save(mocker, filename='nonfilename', directory='nondirectory'):
99111 source = Source(**SOURCE)
100112 makedirs = mocker.patch('os.makedirs', autospec=True)
101 open_ = mocker.patch('io.open', mocker.mock_open())
113 open_ = mocker.patch('builtins.open', mocker.mock_open())
102114
103115 assert source.save(filename, directory) == source.filepath
104116
105117 assert source.filename == filename and source.directory == directory
106 if py2:
107 makedirs.assert_called_once_with(source.directory, 0o777)
108 else:
109 makedirs.assert_called_once_with(source.directory, 0o777, exist_ok=True)
118 makedirs.assert_called_once_with(source.directory, 0o777, exist_ok=True)
110119 open_.assert_called_once_with(source.filepath, 'w',
111120 encoding=source.encoding)
112121 assert open_.return_value.write.call_args_list == [mocker.call(source.source),
113 mocker.call(u'\n')]
122 mocker.call('\n')]
114123
115124
116125 def test_render(mocker, render, source):
145154 source._view('name', 'png', False)
146155
147156
148 def test__view(mocker, platform, source):
149 _view_platform = mocker.patch.object(source, '_view_%s' % platform,
157 def test__view(mocker, mock_platform, source):
158 _view_platform = mocker.patch.object(source, f'_view_{mock_platform}',
150159 autospec=True)
151160
152 assert source._view(mocker.sentinel.name, 'png', False) is None
161 kwargs = {'quiet': False}
153162
154 _view_platform.assert_called_once_with(mocker.sentinel.name, False)
163 assert source._view(mocker.sentinel.name, 'png', **kwargs) is None
164
165 _view_platform.assert_called_once_with(mocker.sentinel.name, **kwargs)
155166
156167
157168 def test_copy(source):
161172 assert source.copy().__dict__ == source.__dict__ == source.copy().__dict__
162173
163174
164 def test_from_file(tmpdir, filename='hello.gv', directory='source_hello',
165 data=u'digraph { hello -> world }', encoding='utf-8'):
166 lpath = tmpdir.mkdir(directory)
175 def test_from_file(tmp_path, filename='hello.gv', directory='source_hello',
176 data='digraph { hello -> world }', encoding='utf-8'):
177 lpath = tmp_path / directory
178 lpath.mkdir()
167179 (lpath / filename).write_text(data, encoding=encoding)
168180
169181 source = Source.from_file(filename, str(lpath))
00 # test_lang.py
11
2 import sys
32 import warnings
43
54 import pytest
65
7 from graphviz.lang import quote, attr_list, nohtml
6 from graphviz import lang
87
98
109 @pytest.mark.parametrize('char', ['G', 'E', 'T', 'H', 'L', 'l'])
1110 def test_deprecated_escape(recwarn, char):
1211 warnings.simplefilter('always')
1312
14 escape = eval(r'"\%s"' % char)
13 escape = eval(rf'"\{char}"')
1514
16 if sys.version_info < (3, 6):
17 assert not recwarn
18 else:
19 assert len(recwarn) == 1
20 w = recwarn.pop(DeprecationWarning)
21 assert str(w.message).startswith('invalid escape sequence')
15 assert len(recwarn) == 1
16 w = recwarn.pop(DeprecationWarning)
17 assert str(w.message).startswith('invalid escape sequence')
2218
23 assert escape == '\\%s' % char
24 assert quote(escape) == '"\\%s"' % char
19 assert escape == f'\\{char}'
20 assert lang.quote(escape) == f'"\\{char}"'
2521
2622
2723 @pytest.mark.parametrize('identifier, expected', [
3329 ('\\n \\l \\r', '"\\n \\l \\r"'),
3430 ('\r\n', '"\r\n"'),
3531 ('\\\\n', r'"\\n"'),
36 (u'\u0665.\u0660', u'"\u0665.\u0660"'),
32 ('\u0665.\u0660', '"\u0665.\u0660"'),
3733 ('\\"spam', r'"\"spam"'),
3834 ('\\\\"spam', r'"\\\"spam"'),
3935 ('\\\\\\"spam', r'"\\\"spam"'),
4036 ('\\\\\\\\"spam', r'"\\\\\"spam"'),
4137 ])
4238 def test_quote(identifier, expected):
43 assert quote(identifier) == expected
39 assert lang.quote(identifier) == expected
4440
4541
4642 @pytest.mark.parametrize('attributes, expected', [
4844 ({'spam': 'eggs'}, ' [spam=eggs]'),
4945 ])
5046 def test_attr_list(attributes, expected):
51 assert attr_list(attributes=attributes) == expected
47 assert lang.attr_list(attributes=attributes) == expected
5248
5349
54 @pytest.mark.parametrize('string', ['spam', u'spam'])
55 def test_nohtml(string):
56 result = nohtml(string)
57 assert result == string
58 assert isinstance(result, type(string))
50 @pytest.mark.parametrize('string, expected, expected_quoted', [
51 ('spam', 'spam', 'spam'),
52 ('<>-*-<>', '<>-*-<>', '"<>-*-<>"'),
53 ])
54 def test_nohtml(string, expected, expected_quoted):
55 result = lang.nohtml(string)
56 assert isinstance(result, str)
57 assert isinstance(result, lang.NoHtml)
58 assert result == expected
5959
60
61 def test_nohtml_invalid(py2):
62 match = r"required types.+'str'"
63 if py2:
64 match += r".+'unicode'"
65 with pytest.raises(TypeError, match=match):
66 nohtml(True)
60 quoted = lang.quote(result)
61 assert isinstance(quoted, str)
62 assert quoted == expected_quoted
00 # test_tools.py
11
2 import functools
23 import os
3 import functools
44
55 import pytest
66
77 from graphviz.tools import mkdirs
8
9 import utils
810
911
1012 def itertree(root):
1618 yield bool(is_file), rel_path(n).replace('\\', '/')
1719
1820
19 def test_mkdirs_invalid(tmpdir):
20 with tmpdir.as_cwd():
21 (tmpdir / 'spam.eggs').write_binary(b'')
21 def test_mkdirs_invalid(tmp_path):
22 with utils.as_cwd(tmp_path):
23 (tmp_path / 'spam.eggs').write_bytes(b'')
2224 with pytest.raises(OSError):
2325 mkdirs('spam.eggs/spam')
2426
2527
26 def test_mkdirs(tmpdir):
27 with tmpdir.as_cwd():
28 def test_mkdirs(tmp_path):
29 with utils.as_cwd(tmp_path):
2830 mkdirs('spam.eggs')
29 assert list(itertree(str(tmpdir))) == []
31 assert list(itertree(str(tmp_path))) == []
3032 for _ in range(2):
3133 mkdirs('spam/eggs/spam.eggs')
32 assert list(itertree(str(tmpdir))) == [(False, 'spam'),
33 (False, 'spam/eggs')]
34 assert list(itertree(str(tmp_path))) == [(False, 'spam'),
35 (False, 'spam/eggs')]
0 # utils.py
1
2 import contextlib
3 import os
4 import pathlib
5
6
7 @contextlib.contextmanager
8 def as_cwd(path):
9 """Return a context manager, which changes to the path’s dir during the managed “with” context."""
10 cwd = pathlib.Path().resolve()
11 os.chdir(path)
12 yield
13 os.chdir(cwd)
00 [tox]
1 envlist = py{27,35,36,37,38}
1 envlist = py{39,38,37,36}
22 skip_missing_interpreters = true
33
44 [testenv]
0 #!/usr/bin/env python
1 # try-examples.py - import graphviz here and run all scripts in the example dir
0 #!/usr/bin/env python3
1
2 """Import ``graphviz`` here and run all scripts in the ``examples/`` dir."""
23
34 import os
4 import io
5 import glob
5 import pathlib
6 import warnings
67
78 import graphviz # noqa: F401
89
9 os.chdir('examples')
10 for filename in glob.iglob('*.py'):
11 with io.open(filename, encoding='utf-8') as fd:
12 code = fd.read()
13 exec(code)
10 EXAMPLES = pathlib.Path('examples')
11
12 os.chdir(EXAMPLES)
13
14 for path in pathlib.Path().glob('*.py'):
15 code = path.read_text(encoding='utf-8')
16 try:
17 exec(code)
18 except Exception as e:
19 warnings.warn(e)