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 from mpi4py
import MPI
37 except ModuleNotFoundError:
43 """This is a test class of the python iterface to the decompsition classes of the QGD package""" 47 This method is called by pytest. 48 Test to decompose a 4-qubit unitary of the IBM chellenge 52 from squander
import N_Qubit_Decomposition_adaptive
53 from scipy.io
import loadmat
56 data = loadmat(
'data/Umtx.mat')
61 config = {
'max_outer_iterations': 10,
62 'max_inner_iterations': 300000,
63 'max_inner_iterations_compression': 10000,
64 'max_inner_iterations_final': 1000,
65 'randomized_adaptive_layers': 1,
66 'export_circuit_2_binary': 1,
67 'optimization_tolerance': 1e-8 }
77 cDecompose.set_Verbose( 3 )
81 for idx
in range(levels):
82 cDecompose.add_Adaptive_Layers()
84 cDecompose.add_Finalyzing_Layer_To_Gate_Structure()
89 cDecompose.get_Initial_Circuit()
92 cDecompose.Compress_Circuit()
95 cDecompose.Finalize_Circuit()
98 cDecompose.List_Gates()
101 quantum_circuit = cDecompose.get_Qiskit_Circuit()
104 print(quantum_circuit)
106 import numpy.linalg
as LA
109 decomposed_matrix = utils.get_unitary_from_qiskit_circuit( quantum_circuit )
110 product_matrix = np.dot(Umtx,decomposed_matrix.conj().T)
111 phase = np.angle(product_matrix[0,0])
112 product_matrix = product_matrix*np.exp(-1j*phase)
114 product_matrix = np.eye(16)*2 - product_matrix - product_matrix.conj().T
116 decomposition_error = (np.real(np.trace(product_matrix)))/2
118 print(
'The error of the decomposition is ' + str(decomposition_error))
120 assert( decomposition_error < 1e-3 )
125 This method is called by pytest. 126 Test to decompose a 4-qubit unitary of the IBM chellenge 130 from squander
import N_Qubit_Decomposition_adaptive
131 from scipy.io
import loadmat
134 data = loadmat(
'data/Umtx.mat')
139 config = {
'max_outer_iterations': 10,
140 'max_inner_iterations': 300000,
141 'max_inner_iterations_compression': 10000,
142 'max_inner_iterations_final': 1000,
143 'randomized_adaptive_layers': 1,
144 'export_circuit_2_binary': 1,
145 'optimization_tolerance': 1e-8 }
153 cDecompose.set_Verbose( 3 )
158 for idx
in range(levels):
159 cDecompose.add_Adaptive_Layers()
161 cDecompose.add_Finalyzing_Layer_To_Gate_Structure()
165 cDecompose.get_Initial_Circuit()
168 cDecompose.Finalize_Circuit()
171 cDecompose.List_Gates()
174 quantum_circuit = cDecompose.get_Qiskit_Circuit()
177 print(quantum_circuit)
179 import numpy.linalg
as LA
182 decomposed_matrix = utils.get_unitary_from_qiskit_circuit( quantum_circuit )
183 product_matrix = np.dot(Umtx,decomposed_matrix.conj().T)
184 phase = np.angle(product_matrix[0,0])
185 product_matrix = product_matrix*np.exp(-1j*phase)
187 product_matrix = np.eye(16)*2 - product_matrix - product_matrix.conj().T
189 decomposition_error = (np.real(np.trace(product_matrix)))/2
191 print(
'The error of the decomposition is ' + str(decomposition_error))
193 assert( decomposition_error < 1e-3 )
198 This method is called by pytest. 199 Test to decompose a 4-qubit unitary of the IBM chellenge 203 from squander
import N_Qubit_Decomposition_adaptive
204 from scipy.io
import loadmat
207 data = loadmat(
'data/Umtx.mat')
213 config = {
'max_outer_iterations': 10,
214 'max_inner_iterations': 300000,
215 'max_inner_iterations_compression': 10000,
216 'max_inner_iterations_final': 1000,
217 'randomized_adaptive_layers': 1,
218 'export_circuit_2_binary': 1,
219 'optimization_tolerance': 1e-8 }
227 cDecompose.set_Verbose( 3 )
232 cDecompose.set_Gate_Structure_From_Binary(
"circuit_squander.binary")
235 cDecompose.Compress_Circuit()
238 cDecompose.Finalize_Circuit()
241 cDecompose.List_Gates()
244 quantum_circuit = cDecompose.get_Qiskit_Circuit()
247 print(quantum_circuit)
249 import numpy.linalg
as LA
252 decomposed_matrix = utils.get_unitary_from_qiskit_circuit( quantum_circuit )
253 product_matrix = np.dot(Umtx,decomposed_matrix.conj().T)
254 phase = np.angle(product_matrix[0,0])
255 product_matrix = product_matrix*np.exp(-1j*phase)
257 product_matrix = np.eye(16)*2 - product_matrix - product_matrix.conj().T
259 decomposition_error = (np.real(np.trace(product_matrix)))/2
261 print(
'The error of the decomposition is ' + str(decomposition_error))
263 assert( decomposition_error < 1e-3 )
268 This method is called by pytest. 269 Test to decompose a 4-qubit unitary of the IBM chellenge 273 from squander
import N_Qubit_Decomposition_adaptive
274 from scipy.io
import loadmat
277 data = loadmat(
'data/Umtx.mat')
280 config = {
'max_outer_iterations': 1,
281 'max_inner_iterations_agent': 25000,
282 'max_inner_iterations_compression': 10000,
283 'max_inner_iterations' : 500,
284 'max_inner_iterations_final': 5000,
285 'Randomized_Radius': 0.3,
286 'randomized_adaptive_layers': 1,
287 'optimization_tolerance_agent': 1e-4,
288 'optimization_tolerance': 1e-5,
297 cDecompose.set_Verbose( 3 )
302 for idx
in range(levels):
303 cDecompose.add_Adaptive_Layers()
305 cDecompose.add_Finalyzing_Layer_To_Gate_Structure()
310 parameter_num = cDecompose.get_Parameter_Num()
311 parameters = np.zeros( (parameter_num,1), dtype=np.float64 )
312 cDecompose.set_Optimized_Parameters( parameters )
315 cDecompose.set_Optimizer(
"AGENTS")
318 cDecompose.get_Initial_Circuit()
321 cDecompose.set_Optimizer(
"BFGS")
324 cDecompose.get_Initial_Circuit()
327 cDecompose.Compress_Circuit()
330 cDecompose.Finalize_Circuit()
333 cDecompose.List_Gates()
336 quantum_circuit = cDecompose.get_Qiskit_Circuit()
339 print(quantum_circuit)
341 import numpy.linalg
as LA
344 decomposed_matrix = utils.get_unitary_from_qiskit_circuit( quantum_circuit )
345 product_matrix = np.dot(Umtx,decomposed_matrix.conj().T)
346 phase = np.angle(product_matrix[0,0])
347 product_matrix = product_matrix*np.exp(-1j*phase)
349 product_matrix = np.eye(16)*2 - product_matrix - product_matrix.conj().T
351 decomposition_error = (np.real(np.trace(product_matrix)))/2
353 print(
'The error of the decomposition is ' + str(decomposition_error))
355 assert( decomposition_error < 1e-3 )
def test_IBM_Chellenge_compression_only(self)
def test_IBM_Chellenge_multiple_optim(self)
A base class to determine the decomposition of an N-qubit unitary into a sequence of CNOT and U3 gate...
def test_IBM_Chellenge_no_compression(self)
def test_IBM_Chellenge_full(self)