Source code for chipiron.players.move_selector.factory

"""
This module provides a factory function for creating the main move selector based on the given arguments.
"""

import queue
import random
from typing import Any, TypeAlias

from chipiron.players.boardevaluators.table_base.syzygy_table import SyzygyTable
from chipiron.utils.logger import chipiron_logger

from ...utils.dataclass import IsDataclass
from . import human, move_selector, stockfish, treevalue
from .random import Random, create_random

AllMoveSelectorArgs: TypeAlias = (
    treevalue.TreeAndValuePlayerArgs
    | human.CommandLineHumanPlayerArgs
    | human.GuiHumanPlayerArgs
    | Random
    | stockfish.StockfishPlayer
)


[docs]def create_main_move_selector( move_selector_instance_or_args: AllMoveSelectorArgs, syzygy: SyzygyTable[Any] | None, random_generator: random.Random, queue_progress_player: queue.Queue[IsDataclass] | None, ) -> move_selector.MoveSelector: """ Create the main move selector based on the given arguments. Args: move_selector_instance_or_args (AllMoveSelectorArgs): The arguments or instance of the move selector. syzygy (SyzygyTable | None): The syzygy table. random_generator (random.Random): The random number generator. Returns: move_selector.MoveSelector: The main move selector. Raises: ValueError: If the given move selector instance or arguments are invalid. """ main_move_selector: move_selector.MoveSelector chipiron_logger.info("Create main move selector") match move_selector_instance_or_args: case Random(): main_move_selector = create_random(random_generator=random_generator) case treevalue.TreeAndValuePlayerArgs(): tree_args: treevalue.TreeAndValuePlayerArgs = move_selector_instance_or_args main_move_selector = treevalue.create_tree_and_value_builders( args=tree_args, syzygy=syzygy, random_generator=random_generator, queue_progress_player=queue_progress_player, ) case stockfish.StockfishPlayer(): main_move_selector = move_selector_instance_or_args case human.CommandLineHumanPlayerArgs(): main_move_selector = human.CommandLineHumanMoveSelector() case other: raise ValueError( f"player creator: can not find {other} of type {type(other)}" ) return main_move_selector