Esempio n. 1
0
 def test_sympy(self):
     desired_vector = [
         0,
         math.cos(math.pi / 3) * complex(0, 1) / math.sqrt(4),
         math.sin(math.pi / 3) / math.sqrt(4),
         0,
         0,
         0,
         0,
         0,
         1 / math.sqrt(8) * complex(1, 0),
         1 / math.sqrt(8) * complex(0, 1),
         0,
         0,
         0,
         0,
         1 / math.sqrt(4),
         1 / math.sqrt(4) * complex(0, 1)]
     qp = QuantumProgram()
     qr = QuantumRegister(4, "qr")
     qc = QuantumCircuit(qr)
     qc.initialize(desired_vector, [qr[0], qr[1], qr[2], qr[3]])
     qp.add_circuit("qc", qc)
     result = qp.execute("qc", backend='local_statevector_simulator')
     statevector = result.get_statevector()
     fidelity = state_fidelity(statevector, desired_vector)
     self.assertGreater(
         fidelity, self._desired_fidelity,
         "Initializer has low fidelity {0:.2g}.".format(fidelity))
def eval_cost_function_with_unlabeled_data(entangler_map, coupling_map,
                                           initial_layout, n, m,
                                           unlabeled_data, class_labels,
                                           backend, shots, seed, train, theta):
    predicted_results = []
    Q_program = QuantumProgram()
    circuits = []

    for c_id, inpt in enumerate(unlabeled_data):
        circuit_name, sequences = trial_circuit_ML(entangler_map, coupling_map,
                                                   initial_layout, n, m, theta,
                                                   inpt, '' + str(c_id), None,
                                                   True)
        circuits.append(('', circuit_name))
        Q_program.add_circuit(circuit_name, sequences)

    circuit_list = [c[1] for c in circuits]
    program_data = Q_program.execute(circuit_list,
                                     backend=backend,
                                     coupling_map=coupling_map,
                                     initial_layout=initial_layout,
                                     shots=shots,
                                     seed=seed)

    for v in range(len(circuit_list)):
        countsloop = program_data.get_counts(circuit_list[v])
        probs = return_probabilities(countsloop, class_labels)
        predicted_results.append(
            max(probs.items(), key=operator.itemgetter(1))[0])

    return predicted_results
Esempio n. 3
0
    def test_add_circuit(self):
        """Test add two circuits.

        If all correct should return the data
        """
        QP_program = QuantumProgram()
        qr = QP_program.create_quantum_register("qr", 2, verbose=False)
        cr = QP_program.create_classical_register("cr", 2, verbose=False)
        qc1 = QP_program.create_circuit("qc1", [qr], [cr])
        qc2 = QP_program.create_circuit("qc2", [qr], [cr])
        QP_program.set_api(API_TOKEN, URL)
        qc1.h(qr[0])
        qc1.measure(qr[0], cr[0])
        qc2.measure(qr[1], cr[1])
        new_circuit = qc1 + qc2
        QP_program.add_circuit('new_circuit', new_circuit)
        # new_circuit.measure(qr[0], cr[0])
        circuits = ['new_circuit']
        backend = 'local_qasm_simulator'  # the backend to run on
        shots = 1024  # the number of shots in the experiment.
        result = QP_program.execute(circuits,
                                    backend=backend,
                                    shots=shots,
                                    seed=78)
        self.assertEqual(result.get_counts('new_circuit'), {
            '00': 505,
            '01': 519
        })
Esempio n. 4
0
 def test_initialize_middle_circuit(self):
     desired_vector = [0.5, 0.5, 0.5, 0.5]
     qp = QuantumProgram()
     qr = QuantumRegister("qr", 2)
     cr = ClassicalRegister("cr", 2)
     qc = QuantumCircuit(qr, cr)
     qc.h(qr[0])
     qc.cx(qr[0], qr[1])
     qc.reset(qr[0])
     qc.reset(qr[1])
     qc.initialize(desired_vector, [qr[0], qr[1]])
     qc.measure(qr, cr)
     qp.add_circuit("qc", qc)
     # statevector simulator does not support reset
     shots = 2000
     threshold = 0.025 * shots
     result = qp.execute("qc", backend='local_qasm_simulator', shots=shots)
     counts = result.get_counts()
     target = {
         '00': shots / 4,
         '01': shots / 4,
         '10': shots / 4,
         '11': shots / 4
     }
     self.assertDictAlmostEqual(counts, target, threshold)
Esempio n. 5
0
def build_model_circuits(name, n):
    qp = QuantumProgram()
    q = qp.create_quantum_register("q", n)
    c = qp.create_classical_register("c", n)


    qft(qftcirc, q, n)
    for j in range(n):

    qp.add_circuit("%s_%d" % (name, n), qftcirc)

    return qp


def main():
    parser = argparse.ArgumentParser(description="Create circuits \
                                                  of Quantum Fourier \
                                                  Transform for \
                                                  quantum volume analysis.")
    parser.add_argument('--name', default='qft', help='circuit name')
    parser.add_argument('-n', '--qubits', default=5,
                        type=int, help='number of circuit qubits')
    args = parser.parse_args()

    qp = build_model_circuits(name=args.name, n=args.qubits)

    circuit_name = args.name+'_n'+str(args.qubits)
    f = open(circuit_name+'.qasm', 'w')
    f.write(qp.get_qasm(name="%s_%d" % (args.name, args.qubits)))
    f.close()


if __name__ == "__main__":
    main()
Esempio n. 6
0
 def test_single_qubit(self):
     desired_vector = [1 / math.sqrt(3), math.sqrt(2) / math.sqrt(3)]
     qp = QuantumProgram()
     qr = QuantumRegister("qr", 1)
     qc = QuantumCircuit(qr)
     qc.initialize(desired_vector, [qr[0]])
     qp.add_circuit("qc", qc)
     result = qp.execute("qc", backend='local_statevector_simulator')
     statevector = result.get_statevector()
     fidelity = state_fidelity(statevector, desired_vector)
     self.assertGreater(
         fidelity, self._desired_fidelity,
         "Initializer has low fidelity {0:.2g}.".format(fidelity))
Esempio n. 7
0
 def test_deterministic_state(self):
     desired_vector = [0, 1, 0, 0]
     qp = QuantumProgram()
     qr = QuantumRegister("qr", 2)
     qc = QuantumCircuit(qr)
     qc.initialize(desired_vector, [qr[0], qr[1]])
     qp.add_circuit("qc", qc)
     result = qp.execute("qc", backend='local_statevector_simulator')
     statevector = result.get_statevector()
     fidelity = state_fidelity(statevector, desired_vector)
     self.assertGreater(
         fidelity, self._desired_fidelity,
         "Initializer has low fidelity {0:.2g}.".format(fidelity))
Esempio n. 8
0
def build_model_circuits(name, n, depth, num_circ=1):
    """Create a quantum program containing model circuits.
    The model circuits consist of layers of Haar random
    elements of SU(4) applied between corresponding pairs
    of qubits in a random bipartition.
    name = leading name of circuits
    n = number of qubits
    depth = ideal depth of each model circuit (over SU(4))
    num_circ = number of model circuits to construct
    Return a quantum program.
    """
    qp = QuantumProgram()
    q = qp.create_quantum_register("q", n)
    c = qp.create_classical_register("c", n)
    # Create measurement subcircuit
    meas = qp.create_circuit("meas", [q], [c])
    for j in range(n):
        meas.measure(q[j], c[j])
    # For each sample number, build the model circuits
    for i in range(num_circ):
        # Initialize empty circuit Ci without measurement
        circuit_i = qp.create_circuit("%s_%d" % (name, i), [q], [c])
        # For each layer
        for j in range(depth):
            # Generate uniformly random permutation Pj of [0...n-1]
            perm = np.random.permutation(n)
            # For each pair p in Pj, generate Haar random SU(4)
            # Decompose each SU(4) into CNOT + SU(2) and add to Ci
            for k in range(math.floor(n / 2)):
                qubits = [int(perm[2 * k]), int(perm[2 * k + 1])]
                SU = random_SU(4)
                for gate in two_qubit_kak(SU):
                    i0 = qubits[gate["args"][0]]
                    if gate["name"] == "cx":
                        i1 = qubits[gate["args"][1]]
                        circuit_i.cx(q[i0], q[i1])
                    elif gate["name"] == "u1":
                        circuit_i.u1(gate["params"][2], q[i0])
                    elif gate["name"] == "u2":
                        circuit_i.u2(gate["params"][1], gate["params"][2],
                                     q[i0])
                    elif gate["name"] == "u3":
                        circuit_i.u3(gate["params"][0], gate["params"][1],
                                     gate["params"][2], q[i0])
                    elif gate["name"] == "id":
                        pass  # do nothing
            # circuit_i.barrier(q)  # barriers between layers
        circuit_i.barrier(q)  # barrier before measurement
        # Create circuit with final measurement
        qp.add_circuit("%s_%d_meas" % (name, i), circuit_i + meas)
    return qp
Esempio n. 9
0
 def test_gate_x(self):
     shots = 100
     qp = QuantumProgram()
     qr = QuantumRegister(1, "qr")
     cr = ClassicalRegister(1, "cr")
     qc = QuantumCircuit(qr, cr)
     qc.x(qr[0])
     qc.measure(qr, cr)
     qp.add_circuit("circuit_name", qc)
     result_pq = qp.execute('circuit_name',
                            backend='local_qasm_simulator_projectq',
                            seed=1,
                            shots=shots)
     self.assertEqual(result_pq.get_counts(), {'1': shots})
Esempio n. 10
0
def build_model_circuits(name, n):
    qp = QuantumProgram()
    q = qp.create_quantum_register("q", n)
    c = qp.create_classical_register("c", n)

    qftcirc = qp.create_circuit("meas", [q], [c])

    qft(qftcirc, q, n)
    qftcirc.barrier(q)
    for j in range(n):
        qftcirc.measure(q[j], c[j])

    qp.add_circuit("%s_%d" % (name, n), qftcirc)

    return qp
Esempio n. 11
0
 def test_random_3qubit(self):
     desired_vector = [
         1 / math.sqrt(16) * complex(0, 1),
         1 / math.sqrt(8) * complex(1, 0),
         1 / math.sqrt(16) * complex(1, 1), 0, 0,
         1 / math.sqrt(8) * complex(1, 2),
         1 / math.sqrt(16) * complex(1, 0), 0
     ]
     qp = QuantumProgram()
     qr = QuantumRegister("qr", 3)
     qc = QuantumCircuit(qr)
     qc.initialize(desired_vector, [qr[0], qr[1], qr[2]])
     qp.add_circuit("qc", qc)
     result = qp.execute("qc", backend='local_statevector_simulator')
     statevector = result.get_statevector()
     fidelity = state_fidelity(statevector, desired_vector)
     self.assertGreater(
         fidelity, self._desired_fidelity,
         "Initializer has low fidelity {0:.2g}.".format(fidelity))
 def test_add_circuit_noname(self):
     """Test add two circuits without names. Also tests get_counts without circuit name.
     """
     q_program = QuantumProgram()
     qr = q_program.create_quantum_register(size=2)
     cr = q_program.create_classical_register(size=2)
     qc1 = q_program.create_circuit(qregisters=[qr], cregisters=[cr])
     qc2 = q_program.create_circuit(qregisters=[qr], cregisters=[cr])
     qc1.h(qr[0])
     qc1.measure(qr[0], cr[0])
     qc2.measure(qr[1], cr[1])
     new_circuit = qc1 + qc2
     q_program.add_circuit(quantum_circuit=new_circuit)
     backend = 'local_qasm_simulator_py'  # cpp simulator rejects non string IDs (FIXME)
     shots = 1024
     result = q_program.execute(backend=backend, shots=shots, seed=78)
     counts = result.get_counts(new_circuit.name)
     target = {'00': shots / 2, '01': shots / 2}
     threshold = 0.04 * shots
     self.assertDictAlmostEqual(counts, target, threshold)
     self.assertRaises(QISKitError, result.get_counts)
Esempio n. 13
0
 def test_add_circuit_noname(self):
     """Test add two circuits without names. Also tests get_counts without circuit name.
     """
     q_program = QuantumProgram()
     qr = q_program.create_quantum_register(size=2)
     cr = q_program.create_classical_register(size=2)
     qc1 = q_program.create_circuit(qregisters=[qr], cregisters=[cr])
     qc2 = q_program.create_circuit(qregisters=[qr], cregisters=[cr])
     qc1.h(qr[0])
     qc1.measure(qr[0], cr[0])
     qc2.measure(qr[1], cr[1])
     new_circuit = qc1 + qc2
     q_program.add_circuit(quantum_circuit=new_circuit)
     backend = 'local_qasm_simulator_py'  # cpp simulator rejects non string IDs (FIXME)
     shots = 1024
     result = q_program.execute(backend=backend, shots=shots, seed=78)
     counts = result.get_counts(new_circuit.name)
     target = {'00': shots / 2, '01': shots / 2}
     threshold = 0.04 * shots
     self.assertDictAlmostEqual(counts, target, threshold)
     self.assertRaises(QISKitError, result.get_counts)
Esempio n. 14
0
File: test.py Progetto: NickyBar/QIP
    def test_add_circuit(self):
        QP_program = QuantumProgram(specs=QPS_SPECS)
        qc, qr, cr = QP_program.get_quantum_elements()

        qc2 = QP_program.create_circuit("qc2", ["qname"], ["cname"])
        qc3 = QP_program.create_circuit("qc3", ["qname"], ["cname"])
        qc2.h(qr[0])
        qc3.h(qr[1])
        qc2.measure(qr[0], cr[0])
        qc3.measure(qr[0], cr[0])
        new_circuit = qc2 + qc3
        QP_program.add_circuit('new_circuit', new_circuit)
        # new_circuit.measure(qr[0], cr[0])
        circuits = ['new_circuit']

        device = 'local_qasm_simulator'  # the device to run on
        shots = 1  # the number of shots in the experiment.
        credits = 3
        coupling_map = None
        result = QP_program.execute(circuits, device, shots)

        self.assertEqual(result['status'], 'COMPLETED')
    def test_add_circuit(self):
        """Test add two circuits.

        If all correct should return the data
        """
        QP_program = QuantumProgram()
        qr = QP_program.create_quantum_register("qr", 2, verbose=False)
        cr = QP_program.create_classical_register("cr", 2, verbose=False)
        qc1 = QP_program.create_circuit("qc1", [qr], [cr])
        qc2 = QP_program.create_circuit("qc2", [qr], [cr])
        QP_program.set_api(API_TOKEN, URL)
        qc1.h(qr[0])
        qc1.measure(qr[0], cr[0])
        qc2.measure(qr[1], cr[1])
        new_circuit = qc1 + qc2
        QP_program.add_circuit('new_circuit', new_circuit)
        # new_circuit.measure(qr[0], cr[0])
        circuits = ['new_circuit']
        backend = 'local_qasm_simulator'  # the backend to run on
        shots = 1024  # the number of shots in the experiment.
        result = QP_program.execute(circuits, backend=backend, shots=shots,
                                    seed=78)
        self.assertEqual(result.get_counts('new_circuit'),
                         {'00': 505, '01': 519})
Esempio n. 16
0
        theCircuit.cx(qr[3], qr[2])
        theCircuit.x(qr[3])
        theCircuit.h(qr[3])

    #measure the third and fourth qubits in the computational basis
    theCircuit.measure(qr[2], cr[2])
    theCircuit.measure(qr[3], cr[3])

a, b = random.randint(1, 3), random.randint(1, 3)  #generate random integers

print("The values of a and b are, resp.,", a, b)
aliceCircuit = aliceCircuits["Alice" + str(a)]
bobCircuit = bobCircuits["Bob" + str(b)]

circuitName = "Alice" + str(a) + "Bob" + str(b)
Q_program.add_circuit(circuitName, sharedEntangled + aliceCircuit + bobCircuit)

backend = "local_qasm_simulator"
##backend = "ibmqx2"

shots = 1  # We perform a one-shot experiment
results = Q_program.execute([circuitName], backend=backend, shots=shots)
answer = results.get_counts(circuitName)
print(answer)
for key in answer.keys():
    aliceAnswer = [int(key[-1]), int(key[-2])]
    bobAnswer = [int(key[-3]), int(key[-4])]
    if sum(aliceAnswer) % 2 == 0:  #the sume of Alice answer must be even
        aliceAnswer.append(0)
    else:
        aliceAnswer.append(1)
Esempio n. 17
0
bv.x(tmp[0])
bv.h(q)
bv.h(tmp)
bv += oracle
bv.h(q)
bv.h(tmp)

bv.measure(q, res)
print(bv.qasm())

from qiskit.tools.visualization import circuit_drawer
circuit_drawer(bv)

from qiskit import QuantumProgram
qp = QuantumProgram()
qp.add_circuit(quantum_circuit=bv, name='bv')

from qiskit import backends
print(backends.local_backends())
print(backends.remote_backends())

import Qconfig
qp.set_api(Qconfig.APItoken, Qconfig.config['url'])

result = qp.execute('bv', backend='ibmqx4', timeout=3600)

counts = result.get_counts('bv')
print(counts)
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
Esempio n. 18
0
    # CX from qubit 1 to qubit 0
    qc.cx(q[2], q[1])

    # Post circuit operations
    qc.measure(q, c)

    # See a list of available local simulators
    print("Local backends: ", available_backends({'local': True}))

    # Compile and run the Quantum circuit on a simulator backend
    job_sim = execute(qc, "local_qasm_simulator", shots=10)
    sim_result = job_sim.result()

    # Create a quantum program for the process tomography simulation
    processprogram = QuantumProgram()
    processprogram.add_circuit('FTSWAP', qc)

    # Create registers for the process tomography
    qr = QuantumRegister(2)
    cr = ClassicalRegister(2)

    # Create the tomography set
    tomo_set = tomo.process_tomography_set([1, 0], 'Pauli', 'Pauli')
    tomo_circuits = tomo.create_tomography_circuits(processprogram, 'FTSWAP',
                                                    qr, cr, tomo_set)

    # Use the local simulator# Use t
    backend = 'local_qasm_simulator'

    # Take 5000 shots for each measurement basis
    shots = 500
Esempio n. 19
0
def eval_cost_function(entangler_map, coupling_map, initial_layout, n, m,
                       x_vec, class_labels, backend, shots, seed, train,
                       theta):
    sample_shots = 0
    # x_vec is the vector of training characteristics - size n
    # y is the binary outcome for each x_vec
    number_of_classes = len(class_labels)
    cost = 0
    total_cost = 0
    std_cost = 0

    predicted_results = []

    Q_program = QuantumProgram()
    # Q_program.set_api(Qconfig.APItoken,Qconfig.config["url"])

    ### RUN CIRCUITS
    circuits = []
    c = []
    sequences = []

    unlabeled_data = []
    for arrays in range(number_of_classes):
        labelgroup = x_vec[class_labels[arrays]]
        for item in labelgroup:
            unlabeled_data.append(item)

    # unlabeled_data = np.array([])
    # for arrays in range(number_of_classes):
    #     unlabeled_data = np.vstack((unlabeled_data,x_vec[class_labels[arrays]])) if unlabeled_data.size else x_vec[class_labels[arrays]]

    for key in x_vec.keys():
        for c_id, inpt in enumerate(x_vec[key]):
            c, sequences = trial_circuit_ML(entangler_map, coupling_map,
                                            initial_layout, n, m, theta, inpt,
                                            key + str(c_id), None, True)
            # c is 'A0', 'A1', 'A2', etc...
            circuits.append((key, c))
            Q_program.add_circuit(c, sequences)

    circuit_list = [c[1] for c in circuits]

    # circuits is ['A', 'A0'], ['A', 'A1'], ..., ['B', 'B0'],... etc
    # print(Q_program.get_qasm(circuit_list[0]))

    program_data = Q_program.execute(circuit_list,
                                     backend=backend,
                                     coupling_map=coupling_map,
                                     initial_layout=initial_layout,
                                     shots=shots,
                                     seed=seed)
    result = 0
    success = 0
    for v in range(len(circuit_list)):
        countsloop = program_data.get_counts(circuit_list[v])

        for cl in range(number_of_classes):
            if circuits[v][0] == class_labels[cl]:
                expected_outcome = class_labels[cl]

        probs = return_probabilities(countsloop, class_labels)
        result += cost_estimate_sigmoid(200, probs, expected_outcome)

        predicted_results.append(
            max(probs.items(), key=operator.itemgetter(1))[0])
        if max(probs.items(),
               key=operator.itemgetter(1))[0] == expected_outcome:
            success += 1
        global print_info
        if not train and print_info:
            print("\n=============================================\n")
            print('Classifying point %s. Label should be  %s \n' %
                  (unlabeled_data[v], expected_outcome))
            print('Measured label probability distribution is %s \n' % probs)
            if max(probs.items(),
                   key=operator.itemgetter(1))[0] == expected_outcome:
                print('Assigned label is  %s  CORRECT \n' %
                      max(probs.items(), key=operator.itemgetter(1))[0])
            else:
                print('Assigned label is  %s INCORRECT \n' %
                      max(probs.items(), key=operator.itemgetter(1))[0])

    total_cost = result / len(circuit_list)
    success_ratio = success / len(circuit_list)

    return total_cost, std_cost, success_ratio, predicted_results
#print(qiskit.available_backends())
job = qiskit.execute(bell, backend='local_statevector_simulator')
bell_psi = job.result().get_statevector(bell)
bell_rho = outer(
    bell_psi)  # construct the density matrix from the state vector

#plot the state
plot_state(bell_rho, 'paulivec')

# Construct state tomography set for measurement of qubits [0, 1] in the Pauli basis
bell_tomo_set = tomo.state_tomography_set([0, 1])

# Create a quantum program containing the state preparation circuit
Q_program = QuantumProgram()
Q_program.add_circuit('bell', bell)

# Add the state tomography measurement circuits to the Quantum Program
bell_tomo_circuit_names = tomo.create_tomography_circuits(
    Q_program, 'bell', qr, cr, bell_tomo_set)

print('Created State tomography circuits:')
for name in bell_tomo_circuit_names:
    print(name)

# Use the local simulator# Use t
backend = 'local_qasm_simulator'

# Take 5000 shots for each measurement basis
shots = 5000
Esempio n. 21
0
observable_second_ideal = {'00': 1, '01': 1, '10': -1, '11': -1}
observable_correlated_ideal = {'00': 1, '01': -1, '10': -1, '11': 1}

program = []
xdata = []

program_end = [measureZZ, measureZX, measureXX, measureXZ]

k = 0
for jj in range(30):
    theta = 2.0 * np.pi * jj / 30
    bell_middle = QuantumCircuit(q, c)
    bell_middle.ry(theta, q[0])
    for i in range(4):
        program.append('circuit' + str(k))
        Q_program.add_circuit('circuit' + str(k),
                              bell + bell_middle + program_end[i])
        k += 1

    xdata.append(theta)

Q_program.get_qasms(program[0:8])

result = Q_program.execute(program,
                           backend=backend,
                           shots=shots,
                           max_credits=3,
                           wait=10,
                           timeout=240,
                           silent=False)

CHSH_data_sim = []
Esempio n. 22
0
measureYXY.measure(q3[0], c3[0])
measureYXY.measure(q3[1], c3[1])
measureYXY.measure(q3[2], c3[2])

# quantum circuit to measure q YYX
measureYYX = Q_program.create_circuit('measureYYX', [q3], [c3])
measureYYX.s(q3[0]).inverse()
measureYYX.s(q3[1]).inverse()
measureYYX.h(q3[0])
measureYYX.h(q3[1])
measureYYX.h(q3[2])
measureYYX.measure(q3[0], c3[0])
measureYYX.measure(q3[1], c3[1])
measureYYX.measure(q3[2], c3[2])

Q_program.add_circuit('ghz_measureXXX', ghz + measureXXX)
Q_program.add_circuit('ghz_measureYYX', ghz + measureYYX)
Q_program.add_circuit('ghz_measureYXY', ghz + measureYXY)
Q_program.add_circuit('ghz_measureXYY', ghz + measureXYY)

circuits = [
    'ghz_measureXXX', 'ghz_measureYYX', 'ghz_measureYXY', 'ghz_measureXYY'
]
Q_program.get_qasms(circuits)
result6 = Q_program.execute(circuits,
                            backend=backend,
                            shots=shots,
                            max_credits=5,
                            wait=10,
                            timeout=240,
                            silent=False)
Esempio n. 23
0
    circuitName = "Decode" + pos
    decodingCircuits[circuitName] = program.create_circuit(
        circuitName, [q_register], [c_register])
    if pos == "Second":  #if pos == "First" we can directly measure
        decodingCircuits[circuitName].h(q_register[0])
    elif pos == "Third":
        decodingCircuits[circuitName].u3(pi / 2, -pi / 2, pi / 2,
                                         q_register[0])
    decodingCircuits[circuitName].measure(q_register[0], c_register[0])

#combine encoding and decoding of q_registerACs to get a list of complete circuits
circuitNames = []
for k1 in encodingCircuits.keys():
    for k2 in decodingCircuits.keys():
        circuitNames.append(k1 + k2)
        program.add_circuit(k1 + k2,
                            encodingCircuits[k1] + decodingCircuits[k2])

print("List of circuit names:", circuitNames)  #list of circuit names
#program.get_qasms(circuitNames) #list qasms codes

results = program.execute(circuitNames, backend=backend, shots=shots)
print("Experimental Result of Encode010DecodeFirst")
plot_histogram_file(
    "Encode010DecodeFirst.svg", results.get_counts(
        "Encode010DecodeFirst"))  #We should measure "0" with probability 0.78
print("Experimental Result of Encode010DecodeSecond")
plot_histogram_file(
    "Encode010DecodeSecond.svg", results.get_counts(
        "Encode010DecodeSecond"))  #We should measure "1" with probability 0.78
print("Experimental Result of Encode010DecodeThird")
plot_histogram_file(
measureXX.measure(q[0], c[0])
measureXX.measure(q[1], c[1])

# quantum circuit to measure ZX
measureZX = program.create_circuit('measureZX', [q], [c])
measureZX.h(q[0])
measureZX.measure(q[0], c[0])
measureZX.measure(q[1], c[1])

# quantum circuit to measure XZ
measureXZ = program.create_circuit('measureXZ', [q], [c])
measureXZ.h(q[1])
measureXZ.measure(q[0], c[0])
measureXZ.measure(q[1], c[1])

program.add_circuit('bell_measureZX', bell + measureZX)
program.add_circuit('bell_measureXZ', bell + measureXZ)
program.add_circuit('bell_measureZZ', bell + measureZZ)
program.add_circuit('bell_measureXX', bell + measureXX)

circuits = [
    'bell_measureZZ', 'bell_measureZX', 'bell_measureXX', 'bell_measureXZ'
]
program.get_qasms(circuits)

result = program.execute(circuits,
                         backend=backend,
                         shots=shots,
                         max_credits=3,
                         wait=10,
                         timeout=240,
Esempio n. 25
0
class QC():
    '''
    class QC
    '''
    # pylint: disable=too-many-instance-attributes
    def __init__(self, backend='local_qasm_simulator', remote=False, qubits=3):
        # private member
        # __qp
        self.__qp = None

        # calc phase
        self.phase = [
            ['0', 'initialized.']
            ]
        # config
        self.backend = backend
        self.remote = remote
        self.qubits = qubits
        # circuits variable
        self.shots = 2
        # async
        self.wait = False
        self.last = ['init', 'None']

        self.load()

    def load(self, api_info=True):
        '''
        load
        '''
        self.__qp = QuantumProgram()
        if self.remote:
            try:
                import Qconfig
                self.__qp.set_api(Qconfig.APItoken, Qconfig.config["url"],
                                  hub=Qconfig.config["hub"],
                                  group=Qconfig.config["group"],
                                  project=Qconfig.config["project"])

            except ImportError as ex:
                msg = 'Error in loading Qconfig.py!. Error = {}\n'.format(ex)
                sys.stdout.write(msg)
                sys.stdout.flush()
                return False

            if api_info is True:
                api = self.__qp.get_api()
                sys.stdout.write('<IBM Quantum Experience API information>\n')
                sys.stdout.flush()
                sys.stdout.write('Version: {0}\n'.format(api.api_version()))
                sys.stdout.write('User jobs (last 5):\n')
                jobs = api.get_jobs(limit=500)

                def format_date(job_item):
                    '''
                    format
                    '''
                    return datetime.strptime(job_item['creationDate'],
                                             '%Y-%m-%dT%H:%M:%S.%fZ')
                sortedjobs = sorted(jobs,
                                    key=format_date)
                sys.stdout.write('  {0:<32} {1:<24} {2:<9} {3}\n'
                                 .format('id',
                                         'creationDate',
                                         'status',
                                         'backend'))
                sys.stdout.write('{:-^94}\n'.format(""))
                for job in sortedjobs[-5:]:
                    sys.stdout.write('  {0:<32} {1:<24} {2:<9} {3}\n'
                                     .format(job['id'],
                                             job['creationDate'],
                                             job['status'],
                                             job['backend']['name']))
                sys.stdout.write('There are {0} jobs on the server\n'
                                 .format(len(jobs)))
                sys.stdout.write('Credits: {0}\n'
                                 .format(api.get_my_credits()))
                sys.stdout.flush()

        self.backends = self.__qp.available_backends()
        status = self.__qp.get_backend_status(self.backend)

        if 'available' in status:
            if status['available'] is False:
                return False
        return True

    def set_config(self, config=None):
        '''
        set config
        '''
        if config is None:
            config = {}

        if 'backend' in config:
            self.backend = str(config['backend'])
            if 'local_' in self.backend:
                self.remote = False
            else:
                self.remote = True

        if 'remote' in config:
            self.remote = config['remote']

        if 'qubits' in config:
            self.qubits = int(config['qubits'])

        return True

    def _progress(self, phasename, text):
        self.phase.append([str(phasename), str(text)])
        text = "Phase {0}: {1}".format(phasename, text)
        sys.stdout.write("{}\n".format(text))
        sys.stdout.flush()

    def _init_circuit(self):
        self._progress('1', 'Initialize quantum registers and circuit')
        qubits = self.qubits

        quantum_registers = [
            {"name": "cin", "size": 1},
            {"name": "qa", "size": qubits},
            {"name": "qb", "size": qubits},
            {"name": "cout", "size": 1}
            ]

        classical_registers = [
            {"name": "ans", "size": qubits + 1}
            ]

        if 'cin' in self.__qp.get_quantum_register_names():
            self.__qp.destroy_quantum_registers(quantum_registers)
            self.__qp.destroy_classical_registers(classical_registers)

        q_r = self.__qp.create_quantum_registers(quantum_registers)
        c_r = self.__qp.create_classical_registers(classical_registers)

        self.__qp.create_circuit("qcirc", q_r, c_r)

    def _create_circuit_qadd(self):
        # quantum ripple-carry adder from Cuccaro et al, quant-ph/0410184
        def majority(circuit, q_a, q_b, q_c):
            '''
            majority
            '''
            circuit.cx(q_c, q_b)
            circuit.cx(q_c, q_a)
            circuit.ccx(q_a, q_b, q_c)

        def unmaj(circuit, q_a, q_b, q_c):
            '''
            unmajority
            '''
            circuit.ccx(q_a, q_b, q_c)
            circuit.cx(q_c, q_a)
            circuit.cx(q_a, q_b)

        def adder(circuit, c_in, q_a, q_b, c_out, qubits):
            '''
            adder
            '''
            # pylint: disable=too-many-arguments
            majority(circuit, c_in[0], q_b[0], q_a[0])
            for i in range(qubits - 1):
                majority(circuit, q_a[i], q_b[i + 1], q_a[i + 1])

            circuit.cx(q_a[qubits - 1], c_out[0])

            for i in range(qubits - 1)[::-1]:
                unmaj(circuit, q_a[i], q_b[i + 1], q_a[i + 1])
            unmaj(circuit, c_in[0], q_b[0], q_a[0])

        if 'add' not in self.__qp.get_circuit_names():
            [c_in, q_a, q_b, c_out] = map(self.__qp.get_quantum_register,
                                          ["cin", "qa", "qb", "cout"])
            ans = self.__qp.get_classical_register('ans')
            qadder = self.__qp.create_circuit("qadd",
                                              [c_in, q_a, q_b, c_out],
                                              [ans])
            adder(qadder, c_in, q_a, q_b, c_out, self.qubits)

        return 'add' in self.__qp.get_circuit_names()

    def _create_circuit_qsub(self):
        circuit_names = self.__qp.get_circuit_names()
        if 'qsub' not in circuit_names:
            if 'qadd' not in circuit_names:
                self._create_circuit_qadd()

            # subtractor circuit
            self.__qp.add_circuit('qsub', self.__qp.get_circuit('qadd'))
            qsubtractor = self.__qp.get_circuit('qsub')
            qsubtractor.reverse()
        return 'qsub' in self.__qp.get_circuit_names()

    def _qadd(self, input_a, input_b=None, subtract=False, observe=False):
        # pylint: disable=too-many-locals

        def measure(circuit, q_b, c_out, ans):
            '''
            measure
            '''
            circuit.barrier()
            for i in range(self.qubits):
                circuit.measure(q_b[i], ans[i])
            circuit.measure(c_out[0], ans[self.qubits])

        def char2q(circuit, cbit, qbit):
            '''
            char2q
            '''
            if cbit == '1':
                circuit.x(qbit)
            elif cbit == 'H':
                circuit.h(qbit)
                self.shots = 5 * (2**self.qubits)

        def input_state(circuit, input_a, input_b=None):
            '''
            input state
            '''
            input_a = input_a[::-1]
            for i in range(self.qubits):
                char2q(circuit, input_a[i], q_a[i])

            if input_b is not None:
                input_b = input_b[::-1]
                for i in range(self.qubits):
                    char2q(circuit, input_b[i], q_b[i])

        def reset_input(circuit, c_in, q_a, c_out):
            '''
            reset input
            '''
            circuit.reset(c_in)
            circuit.reset(c_out)
            for i in range(self.qubits):
                circuit.reset(q_a[i])

        # get registers
        [c_in, q_a, q_b, c_out] = map(self.__qp.get_quantum_register,
                                      ["cin", "qa", "qb", "cout"])
        ans = self.__qp.get_classical_register('ans')
        qcirc = self.__qp.get_circuit('qcirc')

        self._progress('2',
                       'Define input state ({})'
                       .format('QADD' if subtract is False else 'QSUB'))
        if input_b is not None:
            if subtract is True:
                # subtract
                input_state(qcirc, input_b, input_a)
            else:
                # add
                input_state(qcirc, input_a, input_b)
        else:
            reset_input(qcirc, c_in, q_a, c_out)
            input_state(qcirc, input_a)

        self._progress('3',
                       'Define quantum circuit ({})'
                       .format('QADD' if subtract is False else 'QSUB'))
        if subtract is True:
            self._create_circuit_qsub()
            qcirc.extend(self.__qp.get_circuit('qsub'))
        else:
            self._create_circuit_qadd()
            qcirc.extend(self.__qp.get_circuit('qadd'))

        if observe is True:
            measure(qcirc, q_b, c_out, ans)

    def _qsub(self, input_a, input_b=None, observe=False):
        self._qadd(input_a, input_b, subtract=True, observe=observe)

    def _qope(self, input_a, operator, input_b=None, observe=False):
        if operator == '+':
            return self._qadd(input_a, input_b, observe=observe)
        elif operator == '-':
            return self._qsub(input_a, input_b, observe=observe)
        return None

    def _compile(self, name, cross_backend=None, print_qasm=False):
        self._progress('4', 'Compile quantum circuit')

        coupling_map = None
        if cross_backend is not None:
            backend_conf = self.__qp.get_backend_configuration(cross_backend)
            coupling_map = backend_conf.get('coupling_map', None)
            if coupling_map is None:
                sys.stdout.write('backend: {} coupling_map not found'
                                 .format(cross_backend))

        qobj = self.__qp.compile([name],
                                 backend=self.backend,
                                 shots=self.shots,
                                 seed=1,
                                 coupling_map=coupling_map)

        if print_qasm is True:
            sys.stdout.write(self.__qp.get_compiled_qasm(qobj, 'qcirc'))
            sys.stdout.flush()
        return qobj

    def _run(self, qobj):
        self._progress('5', 'Run quantum circuit (wait for answer)')
        result = self.__qp.run(qobj, wait=5, timeout=100000)
        return result

    def _run_async(self, qobj):
        '''
        _run_async
        '''
        self._progress('5', 'Run quantum circuit')
        self.wait = True

        def async_result(result):
            '''
            async call back
            '''
            self.wait = False
            self.last = self.result_parse(result)

        self.__qp.run_async(qobj,
                            wait=5, timeout=100000, callback=async_result)

    def _is_regular_number(self, numstring, base):
        '''
        returns input binary format string or None.
        '''
        if base == 'bin':
            binstring = numstring
        elif base == 'dec':
            if numstring == 'H':
                binstring = 'H'*self.qubits
            else:
                binstring = format(int(numstring), "0{}b".format(self.qubits))

        if len(binstring) != self.qubits:
            return None

        return binstring

    def get_seq(self, text, base='dec'):
        '''
        convert seq and check it
        if text is invalid, return the list of length 0.
        '''
        operators = u'(\\+|\\-)'
        seq = re.split(operators, text)

        # length check
        if len(seq) % 2 == 0 or len(seq) == 1:
            return []

        # regex
        if base == 'bin':
            regex = re.compile(r'[01H]+')
        else:
            regex = re.compile(r'(^(?!.H)[0-9]+|H)')

        for i in range(0, len(seq), 2):
            match = regex.match(seq[i])
            if match is None:
                return []
            num = match.group(0)
            seq[i] = self._is_regular_number(num, base)

            if seq[i] is None:
                return []

        return seq

    def result_parse(self, result):
        '''
        result_parse
        '''
        data = result.get_data("qcirc")
        sys.stdout.write("job id: {0}\n".format(result.get_job_id()))
        sys.stdout.write("raw result: {0}\n".format(data))
        sys.stdout.write("{:=^40}\n".format("answer"))

        counts = data['counts']
        sortedcounts = sorted(counts.items(),
                              key=lambda x: -x[1])

        sortedans = []
        for count in sortedcounts:
            if count[0][0] == '1':
                ans = 'OR'
            else:
                ans = str(int(count[0][-self.qubits:], 2))
            sortedans.append(ans)
            sys.stdout.write('Dec: {0:>2} Bin: {1} Count: {2} \n'
                             .format(ans, str(count[0]), str(count[1])))

        sys.stdout.write('{0:d} answer{1}\n'
                         .format(len(sortedans),
                                 '' if len(sortedans) == 1 else 's'))
        sys.stdout.write("{:=^40}\n".format(""))
        if 'time' in data:
            sys.stdout.write("time: {0:<3} sec\n".format(data['time']))
        sys.stdout.write("All process done.\n")
        sys.stdout.flush()

        uniqanswer = sorted(set(sortedans), key=sortedans.index)

        ans = ",".join(uniqanswer)

        return [str(result), ans]

    def exec_calc(self, text, base='dec', wait_result=False):
        '''
        exec_calc
        '''
        seq = self.get_seq(text, base)
        print('QC seq:', seq)
        if seq == []:
            return ["Syntax error", None]

        # fail message
        fail_msg = None

        try:
            self._init_circuit()
            numbers = seq[0::2]     # slice even index
            i = 1
            observe = False
            for oper in seq[1::2]:  # slice odd index
                if i == len(numbers) - 1:
                    observe = True
                if i == 1:
                    self._qope(numbers[0], oper, numbers[1], observe=observe)
                else:
                    self._qope(numbers[i], oper, observe=observe)
                i = i + 1

            qobj = self._compile('qcirc')

            if wait_result is True:
                [status, ans] = self.result_parse(self._run(qobj))
            else:
                self._run_async(qobj)
                [status, ans] = [
                    'Wait. Calculating on {0}'.format(self.backend),
                    '...'
                    ]

        except QISKitError as ex:
            fail_msg = ('There was an error in the circuit!. Error = {}\n'
                        .format(ex))
        except RegisterSizeError as ex:
            fail_msg = ('Error in the number of registers!. Error = {}\n'
                        .format(ex))

        if fail_msg is not None:
            sys.stdout.write(fail_msg)
            sys.stdout.flush()
            return ["FAIL", None]

        return [status, ans]
Esempio n. 26
0
                                                           initial_theta,SPSA_params,max_trials,save_step,1);




plt.plot(np.arange(0, max_trials,save_step), cost_plus,label='C(theta_plus)')
plt.plot(np.arange(0, max_trials,save_step),cost_minus,label='C(theta_minus)')
plt.plot(np.arange(0, max_trials,save_step),np.ones(max_trials//save_step)*best_distance_quantum, label='Final Optimized Cost')
plt.plot(np.arange(0, max_trials,save_step),np.ones(max_trials//save_step)*exact, label='Exact Cost')
plt.legend()
plt.xlabel('Number of trials')
plt.ylabel('Cost')

shots = 5000
circuits = ['final_circuit']
Q_program.add_circuit('final_circuit', trial_circuit_ry(n, m, best_theta, entangler_map, None, True))
result = Q_program.execute(circuits, backend=backend, shots=shots, coupling_map=coupling_map, initial_layout=initial_layout)
data = result.get_counts('final_circuit')
plot_histogram(data,5)




# Getting the solution and cost from the largest component of the optimal quantum state

max_value = max(data.values())  # maximum value
max_keys = [k for k, v in data.items() if v == max_value] # getting all keys containing the `maximum`

x_quantum=np.zeros(n)
for bit in range(n):
    if max_keys[0][bit]=='1':
Esempio n. 27
0
#backend = 'local_qasm_simulator' # the device to run on
backend = 'ibmqx2'  # the backend to run on
shots = 1024  # the number of shots in the experiment

Q_program = QuantumProgram()
Q_program.set_api(Qconfig.APItoken, Qconfig.config['url'])
# quantum circuit to make GHZ state
q3 = Q_program.create_quantum_register('q3', 3)
c3 = Q_program.create_classical_register('c3', 3)
ghz = Q_program.create_circuit('ghz', [q3], [c3])
ghz.h(q3[0])
ghz.cx(q3[0], q3[1])
ghz.cx(q3[0], q3[2])

# quantum circuit to measure q in standard basis
measureZZZ = Q_program.create_circuit('measureZZZ', [q3], [c3])
measureZZZ.measure(q3[0], c3[0])
measureZZZ.measure(q3[1], c3[1])
measureZZZ.measure(q3[2], c3[2])

Q_program.add_circuit('ghz_measureZZZ', ghz + measureZZZ)
circuits = ['ghz_measureZZZ']
Q_program.get_qasms(circuits)
result5 = Q_program.execute(circuits,
                            backend=backend,
                            shots=shots,
                            max_credits=5,
                            wait=10,
                            timeout=240,
                            silent=True)
plot_histogram_file('ghz_measureZZZ.svg', result5.get_counts('ghz_measureZZZ'))
Esempio n. 28
0
p_flip.iden(q3[0])
p_flip.iden(q3[1])
p_flip.iden(q3[2])

p_flip.z(q3[0])

p_flip.h(q3[0])
p_flip.h(q3[1])
p_flip.h(q3[2])

p_flip.cx(q3[0], q3[2])
p_flip.cx(q3[0], q3[1])
p_flip.ccx(q3[2], q3[1], q3[0])

measureZ = QuantumCircuit(q3, c3)

measureZ.measure(q3[2], c3[2])
measureZ.measure(q3[1], c3[1])
measureZ.measure(q3[0], c3[0])

Q_program.add_circuit("p_flip_code", p_flip + measureZ)
circuits = ["p_flip_code"]
result = Q_program.execute(circuits,
                           backend=backend,
                           shots=shots,
                           max_credits=3,
                           wait=10,
                           timeout=600)
plot_histogram(result.get_counts("p_flip_code"))
print(result.get_counts("p_flip_code"))
Esempio n. 29
0
def kernel_join(points_array, points_array2, entangler_map, coupling_map,
                initial_layout, shots, seed, num_of_qubits, backend):
    Q_program = QuantumProgram()
    circuits = []
    is_identical = np.all(points_array == points_array2)

    my_zero_string = get_zero_string(num_of_qubits)
    if is_identical:  # we reduce the computation by leveraging the symmetry of matrix: compute only the upper-right corner
        size = len(points_array)
        my_product_list = list(
            itertools.combinations(range(len(points_array)), 2))
        for a in range(len(my_product_list)):
            first_index = my_product_list[a][
                0]  # This number is first datapoint in product
            second_index = my_product_list[a][
                1]  # This number is second datapoint in product
            sequencesp = inner_prod_circuit_ML(entangler_map, coupling_map,
                                               initial_layout, num_of_qubits,
                                               points_array[first_index],
                                               points_array[second_index],
                                               None, True)

            circuit_name = 'join_' + str(first_index) + "_" + str(second_index)
            circuits.append(circuit_name)
            Q_program.add_circuit(circuit_name, sequencesp)

        circuit_list = [c for c in circuits]
        program_data = Q_program.execute(circuit_list,
                                         backend=backend,
                                         coupling_map=coupling_map,
                                         initial_layout=initial_layout,
                                         shots=shots,
                                         seed=seed)

        mat = np.eye(
            size,
            size)  # element on the diagonal is always 1: point*point=|point|^2
        for v in range(len(program_data)):
            circuit_name = circuits[v]
            tmp = circuit_name.split('_')
            first_index = int(tmp[1])
            second_index = int(tmp[2])
            countsloop = program_data.get_counts(circuit_list[v])

            if my_zero_string in countsloop:
                mat[first_index][
                    second_index] = countsloop[my_zero_string] / shots
            else:
                mat[first_index][second_index] = 0
            mat[second_index][first_index] = mat[first_index][second_index]
        return mat
    else:
        Q_program = QuantumProgram()
        total_test = points_array
        svm = points_array2

        for a in range(len(total_test)):
            for b in range(len(svm)):
                sequencesp = inner_prod_circuit_ML(entangler_map, coupling_map,
                                                   initial_layout,
                                                   num_of_qubits, svm[b],
                                                   total_test[a], None, True)
                cp = 'join_' + str(a) + "_" + str(b)
                circuits.append(cp)
                Q_program.add_circuit(cp, sequencesp)

        circuit_list = [c for c in circuits]
        program_data = Q_program.execute(circuit_list,
                                         backend=backend,
                                         coupling_map=coupling_map,
                                         initial_layout=initial_layout,
                                         shots=shots,
                                         seed=seed)

        mat = np.zeros((len(total_test), len(svm)))
        for v in range(len(program_data)):
            countsloop = program_data.get_counts(circuit_list[v])
            if my_zero_string in countsloop:
                circuit_name = circuits[v]
                tmp = circuit_name.split('_')
                first_index = int(tmp[1])
                second_index = int(tmp[2])
                countsloop = program_data.get_counts(circuit_list[v])

                if my_zero_string in countsloop:
                    mat[first_index][
                        second_index] = countsloop[my_zero_string] / shots
                else:
                    mat[first_index][second_index] = 0

        return mat
Esempio n. 30
0
def msquare():
    ans = []

    Q_program = QuantumProgram()
    Q_program.set_api(Qconfig.APItoken,
                      Qconfig.config["url"])  # set the APIToken and API url

    N = 4
    # Creating registers
    qr = Q_program.create_quantum_register("qr", N)

    # for recording the measurement on qr
    cr = Q_program.create_classical_register("cr", N)

    circuitName = "sharedEntangled"
    sharedEntangled = Q_program.create_circuit(circuitName, [qr], [cr])

    #Create uniform superposition of all strings of length 2
    for i in range(2):
        sharedEntangled.h(qr[i])

    #The amplitude is minus if there are odd number of 1s
    for i in range(2):
        sharedEntangled.z(qr[i])

    #Copy the content of the fist two qubits to the last two qubits
    for i in range(2):
        sharedEntangled.cx(qr[i], qr[i + 2])

    #Flip the last two qubits
    for i in range(2, 4):
        sharedEntangled.x(qr[i])
    #we first define controlled-u gates required to assign phases
    from math import pi

    def ch(qProg, a, b):
        """ Controlled-Hadamard gate """
        qProg.h(b)
        qProg.sdg(b)
        qProg.cx(a, b)
        qProg.h(b)
        qProg.t(b)
        qProg.cx(a, b)
        qProg.t(b)
        qProg.h(b)
        qProg.s(b)
        qProg.x(b)
        qProg.s(a)
        return qProg

    def cu1pi2(qProg, c, t):
        """ Controlled-u1(phi/2) gate """
        qProg.u1(pi / 4.0, c)
        qProg.cx(c, t)
        qProg.u1(-pi / 4.0, t)
        qProg.cx(c, t)
        qProg.u1(pi / 4.0, t)
        return qProg

    def cu3pi2(qProg, c, t):
        """ Controlled-u3(pi/2, -pi/2, pi/2) gate """
        qProg.u1(pi / 2.0, t)
        qProg.cx(c, t)
        qProg.u3(-pi / 4.0, 0, 0, t)
        qProg.cx(c, t)
        qProg.u3(pi / 4.0, -pi / 2.0, 0, t)
        return qProg

    # dictionary for Alice's operations/circuits
    aliceCircuits = {}
    # Quantum circuits for Alice when receiving idx in 1, 2, 3
    for idx in range(1, 4):
        circuitName = "Alice" + str(idx)
        aliceCircuits[circuitName] = Q_program.create_circuit(
            circuitName, [qr], [cr])
        theCircuit = aliceCircuits[circuitName]

        if idx == 1:
            #the circuit of A_1
            theCircuit.x(qr[1])
            theCircuit.cx(qr[1], qr[0])
            theCircuit = cu1pi2(theCircuit, qr[1], qr[0])
            theCircuit.x(qr[0])
            theCircuit.x(qr[1])
            theCircuit = cu1pi2(theCircuit, qr[0], qr[1])
            theCircuit.x(qr[0])
            theCircuit = cu1pi2(theCircuit, qr[0], qr[1])
            theCircuit = cu3pi2(theCircuit, qr[0], qr[1])
            theCircuit.x(qr[0])
            theCircuit = ch(theCircuit, qr[0], qr[1])
            theCircuit.x(qr[0])
            theCircuit.x(qr[1])
            theCircuit.cx(qr[1], qr[0])
            theCircuit.x(qr[1])

        elif idx == 2:
            theCircuit.x(qr[0])
            theCircuit.x(qr[1])
            theCircuit = cu1pi2(theCircuit, qr[0], qr[1])
            theCircuit.x(qr[0])
            theCircuit.x(qr[1])
            theCircuit = cu1pi2(theCircuit, qr[0], qr[1])
            theCircuit.x(qr[0])
            theCircuit.h(qr[0])
            theCircuit.h(qr[1])

        elif idx == 3:
            theCircuit.cz(qr[0], qr[1])
            theCircuit.swap(qr[0], qr[1])
            theCircuit.h(qr[0])
            theCircuit.h(qr[1])
            theCircuit.x(qr[0])
            theCircuit.x(qr[1])
            theCircuit.cz(qr[0], qr[1])
            theCircuit.x(qr[0])
            theCircuit.x(qr[1])

        #measure the first two qubits in the computational basis
        theCircuit.measure(qr[0], cr[0])
        theCircuit.measure(qr[1], cr[1])

    # dictionary for Bob's operations/circuits
    bobCircuits = {}
    # Quantum circuits for Bob when receiving idx in 1, 2, 3
    for idx in range(1, 4):
        circuitName = "Bob" + str(idx)
        bobCircuits[circuitName] = Q_program.create_circuit(
            circuitName, [qr], [cr])
        theCircuit = bobCircuits[circuitName]
        if idx == 1:
            theCircuit.x(qr[2])
            theCircuit.x(qr[3])
            theCircuit.cz(qr[2], qr[3])
            theCircuit.x(qr[3])
            theCircuit.u1(pi / 2.0, qr[2])
            theCircuit.x(qr[2])
            theCircuit.z(qr[2])
            theCircuit.cx(qr[2], qr[3])
            theCircuit.cx(qr[3], qr[2])
            theCircuit.h(qr[2])
            theCircuit.h(qr[3])
            theCircuit.x(qr[3])
            theCircuit = cu1pi2(theCircuit, qr[2], qr[3])
            theCircuit.x(qr[2])
            theCircuit.cz(qr[2], qr[3])
            theCircuit.x(qr[2])
            theCircuit.x(qr[3])

        elif idx == 2:
            theCircuit.x(qr[2])
            theCircuit.x(qr[3])
            theCircuit.cz(qr[2], qr[3])
            theCircuit.x(qr[3])
            theCircuit.u1(pi / 2.0, qr[3])
            theCircuit.cx(qr[2], qr[3])
            theCircuit.h(qr[2])
            theCircuit.h(qr[3])

        elif idx == 3:
            theCircuit.cx(qr[3], qr[2])
            theCircuit.x(qr[3])
            theCircuit.h(qr[3])

        #measure the third and fourth qubits in the computational basis
        theCircuit.measure(qr[2], cr[2])
        theCircuit.measure(qr[3], cr[3])

    a, b = random.randint(1, 3), random.randint(1,
                                                3)  #generate random integers

    for i in range(3):
        for j in range(3):
            a = i + 1
            b = j + 1
            # print("The values of a and b are, resp.,", a,b)
            aliceCircuit = aliceCircuits["Alice" + str(a)]
            bobCircuit = bobCircuits["Bob" + str(b)]

            circuitName = "Alice" + str(a) + "Bob" + str(b)
            Q_program.add_circuit(circuitName,
                                  sharedEntangled + aliceCircuit + bobCircuit)

            backend = "local_qasm_simulator"
            ##backend = "ibmqx2"

            shots = 1  # We perform a one-shot experiment
            results = Q_program.execute([circuitName],
                                        backend=backend,
                                        shots=shots)
            answer = results.get_counts(circuitName)
            # print(answer)
            for key in answer.keys():
                aliceAnswer = [int(key[-1]), int(key[-2])]
                bobAnswer = [int(key[-3]), int(key[-4])]
                if sum(aliceAnswer
                       ) % 2 == 0:  #the sume of Alice answer must be even
                    aliceAnswer.append(0)
                else:
                    aliceAnswer.append(1)
                if sum(bobAnswer) % 2 == 1:  #the sum of Bob answer must be odd
                    bobAnswer.append(0)
                else:
                    bobAnswer.append(1)
                break

            # print("Alice answer for a = ", a, "is", aliceAnswer)
            # print("Bob answer for b = ", b, "is", bobAnswer)

            print(a, b)
            ans.append(aliceAnswer)
            ans.append(bobAnswer)

            # if(aliceAnswer[b-1] != bobAnswer[a-1]): #check if the intersection of their answers is the same
            #     print("Alice and Bob lost")
            # else:
            #     print("Alice and Bob won")

            backend = "local_qasm_simulator"
            #backend = "ibmqx2"
            shots = 10  # We perform 10 shots of experiments for each round
            nWins = 0
            nLost = 0
            for a in range(1, 4):
                for b in range(1, 4):
                    # print("Asking Alice and Bob with a and b are, resp.,", a,b)
                    rWins = 0
                    rLost = 0

                    aliceCircuit = aliceCircuits["Alice" + str(a)]
                    bobCircuit = bobCircuits["Bob" + str(b)]
                    circuitName = "Alice" + str(a) + "Bob" + str(b)
                    Q_program.add_circuit(
                        circuitName,
                        sharedEntangled + aliceCircuit + bobCircuit)

                    if backend == "ibmqx2":
                        ibmqx2_backend = Q_program.get_backend_configuration(
                            'ibmqx2')
                        ibmqx2_coupling = ibmqx2_backend['coupling_map']
                        results = Q_program.execute(
                            [circuitName],
                            backend=backend,
                            shots=shots,
                            coupling_map=ibmqx2_coupling,
                            max_credits=3,
                            wait=10,
                            timeout=240)
                    else:
                        results = Q_program.execute([circuitName],
                                                    backend=backend,
                                                    shots=shots)
                    answer = results.get_counts(circuitName)

                    for key in answer.keys():
                        kfreq = answer[
                            key]  #frequencies of keys obtained from measurements
                        aliceAnswer = [int(key[-1]), int(key[-2])]
                        bobAnswer = [int(key[-3]), int(key[-4])]
                        if sum(aliceAnswer) % 2 == 0:
                            aliceAnswer.append(0)
                        else:
                            aliceAnswer.append(1)
                        if sum(bobAnswer) % 2 == 1:
                            bobAnswer.append(0)
                        else:
                            bobAnswer.append(1)

                        #print("Alice answer for a = ", a, "is", aliceAnswer)
                        #print("Bob answer for b = ", b, "is", bobAnswer)

                        if (aliceAnswer[b - 1] != bobAnswer[a - 1]):
                            #print(a, b, "Alice and Bob lost")
                            nLost += kfreq
                            rLost += kfreq
                        else:
                            #print(a, b, "Alice and Bob won")
                            nWins += kfreq
                            rWins += kfreq
            #         print("\t#wins = ", rWins, "out of ", shots, "shots")
            #
            # print("Number of Games = ", nWins+nLost)
            # print("Number of Wins = ", nWins)
            # print("Winning probabilities = ", (nWins*100.0)/(nWins+nLost))
    return ans
Esempio n. 31
0
measureXI.h(q_register[1])
measureXI.measure(q_register[1], c_register[1])

# quantum circuit to measure q in the standard basis
measureZZ = program.create_circuit("measureZZ", [q_register], [c_register])
measureZZ.measure(q_register[0], c_register[0])
measureZZ.measure(q_register[1], c_register[1])

# quantum circuit to measure q in the superposition basis
measureXX = program.create_circuit("measureXX", [q_register], [c_register])
measureXX.h(q_register[0])
measureXX.h(q_register[1])
measureXX.measure(q_register[0], c_register[0])
measureXX.measure(q_register[1], c_register[1])

program.add_circuit("bell_measureIZ", bell + measureIZ)
program.add_circuit("bell_measureIX", bell + measureIX)
program.add_circuit("bell_measureZI", bell + measureZI)
program.add_circuit("bell_measureXI", bell + measureXI)
program.add_circuit("bell_measureZZ", bell + measureZZ)
program.add_circuit("bell_measureXX", bell + measureXX)

circuits = [
    "bell_measureIZ", "bell_measureIX", "bell_measureZI", "bell_measureXI",
    "bell_measureZZ", "bell_measureXX"
]
program.get_qasms(circuits)

result = program.execute(circuits[0:2],
                         backend=backend,
                         shots=shots,