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)
Beispiel #5
0
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]
Beispiel #6
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
Beispiel #7
0
    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
Beispiel #9
0
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]