Source code for qarp.utils._toy_models

from qarp.blocks import (
    CompositeBlock,
    ComputationalBasisStateBlock,
    MappedONVStateBlock,
    TrotterAnsatzBlock,
)
from qarp.operators import JordanWigner, NoGrouping
from qarp.operators.models import fermi_hubbard
from qarp.operators.ucc import ucc_singles_and_doubles


# Get Fermi-Hubbard Hamiltonian and Trotter wavefunction (only excitation doubles)
[docs] def FH_ham_and_wf(n: int, t: float = 1.4, U: float = 2.31): basis_state = [1] * n + [0] * n n_qubits = n * 2 fham = fermi_hubbard((n,), t, U) qham = JordanWigner().encode_operator(fham) uccsd, symbols = ucc_singles_and_doubles(basis_state, spin_conserving=True, generalised=True) quccsd = JordanWigner().encode_operator(uccsd) blocks = [ MappedONVStateBlock(basis_state, JordanWigner()), TrotterAnsatzBlock( n_qubits, quccsd, symbols, steps=1, time=1.0, order=1, grouping=NoGrouping(), imaginary=True, ), ] wfn = CompositeBlock(blocks, n_qubits) # Built, matching FH_ham_and_wf_singles_and_doubles — sibling factories # must hand back blocks in the same build state. wfn.build() return qham, wfn
# Get Fermi-Hubbard Hamiltonian and Trotter wavefunction (single and double excitations)
[docs] def FH_ham_and_wf_singles_and_doubles( n: int, t: float = 1.4, U: float = 2.31, generalised: bool = True ): fham = fermi_hubbard((n,), t, U) qham = JordanWigner().encode_operator(fham) basis_state = [1] * n + [0] * n uccsd, symbols = ucc_singles_and_doubles( basis_state, spin_conserving=True, generalised=generalised ) qucc = JordanWigner().encode_operator(uccsd) ref = ComputationalBasisStateBlock(basis_state) ref.build() ucc = TrotterAnsatzBlock( len(basis_state), qubit_exponents=qucc, symbols=symbols, imaginary=True, grouping=NoGrouping(), ) ucc.build() wfn = CompositeBlock([ref, ucc], len(basis_state)) wfn.build() return qham, wfn