Unitary Coupled Cluster Util

class slowquant.unitary_coupled_cluster.density_matrix.ReducedDenstiyMatrix(num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, rdm1: ndarray, rdm2: ndarray | None = None)

Reduced density matrix class.

Initialize reduced density matrix class.

Parameters:
  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

  • num_virtual_orbs – Number of virtual orbitals in spatial basis.

  • rdm1 – One-electron reduced density matrix in the active space.

  • rdm2 – Two-electron reduced density matrix in the active space.

RDM1(p: int, q: int) float

Get full space one-electron reduced density matrix element.

The only non-zero elements are:

\[\begin{split}\Gamma^{[1]}_{pq} = \left\{\begin{array}{ll} 2\delta_{ij} & pq = ij\\ \left<0\left|\hat{E}_{vw}\right|0\right> & pq = vw\\ 0 & \text{otherwise} \\ \end{array} \right.\end{split}\]

and the symmetry \(\Gamma^{[1]}_{pq}=\Gamma^{[1]}_{qp}\).

Parameters:
  • p – Spatial orbital index.

  • q – Spatial orbital index.

Returns:

One-electron reduced density matrix element.

RDM2(p: int, q: int, r: int, s: int) float

Get full space two-electron reduced density matrix element.

\[\begin{split}\Gamma^{[2]}_{pqrs} = \left\{\begin{array}{ll} 4\delta_{ij}\delta_{kl} - 2\delta_{jk}\delta_{il} & pqrs = ijkl\\ 2\delta_{ij} \Gamma^{[1]}_{vw} & pqrs = vwij\\ - \delta_{ij}\Gamma^{[1]}_{vw} & pqrs = ivwj\\ \left<0\left|\hat{e}_{vwxy}\right|0\right> & pqrs = vwxy\\ 0 & \text{otherwise} \\ \end{array} \right.\end{split}\]

and the symmetry \(\Gamma^{[2]}_{pqrs}=\Gamma^{[2]}_{rspq}=\Gamma^{[2]}_{qpsr}=\Gamma^{[2]}_{srqp}\).

Parameters:
  • p – Spatial orbital index.

  • q – Spatial orbital index.

  • r – Spatial orbital index.

  • s – Spatial orbital index.

Returns:

Two-electron reduced density matrix element.

slowquant.unitary_coupled_cluster.density_matrix.get_electronic_energy(rdms: ReducedDenstiyMatrix, h_int: ndarray, g_int: ndarray, num_inactive_orbs: int, num_active_orbs: int) float

Calculate electronic energy.

\[E = \sum_{pq}h_{pq}\Gamma^{[1]}_{pq} + \frac{1}{2}\sum_{pqrs}g_{pqrs}\Gamma^{[2]}_{pqrs}\]
Parameters:
  • h_int – One-electron integrals in MO.

  • g_int – Two-electron integrals in MO.

  • num_inactive_orbs – Number of inactive orbitals.

  • num_active_orbs – Number of active orbitals.

Returns:

Electronic energy.

slowquant.unitary_coupled_cluster.density_matrix.get_orbital_gradient(rdms: ReducedDenstiyMatrix, h_int: ndarray, g_int: ndarray, kappa_idx: list[tuple[int, int]], num_inactive_orbs: int, num_active_orbs: int) ndarray

Calculate the orbital gradient.

\[g_{pq}^{\hat{\kappa}} = \left<0\left|\left[\hat{\kappa}_{pq},\hat{H}\right]\right|0\right>\]
Parameters:
  • rdms – Reduced density matrix class.

  • h_int – One-electron integrals in MO in Hamiltonian.

  • g_int – Two-electron integrals in MO in Hamiltonian.

  • kappa_idx – Orbital parameter indicies in spatial basis.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

Returns:

Orbital gradient.

slowquant.unitary_coupled_cluster.density_matrix.get_orbital_gradient_response(rdms: ReducedDenstiyMatrix, h_int: ndarray, g_int: ndarray, kappa_idx: list[tuple[int, int]], num_inactive_orbs: int, num_active_orbs: int) ndarray

Calculate the response orbital parameter gradient.

\[g_{pq}^{\hat{q}} = \left<0\left|\left[\hat{q}_{pq},\hat{H}\right]\right|0\right>\]
Parameters:
  • rdms – Reduced density matrix class.

  • h_int – One-electron integrals in MO in Hamiltonian.

  • g_int – Two-electron integrals in MO in Hamiltonian.

  • kappa_idx – Orbital parameter indicies in spatial basis.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

Returns:

Orbital response parameter gradient.

slowquant.unitary_coupled_cluster.density_matrix.get_orbital_response_hessian_block(rdms: ReducedDenstiyMatrix, h: ndarray, g: ndarray, kappa_idx1: list[tuple[int, int]], kappa_idx2: list[tuple[int, int]], num_inactive_orbs: int, num_active_orbs: int) ndarray

Calculate Hessian-like orbital-orbital block.

\[H^{\hat{q},\hat{q}}_{tu,mn} = \left<0\left|\left[\hat{q}_{tu},\left[\hat{H},\hat{q}_{mn}\right]\right]\right|0\right>\]
Parameters:
  • rdms – Reduced density matrix class.

  • kappa_idx1 – Orbital parameter indicies in spatial basis.

  • kappa_idx1 – Orbital parameter indicies in spatial basis.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

Returns:

Hessian-like orbital-orbital block.

slowquant.unitary_coupled_cluster.density_matrix.get_orbital_response_metric_sigma(rdms: ReducedDenstiyMatrix, kappa_idx: list[tuple[int, int]]) ndarray

Calculate the Sigma matrix orbital-orbital block.

\[\Sigma_{pq,pq}^{\hat{q},\hat{q}} = \left<0\left|\left[\hat{q}_{pq}^\dagger,\hat{q}_{pq}\right]\right|0\right>\]
Parameters:
  • rdms – Reduced density matrix class.

  • kappa_idx – Orbital parameter indicies in spatial basis.

Returns:

Sigma matrix orbital-orbital block.

slowquant.unitary_coupled_cluster.density_matrix.get_orbital_response_property_gradient(rdms: ReducedDenstiyMatrix, x_mo: ndarray, kappa_idx: list[tuple[int, int]], num_inactive_orbs: int, num_active_orbs: int, response_vectors: ndarray, state_number: int, number_excitations: int) float

Calculate the orbital part of property gradient.

\[P^{\hat{q}} = \sum_k\left<0\left|\left[\hat{O}_{k},\hat{X}\right]\right|0\right>\]
Parameters:
  • rdms – Reduced density matrix class.

  • x_mo – Property integral in MO basis.

  • kappa_idx – Orbital parameter indicies in spatial basis.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

  • response_vectors – Response vectors.

  • state_number – State number counting from zero.

  • number_excitations – Total number of excitations.

Returns:

Orbital part of property gradient.

slowquant.unitary_coupled_cluster.density_matrix.get_orbital_response_vector_norm(rdms: ReducedDenstiyMatrix, kappa_idx: list[list[int]], response_vectors: ndarray, state_number: int, number_excitations: int) float

Calculate the orbital part of excited state norm.

\[N^{\hat{q}} = \sum_k\left<0\left|\left[\hat{O}_{k},\hat{O}_{k}^\dagger\right]\right|0\right>\]
Parameters:
  • rdms – Reduced density matrix class.

  • kappa_idx – Orbital parameter indicies in spatial basis.

  • response_vectors – Response vectors.

  • state_number – State number counting from zero.

  • number_excitations – Total number of excitations.

Returns:

Orbital part of excited state norm.

class slowquant.unitary_coupled_cluster.fermionic_operator.FermionicOperator(annihilation_operator: dict[str, list[a_op]] | a_op, factor: dict[str, float] | float)

Initialize fermionic operator class.

Fermionic operators are defined via an annihilation_operator dictionary where each entry is one addend of the operator. Each entry is a strings of annihilation operator specified via its string (key) and list of a_op (item). The dictionary factor contains the factor for each of the addend of the fermionic operator.

Parameters:
  • annihilation_operator – Annihilation operator.

  • factor – Factor in front of operator.

property dagger: FermionicOperator

Complex conjugation of fermionic operator.

Returns:

New fermionic operator.

get_folded_operator(num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int) FermionicOperator

Get folded operator.

Operator is split into spaces

\[\hat{O} = \hat{O}_I\otimes \hat{O}_A\otimes \hat{O}_V\]

giving the expectation values as

\[\left<0\left(\boldsymbol{\theta}\right)\left|\hat{O}\right|0\left(\boldsymbol{\theta}\right)\right> = \left<I\left|\hat{O}_{I}\right|I\right>\otimes \left<A\left(\boldsymbol{\theta}\right)\left|\hat{O}_{A}\right|A\left(\boldsymbol{\theta}\right)\right> \otimes\left<V\left|\hat{O}_{V}\right|V\right>\]

where the inactive and virtual parts follow simple annihilation operator arguments, leaving just the active part.

Warning, multiplication of folded operators, might give wrong operators. (I have not quite figured out a good programming structure that will not allow multiplication after folding)

Note, that the indicies of the folded operator is remapped, such that idx=0 is the first index in the active space.

Parameters:
  • num_inactive_orbs – Number of spatial inactive orbitals.

  • num_active_orbs – Number of spatial active orbitals.

  • num_virtual_orbs – Number of spatial virtual orbitals.

Returns:

Folded fermionic operator.

get_info() tuple[list[list[int]], list[list[int]], list[float]]

Return operator excitation in ordered strings with coefficient.

get_qiskit_form(num_orbs: int) dict[str, float]

Get fermionic operator on qiskit form.

Parameters:

num_orbs – Number of spatial orbitals.

Returns:

Fermionic operators on qiskit form.

property operator_count: dict[int, int]

Count number of operators of different lengths.

Returns:

Number of operators of every length.

class slowquant.unitary_coupled_cluster.fermionic_operator.a_op(spinless_idx: int, spin: str, dagger: bool)

Initialize fermionic annihilation operator.

Parameters:
  • spinless_idx – Spatial orbital index.

  • spin – Alpha or beta spin.

  • dagger – If creation operator.

slowquant.unitary_coupled_cluster.fermionic_operator.a_op_spin(spin_idx: int, dagger: bool) a_op

Get fermionic annihilation operator.

Parameters:
  • spin_idx – Spin orbital index.

  • dagger – If creation operator.

Returns:

Annihilation operator.

slowquant.unitary_coupled_cluster.fermionic_operator.do_extended_normal_ordering(fermistring: FermionicOperator) tuple[dict[str, list[a_op]], dict[str, float]]

Reorder fermionic operator string.

The string will be ordered such that all creation operators are first, and annihilation operators are second. Within a block of creation or annihilation operators the largest spin index will be first and the ordering will be descending.

Returns:

Reordered operator dict and factor dict.

slowquant.unitary_coupled_cluster.fermionic_operator.operator_string_to_key(operator_string: list[a_op]) str

Make key string to index a fermionic operator in a dict structure.

Parameters:

operator_string – Fermionic opreators.

Returns:

Dictionary key.

slowquant.unitary_coupled_cluster.fermionic_operator.operator_to_qiskit_key(operator_string: list[a_op], remapping: dict[int, int]) str

Make key string to index a fermionic operator in a dict structure.

Parameters:
  • operator_string – Fermionic opreators.

  • remapping – Map that takes indices from alpha,beta,alpha,beta to alpha,alpha,beta,beta ordering.

Returns:

Dictionary key.

slowquant.unitary_coupled_cluster.operator_matrix.Epq_matrix(p: int, q: int, num_active_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int) lil_array

Get matrix representation of Epq operator.

Parameters:
  • p – Spatial orbital index.

  • q – Spatial orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of Epq operator.

slowquant.unitary_coupled_cluster.operator_matrix.T1_matrix(i: int, a: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T1 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T1_sa_matrix(i: int, a: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T1 spin-adapted cluster operator.

Parameters:
  • i – Strongly occupied spatial orbital index.

  • a – Weakly occupied spatial orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T2_1_sa_matrix(i: int, j: int, a: int, b: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T2 spin-adapted cluster operator - G2_1 part.

Parameters:
  • i – Strongly occupied spatial orbital index.

  • j – Strongly occupied spatial orbital index.

  • a – Weakly occupied spatial orbital index.

  • b – Weakly occupied spatial orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T2_2_sa_matrix(i: int, j: int, a: int, b: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T2 spin-adapted cluster operator - G2_2 part.

Parameters:
  • i – Strongly occupied spatial orbital index.

  • j – Strongly occupied spatial orbital index.

  • a – Weakly occupied spatial orbital index.

  • b – Weakly occupied spatial orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T2_matrix(i: int, j: int, a: int, b: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T2 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T3_matrix(i: int, j: int, k: int, a: int, b: int, c: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T3 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T4_matrix(i: int, j: int, k: int, l: int, a: int, b: int, c: int, d: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T4 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • l – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • d – Weakly occupied spin orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T5_matrix(i: int, j: int, k: int, l: int, m: int, a: int, b: int, c: int, d: int, e: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T5 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • l – Strongly occupied spin orbital index.

  • m – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • d – Weakly occupied spin orbital index.

  • e – Weakly occupied spin orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.T6_matrix(i: int, j: int, k: int, l: int, m: int, n: int, a: int, b: int, c: int, d: int, e: int, f: int, num_active_orbs: int, num_elec_alpha: int, num_elec_beta: int) lil_array

Get matrix representation of anti-Hermitian T6 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • l – Strongly occupied spin orbital index.

  • m – Strongly occupied spin orbital index.

  • n – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • d – Weakly occupied spin orbital index.

  • e – Weakly occupied spin orbital index.

  • f – Weakly occupied spin orbital index.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_matrix.build_operator_matrix(op: FermionicOperator, idx2det: Sequence[int], det2idx: dict[int, int], num_active_orbs: int) ndarray

Build matrix representation of operator.

Parameters:
  • op – Fermionic number and spin conserving operator.

  • idx2det – Index to determinant.

  • det2idx – Determinant to index.

  • num_active_orbs – Number of active spatial orbitals.

Returns:

Matrix representation of operator.

slowquant.unitary_coupled_cluster.operator_matrix.construct_ucc_state(state: ndarray, num_active_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, thetas: Sequence[float], ucc_struct: UccStructure, dagger: bool = False) ndarray

Construct UCC state by applying UCC unitary to reference state.

Parameters:
  • state – Reference state vector.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • thetas – Active-space parameters. Ordered as (S, D, T, …).

  • ucc_struct – UCCStructure object.

  • dagger – If true, do dagger unitaries.

Returns:

New state vector with unitaries applied.

slowquant.unitary_coupled_cluster.operator_matrix.construct_ups_state(state: ndarray, num_active_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, thetas: Sequence[float], ups_struct: UpsStructure, dagger: bool = False) ndarray

Construct unitary product state by applying UPS unitary to reference state.

\[\boldsymbol{U}_N...\boldsymbol{U}_0\left|\nu\right> = \left|\tilde\nu\right>\]
  1. 10.48550/arXiv.2303.10825, Eq. 15

Parameters:
  • state – Reference state vector.

  • num_active_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_betaa – Number of active beta electrons.

  • thetas – Ansatz parameters values.

  • ups_struct – Unitary product state structure.

  • dagger – If true, do dagger unitaries.

Returns:

New state vector with unitaries applied.

slowquant.unitary_coupled_cluster.operator_matrix.expectation_value(bra: ndarray, operators: list[FermionicOperator | str], ket: ndarray, idx2det: Sequence[int], det2idx: dict[int, int], num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, thetas: Sequence[float], wf_struct: UpsStructure | UccStructure) float

Calculate expectation value of operator.

Parameters:
  • bra – Bra state.

  • op – Operator.

  • ket – Ket state.

  • idx2det – Index to determinant mapping.

  • det2idx – Determinant to index mapping.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • thetas – Active-space parameters. Ordered as (S, D, T, …).

  • wf_struct – wave function structure object

Returns:

Expectation value.

slowquant.unitary_coupled_cluster.operator_matrix.expectation_value_mat(bra: ndarray, op: ndarray, ket: ndarray) float

Calculate expectation value of operator in matrix form.

Parameters:
  • bra – Bra state.

  • op – Operator.

  • ket – Ket state.

Returns:

Expectation value.

slowquant.unitary_coupled_cluster.operator_matrix.get_grad_action(state: ndarray, idx: int, num_active_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, ups_struct: UpsStructure) ndarray

Get effect of differentiation with respect to “idx” operator in the UPS expansion.

\[\frac{\partial}{\partial \theta_i}\left(\left<\text{CSF}\right|\boldsymbol{U}(\theta_{i-1})\boldsymbol{U}(\theta_i)\right) = \left<\text{CSF}\right|\boldsymbol{U}(\theta_{i-1})\frac{\partial \boldsymbol{U}(\theta_i)}{\partial \theta_i}\]

With,

\[\begin{split}\begin{align} \frac{\partial \boldsymbol{U}(\theta_i)}{\partial \theta_i} &= \frac{\partial}{\partial \theta_i}\exp\left(\theta_i \hat{T}_i\right)\\ &= \exp\left(\theta_i \hat{T}_i\right)\hat{T}_i \end{align}\end{split}\]

This function only applies the $hat{T}_i$ part to the state.

  1. 10.48550/arXiv.2303.10825, Eq. 20 (appendix - v1)

Parameters:
  • state – State vector.

  • idx – Index of operator in the ups_struct.

  • num_active_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • ups_struct – UPS structure object.

Returns:

State with derivative of the idx’th unitary applied.

slowquant.unitary_coupled_cluster.operator_matrix.get_indexing(num_active_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int) tuple[list[int], dict[int, int]]

Get relation between index and determiant.

Parameters:
  • num_active_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

Returns:

List to map index to determiant and dictionary to map determiant to index.

slowquant.unitary_coupled_cluster.operator_matrix.propagate_state(operators: list[FermionicOperator | str], state: ndarray, idx2det: Sequence[int], det2idx: dict[int, int], num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, thetas: Sequence[float], wf_struct: UpsStructure | UccStructure) ndarray

Propagate state by applying operator.

The operator will be folded to only work on the active orbitals. The resulting state should not be acted on with another folded operator. This would violate the “do not multiply folded operators” rule. It is the first step to a faster matrix multiplication for expectation values.

\[\left|\tilde{0}\right> = \hat{O}\left|0\right>\]
Parameters:
  • operators – List of operators.

  • state – State.

  • idx2det – Index to determinant.

  • det2idx – Determinant to index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • thetas – Active-space parameters. Ordered as (S, D, T, …).

  • wf_struct – wave function structure object

Returns:

New state.

slowquant.unitary_coupled_cluster.operator_matrix.propagate_unitary(state: ndarray, idx: int, num_active_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, thetas: Sequence[float], ups_struct: UpsStructure) ndarray

Apply unitary from UPS operator number ‘idx’ to state.

Parameters:
  • state – State vector.

  • idx – Index of operator in the ups_struct.

  • num_active_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • thetas – Values for ansatz parameters.

  • ups_struct – UPS structure object.

Returns:

State with unitary applied.

slowquant.unitary_coupled_cluster.operators.Eminuspq(p: int, q: int) FermionicOperator

Construct Hermitian singlet one-electron excitation operator.

\[\hat{E}^-_{pq} = \hat{E}_{pq} - \hat{E}_{qp}\]
Parameters:
  • p – Spatial orbital index.

  • q – Spatial orbital index.

Returns:

Singlet one-electron excitation operator.

slowquant.unitary_coupled_cluster.operators.Epq(p: int, q: int) FermionicOperator

Construct the singlet one-electron excitation operator.

\[\hat{E}_{pq} = \hat{a}^\dagger_{p,\alpha}\hat{a}_{q,\alpha} + \hat{a}^\dagger_{p,\beta}\hat{a}_{q,\beta}\]
Parameters:
  • p – Spatial orbital index.

  • q – Spatial orbital index.

Returns:

Singlet one-electron excitation operator.

slowquant.unitary_coupled_cluster.operators.G1(i: int, a: int) FermionicOperator

Construct one-electron excitation operator.

\[\hat{G}^{[1]}_{ia} = \hat{a}_{a}^\dagger\hat{a}_i\]
Parameters:
  • i – Spin orbital index.

  • a – Spin orbital index.

Returns:

One-elecetron excitation operator.

slowquant.unitary_coupled_cluster.operators.G1_sa(i: int, a: int) FermionicOperator

Construct singlet one-electron spin-adapted excitation operator.

\[\hat{G}^{[1]}_{ia} = \frac{1}{\sqrt{2}}\hat{E}_{ai}\]
Parameters:
  • i – Spatial orbital index.

  • a – Spatial orbital index.

Returns:

Singlet one-elecetron spin-adapted excitation operator.

slowquant.unitary_coupled_cluster.operators.G2(i: int, j: int, a: int, b: int) FermionicOperator

Construct two-electron excitation operator.

\[\hat{G}^{[2]}_{ijab} = \hat{a}_{a}^\dagger\hat{a}_{b}^\dagger\hat{a}_j\hat{a}_i\]
Parameters:
  • i – Spin orbital index.

  • j – Spin orbital index.

  • a – Spin orbital index.

  • b – Spin orbital index.

Returns:

Two-elecetron excitation operator.

slowquant.unitary_coupled_cluster.operators.G2_1_sa(i: int, j: int, a: int, b: int) FermionicOperator

Construct first singlet two-electron spin-adapted excitation operator.

\[\hat{G}^{[1]}_{aibj} = \frac{1}{2\sqrt{\left(1+\delta_{ab}\right)\left(1+\delta_{ij}\right)}}\left(\hat{E}_{ai}\hat{E}_{bj} + \hat{E}_{aj}\hat{E}_{bi}\right)\]
Parameters:
  • i – Spatial orbital index.

  • j – Spatial orbital index.

  • a – Spatial orbital index.

  • b – Spatial orbital index.

Returns:

First singlet two-elecetron spin-adapted excitation operator.

slowquant.unitary_coupled_cluster.operators.G2_2_sa(i: int, j: int, a: int, b: int) FermionicOperator

Construct second singlet two-electron spin-adapted excitation operator.

\[\hat{G}^{[2]}_{aibj} = \frac{1}{2\sqrt{3}}\left(\hat{E}_{ai}\hat{E}_{bj} - \hat{E}_{aj}\hat{E}_{bi}\right)\]
Parameters:
  • i – Spatial orbital index.

  • j – Spatial orbital index.

  • a – Spatial orbital index.

  • b – Spatial orbital index.

Returns:

Second singlet two-elecetron spin-adapted excitation operator.

slowquant.unitary_coupled_cluster.operators.G3(i: int, j: int, k: int, a: int, b: int, c: int) FermionicOperator

Construct three-electron excitation operator.

\[\hat{G}^{[3]}_{ijkabc} = \hat{a}_{a}^\dagger\hat{a}_{b}^\dagger\hat{a}_{c}^\dagger\hat{a}_k\hat{a}_j\hat{a}_i\]
Parameters:
  • i – Spin orbital index.

  • j – Spin orbital index.

  • k – Spin orbital index.

  • a – Spin orbital index.

  • b – Spin orbital index.

  • c – Spin orbital index.

Returns:

Three-elecetron excitation operator.

slowquant.unitary_coupled_cluster.operators.G4(i: int, j: int, k: int, l: int, a: int, b: int, c: int, d: int) FermionicOperator

Construct four-electron excitation operator.

\[\hat{G}^{[4]}_{ijklabcd} = \hat{a}_{a}^\dagger\hat{a}_{b}^\dagger\hat{a}_{c}^\dagger\hat{a}_{d}^\dagger\hat{a}_l\hat{a}_k\hat{a}_j\hat{a}_i\]
Parameters:
  • i – Spin orbital index.

  • j – Spin orbital index.

  • k – Spin orbital index.

  • l – Spin orbital index.

  • a – Spin orbital index.

  • b – Spin orbital index.

  • c – Spin orbital index.

  • d – Spin orbital index.

Returns:

Four-elecetron excitation operator.

slowquant.unitary_coupled_cluster.operators.G5(i: int, j: int, k: int, l: int, m: int, a: int, b: int, c: int, d: int, e: int) FermionicOperator

Construct five-electron excitation operator.

\[\hat{G}^{[5]}_{ijklmabcde} = \hat{a}_{a}^\dagger\hat{a}_{b}^\dagger\hat{a}_{c}^\dagger\hat{a}_{d}^\dagger\hat{a}_{e}^\dagger\hat{a}_m\hat{a}_l\hat{a}_k\hat{a}_j\hat{a}_i\]
Parameters:
  • i – Spin orbital index.

  • j – Spin orbital index.

  • k – Spin orbital index.

  • l – Spin orbital index.

  • m – Spin orbital index.

  • a – Spin orbital index.

  • b – Spin orbital index.

  • c – Spin orbital index.

  • d – Spin orbital index.

  • e – Spin orbital index.

Returns:

Five-elecetron excitation operator.

slowquant.unitary_coupled_cluster.operators.G6(i: int, j: int, k: int, l: int, m: int, n: int, a: int, b: int, c: int, d: int, e: int, f: int) FermionicOperator

Construct six-electron excitation operator.

\[\hat{G}^{[6]}_{ijklmnabcdef} = \hat{a}_{a}^\dagger\hat{a}_{b}^\dagger\hat{a}_{c}^\dagger\hat{a}_{d}^\dagger\hat{a}_{e}^\dagger\hat{a}_{f}^\dagger \hat{a}_n\hat{a}_m\hat{a}_l\hat{a}_k\hat{a}_j\hat{a}_i\]
Parameters:
  • i – Spin orbital index.

  • j – Spin orbital index.

  • k – Spin orbital index.

  • l – Spin orbital index.

  • m – Spin orbital index.

  • n – Spin orbital index.

  • a – Spin orbital index.

  • b – Spin orbital index.

  • c – Spin orbital index.

  • d – Spin orbital index.

  • e – Spin orbital index.

  • f – Spin orbital index.

Returns:

Six-elecetron excitation operator.

slowquant.unitary_coupled_cluster.operators.anni_spin(p: int, dagger: bool) FermionicOperator

Construct annihilation/creation operator.

Parameters:
  • p – Spin orbital index.

  • dagger – If creation operator.

Returns:

Annihilation/creation operator.

slowquant.unitary_coupled_cluster.operators.commutator(A: FermionicOperator, B: FermionicOperator) FermionicOperator

Construct operator commutator.

\[\left[\hat{A},\hat{B}\right] = \hat{A}\hat{B} - \hat{B}\hat{A}\]
Parameters:
  • A – Fermionic operator.

  • B – Fermionic operator.

Returns:

Operator from commutator.

slowquant.unitary_coupled_cluster.operators.double_commutator(A: FermionicOperator, B: FermionicOperator, C: FermionicOperator) FermionicOperator

Construct operator double commutator.

\[\left[\hat{A},\left[\hat{B},\hat{C}\right]\right] = \hat{A}\hat{B}\hat{C} - \hat{A}\hat{C}\hat{B} - \hat{B}\hat{C}\hat{A} + \hat{C}\hat{B}\hat{A}\]
Parameters:
  • A – Fermionic operator.

  • B – Fermionic operator.

  • C – Fermionic operator.

Returns:

Operator from double commutator.

slowquant.unitary_coupled_cluster.operators.epqrs(p: int, q: int, r: int, s: int) FermionicOperator

Construct the singlet two-electron excitation operator.

\[\hat{e}_{pqrs} = \hat{E}_{pq}\hat{E}_{rs} - \delta_{qr}\hat{E}_{ps}\]
Parameters:
  • p – Spatial orbital index.

  • q – Spatial orbital index.

  • r – Spatial orbital index.

  • s – Spatial orbital index.

Returns:

Singlet two-electron excitation operator.

slowquant.unitary_coupled_cluster.operators.hamiltonian_0i_0a(h_mo: ndarray, g_mo: ndarray, num_inactive_orbs: int, num_active_orbs: int) FermionicOperator

Get energy Hamiltonian operator.

Parameters:
  • h_mo – One-electron Hamiltonian integrals in MO.

  • g_mo – Two-electron Hamiltonian integrals in MO.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

Returns:

Energy Hamilonian fermionic operator.

slowquant.unitary_coupled_cluster.operators.hamiltonian_1i_1a(h_mo: ndarray, g_mo: ndarray, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int) FermionicOperator

Get Hamiltonian operator that works together with an extra inactive and an extra virtual index.

Parameters:
  • h_mo – One-electron Hamiltonian integrals in MO.

  • g_mo – Two-electron Hamiltonian integrals in MO.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

  • num_virtual_orbs – Number of virtual orbitals in spatial basis.

Returns:

Modified Hamilonian fermionic operator.

slowquant.unitary_coupled_cluster.operators.hamiltonian_2i_2a(h_mo: ndarray, g_mo: ndarray, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int) FermionicOperator

Get Hamiltonian operator that works together with two extra inactive and two extra virtual index.

Parameters:
  • h_mo – One-electron Hamiltonian integrals in MO.

  • g_mo – Two-electron Hamiltonian integrals in MO.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

  • num_virtual_orbs – Number of virtual orbitals in spatial basis.

Returns:

Modified Hamilonian fermionic operator.

slowquant.unitary_coupled_cluster.operators.hamiltonian_full_space(h_mo: ndarray, g_mo: ndarray, num_orbs: int) FermionicOperator

Construct full-space electronic Hamiltonian.

\[\hat{H} = \sum_{pq}h_{pq}\hat{E}_{pq} + \frac{1}{2}\sum_{pqrs}g_{pqrs}\hat{e}_{pqrs}\]
Parameters:
  • h_mo – Core one-electron integrals in MO basis.

  • g_mo – Two-electron integrals in MO basis.

  • num_orbs – Number of spatial orbitals.

Returns:

Hamiltonian operator in full-space.

slowquant.unitary_coupled_cluster.operators.one_elec_op_0i_0a(ints_mo: ndarray, num_inactive_orbs: int, num_active_orbs: int) FermionicOperator

Create one-electron operator that makes no changes in the inactive and virtual orbitals.

Parameters:
  • ints_mo – One-electron integrals for operator in MO basis.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

Returns:

One-electron operator for active-space.

slowquant.unitary_coupled_cluster.operators.one_elec_op_1i_1a(ints_mo: ndarray, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int) FermionicOperator

Create one-electron operator that makes up to one change in the inactive and virtual orbitals.

Parameters:
  • ints_mo – One-electron integrals for operator in MO basis.

  • num_inactive_orbs – Number of inactive orbitals in spatial basis.

  • num_active_orbs – Number of active orbitals in spatial basis.

  • num_virtual_orbs – Number of virtual orbitals in spatial basis.

Returns:

Modified one-electron operator.

slowquant.unitary_coupled_cluster.operators.one_elec_op_full_space(ints_mo: ndarray, num_orbs: int) FermionicOperator

Construct full-space one-electron operator.

\[\hat{O} = \sum_{pq}h_{pq}\hat{E}_{pq}\]
Parameters:
  • ints_mo – One-electron integrals for operator in MO basis.

  • num_orbs – Number of spatial orbitals.

Returns:

One-electron operator in full-space.

slowquant.unitary_coupled_cluster.operator_extended.T1_extended_matrix(i: int, a: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T1 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T1_sa_extended_matrix(i: int, a: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T1 spin-adapted cluster operator.

Parameters:
  • i – Strongly occupied spatial orbital index.

  • a – Weakly occupied spatial orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T2_1_sa_extended_matrix(i: int, j: int, a: int, b: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T2 spin-adapted cluster operator - G2_1 part.

Parameters:
  • i – Strongly occupied spatial orbital index.

  • j – Strongly occupied spatial orbital index.

  • a – Weakly occupied spatial orbital index.

  • b – Weakly occupied spatial orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T2_2_sa_extended_matrix(i: int, j: int, a: int, b: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T2 spin-adapted cluster operator - G2_2 part.

Parameters:
  • i – Strongly occupied spatial orbital index.

  • j – Strongly occupied spatial orbital index.

  • a – Weakly occupied spatial orbital index.

  • b – Weakly occupied spatial orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T2_extended_matrix(i: int, j: int, a: int, b: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T2 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T3_extended_matrix(i: int, j: int, k: int, a: int, b: int, c: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T3 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T4_extended_matrix(i: int, j: int, k: int, l: int, a: int, b: int, c: int, d: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T4 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • l – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • d – Weakly occupied spin orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T5_extended_matrix(i: int, j: int, k: int, l: int, m: int, a: int, b: int, c: int, d: int, e: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T5 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • l – Strongly occupied spin orbital index.

  • m – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • d – Weakly occupied spin orbital index.

  • e – Weakly occupied spin orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.T6_extended_matrix(i: int, j: int, k: int, l: int, m: int, n: int, a: int, b: int, c: int, d: int, e: int, f: int, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, order: int) lil_array

Get matrix representation of anti-Hermitian T6 spin-conserving cluster operator.

Parameters:
  • i – Strongly occupied spin orbital index.

  • j – Strongly occupied spin orbital index.

  • k – Strongly occupied spin orbital index.

  • l – Strongly occupied spin orbital index.

  • m – Strongly occupied spin orbital index.

  • n – Strongly occupied spin orbital index.

  • a – Weakly occupied spin orbital index.

  • b – Weakly occupied spin orbital index.

  • c – Weakly occupied spin orbital index.

  • d – Weakly occupied spin orbital index.

  • e – Weakly occupied spin orbital index.

  • f – Weakly occupied spin orbital index.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • order – Excitation order of extended space.

Returns:

Matrix representation of anti-Hermitian cluster operator.

slowquant.unitary_coupled_cluster.operator_extended.build_operator_matrix_extended(op: FermionicOperator, idx2det: Sequence[int], det2idx: dict[int, int], num_orbs: int) ndarray

Build matrix representation of operator.

Parameters:
  • op – Fermionic number and spin conserving operator.

  • idx2det – Index to determinant.

  • det2idx – Determinant to index.

  • num_orbs – Number of spatial orbitals.

Returns:

Matrix representation of operator.

slowquant.unitary_coupled_cluster.operator_extended.construct_ucc_state_extended(state: ndarray, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, thetas: Sequence[float], ucc_struct: UccStructure, order: int, dagger: bool = False) ndarray

Construct UCC state by applying UCC unitary to reference state.

Parameters:
  • num_det – Number of determinants.

  • num_active_orbs – Number of active spatial orbitals.

  • num_elec_alpha – Number of active alpha electrons.

  • num_elec_beta – Number of active beta electrons.

  • theta – Active-space parameters. Ordered as (S, D, T, …).

  • theta_picker – Helper class to pick the parameters in the right order.

  • excitations – Excitation orders to include.

  • order – Excitation order of extended space.

  • dagger – If true, do dagger unitaries.

Returns:

New state vector with unitaries applied.

slowquant.unitary_coupled_cluster.operator_extended.construct_ups_state_extended(state: ndarray, num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, thetas: Sequence[float], ups_struct: UpsStructure, order: int, dagger: bool = False) ndarray

Construct unitary product state by applying UPS unitary to reference state.

\[\boldsymbol{U}_N...\boldsymbol{U}_0\left|\nu\right> = \left|\tilde\nu\right>\]
  1. 10.48550/arXiv.2303.10825, Eq. 15

Parameters:
  • state – Reference state vector.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_betaa – Number of active beta electrons.

  • thetas – Ansatz parameters values.

  • ups_struct – Unitary product state structure.

  • order – Excitation order of extended space.

  • dagger – If do dagger unitaries.

Returns:

New state vector with unitaries applied.

slowquant.unitary_coupled_cluster.operator_extended.expectation_value_extended(bra: ndarray, operators: list[FermionicOperator | str], ket: ndarray, idx2det: Sequence[int], det2idx: dict[int, int], num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, thetas: Sequence[float], wf_struct: UpsStructure | UccStructure, order: int) float

Calculate expectation value of operator.

Parameters:
  • bra – Bra state.

  • op – Operator.

  • ket – Ket state.

  • idx2det – Index to determinant mapping.

  • det2idx – Determinant to index mapping.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • thetas – Active-space parameters. Ordered as (S, D, T, …).

  • wf_struct – wave function structure object

Returns:

Expectation value.

slowquant.unitary_coupled_cluster.operator_extended.generate_doubles(num_inactive_orbs: int, num_virtual_orbs: int) Generator[tuple[list[int], list[int]], None, None]

Generate double excited determinant in the inactive and virtual space.

These are generated via double excitation between all three spaces and thus are only particle conserving in the full space. It includes double excitations: inactive -> virtual, inactive -> active (no change in virtual), active -> virtual (no change in occ) The reference is also included.

Parameters:
  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

Returns:

Double excited determinants.

slowquant.unitary_coupled_cluster.operator_extended.generate_singles(num_inactive_orbs: int, num_virtual_orbs: int) Generator[tuple[list[int], list[int]], None, None]

Generate single excited determinant in the inactive and virtual space.

These are generated via single excitation between all three spaces and thus are only particle conserving in the full space. It includes single excitations: inactive -> virtual, inactive -> active (no change in virtual), active -> virtual (no change in occ) The reference is also included.

Parameters:
  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

Returns:

Single excited determinants.

slowquant.unitary_coupled_cluster.operator_extended.get_indexing_extended(num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_active_elec_alpha: int, num_active_elec_beta: int, order: int) tuple[list[int], dict[int, int]]

Get indexing between index and determiant, extended to include complete active-space on-top of a full space singles or full space singles and doubles.

Needed for full-space operators (e.g. orbital rotations between spaces) that act on the reference before the unitary ansatz is applied (e.g. $Uqleft|CSFright>$) . This leads to a change in particle number in the active space and precludes the standard indexing formalism that is based on operator folding into the active space. Now the determinant basis spans a larger portion of the Fock space made of the complete active space and singles and doubles in virtual and occupied space.

Parameters:
  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of virtual spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • order – Excitation order the space will be extended with.

Returns:

List to map index to determiant and dictionary to map determiant to index.

slowquant.unitary_coupled_cluster.operator_extended.propagate_state_extended(operators: list[FermionicOperator | str], state: ndarray, idx2det: Sequence[int], det2idx: dict[int, int], num_inactive_orbs: int, num_active_orbs: int, num_virtual_orbs: int, num_elec_alpha: int, num_elec_beta: int, thetas: Sequence[float], wf_struct: UpsStructure | UccStructure, order: int) ndarray

Propagate state by applying operator.

This operates in the extended space, so no operator folding is performed.

\[\left|\tilde{0}\right> = \hat{O}\left|0\right>\]
Parameters:
  • operators – List of operators.

  • state – State.

  • idx2det – Index to determiant mapping.

  • det2idx – Determinant to index mapping.

  • num_inactive_orbs – Number of inactive spatial orbitals.

  • num_active_orbs – Number of active spatial orbitals.

  • num_virtual_orbs – Number of active spatial orbitals.

  • num_active_elec_alpha – Number of active alpha electrons.

  • num_active_elec_beta – Number of active beta electrons.

  • thetas – Active-space parameters. Ordered as (S, D, T, …).

  • wf_struct – wave function structure object

Returns:

New state.

class slowquant.unitary_coupled_cluster.util.UccStructure

Intialize the unitary coupled cluster ansatz structure.

add_quadruples(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) None

Add alpha-number and beta-number conserving quadruples.

Parameters:
  • active_occ_spin_idx – Active strongly occupied spin orbital indices.

  • active_unocc_spin_idx – Active weakly occupied spin orbital indices.

add_quintuples(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) None

Add alpha-number and beta-number conserving quintuples.

Parameters:
  • active_occ_spin_idx – Active strongly occupied spin orbital indices.

  • active_unocc_spin_idx – Active weakly occupied spin orbital indices.

add_sa_doubles(active_occ_idx: Sequence[int], active_unocc_idx: Sequence[int]) None

Add spin-adapted doubles.

Parameters:
  • active_occ_idx – Active strongly occupied spatial orbital indices.

  • active_unocc_idx – Active weakly occupied spatial orbital indices.

add_sa_singles(active_occ_idx: Sequence[int], active_unocc_idx: Sequence[int]) None

Add spin-adapted singles.

Parameters:
  • active_occ_idx – Active strongly occupied spatial orbital indices.

  • active_unocc_idx – Active weakly occupied spatial orbital indices.

add_sextuples(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) None

Add alpha-number and beta-number conserving sextuples.

Parameters:
  • active_occ_spin_idx – Active strongly occupied spin orbital indices.

  • active_unocc_spin_idx – Active weakly occupied spin orbital indices.

add_triples(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) None

Add alpha-number and beta-number conserving triples.

Parameters:
  • active_occ_spin_idx – Active strongly occupied spin orbital indices.

  • active_unocc_spin_idx – Active weakly occupied spin orbital indices.

class slowquant.unitary_coupled_cluster.util.UpsStructure

Intialize the unitary product state ansatz structure.

create_SDSfUCC(num_orbs: int, num_elec: int, ansatz_options: dict[str, Any]) None

Create SDS ordered factorized UCC.

The operator ordering of this implementation is,

\[\boldsymbol{U}\left|\text{CSF}\right> = \prod_{ijab}\exp\left(\theta_{jb}\left(\hat{T}_{jb}-\hat{T}_{jb}^\dagger\right)\right) \exp\left(\theta_{ijab}\left(\hat{T}_{ijab}-\hat{T}_{ijab}^\dagger\right)\right) \exp\left(\theta_{ia}\left(\hat{T}_{ia}-\hat{T}_{ia}^\dagger\right)\right)\left|\text{CSF}\right>\]
  1. 10.1063/1.5133059, Eq. 25, Eq. 35 (SDS)

  2. 10.1021/acs.jctc.8b01004 (k-UpCCGSD)

Ansatz Options:
  • n_layers [int]: Number of layers.

  • D [bool]: Add double excitations.

  • pD [bool]: Add pair double excitations.

  • GpD [bool]: Add generalized pair double excitations.

Parameters:
  • num_orbs – Number of active spatial orbitals.

  • num_elec – Number of active electrons.

  • ansatz_options – Ansatz options.

Returns:

SDS ordered fUCC ansatz.

create_fUCC(num_orbs: int, num_elec: int, ansatz_options: dict[str, Any]) None

Create factorized UCC ansatz.

  1. 10.1021/acs.jctc.8b01004 (k-UpCCGSD)

Ansatz Options:
  • n_layers [int]: Number of layers.

  • S [bool]: Add single excitations.

  • SAS [bool]: Add spin-adapted single excitations.

  • SAGS [bool]: Add generalized spin-adapted single excitations.

  • D [bool]: Add double excitations.

  • pD [bool]: Add pair double excitations.

  • GpD [bool]: Add generalized pair double excitations.

Parameters:
  • num_orbs – Number of active spatial orbitals.

  • num_elec – Number of active electrons.

  • ansatz_options – Ansatz options.

Returns:

Factorized UCC ansatz.

create_tups(num_active_orbs: int, ansatz_options: dict[str, Any]) None

Create tUPS ansatz.

  1. 10.1103/PhysRevResearch.6.023300 (tUPS)

  2. 10.1088/1367-2630/ac2cb3 (QNP)

Ansatz Options:
  • n_layers [int]: Number of layers.

  • do_qnp [bool]: Do QNP tiling. (default: False)

  • skip_last_singles [bool]: Skip last layer of singles operators. (default: False)

Parameters:
  • num_active_orbs – Number of spatial active orbitals.

  • ansatz_options – Ansatz options.

Returns:

tUPS ansatz.

slowquant.unitary_coupled_cluster.util.iterate_pair_t2(active_occ_idx: Sequence[int], active_unocc_idx: Sequence[int]) Generator[tuple[int, int, int, int], None, None]

Iterate over pair T2 operators.

Parameters:
  • active_occ_idx – Indices of strongly occupied orbitals.

  • active_unocc_idx – Indices of weakly occupied orbitals.

Returns:

Pair T2 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_pair_t2_generalized(num_orbs: int) Generator[tuple[int, int, int, int], None, None]

Iterate over generalized pair T2 operators.

Parameters:

num_orbs – Number of active spatial orbitals.

Returns:

Generlaized pair T2 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t1(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) Generator[tuple[int, int], None, None]

Iterate over T1 spin-conserving operators.

Parameters:
  • active_occ_idx – Spin indices of strongly occupied orbitals.

  • active_unocc_idx – Spin indices of weakly occupied orbitals.

Returns:

T1 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t1_sa(active_occ_idx: Sequence[int], active_unocc_idx: Sequence[int]) Generator[tuple[int, int, float], None, None]

Iterate over T1 spin-adapted operators.

Parameters:
  • active_occ_idx – Indices of strongly occupied orbitals.

  • active_unocc_idx – Indices of weakly occupied orbitals.

Returns:

Spin-adapted T1 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t1_sa_generalized(num_orbs: int) Generator[tuple[int, int, float], None, None]

Iterate over T1 spin-adapted operators.

Parameters:

num_orbs – Number of active spatial orbitals.

Returns:

Generalized spin-adapted T1 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t2(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) Generator[tuple[int, int, int, int], None, None]

Iterate over T2 spin-conserving operators.

Parameters:
  • active_occ_idx – Spin indices of strongly occupied orbitals.

  • active_unocc_idx – Spin indices of weakly occupied orbitals.

Returns:

T2 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t2_sa(active_occ_idx: Sequence[int], active_unocc_idx: Sequence[int]) Generator[tuple[int, int, int, int, float, int], None, None]

Iterate over T2 spin-adapted operators.

Parameters:
  • active_occ_idx – Indices of strongly occupied orbitals.

  • active_unocc_idx – Indices of weakly occupied orbitals.

Returns:

Spin-adapted T2 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t3(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) Generator[tuple[int, int, int, int, int, int], None, None]

Iterate over T3 spin-conserving operators.

Parameters:
  • active_occ_idx – Spin indices of strongly occupied orbitals.

  • active_unocc_idx – Spin indices of weakly occupied orbitals.

Returns:

T3 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t4(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) Generator[tuple[int, int, int, int, int, int, int, int], None, None]

Iterate over T4 spin-conserving operators.

Parameters:
  • active_occ_idx – Spin indices of strongly occupied orbitals.

  • active_unocc_idx – Spin indices of weakly occupied orbitals.

Returns:

T4 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t5(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) Generator[tuple[int, int, int, int, int, int, int, int, int, int], None, None]

Iterate over T5 spin-conserving operators.

Parameters:
  • active_occ_idx – Spin indices of strongly occupied orbitals.

  • active_unocc_idx – Spin indices of weakly occupied orbitals.

Returns:

T5 operator iteration.

slowquant.unitary_coupled_cluster.util.iterate_t6(active_occ_spin_idx: Sequence[int], active_unocc_spin_idx: Sequence[int]) Generator[tuple[int, int, int, int, int, int, int, int, int, int, int, int], None, None]

Iterate over T6 spin-conserving operators.

Parameters:
  • active_occ_idx – Spin indices of strongly occupied orbitals.

  • active_unocc_idx – Spin indices of weakly occupied orbitals.

Returns:

T6 operator iteration.