@@ -11,7 +11,6 @@ function hasscalings(xs)
11
11
end
12
12
end
13
13
_isa (T) = x-> isa (x,T)
14
- _isequal (obj) = x-> (x== obj)
15
14
_vecisa (T) = x-> all (_isa (T), x)
16
15
17
16
# #
@@ -33,36 +32,36 @@ RULES_PAULI = [
33
32
@rule (~ o1:: _isa (HGate)* ~ o2:: _isa (YGate)* ~ o3:: _isa (HGate) => - Y),
34
33
@rule (~ o1:: _isa (HGate)* ~ o2:: _isa (ZGate)* ~ o3:: _isa (HGate) => X),
35
34
36
- @rule (~ o:: _isa (XGate)* ~ k:: _isequal (X1) => X1),
37
- @rule (~ o:: _isa (YGate)* ~ k:: _isequal (X1) => - im* X2),
38
- @rule (~ o:: _isa (ZGate)* ~ k:: _isequal (X1) => X2),
35
+ @rule (~ o:: _isa (XGate)* ~ k:: isequal (X1) => X1),
36
+ @rule (~ o:: _isa (YGate)* ~ k:: isequal (X1) => - im* X2),
37
+ @rule (~ o:: _isa (ZGate)* ~ k:: isequal (X1) => X2),
39
38
40
- @rule (~ o:: _isa (XGate)* ~ k:: _isequal (X2) => - X2),
41
- @rule (~ o:: _isa (YGate)* ~ k:: _isequal (X2) => im* X1),
42
- @rule (~ o:: _isa (ZGate)* ~ k:: _isequal (X2) => X1),
39
+ @rule (~ o:: _isa (XGate)* ~ k:: isequal (X2) => - X2),
40
+ @rule (~ o:: _isa (YGate)* ~ k:: isequal (X2) => im* X1),
41
+ @rule (~ o:: _isa (ZGate)* ~ k:: isequal (X2) => X1),
43
42
44
- @rule (~ o:: _isa (XGate)* ~ k:: _isequal (Y1) => im* Y2),
45
- @rule (~ o:: _isa (YGate)* ~ k:: _isequal (Y1) => Y1),
46
- @rule (~ o:: _isa (ZGate)* ~ k:: _isequal (Y1) => Y2),
43
+ @rule (~ o:: _isa (XGate)* ~ k:: isequal (Y1) => im* Y2),
44
+ @rule (~ o:: _isa (YGate)* ~ k:: isequal (Y1) => Y1),
45
+ @rule (~ o:: _isa (ZGate)* ~ k:: isequal (Y1) => Y2),
47
46
48
- @rule (~ o:: _isa (XGate)* ~ k:: _isequal (Y2) => - im* Y1),
49
- @rule (~ o:: _isa (YGate)* ~ k:: _isequal (Y2) => - Y2),
50
- @rule (~ o:: _isa (ZGate)* ~ k:: _isequal (Y2) => Y1),
47
+ @rule (~ o:: _isa (XGate)* ~ k:: isequal (Y2) => - im* Y1),
48
+ @rule (~ o:: _isa (YGate)* ~ k:: isequal (Y2) => - Y2),
49
+ @rule (~ o:: _isa (ZGate)* ~ k:: isequal (Y2) => Y1),
51
50
52
- @rule (~ o:: _isa (XGate)* ~ k:: _isequal (Z1) => Z2),
53
- @rule (~ o:: _isa (YGate)* ~ k:: _isequal (Z1) => im* Z2),
54
- @rule (~ o:: _isa (ZGate)* ~ k:: _isequal (Z1) => Z1),
51
+ @rule (~ o:: _isa (XGate)* ~ k:: isequal (Z1) => Z2),
52
+ @rule (~ o:: _isa (YGate)* ~ k:: isequal (Z1) => im* Z2),
53
+ @rule (~ o:: _isa (ZGate)* ~ k:: isequal (Z1) => Z1),
55
54
56
- @rule (~ o:: _isa (XGate)* ~ k:: _isequal (Z2) => Z1),
57
- @rule (~ o:: _isa (YGate)* ~ k:: _isequal (Z2) => - im* Z1),
58
- @rule (~ o:: _isa (ZGate)* ~ k:: _isequal (Z2) => - Z2),
55
+ @rule (~ o:: _isa (XGate)* ~ k:: isequal (Z2) => Z1),
56
+ @rule (~ o:: _isa (YGate)* ~ k:: isequal (Z2) => - im* Z1),
57
+ @rule (~ o:: _isa (ZGate)* ~ k:: isequal (Z2) => - Z2),
59
58
60
- @rule (~ o:: _isa (HGate)* ~ k:: _isequal (X1) => Z1),
61
- @rule (~ o:: _isa (HGate)* ~ k:: _isequal (X2) => Z2),
62
- @rule (~ o:: _isa (HGate)* ~ k:: _isequal (Y1) => (X1+ im* X2)/ sqrt (2 )),
63
- @rule (~ o:: _isa (HGate)* ~ k:: _isequal (Y2) => (X1- im* X2)/ sqrt (2 )),
64
- @rule (~ o:: _isa (HGate)* ~ k:: _isequal (Z1) => X1),
65
- @rule (~ o:: _isa (HGate)* ~ k:: _isequal (Z2) => X2)
59
+ @rule (~ o:: _isa (HGate)* ~ k:: isequal (X1) => Z1),
60
+ @rule (~ o:: _isa (HGate)* ~ k:: isequal (X2) => Z2),
61
+ @rule (~ o:: _isa (HGate)* ~ k:: isequal (Y1) => (X1+ im* X2)/ sqrt (2 )),
62
+ @rule (~ o:: _isa (HGate)* ~ k:: isequal (Y2) => (X1- im* X2)/ sqrt (2 )),
63
+ @rule (~ o:: _isa (HGate)* ~ k:: isequal (Z1) => X1),
64
+ @rule (~ o:: _isa (HGate)* ~ k:: isequal (Z2) => X2)
66
65
]
67
66
68
67
# Commutator identities
@@ -86,27 +85,28 @@ RULES_ANTICOMMUTATOR = [
86
85
@rule (anticommutator (~ o1:: _isa (YGate), ~ o2:: _isa (XGate)) => 0 ),
87
86
@rule (anticommutator (~ o1:: _isa (ZGate), ~ o2:: _isa (YGate)) => 0 ),
88
87
@rule (anticommutator (~ o1:: _isa (XGate), ~ o2:: _isa (ZGate)) => 0 ),
89
- @rule (commutator (~ o1:: _isa (DestroyOp), ~ o2:: _isa (CreateOp)) => IdentityOp ((~ o1). basis )),
90
- @rule (commutator (~ o1:: _isa (CreateOp), ~ o2:: _isa (DestroyOp)) => - IdentityOp ((~ o1). basis )),
88
+ @rule (commutator (~ o1:: _isa (DestroyOp), ~ o2:: _isa (CreateOp)) => IdentityOp (basis (~ o1))),
89
+ @rule (commutator (~ o1:: _isa (CreateOp), ~ o2:: _isa (DestroyOp)) => - IdentityOp (basis (~ o1))),
91
90
@rule (commutator (~ o1:: _isa (NumberOp), ~ o2:: _isa (DestroyOp)) => - (~ o2)),
92
91
@rule (commutator (~ o1:: _isa (DestroyOp), ~ o2:: _isa (NumberOp)) => (~ o1)),
93
92
@rule (commutator (~ o1:: _isa (NumberOp), ~ o2:: _isa (CreateOp)) => (~ o2)),
94
93
@rule (commutator (~ o1:: _isa (CreateOp), ~ o2:: _isa (NumberOp)) => - (~ o1))
95
94
]
96
95
97
96
RULES_FOCK = [
98
- @rule (~ o:: _isa (DestroyOp) * ~ k:: _isequal (vac) => SZeroKet ()),
97
+ @rule (~ o:: _isa (DestroyOp) * ~ k:: isequal (vac) => SZeroKet ()),
99
98
@rule (~ o:: _isa (CreateOp) * ~ k:: _isa (FockState) => Term (sqrt,[(~ k). idx+ 1 ])* FockState ((~ k). idx+ 1 )),
100
99
@rule (~ o:: _isa (DestroyOp) * ~ k:: _isa (FockState) => Term (sqrt,[(~ k). idx])* FockState ((~ k). idx- 1 )),
101
100
@rule (~ o:: _isa (NumberOp) * ~ k:: _isa (FockState) => (~ k). idx* (~ k)),
102
101
@rule (~ o:: _isa (DestroyOp) * ~ k:: _isa (CoherentState) => (~ k). alpha* (~ k)),
103
102
@rule (~ o:: _isa (PhaseShiftOp) * ~ k:: _isa (CoherentState) => CoherentState ((~ k). alpha * exp (- im* (~ o). phase))),
104
103
@rule (dagger (~ o1:: _isa (PhaseShiftOp)) * ~ o2:: _isa (DestroyOp) * ~ o1 => ~ o2* exp (- im* ((~ o1). phase))),
105
104
@rule (~ o1:: _isa (PhaseShiftOp) * ~ o2:: _isa (DestroyOp) * dagger (~ o1) => ~ o2* exp (im* ((~ o1). phase))),
106
- @rule (dagger (~ o1:: _isa (DisplaceOp)) * ~ o2:: _isa (DestroyOp) * ~ o1 => (~ o2) + (~ o1). alpha* IdentityOp ((~ o2). basis )),
107
- @rule (dagger (~ o1:: _isa (DisplaceOp)) * ~ o2:: _isa (CreateOp) * ~ o1 => (~ o2) + conj ((~ o1). alpha)* IdentityOp ((~ o2). basis )),
105
+ @rule (dagger (~ o1:: _isa (DisplaceOp)) * ~ o2:: _isa (DestroyOp) * ~ o1 => (~ o2) + (~ o1). alpha* IdentityOp (basis (~ o2))),
106
+ @rule (dagger (~ o1:: _isa (DisplaceOp)) * ~ o2:: _isa (CreateOp) * ~ o1 => (~ o2) + conj ((~ o1). alpha)* IdentityOp (basis (~ o2))),
108
107
@rule (~ o:: _isa (DisplaceOp) * ~ k:: ((x->(isa(x,FockState) && x. idx == 0 ))) => CoherentState ((~ o). alpha)),
109
- @rule (~ o:: _isa (SqueezeOp) * ~ k:: _isequal (vac) => SqueezedState ((~ o). z, (~ o). basis))
108
+ @rule (~ o:: _isa (SqueezeOp) * ~ k:: isequal (vac) => SqueezedState ((~ o). z)),
109
+ @rule (~ o:: _isa (TwoSqueezeOp) * ~ k:: isequal (vac ⊗ vac) => TwoSqueezedState ((~ o). z))
110
110
]
111
111
112
112
RULES_SIMPLIFY = [RULES_PAULI; RULES_COMMUTATOR; RULES_ANTICOMMUTATOR; RULES_FOCK]
0 commit comments