Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 7c9644a

Browse files
authored
Merge pull request #144 from cda-tum/gate-extensions
✨ Two-Qubit Gate Extensions
2 parents 274b040 + c5efb23 commit 7c9644a

3 files changed

Lines changed: 591 additions & 6 deletions

File tree

include/dd/GateMatrixDefinitions.hpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,106 @@ namespace dd {
8383
complex_zero,
8484
{std::cos(lambda / 2.), std::sin(lambda / 2.)}}};
8585
}
86+
87+
using TwoQubitGateMatrix = std::array<std::array<ComplexValue, NEDGE>, NEDGE>;
88+
constexpr TwoQubitGateMatrix CXmat{{{complex_one, complex_zero, complex_zero, complex_zero},
89+
{complex_zero, complex_one, complex_zero, complex_zero},
90+
{complex_zero, complex_zero, complex_zero, complex_one},
91+
{complex_zero, complex_zero, complex_one, complex_zero}}};
92+
93+
constexpr TwoQubitGateMatrix CZmat{{{complex_one, complex_zero, complex_zero, complex_zero},
94+
{complex_zero, complex_one, complex_zero, complex_zero},
95+
{complex_zero, complex_zero, complex_one, complex_zero},
96+
{complex_zero, complex_zero, complex_zero, complex_mone}}};
97+
98+
constexpr TwoQubitGateMatrix SWAPmat{{{complex_one, complex_zero, complex_zero, complex_zero},
99+
{complex_zero, complex_zero, complex_one, complex_zero},
100+
{complex_zero, complex_one, complex_zero, complex_zero},
101+
{complex_zero, complex_zero, complex_zero, complex_one}}};
102+
103+
constexpr TwoQubitGateMatrix iSWAPmat{{{complex_one, complex_zero, complex_zero, complex_zero},
104+
{complex_zero, complex_zero, complex_i, complex_zero},
105+
{complex_zero, complex_i, complex_zero, complex_zero},
106+
{complex_zero, complex_zero, complex_zero, complex_one}}};
107+
108+
constexpr TwoQubitGateMatrix iSWAPinvmat{{{complex_one, complex_zero, complex_zero, complex_zero},
109+
{complex_zero, complex_zero, complex_mi, complex_zero},
110+
{complex_zero, complex_mi, complex_zero, complex_zero},
111+
{complex_zero, complex_zero, complex_zero, complex_one}}};
112+
113+
constexpr TwoQubitGateMatrix ECRmat{{{complex_zero, complex_zero, complex_SQRT2_2, complex_iSQRT2_2},
114+
{complex_zero, complex_zero, complex_iSQRT2_2, complex_SQRT2_2},
115+
{complex_SQRT2_2, complex_miSQRT2_2, complex_zero, complex_zero},
116+
{complex_miSQRT2_2, complex_SQRT2_2, complex_zero, complex_zero}}};
117+
118+
constexpr TwoQubitGateMatrix DCXmat{{{complex_one, complex_zero, complex_zero, complex_zero},
119+
{complex_zero, complex_zero, complex_zero, complex_one},
120+
{complex_zero, complex_one, complex_zero, complex_zero},
121+
{complex_zero, complex_zero, complex_one, complex_zero}}};
122+
123+
inline TwoQubitGateMatrix RXXmat(const fp theta) {
124+
const auto cosTheta = std::cos(theta / 2.);
125+
const auto sinTheta = std::sin(theta / 2.);
126+
127+
return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0.}, complex_zero, complex_zero, ComplexValue{0., -sinTheta}},
128+
{complex_zero, ComplexValue{cosTheta, 0.}, ComplexValue{0., -sinTheta}, complex_zero},
129+
{complex_zero, ComplexValue{0., -sinTheta}, ComplexValue{cosTheta, 0.}, complex_zero},
130+
{ComplexValue{0., -sinTheta}, complex_zero, complex_zero, ComplexValue{cosTheta, 0.}}}};
131+
}
132+
133+
inline TwoQubitGateMatrix RYYmat(const fp theta) {
134+
const auto cosTheta = std::cos(theta / 2.);
135+
const auto sinTheta = std::sin(theta / 2.);
136+
137+
return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0.}, complex_zero, complex_zero, ComplexValue{0., sinTheta}},
138+
{complex_zero, ComplexValue{cosTheta, 0.}, ComplexValue{0., -sinTheta}, complex_zero},
139+
{complex_zero, ComplexValue{0., -sinTheta}, ComplexValue{cosTheta, 0.}, complex_zero},
140+
{ComplexValue{0., sinTheta}, complex_zero, complex_zero, ComplexValue{cosTheta, 0.}}}};
141+
}
142+
143+
inline TwoQubitGateMatrix RZZmat(const fp theta) {
144+
const auto cosTheta = std::cos(theta / 2.);
145+
const auto sinTheta = std::sin(theta / 2.);
146+
147+
return TwoQubitGateMatrix{{{ComplexValue{cosTheta, -sinTheta}, complex_zero, complex_zero, complex_zero},
148+
{complex_zero, ComplexValue{cosTheta, sinTheta}, complex_zero, complex_zero},
149+
{complex_zero, complex_zero, ComplexValue{cosTheta, sinTheta}, complex_zero},
150+
{complex_zero, complex_zero, complex_zero, ComplexValue{cosTheta, -sinTheta}}}};
151+
}
152+
153+
inline TwoQubitGateMatrix RZXmat(const fp theta) {
154+
const auto cosTheta = std::cos(theta / 2.);
155+
const auto sinTheta = std::sin(theta / 2.);
156+
157+
return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0.}, ComplexValue{0., -sinTheta}, complex_zero, complex_zero},
158+
{ComplexValue{0., -sinTheta}, ComplexValue{cosTheta, 0.}, complex_zero, complex_zero},
159+
{complex_zero, complex_zero, ComplexValue{cosTheta, 0.}, ComplexValue{0., sinTheta}},
160+
{complex_zero, complex_zero, ComplexValue{0., sinTheta}, ComplexValue{cosTheta, 0.}}}};
161+
}
162+
163+
inline TwoQubitGateMatrix XXMinusYYmat(const fp theta, const fp beta = 0.) {
164+
const auto cosTheta = std::cos(theta / 2.);
165+
const auto sinTheta = std::sin(theta / 2.);
166+
const auto cosBeta = std::cos(beta);
167+
const auto sinBeta = std::sin(beta);
168+
169+
return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0.}, complex_zero, complex_zero, ComplexValue{sinBeta * sinTheta, -cosBeta * sinTheta}},
170+
{complex_zero, complex_one, complex_zero, complex_zero},
171+
{complex_zero, complex_zero, complex_one, complex_zero},
172+
{ComplexValue{-sinBeta * sinTheta, -cosBeta * sinTheta}, complex_zero, complex_zero, ComplexValue{cosTheta, 0.}}}};
173+
}
174+
175+
inline TwoQubitGateMatrix XXPlusYYmat(const fp theta, const fp beta = 0.) {
176+
const auto cosTheta = std::cos(theta / 2.);
177+
const auto sinTheta = std::sin(theta / 2.);
178+
const auto cosBeta = std::cos(beta);
179+
const auto sinBeta = std::sin(beta);
180+
181+
return TwoQubitGateMatrix{{{complex_one, complex_zero, complex_zero, complex_zero},
182+
{complex_zero, ComplexValue{cosTheta, 0.}, ComplexValue{sinBeta * sinTheta, -cosBeta * sinTheta}, complex_zero},
183+
{complex_zero, ComplexValue{-sinBeta * sinTheta, -cosBeta * sinTheta}, ComplexValue{cosTheta, 0.}, complex_zero},
184+
{complex_zero, complex_zero, complex_zero, complex_one}}};
185+
}
86186
// NOLINTEND(readability-identifier-naming)
87187
} // namespace dd
88188
#endif //DD_PACKAGE_GATEMATRIXDEFINITIONS_H

0 commit comments

Comments
 (0)