Exemple #1
0
 def correct(self):
     yield cirq.ops.Moment([
         cirq.CNOT(self.physical_qubits[0], self.physical_qubits[1]),
         cirq.CNOT(self.physical_qubits[3], self.physical_qubits[4]),
         cirq.CNOT(self.physical_qubits[6], self.physical_qubits[7])
     ])
     yield cirq.ops.Moment([
         cirq.CNOT(self.physical_qubits[0], self.physical_qubits[2]),
         cirq.CNOT(self.physical_qubits[3], self.physical_qubits[5]),
         cirq.CNOT(self.physical_qubits[6], self.physical_qubits[8])
     ])
     yield cirq.ops.Moment([
         cirq.CCNOT(self.physical_qubits[1], self.physical_qubits[2],
                    self.physical_qubits[0]),
         cirq.CCNOT(self.physical_qubits[4], self.physical_qubits[5],
                    self.physical_qubits[3]),
         cirq.CCNOT(self.physical_qubits[7], self.physical_qubits[8],
                    self.physical_qubits[6])
     ])
     yield cirq.ops.Moment([
         cirq.H(self.physical_qubits[0]),
         cirq.H(self.physical_qubits[3]),
         cirq.H(self.physical_qubits[6])
     ])
     yield cirq.ops.Moment(
         [cirq.CNOT(self.physical_qubits[0], self.physical_qubits[3])])
     yield cirq.ops.Moment(
         [cirq.CNOT(self.physical_qubits[0], self.physical_qubits[6])])
     yield cirq.ops.Moment([
         cirq.CCNOT(self.physical_qubits[3], self.physical_qubits[6],
                    self.physical_qubits[0])
     ])
def test_build_logical_qubits_graph():
    # One connected component.
    c = cirq.Circuit(
        cirq.ISWAP(a2, a0),
        cirq.ISWAP(a0, a1),
        cirq.ISWAP(a0, a2),
        cirq.ISWAP(a1, a2),
        cirq.ISWAP(a2, a3),
    )
    assert imu.build_logical_qubits_graph(c) == {
        a0: [(a2, 0), (a1, 1)],
        a1: [(a0, 1), (a2, 3)],
        a2: [(a0, 0), (a1, 3), (a3, 4)],
        a3: [(a2, 4)],
    }
    # Three connected components with one-qubit and two-qubit gates.
    c = cirq.Circuit(
        cirq.ISWAP(a2, a0),
        cirq.ISWAP(a0, a1),
        cirq.ISWAP(a0, a2),
        cirq.ISWAP(a1, a2),
        cirq.ISWAP(a2, a3),
        cirq.ISWAP(a4, a5),
        cirq.X(a6),
    )
    assert imu.build_logical_qubits_graph(c) == {
        a0: [(a2, 0), (a1, 1)],
        a1: [(a0, 1), (a2, 3)],
        a2: [(a0, 0), (a1, 3), (a3, 4)],
        a3: [(a2, 4), (a6, 6)],
        a4: [(a5, 0), (a6, 5)],
        a5: [(a4, 0)],
        a6: [(a4, 5), (a3, 6)],
    }
    # Three connected components with only one-qubit gates.
    c = cirq.Circuit(cirq.X(a1), cirq.X(a2), cirq.X(a3))
    assert imu.build_logical_qubits_graph(c) == {
        a1: [(a3, 2)],
        a2: [(a3, 1)],
        a3: [(a2, 1), (a1, 2)],
    }
    # Three connected components with a measurement gates.
    c = cirq.Circuit(cirq.X(a1), cirq.X(a2), cirq.X(a3), cirq.measure(a1))
    assert imu.build_logical_qubits_graph(c) == {
        a1: [(a3, 3)],
        a2: [(a3, 2)],
        a3: [(a2, 2), (a1, 3)],
    }
    # One connected component with an invalid gate.
    with pytest.raises(ValueError, match="Operation.*has more than 2 qubits!"):
        c = cirq.Circuit(cirq.X(a1), cirq.X(a2), cirq.CCNOT(a1, a2, a3))
        imu.build_logical_qubits_graph(c)
Exemple #3
0
def type_circuit(n):
    type_x = [[cirq.X(LineQubit(i)), 1] for i in range(n)]
    type_cnot = [[cirq.CNOT(LineQubit(i), LineQubit(j)), 3] for i in range(n)
                 for j in range(n) if i != j]
    type_ccnot = [[cirq.CCNOT(LineQubit(i), LineQubit(j), LineQubit(k)), 7]
                  for i in range(n) for j in range(n) for k in range(j, n)
                  if i != j and i != k and j != k]
    type_all = type_x + type_cnot + type_ccnot
    # print('{}\n{}种情况'.format(type_all, len(type_all)))
    print('{}种情况'.format(len(type_all)))
    q = [LineQubit(i) for i in range(n)]
    for i in range(len(type_all)):
        circuit = cirq.Circuit(cirq.I.on_each(*q))
        circuit.append(type_all[i][0])
        type_all[i].append(circuit.unitary())
    return type_all
@pytest.mark.parametrize(
    "op,expected",
    [
        (cirq.H(Q), True),
        (cirq.HPowGate(exponent=0.5)(Q), False),
        (cirq.PhasedXPowGate(exponent=0.25, phase_exponent=0.125)(Q), True),
        (cirq.XPowGate(exponent=0.5)(Q), True),
        (cirq.YPowGate(exponent=0.25)(Q), True),
        (cirq.ZPowGate(exponent=0.125)(Q), True),
        (cirq.CZPowGate(exponent=0.5)(Q, Q2), False),
        (cirq.CZ(Q, Q2), True),
        (cirq.CNOT(Q, Q2), True),
        (cirq.SWAP(Q, Q2), False),
        (cirq.ISWAP(Q, Q2), False),
        (cirq.CCNOT(Q, Q2, Q3), True),
        (cirq.CCZ(Q, Q2, Q3), True),
        (cirq.ParallelGate(cirq.X, num_copies=3)(Q, Q2, Q3), True),
        (cirq.ParallelGate(cirq.Y, num_copies=3)(Q, Q2, Q3), True),
        (cirq.ParallelGate(cirq.Z, num_copies=3)(Q, Q2, Q3), True),
        (cirq.X(Q).controlled_by(Q2, Q3), True),
        (cirq.Z(Q).controlled_by(Q2, Q3), True),
        (cirq.ZPowGate(exponent=0.5)(Q).controlled_by(Q2, Q3), False),
    ],
)
def test_gateset(op: cirq.Operation, expected: bool):
    gs = cirq_pasqal.PasqalGateset()
    assert gs.validate(op) == expected
    assert gs.validate(cirq.Circuit(op)) == expected

Exemple #5
0
                     num_controls=2,
                     control_values=[0, 1],
                     control_qid_shape=(3, 2)),
 'CX':
 cirq.CX,
 'CSWAP':
 cirq.CSWAP,
 'CSwapGate':
 cirq.CSwapGate(),
 'CZ':
 cirq.CZ,
 'CZPowGate':
 cirq.CZPowGate(exponent=0.123, global_shift=0.456),
 'Circuit': [
     cirq.Circuit(cirq.H.on_each(QUBITS), cirq.measure(*QUBITS)),
     cirq.Circuit(cirq.CCNOT(Q0, Q1, Q2),
                  cirq.X(Q0)**0.123),
     cirq.Circuit(
         cirq.XPowGate(exponent=sympy.Symbol('theta'),
                       global_shift=0).on(Q0)),
     # TODO: even the following doesn't work because theta gets
     #       multiplied by 1/pi.
     #       https://github.com/quantumlib/Cirq/issues/2014
     # cirq.Circuit(cirq.Rx(sympy.Symbol('theta')).on(Q0)),
 ],
 'ConstantQubitNoiseModel':
 cirq.ConstantQubitNoiseModel(cirq.X),
 'Duration':
 cirq.Duration(picos=6),
 'DensePauliString':
 cirq.DensePauliString('XYZI', coefficient=1j),
Exemple #6
0
def bernstein(error_correct=False):

    API_TOKEN = '7cf33cd2f0d7044af8518c33321fa74d7380d3ba58d08b271404e8226aa1f5490818ba86e1635f89e6c3cfbf10aa091ff04c1f5ff61f0f391ed780b4484e0b18'

    # initialize qiskit
    IBMQ.save_account(API_TOKEN)
    provider = IBMQ.load_account()
    print(provider.backends())
    backend = provider.backends.ibmq_16_melbourne

    # initialize qubits with architecture in mind
    qubits = [cirq.GridQubit(0, 5), cirq.GridQubit(1, 4),\
              cirq.GridQubit(0, 6), cirq.GridQubit(2, 5),\
              cirq.GridQubit(2, 3), cirq.GridQubit(1, 5),\
              cirq.GridQubit(3, 4), cirq.GridQubit(2, 4)]

    if error_correct:
        error_qubits = [cirq.GridQubit(3, 4), cirq.GridQubit(3, 3),\
                           cirq.GridQubit(3, 2), cirq.GridQubit(4, 3)]

    # construct circuit
    circuit = cirq.Circuit()

    # error correction setup. error correct qubit (2,3)
    if error_correct:
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])

    # hadamards
    circuit.append([cirq.H(q) for q in qubits])

    # turn helper qubit to 1
    circuit.append([cirq.Z(qubits[7])])

    # oracle
    circuit.append([cirq.CNOT(qubits[1], qubits[7])])
    circuit.append([cirq.CNOT(qubits[3], qubits[7])])
    circuit.append([cirq.CNOT(qubits[4], qubits[7])])
    circuit.append([cirq.CNOT(qubits[6], qubits[7])])

    # hadamards
    circuit.append([cirq.H(q) for q in qubits[:-1]])

    # error detection and correction
    if error_correct:
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[1], error_qubits[2])])
        circuit.append([cirq.SWAP(error_qubits[3], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[1], error_qubits[3])])
        circuit.append(
            [cirq.measure(error_qubits[2]),
             cirq.measure(error_qubits[3])])
        circuit.append(
            [cirq.CCNOT(qubits[2], error_qubits[1], error_qubits[0])])

    # measure
    circuit.append([cirq.measure(q) for q in qubits[:-1]])

    # export to qasm
    qasm_str = circuit.to_qasm()

    # import qiskit from qasm
    qiskit_circuit = qiskitqc.from_qasm_str(qasm_str)

    # run qiskit
    transpiled = transpile(qiskit_circuit, backend)
    qobj = assemble(transpiled, backend, shots=100)
    job = backend.run(qobj)
    print(job.job_id())
    result = job.result()
    counts = result.get_counts()
    delayed_result = backend.retrieve_job(job.job_id()).result()
    delayed_counts = delayed_result.get_counts()
    print(counts)
    print(delayed_counts)

    return requests.post(url, json=job_payload)
def grover(error_correct=False):

    # initialize qubits with architecture in mind
    qubits = [cirq.GridQubit(1, 4), cirq.GridQubit(2, 4),\
              cirq.GridQubit(3, 4)]

    if error_correct:
        error_qubits = [cirq.GridQubit(3, 4), cirq.GridQubit(3, 3),\
                           cirq.GridQubit(3, 2), cirq.GridQubit(4, 3)]

    # construct circuit
    circuit = cirq.Circuit()

    # error correction setup. error correct qubit (2,3)
    if error_correct:
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])

    # hadamards
    circuit.append([cirq.H(q) for q in qubits])

    # Grover's algorithm repetitions; O(sqrt(2^n)) = 2
    for _ in range(2):

        circuit.append([cirq.CCZ(*qubits)])

        circuit.append([cirq.H(q) for q in qubits])
        circuit.append([cirq.X(q) for q in qubits])
        circuit.append([cirq.CCZ(*qubits)])
        circuit.append([cirq.X(q) for q in qubits])
        circuit.append([cirq.H(q) for q in qubits])

    # error detection and correction
    if error_correct:
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[1], error_qubits[2])])
        circuit.append([cirq.SWAP(error_qubits[3], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[1], error_qubits[3])])
        circuit.append(
            [cirq.measure(error_qubits[2]),
             cirq.measure(error_qubits[3])])
        circuit.append(
            [cirq.CCNOT(qubits[2], error_qubits[1], error_qubits[0])])

    circuit.append([cirq.measure(q) for q in qubits])

    # check for sycamore
    cirq.google.optimized_for_sycamore(circuit=circuit,
                                       new_device=cirq.google.Sycamore,
                                       optimizer_type='sycamore')

    url = 'http://quant-edu-scalability-tools.wl.r.appspot.com/send'
    job_payload = {"circuit":cirq.to_json(circuit),\
        "email":"*****@*****.**",\
        "repetitions":1000,\
        "student_id":204929264}

    return requests.post(url, json=job_payload)
def qaoa(error_correct=False):

    API_TOKEN = '7cf33cd2f0d7044af8518c33321fa74d7380d3ba58d08b271404e8226aa1f5490818ba86e1635f89e6c3cfbf10aa091ff04c1f5ff61f0f391ed780b4484e0b18'

    # initialize qiskit
    IBMQ.save_account(API_TOKEN)
    provider = IBMQ.load_account()
    print(provider.backends())
    backend = provider.backends.ibmq_16_melbourne

    # initialize qubits with architecture in mind
    qubits = [cirq.GridQubit(1, 4), cirq.GridQubit(2, 4),\
              cirq.GridQubit(3, 4)]

    if error_correct:
        error_qubits = [cirq.GridQubit(3, 4), cirq.GridQubit(3, 3),\
                           cirq.GridQubit(3, 2), cirq.GridQubit(4, 3)]

    # initialize variables
    beta = math.pi / 2
    gamma = math.pi / 2

    graph = nx.Graph()
    graph.add_edge(0, 1)
    graph.add_edge(1, 2)
    graph.add_edge(2, 0)

    # construct circuit
    circuit = cirq.Circuit()

    # error correction setup. error correct qubit (2,3)
    if error_correct:
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])

    circuit.append([cirq.H(q) for q in qubits])

    circuit.append([
        cirq.ZZPowGate(exponent=2 * gamma / math.pi,
                       global_shift=-0.5).on(qubits[0], qubits[1])
    ])
    circuit.append([
        cirq.ZZPowGate(exponent=2 * gamma / math.pi,
                       global_shift=-0.5).on(qubits[1], qubits[2])
    ])
    circuit.append([cirq.SWAP(qubits[1], qubits[2])])
    circuit.append([
        cirq.ZZPowGate(exponent=2 * gamma / math.pi,
                       global_shift=-0.5).on(qubits[0], qubits[1])
    ])
    circuit.append([cirq.SWAP(qubits[1], qubits[2])])

    circuit.append([cirq.rx(2 * beta).on_each(*qubits)])

    # error detection and correction
    if error_correct:
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[1], error_qubits[2])])
        circuit.append([cirq.SWAP(error_qubits[3], error_qubits[1])])
        circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
        circuit.append([cirq.CNOT(error_qubits[0], error_qubits[1])])
        circuit.append([cirq.SWAP(error_qubits[1], error_qubits[3])])
        circuit.append(
            [cirq.measure(error_qubits[2]),
             cirq.measure(error_qubits[3])])
        circuit.append(
            [cirq.CCNOT(qubits[2], error_qubits[1], error_qubits[0])])

    circuit.append([cirq.measure(*qubits)])

    # export to qasm
    qasm_str = circuit.to_qasm()

    # import qiskit from qasm
    qiskit_circuit = qiskitqc.from_qasm_str(qasm_str)

    # run qiskit
    transpiled = transpile(qiskit_circuit, backend)
    qobj = assemble(transpiled, backend, shots=100)
    job = backend.run(qobj)
    print(job.job_id())
    result = job.result()
    counts = result.get_counts()
    delayed_result = backend.retrieve_job(job.job_id()).result()
    delayed_counts = delayed_result.get_counts()
    print(counts)
    print(delayed_counts)
Exemple #9
0
def qaoa(error_correct=False):
	
	# initialize qubits with architecture in mind
	qubits = [cirq.GridQubit(1, 4), cirq.GridQubit(2, 4),\
	          cirq.GridQubit(3, 4)]

	if error_correct:
		error_qubits = [cirq.GridQubit(3, 4), cirq.GridQubit(3, 3),\
	                    cirq.GridQubit(3, 2), cirq.GridQubit(4, 3)]

	# initialize variables
	beta = math.pi/2
	gamma = math.pi/2

	graph = nx.Graph()
	graph.add_edge(0, 1)
	graph.add_edge(1, 2)
	graph.add_edge(2, 0)

	# construct circuit
	circuit = cirq.Circuit()

	# error correction setup. error correct qubit (2,3)
	if error_correct:
		circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
		circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])
		circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
		circuit.append([cirq.SWAP(error_qubits[0], error_qubits[1])])

	circuit.append([cirq.H(q) for q in qubits])
	
	circuit.append([cirq.ZZPowGate(exponent=2 * gamma / math.pi, global_shift=-0.5).on(qubits[0], qubits[1])])
	circuit.append([cirq.ZZPowGate(exponent=2 * gamma / math.pi, global_shift=-0.5).on(qubits[1], qubits[2])])
	circuit.append([cirq.SWAP(qubits[1], qubits[2])])
	circuit.append([cirq.ZZPowGate(exponent=2 * gamma / math.pi, global_shift=-0.5).on(qubits[0], qubits[1])])
	circuit.append([cirq.SWAP(qubits[1], qubits[2])])

	circuit.append([cirq.rx(2*beta).on_each(*qubits)])

	# error detection and correction
	if error_correct:
		circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
		circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
		circuit.append([cirq.SWAP(error_qubits[2], error_qubits[1])])
		circuit.append([cirq.CNOT(error_qubits[1], error_qubits[2])])
		circuit.append([cirq.SWAP(error_qubits[3], error_qubits[1])])
		circuit.append([cirq.CNOT(qubits[2], error_qubits[1])])
		circuit.append([cirq.CNOT(error_qubits[0], error_qubits[1])])
		circuit.append([cirq.SWAP(error_qubits[1], error_qubits[3])])
		circuit.append([cirq.measure(error_qubits[2]), cirq.measure(error_qubits[3])])
		circuit.append([cirq.CCNOT(qubits[2], error_qubits[1], error_qubits[0])])

	circuit.append([cirq.measure(*qubits)])

	# check for sycamore
	cirq.google.optimized_for_sycamore(circuit=circuit, new_device=cirq.google.Sycamore, optimizer_type='sycamore')

	url = 'http://quant-edu-scalability-tools.wl.r.appspot.com/send'
	job_payload = {"circuit":cirq.to_json(circuit),\
					"email":"*****@*****.**",\
					"repetitions":1000,\
					"student_id":204929264}

	return requests.post(url, json=job_payload)