Source code for chipiron.players.move_selector.treevalue.updates.minmax_evaluation_updater
"""
This module contains the MinMaxEvaluationUpdater class, which is responsible for updating the min-max evaluation values of AlgorithmNode objects.
"""
from chipiron.players.move_selector.treevalue.nodes.algorithm_node.algorithm_node import (
AlgorithmNode,
)
from .updates_file import UpdateInstructionsTowardsOneParentNode
from .value_block import (
ValueUpdateInstructionsFromOneNode,
ValueUpdateInstructionsTowardsOneParentNode,
)
[docs]class MinMaxEvaluationUpdater:
"""
The MinMaxEvaluationUpdater class is responsible for updating the min-max evaluation values of AlgorithmNode objects.
"""
def __init__(self) -> None:
"""Initializes a new instance of the MinMaxEvaluationUpdater class."""
pass
[docs] def create_update_instructions_after_node_birth(
self, new_node: AlgorithmNode
) -> ValueUpdateInstructionsFromOneNode:
"""
Creates the update instructions for a newly created AlgorithmNode.
Args:
new_node (AlgorithmNode): The newly created AlgorithmNode.
Returns:
ValueUpdateInstructionsBlock: The update instructions for the newly created node.
"""
base_update_instructions: ValueUpdateInstructionsFromOneNode = (
ValueUpdateInstructionsFromOneNode(
node_sending_update=new_node,
is_node_newly_over=new_node.minmax_evaluation.over_event.is_over(),
new_value_for_node=True,
new_best_move_for_node=False,
)
)
return base_update_instructions
[docs] def perform_updates(
self,
node_to_update: AlgorithmNode,
updates_instructions: UpdateInstructionsTowardsOneParentNode,
) -> ValueUpdateInstructionsFromOneNode:
"""
Performs the updates on an AlgorithmNode based on the given update instructions.
Args:
node_to_update (AlgorithmNode): The AlgorithmNode to update.
updates_instructions (UpdateInstructionsTowardsOneParentNode): The update instructions.
Returns:
ValueUpdateInstructionsFromOneNode: The update instructions for the parents of the updated node.
"""
# get the base block
updates_instructions_block: ValueUpdateInstructionsTowardsOneParentNode | None
updates_instructions_block = (
updates_instructions.value_updates_toward_one_parent_node
)
assert updates_instructions_block is not None
# UPDATE VALUE
has_value_changed: bool
has_best_node_seq_changed_1: bool
has_value_changed, has_best_node_seq_changed_1 = (
node_to_update.minmax_evaluation.minmax_value_update_from_children(
moves_with_updated_value=updates_instructions_block.moves_with_updated_value
)
)
# UPDATE BEST MOVE
has_best_node_seq_changed_2: bool
if updates_instructions_block.moves_with_updated_best_move:
has_best_node_seq_changed_2 = (
node_to_update.minmax_evaluation.update_best_move_sequence(
updates_instructions_block.moves_with_updated_best_move
)
)
else:
has_best_node_seq_changed_2 = False
has_best_node_seq_changed: bool = (
has_best_node_seq_changed_1 or has_best_node_seq_changed_2
)
# UPDATE OVER
is_newly_over = node_to_update.minmax_evaluation.update_over(
updates_instructions_block.moves_with_updated_over
)
assert is_newly_over is not None
# create the new instructions for the parents
base_update_instructions_block: ValueUpdateInstructionsFromOneNode
base_update_instructions_block = ValueUpdateInstructionsFromOneNode(
node_sending_update=node_to_update,
is_node_newly_over=is_newly_over,
new_value_for_node=has_value_changed,
new_best_move_for_node=has_best_node_seq_changed,
)
return base_update_instructions_block