# qml.qchem.factorize¶

factorize(two_electron, tol_factor=1e-05, tol_eigval=1e-05)[source]

Return the double-factorized form of a two-electron integral tensor in spatial basis.

The two-electron tensor $$V$$, in chemist notation, is first factorized in terms of symmetric matrices $$L^{(r)}$$ such that $$V_{ijkl} = \sum_r^R L_{ij}^{(r)} L_{kl}^{(r) T}$$. The rank $$R$$ is determined by a threshold error. Then, each matrix $$L^{(r)}$$ is diagonalized and its eigenvalues (and corresponding eigenvectors) are truncated at a threshold error.

Parameters
• two_electron (array[array[float]]) – two-electron integral tensor in the molecular orbital basis arranged in chemist notation

• tol_factor (float) – threshold error value for discarding the negligible factors

• tol_eigval (float) – threshold error value for discarding the negligible factor eigenvalues

Returns

tuple containing symmetric matrices (factors) approximating the two-electron integral tensor, truncated eigenvalues of the generated factors, and truncated eigenvectors of the generated factors

Return type

tuple(array[array[float]], list[array[float]], list[array[float]])

Example

>>> symbols  = ['H', 'H']
>>> geometry = np.array([[0.0, 0.0, 0.0],
>>> mol = qml.qchem.Molecule(symbols, geometry)
>>> core, one, two = qml.qchem.electron_integrals(mol)()
>>> two = np.swapaxes(two, 1, 3) # convert to chemist notation
>>> factors, eigvals, eigvecs = factorize(two, 1e-5, 1e-5)
>>> print(factors)
[[[ 1.06723440e-01  9.73575768e-15]
[ 8.36288956e-15 -1.04898533e-01]]
[[-2.20945401e-13 -4.25688222e-01]
[-4.25688222e-01 -2.98228790e-13]]
[[-8.14472856e-01  5.01669019e-13]
[ 5.01689072e-13 -8.28642140e-01]]]


The second quantized electronic Hamiltonian is constructed in terms of fermionic creation, $$a^{\dagger}$$ , and annihilation, $$a$$, operators as [arXiv:1902.02134]

$H = \sum_{\alpha \in \{\uparrow, \downarrow \} } \sum_{pq} h_{pq} a_{p,\alpha}^{\dagger} a_{q, \alpha} + \frac{1}{2} \sum_{\alpha, \beta \in \{\uparrow, \downarrow \} } \sum_{pqrs} h_{pqrs} a_{p, \alpha}^{\dagger} a_{q, \beta}^{\dagger} a_{r, \beta} a_{s, \alpha},$

where $$h_{pq}$$ and $$h_{pqrs}$$ are the one- and two-electron integrals computed as

$h_{pq} = \int \phi_p(r)^* \left ( -\frac{\nabla_r^2}{2} - \sum_i \frac{Z_i}{|r-R_i|} \right) \phi_q(r) dr,$

and

$h_{pqrs} = \int \frac{\phi_p(r_1)^* \phi_q(r_2)^* \phi_r(r_2) \phi_s(r_1)}{|r_1 - r_2|} dr_1 dr_2.$

The two-electron integrals can be rearranged in the so-called chemist notation which gives

$V_{pqrs} = \int \frac{\phi_p(r_1)^* \phi_q(r_1)^* \phi_r(r_2) \phi_s(r_2)}{|r_1 - r_2|} dr_1 dr_2,$

and the molecular Hamiltonian can be rewritten as

$H = \sum_{\alpha \in \{\uparrow, \downarrow \} } \sum_{pq} T_{pq} a_{p,\alpha}^{\dagger} a_{q, \alpha} + \frac{1}{2} \sum_{\alpha, \beta \in \{\uparrow, \downarrow \} } \sum_{pqrs} V_{pqrs} a_{p, \alpha}^{\dagger} a_{q, \alpha} a_{r, \beta}^{\dagger} a_{s, \beta},$

with

$T_{pq} = h_{pq} - \frac{1}{2} \sum_s h_{pssq}.$

This notation allows a low-rank factorization of the two-electron integral. The objective of the factorization is to find a set of symmetric matrices, $$L^{(r)}$$, such that

$V_{ijkl} = \sum_r^R L_{ij}^{(r)} L_{kl}^{(r) T},$

with the rank $$R \leq n^2$$ where $$n$$ is the number of molecular orbitals. The matrices $$L^{(r)}$$ are diagonalized and for each matrix the eigenvalues that are smaller than a given threshold (and their corresponding eigenvectors) are discarded.

The factorization algorithm has the following steps [arXiv:1902.02134]:

• Reshape the $$n \times n \times n \times n$$ two-electron tensor to a $$n^2 \times n^2$$ matrix where $$n$$ is the number of orbitals.

• Diagonalize the resulting matrix and keep the $$r$$ eigenvectors that have corresponding eigenvalues larger than a threshold.

• Multiply the eigenvectors by the square root of the eigenvalues to obtain matrices $$L^{(r)}$$.

• Reshape the selected eigenvectors to $$n \times n$$ matrices.

• Diagonalize the $$n \times n$$ matrices and for each matrix keep the eigenvalues (and their corresponding eigenvectors) that are larger than a threshold.

Using PennyLane

Development

API

Internals