Skip to content

mis.pipeline.embedder

[docs] module mis.pipeline.embedder

"""
Tools to prepare the geometry (register) of atoms.
"""

from __future__ import annotations

from abc import ABC, abstractmethod

import pulser

from mis.shared.types import (
    MISInstance,
)
from mis.pipeline.config import SolverConfig

from .targets import Register
from .layout import Layout


class BaseEmbedder(ABC):
    """
    Abstract base class for all embedders.

    Prepares the geometry (register) of atoms based on the MISinstance.
    Returns a Register compatible with Pasqal/Pulser devices.
    """

    @abstractmethod
    def embed(self, instance: MISInstance, config: SolverConfig) -> Register:
        """
        Creates a layout of atoms as the register.

        Returns:
            Register: The register.
        """
        pass


class DefaultEmbedder(BaseEmbedder):
    """
    A simple embedder
    """

    def embed(self, instance: MISInstance, config: SolverConfig) -> Register:
        device = config.device
        assert device is not None

        # Use Layout helper to get rescaled coordinates and interaction graph
        layout = Layout.from_device(data=instance, device=device)

        # Finally, prepare register.
        reg = pulser.register.Register(
            qubits={f"q{node}": pos for (node, pos) in layout.coords.items()}
        )
        return Register(device=device, register=reg, graph=instance.graph)