Source code for alts.core.oracle.query_queue

#Version 1.1.1 conform as of 29.11.2024
"""
| *alts.core.oracle.query_queue*
| :doc:`Built-In Implementations </modules/oracle/query_queue>`
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import TYPE_CHECKING

import numpy as np

from alts.core.configuration import Configurable, Required, is_set, pre_init, post_init, init
from alts.core.data.constrains import QueryConstrained
from alts.core.subscribable import DelayedPublisher

if TYPE_CHECKING:
    from typing_extensions import Self
    from nptyping import NDArray, Shape, Number
    from typing import  Tuple
    from alts.core.data.constrains import QueryConstrainedGetter, QueryConstrain

[docs] @dataclass class QueryQueue(DelayedPublisher, QueryConstrained): """ QueryQueue() | **Description** | A buffer for queries in shape of a query. """ queries: NDArray[Shape["query_nr, ... query_shape"], Number] = post_init() # type: ignore _query_constrain: QueryConstrainedGetter = post_init() _latest_add: NDArray[Shape[" ... query_shape"], Number] = post_init() # type: ignore _latest_pop: NDArray[Shape[" ... query_shape"], Number] = post_init() # type: ignore
[docs] def post_init(self): """ post_init(self) -> None | **Description** | Initialites an empty query queue. """ super().post_init() self.queries = np.empty((0, *self.query_constrain().shape))
[docs] def add(self, queries: NDArray[Shape["query_nr, ... query_shape"], Number]): # type: ignore """ add(self, queries) -> None | **Description** | Adds the queries to the queue. :param queries: The queries to be added to the queue :type queries: `NDArray <https://numpy.org/doc/stable/reference/arrays.ndarray.html>`_ """ self.queries = np.concatenate((self.queries, queries)) self._latest_add = queries[-1:] self.request_update()
[docs] def pop(self, query_nr = 1) -> NDArray[Shape["query_nr, ... query_shape"], Number]: # type: ignore """ pop(self, query_nr) -> queries | **Description** | Pops all queries up to the given query_nr. :param query_nr: How many queries to pop (default = 1). :type query_nr: int :return: Array of popped queries :rtype: `NDArray <https://numpy.org/doc/stable/reference/arrays.ndarray.html>`_ """ poped = self.queries[:query_nr,...] self.queries = self.queries[query_nr:,...] self._latest_pop = poped return poped
@property def last(self)-> NDArray[Shape["1, ... query_shape"], Number]: # type: ignore """ last(self) -> query | **Description** | Returns the last query of the queue. :return: Last queue query :rtype: `NDArray <https://numpy.org/doc/stable/reference/arrays.ndarray.html>`_ """ return self.queries[-1:,...] @property def first(self)-> NDArray[Shape["1, ... query_shape"], Number]: # type: ignore """ first(self) -> query | **Description** | Returns the first query of the queue. :return: First queue query :rtype: `NDArray <https://numpy.org/doc/stable/reference/arrays.ndarray.html>`_ """ return self.queries[:1,...] @property def latest_add(self)-> NDArray[Shape["1, ... query_shape"], Number]: # type: ignore """ latest_add(self) -> query | **Description** | Returns the last added query. :return: Last added query :rtype: `NDArray <https://numpy.org/doc/stable/reference/arrays.ndarray.html>`_ """ return self._latest_add @property def latest_pop(self)-> NDArray[Shape["1, ... query_shape"], Number]: # type: ignore """ latest_pop(self) -> query | **Description** | Returns the last popped query. :return: Last popped query :rtype: `NDArray <https://numpy.org/doc/stable/reference/arrays.ndarray.html>`_ """ return self._latest_pop @property def empty(self): """ empty(self) -> None | **Description** | Returns ``True`` only if the queue is empty. :return: Is the queue empty? :rtype: bool """ return self.queries.shape[0] == 0 @property def count(self) -> int: """ count(self) -> int | **Description** | Returns the size of the queue. :return: Size of queue :rtype: int """ return self.queries.shape[0]
[docs] def query_constrain(self) -> QueryConstrain: """ query_constrain(self) -> QueryConstrain | **Description** | Returns its query constrains. :return: Own query constrains :rtype: :doc:`QueryConstrain </core/data/constrains>` """ return self._query_constrain()
def __call__(self, query_constrain: Required[QueryConstrainedGetter], **kwargs) -> Self: """ __call__(self, query_constrain, **kwargs) -> Self | **Description** | Returns a QueryQueue with the given query constraint. :param query_constrain: Constrains of the queries the queue holds. :type query_constrains: :doc:`QueryConstrain </core/data/constrains>` :return: Configured QueryQueue :rtype: QueryQueue """ obj = super().__call__(**kwargs) obj._query_constrain = is_set(query_constrain) return obj