Source code for qiskit_nature.second_q.problems.vibrational_structure_result

# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2020, 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 http://www.apache.org/licenses/LICENSE-2.0.
#
# 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.

"""The vibrational structure result."""

from typing import List, Optional

import numpy as np

from qiskit_algorithms import AlgorithmResult
from .eigenstate_result import EigenstateResult


[docs]class VibrationalStructureResult(EigenstateResult): """The vibrational structure result.""" def __init__(self) -> None: super().__init__() self._algorithm_result: Optional[AlgorithmResult] = None self._computed_vibrational_energies: Optional[np.ndarray] = None self._num_occupied_modals_per_mode: Optional[List[List[float]]] = None @property def algorithm_result(self) -> Optional[AlgorithmResult]: """Returns raw algorithm result""" return self._algorithm_result @algorithm_result.setter def algorithm_result(self, value: AlgorithmResult) -> None: """Sets raw algorithm result""" self._algorithm_result = value # TODO we need to be able to extract the statevector or the optimal parameters that can # construct the circuit of the GS from here (if the algorithm supports this) @property def computed_vibrational_energies(self) -> Optional[np.ndarray]: """Returns computed electronic part of ground state energy""" return self._computed_vibrational_energies @computed_vibrational_energies.setter def computed_vibrational_energies(self, value: np.ndarray) -> None: """Sets computed electronic part of ground state energy""" self._computed_vibrational_energies = value @property def num_occupied_modals_per_mode(self) -> Optional[List[List[float]]]: """Returns the number of occupied modal per mode""" return self._num_occupied_modals_per_mode @num_occupied_modals_per_mode.setter def num_occupied_modals_per_mode(self, value: List[List[float]]) -> None: """Sets measured number of modes""" self._num_occupied_modals_per_mode = value def __str__(self) -> str: """Printable formatted result""" return "\n".join(self.formatted())
[docs] def formatted(self) -> List[str]: """Formatted result as a list of strings""" lines = [] lines.append("=== GROUND STATE ===") lines.append(" ") lines.append( "* Vibrational ground state energy " f"(cm^-1): {np.round(self.computed_vibrational_energies[0], self.formatting_precision)}" ) if len(self.num_occupied_modals_per_mode) > 0: lines.append("The number of occupied modals for each mode is: ") for i, m in enumerate(self.num_occupied_modals_per_mode[0]): lines.append(f"- Mode {i}: {np.round(m, self.formatting_precision)}") if ( self.computed_vibrational_energies is not None and len(self.computed_vibrational_energies) > 1 ): lines.append(" ") lines.append("=== EXCITED STATES ===") lines.append(" ") for idx, vib_energy in enumerate(self.computed_vibrational_energies[1:]): lines.append( f"* {(idx + 1): 3d}: Vibrational excited state energy " f"(cm^-1): {np.round(vib_energy, self.formatting_precision)}" ) if idx < len(self.num_occupied_modals_per_mode): lines.append("The number of occupied modals for each mode is") for i, m in enumerate(self.num_occupied_modals_per_mode[idx]): lines.append(f"- Mode {i}: {np.round(m, self.formatting_precision)}") lines.append(" ") return lines