def main(): # Number of sites in the Fermi-Hubbard model (2*n_site spin orbitals) n_site = 4 # Number of fermions n_fermi = 4 # Hopping strength between neighboring sites t = 1.0 # On-site interaction strength. It has to be negative (attractive) for the # BCS theory to work. u = -4.0 # Calculate the superconducting gap and the angles for BCS delta, bog_theta = bcs_parameters(n_site, n_fermi, u, t) # Initializing the qubits on a ladder upper_qubits = [cirq.GridQubit(0, i) for i in range(n_fermi)] lower_qubits = [cirq.GridQubit(1, i) for i in range(n_fermi)] print('Quantum circuits to prepare the BCS meanfield state.') print('Number of sites = ', n_site) print('Number of fermions = ', n_fermi) print('Tunneling strength = ', t) print('On-site interaction strength = ', u) print('Superconducting gap = ', delta, '\n') bog_circuit = cirq.Circuit( bogoliubov_trans(upper_qubits[i], lower_qubits[i], bog_theta[i]) for i in range(n_site)) bog_circuit = cirq_google.optimized_for_xmon(bog_circuit) print('Circuit for the Bogoliubov transformation:') print(bog_circuit.to_text_diagram(transpose=True), '\n') # The inverse fermionic Fourier transformation on the spin-up states print(( 'Circuit for the inverse fermionic Fourier transformation on the spin-up states:' )) fourier_circuit_spin_up = cirq.Circuit( fermi_fourier_trans_inverse_4(upper_qubits), strategy=cirq.InsertStrategy.EARLIEST) fourier_circuit_spin_up = cirq_google.optimized_for_xmon( fourier_circuit_spin_up) print(fourier_circuit_spin_up.to_text_diagram(transpose=True), '\n') # The inverse fermionic Fourier transformation on the spin-down states print(( 'Circuit for the inverse fermionic Fourier transformation on the spin-down states:' )) fourier_circuit_spin_down = cirq.Circuit( fermi_fourier_trans_inverse_conjugate_4(lower_qubits), strategy=cirq.InsertStrategy.EARLIEST) fourier_circuit_spin_down = cirq_google.optimized_for_xmon( fourier_circuit_spin_down) print(fourier_circuit_spin_down.to_text_diagram(transpose=True))
def main(*, num_qubits: int, depth: int, num_circuits: int, seed: int, routes: int): """Run the quantum volume algorithm with a preset configuration. See the calculate_quantum_volume documentation for more details. Args: num_qubits: Pass-through to calculate_quantum_volume. depth: Pass-through to calculate_quantum_volume num_circuits: Pass-through to calculate_quantum_volume seed: Pass-through to calculate_quantum_volume Returns: Pass-through from calculate_quantum_volume. """ device = cirq_google.Bristlecone compiler = lambda circuit: cirq_google.optimized_for_xmon(circuit=circuit) noisy = cirq.DensityMatrixSimulator(noise=cirq.ConstantQubitNoiseModel( qubit_noise_gate=cirq.DepolarizingChannel(p=0.005))) calculate_quantum_volume( num_qubits=num_qubits, depth=depth, num_circuits=num_circuits, random_state=seed, device_graph=routing.gridqubits_to_graph_device(device.qubits), samplers=[cirq.Simulator(), noisy], routing_attempts=routes, compiler=compiler, )
def test_remap_qubits(): before = cirq.Circuit([cirq.Moment([cirq.CZ(cirq.LineQubit(0), cirq.LineQubit(1))])]) after = cg.optimized_for_xmon(before, qubit_map=lambda q: cirq.GridQubit(q.x, 0)) assert after == cirq.Circuit( [cirq.Moment([cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(1, 0))])] )
def test_ccz(): before = cirq.Circuit( cirq.CCZ(cirq.GridQubit(5, 5), cirq.GridQubit(5, 6), cirq.GridQubit(5, 7)) ) after = cg.optimized_for_xmon(before) assert len(after) <= 22 assert_circuits_with_terminal_measurements_are_equivalent(before, after, atol=1e-4)
def test_remap_qubits(): before = cirq.Circuit([cirq.Moment([cirq.CZ(cirq.LineQubit(0), cirq.LineQubit(1))])]) with cirq.testing.assert_deprecated( 'Use cirq.optimize_for_target_gateset', deadline='v0.16', count=2 ): after = cg.optimized_for_xmon(before, qubit_map=lambda q: cirq.GridQubit(q.x, 0)) assert after == cirq.Circuit( [cirq.Moment([cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(1, 0))])] )
def test_swap_field(n: int, d: int): before = cirq.Circuit( cirq.ISWAP(cirq.LineQubit(j), cirq.LineQubit(j + 1)) for i in range(d) for j in range(i % 2, n - 1, 2)) before.append(cirq.measure(*before.all_qubits())) after = cg.optimized_for_xmon(before) assert len(after) == d * 4 + 2 if n <= 5: assert_circuits_with_terminal_measurements_are_equivalent(before, after, atol=1e-4)
def test_ccz(): before = cirq.Circuit( cirq.CCZ(cirq.GridQubit(5, 5), cirq.GridQubit(5, 6), cirq.GridQubit(5, 7)) ) with cirq.testing.assert_deprecated( 'Use cirq.optimize_for_target_gateset', deadline='v0.16', count=2 ): after = cg.optimized_for_xmon(before) assert len(after) <= 22 assert_circuits_with_terminal_measurements_are_equivalent(before, after, atol=1e-4)
def test_swap_field(n: int, d: int): before = cirq.Circuit( cirq.ISWAP(cirq.LineQubit(j), cirq.LineQubit(j + 1)) for i in range(d) for j in range(i % 2, n - 1, 2) ) before.append(cirq.measure(*before.all_qubits())) with cirq.testing.assert_deprecated( 'Use cirq.optimize_for_target_gateset', deadline='v0.16', count=2 ): after = cg.optimized_for_xmon(before) assert len(after) == d * 4 + 2 if n <= 5: assert_circuits_with_terminal_measurements_are_equivalent(before, after, atol=1e-4)
def test_allow_partial_czs(): before = cirq.Circuit([ cirq.Moment([cirq.CZ(cirq.GridQubit(5, 5), cirq.GridQubit(5, 6))**0.5]) ]) after = cg.optimized_for_xmon(before, allow_partial_czs=True) cz_gates = [ op.gate for op in after.all_operations() if isinstance(op, cirq.GateOperation) and isinstance(op.gate, cirq.CZPowGate) ] num_full_cz = sum(1 for cz in cz_gates if cz.exponent % 2 == 1) num_part_cz = sum(1 for cz in cz_gates if cz.exponent % 2 != 1) assert num_full_cz == 0 assert num_part_cz == 1
def test_adjacent_cz_get_split_apart(): before = cirq.Circuit([ cirq.Moment([ cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(0, 1)), cirq.CZ(cirq.GridQubit(1, 0), cirq.GridQubit(1, 1)), ]) ]) after = cg.optimized_for_xmon(before, new_device=cg.Foxtail) assert after == cirq.Circuit( [ cirq.Moment([cirq.CZ(cirq.GridQubit(0, 0), cirq.GridQubit(0, 1))]), cirq.Moment([cirq.CZ(cirq.GridQubit(1, 0), cirq.GridQubit(1, 1))]), ], device=cg.Foxtail, )
def main(): print("Length 10 line on Bristlecone:") line = cirq_google.line_on_device(cirq_google.Bristlecone, length=10) print(line) print("Initial circuit:") n = 10 depth = 2 circuit = cirq.Circuit( cirq.SWAP(cirq.LineQubit(j), cirq.LineQubit(j + 1)) for i in range(depth) for j in range(i % 2, n - 1, 2)) circuit.append(cirq.measure(*cirq.LineQubit.range(n), key='all')) print(circuit) print() print("Xmon circuit:") translated = cirq_google.optimized_for_xmon(circuit=circuit, qubit_map=lambda q: line[q.x]) print(translated)
def test_allow_partial_czs(): before = cirq.Circuit( [cirq.Moment([cirq.CZ(cirq.GridQubit(5, 5), cirq.GridQubit(5, 6)) ** 0.5])] ) with cirq.testing.assert_deprecated( 'Use cirq.optimize_for_target_gateset', deadline='v0.16', count=2 ): after = cg.optimized_for_xmon(before, allow_partial_czs=True) cz_gates = [ op.gate for op in after.all_operations() if isinstance(op, cirq.GateOperation) and isinstance(op.gate, cirq.CZPowGate) ] num_full_cz = sum(1 for cz in cz_gates if cz.exponent % 2 == 1) num_part_cz = sum(1 for cz in cz_gates if cz.exponent % 2 != 1) assert num_full_cz == 0 assert num_part_cz == 1