qc2.algorithms.utils.orbital_optimization ========================================= .. py:module:: qc2.algorithms.utils.orbital_optimization .. autoapi-nested-parse:: This module defines the orbital optimization class used in oo-VQE. Attributes ---------- .. autoapisummary:: qc2.algorithms.utils.orbital_optimization.PennyLaneOperatorType Classes ------- .. autoapisummary:: qc2.algorithms.utils.orbital_optimization.OrbitalOptimization Module Contents --------------- .. py:data:: PennyLaneOperatorType .. py:class:: 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') 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. .. attribute:: qc2data An instance of :class:`~qc2.data.data.qc2Data`. :type: qc2Data .. attribute:: schema_dataclass An instance of :class:`QCSchema`. :type: QCSchema .. attribute:: es_problem Instance of :class:`ElectronicStructureProblem` in AO basis as processed from :meth:`~qc2.data.data.qc2Data.process_schema`. :type: ElectronicStructureProblem .. attribute:: n_electrons Number of alpha and beta electrons. :type: Tuple[int, int] .. attribute:: nao Number of spatial orbitals. :type: int .. attribute:: n_active_orbitals Number of active orbitals to consider. :type: int .. attribute:: n_active_electrons Number of active electrons. :type: Tuple[int, int] .. attribute:: freeze_active Determines if the active orbitals are frozen in the optimization process. :type: bool, optional .. attribute:: occ_idx Indices of occupied molecular orbitals. :type: list .. attribute:: act_idx Indices of active molecular orbitals. :type: list .. attribute:: virt_idx Indices of virtual molecular orbitals. :type: list .. attribute:: params_idx Indices for non-redundant orbital rotations. :type: list .. attribute:: n_kappa Dimension of the kappa vector for orbital rotations. :type: int .. attribute:: mapper The fermionic-to-qubit mapping algorithm. :type: QubitMapper .. py:attribute:: qc2data .. py:attribute:: schema_dataclass .. py:attribute:: es_problem .. py:attribute:: n_electrons .. py:attribute:: nao .. py:attribute:: n_active_orbitals .. py:attribute:: n_active_electrons .. py:attribute:: freeze_active .. py:attribute:: params_idx .. py:attribute:: n_kappa .. py:attribute:: mapper .. py:attribute:: format .. py:method:: orbital_optimization(rdm1: numpy.ndarray, rdm2: numpy.ndarray, kappa_init: Optional[List] = None) -> Tuple[List, float] Optimize orbital parameters. :param rdm1: One-electron reduced density matrix. :type rdm1: np.array :param rdm2: Two-electron reduced density matrix. :type rdm2: np.array :param kappa_init: Initial orbital rotation parameters vector. If None, set guess as a zero vector. :type kappa_init: List, optional :returns: Optimized orbital rotation parameters and associated energy. :rtype: 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 ... ) .. py:method:: get_analytic_hessian(kappa: List, rdm1: numpy.ndarray, rdm2: numpy.ndarray) -> numpy.ndarray Calculate the analytic hessian for orbital optimization. This method calculates the second derivative of the energy with respect to orbital rotation parameters. :param kappa: Orbital rotation parameters vector. :type kappa: List :param rdm1: One-electron reduced density matrix. :type rdm1: np.array :param rdm2: Two-electron reduced density matrix. :type rdm2: np.array :returns: A (n_kappa, n_kappa) matrix containing analytic hessian. :rtype: np.array .. rubric:: 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 .. py:method:: get_analytic_gradients(kappa: List, rdm1: numpy.ndarray, rdm2: numpy.ndarray) -> numpy.ndarray Calculates analytic gradients for orbital optimization. This method calculates the first derivative of the energy with respect to orbital rotation parameters. :param kappa: Orbital rotation parameters vector. :type kappa: List :param rdm1: One-electron reduced density matrix. :type rdm1: np.array :param rdm2: Two-electron reduced density matrix. :type rdm2: np.array :returns: A vector of len(kappa) containing analytic gradients. :rtype: np.array .. rubric:: Notes Based on the method outlined in: [4]. https://doi.org/10.1063/1.441359 .. py:method:: get_fock_matrix(one_electron_integrals: numpy.array, two_electron_integrals: numpy.array, rdm1: numpy.array, rdm2: numpy.array) -> numpy.ndarray Constructs the Fock matrix for orbital optimization. :param one_electron_integrals: One-electron integrals. :type one_electron_integrals: np.array :param two_electron_integrals: Two-electron integrals. :type two_electron_integrals: np.array :param rdm1: One-electron reduced density matrix. :type rdm1: np.array :param rdm2: Two-electron reduced density matrix. :type rdm2: np.array :returns: The Fock matrix. :rtype: np.array .. rubric:: Notes Based on the method outlined in: [4]. https://doi.org/10.1063/1.441359 .. py:method:: get_energy_from_kappa(kappa: List, rdm1: numpy.ndarray, rdm2: numpy.ndarray) -> float Gets total energy after transforming the MOs with kappa. :param kappa: Orbital rotation parameters vector. :type kappa: List :param rdm1: One-electron reduced density matrix. :type rdm1: np.array :param rdm2: Two-electron reduced density matrix. :type rdm2: np.array :returns: Total ground-state energy. :rtype: float .. py:method:: get_energy_from_mo_coeffs(mo_coeff_a: numpy.ndarray, mo_coeff_b: Optional[numpy.ndarray], rdm1: numpy.ndarray, rdm2: numpy.ndarray) -> float Get energy given one- and two-particle reduced density matrices. :param mo_coeff_a: Alpha MO coefficients vector. :type mo_coeff_a: np.array :param mo_coeff_b: Beta MO coefficients vector. :type mo_coeff_b: np.array, optional :param rdm1: One-electron reduced density matrix. :type rdm1: np.array :param rdm2: Two-electron reduced density matrix. :type rdm2: np.array :returns: Total ground-state energy. :rtype: float .. py:method:: get_transformed_qubit_hamiltonian(kappa: List) -> Tuple[float, Union[qiskit.quantum_info.SparsePauliOp, PennyLaneOperatorType]] Sets up the qubit Hamiltonian in the transformed MO basis. :param kappa: Orbital rotation parameters vector. :type kappa: List :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 :class:`SparsePauliOp` representing the tranformed qubit Hamiltonian in the qiskit format. If the format is ``pennylane``, it returns a :class:`Operator` instance representing the qubit Hamiltonian in the PennyLane format. :rtype: Tuple[float, SparsePauliOp] .. py:method:: get_transformed_mos(kappa: List) -> Tuple[numpy.ndarray, numpy.ndarray] Transforms MO coefficients with orbital rotation parameters. :param kappa: Orbital rotation parameters vector. :type kappa: List :returns: A tuple containing the transformed MO coefficients. :rtype: Tuple[np.ndarray, np.ndarray] .. py:method:: _get_rotation_matrix(kappa: List) -> numpy.ndarray Creates rotation matrix from kappa parameters. .. py:method:: _kappa_vector_to_matrix(kappa: List) -> numpy.ndarray Generates skew-symm. matrix from orbital rotation parameters. .. py:method:: _kappa_matrix_to_vector(kappa_matrix: numpy.ndarray) -> numpy.ndarray Generate orbital rotation parameters from a skew-symmetric matrix .. py:method:: _full_hessian_to_matrix(full_hess: numpy.ndarray) -> numpy.ndarray Convert the full Hessian to a matrix with only non-red. indices. .. py:method:: _get_mo_coeffs() -> Tuple[numpy.ndarray, Optional[numpy.ndarray]] Extracts molecular orbital coefficients. .. py:method:: _get_activate_space_integrals(mo_coeff_a: numpy.ndarray, mo_coeff_b: Optional[numpy.ndarray]) -> Tuple[float, List, List] Extracts activate space integrals in MO basis. .. py:method:: _get_full_space_integrals(mo_coeff_a: numpy.ndarray, mo_coeff_b: Optional[numpy.ndarray]) -> Tuple[List, List] Extracts full space one- and two-electron integrals in MO basis.