Skip to content

Commit 0ddac76

Browse files
committed
fix IdentityRemoval
1 parent 5943979 commit 0ddac76

File tree

1 file changed

+14
-29
lines changed

1 file changed

+14
-29
lines changed

src/ZX/rules/identity_remove.jl

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,7 @@ function Base.match(::IdentityRemovalRule, zxg::ZXGraph{T, P}) where {T, P}
1212
if spider_type(zxg, v2) == SpiderType.Z && length(nb2) == 2
1313
v1, v3 = nb2
1414
if is_zero_phase(phase(zxg, v2))
15-
if spider_type(zxg, v1) == spider_type(zxg, v3) == SpiderType.Z
16-
if is_hadamard(zxg, v1, v2) && is_hadamard(zxg, v2, v3)
17-
push!(matches, Match{T}([v1, v2, v3]))
18-
end
19-
elseif (spider_type(zxg, v1) in (SpiderType.In, SpiderType.Out)) &&
20-
(spider_type(zxg, v3) in (SpiderType.In, SpiderType.Out))
21-
push!(matches, Match{T}([v1, v2, v3]))
22-
end
15+
push!(matches, Match{T}([v1, v2, v3]))
2316
elseif is_one_phase(phase(zxg, v2))
2417
if spider_type(zxg, v1) == spider_type(zxg, v3) == SpiderType.Z
2518
is_hadamard(zxg, v2, v3) || continue
@@ -43,15 +36,8 @@ function check_rule(::IdentityRemovalRule, zxg::ZXGraph{T, P}, vs::Vector{T}) wh
4336
if spider_type(zxg, v2) == SpiderType.Z && length(nb2) == 2
4437
(v1 in nb2 && v3 in nb2) || return false
4538
if is_zero_phase(phase(zxg, v2))
46-
if spider_type(zxg, v1) == spider_type(zxg, v3) == SpiderType.Z
47-
return is_hadamard(zxg, v1, v2) && is_hadamard(zxg, v2, v3)
48-
end
49-
if (spider_type(zxg, v1) in (SpiderType.In, SpiderType.Out)) &&
50-
(spider_type(zxg, v3) in (SpiderType.In, SpiderType.Out))
51-
return true
52-
end
53-
else
54-
is_one_phase(phase(zxg, v2))
39+
return true
40+
elseif is_one_phase(phase(zxg, v2))
5541
if spider_type(zxg, v1) == spider_type(zxg, v3) == SpiderType.Z
5642
return degree(zxg, v1) == 1 && is_hadamard(zxg, v2, v3) && is_hadamard(zxg, v2, v1)
5743
end
@@ -67,18 +53,17 @@ function rewrite!(::IdentityRemovalRule, zxg::ZXGraph{T, P}, vs::Vector{T}) wher
6753
set_phase!(zxg, v2, zero(P))
6854
set_phase!(zxg, v1, -phase(zxg, v1))
6955
end
70-
if (spider_type(zxg, v1) in (SpiderType.In, SpiderType.Out)) ||
71-
(spider_type(zxg, v3) in (SpiderType.In, SpiderType.Out))
56+
if spider_type(zxg, v1) == spider_type(zxg, v3) == SpiderType.Z &&
57+
edge_type(zxg, v1, v2) == edge_type(zxg, v2, v3)
7258
rem_spider!(zxg, v2)
73-
et = (edge_type(zxg, v1, v2) == edge_type(zxg, v2, v3)) ? EdgeType.HAD : EdgeType.SIM
74-
add_edge!(zxg, v1, v3, et)
75-
else
76-
set_phase!(zxg, v3, phase(zxg, v3)+phase(zxg, v1))
77-
for v in neighbors(zxg, v1)
78-
v == v2 && continue
79-
add_edge!(zxg, v, v3, edge_type(zxg, v, v1))
59+
if v1 != v3
60+
add_edge!(zxg, v1, v3, EdgeType.SIM)
61+
rewrite!(FusionRule(), zxg, Match{T}([v1, v3]))
8062
end
81-
rem_spiders!(zxg, [v1, v2])
63+
else
64+
et = (edge_type(zxg, v1, v2) == edge_type(zxg, v2, v3)) ? EdgeType.SIM : EdgeType.HAD
65+
rem_spider!(zxg, v2)
66+
add_edge!(zxg, v1, v3, et)
8267
end
8368
return zxg
8469
end
@@ -89,8 +74,8 @@ function rewrite!(::IdentityRemovalRule, circ::ZXCircuit{T, P}, vs::Vector{T}) w
8974
@assert flip_phase_tracking_sign!(circ, v1) "failed to flip phase tracking sign for $v1"
9075
end
9176

92-
if spider_type(circ, v1) == spider_type(circ, v3) == SpiderType.Z
93-
@assert merge_phase_tracking!(circ, v1, v3) "failed to merge phase tracking id from $v1 to $v3"
77+
if spider_type(circ, v1) == spider_type(circ, v3) == SpiderType.Z && v1 != v3
78+
@assert merge_phase_tracking!(circ, v3, v1) "failed to merge phase tracking id from $v3 to $v1"
9479
end
9580

9681
rewrite!(IdentityRemovalRule(), circ.zx_graph, vs)

0 commit comments

Comments
 (0)