def test_swap_network_trotter_ansatz_param_bounds():

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian)
    assert list(symbol.name for symbol in ansatz.params()) == [
        'V_0_1_0', 'T_0_2_0', 'T_0_4_0', 'T_1_3_0', 'T_1_5_0', 'V_2_3_0',
        'T_2_6_0', 'T_3_7_0', 'V_4_5_0', 'T_4_6_0', 'T_5_7_0', 'V_6_7_0'
    ]
    assert ansatz.param_bounds() == [(-1.0, 1.0), (-2.0, 2.0), (-2.0, 2.0),
                                     (-2.0, 2.0), (-2.0, 2.0), (-1.0, 1.0),
                                     (-2.0, 2.0), (-2.0, 2.0), (-1.0, 1.0),
                                     (-2.0, 2.0), (-2.0, 2.0), (-1.0, 1.0)]
def test_swap_network_trotter_ansatz_param_bounds():

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian)
    assert ansatz.param_names() == [
        'V0_1', 'T0_2', 'T0_4', 'T1_3', 'T1_5', 'V2_3', 'T2_6', 'T3_7', 'V4_5',
        'T4_6', 'T5_7', 'V6_7'
    ]
    assert ansatz.param_bounds() == [(-1.0, 1.0), (-2.0, 2.0), (-2.0, 2.0),
                                     (-2.0, 2.0), (-2.0, 2.0), (-1.0, 1.0),
                                     (-2.0, 2.0), (-2.0, 2.0), (-1.0, 1.0),
                                     (-2.0, 2.0), (-2.0, 2.0), (-1.0, 1.0)]
def test_swap_network_trotter_ansatz_parameters():

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian)
    assert (set(ansatz.param_names()) == set(ansatz.params.keys()) ==
            {symbol.name
             for symbol in ansatz.params.values()} == {
                 'T0_2', 'T4_6', 'T1_3', 'T5_7', 'T0_4', 'T2_6', 'T1_5',
                 'T3_7', 'V0_1', 'V2_3', 'V4_5', 'V6_7'
             })

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian, iterations=2)
    assert (set(ansatz.param_names()) == set(ansatz.params.keys()) ==
            {symbol.name
             for symbol in ansatz.params.values()} == {
                 'T0_2-0', 'T4_6-0', 'T1_3-0', 'T5_7-0', 'T0_4-0', 'T2_6-0',
                 'T1_5-0', 'T3_7-0', 'V0_1-0', 'V2_3-0', 'V4_5-0', 'V6_7-0',
                 'T0_2-1', 'T4_6-1', 'T1_3-1', 'T5_7-1', 'T0_4-1', 'T2_6-1',
                 'T1_5-1', 'T3_7-1', 'V0_1-1', 'V2_3-1', 'V4_5-1', 'V6_7-1'
             })
def test_swap_network_trotter_ansatz_params():

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian)
    assert (set(ansatz.params()) == {
        cirq.Symbol(name)
        for name in {
            'T_0_2_0', 'T_4_6_0', 'T_1_3_0', 'T_5_7_0', 'T_0_4_0', 'T_2_6_0',
            'T_1_5_0', 'T_3_7_0', 'V_0_1_0', 'V_2_3_0', 'V_4_5_0', 'V_6_7_0'
        }
    })

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian, iterations=2)
    assert (set(ansatz.params()) == {
        cirq.Symbol(name)
        for name in {
            'T_0_2_0', 'T_4_6_0', 'T_1_3_0', 'T_5_7_0', 'T_0_4_0', 'T_2_6_0',
            'T_1_5_0', 'T_3_7_0', 'V_0_1_0', 'V_2_3_0', 'V_4_5_0', 'V_6_7_0',
            'T_0_2_1', 'T_4_6_1', 'T_1_3_1', 'T_5_7_1', 'T_0_4_1', 'T_2_6_1',
            'T_1_5_1', 'T_3_7_1', 'V_0_1_1', 'V_2_3_1', 'V_4_5_1', 'V_6_7_1'
        }
    })
def test_swap_network_trotter_ansatz_circuit():

    complete_ansatz = SwapNetworkTrotterAnsatz(zero_hamiltonian,
                                               include_all_xxyy=True,
                                               include_all_yxxy=True,
                                               include_all_cz=True,
                                               include_all_z=True)
    circuit = complete_ansatz.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0       1            2            3
│       │            │            │
XXYY────XXYY^T_0_1_0 XXYY─────────XXYY^T_2_3_0
│       │            │            │
YXXY────#2^W_0_1_0   YXXY─────────#2^W_2_3_0
│       │            │            │
@───────@^V_0_1_0    @────────────@^V_2_3_0
│       │            │            │
×ᶠ──────×ᶠ           ×ᶠ───────────×ᶠ
│       │            │            │
│       XXYY─────────XXYY^T_0_3_0 │
│       │            │            │
│       YXXY─────────#2^W_0_3_0   │
│       │            │            │
│       @────────────@^V_0_3_0    │
│       │            │            │
│       ×ᶠ───────────×ᶠ           │
│       │            │            │
XXYY────XXYY^T_1_3_0 XXYY─────────XXYY^T_0_2_0
│       │            │            │
YXXY────#2^W_1_3_0   YXXY─────────#2^W_0_2_0
│       │            │            │
@───────@^V_1_3_0    @────────────@^V_0_2_0
│       │            │            │
×ᶠ──────×ᶠ           ×ᶠ───────────×ᶠ
│       │            │            │
Z^U_3_0 XXYY─────────XXYY^T_1_2_0 Z^U_0_0
│       │            │            │
│       YXXY─────────#2^W_1_2_0   │
│       │            │            │
│       @────────────@^V_1_2_0    │
│       │            │            │
│       ×ᶠ───────────×ᶠ           │
│       │            │            │
│       Z^U_2_0      Z^U_1_0      │
│       │            │            │
│       @────────────@^V_1_2_0    │
│       │            │            │
│       #2───────────YXXY^W_1_2_0 │
│       │            │            │
│       XXYY─────────XXYY^T_1_2_0 │
│       │            │            │
│       ×ᶠ───────────×ᶠ           │
│       │            │            │
@───────@^V_1_3_0    @────────────@^V_0_2_0
│       │            │            │
#2──────YXXY^W_1_3_0 #2───────────YXXY^W_0_2_0
│       │            │            │
XXYY────XXYY^T_1_3_0 XXYY─────────XXYY^T_0_2_0
│       │            │            │
×ᶠ──────×ᶠ           ×ᶠ───────────×ᶠ
│       │            │            │
│       @────────────@^V_0_3_0    │
│       │            │            │
│       #2───────────YXXY^W_0_3_0 │
│       │            │            │
│       XXYY─────────XXYY^T_0_3_0 │
│       │            │            │
│       ×ᶠ───────────×ᶠ           │
│       │            │            │
@───────@^V_0_1_0    @────────────@^V_2_3_0
│       │            │            │
#2──────YXXY^W_0_1_0 #2───────────YXXY^W_2_3_0
│       │            │            │
XXYY────XXYY^T_0_1_0 XXYY─────────XXYY^T_2_3_0
│       │            │            │
×ᶠ──────×ᶠ           ×ᶠ───────────×ᶠ
│       │            │            │
""".strip()

    hubbard_ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian,
                                              iterations=2)
    circuit = hubbard_ansatz.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0    1            2            3         4  5         6            7
│    │            │            │         │  │         │            │
@────@^V_0_1_0    @────────────@^V_2_3_0 @──@^V_4_5_0 @────────────@^V_6_7_0
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           ×ᶠ────────×ᶠ ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_1_3_0 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_4_6_0
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_1_5_0 │         │  XXYY──────XXYY^T_2_6_0 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_3_7_0 ×ᶠ────────×ᶠ XXYY──────XXYY^T_0_4_0 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_5_7_0 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_0_2_0
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           ×ᶠ────────×ᶠ ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_5_7_0 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_0_2_0
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_3_7_0 │         │  XXYY──────XXYY^T_0_4_0 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_1_5_0 ×ᶠ────────×ᶠ XXYY──────XXYY^T_2_6_0 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_1_3_0 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_4_6_0
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
@────@^V_0_1_0    @────────────@^V_2_3_0 @──@^V_4_5_0 @────────────@^V_6_7_0
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
@────@^V_0_1_1    @────────────@^V_2_3_1 @──@^V_4_5_1 @────────────@^V_6_7_1
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           ×ᶠ────────×ᶠ ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_1_3_1 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_4_6_1
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_1_5_1 │         │  XXYY──────XXYY^T_2_6_1 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_3_7_1 ×ᶠ────────×ᶠ XXYY──────XXYY^T_0_4_1 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_5_7_1 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_0_2_1
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           ×ᶠ────────×ᶠ ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_5_7_1 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_0_2_1
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_3_7_1 │         │  XXYY──────XXYY^T_0_4_1 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    XXYY─────────XXYY^T_1_5_1 ×ᶠ────────×ᶠ XXYY──────XXYY^T_2_6_1 │
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
XXYY─XXYY^T_1_3_1 ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        XXYY─────────XXYY^T_4_6_1
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           │            ×ᶠ────────×ᶠ │         ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
│    ×ᶠ───────────×ᶠ           │         │  ×ᶠ────────×ᶠ           │
│    │            │            │         │  │         │            │
@────@^V_0_1_1    @────────────@^V_2_3_1 @──@^V_4_5_1 @────────────@^V_6_7_1
│    │            │            │         │  │         │            │
×ᶠ───×ᶠ           ×ᶠ───────────×ᶠ        ×ᶠ─×ᶠ        ×ᶠ───────────×ᶠ
│    │            │            │         │  │         │            │
""".strip()
def test_swap_network_trotter_ansatz_default_initial_params_length():

    ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian,
                                      include_all_yxxy=True,
                                      include_all_z=True)
    assert len(ansatz.default_initial_params()) == len(list(ansatz.params()))
def test_swap_network_trotter_ansatz_circuit():

    complete_ansatz = SwapNetworkTrotterAnsatz(zero_hamiltonian,
                                               include_all_xxyy=True,
                                               include_all_yxxy=True,
                                               include_all_cz=True,
                                               include_all_z=True)
    circuit = complete_ansatz.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0    1         2         3         4
│    │         │         │         │
XXYY─XXYY^T0_1 XXYY──────XXYY^T2_3 │
│    │         │         │         │
YXXY─#2^W0_1   YXXY──────#2^W2_3   │
│    │         │         │         │
@────@^V0_1    @─────────@^V2_3    │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    XXYY──────XXYY^T0_3 XXYY──────XXYY^T2_4
│    │         │         │         │
│    YXXY──────#2^W0_3   YXXY──────#2^W2_4
│    │         │         │         │
│    @─────────@^V0_3    @─────────@^V2_4
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
XXYY─XXYY^T1_3 XXYY──────XXYY^T0_4 │
│    │         │         │         │
YXXY─#2^W1_3   YXXY──────#2^W0_4   │
│    │         │         │         │
@────@^V1_3    @─────────@^V0_4    │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    XXYY──────XXYY^T1_4 XXYY──────XXYY^T0_2
│    │         │         │         │
│    YXXY──────#2^W1_4   YXXY──────#2^W0_2
│    │         │         │         │
│    @─────────@^V1_4    @─────────@^V0_2
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
XXYY─XXYY^T3_4 XXYY──────XXYY^T1_2 Z^U0
│    │         │         │         │
YXXY─#2^W3_4   YXXY──────#2^W1_2   │
│    │         │         │         │
@────@^V3_4    @─────────@^V1_2    │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
Z^U4 Z^U3      Z^U2      Z^U1      │
│    │         │         │         │
@────@^V3_4    @─────────@^V1_2    │
│    │         │         │         │
#2───YXXY^W3_4 #2────────YXXY^W1_2 │
│    │         │         │         │
XXYY─XXYY^T3_4 XXYY──────XXYY^T1_2 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    @─────────@^V1_4    @─────────@^V0_2
│    │         │         │         │
│    #2────────YXXY^W1_4 #2────────YXXY^W0_2
│    │         │         │         │
│    XXYY──────XXYY^T1_4 XXYY──────XXYY^T0_2
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
@────@^V1_3    @─────────@^V0_4    │
│    │         │         │         │
#2───YXXY^W1_3 #2────────YXXY^W0_4 │
│    │         │         │         │
XXYY─XXYY^T1_3 XXYY──────XXYY^T0_4 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    @─────────@^V0_3    @─────────@^V2_4
│    │         │         │         │
│    #2────────YXXY^W0_3 #2────────YXXY^W2_4
│    │         │         │         │
│    XXYY──────XXYY^T0_3 XXYY──────XXYY^T2_4
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
@────@^V0_1    @─────────@^V2_3    │
│    │         │         │         │
#2───YXXY^W0_1 #2────────YXXY^W2_3 │
│    │         │         │         │
XXYY─XXYY^T0_1 XXYY──────XXYY^T2_3 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
""".strip()

    xxyy_ansatz = SwapNetworkTrotterAnsatz(zero_hamiltonian,
                                           include_all_xxyy=True)
    circuit = xxyy_ansatz.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0    1         2         3         4
│    │         │         │         │
XXYY─XXYY^T0_1 XXYY──────XXYY^T2_3 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    XXYY──────XXYY^T0_3 XXYY──────XXYY^T2_4
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
XXYY─XXYY^T1_3 XXYY──────XXYY^T0_4 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    XXYY──────XXYY^T1_4 XXYY──────XXYY^T0_2
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
XXYY─XXYY^T3_4 XXYY──────XXYY^T1_2 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
XXYY─XXYY^T3_4 XXYY──────XXYY^T1_2 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    XXYY──────XXYY^T1_4 XXYY──────XXYY^T0_2
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
XXYY─XXYY^T1_3 XXYY──────XXYY^T0_4 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
│    XXYY──────XXYY^T0_3 XXYY──────XXYY^T2_4
│    │         │         │         │
│    ×ᶠ────────×ᶠ        ×ᶠ────────×ᶠ
│    │         │         │         │
XXYY─XXYY^T0_1 XXYY──────XXYY^T2_3 │
│    │         │         │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ        │
│    │         │         │         │
""".strip()

    hubbard_ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian)
    circuit = hubbard_ansatz.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0    1         2         3      4  5      6         7
│    │         │         │      │  │      │         │
@────@^V0_1    @─────────@^V2_3 @──@^V4_5 @─────────@^V6_7
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        ×ᶠ─────×ᶠ ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
XXYY─XXYY^T1_3 ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     XXYY──────XXYY^T4_6
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ │      ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    XXYY──────XXYY^T1_5 │      │  XXYY───XXYY^T2_6 │
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        │      │  ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    XXYY──────XXYY^T3_7 ×ᶠ─────×ᶠ XXYY───XXYY^T0_4 │
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        │      │  ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
XXYY─XXYY^T5_7 ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     XXYY──────XXYY^T0_2
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ │      ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        ×ᶠ─────×ᶠ ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        │      │  ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
XXYY─XXYY^T5_7 ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     XXYY──────XXYY^T0_2
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ │      ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    XXYY──────XXYY^T3_7 │      │  XXYY───XXYY^T0_4 │
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        │      │  ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    XXYY──────XXYY^T1_5 ×ᶠ─────×ᶠ XXYY───XXYY^T2_6 │
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        │      │  ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
XXYY─XXYY^T1_3 ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     XXYY──────XXYY^T4_6
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ │      ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
│    ×ᶠ────────×ᶠ        │      │  ×ᶠ─────×ᶠ        │
│    │         │         │      │  │      │         │
@────@^V0_1    @─────────@^V2_3 @──@^V4_5 @─────────@^V6_7
│    │         │         │      │  │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ─×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │  │      │         │
""".strip()

    hubbard_ansatz_with_z = SwapNetworkTrotterAnsatz(hubbard_hamiltonian,
                                                     include_all_z=True)
    circuit = hubbard_ansatz_with_z.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0    1         2         3      4    5      6         7
│    │         │         │      │    │      │         │
@────@^V0_1    @─────────@^V2_3 @────@^V4_5 @─────────@^V6_7
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        ×ᶠ─────×ᶠ   ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
XXYY─XXYY^T1_3 ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     XXYY──────XXYY^T4_6
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ   │      ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
│    XXYY──────XXYY^T1_5 │      │    XXYY───XXYY^T2_6 │
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        │      │    ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
│    XXYY──────XXYY^T3_7 ×ᶠ─────×ᶠ   XXYY───XXYY^T0_4 │
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        │      │    ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
XXYY─XXYY^T5_7 ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     XXYY──────XXYY^T0_2
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ   │      ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
Z^U7 ×ᶠ────────×ᶠ        Z^U4   Z^U3 ×ᶠ─────×ᶠ        Z^U0
│    │         │         │      │    │      │         │
│    Z^U6      Z^U5      ×ᶠ─────×ᶠ   Z^U2   Z^U1      │
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        │      │    ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
XXYY─XXYY^T5_7 ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     XXYY──────XXYY^T0_2
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ   │      ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
│    XXYY──────XXYY^T3_7 │      │    XXYY───XXYY^T0_4 │
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        │      │    ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
│    XXYY──────XXYY^T1_5 ×ᶠ─────×ᶠ   XXYY───XXYY^T2_6 │
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        │      │    ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
XXYY─XXYY^T1_3 ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     XXYY──────XXYY^T4_6
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        │         ×ᶠ─────×ᶠ   │      ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
│    ×ᶠ────────×ᶠ        │      │    ×ᶠ─────×ᶠ        │
│    │         │         │      │    │      │         │
@────@^V0_1    @─────────@^V2_3 @────@^V4_5 @─────────@^V6_7
│    │         │         │      │    │      │         │
×ᶠ───×ᶠ        ×ᶠ────────×ᶠ     ×ᶠ───×ᶠ     ×ᶠ────────×ᶠ
│    │         │         │      │    │      │         │
""".strip()