Пример #1
0
def noise_oracle(U, num_anc):
    if num_anc == 0:
        qc = QuantumCircuit(n_qubits)
        if U.shape[0]==4 and np.linalg.norm(U-target_unitary) < 1e-8:
            qc.swap(0,1)
        else:
            qc.unitary(U, list(range(n_qubits)))
        qc = qiskit.compiler.transpile(qc, basis_gates=noise_model.basis_gates,
                                           coupling_map=[[0,1]])
        saved_circuits.append(qc)
        qc_noisy = insert_noise(qc, noise_model)
        return Choi(qc_noisy).data
    elif num_anc == 1:
        exp = channel_expand(n_qubits, num_anc)
        tr = channel_trace(n_qubits, num_anc)
        _,params = get_approx_circuit(U, n_qubits+num_anc, depth, full_connectivity)
        qc = get_varform_circuit(params, n_qubits+num_anc, depth, full_connectivity)
        coupling_map = [[0,1],[1,2],[0,2]] if full_connectivity else [[0,1],[1,2]]
        qc = qiskit.compiler.transpile(qc, basis_gates=noise_model.basis_gates,
                                           coupling_map=coupling_map)
        saved_circuits.append(qc)
        qc_noisy = insert_noise(qc, noise_model)
        qc_noisy = SuperOp(qc_noisy)
        return Choi( exp.compose(qc_noisy.compose(tr)) ).data
    else: raise
Пример #2
0
    def test_multiple_inputs(self):
        qr = QuantumRegister(1, 'qr')
        circuit1 = QuantumCircuit(qr)
        circuit1.x(qr[0])

        circuit2 = QuantumCircuit(qr)
        circuit2.y(qr[0])

        circuits_list = [circuit1, circuit2]
        circuits_tuple = (circuit1, circuit2)

        noise_model = NoiseModel()
        error_x = pauli_error([('Y', 0.25), ('I', 0.75)])
        error_y = pauli_error([('X', 0.35), ('Z', 0.65)])
        noise_model.add_all_qubit_quantum_error(error_x, 'x')
        noise_model.add_all_qubit_quantum_error(error_y, 'y')

        target_circuit1 = QuantumCircuit(qr)
        target_circuit1.x(qr[0])
        target_circuit1.append(error_x.to_instruction(), [qr[0]])

        target_circuit2 = QuantumCircuit(qr)
        target_circuit2.y(qr[0])
        target_circuit2.append(error_y.to_instruction(), [qr[0]])

        target_circuits = [target_circuit1, target_circuit2]
        result_circuits = insert_noise(circuits_list, noise_model)
        self.assertEqual(target_circuits, result_circuits)

        target_circuits = [target_circuit1, target_circuit2]
        result_circuits = insert_noise(circuits_tuple, noise_model)
        self.assertEqual(target_circuits, result_circuits)
Пример #3
0
def noisy_unitary(u, n_q=1):
    qc = QuantumCircuit(n_q)
    if u.shape[0]==4 and np.linalg.norm(u-target_unitary) < 1e-8:
        qc.swap(0,1)
    else:
        qc.unitary(u, list(range(n_q)))
    qc_noisy = insert_noise(qc, noise_model, transpile=True)
    return Choi(qc_noisy)
Пример #4
0
def noise_oracle(U, num_anc):
    exp = channel_expand(n_qubits, num_anc)
    tr = channel_trace(n_qubits, num_anc)
    qc = QuantumCircuit(num_anc + n_qubits)

    qc.unitary(U, list(range(num_anc + n_qubits)))
    qc_noisy = insert_noise(qc, noise_model, transpile=True)
    qc_noisy = SuperOp(qc_noisy)

    return Choi(exp.compose(qc_noisy.compose(tr))).data
Пример #5
0
    def test_no_noise(self):
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.x(qr[0])
        circuit.y(qr[1])
        circuit.z(qr[2])

        target_circuit = QuantumCircuit(qr)
        target_circuit.x(qr[0])
        target_circuit.y(qr[1])
        target_circuit.z(qr[2])

        noise_model = NoiseModel() #empty

        result_circuit = insert_noise(circuit, noise_model)

        self.assertEqual(target_circuit, result_circuit)
Пример #6
0
    def test_nonlocal_quantum_errors(self):
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.x(qr[0])
        circuit.x(qr[2])

        error_x = pauli_error([('Y', 0.25), ('I', 0.75)])
        noise_model = NoiseModel()
        noise_model.add_nonlocal_quantum_error(error_x, 'x', [0], [1])

        target_circuit = QuantumCircuit(qr)
        target_circuit.x(qr[0])
        target_circuit.append(error_x.to_instruction(), [qr[1]])
        target_circuit.x(qr[2])

        result_circuit = insert_noise(circuit, noise_model)

        self.assertEqual(target_circuit, result_circuit)
Пример #7
0
    def test_transpiling(self):
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.x(qr[0])
        circuit.y(qr[1])
        circuit.z(qr[2])

        error_x = pauli_error([('Y', 0.25), ('I', 0.75)])
        error_y = pauli_error([('X', 0.35), ('Z', 0.65)])
        noise_model = NoiseModel()
        noise_model.add_all_qubit_quantum_error(error_x, 'x')
        noise_model.add_all_qubit_quantum_error(error_y, 'u1')

        target_circuit = QuantumCircuit(qr)
        target_circuit.x(qr[0])
        target_circuit.append(error_x.to_instruction(), [qr[0]])
        target_circuit.u3(pi, pi / 2, pi / 2, qr[1])
        target_circuit.u1(pi, qr[2])
        target_circuit.append(error_y.to_instruction(), [qr[2]])

        result_circuit = insert_noise(circuit, noise_model, transpile=True)
        self.assertEqual(target_circuit, result_circuit)
Пример #8
0
    def test_transpiling(self):
        qr = QuantumRegister(3, 'qr')
        circuit = QuantumCircuit(qr)
        circuit.x(qr[0])
        circuit.y(qr[1])
        circuit.z(qr[2])

        error_x = pauli_error([('Y', 0.25), ('I', 0.75)])
        error_y = pauli_error([('X', 0.35), ('Z', 0.65)])
        noise_model = NoiseModel()
        noise_model.add_all_qubit_quantum_error(error_x, 'x')
        noise_model.add_all_qubit_quantum_error(error_y, 'y')

        target_circuit = QuantumCircuit(qr)
        target_circuit.x(qr[0])
        target_circuit.append(error_x.to_instruction(), [qr[0]])
        target_circuit.y(qr[1])
        target_circuit.append(error_y.to_instruction(), [qr[1]])
        target_circuit.z(qr[2])
        target_basis = ['kraus'] + noise_model.basis_gates
        target_circuit = transpile(target_circuit, basis_gates=target_basis)
        result_circuit = insert_noise(circuit, noise_model, transpile=True)
        self.assertEqual(SuperOp(target_circuit), SuperOp(result_circuit))
Пример #9
0
    counts = job.result().get_counts(qc)
    if '1' not in counts: counts['1'] = 0
    return counts['1'] / shots


U = random_unitary(2, seed=1234)  # 1237
qc = QuantumCircuit(2, 1)
qc.unitary(U, [0])
qc.cx(0, 1)
probab_ref = get_probab(qc)
print(probab_ref)

# run circuits of different quasiprobability branches
probabs = list()
for qc in circuits:
    qc_noisy = insert_noise(qc, noise_model)
    if qc.num_qubits == 2:
        qctot = QuantumCircuit(2, 1)
        qctot.unitary(U, [0])
    elif qc.num_qubits == 3:
        qctot = QuantumCircuit(3, 1)
        qctot.unitary(U, [0])
    else:
        raise
    qctot += qc_noisy
    probabs.append(get_probab(qctot))
    #print(qctot)
probabs = np.array(probabs)

# check
print(np.sum(probabs * coeffs))
Пример #10
0
def noisy_unitary(u, n_q=1):
    qc = QuantumCircuit(n_q)
    qc.unitary(u, list(range(n_q)))
    qc_noisy = insert_noise(qc, noise_model, transpile=True)
    return Choi(qc_noisy)
Пример #11
0
sys.path.append("..")
from json_tools import *
from basis_ops import *
from decomposition import *
from diamond_norm import *

noise_model = NoiseModel.from_dict(json_from_file("2020_04_08.json"))
noise_model.add_quantum_error(noise_model._local_quantum_errors['cx']['2,3'], 'cx', [0,2])
noise_model.add_quantum_error(noise_model._local_quantum_errors['cx']['3,2'], 'cx', [2,0])


# target ops
qc = QuantumCircuit(1)
qc.ry(2.*np.arccos(np.sqrt(0.56789)), 0)
qc_noisy = insert_noise(qc, noise_model, transpile=True)
ry_unitary = Operator(qc).data
ry_choi = Choi(qc).data
ry_noisy = Choi(qc_noisy).data


qc = QuantumCircuit(2)
qc.cx(0,1)
qc_noisy = insert_noise(qc, noise_model, transpile=True)
cnot_unitary = Operator(qc).data
cnot_choi = Choi(qc).data
cnot_noisy = Choi(qc_noisy).data

qc = QuantumCircuit(2)
qc.swap(0,1)
qc_noisy = insert_noise(qc, noise_model, transpile=True)