def test_split_operator_trotter_ansatz_params():

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian)
    assert (set(ansatz.params()) ==
            {cirq.Symbol(name) for name in
                {'U_0_0', 'U_1_0', 'U_6_0', 'U_7_0',
                 'V_0_1_0', 'V_2_3_0', 'V_4_5_0', 'V_6_7_0'}})

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian, iterations=2)
    assert (set(ansatz.params()) ==
            {cirq.Symbol(name) for name in
                {'U_0_0', 'U_1_0', 'U_6_0', 'U_7_0',
                 'V_0_1_0', 'V_2_3_0', 'V_4_5_0', 'V_6_7_0',
                 'U_0_1', 'U_1_1', 'U_6_1', 'U_7_1',
                 'V_0_1_1', 'V_2_3_1', 'V_4_5_1', 'V_6_7_1'}})
def test_split_operator_trotter_ansatz_parameters():

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian)
    assert (set(ansatz.param_names()) == set(ansatz.params.keys()) == {
        symbol.name
        for symbol in ansatz.params.values()
    } == {'U0', 'U1', 'U6', 'U7', 'V0_1', 'V2_3', 'V4_5', 'V6_7'})

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian, iterations=2)
    assert (set(ansatz.param_names()) == set(ansatz.params.keys()) == {
        symbol.name
        for symbol in ansatz.params.values()
    } == {
        'U0-0', 'U1-0', 'U6-0', 'U7-0', 'V0_1-0', 'V2_3-0', 'V4_5-0', 'V6_7-0',
        'U0-1', 'U1-1', 'U6-1', 'U7-1', 'V0_1-1', 'V2_3-1', 'V4_5-1', 'V6_7-1'
    })
def test_split_operator_trotter_ansatz_param_bounds():

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian)
    assert list(symbol.name for symbol in ansatz.params()) == [
            'U_0_0', 'U_1_0', 'U_6_0', 'U_7_0',
            'V_0_1_0', 'V_2_3_0', 'V_4_5_0', 'V_6_7_0']
    assert ansatz.param_bounds() == [
            (-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0),
            (-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0)]
def test_split_operator_trotter_ansatz_param_bounds():

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian)
    assert ansatz.param_names() == [
        'U0', 'U1', 'U6', 'U7', 'V0_1', 'V2_3', 'V4_5', 'V6_7'
    ]
    assert ansatz.param_bounds() == [(-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0),
                                     (-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0),
                                     (-1.0, 1.0), (-1.0, 1.0)]
def test_split_operator_trotter_ansatz_circuit():

    complete_ansatz = SplitOperatorTrotterAnsatz(ones_hamiltonian,
                                                 include_all_cz=True,
                                                 include_all_z=True)
    circuit = complete_ansatz.circuit
    cirq.DropNegligible().optimize_circuit(circuit)
    cirq.testing.assert_has_diagram(circuit,
                                    """
0       1           2           3           4
│       │           │           │           │
│       │           │           YXXY────────#2^0.5
│       │           │           │           │
│       │           YXXY────────#2^0.608    │
│       │           │           │           │
│       │           │           YXXY────────#2^-0.5
│       │           │           │           │
│       YXXY────────#2^-0.019   │           │
│       │           │           │           │
│       │           YXXY────────#2          │
│       │           │           │           │
YXXY────#2^-0.517   │           YXXY────────#2
│       │           │           │           │
Rz(-π)  YXXY────────#2          │           │
│       │           │           │           │
Z^U_0_0 │           YXXY────────#2          │
│       │           │           │           │
Rz(π)   Z^U_1_0     │           YXXY────────#2^-0.423
│       │           │           │           │
│       │           Z^U_2_0     │           Rz(-π)
│       │           │           │           │
│       │           │           Z^U_3_0     Z^U_4_0
│       │           │           │           │
│       │           │           │           Rz(π)
│       │           │           │           │
│       │           │           YXXY────────#2^0.423
│       │           │           │           │
│       │           YXXY────────#2^-1       │
│       │           │           │           │
│       YXXY────────#2^-1       │           │
│       │           │           │           │
YXXY────#2^0.517    │           YXXY────────#2^-1
│       │           │           │           │
│       │           YXXY────────#2^-1       │
│       │           │           │           │
│       YXXY────────#2^0.019    │           │
│       │           │           │           │
@───────@^V_0_1_0   │           YXXY────────#2^0.5
│       │           │           │           │
×───────×           YXXY────────#2^-0.608   │
│       │           │           │           │
│       │           │           YXXY────────#2^-0.5
│       │           │           │           │
│       │           @───────────@^V_2_3_0   │
│       │           │           │           │
│       │           ×───────────×           │
│       │           │           │           │
│       @───────────@^V_0_3_0   @───────────@^V_2_4_0
│       │           │           │           │
│       ×───────────×           ×───────────×
│       │           │           │           │
@───────@^V_1_3_0   @───────────@^V_0_4_0   │
│       │           │           │           │
×───────×           ×───────────×           │
│       │           │           │           │
│       @───────────@^V_1_4_0   @───────────@^V_0_2_0
│       │           │           │           │
│       ×───────────×           ×───────────×
│       │           │           │           │
@───────@^V_3_4_0   @───────────@^V_1_2_0   │
│       │           │           │           │
×───────×           ×───────────×           │
│       │           │           │           │
#2──────YXXY^0.5    │           │           │
│       │           │           │           │
│       #2──────────YXXY^0.608  │           │
│       │           │           │           │
#2──────YXXY^-0.5   │           │           │
│       │           │           │           │
│       │           #2──────────YXXY^-0.019 │
│       │           │           │           │
│       #2──────────YXXY        │           │
│       │           │           │           │
#2──────YXXY        │           #2──────────YXXY^-0.517
│       │           │           │           │
│       │           #2──────────YXXY        Rz(-π)
│       │           │           │           │
│       #2──────────YXXY        │           Z^U_0_0
│       │           │           │           │
#2──────YXXY^-0.423 │           Z^U_1_0     Rz(π)
│       │           │           │           │
Rz(-π)  │           Z^U_2_0     │           │
│       │           │           │           │
Z^U_4_0 Z^U_3_0     │           │           │
│       │           │           │           │
Rz(π)   │           │           │           │
│       │           │           │           │
#2──────YXXY^0.423  │           │           │
│       │           │           │           │
│       #2──────────YXXY^-1     │           │
│       │           │           │           │
│       │           #2──────────YXXY^-1     │
│       │           │           │           │
#2──────YXXY^-1     │           #2──────────YXXY^0.517
│       │           │           │           │
│       #2──────────YXXY^-1     │           │
│       │           │           │           │
│       │           #2──────────YXXY^0.019  │
│       │           │           │           │
#2──────YXXY^0.5    │           │           │
│       │           │           │           │
│       #2──────────YXXY^-0.608 │           │
│       │           │           │           │
#2──────YXXY^-0.5   │           │           │
│       │           │           │           │
""",
                                    transpose=True)

    jellium_ansatz = SplitOperatorTrotterAnsatz(jellium_hamiltonian)
    circuit = jellium_ansatz.circuit
    cirq.DropNegligible().optimize_circuit(circuit)
    cirq.testing.assert_has_diagram(circuit,
                                    """
0       1           2           3
│       │           │           │
│       │           YXXY────────#2^0.5
│       │           │           │
│       YXXY────────#2^0.608    │
│       │           │           │
│       │           YXXY────────#2^(-1/3)
│       │           │           │
YXXY────#2^(2/3)    │           │
│       │           │           │
Rz(-π)  YXXY────────#2          │
│       │           │           │
Rz(π)   Rz(-π)      YXXY────────#2^-0.392
│       │           │           │
│       Z^U_1_0     │           Rz(-π)
│       │           │           │
│       Rz(π)       Z^U_2_0     Z^U_3_0
│       │           │           │
│       │           │           Rz(π)
│       │           │           │
│       │           YXXY────────#2^0.392
│       │           │           │
│       YXXY────────#2^-1       │
│       │           │           │
YXXY────#2^(-2/3)   │           │
│       │           │           │
│       │           YXXY────────#2^(1/3)
│       │           │           │
│       YXXY────────#2^-0.608   │
│       │           │           │
@───────@^V_0_1_0   │           │
│       │           │           │
×───────×           YXXY────────#2^-0.5
│       │           │           │
│       │           @───────────@^V_2_3_0
│       │           │           │
│       │           ×───────────×
│       │           │           │
│       @───────────@^V_0_3_0   │
│       │           │           │
│       ×───────────×           │
│       │           │           │
@───────@^V_1_3_0   @───────────@^V_0_2_0
│       │           │           │
×───────×           ×───────────×
│       │           │           │
│       @───────────@^V_1_2_0   │
│       │           │           │
│       ×───────────×           │
│       │           │           │
#2──────YXXY^0.5    │           │
│       │           │           │
│       #2──────────YXXY^0.608  │
│       │           │           │
#2──────YXXY^(-1/3) │           │
│       │           │           │
│       │           #2──────────YXXY^(2/3)
│       │           │           │
│       #2──────────YXXY        Rz(-π)
│       │           │           │
#2──────YXXY^-0.392 Rz(-π)      Rz(π)
│       │           │           │
Rz(-π)  │           Z^U_1_0     │
│       │           │           │
Z^U_3_0 Z^U_2_0     Rz(π)       │
│       │           │           │
Rz(π)   │           │           │
│       │           │           │
#2──────YXXY^0.392  │           │
│       │           │           │
│       #2──────────YXXY^-1     │
│       │           │           │
│       │           #2──────────YXXY^(-2/3)
│       │           │           │
#2──────YXXY^(1/3)  │           │
│       │           │           │
│       #2──────────YXXY^-0.608 │
│       │           │           │
#2──────YXXY^-0.5   │           │
│       │           │           │
""",
                                    transpose=True)
def test_split_operator_trotter_ansatz_default_initial_params_length():

    ansatz = SplitOperatorTrotterAnsatz(hubbard_hamiltonian)
    assert len(ansatz.default_initial_params()) == len(list(ansatz.params()))
def test_split_operator_trotter_ansatz_circuit():

    complete_ansatz = SplitOperatorTrotterAnsatz(ones_hamiltonian,
                                                 include_all_cz=True,
                                                 include_all_z=True)
    circuit = complete_ansatz.circuit
    cirq.DropNegligible().optimize_circuit(circuit)
    assert circuit.to_text_diagram(transpose=True).strip() == """
0       1           2           3            4
│       │           │           │            │
│       │           │           YXXY─────────#2^0.5
│       │           │           │            │
│       │           YXXY────────#2^0.608     │
│       │           │           │            │
│       │           │           YXXY─────────#2^-0.5
│       │           │           │            │
│       YXXY────────#2^-0.0187  │            │
│       │           │           │            │
│       │           YXXY────────#2           │
│       │           │           │            │
YXXY────#2^-0.517   │           YXXY─────────#2
│       │           │           │            │
Z       YXXY────────#2          │            │
│       │           │           │            │
Z^U_0_0 │           YXXY────────#2           │
│       │           │           │            │
Z       Z^U_1_0     │           YXXY─────────#2^-0.423
│       │           │           │            │
│       │           Z^U_2_0     │            Z
│       │           │           │            │
│       │           │           Z^U_3_0      Z^U_4_0
│       │           │           │            │
│       │           │           │            Z
│       │           │           │            │
│       │           │           YXXY─────────#2^0.423
│       │           │           │            │
│       │           YXXY────────#2^-1        │
│       │           │           │            │
│       YXXY────────#2^-1       │            │
│       │           │           │            │
YXXY────#2^0.517    │           YXXY─────────#2^-1
│       │           │           │            │
│       │           YXXY────────#2^-1        │
│       │           │           │            │
│       YXXY────────#2^0.0187   │            │
│       │           │           │            │
@───────@^V_0_1_0   │           YXXY─────────#2^0.5
│       │           │           │            │
×───────×           YXXY────────#2^-0.608    │
│       │           │           │            │
│       │           │           YXXY─────────#2^-0.5
│       │           │           │            │
│       │           @───────────@^V_2_3_0    │
│       │           │           │            │
│       │           ×───────────×            │
│       │           │           │            │
│       @───────────@^V_0_3_0   @────────────@^V_2_4_0
│       │           │           │            │
│       ×───────────×           ×────────────×
│       │           │           │            │
@───────@^V_1_3_0   @───────────@^V_0_4_0    │
│       │           │           │            │
×───────×           ×───────────×            │
│       │           │           │            │
│       @───────────@^V_1_4_0   @────────────@^V_0_2_0
│       │           │           │            │
│       ×───────────×           ×────────────×
│       │           │           │            │
@───────@^V_3_4_0   @───────────@^V_1_2_0    │
│       │           │           │            │
×───────×           ×───────────×            │
│       │           │           │            │
#2──────YXXY^0.5    │           │            │
│       │           │           │            │
│       #2──────────YXXY^0.608  │            │
│       │           │           │            │
#2──────YXXY^-0.5   │           │            │
│       │           │           │            │
│       │           #2──────────YXXY^-0.0187 │
│       │           │           │            │
│       #2──────────YXXY        │            │
│       │           │           │            │
#2──────YXXY        │           #2───────────YXXY^-0.517
│       │           │           │            │
│       │           #2──────────YXXY         Z
│       │           │           │            │
│       #2──────────YXXY        │            Z^U_0_0
│       │           │           │            │
#2──────YXXY^-0.423 │           Z^U_1_0      Z
│       │           │           │            │
Z       │           Z^U_2_0     │            │
│       │           │           │            │
Z^U_4_0 Z^U_3_0     │           │            │
│       │           │           │            │
Z       │           │           │            │
│       │           │           │            │
#2──────YXXY^0.423  │           │            │
│       │           │           │            │
│       #2──────────YXXY^-1     │            │
│       │           │           │            │
│       │           #2──────────YXXY^-1      │
│       │           │           │            │
#2──────YXXY^-1     │           #2───────────YXXY^0.517
│       │           │           │            │
│       #2──────────YXXY^-1     │            │
│       │           │           │            │
│       │           #2──────────YXXY^0.0187  │
│       │           │           │            │
#2──────YXXY^0.5    │           │            │
│       │           │           │            │
│       #2──────────YXXY^-0.608 │            │
│       │           │           │            │
#2──────YXXY^-0.5   │           │            │
│       │           │           │            │
""".strip()

    jellium_ansatz = SplitOperatorTrotterAnsatz(jellium_hamiltonian)
    circuit = jellium_ansatz.circuit
    cirq.DropNegligible().optimize_circuit(circuit)
    assert circuit.to_text_diagram(transpose=True).strip() == """
0       1           2           3
│       │           │           │
│       │           YXXY────────#2^0.5
│       │           │           │
│       YXXY────────#2^0.608    │
│       │           │           │
│       │           YXXY────────#2^-0.333
│       │           │           │
YXXY────#2^0.667    │           │
│       │           │           │
Z       YXXY────────#2          │
│       │           │           │
Z       Z           YXXY────────#2^-0.392
│       │           │           │
│       Z^U_1_0     │           Z
│       │           │           │
│       Z           Z^U_2_0     Z^U_3_0
│       │           │           │
│       │           │           Z
│       │           │           │
│       │           YXXY────────#2^0.392
│       │           │           │
│       YXXY────────#2^-1       │
│       │           │           │
YXXY────#2^-0.667   │           │
│       │           │           │
│       │           YXXY────────#2^0.333
│       │           │           │
│       YXXY────────#2^-0.608   │
│       │           │           │
@───────@^V_0_1_0   │           │
│       │           │           │
×───────×           YXXY────────#2^-0.5
│       │           │           │
│       │           @───────────@^V_2_3_0
│       │           │           │
│       │           ×───────────×
│       │           │           │
│       @───────────@^V_0_3_0   │
│       │           │           │
│       ×───────────×           │
│       │           │           │
@───────@^V_1_3_0   @───────────@^V_0_2_0
│       │           │           │
×───────×           ×───────────×
│       │           │           │
│       @───────────@^V_1_2_0   │
│       │           │           │
│       ×───────────×           │
│       │           │           │
#2──────YXXY^0.5    │           │
│       │           │           │
│       #2──────────YXXY^0.608  │
│       │           │           │
#2──────YXXY^-0.333 │           │
│       │           │           │
│       │           #2──────────YXXY^0.667
│       │           │           │
│       #2──────────YXXY        Z
│       │           │           │
#2──────YXXY^-0.392 Z           Z
│       │           │           │
Z       │           Z^U_1_0     │
│       │           │           │
Z^U_3_0 Z^U_2_0     Z           │
│       │           │           │
Z       │           │           │
│       │           │           │
#2──────YXXY^0.392  │           │
│       │           │           │
│       #2──────────YXXY^-1     │
│       │           │           │
│       │           #2──────────YXXY^-0.667
│       │           │           │
#2──────YXXY^0.333  │           │
│       │           │           │
│       #2──────────YXXY^-0.608 │
│       │           │           │
#2──────YXXY^-0.5   │           │
│       │           │           │
""".strip()
def test_split_operator_trotter_ansatz_circuit():

    complete_ansatz = SplitOperatorTrotterAnsatz(ones_hamiltonian,
                                                 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
│     │           │           │            │
│     │           │           │            Z^0.0
│     │           │           │            │
│     │           │           YXXY─────────#2^0.5
│     │           │           │            │
│     │           │           Z^0.0        Z^0.0
│     │           │           │            │
│     │           YXXY────────#2^0.608     │
│     │           │           │            │
│     │           Z^0.0       YXXY─────────#2^-0.5
│     │           │           │            │
│     YXXY────────#2^-0.0187  Z^0.0        Z^0.0
│     │           │           │            │
│     Z^0.0       YXXY────────#2           │
│     │           │           │            │
YXXY──#2^-0.517   Z^0.0       YXXY─────────#2
│     │           │           │            │
Z     YXXY────────#2          Z^0.0        Z^0.0
│     │           │           │            │
Z^U0  Z^0.0       YXXY────────#2           │
│     │           │           │            │
Z     Z^U1        Z^0.0       YXXY─────────#2^-0.423
│     │           │           │            │
│     Z^0.0       Z^U2        Z^0.0        Z
│     │           │           │            │
│     │           Z^0.0       Z^U3         Z^U4
│     │           │           │            │
│     │           │           Z^0.0        Z
│     │           │           │            │
│     │           │           YXXY─────────#2^0.423
│     │           │           │            │
│     │           YXXY────────#2^-1        Z^0.0
│     │           │           │            │
│     YXXY────────#2^-1       Z^0.0        │
│     │           │           │            │
YXXY──#2^0.517    Z^0.0       YXXY─────────#2^-1
│     │           │           │            │
│     Z^0.0       YXXY────────#2^-1        Z^0.0
│     │           │           │            │
│     YXXY────────#2^0.0187   Z^0.0        │
│     │           │           │            │
@─────@^V0_1      Z^0.0       YXXY─────────#2^0.5
│     │           │           │            │
×─────×           YXXY────────#2^-0.608    Z^0.0
│     │           │           │            │
│     │           │           Z^0.0        │
│     │           │           │            │
│     │           │           YXXY─────────#2^-0.5
│     │           │           │            │
│     │           @───────────@^V2_3       Z^0.0
│     │           │           │            │
│     │           ×───────────×            │
│     │           │           │            │
│     @───────────@^V0_3      @────────────@^V2_4
│     │           │           │            │
│     ×───────────×           ×────────────×
│     │           │           │            │
@─────@^V1_3      @───────────@^V0_4       │
│     │           │           │            │
×─────×           ×───────────×            │
│     │           │           │            │
│     @───────────@^V1_4      @────────────@^V0_2
│     │           │           │            │
│     ×───────────×           ×────────────×
│     │           │           │            │
@─────@^V3_4      @───────────@^V1_2       │
│     │           │           │            │
×─────×           ×───────────×            │
│     │           │           │            │
Z^0.0 │           │           │            │
│     │           │           │            │
#2────YXXY^0.5    │           │            │
│     │           │           │            │
Z^0.0 Z^0.0       │           │            │
│     │           │           │            │
│     #2──────────YXXY^0.608  │            │
│     │           │           │            │
#2────YXXY^-0.5   Z^0.0       │            │
│     │           │           │            │
Z^0.0 Z^0.0       #2──────────YXXY^-0.0187 │
│     │           │           │            │
│     #2──────────YXXY        Z^0.0        │
│     │           │           │            │
#2────YXXY        Z^0.0       #2───────────YXXY^-0.517
│     │           │           │            │
Z^0.0 Z^0.0       #2──────────YXXY         Z
│     │           │           │            │
│     #2──────────YXXY        Z^0.0        Z^U0
│     │           │           │            │
#2────YXXY^-0.423 Z^0.0       Z^U1         Z
│     │           │           │            │
Z     Z^0.0       Z^U2        Z^0.0        │
│     │           │           │            │
Z^U4  Z^U3        Z^0.0       │            │
│     │           │           │            │
Z     Z^0.0       │           │            │
│     │           │           │            │
#2────YXXY^0.423  │           │            │
│     │           │           │            │
Z^0.0 #2──────────YXXY^-1     │            │
│     │           │           │            │
│     Z^0.0       #2──────────YXXY^-1      │
│     │           │           │            │
#2────YXXY^-1     Z^0.0       #2───────────YXXY^0.517
│     │           │           │            │
Z^0.0 #2──────────YXXY^-1     Z^0.0        │
│     │           │           │            │
│     Z^0.0       #2──────────YXXY^0.0187  │
│     │           │           │            │
#2────YXXY^0.5    Z^0.0       │            │
│     │           │           │            │
Z^0.0 #2──────────YXXY^-0.608 │            │
│     │           │           │            │
│     Z^0.0       │           │            │
│     │           │           │            │
#2────YXXY^-0.5   │           │            │
│     │           │           │            │
Z^0.0 │           │           │            │
│     │           │           │            │
""".strip()

    jellium_ansatz = SplitOperatorTrotterAnsatz(jellium_hamiltonian)
    circuit = jellium_ansatz.circuit
    assert circuit.to_text_diagram(transpose=True).strip() == """
0     1           2           3
│     │           │           │
│     │           │           Z^0.0
│     │           │           │
│     │           YXXY────────#2^0.5
│     │           │           │
│     │           Z^0.0       Z^0.0
│     │           │           │
│     YXXY────────#2^0.608    │
│     │           │           │
│     Z^0.0       YXXY────────#2^-0.333
│     │           │           │
YXXY──#2^0.667    Z^0.0       Z^0.0
│     │           │           │
Z     YXXY────────#2          │
│     │           │           │
Z     Z           YXXY────────#2^-0.392
│     │           │           │
│     Z^U1        Z^0.0       Z
│     │           │           │
│     Z           Z^U2        Z^U3
│     │           │           │
│     │           Z^0.0       Z
│     │           │           │
│     │           YXXY────────#2^0.392
│     │           │           │
│     YXXY────────#2^-1       Z^0.0
│     │           │           │
YXXY──#2^-0.667   Z^0.0       │
│     │           │           │
│     Z^0.0       YXXY────────#2^0.333
│     │           │           │
│     YXXY────────#2^-0.608   Z^0.0
│     │           │           │
@─────@^V0_1      Z^0.0       │
│     │           │           │
×─────×           YXXY────────#2^-0.5
│     │           │           │
│     │           │           Z^0.0
│     │           │           │
│     │           @───────────@^V2_3
│     │           │           │
│     │           ×───────────×
│     │           │           │
│     @───────────@^V0_3      │
│     │           │           │
│     ×───────────×           │
│     │           │           │
@─────@^V1_3      @───────────@^V0_2
│     │           │           │
×─────×           ×───────────×
│     │           │           │
Z^0.0 @───────────@^V1_2      │
│     │           │           │
│     ×───────────×           │
│     │           │           │
#2────YXXY^0.5    │           │
│     │           │           │
Z^0.0 Z^0.0       │           │
│     │           │           │
│     #2──────────YXXY^0.608  │
│     │           │           │
#2────YXXY^-0.333 Z^0.0       │
│     │           │           │
Z^0.0 Z^0.0       #2──────────YXXY^0.667
│     │           │           │
│     #2──────────YXXY        Z
│     │           │           │
#2────YXXY^-0.392 Z           Z
│     │           │           │
Z     Z^0.0       Z^U1        │
│     │           │           │
Z^U3  Z^U2        Z           │
│     │           │           │
Z     Z^0.0       │           │
│     │           │           │
#2────YXXY^0.392  │           │
│     │           │           │
Z^0.0 #2──────────YXXY^-1     │
│     │           │           │
│     Z^0.0       #2──────────YXXY^-0.667
│     │           │           │
#2────YXXY^0.333  Z^0.0       │
│     │           │           │
Z^0.0 #2──────────YXXY^-0.608 │
│     │           │           │
│     Z^0.0       │           │
│     │           │           │
#2────YXXY^-0.5   │           │
│     │           │           │
Z^0.0 │           │           │
│     │           │           │
""".strip()