Skip to content

Analysis

oqd_trical.light_matter.compiler.analysis

HilbertSpace

Bases: TypeReflectBaseModel

Represents a Hilbert space.

Attributes:

Name Type Description
hilbert_space Dict[str, Optional[Set[int]]]

Hilbert space for the AtomicEmulatorCircuit

size Dict[str, int]

Hilbert space for the AtomicEmulatorCircuit

Source code in src\oqd_trical\light_matter\compiler\analysis.py
class HilbertSpace(TypeReflectBaseModel):
    """
    Represents a Hilbert space.

    Attributes:
        hilbert_space (Dict[str, Optional[Set[int]]]): Hilbert space for the AtomicEmulatorCircuit
        size (Dict[str, int]): Hilbert space for the AtomicEmulatorCircuit
    """

    model_config = ConfigDict(frozen=True)
    hilbert_space: Dict[str, Optional[Set[int]]]

    @property
    def size(self):
        return {
            k: len(v) if isinstance(v, set) else 0
            for k, v in self.hilbert_space.items()
        }

    def get_relabel_rules(self):
        """
        Retrieves a relabeling scheme for the Hilbert space.
        """
        relabel_rules = {}
        for k, v in self.hilbert_space.items():
            if k[0] == "E":
                relabel_rules[k] = {i: n for n, i in enumerate(v)}
        return relabel_rules

get_relabel_rules()

Retrieves a relabeling scheme for the Hilbert space.

Source code in src\oqd_trical\light_matter\compiler\analysis.py
def get_relabel_rules(self):
    """
    Retrieves a relabeling scheme for the Hilbert space.
    """
    relabel_rules = {}
    for k, v in self.hilbert_space.items():
        if k[0] == "E":
            relabel_rules[k] = {i: n for n, i in enumerate(v)}
    return relabel_rules

GetHilbertSpace

Bases: RewriteRule

Retrieves the Hilbert space for an AtomicEmulatorCircuit.

Attributes:

Name Type Description
hilbert_space HilbertSpace

Hilbert space for the AtomicEmulatorCircuit

Source code in src\oqd_trical\light_matter\compiler\analysis.py
class GetHilbertSpace(RewriteRule):
    """
    Retrieves the Hilbert space for an AtomicEmulatorCircuit.

    Attributes:
        hilbert_space (HilbertSpace): Hilbert space for the AtomicEmulatorCircuit
    """

    def __init__(self):
        self._hilbert_space = {}

    @property
    def hilbert_space(self):
        hilbert_space = {}
        for k, v in self._hilbert_space.items():
            if k[0] == "E" and v is None:
                hilbert_space[k] = {0}
            else:
                hilbert_space[k] = v
        return HilbertSpace(hilbert_space=hilbert_space)

    def map_System(self, model):
        for n, ion in enumerate(model.ions):
            self._hilbert_space[f"E{n}"] = set(range(len(ion.levels)))

        for m, mode in enumerate(model.modes):
            self._hilbert_space[f"P{m}"] = None

    def map_KetBra(self, model):
        if (
            model.subsystem not in self._hilbert_space.keys()
            or self._hilbert_space[model.subsystem] is None
        ):
            self._hilbert_space[model.subsystem] = set()

        self._hilbert_space[model.subsystem].update((model.ket, model.bra))

    def map_Annihilation(self, model):
        if model.subsystem in self._hilbert_space.keys():
            return

        self._hilbert_space[model.subsystem] = None

    def map_Creation(self, model):
        if model.subsystem in self._hilbert_space.keys():
            return

        self._hilbert_space[model.subsystem] = None

    def map_Displacement(self, model):
        if model.subsystem in self._hilbert_space.keys():
            return

        self._hilbert_space[model.subsystem] = None

    def map_Identity(self, model):
        if model.subsystem in self._hilbert_space.keys():
            return

        self._hilbert_space[model.subsystem] = None