qc2.algorithms.utils.orbital_optimization

This module defines the orbital optimization class used in oo-VQE.

Attributes

PennyLaneOperatorType

Classes

OrbitalOptimization

A class to perform orbital optimization for quantum chemical systems.

Module Contents

qc2.algorithms.utils.orbital_optimization.PennyLaneOperatorType[source]
class qc2.algorithms.utils.orbital_optimization.OrbitalOptimization(qc2data: qc2.data.data.qc2Data, active_space: qc2.algorithms.utils.active_space.ActiveSpace, freeze_active: bool = False, mapper: qiskit_nature.second_q.mappers.QubitMapper = JordanWignerMapper(), format: str = 'qiskit')[source]

A class to perform orbital optimization for quantum chemical systems.

This class is responsible for setting up and managing the data related to orbital optimization part of the oo-VQE algorithm.

qc2data[source]

An instance of qc2Data.

Type:

qc2Data

schema_dataclass[source]

An instance of QCSchema.

Type:

QCSchema

es_problem[source]

Instance of ElectronicStructureProblem in AO basis as processed from process_schema().

Type:

ElectronicStructureProblem

n_electrons[source]

Number of alpha and beta electrons.

Type:

Tuple[int, int]

nao[source]

Number of spatial orbitals.

Type:

int

n_active_orbitals[source]

Number of active orbitals to consider.

Type:

int

n_active_electrons[source]

Number of active electrons.

Type:

Tuple[int, int]

freeze_active[source]

Determines if the active orbitals are frozen in the optimization process.

Type:

bool, optional

occ_idx

Indices of occupied molecular orbitals.

Type:

list

act_idx

Indices of active molecular orbitals.

Type:

list

virt_idx

Indices of virtual molecular orbitals.

Type:

list

params_idx[source]

Indices for non-redundant orbital rotations.

Type:

list

n_kappa[source]

Dimension of the kappa vector for orbital rotations.

Type:

int

mapper[source]

The fermionic-to-qubit mapping algorithm.

Type:

QubitMapper

qc2data[source]
schema_dataclass[source]
es_problem[source]
n_electrons[source]
nao[source]
n_active_orbitals[source]
n_active_electrons[source]
freeze_active = False[source]
params_idx[source]
n_kappa[source]
mapper[source]
format = 'qiskit'[source]
orbital_optimization(rdm1: numpy.ndarray, rdm2: numpy.ndarray, kappa_init: List | None = None) Tuple[List, float][source]

Optimize orbital parameters.

Parameters:
  • rdm1 (np.array) – One-electron reduced density matrix.

  • rdm2 (np.array) – Two-electron reduced density matrix.

  • kappa_init (List, optional) – Initial orbital rotation parameters vector. If None, set guess as a zero vector.

Returns:

Optimized orbital rotation parameters and associated energy.

Return type:

Tuple[List, float]

Example

>>> from ase.build import molecule
>>> from qc2.ase import PySCF
>>> from qc2.data import qc2Data
>>> from qc2.algorithms.utils import OrbitalOptimization
>>> from qc2.algorithms.utils import ActiveSpace
>>>
>>> mol = molecule('H2O')
>>>
>>> hdf5_file = 'h2o.hdf5'
>>> qc2data = qc2Data(hdf5_file, mol, schema='qcschema')
>>> oo_problem = OrbitalOptimization(
...     qc2data=qc2data,
...     active_space=ActiveSpace(
...         num_active_electrons=(2, 2),
...         num_active_spatial_orbitals=4
...     ),
...     mapper=JordanWignerMapper(),
...     format="qiskit"
... )
>>> rdm1 = np.array(...)
>>> rdm2 = np.array(...)
>>> kappa_init = [0.0] * oo.n_kappa
>>> optimized_kappa, energy = oo.orbital_optimization(
...     rdm1, rdm2, kappa_init
... )
get_analytic_hessian(kappa: List, rdm1: numpy.ndarray, rdm2: numpy.ndarray) numpy.ndarray[source]

Calculate the analytic hessian for orbital optimization.

This method calculates the second derivative of the energy with respect to orbital rotation parameters.

Parameters:
  • kappa (List) – Orbital rotation parameters vector.

  • rdm1 (np.array) – One-electron reduced density matrix.

  • rdm2 (np.array) – Two-electron reduced density matrix.

Returns:

A (n_kappa, n_kappa) matrix containing analytic hessian.

Return type:

np.array

Notes

Based on the method outlined in: [1]. https://iopscience.iop.org/article/10.1088/2058-9565/abd334 [2]. https://doi.org/10.1038/s41534-023-00730-8 [3]. https://github.com/Emieeel/auto_oo

get_analytic_gradients(kappa: List, rdm1: numpy.ndarray, rdm2: numpy.ndarray) numpy.ndarray[source]

Calculates analytic gradients for orbital optimization.

This method calculates the first derivative of the energy with respect to orbital rotation parameters.

Parameters:
  • kappa (List) – Orbital rotation parameters vector.

  • rdm1 (np.array) – One-electron reduced density matrix.

  • rdm2 (np.array) – Two-electron reduced density matrix.

Returns:

A vector of len(kappa) containing analytic gradients.

Return type:

np.array

Notes

Based on the method outlined in: [4]. https://doi.org/10.1063/1.441359

get_fock_matrix(one_electron_integrals: numpy.array, two_electron_integrals: numpy.array, rdm1: numpy.array, rdm2: numpy.array) numpy.ndarray[source]

Constructs the Fock matrix for orbital optimization.

Parameters:
  • one_electron_integrals (np.array) – One-electron integrals.

  • two_electron_integrals (np.array) – Two-electron integrals.

  • rdm1 (np.array) – One-electron reduced density matrix.

  • rdm2 (np.array) – Two-electron reduced density matrix.

Returns:

The Fock matrix.

Return type:

np.array

Notes

Based on the method outlined in: [4]. https://doi.org/10.1063/1.441359

get_energy_from_kappa(kappa: List, rdm1: numpy.ndarray, rdm2: numpy.ndarray) float[source]

Gets total energy after transforming the MOs with kappa.

Parameters:
  • kappa (List) – Orbital rotation parameters vector.

  • rdm1 (np.array) – One-electron reduced density matrix.

  • rdm2 (np.array) – Two-electron reduced density matrix.

Returns:

Total ground-state energy.

Return type:

float

get_energy_from_mo_coeffs(mo_coeff_a: numpy.ndarray, mo_coeff_b: numpy.ndarray | None, rdm1: numpy.ndarray, rdm2: numpy.ndarray) float[source]

Get energy given one- and two-particle reduced density matrices.

Parameters:
  • mo_coeff_a (np.array) – Alpha MO coefficients vector.

  • mo_coeff_b (np.array, optional) – Beta MO coefficients vector.

  • rdm1 (np.array) – One-electron reduced density matrix.

  • rdm2 (np.array) – Two-electron reduced density matrix.

Returns:

Total ground-state energy.

Return type:

float

get_transformed_qubit_hamiltonian(kappa: List) Tuple[float, qiskit.quantum_info.SparsePauliOp | PennyLaneOperatorType][source]

Sets up the qubit Hamiltonian in the transformed MO basis.

Parameters:

kappa (List) – Orbital rotation parameters vector.

Returns:

  • core_energy (float): The core energy after active space and MO transformation.

  • qubit_op (Union[SparsePauliOp, Operator]): If the format is qiskit, it returns a SparsePauliOp representing the tranformed qubit Hamiltonian in the qiskit format. If the format is pennylane, it returns a Operator instance representing the qubit Hamiltonian in the PennyLane format.

Return type:

Tuple[float, SparsePauliOp]

get_transformed_mos(kappa: List) Tuple[numpy.ndarray, numpy.ndarray][source]

Transforms MO coefficients with orbital rotation parameters.

Parameters:

kappa (List) – Orbital rotation parameters vector.

Returns:

A tuple containing the transformed

MO coefficients.

Return type:

Tuple[np.ndarray, np.ndarray]

_get_rotation_matrix(kappa: List) numpy.ndarray[source]

Creates rotation matrix from kappa parameters.

_kappa_vector_to_matrix(kappa: List) numpy.ndarray[source]

Generates skew-symm. matrix from orbital rotation parameters.

_kappa_matrix_to_vector(kappa_matrix: numpy.ndarray) numpy.ndarray[source]

Generate orbital rotation parameters from a skew-symmetric matrix

_full_hessian_to_matrix(full_hess: numpy.ndarray) numpy.ndarray[source]

Convert the full Hessian to a matrix with only non-red. indices.

_get_mo_coeffs() Tuple[numpy.ndarray, numpy.ndarray | None][source]

Extracts molecular orbital coefficients.

_get_activate_space_integrals(mo_coeff_a: numpy.ndarray, mo_coeff_b: numpy.ndarray | None) Tuple[float, List, List][source]

Extracts activate space integrals in MO basis.

_get_full_space_integrals(mo_coeff_a: numpy.ndarray, mo_coeff_b: numpy.ndarray | None) Tuple[List, List][source]

Extracts full space one- and two-electron integrals in MO basis.