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

"""
This module contains the IndexUpdater class, which is responsible for updating the indices of AlgorithmNode objects in a tree structure.
"""

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

from .index_block import (
    IndexUpdateInstructionsFromOneNode,
    IndexUpdateInstructionsTowardsOneParentNode,
)
from .updates_file import UpdateInstructionsTowardsOneParentNode


[docs]class IndexUpdater: """ The IndexUpdater class is responsible for updating the indices of AlgorithmNode objects in a tree structure. """ def __init__(self) -> None: pass
[docs] def create_update_instructions_after_node_birth( self, new_node: AlgorithmNode ) -> IndexUpdateInstructionsFromOneNode: """ Creates the update instructions block after a new node is added to the tree. Args: new_node (AlgorithmNode): The newly added node. Returns: IndexUpdateInstructionsBlock: The update instructions block. """ base_update_instructions: IndexUpdateInstructionsFromOneNode = ( IndexUpdateInstructionsFromOneNode( node_sending_update=new_node, updated_index=True ) ) return base_update_instructions
[docs] def perform_updates( self, node_to_update: AlgorithmNode, updates_instructions: UpdateInstructionsTowardsOneParentNode, ) -> IndexUpdateInstructionsFromOneNode: """ Performs the index updates based on the given update instructions. Args: node_to_update (AlgorithmNode): The node to update. updates_instructions (UpdateInstructionsTowardsOneParentNode): The update instructions toward this node. Returns: IndexUpdateInstructionsFromOneNode: The update instructions coming from the updated node. """ # get the base block updates_instructions_index: IndexUpdateInstructionsTowardsOneParentNode | None updates_instructions_index = ( updates_instructions.index_updates_toward_one_parent_node ) assert updates_instructions_index is not None # UPDATE index has_index_changed: bool = False move: moveKey for move in updates_instructions_index.moves_with_updated_index: # hardcoded at some point it should be linked to updater coming from search factory i believe assert isinstance( node_to_update.exploration_index_data, MaxDepthDescendants ) child = node_to_update.tree_node.moves_children[move] assert isinstance(child, AlgorithmNode) assert isinstance(child.exploration_index_data, MaxDepthDescendants) has_index_changed_child: bool = ( node_to_update.exploration_index_data.update_from_child( child.exploration_index_data.max_depth_descendants ) ) has_index_changed = has_index_changed or has_index_changed_child base_update_instructions: IndexUpdateInstructionsFromOneNode = ( IndexUpdateInstructionsFromOneNode( node_sending_update=node_to_update, updated_index=has_index_changed ) ) return base_update_instructions
# todo i dont understand anymore when the instructions stops beeing propagated back