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
    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()