6 #include "catch2/catch.hpp" 18 TEST_CASE(
"Test n-controlled unitary module with Pauli-X |11..10>",
"[ncu]"){
19 std::size_t max_qubits = 8;
20 double mach_eps = 7./3. - 4./3. -1.;
21 std::vector<std::size_t> ctrl_lines;
25 for(std::size_t i = 0; i <=
num_qubits-2; i++){
26 ctrl_lines.push_back(i);
28 DYNAMIC_SECTION(
"Testing " <<
num_qubits <<
" qubits"){
33 std::size_t max_pattern = (int) pow(2,
num_qubits-1);
34 for(std::size_t pattern = 0; pattern < max_pattern; pattern++ ){
35 DYNAMIC_SECTION(
"Testing pattern " << pattern ){
39 for(std::size_t control_qubit_idx = 0; control_qubit_idx <
num_qubits-1; control_qubit_idx++){
41 unsigned int window_select = (pattern >> control_qubit_idx) & 0b1;
42 if(window_select == 1){
43 sim.applyGateX(control_qubit_idx);
47 auto &r =
sim.getQubitRegister();
50 if(pattern == max_pattern -1){
51 CHECK(
sim.getQubitRegister().GetProbability(
num_qubits-1) == Approx(1.).margin(1e-12));
54 CHECK(
sim.getQubitRegister().GetProbability(
num_qubits-1) == Approx(0.).margin(1e-12));
66 TEST_CASE(
"Test n-controlled unitary module with Pauli-Z on |111..1>",
"[ncu]"){
67 std::size_t max_qubits = 8;
68 double mach_eps = 7./3. - 4./3. -1.;
70 std::vector<std::size_t> ctrl_lines;
74 for(std::size_t i = 0; i <=
num_qubits-2; i++){
75 ctrl_lines.push_back(i);
77 DYNAMIC_SECTION(
"Testing " <<
num_qubits <<
" qubits"){
80 std::size_t num_patterns = (int) pow(2,
num_qubits);
82 for(std::size_t pattern = 0; pattern < num_patterns; pattern++ ){
83 DYNAMIC_SECTION(
"Testing pattern " << pattern ){
86 for(std::size_t control_qubit_idx = 0; control_qubit_idx <
num_qubits; control_qubit_idx++){
88 unsigned int window_select = (pattern >> control_qubit_idx) & 0b1;
89 if(window_select == 1){
90 sim.applyGateX(control_qubit_idx);
93 auto &r =
sim.getQubitRegister();
97 if(pattern == num_patterns-1){
98 CAPTURE(pattern, r[pattern]);
99 CHECK(r[pattern].real() == Approx(-1.).margin(1e-12) );
100 CHECK(r[pattern].imag() + 10*mach_eps == Approx(0.).margin(1e-12) );
103 CAPTURE(pattern, r[pattern]);
104 CHECK(r[pattern].real() == Approx(1.).margin(1e-12) );
105 CHECK(r[pattern].imag() + 10*mach_eps == Approx(0.).margin(1e-12) );
117 TEST_CASE(
"Test n-controlled unitary module with Pauli-X and non-adjacent controls",
"[ncu]"){
118 const std::size_t max_qubits = 8;
125 std::vector<std::size_t> vals0 {0,1}, vals1 {0,2}, vals2 {1,2};
126 SECTION(
"3 qubit test"){
127 for(std::size_t state = 0; state < (std::size_t) (0b1<<(
num_qubits-1)); state++){
128 DYNAMIC_SECTION(
"CTRLs {0,1} STATE VALUE=" << state){
131 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
132 unsigned int window_select = (state >> ctrl_idx) & 0b1;
133 if(window_select == 1){
134 sim.applyGateX(vals0[ctrl_idx]);
140 sim.applyGateNCU(
sim.getGateX(), vals0, 2,
"X");
142 if(state == (std::size_t) (0b1<<(
num_qubits-1)) - 1)
143 CHECK(
sim.applyMeasurementToRegister(vals0,
true) == 7);
145 CHECK(
sim.applyMeasurementToRegister(vals0,
true) != 7);
147 DYNAMIC_SECTION(
"CTRLs {0,2} STATE VALUE=" << state){
149 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
150 unsigned int window_select = (state >> ctrl_idx) & 0b1;
151 if(window_select == 1){
152 sim.applyGateX(vals1[ctrl_idx]);
155 sim.applyGateNCU(
sim.getGateX(), vals1, 1,
"X");
160 if(state == (std::size_t) (0b1<<(
num_qubits-1)) - 1)
161 CHECK(
sim.applyMeasurementToRegister(vals1,
true) == 7);
163 CHECK(
sim.applyMeasurementToRegister(vals1,
true) != 7);
165 DYNAMIC_SECTION(
"CTRLs {1,2} STATE VALUE=" << state){
167 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
168 unsigned int window_select = (state >> ctrl_idx) & 0b1;
169 if(window_select == 1){
170 sim.applyGateX(vals2[ctrl_idx]);
173 sim.applyGateNCU(
sim.getGateX(), vals2, 0,
"X");
175 if(state == (std::size_t) (0b1<<(
num_qubits-1)) - 1)
176 CHECK(
sim.applyMeasurementToRegister(vals2,
true) == 7);
178 CHECK(
sim.applyMeasurementToRegister(vals2,
true) != 7);
185 std::vector<std::size_t> vals0 {0,1,2}, vals1 {0,1,3}, vals2 {0,2};
186 SECTION(
"4 qubit test"){
187 for(std::size_t state = 0; state < (std::size_t) (0b1<<(
num_qubits-1)); state++){
188 DYNAMIC_SECTION(
"CTRLs {0,1,2} STATE VALUE=" << state){
190 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
191 unsigned int window_select = (state >> ctrl_idx) & 0b1;
192 if(window_select == 1){
193 sim.applyGateX(vals0[ctrl_idx]);
196 sim.applyGateNCU(
sim.getGateX(), vals0, 3,
"X");
198 if(state == (std::size_t)(0b1<<(
num_qubits-1)) - 1)
199 CHECK(
sim.applyMeasurementToRegister(vals0,
true) == 15);
201 CHECK(
sim.applyMeasurementToRegister(vals0,
true) != 15);
203 DYNAMIC_SECTION(
"CTRLs {0,1,3} STATE VALUE=" << state){
205 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
206 unsigned int window_select = (state >> ctrl_idx) & 0b1;
207 if(window_select == 1){
208 sim.applyGateX(vals1[ctrl_idx]);
211 sim.applyGateNCU(
sim.getGateX(), vals1, 2,
"X");
214 if(state == (std::size_t) (0b1<<(
num_qubits-1)) - 1)
215 CHECK(
sim.applyMeasurementToRegister(vals1,
true) == 15);
217 CHECK(
sim.applyMeasurementToRegister(vals1,
true) != 15);
225 std::vector<std::size_t> vals0 {0,1,2,3}, vals1 {0,1,3,4};
226 SECTION(
"5 qubit test"){
227 for(std::size_t state = 0; state < (std::size_t) (0b1<<(
num_qubits-1)); state++){
228 DYNAMIC_SECTION(
"CTRLs {0,1,2,3} STATE VALUE=" << state){
230 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
231 unsigned int window_select = (state >> ctrl_idx) & 0b1;
232 if(window_select == 1){
233 sim.applyGateX(vals0[ctrl_idx]);
236 sim.applyGateNCU(
sim.getGateX(), vals0, 4,
"X");
238 if(state == (std::size_t)(0b1<<(
num_qubits-1)) - 1)
239 CHECK(
sim.applyMeasurementToRegister(vals0,
true) == 31);
241 CHECK(
sim.applyMeasurementToRegister(vals0,
true) != 31);
243 DYNAMIC_SECTION(
"CTRLs {0,1,3,4} STATE VALUE=" << state){
245 for(std::size_t ctrl_idx = 0; ctrl_idx <
num_qubits; ctrl_idx++){
246 unsigned int window_select = (state >> ctrl_idx) & 0b1;
247 if(window_select == 1){
248 sim.applyGateX(vals1[ctrl_idx]);
251 sim.applyGateNCU(
sim.getGateX(), vals1, 2,
"X");
254 if(state == (std::size_t) (0b1<<(
num_qubits-1)) - 1)
255 CHECK(
sim.applyMeasurementToRegister(vals1,
true) == 31);
257 CHECK(
sim.applyMeasurementToRegister(vals1,
true) != 31);
Class definition for IntelSimulator. The purpose of this class is to map the functionality of the und...
TEST_CASE("Test n-controlled unitary module with Pauli-X |11..10>","[ncu]")
Test PauliX for NCU.
Functions for applying n-qubit controlled U (unitary) gates.