Composed Ansatz

In this section we show to merge two InQuanto ansatzes into a single ansatz object. This can be done using the ComposedAnsatz class: one just needs to pass the two ansatz objects to its constructor, with the order of parameters being the inverse of how their circuits are to be ordered with respect to each other.

For example, if one would like to perform a multi-reference generalized UCC calculation for a system of two electrons in four spin-orbitals, one could consider employing MultiConfigurationAnsatz to define a singly-excited multi-configuration reference state with variable parameters (CI coefficients), and combining it with an empty-reference FermionSpaceAnsatzUCCGD:

from inquanto.spaces import FermionSpace
from inquanto.states import FermionStateString, FermionState
from inquanto.mappings import QubitMappingJordanWigner
from inquanto.ansatzes import (
    MultiConfigurationAnsatz,
    FermionSpaceAnsatzUCCGD,
    ComposedAnsatz
)
from numpy import sqrt

space = FermionSpace(4)
fss_ref = FermionStateString([1, 1, 0, 0])
fss_1001 = FermionStateString([1, 0, 0, 1])
fss_0110 = FermionStateString([0, 1, 1, 0])
# Note: coefficients don't actually matter as we are building a symbolic ansatz.
fstate_multiconf = FermionState({fss_ref: sqrt(0.8), fss_1001: sqrt(0.1), fss_0110: sqrt(0.1)})

qubit_mapping = QubitMappingJordanWigner()
fstate_multiconf = qubit_mapping.state_map(fstate_multiconf)

ansatz_givens = MultiConfigurationAnsatz(fstate_multiconf.terms)
ansatz_uccgd = FermionSpaceAnsatzUCCGD(space, FermionState([0, 0, 0, 0]))
ansatz_multiref = ComposedAnsatz(ansatz_uccgd, ansatz_givens)
print(ansatz_multiref.state_symbols)
[gd0, theta0, theta1]

The Givens rotations of MultiConfigurationAnsatz will be applied to the circuit first, then the unitaries of the FermionSpaceAnsatzUCCGD part will be appended at the end. In this particular case the resulting multireference ansatz will be identical to a UCCGSD ansatz constructed from the HF reference state \(|1100\rangle\) and in the same Fock space as above. For more complicated Fock spaces one could cherry-pick some important reference states and use them in conjunction with a shallower UCC ansatz. Other use cases of combining various ansatzes can be easily envisaged.