aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-master.tar.gz
two version of R2R are hereHEADmaster
Diffstat (limited to '.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py')
-rw-r--r--.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py292
1 files changed, 292 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py b/.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py
new file mode 100644
index 00000000..14ab5423
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/networkx/drawing/tests/test_latex.py
@@ -0,0 +1,292 @@
+import pytest
+
+import networkx as nx
+
+
+def test_tikz_attributes():
+ G = nx.path_graph(4, create_using=nx.DiGraph)
+ pos = {n: (n, n) for n in G}
+
+ G.add_edge(0, 0)
+ G.edges[(0, 0)]["label"] = "Loop"
+ G.edges[(0, 0)]["label_options"] = "midway"
+
+ G.nodes[0]["style"] = "blue"
+ G.nodes[1]["style"] = "line width=3,draw"
+ G.nodes[2]["style"] = "circle,draw,blue!50"
+ G.nodes[3]["label"] = "Stop"
+ G.edges[(0, 1)]["label"] = "1st Step"
+ G.edges[(0, 1)]["label_options"] = "near end"
+ G.edges[(2, 3)]["label"] = "3rd Step"
+ G.edges[(2, 3)]["label_options"] = "near start"
+ G.edges[(2, 3)]["style"] = "bend left,green"
+ G.edges[(1, 2)]["label"] = "2nd"
+ G.edges[(1, 2)]["label_options"] = "pos=0.5"
+ G.edges[(1, 2)]["style"] = ">->,bend right,line width=3,green!90"
+
+ output_tex = nx.to_latex(
+ G,
+ pos=pos,
+ as_document=False,
+ tikz_options="[scale=3]",
+ node_options="style",
+ edge_options="style",
+ node_label="label",
+ edge_label="label",
+ edge_label_options="label_options",
+ )
+ expected_tex = r"""\begin{figure}
+ \begin{tikzpicture}[scale=3]
+ \draw
+ (0, 0) node[blue] (0){0}
+ (1, 1) node[line width=3,draw] (1){1}
+ (2, 2) node[circle,draw,blue!50] (2){2}
+ (3, 3) node (3){Stop};
+ \begin{scope}[->]
+ \draw (0) to node[near end] {1st Step} (1);
+ \draw[loop,] (0) to node[midway] {Loop} (0);
+ \draw[>->,bend right,line width=3,green!90] (1) to node[pos=0.5] {2nd} (2);
+ \draw[bend left,green] (2) to node[near start] {3rd Step} (3);
+ \end{scope}
+ \end{tikzpicture}
+\end{figure}"""
+
+ assert output_tex == expected_tex
+ # print(output_tex)
+ # # Pretty way to assert that A.to_document() == expected_tex
+ # content_same = True
+ # for aa, bb in zip(expected_tex.split("\n"), output_tex.split("\n")):
+ # if aa != bb:
+ # content_same = False
+ # print(f"-{aa}|\n+{bb}|")
+ # assert content_same
+
+
+def test_basic_multiple_graphs():
+ H1 = nx.path_graph(4)
+ H2 = nx.complete_graph(4)
+ H3 = nx.path_graph(8)
+ H4 = nx.complete_graph(8)
+ captions = [
+ "Path on 4 nodes",
+ "Complete graph on 4 nodes",
+ "Path on 8 nodes",
+ "Complete graph on 8 nodes",
+ ]
+ labels = ["fig2a", "fig2b", "fig2c", "fig2d"]
+ latex_code = nx.to_latex(
+ [H1, H2, H3, H4],
+ n_rows=2,
+ sub_captions=captions,
+ sub_labels=labels,
+ )
+ # print(latex_code)
+ assert "begin{document}" in latex_code
+ assert "begin{figure}" in latex_code
+ assert latex_code.count("begin{subfigure}") == 4
+ assert latex_code.count("tikzpicture") == 8
+ assert latex_code.count("[-]") == 4
+
+
+def test_basic_tikz():
+ expected_tex = r"""\documentclass{report}
+\usepackage{tikz}
+\usepackage{subcaption}
+
+\begin{document}
+\begin{figure}
+ \begin{subfigure}{0.5\textwidth}
+ \begin{tikzpicture}[scale=2]
+ \draw[gray!90]
+ (0.749, 0.702) node[red!90] (0){0}
+ (1.0, -0.014) node[red!90] (1){1}
+ (-0.777, -0.705) node (2){2}
+ (-0.984, 0.042) node (3){3}
+ (-0.028, 0.375) node[cyan!90] (4){4}
+ (-0.412, 0.888) node (5){5}
+ (0.448, -0.856) node (6){6}
+ (0.003, -0.431) node[cyan!90] (7){7};
+ \begin{scope}[->,gray!90]
+ \draw (0) to (4);
+ \draw (0) to (5);
+ \draw (0) to (6);
+ \draw (0) to (7);
+ \draw (1) to (4);
+ \draw (1) to (5);
+ \draw (1) to (6);
+ \draw (1) to (7);
+ \draw (2) to (4);
+ \draw (2) to (5);
+ \draw (2) to (6);
+ \draw (2) to (7);
+ \draw (3) to (4);
+ \draw (3) to (5);
+ \draw (3) to (6);
+ \draw (3) to (7);
+ \end{scope}
+ \end{tikzpicture}
+ \caption{My tikz number 1 of 2}\label{tikz_1_2}
+ \end{subfigure}
+ \begin{subfigure}{0.5\textwidth}
+ \begin{tikzpicture}[scale=2]
+ \draw[gray!90]
+ (0.749, 0.702) node[green!90] (0){0}
+ (1.0, -0.014) node[green!90] (1){1}
+ (-0.777, -0.705) node (2){2}
+ (-0.984, 0.042) node (3){3}
+ (-0.028, 0.375) node[purple!90] (4){4}
+ (-0.412, 0.888) node (5){5}
+ (0.448, -0.856) node (6){6}
+ (0.003, -0.431) node[purple!90] (7){7};
+ \begin{scope}[->,gray!90]
+ \draw (0) to (4);
+ \draw (0) to (5);
+ \draw (0) to (6);
+ \draw (0) to (7);
+ \draw (1) to (4);
+ \draw (1) to (5);
+ \draw (1) to (6);
+ \draw (1) to (7);
+ \draw (2) to (4);
+ \draw (2) to (5);
+ \draw (2) to (6);
+ \draw (2) to (7);
+ \draw (3) to (4);
+ \draw (3) to (5);
+ \draw (3) to (6);
+ \draw (3) to (7);
+ \end{scope}
+ \end{tikzpicture}
+ \caption{My tikz number 2 of 2}\label{tikz_2_2}
+ \end{subfigure}
+ \caption{A graph generated with python and latex.}
+\end{figure}
+\end{document}"""
+
+ edges = [
+ (0, 4),
+ (0, 5),
+ (0, 6),
+ (0, 7),
+ (1, 4),
+ (1, 5),
+ (1, 6),
+ (1, 7),
+ (2, 4),
+ (2, 5),
+ (2, 6),
+ (2, 7),
+ (3, 4),
+ (3, 5),
+ (3, 6),
+ (3, 7),
+ ]
+ G = nx.DiGraph()
+ G.add_nodes_from(range(8))
+ G.add_edges_from(edges)
+ pos = {
+ 0: (0.7490296171687696, 0.702353520257394),
+ 1: (1.0, -0.014221357723796535),
+ 2: (-0.7765783344161441, -0.7054170966808919),
+ 3: (-0.9842690223417624, 0.04177547602465483),
+ 4: (-0.02768523817180917, 0.3745724439551441),
+ 5: (-0.41154855146767433, 0.8880106515525136),
+ 6: (0.44780153389148264, -0.8561492709269164),
+ 7: (0.0032499953371383505, -0.43092436645809945),
+ }
+
+ rc_node_color = {0: "red!90", 1: "red!90", 4: "cyan!90", 7: "cyan!90"}
+ gp_node_color = {0: "green!90", 1: "green!90", 4: "purple!90", 7: "purple!90"}
+
+ H = G.copy()
+ nx.set_node_attributes(G, rc_node_color, "color")
+ nx.set_node_attributes(H, gp_node_color, "color")
+
+ sub_captions = ["My tikz number 1 of 2", "My tikz number 2 of 2"]
+ sub_labels = ["tikz_1_2", "tikz_2_2"]
+
+ output_tex = nx.to_latex(
+ [G, H],
+ [pos, pos],
+ tikz_options="[scale=2]",
+ default_node_options="gray!90",
+ default_edge_options="gray!90",
+ node_options="color",
+ sub_captions=sub_captions,
+ sub_labels=sub_labels,
+ caption="A graph generated with python and latex.",
+ n_rows=2,
+ as_document=True,
+ )
+
+ assert output_tex == expected_tex
+ # print(output_tex)
+ # # Pretty way to assert that A.to_document() == expected_tex
+ # content_same = True
+ # for aa, bb in zip(expected_tex.split("\n"), output_tex.split("\n")):
+ # if aa != bb:
+ # content_same = False
+ # print(f"-{aa}|\n+{bb}|")
+ # assert content_same
+
+
+def test_exception_pos_single_graph(to_latex=nx.to_latex):
+ # smoke test that pos can be a string
+ G = nx.path_graph(4)
+ to_latex(G, pos="pos")
+
+ # must include all nodes
+ pos = {0: (1, 2), 1: (0, 1), 2: (2, 1)}
+ with pytest.raises(nx.NetworkXError):
+ to_latex(G, pos)
+
+ # must have 2 values
+ pos[3] = (1, 2, 3)
+ with pytest.raises(nx.NetworkXError):
+ to_latex(G, pos)
+ pos[3] = 2
+ with pytest.raises(nx.NetworkXError):
+ to_latex(G, pos)
+
+ # check that passes with 2 values
+ pos[3] = (3, 2)
+ to_latex(G, pos)
+
+
+def test_exception_multiple_graphs(to_latex=nx.to_latex):
+ G = nx.path_graph(3)
+ pos_bad = {0: (1, 2), 1: (0, 1)}
+ pos_OK = {0: (1, 2), 1: (0, 1), 2: (2, 1)}
+ fourG = [G, G, G, G]
+ fourpos = [pos_OK, pos_OK, pos_OK, pos_OK]
+
+ # input single dict to use for all graphs
+ to_latex(fourG, pos_OK)
+ with pytest.raises(nx.NetworkXError):
+ to_latex(fourG, pos_bad)
+
+ # input list of dicts to use for all graphs
+ to_latex(fourG, fourpos)
+ with pytest.raises(nx.NetworkXError):
+ to_latex(fourG, [pos_bad, pos_bad, pos_bad, pos_bad])
+
+ # every pos dict must include all nodes
+ with pytest.raises(nx.NetworkXError):
+ to_latex(fourG, [pos_OK, pos_OK, pos_bad, pos_OK])
+
+ # test sub_captions and sub_labels (len must match Gbunch)
+ with pytest.raises(nx.NetworkXError):
+ to_latex(fourG, fourpos, sub_captions=["hi", "hi"])
+
+ with pytest.raises(nx.NetworkXError):
+ to_latex(fourG, fourpos, sub_labels=["hi", "hi"])
+
+ # all pass
+ to_latex(fourG, fourpos, sub_captions=["hi"] * 4, sub_labels=["lbl"] * 4)
+
+
+def test_exception_multigraph():
+ G = nx.path_graph(4, create_using=nx.MultiGraph)
+ G.add_edge(1, 2)
+ with pytest.raises(nx.NetworkXNotImplemented):
+ nx.to_latex(G)