|
30 | 30 | (paper/chapters/tikz-styles.tex: ``copydot`` etc.), so generated code can be |
31 | 31 | pasted into the book. |
32 | 32 |
|
33 | | -Supported today: Variable, Delta (any order), Product, Rename, Sum (top |
34 | | -level AND as parenthesized product factors), and Function (application |
35 | | -arrows: solid for consumed edges, densely dotted for elementwise; broadcast |
36 | | -edges stay on the argument, as the book draws them). Transposed 2-port |
37 | | -variables (spine forces reversed port order) are drawn rotated 180 degrees, |
38 | | -the book's transpose convention. Unevaluated Derivative nodes render as |
39 | | -Penrose derivative loops: a fit-ellipse around the differentiated |
40 | | -subexpression with a dot on the boundary and labeled whiskers for the new |
41 | | -edges (one whisker bends left; a pair bends left/right, like the book's |
42 | | -\dloop/\dwhiskers). Nested derivatives nest their ellipses. A derivative |
43 | | -whose new edge is contracted onward still raises NotImplementedError -- |
44 | | -simplify() first. |
| 33 | +The whole tensorgrad language is supported: |
| 34 | +
|
| 35 | +* **Variable / Zero** -- labelled nodes (Zero is a ``0`` node). |
| 36 | +* **Delta** (any order) -- order 2 is an identity wire, order 0 a scalar |
| 37 | + ``|n|``, order >= 3 a copy-dot; a closed ring of identities is a circle. |
| 38 | +* **Product** -- contraction; shared edges become wires, the rest stubs. |
| 39 | +* **Rename** -- re-keys free edges (including swaps). |
| 40 | +* **Sum** -- top level AND as parenthesized product factors (drawn as a |
| 41 | + bracketed group with wires passing through). |
| 42 | +* **Function** -- application arrows: solid for consumed edges, densely |
| 43 | + dotted for elementwise; broadcast edges stay on the argument. |
| 44 | +* **Derivative** (unevaluated) -- a Penrose loop: a fit-ellipse around the |
| 45 | + differentiated subexpression with a boundary dot and labelled whiskers |
| 46 | + for the new edges (one bends left; a pair bends left/right, like the |
| 47 | + book's \dloop/\dwhiskers). Nested derivatives nest their ellipses. A |
| 48 | + derivative whose new edge is contracted onward raises NotImplementedError |
| 49 | + -- call simplify() first. |
| 50 | +* **Expectation** -- an ``E[.]`` fit-box around the inner subexpression. |
| 51 | +
|
| 52 | +A 2-port variable forced into reversed port order (a transpose, e.g. the |
| 53 | +A^T term of a gradient) is drawn rotated 180 degrees, but only when it has |
| 54 | +a free edge -- internal contraction nodes stay upright. |
| 55 | +
|
| 56 | +Entry points (all equivalent): ``tensorgrad.to_book_tikz(t, **opts)``, |
| 57 | +``t.to_book_tikz(**opts)``, or this module's ``to_book_tikz``. Options: |
| 58 | +``left=``/``right=`` fix a free edge's side; ``max_width=`` scales a |
| 59 | +too-wide diagram down to fit; ``scale=`` sets an explicit factor. |
45 | 60 | """ |
46 | 61 |
|
47 | 62 | from __future__ import annotations |
|
0 commit comments