"""
This module provides functions for creating a TreeAndValueMoveSelector object.
The TreeAndValueMoveSelector is a player that uses a tree-based approach to select moves in a game. It evaluates the
game tree using a node evaluator and selects moves based on a set of criteria defined by the node selector. The player
uses a stopping criterion to determine when to stop the search and a recommender rule to recommend a move after
exploration.
This module also provides functions for creating the necessary components of the TreeAndValueMoveSelector, such as the
node evaluator, node selector, tree factory, and tree manager.
"""
import queue
import random
from dataclasses import dataclass
from typing import Any, Literal
import chipiron.players.move_selector.treevalue.search_factory as search_factories
from chipiron.players.boardevaluators.neural_networks.input_converters.factory import (
RepresentationFactory,
)
from chipiron.players.boardevaluators.neural_networks.input_converters.representation_factory_factory import (
create_board_representation_factory,
)
from chipiron.players.boardevaluators.table_base.syzygy_table import SyzygyTable
from chipiron.players.move_selector.move_selector_types import MoveSelectorTypes
from chipiron.players.move_selector.treevalue import node_factory
from chipiron.players.move_selector.treevalue.progress_monitor.progress_monitor import (
AllStoppingCriterionArgs,
)
from chipiron.utils.dataclass import IsDataclass
from . import node_evaluator as node_eval
from . import node_selector as node_selector_m
from . import recommender_rule
from . import tree_manager as tree_man
from .indices.node_indices.index_types import IndexComputationType
from .tree_and_value_move_selector import TreeAndValueMoveSelector
from .trees.factory import MoveAndValueTreeFactory
[docs]@dataclass
class TreeAndValuePlayerArgs:
"""
Data class for the arguments of a TreeAndValueMoveSelector.
"""
type: Literal[MoveSelectorTypes.TreeAndValue] # for serialization
node_selector: node_selector_m.AllNodeSelectorArgs
opening_type: node_selector_m.OpeningType
board_evaluator: node_eval.AllNodeEvaluatorArgs
stopping_criterion: AllStoppingCriterionArgs
recommender_rule: recommender_rule.AllRecommendFunctionsArgs
index_computation: IndexComputationType | None = None
[docs]def create_tree_and_value_builders(
args: TreeAndValuePlayerArgs,
syzygy: SyzygyTable[Any] | None,
random_generator: random.Random,
queue_progress_player: queue.Queue[IsDataclass] | None,
) -> TreeAndValueMoveSelector:
"""
Create a TreeAndValueMoveSelector object with the given arguments.
Args:
args (TreeAndValuePlayerArgs): The arguments for creating the TreeAndValueMoveSelector.
syzygy (SyzygyTable | None): The SyzygyTable object for tablebase endgame evaluation.
random_generator (random.Random): The random number generator.
Returns:
TreeAndValueMoveSelector: The created TreeAndValueMoveSelector object.
"""
node_evaluator: node_eval.NodeEvaluator = node_eval.create_node_evaluator(
arg_board_evaluator=args.board_evaluator, syzygy=syzygy
)
# node_factory_name: str = args['node_factory_name'] if 'node_factory_name' in args else 'Base'
node_factory_name: str = "Base_with_algorithm_tree_node"
tree_node_factory: node_factory.Base[Any] = node_factory.create_node_factory(
node_factory_name=node_factory_name
)
board_representation_factory: RepresentationFactory[Any] | None
board_representation_factory = create_board_representation_factory(
internal_tensor_representation_type=args.board_evaluator.internal_representation_type
)
search_factory: search_factories.SearchFactoryP = search_factories.SearchFactory(
node_selector_args=args.node_selector,
opening_type=args.opening_type,
random_generator=random_generator,
index_computation=args.index_computation,
)
algorithm_node_factory: node_factory.AlgorithmNodeFactory
algorithm_node_factory = node_factory.AlgorithmNodeFactory(
tree_node_factory=tree_node_factory,
board_representation_factory=board_representation_factory,
exploration_index_data_create=search_factory.node_index_create,
)
tree_factory = MoveAndValueTreeFactory(
node_factory=algorithm_node_factory, node_evaluator=node_evaluator
)
tree_manager: tree_man.AlgorithmNodeTreeManager
tree_manager = tree_man.create_algorithm_node_tree_manager(
algorithm_node_factory=algorithm_node_factory,
node_evaluator=node_evaluator,
index_computation=args.index_computation,
index_updater=search_factory.create_node_index_updater(),
)
tree_move_selector: TreeAndValueMoveSelector = TreeAndValueMoveSelector(
tree_manager=tree_manager,
random_generator=random_generator,
tree_factory=tree_factory,
node_selector_create=search_factory.create_node_selector_factory(),
stopping_criterion_args=args.stopping_criterion,
recommend_move_after_exploration=args.recommender_rule,
queue_progress_player=queue_progress_player,
)
return tree_move_selector