@@ -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
8469end
@@ -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