qc2.algorithms.utils.orbital_optimization
This module defines the orbital optimization class used in oo-VQE.
Attributes
Classes
A class to perform orbital optimization for quantum chemical systems. |
Module Contents
- 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.
- es_problem[source]
Instance of
ElectronicStructureProblemin AO basis as processed fromprocess_schema().- Type:
ElectronicStructureProblem
- freeze_active[source]
Determines if the active orbitals are frozen in the optimization process.
- Type:
bool, optional
- 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:
- 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:
- 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 aSparsePauliOprepresenting the tranformed qubit Hamiltonian in the qiskit format. If the format ispennylane, it returns aOperatorinstance 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.