def run_qv_circuits(n_qubits, n_trials, qr, qc, backend, basis_gates, shots): """ Args: n_qubits <int>: number of qubits n_trials <int>: number of random circuits to create for each subset qr <QuantumRegister>: instance of QuantumRegister qc <QuantumCircuit>: instance of QuantumCircuit backend <AerBackend>: instance of Aer backend basis_gates <list>: list of elementary gates shots <int>: number of sampling shots """ # list of list of qubit subsets to generate QV circuits # assuming: n_qunits > 2 qubit_lists = [list(range(n)) for n in range(3, n_qubits + 1)] # QV sequences qv_circs, which is a list of lists of quantum volume circuits qv_circs, qv_circs_nomeas = qv.qv_circuits(qubit_lists, n_trials, qr, qc) sampling_results = [] for trial in range(n_trials): sampling_results += [ execute(qv_circs[trial], basis_gates=basis_gates, backend=backend, shots=shots).result() ] return sampling_results
def test_qv_circuits_with_seed(self): """Ensure seed is propogated to QuantumVolme objects.""" qubit_lists = [list(range(5))] qv_circs, qv_circs_no_meas = qv.qv_circuits(qubit_lists, seed=3) meas_name = qv_circs[0][0].data[0][0].name no_meas_name = qv_circs_no_meas[0][0].data[0][0].name self.assertEqual(int(meas_name.split(',')[-1].rstrip(']')), 811) self.assertEqual(int(no_meas_name.split(',')[-1].rstrip(']')), 811)
def test_measurements_in_circuits_qubit_list_gap(self): """Test that there are no measurement instructions in output nomeas circuits.""" qubit_lists = [[1, 3, 5, 7]] qv_circs, qv_circs_no_meas = qv.qv_circuits(qubit_lists) qv_circs_measure_qubits = [ x[1][0].index for x in qv_circs[0][0].data if x[0].name == 'measure' ] self.assertNotIn('measure', [x[0].name for x in qv_circs_no_meas[0][0].data]) self.assertEqual([1, 3, 5, 7], qv_circs_measure_qubits)
def test_measurements_in_circuits(self): """Ensure measurements are set or not on output circuits.""" qubit_lists = [list(range(4))] qv_circs, qv_circs_no_meas = qv.qv_circuits(qubit_lists) qv_circs_measure_qubits = [ x[1][0].index for x in qv_circs[0][0].data if x[0].name == 'measure' ] self.assertNotIn('measure', [x[0].name for x in qv_circs_no_meas[0][0].data]) self.assertEqual([0, 1, 2, 3], qv_circs_measure_qubits)
def quantumvolume(nbits=6, measure=True): """ This is a nbit quantum volume circuit reference: https://qiskit.org/textbook/ch-quantum-hardware/measuring-quantum-volume.html """ qubit_lists = [list(range(0, nbits))] qv_circs, qv_circs_nomeas = qv.qv_circuits(qubit_lists, 1) if measure is True: return qv_circs[0][0] else: return qv_circs_nomeas[0][0]
def qv_circuit_execution(qubit_lists: list, ntrials: int, shots: int): """ create quantum volume circuits, simulate the ideal state and run a noisy simulation Args: qubit_lists (list): list of lists of qubits to apply qv circuits to ntrials (int): number of iterations (number of circuits) shots (int): number of shots per simulation Returns: tuple: a tuple of 2 lists: list of Results of the ideal statevector simulations list of Results of the noisy circuits simulations """ # create the qv circuit qv_circs, qv_circs_nomeas = qv.qv_circuits(qubit_lists, ntrials) # get the ideal state statevector_backend = qiskit.Aer.get_backend('statevector_simulator') ideal_results = [] for trial in range(ntrials): ideal_results.append( qiskit.execute(qv_circs_nomeas[trial], backend=statevector_backend).result()) # define noise_model noise_model = NoiseModel() p1q = 0.002 p2q = 0.02 noise_model.add_all_qubit_quantum_error(depolarizing_error(p1q, 1), 'u2') noise_model.add_all_qubit_quantum_error(depolarizing_error(2 * p1q, 1), 'u3') noise_model.add_all_qubit_quantum_error(depolarizing_error(p2q, 2), 'cx') # get the noisy results backend = qiskit.Aer.get_backend('qasm_simulator') basis_gates = ['u1', 'u2', 'u3', 'cx'] # use U,CX for now exp_results = [] for trial in range(ntrials): print('Running trial %d' % trial) exp_results.append( qiskit.execute(qv_circs[trial], basis_gates=basis_gates, backend=backend, noise_model=noise_model, shots=shots, seed_simulator=SEED, backend_options={ 'max_parallel_experiments': 0 }).result()) return ideal_results, exp_results
def test_qv_circuits(self): """ Test circuit generation """ # Qubit list qubit_lists = [[0, 1, 2], [0, 1, 2, 4], [0, 1, 2, 4, 7]] ntrials = 5 qv_circs, _ = qv.qv_circuits(qubit_lists, ntrials) self.assertEqual(len(qv_circs), ntrials, "Error: Not enough trials") self.assertEqual( len(qv_circs[0]), len(qubit_lists), "Error: Not enough circuits for the " "number of specified qubit lists")
def run_qv_circuits(n_qubits, n_trials, qr, qc, backend): """ Args: n_qubits <int>: number of qubits n_trials <int>: number of random circuits to create for each subset qr <QuantumRegister>: instance of QuantumRegister qc <QuantumCircuit>: instance of QuantumCircuit backend <AerBackend>: instance of Aer backend """ # list of list of qubit subsets to generate QV circuits # assuming: n_qunits > 2 qubit_lists = [list(range(n)) for n in range(3, n_qubits + 1)] # QV sequences qv_circs, which is a list of lists of quantum volume circuits _, qv_circs_nomeas = qv.qv_circuits(qubit_lists, n_trials, qr, qc) ideal_results = [] for trial in range(n_trials): ideal_results += [ execute(qv_circs_nomeas[trial], backend=backend).result() ] # validate(qubit_lists, ideal_results) return ideal_results
import numpy as np import matplotlib.pyplot as plt from qiskit import * from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import depolarizing_error, thermal_relaxation_error import qiskit.ignis.verification.quantum_volume as qv qubit_lists = [[2, 3, 4], [1, 2, 3, 4], [0, 1, 2, 3, 4]] ntrials = 50 qv_circs, qv_circs_nomeas = qv.qv_circuits(qubit_lists, ntrials) qv_circs_nomeas[0] = qiskit.compiler.transpile( qv_circs_nomeas[0], basis_gates=['u1', 'u2', 'u3', 'cx']) backend = Aer.get_backend('statevector_simulator') ideal_results = [] for trial in range(ntrials): print('Simulating trial %d' % trial) ideal_results.append( execute(qv_circs_nomeas[trial], backend=backend, optimization_level=0).result()) qv_fitter = qv.QVFitter(qubit_lists=qubit_lists) qv_fitter.add_statevectors(ideal_results) # define noise model n = 5 T1 = [j * 20 for j in range(1, n + 1)] T2 = [2 * t1 for t1 in T1]