From c870865cc5d0e4fa4e4aea8e432828a158331977 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 17:03:27 -0300 Subject: [PATCH 01/13] first naive attempt at bialgebra in the other direction --- pyzx/editor_actions.py | 80 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 71aaca5f..ecdd9ac9 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -300,6 +300,75 @@ def bialgebra(g: BaseGraph[VT,ET], return (etab, rem_verts, [], False) +def match_bialgebra_op(g: BaseGraph[VT,ET], + vertexf: Optional[Callable[[VT], bool]] = None, + vertex_type: Optional[Tuple[VertexType, VertexType]] = None + ) -> Optional[Tuple[List[VT], List[VT]]]: + if vertexf is not None: candidates = set([v for v in g.vertices() if vertexf(v)]) + else: candidates = g.vertex_set() + if vertex_type is not None: + vtype1, vtype2 = vertex_type + else: + vtype1, vtype2 = VertexType.Z, VertexType.X + type1_vertices = [v for v in candidates if g.type(v) == vtype1] + type2_vertices = [v for v in candidates if g.type(v) == vtype2] + if len(type1_vertices) == 0 or len(type2_vertices) == 0: + return None + # if all type1 vertices are connected to all type2 vertices with a simple edge, then they are a match + for v1 in type1_vertices: + for v2 in type2_vertices: + edges = list(g.edges(v1, v2)) + if not (len(edges) == 1 and g.edge_type(edges[0]) == EdgeType.SIMPLE): + return None + return type1_vertices, type2_vertices + +def bialgebra_op(g: BaseGraph[VT,ET], + matches: Tuple[List[VT], List[VT]] + ) -> rules.RewriteOutputType[VT,ET]: + def get_neighbors_and_loops(type1_vertices: List[VT], type2_vertices: List[VT]) -> Tuple[List[Tuple[VT, EdgeType]], List[EdgeType]]: + neighbors: List[Tuple[VT, EdgeType]] = [] + loops: List[EdgeType] = [] + for v1 in type1_vertices: + for edge in g.incident_edges(v1): + edge_st = g.edge_st(edge) + neighbor = edge_st[0] if edge_st[0] != v1 else edge_st[1] + if neighbor in type2_vertices: + continue + elif neighbor in type1_vertices: + loops.append(g.edge_type(edge)) + else: + neighbors.append((neighbor, g.edge_type(edge))) + return neighbors, loops + type1_vertices, type2_vertices = matches + neighbors1, loops1 = get_neighbors_and_loops(type1_vertices, type2_vertices) + neighbors2, loops2 = get_neighbors_and_loops(type2_vertices, type1_vertices) + average_row1 = sum(g.row(v) for v in type1_vertices) / len(type1_vertices) + average_qubit1 = sum(g.qubit(v) for v in type1_vertices) / len(type1_vertices) + average_row2 = sum(g.row(v) for v in type2_vertices) / len(type2_vertices) + average_qubit2 = sum(g.qubit(v) for v in type2_vertices) / len(type2_vertices) + new_vertex1 = g.add_vertex(g.type(type2_vertices[0]), average_qubit1, average_row1) + new_vertex2 = g.add_vertex(g.type(type1_vertices[0]), average_qubit2, average_row2) + etab = {} + etab[upair(new_vertex1, new_vertex2)] = [1, 0] + for n, et in neighbors1: + if upair(new_vertex1, n) not in etab: + etab[upair(new_vertex1, n)] = [0, 0] + etab[upair(new_vertex1, n)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] + for n, et in neighbors2: + if upair(new_vertex2, n) not in etab: + etab[upair(new_vertex2, n)] = [0, 0] + etab[upair(new_vertex2, n)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] + for et in loops1: + if upair(new_vertex1, new_vertex1) not in etab: + etab[upair(new_vertex1, new_vertex1)] = [0, 0] + etab[upair(new_vertex1, new_vertex1)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] + for et in loops2: + if upair(new_vertex2, new_vertex2) not in etab: + etab[upair(new_vertex2, new_vertex2)] = [0, 0] + etab[upair(new_vertex2, new_vertex2)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] + rem_verts = type1_vertices + type2_vertices + return (etab, rem_verts, [], False) + MATCHES_VERTICES = 1 MATCHES_EDGES = 2 @@ -364,11 +433,16 @@ def bialgebra(g: BaseGraph[VT,ET], "matcher": pauli_matcher, "rule": pauli_push, "type": MATCHES_VERTICES}, - "bialgebra": {"text": "bialgebra", + "bialgebra": {"text": "bialgebra", "tooltip": "Applies the bialgebra rule to a connected pair of Z and X spiders", - "matcher": match_bialgebra, - "rule": bialgebra, + "matcher": match_bialgebra, + "rule": bialgebra, "type": MATCHES_EDGES}, + "bialgebra_op": {"text": "bialgebra_op", + "tooltip": "Applies the bialgebra rule to a connected pair of Z and X spiders in the opposite direction", + "matcher": match_bialgebra_op, + "rule": bialgebra_op, + "type": MATCHES_VERTICES}, "euler": {"text": "decompose Hadamard", "tooltip": "Expands a Hadamard-edge into its component spiders using its Euler decomposition", "matcher": match_hadamard_edge, From 0b0e20a15dba04703b34dc2e385c9ca0e6b07d20 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 17:24:08 -0300 Subject: [PATCH 02/13] simplified bialgebra op logic --- pyzx/editor_actions.py | 43 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index ecdd9ac9..0f510892 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -16,6 +16,7 @@ import json +from collections import defaultdict from fractions import Fraction from typing import Callable, Optional, List, Dict, Tuple @@ -339,33 +340,29 @@ def get_neighbors_and_loops(type1_vertices: List[VT], type2_vertices: List[VT]) else: neighbors.append((neighbor, g.edge_type(edge))) return neighbors, loops + + def add_vertex_with_averages(vertices, g): + average_row = sum(g.row(v) for v in vertices) / len(vertices) + average_qubit = sum(g.qubit(v) for v in vertices) / len(vertices) + return g.add_vertex(g.type(vertices[0]), average_qubit, average_row) + + def update_etab(etab, new_vertex, neighbors, loops): + for n, et in neighbors + [(new_vertex, et) for et in loops]: + etab[upair(new_vertex, n)][0 if et == EdgeType.SIMPLE else 1] = 1 + type1_vertices, type2_vertices = matches neighbors1, loops1 = get_neighbors_and_loops(type1_vertices, type2_vertices) neighbors2, loops2 = get_neighbors_and_loops(type2_vertices, type1_vertices) - average_row1 = sum(g.row(v) for v in type1_vertices) / len(type1_vertices) - average_qubit1 = sum(g.qubit(v) for v in type1_vertices) / len(type1_vertices) - average_row2 = sum(g.row(v) for v in type2_vertices) / len(type2_vertices) - average_qubit2 = sum(g.qubit(v) for v in type2_vertices) / len(type2_vertices) - new_vertex1 = g.add_vertex(g.type(type2_vertices[0]), average_qubit1, average_row1) - new_vertex2 = g.add_vertex(g.type(type1_vertices[0]), average_qubit2, average_row2) - etab = {} + + new_vertex1 = add_vertex_with_averages(type1_vertices, g) + new_vertex2 = add_vertex_with_averages(type2_vertices, g) + + etab: dict = defaultdict(lambda: [0, 0]) etab[upair(new_vertex1, new_vertex2)] = [1, 0] - for n, et in neighbors1: - if upair(new_vertex1, n) not in etab: - etab[upair(new_vertex1, n)] = [0, 0] - etab[upair(new_vertex1, n)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] - for n, et in neighbors2: - if upair(new_vertex2, n) not in etab: - etab[upair(new_vertex2, n)] = [0, 0] - etab[upair(new_vertex2, n)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] - for et in loops1: - if upair(new_vertex1, new_vertex1) not in etab: - etab[upair(new_vertex1, new_vertex1)] = [0, 0] - etab[upair(new_vertex1, new_vertex1)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] - for et in loops2: - if upair(new_vertex2, new_vertex2) not in etab: - etab[upair(new_vertex2, new_vertex2)] = [0, 0] - etab[upair(new_vertex2, new_vertex2)] = [1, 0] if et == EdgeType.SIMPLE else [0, 1] + + update_etab(etab, new_vertex1, neighbors1, loops1) + update_etab(etab, new_vertex2, neighbors2, loops2) + rem_verts = type1_vertices + type2_vertices return (etab, rem_verts, [], False) From e60b15d33cf0121523664f037a2d568fe796ffe1 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 17:31:23 -0300 Subject: [PATCH 03/13] fixing multigraph edges --- pyzx/editor_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 0f510892..060e04c4 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -348,7 +348,7 @@ def add_vertex_with_averages(vertices, g): def update_etab(etab, new_vertex, neighbors, loops): for n, et in neighbors + [(new_vertex, et) for et in loops]: - etab[upair(new_vertex, n)][0 if et == EdgeType.SIMPLE else 1] = 1 + etab[upair(new_vertex, n)][0 if et == EdgeType.SIMPLE else 1] += 1 type1_vertices, type2_vertices = matches neighbors1, loops1 = get_neighbors_and_loops(type1_vertices, type2_vertices) From 96bad36d183559a28df460b4419aa7a03281dcf8 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 17:31:48 -0300 Subject: [PATCH 04/13] new vertices should have opposite colour --- pyzx/editor_actions.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 060e04c4..b6ff1d5d 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -341,10 +341,10 @@ def get_neighbors_and_loops(type1_vertices: List[VT], type2_vertices: List[VT]) neighbors.append((neighbor, g.edge_type(edge))) return neighbors, loops - def add_vertex_with_averages(vertices, g): + def add_vertex_with_averages(vertices, g, vtype): average_row = sum(g.row(v) for v in vertices) / len(vertices) average_qubit = sum(g.qubit(v) for v in vertices) / len(vertices) - return g.add_vertex(g.type(vertices[0]), average_qubit, average_row) + return g.add_vertex(vtype, average_qubit, average_row) def update_etab(etab, new_vertex, neighbors, loops): for n, et in neighbors + [(new_vertex, et) for et in loops]: @@ -354,17 +354,15 @@ def update_etab(etab, new_vertex, neighbors, loops): neighbors1, loops1 = get_neighbors_and_loops(type1_vertices, type2_vertices) neighbors2, loops2 = get_neighbors_and_loops(type2_vertices, type1_vertices) - new_vertex1 = add_vertex_with_averages(type1_vertices, g) - new_vertex2 = add_vertex_with_averages(type2_vertices, g) + new_vertex1 = add_vertex_with_averages(type1_vertices, g, g.type(type2_vertices[0])) + new_vertex2 = add_vertex_with_averages(type2_vertices, g, g.type(type1_vertices[0])) etab: dict = defaultdict(lambda: [0, 0]) etab[upair(new_vertex1, new_vertex2)] = [1, 0] - update_etab(etab, new_vertex1, neighbors1, loops1) update_etab(etab, new_vertex2, neighbors2, loops2) - rem_verts = type1_vertices + type2_vertices - return (etab, rem_verts, [], False) + return (etab, type1_vertices + type2_vertices, [], False) MATCHES_VERTICES = 1 MATCHES_EDGES = 2 From b9449790f5ca2cd7d60207d3dcc72adf3674b293 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 17:58:51 -0300 Subject: [PATCH 05/13] add loop only once --- pyzx/editor_actions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index b6ff1d5d..b75906f1 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -336,7 +336,8 @@ def get_neighbors_and_loops(type1_vertices: List[VT], type2_vertices: List[VT]) if neighbor in type2_vertices: continue elif neighbor in type1_vertices: - loops.append(g.edge_type(edge)) + if v1 > neighbor: + loops.append(g.edge_type(edge)) else: neighbors.append((neighbor, g.edge_type(edge))) return neighbors, loops From 5861bffae2e9bcf7bdbcfda9abcab5cb62a51a33 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 19:25:44 -0300 Subject: [PATCH 06/13] add scalar --- pyzx/editor_actions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index b75906f1..ef4622e2 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -363,6 +363,8 @@ def update_etab(etab, new_vertex, neighbors, loops): update_etab(etab, new_vertex1, neighbors1, loops1) update_etab(etab, new_vertex2, neighbors2, loops2) + g.scalar.add_power(-(len(neighbors1)-1)*(len(neighbors2)-1)) #TODO: not sure if this is correct + return (etab, type1_vertices + type2_vertices, [], False) MATCHES_VERTICES = 1 From c6648b204e0571cf307be18b721ea02a23ea81be Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 19:37:37 -0300 Subject: [PATCH 07/13] add edge_type customizable --- pyzx/editor_actions.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index ef4622e2..65f4e35f 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -303,7 +303,8 @@ def bialgebra(g: BaseGraph[VT,ET], def match_bialgebra_op(g: BaseGraph[VT,ET], vertexf: Optional[Callable[[VT], bool]] = None, - vertex_type: Optional[Tuple[VertexType, VertexType]] = None + vertex_type: Optional[Tuple[VertexType, VertexType]] = None, + edge_type: Optional[EdgeType] = None ) -> Optional[Tuple[List[VT], List[VT]]]: if vertexf is not None: candidates = set([v for v in g.vertices() if vertexf(v)]) else: candidates = g.vertex_set() @@ -311,20 +312,23 @@ def match_bialgebra_op(g: BaseGraph[VT,ET], vtype1, vtype2 = vertex_type else: vtype1, vtype2 = VertexType.Z, VertexType.X + if edge_type is None: + edge_type = EdgeType.SIMPLE type1_vertices = [v for v in candidates if g.type(v) == vtype1] type2_vertices = [v for v in candidates if g.type(v) == vtype2] - if len(type1_vertices) == 0 or len(type2_vertices) == 0: + if len(type1_vertices) <= 0 or len(type2_vertices) <= 0: return None # if all type1 vertices are connected to all type2 vertices with a simple edge, then they are a match for v1 in type1_vertices: for v2 in type2_vertices: edges = list(g.edges(v1, v2)) - if not (len(edges) == 1 and g.edge_type(edges[0]) == EdgeType.SIMPLE): + if not (len(edges) == 1 and g.edge_type(edges[0]) == edge_type): return None return type1_vertices, type2_vertices def bialgebra_op(g: BaseGraph[VT,ET], - matches: Tuple[List[VT], List[VT]] + matches: Tuple[List[VT], List[VT]], + edge_type: Optional[EdgeType] = EdgeType.SIMPLE ) -> rules.RewriteOutputType[VT,ET]: def get_neighbors_and_loops(type1_vertices: List[VT], type2_vertices: List[VT]) -> Tuple[List[Tuple[VT, EdgeType]], List[EdgeType]]: neighbors: List[Tuple[VT, EdgeType]] = [] @@ -359,7 +363,10 @@ def update_etab(etab, new_vertex, neighbors, loops): new_vertex2 = add_vertex_with_averages(type2_vertices, g, g.type(type1_vertices[0])) etab: dict = defaultdict(lambda: [0, 0]) - etab[upair(new_vertex1, new_vertex2)] = [1, 0] + if edge_type == EdgeType.SIMPLE: + etab[upair(new_vertex1, new_vertex2)] = [1, 0] + else: + etab[upair(new_vertex1, new_vertex2)] = [0, 1] update_etab(etab, new_vertex1, neighbors1, loops1) update_etab(etab, new_vertex2, neighbors2, loops2) From 9dc58422ddd37cebf57ec00fa4dd5f0a26c1ea07 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 19:41:27 -0300 Subject: [PATCH 08/13] fix a bug in matcher --- pyzx/editor_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 65f4e35f..16656215 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -316,7 +316,7 @@ def match_bialgebra_op(g: BaseGraph[VT,ET], edge_type = EdgeType.SIMPLE type1_vertices = [v for v in candidates if g.type(v) == vtype1] type2_vertices = [v for v in candidates if g.type(v) == vtype2] - if len(type1_vertices) <= 0 or len(type2_vertices) <= 0: + if len(type1_vertices) <= 1 or len(type2_vertices) <= 1: return None # if all type1 vertices are connected to all type2 vertices with a simple edge, then they are a match for v1 in type1_vertices: From 3c16e011b566ba4323283c4fbd38d3d7446a977d Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 20:02:39 -0300 Subject: [PATCH 09/13] bialgebra vertices must have one external edge --- pyzx/editor_actions.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 16656215..32a14288 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -318,6 +318,13 @@ def match_bialgebra_op(g: BaseGraph[VT,ET], type2_vertices = [v for v in candidates if g.type(v) == vtype2] if len(type1_vertices) <= 1 or len(type2_vertices) <= 1: return None + # the vertices must have one external edge + for v1 in type1_vertices: + if g.vertex_degree(v1) != len(type2_vertices) + 1: + return None + for v2 in type2_vertices: + if g.vertex_degree(v2) != len(type1_vertices) + 1: + return None # if all type1 vertices are connected to all type2 vertices with a simple edge, then they are a match for v1 in type1_vertices: for v2 in type2_vertices: From 6e2542711ec9afe08a42edafa4c0500532201b04 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 20:03:49 -0300 Subject: [PATCH 10/13] whitespace --- pyzx/editor_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 32a14288..b40cbf7c 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -300,7 +300,6 @@ def bialgebra(g: BaseGraph[VT,ET], g.scalar.add_power((g.vertex_degree(v1)-2)*(g.vertex_degree(v2)-2)) return (etab, rem_verts, [], False) - def match_bialgebra_op(g: BaseGraph[VT,ET], vertexf: Optional[Callable[[VT], bool]] = None, vertex_type: Optional[Tuple[VertexType, VertexType]] = None, @@ -381,6 +380,7 @@ def update_etab(etab, new_vertex, neighbors, loops): return (etab, type1_vertices + type2_vertices, [], False) + MATCHES_VERTICES = 1 MATCHES_EDGES = 2 From 5d32e3578537c3c6af8de0ab9f109e909629d387 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 20:06:10 -0300 Subject: [PATCH 11/13] flipped bialgebra and op --- pyzx/editor_actions.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index b40cbf7c..19795218 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -221,7 +221,7 @@ def add_Z_identity(g: BaseGraph[VT,ET], etab[upair(v2,w)] = [1,0] return (etab, [], rem_edges, False) -def match_bialgebra(g: BaseGraph[VT,ET], +def match_bialgebra_op(g: BaseGraph[VT,ET], edgef: Optional[Callable[[ET],bool]] = None ) -> List[Tuple[VT,VT]]: if edgef is not None: candidates = set([e for e in g.edges() if edgef(e)]) @@ -252,7 +252,7 @@ def match_bialgebra(g: BaseGraph[VT,ET], candidates.difference_update(g.incident_edges(n)) return m -def bialgebra(g: BaseGraph[VT,ET], +def bialgebra_op(g: BaseGraph[VT,ET], matches: List[Tuple[VT,VT]] ) -> rules.RewriteOutputType[VT,ET]: rem_verts = [] @@ -300,7 +300,7 @@ def bialgebra(g: BaseGraph[VT,ET], g.scalar.add_power((g.vertex_degree(v1)-2)*(g.vertex_degree(v2)-2)) return (etab, rem_verts, [], False) -def match_bialgebra_op(g: BaseGraph[VT,ET], +def match_bialgebra(g: BaseGraph[VT,ET], vertexf: Optional[Callable[[VT], bool]] = None, vertex_type: Optional[Tuple[VertexType, VertexType]] = None, edge_type: Optional[EdgeType] = None @@ -332,7 +332,7 @@ def match_bialgebra_op(g: BaseGraph[VT,ET], return None return type1_vertices, type2_vertices -def bialgebra_op(g: BaseGraph[VT,ET], +def bialgebra(g: BaseGraph[VT,ET], matches: Tuple[List[VT], List[VT]], edge_type: Optional[EdgeType] = EdgeType.SIMPLE ) -> rules.RewriteOutputType[VT,ET]: @@ -450,7 +450,7 @@ def update_etab(etab, new_vertex, neighbors, loops): "matcher": match_bialgebra, "rule": bialgebra, "type": MATCHES_EDGES}, - "bialgebra_op": {"text": "bialgebra_op", + "bialgebra_op": {"text": "bialgebra (inverse)", "tooltip": "Applies the bialgebra rule to a connected pair of Z and X spiders in the opposite direction", "matcher": match_bialgebra_op, "rule": bialgebra_op, From 3b7007d455e6c1b12e600bd8f5d253212322377a Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Sat, 20 Jul 2024 20:12:49 -0300 Subject: [PATCH 12/13] undo last commit --- pyzx/editor_actions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 19795218..4b3e65fc 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -221,7 +221,7 @@ def add_Z_identity(g: BaseGraph[VT,ET], etab[upair(v2,w)] = [1,0] return (etab, [], rem_edges, False) -def match_bialgebra_op(g: BaseGraph[VT,ET], +def match_bialgebra(g: BaseGraph[VT,ET], edgef: Optional[Callable[[ET],bool]] = None ) -> List[Tuple[VT,VT]]: if edgef is not None: candidates = set([e for e in g.edges() if edgef(e)]) @@ -252,7 +252,7 @@ def match_bialgebra_op(g: BaseGraph[VT,ET], candidates.difference_update(g.incident_edges(n)) return m -def bialgebra_op(g: BaseGraph[VT,ET], +def bialgebra(g: BaseGraph[VT,ET], matches: List[Tuple[VT,VT]] ) -> rules.RewriteOutputType[VT,ET]: rem_verts = [] @@ -300,7 +300,7 @@ def bialgebra_op(g: BaseGraph[VT,ET], g.scalar.add_power((g.vertex_degree(v1)-2)*(g.vertex_degree(v2)-2)) return (etab, rem_verts, [], False) -def match_bialgebra(g: BaseGraph[VT,ET], +def match_bialgebra_op(g: BaseGraph[VT,ET], vertexf: Optional[Callable[[VT], bool]] = None, vertex_type: Optional[Tuple[VertexType, VertexType]] = None, edge_type: Optional[EdgeType] = None @@ -332,7 +332,7 @@ def match_bialgebra(g: BaseGraph[VT,ET], return None return type1_vertices, type2_vertices -def bialgebra(g: BaseGraph[VT,ET], +def bialgebra_op(g: BaseGraph[VT,ET], matches: Tuple[List[VT], List[VT]], edge_type: Optional[EdgeType] = EdgeType.SIMPLE ) -> rules.RewriteOutputType[VT,ET]: From df8c9a2bd284360e12ee5a169f1c45f2e508a596 Mon Sep 17 00:00:00 2001 From: Razin Shaikh Date: Wed, 31 Jul 2024 17:20:52 +0100 Subject: [PATCH 13/13] removed the scalar todo --- pyzx/editor_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyzx/editor_actions.py b/pyzx/editor_actions.py index 4b3e65fc..24a7529f 100644 --- a/pyzx/editor_actions.py +++ b/pyzx/editor_actions.py @@ -376,7 +376,7 @@ def update_etab(etab, new_vertex, neighbors, loops): update_etab(etab, new_vertex1, neighbors1, loops1) update_etab(etab, new_vertex2, neighbors2, loops2) - g.scalar.add_power(-(len(neighbors1)-1)*(len(neighbors2)-1)) #TODO: not sure if this is correct + g.scalar.add_power(-(len(neighbors1)-1)*(len(neighbors2)-1)) return (etab, type1_vertices + type2_vertices, [], False)