Source code for alts.core.query.query_selector

#Version 1.1.1 conform as of 13.12.2024
"""
| *alts.core.query.query_selector*
"""
from __future__ import annotations
from typing import TYPE_CHECKING

from dataclasses import dataclass

from alts.core.subscriber import ProcessDataSubscriber, ResultDataSubscriber, StreamDataSubscriber
from alts.core.query.query_optimizer import QueryOptimizer
from alts.core.query.query_decider import QueryDecider
from alts.core.configuration import Required, init
from alts.core.experiment_module import ExperimentModule
from alts.core.data.constrains import QueryConstrained



if TYPE_CHECKING:
    from typing_extensions import Self #type: ignore
    from alts.core.configuration import Required
    from alts.core.subscribable import Subscribable

[docs] @dataclass class QuerySelector(ExperimentModule, QueryConstrained): """ QuerySelector(query_optimizer, query_decider) | **Description** | The QuerySelector chooses which queries are going to be asked results for next. | It does so with the help of the QueryOptimizer and the QueryDecider. :param query_optimizer: Chooses the most informative queries to be asked next :type query_optimizer: QueryOptimizer :param query_decider: Decided if the chosen queries are informative enough to be asked :type query_decider: QueryDecider """ query_optimizer: QueryOptimizer = init() query_decider: QueryDecider = init()
[docs] def post_init(self): """ post_init(self) -> None | **Description** | Initializes ``query_optimizer`` and ``query_Decider`` with its experiment modules. """ super().post_init() self.query_optimizer = self.query_optimizer(exp_modules = self.exp_modules) self.query_decider = self.query_decider(exp_modules = self.exp_modules)
[docs] def decide(self): """ decide(self) -> None | **Description** | 1. Chooses the best queries with the optimizer | 2. Decides if chosen queries are worth the effort | 3. If they are worth it, forwards the chosen queries to the oracle """ query_candidates, scores = self.query_optimizer.select() query_flag, queries = self.query_decider.decide(query_candidates, scores) if query_flag: self.oracles.add(queries)
[docs] class ResultQuerySelector(QuerySelector, ResultDataSubscriber): """ ResultQuerySelector(query_optimizer, query_decider) | **Description** | Has additional access to a result data pool foor decision making. :param query_optimizer: Chooses the most informative queries to be asked next :type query_optimizer: QueryOptimizer :param query_decider: Decided if the chosen queries are informative enough to be asked :type query_decider: QueryDecider """
[docs] def result_update(self, subscription: Subscribable): super().result_update(subscription) self.decide()
[docs] class StreamQuerySelector(QuerySelector, StreamDataSubscriber): """ StreamQuerySelector(query_optimizer, query_decider) | **Description** | Has additional access to a stream for decision making. :param query_optimizer: Chooses the most informative queries to be asked next :type query_optimizer: QueryOptimizer :param query_decider: Decided if the chosen queries are informative enough to be asked :type query_decider: QueryDecider """
[docs] def stream_update(self, subscription: Subscribable): super().stream_update(subscription) self.decide()
[docs] class ProcessQuerySelector(QuerySelector, ProcessDataSubscriber): """ ProcessQuerySelector(query_optimizer, query_decider) | **Description** | Has additional access to a process for decision making. :param query_optimizer: Chooses the most informative queries to be asked next :type query_optimizer: QueryOptimizer :param query_decider: Decided if the chosen queries are informative enough to be asked :type query_decider: QueryDecider """
[docs] def process_update(self, subscription: Subscribable): super().process_update(subscription) self.decide()