Expand description
A high-performance, lock-free Monte Carlo Tree Search library.
The following example demonstrates basic usage:
use treant::{transposition_table::*, tree_policy::*, *};
// A really simple game. There's one player and one number. In each move the player can
// increase or decrease the number. The player's score is the number.
// The game ends when the number reaches 100.
//
// The best strategy is to increase the number at every step.
#[derive(Clone, Debug, PartialEq)]
struct CountingGame(i64);
#[derive(Clone, Debug, PartialEq)]
enum Move {
Add,
Sub,
}
impl GameState for CountingGame {
type Move = Move;
type Player = ();
type MoveList = Vec<Move>;
fn current_player(&self) -> Self::Player {
()
}
fn available_moves(&self) -> Vec<Move> {
let x = self.0;
if x == 100 {
vec![]
} else {
vec![Move::Add, Move::Sub]
}
}
fn make_move(&mut self, mov: &Self::Move) {
match *mov {
Move::Add => self.0 += 1,
Move::Sub => self.0 -= 1,
}
}
}
impl TranspositionHash for CountingGame {
fn hash(&self) -> u64 {
self.0 as u64
}
}
struct MyEvaluator;
impl Evaluator<MyMCTS> for MyEvaluator {
type StateEvaluation = i64;
fn evaluate_new_state(
&self,
state: &CountingGame,
moves: &Vec<Move>,
_: Option<SearchHandle<MyMCTS>>,
) -> (Vec<()>, i64) {
(vec![(); moves.len()], state.0)
}
fn interpret_evaluation_for_player(&self, evaln: &i64, _player: &()) -> i64 {
*evaln
}
fn evaluate_existing_state(
&self,
_: &CountingGame,
evaln: &i64,
_: SearchHandle<MyMCTS>,
) -> i64 {
*evaln
}
}
#[derive(Default)]
struct MyMCTS;
impl MCTS for MyMCTS {
type State = CountingGame;
type Eval = MyEvaluator;
type NodeData = ();
type ExtraThreadData = ();
type TreePolicy = UCTPolicy;
type TranspositionTable = ApproxTable<Self>;
fn cycle_behaviour(&self) -> CycleBehaviour<Self> {
CycleBehaviour::UseCurrentEvalWhenCycleDetected
}
}
let game = CountingGame(0);
let mut mcts = MCTSManager::new(
game,
MyMCTS,
MyEvaluator,
UCTPolicy::new(0.5),
ApproxTable::new(1024),
);
mcts.playout_n_parallel(10000, 4); // 10000 playouts, 4 search threads
mcts.tree().debug_moves();
assert_eq!(mcts.best_move().unwrap(), Move::Add);
assert_eq!(mcts.principal_variation(50), vec![Move::Add; 50]);
assert_eq!(
mcts.principal_variation_states(5),
vec![
CountingGame(0),
CountingGame(1),
CountingGame(2),
CountingGame(3),
CountingGame(4),
CountingGame(5)
]
);Re-exports§
pub use batch::*;
Modules§
Structs§
- Async
Search - Handle for an in-progress asynchronous search. Stops search on drop.
- Async
Search Owned - Owned variant of
AsyncSearch. Callhalt()to stop and recover the manager. - Child
Stats - Summary statistics for a root child, returned by
root_child_stats(). - MCTS
Manager - Main entry point for running MCTS search. Owns the search tree and provides methods for running playouts and extracting results.
- Move
Info - Information about a single move from a search node: the move, its evaluation, visit statistics, and a pointer to the child node.
- Moves
- Iterator over the moves of a search node.
- Node
Handle - An immutable handle to a search node. Provides access to node data, moves, and solver state.
- Score
Bounds - Proven score interval for Score-Bounded MCTS.
Tracks
[lower, upper]bounds on the true minimax value from the current player’s perspective. Whenlower == upper, the value is exact. - Search
Handle - A handle passed to evaluators and callbacks during search. Provides access to the current node and thread-local data.
- Search
Node - A node in the search tree. Contains the list of moves, evaluation, visit statistics, and solver/bounds state.
- Search
Tree - You’re not intended to use this class (use an
MCTSManagerinstead), but you can use it if you want to manage the threads yourself. - Thread
Data - Thread-local data passed to tree policy and user code during search.
- Thread
Data Full - Contains the regular thread data + some
Vecs that we want to reuse the allocation of withinplayout
Enums§
- Advance
Error - Error returned when
advance_root()fails. - Cycle
Behaviour - Strategy for handling graph cycles caused by transposition tables.
- Proven
Value - Game-theoretic proven value for MCTS-Solver. Stored from the perspective of the player who moved to reach this node.
Traits§
- Evaluator
- Evaluates game states for the search. Produces state evaluations and per-move evaluations.
- Game
State - Defines the game rules: available moves, state transitions, and players.
- MCTS
- Configuration trait for MCTS search. Defines the game, evaluator, tree policy, and optional features.
Functions§
- negate_
bound - Negate a score bound, mapping sentinels correctly.
i32::MIN(unbounded below) becomesi32::MAX(unbounded above) and vice versa.
Type Aliases§
- Move
- The move type for the game state.
- Move
Evaluation - Per-move evaluation from the tree policy (e.g.,
()for UCT,f64prior for AlphaGo). - Move
Info Handle - A borrowed reference to a
MoveInfoin the search tree. - Move
List - The move list type returned by
GameState::available_moves(). - Player
- The player type for the game state.
- State
Evaluation - State evaluation produced by the
Evaluator. - Tree
Policy Thread Data - Thread-local data for the tree policy.