1 from squander
import SABRE
2 from squander
import Qiskit_IO
3 from squander
import utils
5 from qiskit
import transpile
6 from qiskit
import QuantumCircuit
7 from qiskit.circuit
import CircuitInstruction
8 from qiskit.circuit.library
import PermutationGate
9 from qiskit_aer
import AerSimulator
10 from qiskit.quantum_info
import Operator
11 from qiskit
import QuantumRegister, ClassicalRegister
13 parameters = np.array([])
20 filename =
'examples/partitioning/qasm_samples/heisenberg-16-20.qasm' 23 circuit_qiskit = QuantumCircuit.from_qasm_file(filename)
26 Squander_initial_circuit, parameters_initial = Qiskit_IO.convert_Qiskit_to_Squander(circuit_qiskit)
29 topology = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7),
30 (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15),
34 sabre = SABRE(Squander_initial_circuit, topology,stochastic_selection=
True)
35 Squander_remapped_circuit, parameters_remapped_circuit, pi, final_pi, swap_count = sabre.map_circuit(parameters_initial,30)
39 print(
"INITIAL CIRCUIT:")
41 print(
"mapping (q -> Q):", pi)
42 print(
"Final mapping:", final_pi)
43 qubits = list(range(N))
44 Qiskit_circuit = QuantumCircuit(N)
45 pi_map = list(np.array(sabre.get_inverse_pi(pi)))
46 Qiskit_circuit.append(CircuitInstruction( PermutationGate(pi_map),qubits))
47 Qiskit_circuit &= Qiskit_IO.get_Qiskit_Circuit( Squander_remapped_circuit, parameters_remapped_circuit )
48 Qiskit_circuit.append(CircuitInstruction( PermutationGate(list(final_pi)),qubits))
49 print(
"CIRCUIT MAPPED WITH SABRE:")
51 print(
"SABRE SWAP COUNT:", swap_count)
54 [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7],
55 [8, 9], [8, 10], [8, 11], [8, 12], [8, 13], [8, 14], [8, 15],
59 Qiskit_circuit_mapped = transpile(circuit_qiskit, coupling_map=coupling_map)
61 print(
"CIRCUIT MAPPED WITH QISKIT:")
63 print(
"QISKIT SWAP COUNT:", dict(Qiskit_circuit_mapped.count_ops())[
'swap'])
72 unitary_squander_remapped_circuit = utils.get_unitary_from_qiskit_circuit_operator(Qiskit_circuit) 75 product_matrix = np.dot(unitary_squander_initial.conj().T, unitary_squander_remapped_circuit) 76 phase = np.angle(product_matrix[0,0]) 77 product_matrix = product_matrix*np.exp(-1j*phase) 80 product_matrix = np.eye(matrix_size)*2 - product_matrix - product_matrix.conj().T 82 # the error of the decomposition 83 decomposition_error = (np.real(np.trace(product_matrix)))/2 85 print('The error of the decomposition is ' + str(decomposition_error))