コード例 #1
0
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))
コード例 #2
0
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,
    )
コード例 #3
0
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))])]
    )
コード例 #4
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)
コード例 #5
0
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))])]
        )
コード例 #6
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)
コード例 #7
0
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)
コード例 #8
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()))

    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)
コード例 #9
0
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
コード例 #10
0
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,
    )
コード例 #11
0
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)
コード例 #12
0
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