Source code for qiskit_nature.second_q.formats.watson_translator

# This code is part of a Qiskit project.
# (C) Copyright IBM 2022, 2023.
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""Translator methods for the Watson Hamiltonian."""

from __future__ import annotations

from collections import defaultdict

from qiskit_nature.second_q.hamiltonians import VibrationalEnergy
from qiskit_nature.second_q.problems import VibrationalStructureProblem, VibrationalBasis
from import OccupiedModals

from .watson import WatsonHamiltonian

[docs]def watson_to_problem( watson: WatsonHamiltonian, basis: VibrationalBasis, ) -> VibrationalStructureProblem: """Builds out a :class:`.VibrationalStructureProblem` from a :class:`.WatsonHamiltonian`. .. note:: In the process of constructing the :class:`.VibrationalStructureProblem`, the coefficients stored in the :class:`.WatsonHamiltonian` need to be mapped to a second-quantization basis. For more details about this, please refer to the documentation of :meth:``. Args: watson: the ``WatsonHamiltonian`` object from which to build the problem. basis: the ``VibrationalBasis`` into which to map the hamiltonian coefficients. Returns: A :class:`.VibrationalStructureProblem` instance. """ nbody: dict[tuple[int, ...], complex] = defaultdict(complex) for coefficient, modes in watson: for integral, modal_index in, modes): nbody[modal_index] += integral hamiltonian = VibrationalEnergy.from_raw_integrals(nbody) problem = VibrationalStructureProblem(hamiltonian) problem.basis = basis = OccupiedModals(basis.num_modals) return problem