Skip to content

Commit

Permalink
Merge pull request #360 from zxcalc/bug/loading-multigraph
Browse files Browse the repository at this point in the history
Fix ZXLive not loading graphs as Multigraphs with auto simplify disabled
  • Loading branch information
jvdwetering authored Oct 23, 2024
2 parents 8d6fceb + faade97 commit 1dbd206
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
2 changes: 2 additions & 0 deletions zxlive/custom_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ def from_json(cls, json_str: Union[str,Dict[str,Any]]) -> "CustomRule":
rhs_graph = GraphT.from_json(d['rhs_graph'])
# Mypy issue: https://github.com/python/mypy/issues/11673
assert (isinstance(lhs_graph, GraphT) and isinstance(rhs_graph, GraphT)) # type: ignore
lhs_graph.set_auto_simplify(False)
rhs_graph.set_auto_simplify(False)
return cls(lhs_graph, rhs_graph, d['name'], d['description'])

def to_rewrite_data(self) -> "RewriteData":
Expand Down
31 changes: 24 additions & 7 deletions zxlive/dialogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,25 +139,42 @@ def import_diagram_from_file(file_path: str, selected_filter: str = FileFormat.A
elif selected_format == FileFormat.ZXRule:
return ImportRuleOutput(selected_format, file_path, CustomRule.from_json(data))
elif selected_format in (FileFormat.QGraph, FileFormat.Json):
return ImportGraphOutput(selected_format, file_path, GraphT.from_json(data)) # type: ignore # This is something that needs to be better annotated in PyZX
g = GraphT.from_json(data)
if TYPE_CHECKING: assert isinstance(g, GraphT)
g.set_auto_simplify(False)
return ImportGraphOutput(selected_format, file_path, g) # type: ignore # This is something that needs to be better annotated in PyZX
elif selected_format == FileFormat.QASM:
return ImportGraphOutput(selected_format, file_path, Circuit.from_qasm(data).to_graph()) # type: ignore
g = Circuit.from_qasm(data).to_graph(zh=True,backend='multigraph')
if TYPE_CHECKING: assert isinstance(g, GraphT)
g.set_auto_simplify(False)
return ImportGraphOutput(selected_format, file_path, ) # type: ignore
elif selected_format == FileFormat.TikZ:
try:
return ImportGraphOutput(selected_format, file_path, GraphT.from_tikz(data)) # type: ignore
g = GraphT.from_tikz(data)
if TYPE_CHECKING: assert isinstance(g, GraphT)
g.set_auto_simplify(False)
return ImportGraphOutput(selected_format, file_path, g) # type: ignore
except ValueError:
raise ValueError("Probable reason: attempted to import a proof from TikZ, which is not supported.")
else:
assert selected_format == FileFormat.All
try:
circ = Circuit.load(file_path)
return ImportGraphOutput(FileFormat.QASM, file_path, circ.to_graph()) # type: ignore
g = Circuit.load(file_path).to_graph(zh=True,backend='multigraph')
if TYPE_CHECKING: assert isinstance(g, GraphT)
g.set_auto_simplify(False)
return ImportGraphOutput(FileFormat.QASM, file_path, g) # type: ignore
except TypeError:
try:
return ImportGraphOutput(FileFormat.QGraph, file_path, GraphT.from_json(data)) # type: ignore
g = GraphT.from_json(data)
if TYPE_CHECKING: assert isinstance(g, GraphT)
g.set_auto_simplify(False)
return ImportGraphOutput(FileFormat.QGraph, file_path, g) # type: ignore
except Exception:
try:
return ImportGraphOutput(FileFormat.TikZ, file_path, GraphT.from_tikz(data)) # type: ignore
g = GraphT.from_tikz(data)
if TYPE_CHECKING: assert isinstance(g, GraphT)
g.set_auto_simplify(False)
return ImportGraphOutput(FileFormat.TikZ, file_path, g) # type: ignore
except:
show_error_msg(f"Failed to import {selected_format.name} file",
f"Couldn't determine filetype: {file_path}.", parent=parent)
Expand Down
1 change: 1 addition & 0 deletions zxlive/editor_base_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ def add_vert(self, x: float, y: float, edges: list[EItem]) -> None:

def add_edge(self, u: VT, v: VT, verts: list[VItem]) -> None:
"""Add an edge between vertices u and v. `verts` is a list of VItems that collide with the edge.
If self.snap_vertex_edge is true, then we try to connect `u` through all the `vertices` in `verts`, and then to `v`.
"""
cmd: BaseCommand
graph = self.graph_view.graph_scene.g
Expand Down
4 changes: 3 additions & 1 deletion zxlive/proof.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def from_json(json_str: Union[str,Dict[str,Any]]) -> "Rewrite":
grouped_rewrites = d.get("grouped_rewrites")
graph = GraphT.from_json(d["graph"])
assert isinstance(graph, GraphT)
graph.set_auto_simplify(False)

return Rewrite(
display_name=d.get("display_name", d["rule"]), # Old proofs may not have display names
Expand Down Expand Up @@ -213,7 +214,8 @@ def from_json(json_str: Union[str,Dict[str,Any]]) -> "ProofModel":
d = json_str
initial_graph = GraphT.from_json(d["initial_graph"])
# Mypy issue: https://github.com/python/mypy/issues/11673
assert isinstance(initial_graph, GraphT) # type: ignore
if TYPE_CHECKING: assert isinstance(initial_graph, GraphT)
initial_graph.set_auto_simplify(False)
model = ProofModel(initial_graph)
for step in d["proof_steps"]:
rewrite = Rewrite.from_json(step)
Expand Down

0 comments on commit 1dbd206

Please sign in to comment.