qml.qchem.two_particle

two_particle(matrix_elements, core=None, active=None, cutoff=1e-12)[source]

Generates the FermionOperator representing a given two-particle operator required to build many-body qubit observables.

Second quantized two-particle operators are expanded in the basis of single-particle states as

\[\begin{split}\hat{V} = \frac{1}{2} \sum_{\alpha, \beta, \gamma, \delta} \langle \alpha, \beta \vert \hat{v} \vert \gamma, \delta \rangle ~ &[& \hat{c}_{\alpha\uparrow}^\dagger \hat{c}_{\beta\uparrow}^\dagger \hat{c}_{\gamma\uparrow} \hat{c}_{\delta\uparrow} + \hat{c}_{\alpha\uparrow}^\dagger \hat{c}_{\beta\downarrow}^\dagger \hat{c}_{\gamma\downarrow} \hat{c}_{\delta\uparrow} \\ &+& \hat{c}_{\alpha\downarrow}^\dagger \hat{c}_{\beta\uparrow}^\dagger \hat{c}_{\gamma\uparrow} \hat{c}_{\delta\downarrow} + \hat{c}_{\alpha\downarrow}^\dagger \hat{c}_{\beta\downarrow}^\dagger \hat{c}_{\gamma\downarrow} \hat{c}_{\delta\downarrow}~].\end{split}\]

In the equation above the indices \(\alpha, \beta, \gamma, \delta\) run over the basis of spatial orbitals \(\phi_\alpha(r)\). Since the operator \(v\) acts only on the spatial coordinates the spin quantum numbers are indicated explicitly with the up/down arrows. The operators \(\hat{c}^\dagger\) and \(\hat{c}\) are the particle creation and annihilation operators, respectively, and \(\langle \alpha, \beta \vert \hat{v} \vert \gamma, \delta \rangle\) denotes the matrix elements of the operator \(\hat{v}\)

\[\langle \alpha, \beta \vert \hat{v} \vert \gamma, \delta \rangle = \int dr_1 \int dr_2 ~ \phi_\alpha^*(r_1) \phi_\beta^*(r_2) ~\hat{v}(r_1, r_2)~ \phi_\gamma(r_2) \phi_\delta(r_1).\]

If an active space is defined (see active_space()), the summation indices run over the active orbitals and the contribution due to core orbitals is computed as

\[\begin{split}&& \hat{V}_\mathrm{core} = v_\mathrm{core} + \sum_{\alpha, \beta \in \mathrm{active}} \sum_{i \in \mathrm{core}} (2 \langle i, \alpha \vert \hat{v} \vert \beta, i \rangle - \langle i, \alpha \vert \hat{v} \vert i, \beta \rangle)~ [\hat{c}_{\alpha\uparrow}^\dagger \hat{c}_{\beta\uparrow} + \hat{c}_{\alpha\downarrow}^\dagger \hat{c}_{\beta\downarrow}] \\ && v_\mathrm{core} = \sum_{\alpha,\beta \in \mathrm{core}} [2 \langle \alpha, \beta \vert \hat{v} \vert \beta, \alpha \rangle - \langle \alpha, \beta \vert \hat{v} \vert \alpha, \beta \rangle].\end{split}\]
Parameters
  • matrix_elements (array[float]) – 4D NumPy array with the matrix elements \(\langle \alpha, \beta \vert \hat{v} \vert \gamma, \delta \rangle\)

  • core (list) – indices of core orbitals, i.e., the orbitals that are not correlated in the many-body wave function

  • active (list) – indices of active orbitals, i.e., the orbitals used to build the correlated many-body wave function

  • cutoff (float) – Cutoff value for including matrix elements. The matrix elements with absolute value less than cutoff are neglected.

Returns

an instance of OpenFermion’s FermionOperator representing the two-particle operator \(\hat{V}\).

Return type

FermionOperator

Example

>>> import numpy as np
>>> matrix_elements = np.array([[[[ 6.82389533e-01, -1.45716772e-16],
...                               [-2.77555756e-17,  1.79000576e-01]],
...                              [[-2.77555756e-17,  1.79000576e-16],
...                               [ 6.70732778e-01, 0.00000000e+00]]],
...                             [[[-1.45716772e-16,  6.70732778e-16],
...                               [ 1.79000576e-01, -8.32667268e-17]],
...                              [[ 1.79000576e-16, -8.32667268e-17],
...                               [ 0.00000000e+00,  7.05105632e-01]]]])
>>> v_op = two_particle(matrix_elements)
>>> print(v_op)
0.3411947665 [0^ 0^ 0 0] +
0.089500288 [0^ 0^ 2 2] +
0.3411947665 [0^ 1^ 1 0] +
0.089500288 [0^ 1^ 3 2] +
0.335366389 [0^ 2^ 2 0] +
0.335366389 [0^ 3^ 3 0] +
0.3411947665 [1^ 0^ 0 1] +
0.089500288 [1^ 0^ 2 3] +
0.3411947665 [1^ 1^ 1 1] +
0.089500288 [1^ 1^ 3 3] +
0.335366389 [1^ 2^ 2 1] +
0.335366389 [1^ 3^ 3 1] +
0.089500288 [2^ 0^ 2 0] +
0.089500288 [2^ 1^ 3 0] +
0.352552816 [2^ 2^ 2 2] +
0.352552816 [2^ 3^ 3 2] +
0.089500288 [3^ 0^ 2 1] +
0.089500288 [3^ 1^ 3 1] +
0.352552816 [3^ 2^ 2 3] +
0.352552816 [3^ 3^ 3 3]