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)
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
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),
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)
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)