Source code for jinete.models.services

"""
Contains entities to represent services in the data model.
"""

from __future__ import (
    annotations,
)

import logging
from typing import (
    TYPE_CHECKING,
)

from .abc import (
    Model,
)
from .constants import (
    MAX_FLOAT,
)

if TYPE_CHECKING:
    from typing import (
        Dict,
        Any,
        Generator,
        Tuple,
    )
    from .positions import Position

logger = logging.getLogger(__name__)


[docs]class Service(Model): """ Represents the requested action to visit a specific position, having some time restrictions and costs. """ __slots__ = ( "position", "earliest", "latest", "duration", ) position: Position """ The position of the service. """ earliest: float """ The earliest time to start the service. """ latest: float """ The latest time to start the service. """ duration: float """ The duration to perform the service. Commonly known as the ``load_time`` in another contexts. """
[docs] def __init__(self, position: Position, earliest: float = 0.0, latest: float = MAX_FLOAT, duration: float = 0.0): """ The constructor of the class. :param position: The geometric position in which the service should be performed. :param earliest: The earliest time to be able to perform the service. :param latest: The latest time to be able to perform the service. :param duration: The requested time to perform the service. """ self.position = position self.earliest = earliest self.latest = latest self.duration = duration
def __deepcopy__(self, memo: Dict[int, Any]) -> Service: return self def __eq__(self, other: Service) -> bool: return hash(self) == hash(other) def __hash__(self): return hash(tuple(self)) def __iter__(self) -> Generator[Tuple[str, Any], None, None]: yield from ( ("position", self.position), ("earliest", self.earliest), ("latest", self.latest), ("duration", self.duration), )
[docs] def distance_to(self, other: Service) -> float: """ Computes the distance from ``self`` to ``other``. :param other: Service to compute the distance from ``self``. :return: distance between ``self`` and ``other``. """ return self.position.distance_to(other.position)
[docs] def time_to(self, other: Service, *args, **kwargs) -> float: """ Computes the time from ``self`` to ``other``. :param other: Service to compute the time from ``self``. :return: time between ``self`` and ``other``. """ return self.position.time_to(other.position, *args, **kwargs)