Source code for qdk_chemistry.data.time_evolution.controlled_time_evolution

"""QDK/Chemistry controlled time evolution module."""

# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See LICENSE.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

from typing import Any

import h5py

from qdk_chemistry.data.base import DataClass

from .base import TimeEvolutionUnitary

__all__: list[str] = ["ControlledTimeEvolutionUnitary"]


[docs] class ControlledTimeEvolutionUnitary(DataClass): """Data class for a controlled time evolution unitary.""" # Class attribute for filename validation _data_type_name = "controlled_time_evolution_unitary" # Serialization version for this class _serialization_version = "0.1.0"
[docs] def __init__(self, time_evolution_unitary: TimeEvolutionUnitary, control_indices: list[int]): """Initialize a ControlledTimeEvolutionUnitary. Args: time_evolution_unitary: The time evolution unitary to be controlled. control_indices: The control qubit indices. """ self.time_evolution_unitary = time_evolution_unitary self.control_indices = control_indices super().__init__()
[docs] def get_unitary_container_type(self) -> str: """Get the type of the time evolution unitary container. Returns: The type of the time evolution unitary container. """ return self.time_evolution_unitary.get_container_type()
[docs] def get_num_total_qubits(self) -> int: """Get the total number of qubits including control qubits. Returns: The total number of qubits (time evolution qubits + control qubits). """ return self.time_evolution_unitary.get_num_qubits() + len(self.control_indices)
[docs] def to_json(self) -> dict[str, Any]: """Convert the ControlledTimeEvolutionUnitary to a dictionary for JSON serialization. Returns: dict: Dictionary representation of the ControlledTimeEvolutionUnitary """ data: dict[str, Any] = {} data["time_evolution_unitary"] = self.time_evolution_unitary.to_json() data["control_indices"] = self.control_indices return self._add_json_version(data)
[docs] def to_hdf5(self, group: h5py.Group) -> None: """Save the ControlledTimeEvolutionUnitary to an HDF5 group. Args: group: HDF5 group or file to write the controlled time evolution unitary to """ self._add_hdf5_version(group) # Write simple attributes group.attrs["control_indices"] = self.control_indices # Create subgroup for the nested object teu_group = group.create_group("time_evolution_unitary") self.time_evolution_unitary.to_hdf5(teu_group)
[docs] @classmethod def from_json(cls, json_data: dict[str, Any]) -> "ControlledTimeEvolutionUnitary": """Create ControlledTimeEvolutionUnitary from a JSON dictionary. Args: json_data: Dictionary containing the serialized data Returns: ControlledTimeEvolutionUnitary """ time_evolution_unitary = TimeEvolutionUnitary.from_json(json_data["time_evolution_unitary"]) control_indices = json_data["control_indices"] return cls( time_evolution_unitary=time_evolution_unitary, control_indices=control_indices, )
[docs] @classmethod def from_hdf5(cls, group: h5py.Group) -> "ControlledTimeEvolutionUnitary": """Load a ControlledTimeEvolutionUnitary from an HDF5 group. Args: group: The HDF5 group containing the serialized object. Returns: ControlledTimeEvolutionUnitary """ # Verify version cls._validate_hdf5_version(cls._serialization_version, group) # Load simple attributes control_indices = list(group.attrs["control_indices"]) # Load nested TimeEvolutionUnitary teu_group = group["time_evolution_unitary"] time_evolution_unitary = TimeEvolutionUnitary.from_hdf5(teu_group) return cls( time_evolution_unitary=time_evolution_unitary, control_indices=control_indices, )
[docs] def get_summary(self) -> str: """Get summary of controlled time evolution unitary. Returns: str: Summary string describing the ControlledTimeEvolutionUnitary's contents and properties """ line = "Controlled Time Evolution Unitary:\n" line += f" Control Indices: {self.control_indices}\n" line += " Time Evolution Unitary Summary:\n" teu_summary = self.time_evolution_unitary.get_summary() teu_summary_indented = "\n".join(" " + summary_line for summary_line in teu_summary.splitlines()) line += teu_summary_indented return line