Source code for chipiron.players.move_selector.treevalue.updates.value_block

"""
This module defines the ValueUpdateInstructionsBlock class and a helper function to create instances of it.

The ValueUpdateInstructionsBlock class represents a block of update instructions for a tree value node in
 a move selector algorithm. It contains sets of moves that have been updated with new values,
  best moves, or are newly over.

The create_value_update_instructions_block function is a helper function that creates an instance of
 the ValueUpdateInstructionsBlock class with the specified update instructions.

"""

from dataclasses import dataclass, field
from typing import Self

from chipiron.environments.chess_env.move.imove import moveKey
from chipiron.players.move_selector.treevalue.nodes.algorithm_node.algorithm_node import (
    AlgorithmNode,
)


[docs]@dataclass(slots=True) class ValueUpdateInstructionsFromOneNode: node_sending_update: AlgorithmNode is_node_newly_over: bool new_value_for_node: bool new_best_move_for_node: bool
[docs]@dataclass(slots=True) class ValueUpdateInstructionsTowardsOneParentNode: """ Represents a block of value-update instructions intended to a specific node in the algorithm tree. Attributes: moves_with_updated_over (Set[AlgorithmNode]): Set of moves with updated 'over' value. moves_with_updated_value (Set[AlgorithmNode]): Set of moves with updated 'value' value. moves_with_updated_best_move (Set[AlgorithmNode]): Set of moves with updated 'best_move' value. """ moves_with_updated_over: set[moveKey] = field(default_factory=set) moves_with_updated_value: set[moveKey] = field(default_factory=set) moves_with_updated_best_move: set[moveKey] = field(default_factory=set)
[docs] def add_update_from_one_child_node( self, update_from_one_child_node: ValueUpdateInstructionsFromOneNode, move_from_parent_to_child: moveKey, ) -> None: if update_from_one_child_node.is_node_newly_over: self.moves_with_updated_over.add(move_from_parent_to_child) if update_from_one_child_node.new_value_for_node: self.moves_with_updated_value.add(move_from_parent_to_child) if update_from_one_child_node.new_best_move_for_node: self.moves_with_updated_best_move.add(move_from_parent_to_child)
[docs] def add_update_toward_one_parent_node(self, another_update: Self) -> None: self.moves_with_updated_value = ( self.moves_with_updated_value | another_update.moves_with_updated_over ) self.moves_with_updated_over = ( self.moves_with_updated_over | another_update.moves_with_updated_over ) self.moves_with_updated_best_move = ( self.moves_with_updated_best_move | another_update.moves_with_updated_best_move )
[docs] def print_info(self) -> None: """ Print information about the update instructions block. Returns: None """ print("upInstructions printing") print(len(self.moves_with_updated_value), "moves_with_updated_value", end=" ") for move in self.moves_with_updated_value: print(move, end=" ") print( "\n", len(self.moves_with_updated_best_move), "moves_with_updated_best_move:", end=" ", ) for move in self.moves_with_updated_best_move: print(move, end=" ") print( "\n", len(self.moves_with_updated_over), "moves_with_updated_over", end=" " ) for move in self.moves_with_updated_over: print(move, end=" ") print()
[docs] def empty(self) -> bool: """ Check if all the components of the update instructions block are empty. Returns: bool: True if all components are empty, False otherwise. """ empty_bool = ( not bool(self.moves_with_updated_value) and not bool(self.moves_with_updated_best_move) and not bool(self.moves_with_updated_over) ) return empty_bool