3 Created on Fri Jun 26 14:42:56 2020 4 Copyright 2020 Peter Rakyta, Ph.D. 6 Licensed under the Apache License, Version 2.0 (the "License"); 7 you may not use this file except in compliance with the License. 8 You may obtain a copy of the License at 10 http://www.apache.org/licenses/LICENSE-2.0 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 See the License for the specific language governing permissions and 16 limitations under the License. 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see http://www.gnu.org/licenses/. 21 @author: Peter Rakyta, Ph.D. 29 from scipy.stats
import unitary_group
31 from squander
import utils
35 """This is a test class of the python iterface to the decompsition classes of the QGD package""" 39 Test a custom QX2 gate structure in a four-qubit decomposition. 41 Both the target and optimizer are seeded because convergence time for 42 this strong numerical test otherwise varies by thousands of optimizer 46 from squander
import N_Qubit_Decomposition
49 matrix_size = 2**qbit_num
52 Umtx = unitary_group.rvs(matrix_size, random_state=0)
57 "max_outer_iterations": 600,
60 "convergence_threshold": 0.0,
64 reordered_qbits = (2, 3, 1, 0)
65 decomp.Reorder_Qubits(reordered_qbits)
66 decomp.set_Gate_Structure(
72 decomp.set_Max_Layer_Num({4: 60, 3: 16})
73 decomp.set_Optimization_Blocks(20)
74 decomp.set_Optimization_Tolerance(1e-7)
75 decomp.Start_Decomposition()
77 assert decomp.get_Decomposition_Error() < 1e-7
79 revert_qbits = (3, 2, 0, 1)
80 decomp.Reorder_Qubits(revert_qbits)
81 quantum_circuit = decomp.get_Qiskit_Circuit()
83 decomposed_matrix = np.asarray(
84 utils.get_unitary_from_qiskit_circuit(quantum_circuit)
86 product_matrix = Umtx @ decomposed_matrix.conj().T
87 phase = np.angle(product_matrix[0, 0])
88 product_matrix *= np.exp(-1j * phase)
90 np.eye(matrix_size) * 2
92 - product_matrix.conj().T
94 decomposition_error = np.real(np.trace(product_matrix)) / 2
96 assert decomposition_error < 1e-3
99 """Validate every QX2 coupling independently of optimizer convergence.""" 103 tuple(gate.get_Involved_Qbits())
104 for layer
in gate_structure.get_Gates()
105 for gate
in layer.get_Gates()
106 if gate.get_Name() ==
"CNOT" 109 assert cnot_qbits == [(0, 3), (0, 1), (2, 3)]
114 This method is called to create custom gate structure for the decomposition on IBM QX2 118 from squander
import Circuit
121 Circuit_ret = Circuit( qbit_num )
123 disentangle_qbit = qbit_num - 1
125 for qbit
in range(0, disentangle_qbit ):
128 Layer = Circuit( qbit_num )
134 Layer.add_U3( disentangle_qbit )
137 Layer.add_CNOT( 0, disentangle_qbit)
146 Layer.add_CNOT( 0, 1)
154 Layer.add_U3( disentangle_qbit )
157 Layer.add_CNOT( 2, disentangle_qbit )
159 Circuit_ret.add_Circuit( Layer )
def create_custom_gate_structure_QX2(self, qbit_num)
def test_custom_gate_structure_QX2_couplings(self)
def test_N_Qubit_Decomposition_QX2(self)
A base class to determine the decomposition of an N-qubit unitary into a sequence of CNOT and U3 gate...