Skip to content

Canonicalization

oqd_core.compiler.atomic

canonicalize

UnrollLevelLabel

Bases: RewriteRule

Unrolls the Level labels present in Transitions.

Source code in oqd-core/src/oqd_core/compiler/atomic/canonicalize.py
class UnrollLevelLabel(RewriteRule):
    """
    Unrolls the [`Level`][oqd_core.interface.atomic.system.Level] labels present in [`Transitions`][oqd_core.interface.atomic.system.Transition].
    """

    def map_Ion(self, model):
        self.ion_levels = {level.label: level for level in model.levels}

    def map_Transition(self, model):
        if isinstance(model.level1, Level) and isinstance(model.level2, Level):
            return

        level1 = (
            self.ion_levels[model.level1]
            if isinstance(model.level1, str)
            else model.level1
        )
        level2 = (
            self.ion_levels[model.level2]
            if isinstance(model.level2, str)
            else model.level2
        )
        return model.__class__(
            label=model.label,
            level1=level1,
            level2=level2,
            einsteinA=model.einsteinA,
            multipole=model.multipole,
        )

UnrollTransitionLabel

Bases: RewriteRule

Unrolls the Transition labels present in Beams.

Source code in oqd-core/src/oqd_core/compiler/atomic/canonicalize.py
class UnrollTransitionLabel(RewriteRule):
    """
    Unrolls the [`Transition`][oqd_core.interface.atomic.system.Transition] labels present in [`Beams`][oqd_core.interface.atomic.protocol.Beam].
    """

    def map_System(self, model):
        self.ions_transitions = [
            {transition.label: transition for transition in ion.transitions}
            for ion in model.ions
        ]

    def map_Beam(self, model):
        if isinstance(model.transition, Transition):
            return

        if isinstance(model.transition, str):
            transition_label = model.transition
            reference_ion = model.target
        else:
            transition_label = model.transition[0]
            reference_ion = model.transition[1]

        transition = self.ions_transitions[reference_ion][transition_label]
        return model.__class__(
            transition=transition,
            rabi=model.rabi,
            detuning=model.detuning,
            phase=model.phase,
            polarization=model.polarization,
            wavevector=model.wavevector,
            target=model.target,
        )