GameState::reward_for_player is no longer a trait function

We need GameState::rewards_for_players implemented, the library
currently doesn't need to specify for a singular player.
This commit is contained in:
David Kruger 2025-06-30 21:41:49 -07:00
parent 76051cd76b
commit 6aa9002e92
4 changed files with 43 additions and 46 deletions

View File

@ -125,6 +125,19 @@ impl TicTacToe {
None None
} }
fn reward_for_player(&self, player: &Player) -> RewardVal {
if let Some(winner) = self.get_winner() {
if winner == *player {
return 1.0; // Win
} else {
return 0.0; // Loss
}
}
// Draw
0.5
}
} }
impl GameState for TicTacToe { impl GameState for TicTacToe {
@ -161,19 +174,6 @@ impl GameState for TicTacToe {
self.get_winner().is_some() || self.moves_played == 9 self.get_winner().is_some() || self.moves_played == 9
} }
fn reward_for_player(&self, player: &Self::Player) -> RewardVal {
if let Some(winner) = self.get_winner() {
if winner == *player {
return 1.0; // Win
} else {
return 0.0; // Loss
}
}
// Draw
0.5
}
fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal> { fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal> {
HashMap::from_iter(vec![ HashMap::from_iter(vec![
(Player::X, self.reward_for_player(&Player::X)), (Player::X, self.reward_for_player(&Player::X)),

View File

@ -148,6 +148,19 @@ impl TicTacToe {
None None
} }
fn reward_for_player(&self, player: &Player) -> RewardVal {
if let Some(winner) = self.get_winner() {
if winner == *player {
return 1.0; // Win
} else {
return 0.0; // Loss
}
}
// Draw
0.5
}
} }
impl GameState for TicTacToe { impl GameState for TicTacToe {
@ -184,19 +197,6 @@ impl GameState for TicTacToe {
self.get_winner().is_some() || self.moves_played == 9 self.get_winner().is_some() || self.moves_played == 9
} }
fn reward_for_player(&self, player: &Self::Player) -> RewardVal {
if let Some(winner) = self.get_winner() {
if winner == *player {
return 1.0; // Win
} else {
return 0.0; // Loss
}
}
// Draw
0.5
}
fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal> { fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal> {
HashMap::from_iter(vec![ HashMap::from_iter(vec![
(Player::X, self.reward_for_player(&Player::X)), (Player::X, self.reward_for_player(&Player::X)),

View File

@ -191,6 +191,19 @@ impl TicTacToe {
None None
} }
fn reward_for_player(&self, player: &Player) -> RewardVal {
if let Some(winner) = self.get_winner() {
if winner == *player {
return 1.0; // Win
} else {
return 0.0; // Loss
}
}
// Draw
0.5
}
} }
impl GameState for TicTacToe { impl GameState for TicTacToe {
@ -227,19 +240,6 @@ impl GameState for TicTacToe {
self.get_winner().is_some() || self.moves_played == 9 self.get_winner().is_some() || self.moves_played == 9
} }
fn reward_for_player(&self, player: &Self::Player) -> RewardVal {
if let Some(winner) = self.get_winner() {
if winner == *player {
return 1.0; // Win
} else {
return 0.0; // Loss
}
}
// Draw
0.5
}
fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal> { fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal> {
HashMap::from_iter(vec![ HashMap::from_iter(vec![
(Player::X, self.reward_for_player(&Player::X)), (Player::X, self.reward_for_player(&Player::X)),

View File

@ -40,11 +40,11 @@ pub trait GameState: Clone + Debug {
/// instead should modify a copy of the state and return that. /// instead should modify a copy of the state and return that.
fn state_after_action(&self, action: &Self::Action) -> Self; fn state_after_action(&self, action: &Self::Action) -> Self;
/// Returns the reward from the perspective of the given player for the game state /// Returns the rewards for all players from their perspective for the game state
/// ///
/// This evaluates the current state from the perspective of the given player, and /// This evaluates the current state from the perspective of each player, and
/// returns the reward indicating how good of a result the given state is for the /// returns a HashMap mapping each player to the result of this evaluation, which
/// player. /// we call the reward.
/// ///
/// This is used in the MCTS backpropagation and simulation phases to evaluate /// This is used in the MCTS backpropagation and simulation phases to evaluate
/// the value of a given node in the search tree. /// the value of a given node in the search tree.
@ -55,9 +55,6 @@ pub trait GameState: Clone + Debug {
/// - 0.0 => a loss for the player /// - 0.0 => a loss for the player
/// ///
/// Other values can be used for relative wins or losses /// Other values can be used for relative wins or losses
fn reward_for_player(&self, player: &Self::Player) -> RewardVal;
/// Returns the rewards for all players at the current state
fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal>; fn rewards_for_players(&self) -> HashMap<Self::Player, RewardVal>;
/// Returns the player whose turn it is for the game state /// Returns the player whose turn it is for the game state