Esempio n. 1
0
def test_ffft_inverse(size):

    qubits = LineQubit.range(size)

    ffft_circuit = cirq.Circuit(ffft(qubits),
                                strategy=cirq.InsertStrategy.EARLIEST)
    ffft_circuit.append(cirq.inverse(ffft(qubits)))
    ffft_matrix = ffft_circuit.unitary(qubits_that_should_be_present=qubits)

    cirq.testing.assert_allclose_up_to_global_phase(ffft_matrix,
                                                    np.identity(1 << size),
                                                    atol=1e-8)
Esempio n. 2
0
def test_ffft_text_diagram():
    qubits = LineQubit.range(8)

    circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST)

    assert circuit.to_text_diagram(transpose=True) == """
0   1     2   3     4   5     6   7
│   │     │   │     │   │     │   │
0↦0─1↦4───2↦1─3↦5───4↦2─5↦6───6↦3─7↦7
│   │     │   │     │   │     │   │
0↦0─1↦2───2↦1─3↦3   0↦0─1↦2───2↦1─3↦3
│   │     │   │     │   │     │   │
F₀──F₀    F₀──F₀    F₀──F₀    F₀──F₀
│   │     │   │     │   │     │   │
0↦0─1↦2───2↦1─3↦3   0↦0─1↦2───2↦1─3↦3
│   │     │   │     │   │     │   │
│   ω^0_4 │   ω^1_4 │   ω^0_4 │   ω^1_4
│   │     │   │     │   │     │   │
F₀──F₀    F₀──F₀    F₀──F₀    F₀──F₀
│   │     │   │     │   │     │   │
0↦0─1↦2───2↦1─3↦3   0↦0─1↦2───2↦1─3↦3
│   │     │   │     │   │     │   │
0↦0─1↦2───2↦4─3↦6───4↦1─5↦3───6↦5─7↦7
│   │     │   │     │   │     │   │
│   ω^0_8 │   ω^1_8 │   ω^2_8 │   ω^3_8
│   │     │   │     │   │     │   │
F₀──F₀    F₀──F₀    F₀──F₀    F₀──F₀
│   │     │   │     │   │     │   │
0↦0─1↦4───2↦1─3↦5───4↦2─5↦6───6↦3─7↦7
│   │     │   │     │   │     │   │
    """.strip()
Esempio n. 3
0
def test_ffft_multi_fermionic_mode(n, initial):
    initial_state = _multi_fermionic_mode_base_state(n, *initial)
    expected_state = _fourier_transform_multi_fermionic_mode(n, *initial)
    qubits = LineQubit.range(n)

    circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST)
    state = circuit.final_wavefunction(initial_state,
                                       qubits_that_should_be_present=qubits)

    assert np.allclose(state, expected_state, rtol=0.0)
Esempio n. 4
0
def test_ffft_single_fermionic_modes(amplitudes):
    initial_state = _single_fermionic_modes_state(amplitudes)
    expected_state = _single_fermionic_modes_state(
        _fourier_transform_single_fermionic_modes(amplitudes))
    qubits = LineQubit.range(len(amplitudes))

    circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST)
    state = circuit.final_wavefunction(initial_state,
                                       qubits_that_should_be_present=qubits)

    assert np.allclose(state, expected_state, rtol=0.0)
Esempio n. 5
0
def test_ffft_multi_fermionic_mode_non_power_of_2(n, initial):
    initial_state = _multi_fermionic_mode_base_state(n, *initial)
    expected_state = _fourier_transform_multi_fermionic_mode(n, *initial)
    qubits = LineQubit.range(n)

    circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST)
    state = circuit.final_wavefunction(initial_state,
                                       qubits_that_should_be_present=qubits)

    cirq.testing.assert_allclose_up_to_global_phase(state,
                                                    expected_state,
                                                    atol=1e-8)
Esempio n. 6
0
def test_ffft_single_fermionic_modes_non_power_of_2(amplitudes):
    initial_state = _single_fermionic_modes_state(amplitudes)
    expected_state = _single_fermionic_modes_state(
        _fourier_transform_single_fermionic_modes(amplitudes))
    qubits = LineQubit.range(len(amplitudes))

    circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST)
    state = circuit.final_wavefunction(initial_state,
                                       qubits_that_should_be_present=qubits)

    cirq.testing.assert_allclose_up_to_global_phase(state,
                                                    expected_state,
                                                    atol=1e-8)
Esempio n. 7
0
def test_ffft_equal_to_bogoliubov(size):
    def fourier_transform_matrix():
        root_of_unity = np.exp(-2j * np.pi / size)
        return np.array([[root_of_unity**(j * k) for k in range(size)]
                         for j in range(size)]) / np.sqrt(size)

    qubits = LineQubit.range(size)

    ffft_circuit = cirq.Circuit(ffft(qubits),
                                strategy=cirq.InsertStrategy.EARLIEST)
    ffft_matrix = ffft_circuit.unitary(qubits_that_should_be_present=qubits)

    bogoliubov_circuit = cirq.Circuit(bogoliubov_transform(
        qubits, fourier_transform_matrix()),
                                      strategy=cirq.InsertStrategy.EARLIEST)
    bogoliubov_matrix = bogoliubov_circuit.unitary(
        qubits_that_should_be_present=qubits)

    cirq.testing.assert_allclose_up_to_global_phase(ffft_matrix,
                                                    bogoliubov_matrix,
                                                    atol=1e-8)
Esempio n. 8
0
def test_ffft_fails_without_qubits():
    with pytest.raises(ValueError):
        ffft([])
Esempio n. 9
0
def test_ffft_fails_for_odd_size():
    with pytest.raises(ValueError):
        ffft(LineQubit.range(3))